blob: e8698a0eeaf3403521d4caa7d6325bb03d96b1e9 [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.10
import 'dart:convert';
import 'package:crypto/crypto.dart';
import '../io/code_output.dart' show CodeOutputListener;
class Hasher implements CodeOutputListener {
final _DigestSink _digestSink;
ByteConversionSink _byteSink;
Hasher._(this._digestSink)
: _byteSink = sha1.startChunkedConversion(_digestSink);
factory Hasher() => Hasher._(_DigestSink());
@override
void onDone(int length) {
// Do nothing.
}
@override
void onText(String text) {
if (_byteSink != null) {
_byteSink.add(utf8.encode(text));
}
}
/// Returns the base64-encoded SHA-1 hash of the utf-8 bytes of the output
/// text.
String getHash() {
if (_byteSink != null) {
_byteSink.close();
_byteSink = null;
}
return base64.encode(_digestSink.value.bytes);
}
}
/// A sink used to get a digest value out of `Hash.startChunkedConversion`.
class _DigestSink extends Sink<Digest> {
Digest _value;
/// The value added to the sink, if any.
Digest /*!*/ get value {
assert(_value != null);
return _value;
}
/// Adds [value] to the sink.
///
/// Unlike most sinks, this may only be called once.
@override
void add(Digest value) {
assert(_value == null);
_value = value;
}
@override
void close() {
assert(_value != null);
}
}