UNPKG

blake3

Version:

BLAKE3 hashing for JavaScript: native Node bindings (where available) and WebAssembly

153 lines 7.52 kB
"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const wasm = __importStar(require("./node")); const native = __importStar(require("./node-native")); const chai_1 = require("chai"); const test_helpers_1 = require("./base/test-helpers"); const stream_buffers_1 = require("stream-buffers"); const hash_reader_1 = require("./base/hash-reader"); function suite({ hash, createHash }) { describe('encoding', () => { it('hashes a buffer', () => { chai_1.expect(hash(Buffer.from(test_helpers_1.inputs.hello.input))).to.deep.equal(test_helpers_1.inputs.hello.hash); }); it('hashes a string', () => { chai_1.expect(hash(test_helpers_1.inputs.hello.input)).to.deep.equal(test_helpers_1.inputs.hello.hash); }); it('hashes an arraybuffer', () => { const buf = Buffer.from(test_helpers_1.inputs.hello.input); chai_1.expect(hash(new Uint8Array(buf).buffer)).to.deep.equal(test_helpers_1.inputs.hello.hash); }); it('customizes the output length', () => { chai_1.expect(hash(test_helpers_1.inputs.hello.input, { length: 16 })).to.deep.equal(test_helpers_1.inputs.hello.hash.slice(0, 16)); }); }); describe('memory-safety (#5)', () => { it('hash', () => { const hashA = hash('hello'); const hashB = hash('goodbye'); chai_1.expect(hashA.toString('hex')).to.equal('ea8f163db38682925e4491c5e58d4bb3506ef8c14eb78a86e908c5624a67200f'); chai_1.expect(hashB.toString('hex')).to.equal('f94a694227c5f31a07551908ad5fb252f5f0964030df5f2f200adedfae4d9b69'); }); it('hasher', () => { const hasherA = createHash(); const hasherB = createHash(); hasherA.update('hel'); hasherB.update('good'); hasherA.update('lo'); hasherB.update('bye'); const hashA = hasherA.digest(); const hashB = hasherB.digest(); chai_1.expect(hashA.toString('hex')).to.equal('ea8f163db38682925e4491c5e58d4bb3506ef8c14eb78a86e908c5624a67200f'); chai_1.expect(hashB.toString('hex')).to.equal('f94a694227c5f31a07551908ad5fb252f5f0964030df5f2f200adedfae4d9b69'); }); }); describe('hasher', () => { it('digests', callback => { const buffer = new stream_buffers_1.ReadableStreamBuffer(); buffer.put(Buffer.from(test_helpers_1.inputs.large.input)); buffer.stop(); const hash = createHash(); buffer.on('data', b => hash.update(b)); buffer.on('end', () => { const actual = hash.digest(); chai_1.expect(actual).to.deep.equal(test_helpers_1.inputs.large.hash); callback(); }); }); it('is a transform stream', callback => { const buffer = new stream_buffers_1.ReadableStreamBuffer(); buffer.put(Buffer.from(test_helpers_1.inputs.large.input)); buffer.stop(); buffer .pipe(createHash()) .on('error', callback) .on('data', hash => { chai_1.expect(hash).to.deep.equal(test_helpers_1.inputs.large.hash); callback(); }); }); it('customizes the output length', () => { const hash = createHash(); hash.update(test_helpers_1.inputs.hello.input); chai_1.expect(hash.digest('hex', { length: 16 })).to.equal(test_helpers_1.inputs.hello.hash.slice(0, 16).toString('hex')); }); it('throws on write after dispose', () => { const hash = createHash(); hash.dispose(); chai_1.expect(() => hash.update('')).to.throw(/after dispose/); }); it('allows taking incremental hashes', () => { const hasher = createHash(); hasher.update('hel'); const hashA = hasher.digest(undefined, { dispose: false }); const readA = hasher.reader({ dispose: false }); hasher.update('lo'); const hashB = hasher.digest(undefined, { dispose: false }); const readB = hasher.reader({ dispose: false }); const expectedA = Buffer.from('3121c5bb1b9193123447ac7cfda042f67f967e7a8cf5c12e7570e25529746e4a', 'hex'); chai_1.expect(hashA).to.deep.equal(expectedA); chai_1.expect(readA.toBuffer()).to.deep.equal(expectedA); chai_1.expect(hashB).to.deep.equal(test_helpers_1.inputs.hello.hash); chai_1.expect(readB.toBuffer()).to.deep.equal(test_helpers_1.inputs.hello.hash); hasher.dispose(); readA.dispose(); readB.dispose(); }); }); describe('reader', () => { let reader; beforeEach(() => { const hash = createHash(); hash.update(test_helpers_1.inputs.hello.input); reader = hash.reader(); }); afterEach(() => reader.dispose()); it('implements toString()', () => { chai_1.expect(reader.toString('hex')).to.equal(test_helpers_1.inputs.hello.hash.toString('hex')); reader.position = BigInt(42); chai_1.expect(reader.toString('hex')).to.equal(test_helpers_1.inputs.hello.hash.toString('hex')); }); it('implements toBuffer()', () => { chai_1.expect(reader.toBuffer()).to.deep.equal(test_helpers_1.inputs.hello.hash); reader.position = BigInt(42); chai_1.expect(reader.toBuffer()).to.deep.equal(test_helpers_1.inputs.hello.hash); }); it('implements readInto() and advances', () => { const actual = Buffer.alloc(32); reader.readInto(actual.slice(0, 10)); reader.readInto(actual.slice(10)); chai_1.expect(actual).to.deep.equal(test_helpers_1.inputs.hello.hash); chai_1.expect(reader.position).to.equal(BigInt(32)); }); it('implements read() and advances', () => { const actual = reader.read(32); chai_1.expect(actual).to.deep.equal(test_helpers_1.inputs.hello.hash); chai_1.expect(reader.position).to.equal(BigInt(32)); const actualNext = reader.read(16); chai_1.expect(actualNext).to.deep.equal(test_helpers_1.hello48.slice(32)); chai_1.expect(reader.position).to.equal(BigInt(48)); }); it('manually sets position', () => { reader.position = BigInt(32); const actual = reader.read(16); chai_1.expect(actual).to.deep.equal(test_helpers_1.hello48.slice(32)); }); it('throws if set out of range', () => { chai_1.expect(() => (reader.position = BigInt(-1))).to.throw(RangeError); chai_1.expect(() => (reader.position = BigInt('18446744073709551616'))).to.throw(RangeError); reader.position = hash_reader_1.maxHashBytes - BigInt(1); chai_1.expect(() => reader.read(2)).to.throw(RangeError); }); }); } describe('node.js wasm', () => suite(wasm)); describe('node.js native', () => suite(native)); //# sourceMappingURL=node.test.js.map