pure-md5 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -24
- package/dist/adapters/ie11.cjs +1 -2
- package/dist/adapters/ie11.js +1 -2
- package/dist/adapters/node.cjs +1 -2
- package/dist/adapters/node.js +1 -2
- package/dist/adapters/webcrypto.cjs +1 -2
- package/dist/adapters/webcrypto.js +1 -2
- package/dist/index.cjs +1 -2
- package/dist/index.d.ts +149 -5
- package/dist/index.js +3 -2
- package/dist/md5.cjs +1 -0
- package/dist/md5.d.ts +20 -0
- package/dist/md5.js +1 -0
- package/dist/stream/md5-stream.cjs +1 -2
- package/dist/stream/md5-stream.js +1 -2
- package/dist/stream/whatwg-stream.cjs +1 -2
- package/dist/stream/whatwg-stream.js +1 -2
- package/dist/utils/detect.cjs +1 -2
- package/dist/utils/detect.js +3 -2
- package/package.json +10 -15
- package/pure-md5-0.2.1.tgz +0 -0
- package/test-tree-shake.mjs +12 -0
- package/.aliases +0 -19
- package/.bash_profile +0 -12
- package/.bash_prompt +0 -56
- package/.changeset/README.md +0 -32
- package/.changeset/config.json +0 -16
- package/.continue/mcpServers/new-mcp-server.yaml +0 -10
- package/.continue/rules +0 -29
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -35
- package/.github/ISSUE_TEMPLATE/documentation.md +0 -20
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -35
- package/.github/workflows/npm-publish.yml +0 -33
- package/.github/workflows/release.yml +0 -42
- package/CHANGELOG.md +0 -9
- package/CONTRIBUTING.md +0 -203
- package/MIGRATION_GUIDE_STREAMS.md +0 -374
- package/STREAM_API.md +0 -582
- package/STREAM_BENCHMARKS.md +0 -232
- package/STREAM_EXAMPLES.md +0 -669
- package/STREAM_OPTIMIZATION_REPORT.md +0 -136
- package/STREAM_TROUBLESHOOTING.md +0 -537
- package/WEB_CRYPTO_TESTS_SUMMARY.md +0 -140
- package/WHATWG_STREAMS.md +0 -191
- package/__tests__/adapters/node-crypto.test.ts +0 -167
- package/__tests__/adapters/web-crypto-node.test.ts +0 -73
- package/__tests__/adapters/web-crypto.test.ts +0 -195
- package/__tests__/add32.test.ts +0 -33
- package/__tests__/fallback.test.ts +0 -345
- package/__tests__/hex.test.ts +0 -38
- package/__tests__/hex_chr.test.ts +0 -20
- package/__tests__/index.test.ts +0 -87
- package/__tests__/integration/fixtures/test-file.txt +0 -1
- package/__tests__/integration/md5-stream-file.test.ts +0 -293
- package/__tests__/integration/node-crypto-file.test.ts +0 -86
- package/__tests__/integration/web-crypto.test.ts +0 -38
- package/__tests__/md51.test.ts +0 -73
- package/__tests__/md5block.test.ts +0 -61
- package/__tests__/md5cycle.test.ts +0 -48
- package/__tests__/round-functions.test.ts +0 -87
- package/__tests__/stream/fs-utils.test.ts +0 -209
- package/__tests__/stream/md5-stream-edge-cases.test.ts +0 -461
- package/__tests__/stream/md5-stream.test.ts +0 -418
- package/__tests__/stream/whatwg-stream.test.ts +0 -355
- package/__tests__/stream/whatwg-stream.test.ts.bak2 +0 -335
- package/benchmarks/md5-stream.bench.ts +0 -212
- package/benchmarks/whatwg-stream.bench.ts +0 -180
- package/dist/adapters/ie11.cjs.map +0 -1
- package/dist/adapters/ie11.js.map +0 -1
- package/dist/adapters/node.cjs.map +0 -1
- package/dist/adapters/node.js.map +0 -1
- package/dist/adapters/webcrypto.cjs.map +0 -1
- package/dist/adapters/webcrypto.js.map +0 -1
- package/dist/chunk-2YXXFGBV.js +0 -2
- package/dist/chunk-2YXXFGBV.js.map +0 -1
- package/dist/chunk-4KSCMS4Q.js +0 -2
- package/dist/chunk-4KSCMS4Q.js.map +0 -1
- package/dist/chunk-6P2QV5SR.js +0 -4
- package/dist/chunk-6P2QV5SR.js.map +0 -1
- package/dist/chunk-G5WHEAIQ.js +0 -2
- package/dist/chunk-G5WHEAIQ.js.map +0 -1
- package/dist/chunk-H2K353LR.js +0 -2
- package/dist/chunk-H2K353LR.js.map +0 -1
- package/dist/chunk-JKVD5LHZ.js +0 -2
- package/dist/chunk-JKVD5LHZ.js.map +0 -1
- package/dist/chunk-NWQ4N5RX.js +0 -2
- package/dist/chunk-NWQ4N5RX.js.map +0 -1
- package/dist/chunk-PHZ7FTYF.js +0 -2
- package/dist/chunk-PHZ7FTYF.js.map +0 -1
- package/dist/chunk-PNZTVQA7.js +0 -2
- package/dist/chunk-PNZTVQA7.js.map +0 -1
- package/dist/chunk-R4JB5MBR.js +0 -2
- package/dist/chunk-R4JB5MBR.js.map +0 -1
- package/dist/chunk-VFOAY6XI.js +0 -2
- package/dist/chunk-VFOAY6XI.js.map +0 -1
- package/dist/chunk-XB5BQIEX.js +0 -2
- package/dist/chunk-XB5BQIEX.js.map +0 -1
- package/dist/core/index.cjs +0 -2
- package/dist/core/index.cjs.map +0 -1
- package/dist/core/index.d.cts +0 -19
- package/dist/core/index.d.ts +0 -19
- package/dist/core/index.js +0 -2
- package/dist/core/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -84
- package/dist/index.js.map +0 -1
- package/dist/stream/adapter.cjs +0 -2
- package/dist/stream/adapter.cjs.map +0 -1
- package/dist/stream/adapter.d.cts +0 -63
- package/dist/stream/adapter.d.ts +0 -63
- package/dist/stream/adapter.js +0 -2
- package/dist/stream/adapter.js.map +0 -1
- package/dist/stream/fs-utils.cjs +0 -2
- package/dist/stream/fs-utils.cjs.map +0 -1
- package/dist/stream/fs-utils.d.cts +0 -137
- package/dist/stream/fs-utils.d.ts +0 -137
- package/dist/stream/fs-utils.js +0 -2
- package/dist/stream/fs-utils.js.map +0 -1
- package/dist/stream/index.cjs +0 -2
- package/dist/stream/index.cjs.map +0 -1
- package/dist/stream/index.d.cts +0 -4
- package/dist/stream/index.d.ts +0 -4
- package/dist/stream/index.js +0 -2
- package/dist/stream/index.js.map +0 -1
- package/dist/stream/light/index.cjs +0 -2
- package/dist/stream/light/index.cjs.map +0 -1
- package/dist/stream/light/index.d.cts +0 -4
- package/dist/stream/light/index.d.ts +0 -4
- package/dist/stream/light/index.js +0 -2
- package/dist/stream/light/index.js.map +0 -1
- package/dist/stream/md5-stream.cjs.map +0 -1
- package/dist/stream/md5-stream.js.map +0 -1
- package/dist/stream/whatwg-stream.cjs.map +0 -1
- package/dist/stream/whatwg-stream.js.map +0 -1
- package/dist/types-edGoGJ5V.d.cts +0 -42
- package/dist/types-edGoGJ5V.d.ts +0 -42
- package/dist/utils/detect.cjs.map +0 -1
- package/dist/utils/detect.js.map +0 -1
- package/planning/03-optimization-size-tree-shaking/01-es-modules-tree-shaking.md +0 -152
- package/planning/03-optimization-size-tree-shaking/02-consolidate-modules.md +0 -65
- package/planning/03-optimization-size-tree-shaking/03-remove-duplicate-add32.md +0 -93
- package/planning/03-optimization-size-tree-shaking/04-remove-runtime-check.md +0 -102
- package/planning/03-optimization-size-tree-shaking/05-optimize-loops-performance.md +0 -107
- package/planning/03-optimization-size-tree-shaking/06-tsup-formats-configuration.md +0 -227
- package/planning/03-optimization-size-tree-shaking/07-multiple-build-formats.md +0 -228
- package/planning/03-optimization-size-tree-shaking/08-benchmarks-metrics.md +0 -34
- package/planning/03-optimization-size-tree-shaking/MIGRATION_GUIDE.md +0 -260
- package/planning/03-optimization-size-tree-shaking/README.md +0 -173
- package/planning/03-optimization-size-tree-shaking/SUMMARY.md +0 -168
- package/planning/04-adapter-backend/03-backend-web-crypto.md +0 -149
- package/planning/04-adapter-backend/04-backend-node-crypto.md +0 -181
- package/planning/04-adapter-backend/05-backend-pure-js.md +0 -174
- package/planning/04-adapter-backend/06-backend-ie11.md +0 -158
- package/planning/04-adapter-backend/07-detection-environment.md +0 -232
- package/planning/04-adapter-backend/08-detection-backend.md +0 -210
- package/planning/04-adapter-backend/09-adapter-unified.md +0 -255
- package/planning/04-adapter-backend/10-fallback-mechanism.md +0 -333
- package/planning/04-adapter-backend/11-tests-backend-web-crypto.md +0 -191
- package/planning/04-adapter-backend/12-tests-backend-node-crypto.md +0 -222
- package/planning/04-adapter-backend/README.md +0 -45
- package/planning/05-documentation-publishing/01-README-optimization.md +0 -105
- package/planning/05-documentation-publishing/02-VitePress-site-evaluation.md +0 -136
- package/planning/05-documentation-publishing/03-Changeset-setup.md +0 -192
- package/planning/05-documentation-publishing/04-GitHub-templates.md +0 -252
- package/planning/05-documentation-publishing/README.md +0 -22
- package/planning/05-documentation-publishing/STATUS.md +0 -222
- package/planning/prd.md +0 -405
- package/planning/streams/01-create-md5stream-class.md +0 -69
- package/planning/streams/02-create-factory-api.md +0 -65
- package/planning/streams/03-fs-integration.md +0 -37
- package/planning/streams/04-whatwg-streams-support.md +0 -37
- package/planning/streams/05-audit-optimization.md +0 -121
- package/planning/streams/06-comprehensive-tests-docs.md +0 -137
- package/planning/streams/07-architecture-integration.md +0 -38
- package/planning/streams/README.md +0 -98
- package/tsup.config.ts +0 -24
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hex_chr.ts","../src/hex.ts","../src/add32.ts","../src/round-functions.ts","../src/md5cycle.ts","../src/md5blk.ts","../src/md51.ts","../src/md5buf.ts","../src/core/index.ts","../src/adapters/webcrypto.ts","../src/adapters/node.ts","../src/adapters/ie11.ts","../src/stream/md5-stream.ts","../src/stream/adapter.ts","../src/adapters/pure-js.ts","../src/utils/detect.ts","../src/stream/fs-utils.ts","../src/stream/index.ts","../src/index.ts"],"names":["hex_chr","hex_chr_default","rhex","n","s","j","hex","x","l","result","i","hex_default","add32","y","add32_default","cmn1","q","a","t","fn","add","cmn2","b","cmn","ff","c","d","gg","hh","ii","md5cycle","k","fff","ggg","hhh","iii","md5cycle_default","md5blk","md5blks","md5blk_default","md51","state","tail","sl","md51_default","md5buf","buffer","length","block","md5blkBuf","remaining","offset","md5buf_default","md5Core","string","md5Buffer","WebCryptoBackend","data","text","_data","_encoding","NodeCryptoBackend","nodeCrypto","IE11Backend","win","hashBuffer","MD5Stream","_MD5Stream","Transform","options","chunk","callback","dataLength","currentBufferLength","neededBytes","bytesToCopy","remainingData","remainingBuffer","fullBlocks","blockStart","idx","error","bufferLength","digest","source","stream","pipeThroughMD5","createMD5Stream","resolve","reject","results","fromStream","StreamBackend","nodeStream","encoding","hexDigest","bytes","PureJSBackend","checkBackendAvailability","backendName","webCryptoAvailable","nodeCryptoAvailable","ie11Available","isNode","isBrowser","getAllAvailableBackends","backends","available","backend","isAvailable","BACKEND_PRIORITY","getBestAvailableBackend","availableBackends","sortedPriority","name","BackendDetector","_BackendDetector","detectedBackend","detector","FallbackManager","fallbackOrder","operation","errors","fallbackManager","robustHash","fm","errorMessage","e","MetricsCollector","sum","m","key","metrics","hashFile","filePath","fs","stats","readStream","hashFileStream","md5Stream","bytesProcessed","hashFileDigest","hashFileStreamDigest","verifyFile","expectedDigest","hashFileSync","content","createProgressTracker","totalSize","onUpdate","lastPercentage","current","percentage","MD5Adapter","bestBackend","md5","md5Adapter","md5Async"],"mappings":"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","file":"index.cjs","sourcesContent":["const hex_chr: string[] = \"0123456789abcdef\".split(\"\");\n\nexport default hex_chr;\n","import hex_chr from './hex_chr';\n\nfunction rhex(n: number): string {\n let s = '';\n for (let j = 0; j < 4; j++)\n s += hex_chr[(n >> (j * 8 + 4)) & 0x0f] + hex_chr[(n >> (j * 8)) & 0x0f];\n return s;\n}\n\nfunction hex(x: number[]): string {\n const l = x.length;\n const result: string[] = new Array(l);\n for (let i = 0; i < l; i++) result[i] = rhex(x[i]);\n return result.join('');\n}\n\nexport default hex;\n","function add32(x: number, y: number): number {\n //let lsw = (x & 0xffff) + (y & 0xffff);\n //let msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n //return (msw << 16) | (lsw & 0xffff);\n return (x + y) & 0xffffffff;\n}\n\nexport default add32;\n","import add32 from './add32';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction cmn1(q: number, a: number, x: number, t: number, fn?: Add32Function) {\n const add = fn || add32;\n a = add(add(a, q), add(x, t));\n return a;\n}\n\nfunction cmn2(a: number, s: number, b: number, fn?: Add32Function) {\n const add = fn || add32;\n var result = add((a << s) | (a >>> (32 - s)), b);\n return result;\n}\n\nfunction cmn(\n q: number,\n a: number,\n b: number,\n x: number,\n s: number,\n t: number,\n fn?: Add32Function\n) {\n a = cmn1(q, a, x, t, fn);\n return cmn2(a, s, b, fn);\n}\n\nexport function ff(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn((b & c) | (~b & d), a, b, x, s, t, fn);\n}\n\nexport function gg(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn((b & d) | (c & ~d), a, b, x, s, t, fn);\n}\n\nexport function hh(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn(b ^ c ^ d, a, b, x, s, t, fn);\n}\n\nexport function ii(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn(c ^ (b | ~d), a, b, x, s, t, fn);\n}\n","import add32 from './add32';\nimport { ff, gg, hh, ii } from './round-functions';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction md5cycle(x: number[], k: number[], fn?: Add32Function): void {\n if (typeof fn === 'undefined') {\n fn = add32;\n }\n let a = x[0];\n let b = x[1];\n let c = x[2];\n let d = x[3];\n\n const fff = ff.bind(null, fn);\n a = fff(a, b, c, d, k[0], 7, -680876936);\n d = fff(d, a, b, c, k[1], 12, -389564586);\n c = fff(c, d, a, b, k[2], 17, 606105819);\n b = fff(b, c, d, a, k[3], 22, -1044525330);\n a = fff(a, b, c, d, k[4], 7, -176418897);\n d = fff(d, a, b, c, k[5], 12, 1200080426);\n c = fff(c, d, a, b, k[6], 17, -1473231341);\n b = fff(b, c, d, a, k[7], 22, -45705983);\n a = fff(a, b, c, d, k[8], 7, 1770035416);\n d = fff(d, a, b, c, k[9], 12, -1958414417);\n c = fff(c, d, a, b, k[10], 17, -42063);\n b = fff(b, c, d, a, k[11], 22, -1990404162);\n a = fff(a, b, c, d, k[12], 7, 1804603682);\n d = fff(d, a, b, c, k[13], 12, -40341101);\n c = fff(c, d, a, b, k[14], 17, -1502002290);\n b = fff(b, c, d, a, k[15], 22, 1236535329);\n\n const ggg = gg.bind(null, fn);\n a = ggg(a, b, c, d, k[1], 5, -165796510);\n d = ggg(d, a, b, c, k[6], 9, -1069501632);\n c = ggg(c, d, a, b, k[11], 14, 643717713);\n b = ggg(b, c, d, a, k[0], 20, -373897302);\n a = ggg(a, b, c, d, k[5], 5, -701558691);\n d = ggg(d, a, b, c, k[10], 9, 38016083);\n c = ggg(c, d, a, b, k[15], 14, -660478335);\n b = ggg(b, c, d, a, k[4], 20, -405537848);\n a = ggg(a, b, c, d, k[9], 5, 568446438);\n d = ggg(d, a, b, c, k[14], 9, -1019803690);\n c = ggg(c, d, a, b, k[3], 14, -187363961);\n b = ggg(b, c, d, a, k[8], 20, 1163531501);\n a = ggg(a, b, c, d, k[13], 5, -1444681467);\n d = ggg(d, a, b, c, k[2], 9, -51403784);\n c = ggg(c, d, a, b, k[7], 14, 1735328473);\n b = ggg(b, c, d, a, k[12], 20, -1926607734);\n\n const hhh = hh.bind(null, fn);\n a = hhh(a, b, c, d, k[5], 4, -378558);\n d = hhh(d, a, b, c, k[8], 11, -2022574463);\n c = hhh(c, d, a, b, k[11], 16, 1839030562);\n b = hhh(b, c, d, a, k[14], 23, -35309556);\n a = hhh(a, b, c, d, k[1], 4, -1530992060);\n d = hhh(d, a, b, c, k[4], 11, 1272893353);\n c = hhh(c, d, a, b, k[7], 16, -155497632);\n b = hhh(b, c, d, a, k[10], 23, -1094730640);\n a = hhh(a, b, c, d, k[13], 4, 681279174);\n d = hhh(d, a, b, c, k[0], 11, -358537222);\n c = hhh(c, d, a, b, k[3], 16, -722521979);\n b = hhh(b, c, d, a, k[6], 23, 76029189);\n a = hhh(a, b, c, d, k[9], 4, -640364487);\n d = hhh(d, a, b, c, k[12], 11, -421815835);\n c = hhh(c, d, a, b, k[15], 16, 530742520);\n b = hhh(b, c, d, a, k[2], 23, -995338651);\n\n const iii = ii.bind(null, fn);\n a = iii(a, b, c, d, k[0], 6, -198630844);\n d = iii(d, a, b, c, k[7], 10, 1126891415);\n c = iii(c, d, a, b, k[14], 15, -1416354905);\n b = iii(b, c, d, a, k[5], 21, -57434055);\n a = iii(a, b, c, d, k[12], 6, 1700485571);\n d = iii(d, a, b, c, k[3], 10, -1894986606);\n c = iii(c, d, a, b, k[10], 15, -1051523);\n b = iii(b, c, d, a, k[1], 21, -2054922799);\n a = iii(a, b, c, d, k[8], 6, 1873313359);\n d = iii(d, a, b, c, k[15], 10, -30611744);\n c = iii(c, d, a, b, k[6], 15, -1560198380);\n b = iii(b, c, d, a, k[13], 21, 1309151649);\n a = iii(a, b, c, d, k[4], 6, -145523070);\n d = iii(d, a, b, c, k[11], 10, -1120210379);\n c = iii(c, d, a, b, k[2], 15, 718787259);\n b = iii(b, c, d, a, k[9], 21, -343485551);\n\n x[0] = fn(a, x[0]);\n x[1] = fn(b, x[1]);\n x[2] = fn(c, x[2]);\n x[3] = fn(d, x[3]);\n}\n\nexport default md5cycle;\n","function md5blk(s: string): number[] {\n let md5blks: number[] = [];\n for (let i = 0; i < 64; i += 4) {\n md5blks[i >> 2] =\n (s.charCodeAt(i) || 0) +\n ((s.charCodeAt(i + 1) || 0) << 8) +\n ((s.charCodeAt(i + 2) || 0) << 16) +\n ((s.charCodeAt(i + 3) || 0) << 24);\n }\n return md5blks;\n}\n\nexport default md5blk;\n","import md5cycle from './md5cycle';\nimport md5blk from './md5blk';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction md51(s: string, add32?: Add32Function): number[] {\n const n = s.length;\n const state = [1732584193, -271733879, -1732584194, 271733878];\n let i;\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk(s.substring(i - 64, i)), add32);\n }\n s = s.substring(i - 64);\n var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n sl = s.length;\n for (i = 0; i < sl; i++) tail[i >> 2] |= (s.charCodeAt(i) & 0xff) << ((i % 4) << 3);\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail, add32);\n i = 16;\n while (i--) {\n tail[i] = 0;\n }\n }\n tail[14] = n * 8;\n md5cycle(state, tail, add32);\n return state;\n}\n\nexport default md51;\n","import md5cycle from './md5cycle';\n\ntype Add32Function = (x: number, y: number) => number;\n\n/**\n * Compute MD5 hash of a Buffer\n * @param buffer - Input Buffer to hash\n * @param add32 - Optional custom add32 function\n * @returns MD5 hash as array of numbers\n */\nfunction md5buf(buffer: Buffer, add32?: Add32Function): number[] {\n const length = buffer.length;\n const state = [1732584193, -271733879, -1732584194, 271733878];\n \n // Process full 64-byte blocks\n let i;\n for (i = 64; i <= length; i += 64) {\n const block = md5blkBuf(buffer, i - 64);\n md5cycle(state, block, add32);\n }\n \n // Handle remaining bytes\n const remaining = length - i + 64;\n const tail: number[] = new Array(16).fill(0);\n \n // Copy remaining bytes from the end of the buffer\n for (let j = 0; j < remaining; j++) {\n tail[j >> 2] |= (buffer[length - remaining + j] & 0xff) << ((j % 4) << 3);\n }\n \n // Append 0x80\n tail[remaining >> 2] |= 0x80 << ((remaining % 4) << 3);\n \n // If not enough space for length, process current block\n if (remaining > 55) {\n md5cycle(state, tail, add32);\n for (let k = 0; k < 16; k++) {\n tail[k] = 0;\n }\n }\n \n // Append length (in bits)\n tail[14] = length * 8;\n tail[15] = 0; // High 32 bits of length (not used for typical files)\n \n // Final MD5 cycle\n md5cycle(state, tail, add32);\n return state;\n}\n\n/**\n * Convert a 64-byte slice of buffer to MD5 block format\n * @param buffer - Input buffer\n * @param offset - Offset to start from\n * @returns Array of 16 32-bit words\n */\nfunction md5blkBuf(buffer: Buffer, offset: number): number[] {\n const md5blks: number[] = [];\n for (let i = 0; i < 64; i += 4) {\n md5blks[i >> 2] =\n (buffer[offset + i] || 0) +\n ((buffer[offset + i + 1] || 0) << 8) +\n ((buffer[offset + i + 2] || 0) << 16) +\n ((buffer[offset + i + 3] || 0) << 24);\n }\n return md5blks;\n}\n\nexport default md5buf;\n","/**\n * Core MD5 implementation - Pure JavaScript\n * No dependencies, no environment detection\n * This is the minimal, tree-shakeable core\n */\n\nimport hex from '../hex';\nimport md51 from '../md51';\nimport md5buf from '../md5buf';\nimport add32 from '../add32';\n\n/**\n * Compute MD5 hash of a string\n * @param string - Input string to hash\n * @returns MD5 hash as hex string\n */\nexport function md5Core(string: string): string {\n // Use the original implementation\n const fn = add32;\n return hex(md51(string, fn));\n}\n\n/**\n * Compute MD5 hash of a Buffer\n * @param buffer - Input Buffer to hash\n * @returns MD5 hash as hex string\n */\nexport function md5Buffer(buffer: Buffer): string {\n const fn = add32;\n return hex(md5buf(buffer, fn));\n}\n\nexport { md5Core as md5 };\n","/**\n * Web Crypto API Backend\n * Uses browser's native Web Crypto API for MD5 hashing\n * Note: Web Crypto API does not support MD5 in most browsers, so this backend\n * falls back to pure JS implementation\n */\n\nimport { MD5Backend } from \"./types.js\";\nimport { md5Core } from \"../core/index.js\";\n\nexport class WebCryptoBackend implements MD5Backend {\n name: string = \"webcrypto\";\n version: string = \"1.0.0\";\n\n static isAvailable(): boolean {\n // Check if Web Crypto API is available\n return typeof crypto !== \"undefined\" &&\n typeof crypto.subtle !== \"undefined\" &&\n typeof crypto.subtle.digest === \"function\";\n }\n\n async hash(data: string): Promise<string> {\n // Web Crypto API doesn't support MD5, so use pure JS implementation\n return md5Core(data);\n }\n\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n // Web Crypto API doesn't support MD5, so use pure JS implementation\n const text = data instanceof ArrayBuffer\n ? new TextDecoder().decode(data)\n : new TextDecoder().decode(data);\n return md5Core(text);\n }\n\n update(_data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n throw new Error(\"Web Crypto API does not support streaming updates\");\n }\n\n digest(_encoding?: \"hex\" | \"buffer\"): string | Uint8Array | Promise<string | Uint8Array> {\n throw new Error(\"Web Crypto API does not support streaming\");\n }\n\n reset(): void | Promise<void> {\n // No state to reset\n }\n}\n","/**\n * Node.js Crypto Backend\n * Uses Node.js native crypto module for MD5 hashing\n */\n\nimport { MD5Backend } from \"./types.js\";\n\nexport class NodeCryptoBackend implements MD5Backend {\n name: string = \"nodecrypto\";\n version: string = \"1.0.0\";\n\n static isAvailable(): boolean {\n try {\n const nodeCrypto = require(\"node:crypto\");\n return typeof nodeCrypto.createHash === \"function\";\n } catch {\n return false;\n }\n }\n\n hash(data: string): string {\n const nodeCrypto = require(\"node:crypto\");\n return nodeCrypto.createHash(\"md5\").update(data).digest(\"hex\");\n }\n\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const nodeCrypto = require(\"node:crypto\");\n const buffer = data instanceof Uint8Array ? data : new Uint8Array(data);\n return nodeCrypto.createHash(\"md5\").update(buffer).digest(\"hex\");\n }\n\n update(_data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n // Node crypto handles streaming internally\n // This is here for interface compatibility\n }\n\n digest(_encoding?: \"hex\" | \"buffer\"): string | Uint8Array | Promise<string | Uint8Array> {\n throw new Error(\"Node crypto streaming not implemented\");\n }\n\n reset(): void | Promise<void> {\n // No state to reset\n }\n}\n","/**\n * IE11 msCrypto Backend\n * Uses Internet Explorer 11 msCrypto API for MD5 hashing\n */\n\nimport { MD5Backend } from \"./types.js\";\n\ninterface WinWithMsCrypto extends Window {\n msCrypto?: Crypto;\n}\n\nexport class IE11Backend implements MD5Backend {\n name: string = \"ie11\";\n version: string = \"1.0.0\";\n\n static isAvailable(): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n const win = window as WinWithMsCrypto;\n return typeof win.msCrypto !== \"undefined\" &&\n typeof win.msCrypto.subtle !== \"undefined\" &&\n typeof win.msCrypto.subtle.digest === \"function\";\n }\n\n async hash(data: string): Promise<string> {\n const encoder = new TextEncoder();\n const buffer = encoder.encode(data);\n return await this.hashBinary(buffer);\n }\n\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const win = window as WinWithMsCrypto;\n const buffer = data instanceof Uint8Array ? data.buffer as ArrayBuffer : data;\n const hashBuffer = await win.msCrypto!.subtle.digest(\"MD5\", buffer);\n return this.bufferToHex(hashBuffer);\n }\n\n private bufferToHex(buffer: ArrayBuffer): string {\n return Array.from(new Uint8Array(buffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n update(_data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n throw new Error(\"msCrypto does not support streaming updates\");\n }\n\n digest(_encoding?: \"hex\" | \"buffer\"): string | Uint8Array | Promise<string | Uint8Array> {\n throw new Error(\"msCrypto does not support streaming\");\n }\n\n reset(): void | Promise<void> {\n // No state to reset\n }\n}\n","/**\n * MD5Stream - Node.js Transform stream for MD5 hash computation\n * Provides streaming MD5 hashing with minimal overhead\n */\n\nimport { Transform, TransformCallback } from 'stream';\nimport md5cycle from '../md5cycle';\nimport hex from '../hex';\nimport add32 from '../add32';\n\n/**\n * State interface for MD5 computation\n */\ninterface MD5State {\n state: number[];\n bytesProcessed: number;\n bufferLength: number;\n buffer: Uint8Array;\n}\n\n/**\n * Options for MD5Stream constructor\n */\ninterface MD5StreamOptions {\n /**\n * Custom add32 function for compatibility testing\n */\n add32?: (x: number, y: number) => number;\n}\n\n/**\n * MD5Stream - Node.js Transform stream for computing MD5 hashes\n * \n * Usage example:\n * ```ts\n * import fs from 'fs';\n * import { MD5Stream } from 'pure-md5';\n * \n * const stream = new MD5Stream();\n * stream.on('md5', (result) => {\n * console.log('MD5:', result.digest);\n * console.log('Bytes:', result.bytesProcessed);\n * });\n * \n * fs.createReadStream('file.txt').pipe(stream);\n * ```\n */\nexport class MD5Stream extends Transform {\n private state: MD5State;\n private add32: (x: number, y: number) => number;\n private readonly initialMD5State = [1732584193, -271733879, -1732584194, 271733878];\n private readonly bufferCapacity: number = 64;\n private buffer: Uint8Array = new Uint8Array(this.bufferCapacity);\n\n /**\n * Create new MD5Stream instance\n * @param options - Stream options\n */\n constructor(options?: MD5StreamOptions) {\n super({\n readableObjectMode: false,\n writableObjectMode: false\n });\n\n this.add32 = options?.add32 || add32;\n this.state = {\n state: [...this.initialMD5State],\n bytesProcessed: 0,\n bufferLength: 0,\n buffer: this.buffer\n };\n }\n\n /**\n * Process data chunk and update MD5 state\n * @param chunk - Data chunk to process\n * @param callback - Callback to signal chunk processing complete\n */\n _transform(chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback): void {\n try {\n let data = chunk as Buffer;\n const dataLength = data.length;\n \n if (dataLength === 0) {\n callback();\n return;\n }\n\n // Combine with remaining buffer if needed\n if (this.state.bufferLength > 0) {\n const currentBufferLength = this.state.bufferLength;\n const neededBytes = 64 - currentBufferLength;\n const bytesToCopy = Math.min(dataLength, neededBytes);\n \n // Copy data to buffer\n for (let i = 0; i < bytesToCopy; i++) {\n this.buffer[currentBufferLength + i] = data[i];\n }\n \n this.state.bufferLength += bytesToCopy;\n \n // If buffer is full, process it\n if (this.state.bufferLength === 64) {\n this._processBufferBlock();\n }\n \n // If we used all data, we're done\n if (bytesToCopy === dataLength) {\n callback();\n return;\n }\n \n // Move to next position in original data\n // Shift remaining data to beginning of buffer\n const remainingData = dataLength - bytesToCopy;\n for (let i = 0; i < remainingData; i++) {\n data[i] = data[bytesToCopy + i];\n }\n // Create a new buffer with only the remaining data\n const remainingBuffer = Buffer.alloc(remainingData);\n for (let i = 0; i < remainingData; i++) {\n remainingBuffer[i] = data[i];\n }\n data = remainingBuffer;\n }\n \n // Process full 64-byte blocks directly from data\n const fullBlocks = Math.floor(data.length / 64);\n \n for (let i = 0; i < fullBlocks; i++) {\n const blockStart = i * 64;\n const block: number[] = [];\n \n for (let j = 0; j < 16; j++) {\n const idx = blockStart + j * 4;\n block[j] = \n data[idx] +\n (data[idx + 1] << 8) +\n (data[idx + 2] << 16) +\n (data[idx + 3] << 24);\n }\n \n md5cycle(this.state.state, block, this.add32);\n this.state.bytesProcessed += 64;\n }\n \n // Store remaining bytes in buffer\n const remaining = data.length % 64;\n if (remaining > 0) {\n // Ensure buffer is large enough\n if (this.buffer.length < remaining) {\n this.buffer = new Uint8Array(remaining);\n this.state.buffer = this.buffer;\n }\n \n // Copy remaining bytes to buffer\n for (let i = 0; i < remaining; i++) {\n this.buffer[i] = data[fullBlocks * 64 + i];\n }\n this.state.bufferLength = remaining;\n }\n \n callback();\n } catch (error) {\n callback(error as Error);\n }\n }\n\n /**\n * Process the current buffer as a complete block\n */\n private _processBufferBlock(): void {\n const buffer = this.state.buffer;\n const block: number[] = [];\n \n for (let j = 0; j < 16; j++) {\n const idx = j * 4;\n block[j] = \n buffer[idx] +\n (buffer[idx + 1] << 8) +\n (buffer[idx + 2] << 16) +\n (buffer[idx + 3] << 24);\n }\n \n md5cycle(this.state.state, block, this.add32);\n this.state.bytesProcessed += 64;\n this.state.bufferLength = 0;\n }\n\n /**\n * Finalize MD5 computation and emit result\n * @param callback - Callback to signal flush complete\n */\n _flush(callback: TransformCallback): void {\n try {\n const { state, bufferLength, buffer } = this.state;\n \n // Final padding\n const tail: number[] = new Array(16).fill(0);\n \n // Copy remaining buffer\n for (let i = 0; i < bufferLength; i++) {\n tail[i >> 2] |= (buffer[i] & 0xff) << ((i % 4) << 3);\n }\n \n // Append 0x80\n tail[bufferLength >> 2] |= 0x80 << ((bufferLength % 4) << 3);\n \n // If not enough space for length, process current block\n if (bufferLength > 55) {\n md5cycle(state, tail, this.add32);\n for (let i = 0; i < 16; i++) {\n tail[i] = 0;\n }\n }\n \n // Append length (in bits) - include remaining bytes\n tail[14] = (this.state.bytesProcessed + bufferLength) * 8;\n tail[15] = 0; // High 32 bits of length (not used for typical files)\n \n // Final MD5 cycle\n md5cycle(state, tail, this.add32);\n \n // Generate hex digest\n const digest = hex(state);\n \n // Emit result\n this.emit('md5', {\n digest,\n bytesProcessed: this.state.bytesProcessed + bufferLength\n });\n \n callback();\n } catch (error) {\n callback(error as Error);\n }\n }\n\n /**\n * Get current MD5 state (for debugging/testing)\n * @returns Current internal state\n */\n public getCurrentState(): { state: number[]; bytesProcessed: number } {\n return {\n state: [...this.state.state],\n bytesProcessed: this.state.bytesProcessed + this.state.bufferLength\n };\n }\n\n /**\n * Get bytes processed so far\n * @returns Number of bytes processed\n */\n public getBytesProcessed(): number {\n return this.state.bytesProcessed + this.state.bufferLength;\n }\n\n /**\n * Reset the stream state\n * Note: This resets the internal MD5 state but not the stream's ended state.\n * For full stream reset, use destroy() and create a new instance.\n */\n public reset(): void {\n // Reset internal MD5 state\n this.state = {\n state: [...this.initialMD5State],\n bytesProcessed: 0,\n bufferLength: 0,\n buffer: this.buffer\n };\n this.buffer = new Uint8Array(this.bufferCapacity);\n this.state.buffer = this.buffer;\n this.state.bufferLength = 0;\n }\n\n /**\n * Static method to create MD5Stream from existing readable stream\n * @param source - Source readable stream\n * @param options - MD5Stream options\n * @returns Object containing stream and result promise\n */\n static fromStream(\n source: import('stream').Readable,\n options?: MD5StreamOptions\n ): { stream: MD5Stream; result: Promise<MD5Result> } {\n const stream = new MD5Stream(options);\n const result = pipeThroughMD5.call(stream, source);\n \n return { stream, result };\n }\n}\n\n/**\n * Factory function to create MD5Stream instance\n * @param options - MD5Stream options\n * @returns New MD5Stream instance\n */\nexport function createMD5Stream(options?: MD5StreamOptions): MD5Stream {\n return new MD5Stream(options);\n}\n\n/**\n * Result type for MD5 computation\n */\nexport interface MD5Result {\n /**\n * MD5 hash as hex string\n */\n digest: string;\n /**\n * Number of bytes processed\n */\n bytesProcessed: number;\n}\n\n/**\n * Pipe through MD5 stream helper\n * @param this - MD5Stream instance\n * @param source - Source readable stream to process\n * @returns Promise with MD5 result\n */\nexport async function pipeThroughMD5(\n this: MD5Stream,\n source: import('stream').Readable\n): Promise<MD5Result> {\n return new Promise((resolve, reject) => {\n const results: MD5Result[] = [];\n \n source\n .pipe(this)\n .on('md5', (result: MD5Result) => {\n results.push(result);\n })\n .on('error', reject)\n .on('finish', () => {\n resolve(results[0]);\n });\n });\n}\n\n/**\n * Static method to create MD5Stream from existing readable stream\n * @param source - Source readable stream\n * @param options - MD5Stream options\n * @returns Object containing stream and result promise\n */\nexport function fromStream(\n source: import('stream').Readable,\n options?: MD5StreamOptions\n): { stream: MD5Stream; result: Promise<MD5Result> } {\n const stream = new MD5Stream(options);\n const result = pipeThroughMD5.call(stream, source);\n \n return { stream, result };\n}\n","/**\n * Stream Backend Adapter\n * Integrates MD5 stream computation with backend detection system\n */\n\nimport { MD5Backend } from '../adapters/types.js';\nimport { MD5Stream, MD5Result } from './md5-stream.js';\nimport { MD5ReadableStream as WHATWGMD5Stream } from './whatwg-stream.js';\n\n/**\n * Stream backend state\n */\ninterface StreamBackendState {\n stream: MD5Stream | WHATWGMD5Stream;\n type: 'node' | 'whatwg';\n}\n\n/**\n * Stream backend for MD5 operations that supports streaming\n * Can be used with both Node.js streams and WHATWG streams\n */\nexport class StreamBackend implements MD5Backend {\n name: string = 'stream';\n version: string = '0.1.0';\n \n private state: StreamBackendState | null = null;\n \n /**\n * Initialize with Node.js stream\n * @param stream Node.js Transform stream\n */\n initNodeStream(stream: MD5Stream): void {\n this.state = {\n stream,\n type: 'node'\n };\n }\n \n /**\n * Initialize with WHATWG stream\n * @param stream WHATWG ReadableStream\n */\n initWhatWGStream(stream: WHATWGMD5Stream): void {\n this.state = {\n stream,\n type: 'whatwg'\n };\n }\n \n /**\n * Hash string data (converts to stream internally)\n * @param data String to hash\n * @returns MD5 hash as hex string\n */\n async hash(data: string): Promise<string> {\n const stream = new MD5Stream();\n const result = await new Promise<MD5Result>((resolve, reject) => {\n stream\n .on('md5', (result) => resolve(result))\n .on('error', reject)\n .end(data);\n });\n return result.digest;\n }\n \n /**\n * Hash binary data (converts to stream internally)\n * @param data Binary data to hash\n * @returns MD5 hash as hex string\n */\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const stream = new MD5Stream();\n // Convert ArrayBuffer to Buffer first\n let buffer: Buffer;\n if (data instanceof Uint8Array) {\n buffer = Buffer.from(data);\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(new Uint8Array(data));\n } else {\n buffer = Buffer.from(data);\n }\n const result = await new Promise<MD5Result>((resolve, reject) => {\n stream\n .on('md5', (result) => resolve(result))\n .on('error', reject)\n .end(buffer);\n });\n return result.digest;\n }\n \n /**\n * Update hash with additional data (streaming)\n * @param data Data to add to hash\n */\n update(data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n if (!this.state) {\n throw new Error('Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.');\n }\n \n if (this.state.type === 'node') {\n const nodeStream = this.state.stream as MD5Stream;\n // Convert to Buffer properly based on type\n let buffer: Buffer;\n if (typeof data === 'string') {\n buffer = Buffer.from(data);\n } else if (data instanceof Uint8Array) {\n buffer = Buffer.from(data);\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(new Uint8Array(data));\n } else {\n buffer = Buffer.from(data);\n }\n nodeStream.write(buffer);\n }\n // WHATWG streams don't support update in the same way\n }\n \n /**\n * Get final hash digest\n * @param encoding Output encoding ('hex' or 'buffer')\n * @returns Hash digest\n */\n digest(encoding?: 'hex' | 'buffer'): string | Uint8Array | Promise<string | Uint8Array> {\n if (!this.state) {\n throw new Error('Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.');\n }\n \n if (this.state.type === 'node') {\n const nodeStream = this.state.stream as MD5Stream;\n nodeStream.end();\n \n return new Promise<string>((resolve, reject) => {\n nodeStream\n .on('md5', (result) => {\n if (encoding === 'buffer') {\n const hexDigest = result.digest;\n const bytes: number[] = [];\n for (let i = 0; i < hexDigest.length; i += 2) {\n bytes.push(parseInt(hexDigest.substring(i, i + 2), 16));\n }\n // Type assertion to avoid TypeScript error\n resolve(Buffer.from(bytes) as any);\n } else {\n resolve(result.digest);\n }\n })\n .on('error', reject);\n });\n } else {\n const whatwgStream = this.state.stream as WHATWGMD5Stream;\n return whatwgStream.getResult().then(result => result.digest);\n }\n }\n \n /**\n * Reset the hash state\n */\n reset(): void | Promise<void> {\n if (!this.state) {\n return;\n }\n \n if (this.state.type === 'node') {\n (this.state.stream as MD5Stream).reset();\n }\n // WHATWG streams don't support reset\n }\n \n /**\n * Check if backend is available\n * @returns Always true for stream backend\n */\n static isAvailable(): boolean {\n return true; // Stream backend is always available\n }\n}\n","/**\n * Pure JavaScript Backend\n * Uses the internal md5Core implementation\n */\n\nimport { MD5Backend } from \"./types.js\";\nimport { md5Core } from \"../core/index.js\";\n\nexport class PureJSBackend implements MD5Backend {\n name: string = \"purejs\";\n version: string = \"0.1.0\";\n\n private state: {\n data: string;\n finished: boolean;\n };\n\n constructor() {\n this.state = { data: \"\", finished: false };\n }\n\n hash(data: string): string {\n return md5Core(data);\n }\n\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const text =\n data instanceof ArrayBuffer\n ? new TextDecoder().decode(data)\n : new TextDecoder().decode(data);\n return md5Core(text);\n }\n\n update(data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n if (this.state.finished) {\n // Reset if already finished\n this.state = { data: \"\", finished: false };\n }\n\n if (data instanceof ArrayBuffer) {\n this.state.data += new TextDecoder().decode(data);\n } else if (data instanceof Uint8Array) {\n this.state.data += new TextDecoder().decode(data);\n } else {\n this.state.data += data;\n }\n }\n\n digest(encoding?: \"hex\" | \"buffer\"): string | Uint8Array | Promise<string | Uint8Array> {\n const result = md5Core(this.state.data);\n this.state.finished = true;\n\n if (encoding === \"buffer\") {\n return this.hexToBuffer(result);\n }\n return result;\n }\n\n reset(): void | Promise<void> {\n this.state = { data: \"\", finished: false };\n }\n\n static isAvailable(): boolean {\n return true; // Always available\n }\n\n private hexToBuffer(hex: string): Uint8Array {\n const bytes: number[] = [];\n for (let i = 0; i < hex.length; i += 2) {\n bytes.push(parseInt(hex.substring(i, i + 2), 16));\n }\n return new Uint8Array(bytes);\n }\n}\n","/**\n * Backend Detection Utilities\n * Detects available backends and environment\n */\n\nimport { WebCryptoBackend } from \"../adapters/webcrypto.js\";\nimport { NodeCryptoBackend } from \"../adapters/node.js\";\nimport { IE11Backend } from \"../adapters/ie11.js\";\nimport { PureJSBackend } from \"../adapters/pure-js.js\";\nimport { StreamBackend } from \"../stream/adapter.js\";\n\nexport enum RuntimeEnvironment {\n BROWSER = \"browser\",\n NODE = \"node\",\n WEBWORKER = \"webworker\",\n UNKNOWN = \"unknown\"\n}\n\nexport function detectEnvironment(): RuntimeEnvironment {\n // Check Node.js environment\n if (typeof process !== \"undefined\" && process.versions && process.versions.node) {\n return RuntimeEnvironment.NODE;\n }\n\n // Check web worker\n if (typeof importScripts !== \"undefined\") {\n return RuntimeEnvironment.WEBWORKER;\n }\n\n // Check browser\n if (typeof window !== \"undefined\" && window.document) {\n return RuntimeEnvironment.BROWSER;\n }\n\n return RuntimeEnvironment.UNKNOWN;\n}\n\nexport function isNode(): boolean {\n return typeof process !== \"undefined\" &&\n process.versions !== undefined &&\n \"node\" in process.versions;\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" &&\n typeof document !== \"undefined\";\n}\n\nexport function isWebWorker(): boolean {\n return typeof importScripts !== \"undefined\";\n}\n\nexport interface BackendAvailability {\n backend: string;\n available: boolean;\n reason?: string;\n}\n\nexport async function checkBackendAvailability(backendName: string): Promise<BackendAvailability> {\n switch (backendName) {\n case \"webcrypto\":\n const webCryptoAvailable = WebCryptoBackend.isAvailable();\n return {\n backend: \"webcrypto\",\n available: webCryptoAvailable,\n reason: webCryptoAvailable ? undefined : \"Web Crypto API not available\"\n };\n\n case \"nodecrypto\":\n const nodeCryptoAvailable = NodeCryptoBackend.isAvailable();\n return {\n backend: \"nodecrypto\",\n available: nodeCryptoAvailable,\n reason: nodeCryptoAvailable ? undefined : \"Node.js crypto not available\"\n };\n\n case \"ie11\":\n const ie11Available = IE11Backend.isAvailable();\n return {\n backend: \"ie11\",\n available: ie11Available,\n reason: ie11Available ? undefined : \"IE11 msCrypto not available\"\n };\n\n case \"purejs\":\n return {\n backend: \"purejs\",\n available: true,\n reason: \"Always available\"\n };\n\n case \"stream\":\n // Stream backend is always available (uses Node.js streams or WHATWG streams)\n const isNode = typeof process !== 'undefined' && process.versions && 'node' in process.versions;\n const isBrowser = typeof window !== 'undefined';\n return {\n backend: \"stream\",\n available: isNode || isBrowser,\n reason: (isNode || isBrowser) ? undefined : \"Streams not available\"\n };\n\n default:\n return {\n backend: backendName || 'unknown',\n available: false,\n reason: 'Unknown backend'\n };\n }\n}\n\nexport async function getAllAvailableBackends(): Promise<string[]> {\n const backends = [\"webcrypto\", \"nodecrypto\", \"ie11\", \"purejs\", \"stream\"];\n const available: string[] = [];\n\n for (const backend of backends) {\n const { available: isAvailable } = await checkBackendAvailability(backend);\n if (isAvailable) {\n available.push(backend);\n }\n }\n\n return available;\n}\n\nexport interface BackendPriority {\n name: string;\n priority: number;\n description: string;\n}\n\nexport const BACKEND_PRIORITY: BackendPriority[] = [\n {\n name: \"nodecrypto\",\n priority: 1,\n description: \"Node.js native crypto (fastest)\"\n },\n {\n name: \"webcrypto\",\n priority: 2,\n description: \"Web Crypto API (fast, hardware accelerated)\"\n },\n {\n name: \"ie11\",\n priority: 3,\n description: \"IE11 msCrypto (legacy)\"\n },\n {\n name: \"stream\",\n priority: 4,\n description: \"Streaming backend (for large files and memory efficiency)\"\n },\n {\n name: \"purejs\",\n priority: 5,\n description: \"Pure JavaScript (always available, slower)\"\n }\n];\n\nexport function getBestAvailableBackend(availableBackends: string[]): string {\n const sortedPriority = [...BACKEND_PRIORITY].sort((a, b) => a.priority - b.priority);\n\n for (const { name } of sortedPriority) {\n if (availableBackends.includes(name)) {\n return name;\n }\n }\n\n return \"purejs\"; // Fallback\n}\n\n/**\n * Backend Detector for creating instances\n */\nexport class BackendDetector {\n private static instance: BackendDetector;\n\n private constructor() {}\n\n static getInstance(): BackendDetector {\n if (!BackendDetector.instance) {\n BackendDetector.instance = new BackendDetector();\n }\n return BackendDetector.instance;\n }\n\n async createBackendByName(name: string): Promise<any> {\n switch (name) {\n case \"nodecrypto\":\n return new NodeCryptoBackend();\n case \"webcrypto\":\n return new WebCryptoBackend();\n case \"ie11\":\n return new IE11Backend();\n case \"stream\":\n return new StreamBackend();\n case \"purejs\":\n default:\n return new PureJSBackend();\n }\n }\n\n async createBackend(detectedBackend?: string): Promise<any> {\n const backendName = detectedBackend || getBestAvailableBackend(await getAllAvailableBackends());\n return this.createBackendByName(backendName);\n }\n}\n\nexport const detector = BackendDetector.getInstance();\n\n/**\n * Fallback Manager with retry logic\n */\nexport interface FallbackResult<T> {\n success: boolean;\n backend: string;\n data: T;\n errors?: { backend: string; error: Error }[];\n}\n\nexport class FallbackManager {\n public detector: BackendDetector;\n private fallbackOrder: string[];\n\n constructor(fallbackOrder: string[] = [\"nodecrypto\", \"webcrypto\", \"stream\", \"ie11\", \"purejs\"]) {\n this.detector = BackendDetector.getInstance();\n this.fallbackOrder = fallbackOrder;\n }\n\n /**\n * Execute operation with fallback mechanism\n */\n async execute<T>(operation: (backend: any) => Promise<T>): Promise<FallbackResult<T>> {\n const errors: { backend: string; error: Error }[] = [];\n\n for (const backendName of this.fallbackOrder) {\n try {\n const backend = await this.detector.createBackendByName(backendName);\n const result = await operation(backend);\n return {\n success: true,\n backend: backendName,\n data: result\n };\n } catch (error) {\n errors.push({ backend: backendName, error: error as Error });\n\n // Don't fallback if last backend failed\n if (backendName === this.fallbackOrder[this.fallbackOrder.length - 1]) {\n return {\n success: false,\n backend: backendName,\n data: null as unknown as T,\n errors\n };\n }\n }\n }\n\n return {\n success: false,\n backend: \"\",\n data: null as unknown as T,\n errors\n };\n }\n\n /**\n * Hash with fallback mechanism\n */\n async hash(data: string): Promise<FallbackResult<string>> {\n return this.execute(async (backend) => backend.hash(data));\n }\n\n /**\n * Hash binary data with fallback\n */\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<FallbackResult<string>> {\n return this.execute(async (backend) => backend.hashBinary(data));\n }\n\n /**\n * Get the best available backend\n */\n async getBestBackend(): Promise<string> {\n const available = await this.getAvailableBackends();\n if (available.length === 0) {\n return \"purejs\"; // Fallback\n }\n return available[0]; // First is best\n }\n\n /**\n * Get available backends in priority order\n */\n async getAvailableBackends(): Promise<string[]> {\n const available: string[] = [];\n\n for (const backendName of this.fallbackOrder) {\n try {\n await this.detector.createBackendByName(backendName);\n available.push(backendName);\n } catch {\n // Backend not available\n }\n }\n\n return available;\n }\n\n /**\n * Get backend metrics for monitoring\n */\n getMetrics(): Record<string, { success: number; fail: number }> {\n // Implementation for tracking usage\n return {};\n }\n}\n\nexport const fallbackManager = new FallbackManager();\n\n/**\n * Robust hash function with fallback support\n */\nexport async function robustHash(\n data: string,\n options: {\n fallback?: boolean;\n reportFallback?: boolean;\n forceBackend?: string;\n } = {}\n): Promise<string> {\n const fm = new FallbackManager();\n\n if (options.forceBackend) {\n // Use specific backend without fallback\n const backend = await fm.detector.createBackendByName(options.forceBackend);\n return backend.hash(data);\n }\n\n if (options.fallback === false) {\n // Use default backend without fallback\n const backend = await fm.detector.createBackend();\n return backend.hash(data);\n }\n\n // Use fallback\n const result = await fm.hash(data);\n\n if (result.success) {\n if (\n options.reportFallback &&\n result.backend !== \"nodecrypto\" &&\n result.backend !== \"webcrypto\"\n ) {\n console.info(`MD5 used fallback backend: ${result.backend}`);\n }\n return result.data;\n }\n\n // All backends failed\n const errorMessage = result.errors\n ? result.errors.map((e) => `${e.backend}: ${e.error.message}`).join(\", \")\n : \"All backends failed\";\n\n throw new Error(`MD5 hash failed after all attempts: ${errorMessage}`);\n}\n\n/**\n * Metrics collector for backend usage\n */\ninterface BackendMetrics {\n success: number;\n fail: number;\n}\n\nexport class MetricsCollector {\n private metrics: Record<string, BackendMetrics> = {\n nodecrypto: { success: 0, fail: 0 },\n webcrypto: { success: 0, fail: 0 },\n ie11: { success: 0, fail: 0 },\n stream: { success: 0, fail: 0 },\n purejs: { success: 0, fail: 0 }\n };\n\n recordSuccess(backend: string): void {\n if (this.metrics[backend]) {\n this.metrics[backend].success++;\n }\n }\n\n recordFail(backend: string): void {\n if (this.metrics[backend]) {\n this.metrics[backend].fail++;\n }\n }\n\n getMetrics(): Record<string, BackendMetrics> {\n return this.metrics;\n }\n\n getSummary(): string {\n const total = Object.values(this.metrics).reduce(\n (sum, m) => sum + m.success + m.fail,\n 0\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return (\n `Total operations: ${total}\\n` +\n Object.entries(this.metrics)\n .map(([, m]) => `${m.success} success, ${m.fail} fail`)\n .join(\"\\n\")\n );\n }\n\n reset(): void {\n Object.keys(this.metrics).forEach((key) => {\n this.metrics[key] = { success: 0, fail: 0 };\n });\n }\n}\n\nexport const metrics = new MetricsCollector();\n","/**\n * File System Utilities for MD5 hashing\n * Provides convenient utilities for hashing files through Node.js file system streams\n */\n\nimport fs from 'fs';\nimport { Readable } from 'stream';\nimport { MD5Result, createMD5Stream } from './md5-stream.js';\nimport { md5Buffer } from '../core/index.js';\n\n/**\n * Options for file hashing operations\n */\nexport interface HashFileOptions {\n /**\n * Chunk size for reading file (default: 64KB)\n */\n chunkSize?: number;\n \n /**\n * Progress callback for tracking hashing progress\n * @param current - Current position in bytes\n */\n onProgress?: (current: number) => void;\n}\n\n/**\n * Hash a file by its path\n * @param filePath - Path to the file to hash\n * @param options - Optional configuration\n * @returns Promise with MD5 result (digest and bytes processed)\n * \n * @example\n * ```ts\n * import { hashFile } from 'pure-md5';\n * \n * const result = await hashFile('path/to/file.txt');\n * console.log('MD5:', result.digest);\n * console.log('Bytes:', result.bytesProcessed);\n * ```\n */\nexport async function hashFile(\n filePath: string,\n options: HashFileOptions = {}\n): Promise<MD5Result> {\n // Validate file path\n if (typeof filePath !== 'string' || filePath.trim() === '') {\n throw new Error('Invalid file path: must be a non-empty string');\n }\n\n // Check if file exists\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n // Get file stats to check if it's a file (not directory)\n let stats: fs.Stats;\n try {\n stats = fs.statSync(filePath);\n } catch (error) {\n throw new Error(`Failed to access file ${filePath}: ${(error as Error).message}`);\n }\n\n if (!stats.isFile()) {\n throw new Error(`Path is not a file: ${filePath}`);\n }\n\n // Create readable stream\n const readStream = fs.createReadStream(filePath, {\n highWaterMark: options.chunkSize || 64 * 1024 // 64KB default\n });\n\n try {\n return await hashFileStream(readStream, {\n onProgress: options.onProgress,\n totalSize: stats.size\n });\n } finally {\n // Ensure stream is destroyed to free resources\n readStream.destroy();\n }\n}\n\n/**\n * Hash data from an existing readable stream\n * @param readStream - Readable stream to hash\n * @param options - Optional configuration\n * @returns Promise with MD5 result (digest and bytes processed)\n * \n * @example\n * ```ts\n * import { createReadStream } from 'fs';\n * import { hashFileStream } from 'pure-md5';\n * \n * const stream = createReadStream('path/to/file.txt');\n * const result = await hashFileStream(stream);\n * console.log('MD5:', result.digest);\n * ```\n */\nexport async function hashFileStream(\n readStream: Readable,\n options: {\n onProgress?: (current: number) => void;\n totalSize?: number;\n } = {}\n): Promise<MD5Result> {\n // Validate stream\n if (!readStream || typeof readStream.on !== 'function') {\n throw new Error('Invalid readable stream: stream must have event listener support');\n }\n\n // Create MD5 stream\n const md5Stream = createMD5Stream();\n\n // Track progress if callback provided\n let bytesProcessed = 0;\n \n if (options.onProgress) {\n readStream.on('data', (chunk: Buffer) => {\n bytesProcessed += chunk.length;\n options.onProgress?.(bytesProcessed);\n });\n }\n\n // Handle stream errors\n readStream.on('error', (error) => {\n md5Stream.destroy(error);\n });\n\n // Handle stream end\n readStream.on('end', () => {\n md5Stream.end();\n });\n\n // Pipe stream through MD5\n return new Promise<MD5Result>((resolve, reject) => {\n md5Stream\n .on('md5', (result: MD5Result) => {\n resolve(result);\n })\n .on('error', (error) => {\n reject(error);\n });\n \n readStream.pipe(md5Stream);\n });\n}\n\n/**\n * Hash a file and return only the hex digest\n * @param filePath - Path to the file to hash\n * @param options - Optional configuration\n * @returns Promise with MD5 hex digest string\n * \n * @example\n * ```ts\n * import { hashFileDigest } from 'pure-md5';\n * \n * const digest = await hashFileDigest('path/to/file.txt');\n * console.log('MD5:', digest);\n * ```\n */\nexport async function hashFileDigest(\n filePath: string,\n options: HashFileOptions = {}\n): Promise<string> {\n const result = await hashFile(filePath, options);\n return result.digest;\n}\n\n/**\n * Hash a file stream and return only the hex digest\n * @param readStream - Readable stream to hash\n * @param options - Optional configuration\n * @returns Promise with MD5 hex digest string\n */\nexport async function hashFileStreamDigest(\n readStream: Readable,\n options: { onProgress?: (current: number) => void; totalSize?: number } = {}\n): Promise<string> {\n const result = await hashFileStream(readStream, options);\n return result.digest;\n}\n\n/**\n * Verify file integrity by comparing MD5 hash\n * @param filePath - Path to the file to verify\n * @param expectedDigest - Expected MD5 hex digest\n * @param options - Optional configuration\n * @returns Promise with verification result\n * \n * @example\n * ```ts\n * import { verifyFile } from 'pure-md5';\n * \n * const isVerified = await verifyFile(\n * 'path/to/file.txt',\n * '5d41402abc4b2a76b9719d911017c592'\n * );\n * console.log('Verified:', isVerified);\n * ```\n */\nexport async function verifyFile(\n filePath: string,\n expectedDigest: string,\n options: HashFileOptions = {}\n): Promise<boolean> {\n const result = await hashFile(filePath, options);\n return result.digest.toLowerCase() === expectedDigest.toLowerCase();\n}\n\n/**\n * Get MD5 hash of a file synchronously (not recommended for large files)\n * @param filePath - Path to the file to hash\n * @returns MD5 hex digest string\n * \n * @example\n * ```ts\n * import { hashFileSync } from 'pure-md5';\n * \n * const digest = hashFileSync('path/to/file.txt');\n * console.log('MD5:', digest);\n * ```\n */\nexport function hashFileSync(filePath: string): string {\n // Validate file path\n if (typeof filePath !== 'string' || filePath.trim() === '') {\n throw new Error('Invalid file path: must be a non-empty string');\n }\n\n // Check if file exists\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n // Get file stats\n let stats: fs.Stats;\n try {\n stats = fs.statSync(filePath);\n } catch (error) {\n throw new Error(`Failed to access file ${filePath}: ${(error as Error).message}`);\n }\n\n if (!stats.isFile()) {\n throw new Error(`Path is not a file: ${filePath}`);\n }\n\n // Read entire file into memory (not recommended for large files)\n let content: Buffer;\n try {\n content = fs.readFileSync(filePath);\n } catch (error) {\n throw new Error(`Failed to read file ${filePath}: ${(error as Error).message}`);\n }\n\n // Use synchronous MD5 computation with Buffer support\n return md5Buffer(content);\n}\n\n/**\n * Utility to create a progress tracker for file hashing\n * @param totalSize - Total size of the file being hashed\n * @param onUpdate - Callback with progress percentage (0-100)\n * @returns Progress callback function\n * \n * @example\n * ```ts\n * import { hashFile, createProgressTracker } from 'pure-md5';\n * \n * const totalSize = 1024 * 1024 * 100; // 100MB\n * const progress = createProgressTracker(totalSize, (percent) => {\n * console.log(`Progress: ${percent.toFixed(1)}%`);\n * });\n * \n * const result = await hashFile('large-file.bin', { onProgress: progress });\n * ```\n */\nexport function createProgressTracker(\n totalSize: number,\n onUpdate: (percentage: number) => void\n): (current: number) => void {\n let lastPercentage = 0;\n \n return (current: number) => {\n if (totalSize > 0) {\n const percentage = Math.min(100, (current / totalSize) * 100);\n \n // Only update if percentage changed significantly\n if (Math.floor(percentage) !== Math.floor(lastPercentage)) {\n onUpdate(percentage);\n lastPercentage = percentage;\n }\n }\n };\n}\n","/**\n * MD5 Stream API - Streaming MD5 hash computation\n * Provides Transform stream and factory functions for efficient MD5 hashing\n * Supports both Node.js Streams and WHATWG Streams for browsers\n */\n\nimport { MD5Stream as MD5StreamClass, createMD5Stream, pipeThroughMD5, MD5Result, fromStream } from './md5-stream.js';\n\n// Add fromStream as static method to MD5Stream class\nObject.defineProperty(MD5StreamClass, 'fromStream', {\n value: fromStream,\n writable: false,\n configurable: false\n});\n\nexport { MD5StreamClass as MD5Stream, createMD5Stream, pipeThroughMD5, MD5Result, fromStream };\n\nexport {\n hashFile,\n hashFileStream,\n hashFileDigest,\n hashFileStreamDigest,\n hashFileSync,\n verifyFile,\n createProgressTracker,\n HashFileOptions\n} from './fs-utils.js';\n\n// WHATWG Streams support for browsers\nexport {\n MD5ReadableStream,\n createMD5ReadableStream,\n hashReadableStream,\n hashFile as hashFileWHATWG,\n hashBlob,\n consumeWithMD5,\n MD5ReadableStreamOptions\n} from './whatwg-stream.js';\n","/**\n * Pure MD5 - Unified adapter with auto-detection\n * Supports multiple backends: Web Crypto, Node.js crypto, IE11, and Pure JS\n */\n\nimport { md5Core as pureMD5 } from './core/index.js';\nimport { WebCryptoBackend } from './adapters/webcrypto.js';\nimport { NodeCryptoBackend } from './adapters/node.js';\nimport { IE11Backend } from './adapters/ie11.js';\nimport { StreamBackend } from './stream/adapter.js';\n//\n// PureJSBackend is exported below, not used directly in this file\nimport {\n getAllAvailableBackends,\n getBestAvailableBackend\n} from './utils/detect.js';\n\nexport { md5Core } from './core/index.js';\nexport { WebCryptoBackend } from './adapters/webcrypto.js';\nexport { NodeCryptoBackend } from './adapters/node.js';\nexport { IE11Backend } from './adapters/ie11.js';\nexport { PureJSBackend } from './adapters/pure-js.js';\nexport { MD5Backend } from './adapters/types.js';\nexport {\n MD5Stream,\n MD5Result,\n createMD5Stream,\n pipeThroughMD5,\n fromStream,\n hashFile,\n hashFileStream,\n hashFileDigest,\n hashFileStreamDigest,\n hashFileSync,\n verifyFile,\n createProgressTracker,\n HashFileOptions\n} from './stream/index.js';\nexport {\n getAllAvailableBackends,\n getBestAvailableBackend,\n BackendDetector,\n detector,\n FallbackManager,\n fallbackManager,\n robustHash,\n MetricsCollector,\n metrics\n} from './utils/detect.js';\n\n/**\n * Default MD5 adapter with auto-detection\n */\nclass MD5Adapter {\n private backend: any | null = null;\n private backendName: string | null = null;\n \n /**\n * Hash string data with automatic backend selection\n * @param data - String to hash\n * @returns MD5 hash as hex string\n */\n async hash(data: string): Promise<string> {\n const backend = await this.getBackend();\n return backend.hash(data);\n }\n \n /**\n * Hash binary data with automatic backend selection\n * @param data - Binary data to hash\n * @returns MD5 hash as hex string\n */\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const backend = await this.getBackend();\n return backend.hashBinary(data);\n }\n \n /**\n * Get backend name\n * @returns Name of the selected backend\n */\n async getBackendName(): Promise<string> {\n if (!this.backendName) {\n const available = await getAllAvailableBackends();\n this.backendName = getBestAvailableBackend(available);\n }\n return this.backendName;\n }\n \n /**\n * Get available backends\n * @returns List of available backend names\n */\n static async getAvailableBackends(): Promise<string[]> {\n return await getAllAvailableBackends();\n }\n \n /**\n * Force specific backend for all operations\n * @param backendName - Backend name to use\n */\n async useBackend(backendName: string): Promise<void> {\n this.backend = await this.createBackendByName(backendName);\n this.backendName = backendName;\n }\n \n /**\n * Create backend by name\n * @param name - Backend name\n * @returns Backend instance\n */\n private async createBackendByName(name: string): Promise<any> {\n switch (name) {\n case 'nodecrypto':\n return new NodeCryptoBackend();\n case 'webcrypto':\n return new WebCryptoBackend();\n case 'ie11':\n return new IE11Backend();\n case 'stream':\n return new StreamBackend();\n case 'purejs':\n default:\n return {\n hash: (data: string) => pureMD5(data),\n hashBinary: async (data: ArrayBuffer | Uint8Array) => pureMD5(data instanceof Uint8Array ? new TextDecoder().decode(data) : new TextDecoder().decode(new Uint8Array(data))),\n update: () => {},\n digest: () => '',\n reset: () => {},\n name: 'purejs',\n version: '0.1.0'\n };\n }\n }\n \n /**\n * Get backend instance (lazy initialization)\n * @returns Backend instance\n */\n private async getBackend(): Promise<any> {\n if (this.backend) {\n return this.backend;\n }\n \n // Get best available backend\n const available = await getAllAvailableBackends();\n const bestBackend = getBestAvailableBackend(available);\n \n this.backend = await this.createBackendByName(bestBackend);\n this.backendName = bestBackend;\n return this.backend;\n }\n}\n\n// Export backward-compatible function (synchronous)\nexport function md5(data: string): string {\n return pureMD5(data);\n}\n\n// Export adapter instance for advanced use cases\nexport const md5Adapter = new MD5Adapter();\n\n// Export async hash method for adapter use\nexport async function md5Async(data: string): Promise<string> {\n return md5Adapter.hash(data);\n}\n\n// Export original function for backward compatibility\nexport { pureMD5 as md5Original };\n"]}
|
package/dist/index.d.cts
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
export { md5 as md5Core, md5 as md5Original } from './core/index.cjs';
|
|
2
|
-
export { WebCryptoBackend } from './adapters/webcrypto.cjs';
|
|
3
|
-
export { NodeCryptoBackend } from './adapters/node.cjs';
|
|
4
|
-
export { IE11Backend } from './adapters/ie11.cjs';
|
|
5
|
-
import { M as MD5Backend } from './types-edGoGJ5V.cjs';
|
|
6
|
-
export { MD5Result, MD5Stream, createMD5Stream, fromStream, pipeThroughMD5 } from './stream/md5-stream.cjs';
|
|
7
|
-
export { HashFileOptions, createProgressTracker, hashFile, hashFileDigest, hashFileStream, hashFileStreamDigest, hashFileSync, verifyFile } from './stream/fs-utils.cjs';
|
|
8
|
-
export { BackendDetector, FallbackManager, MetricsCollector, detector, fallbackManager, getAllAvailableBackends, getBestAvailableBackend, metrics, robustHash } from './utils/detect.cjs';
|
|
9
|
-
import 'stream';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Pure JavaScript Backend
|
|
13
|
-
* Uses the internal md5Core implementation
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
declare class PureJSBackend implements MD5Backend {
|
|
17
|
-
name: string;
|
|
18
|
-
version: string;
|
|
19
|
-
private state;
|
|
20
|
-
constructor();
|
|
21
|
-
hash(data: string): string;
|
|
22
|
-
hashBinary(data: ArrayBuffer | Uint8Array): Promise<string>;
|
|
23
|
-
update(data: string | ArrayBuffer | Uint8Array): void | Promise<void>;
|
|
24
|
-
digest(encoding?: "hex" | "buffer"): string | Uint8Array | Promise<string | Uint8Array>;
|
|
25
|
-
reset(): void | Promise<void>;
|
|
26
|
-
static isAvailable(): boolean;
|
|
27
|
-
private hexToBuffer;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Pure MD5 - Unified adapter with auto-detection
|
|
32
|
-
* Supports multiple backends: Web Crypto, Node.js crypto, IE11, and Pure JS
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Default MD5 adapter with auto-detection
|
|
37
|
-
*/
|
|
38
|
-
declare class MD5Adapter {
|
|
39
|
-
private backend;
|
|
40
|
-
private backendName;
|
|
41
|
-
/**
|
|
42
|
-
* Hash string data with automatic backend selection
|
|
43
|
-
* @param data - String to hash
|
|
44
|
-
* @returns MD5 hash as hex string
|
|
45
|
-
*/
|
|
46
|
-
hash(data: string): Promise<string>;
|
|
47
|
-
/**
|
|
48
|
-
* Hash binary data with automatic backend selection
|
|
49
|
-
* @param data - Binary data to hash
|
|
50
|
-
* @returns MD5 hash as hex string
|
|
51
|
-
*/
|
|
52
|
-
hashBinary(data: ArrayBuffer | Uint8Array): Promise<string>;
|
|
53
|
-
/**
|
|
54
|
-
* Get backend name
|
|
55
|
-
* @returns Name of the selected backend
|
|
56
|
-
*/
|
|
57
|
-
getBackendName(): Promise<string>;
|
|
58
|
-
/**
|
|
59
|
-
* Get available backends
|
|
60
|
-
* @returns List of available backend names
|
|
61
|
-
*/
|
|
62
|
-
static getAvailableBackends(): Promise<string[]>;
|
|
63
|
-
/**
|
|
64
|
-
* Force specific backend for all operations
|
|
65
|
-
* @param backendName - Backend name to use
|
|
66
|
-
*/
|
|
67
|
-
useBackend(backendName: string): Promise<void>;
|
|
68
|
-
/**
|
|
69
|
-
* Create backend by name
|
|
70
|
-
* @param name - Backend name
|
|
71
|
-
* @returns Backend instance
|
|
72
|
-
*/
|
|
73
|
-
private createBackendByName;
|
|
74
|
-
/**
|
|
75
|
-
* Get backend instance (lazy initialization)
|
|
76
|
-
* @returns Backend instance
|
|
77
|
-
*/
|
|
78
|
-
private getBackend;
|
|
79
|
-
}
|
|
80
|
-
declare function md5(data: string): string;
|
|
81
|
-
declare const md5Adapter: MD5Adapter;
|
|
82
|
-
declare function md5Async(data: string): Promise<string>;
|
|
83
|
-
|
|
84
|
-
export { MD5Backend, PureJSBackend, md5, md5Adapter, md5Async };
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["MD5Adapter","data","available","getAllAvailableBackends","getBestAvailableBackend","backendName","name","NodeCryptoBackend","WebCryptoBackend","IE11Backend","StreamBackend","md5Core","bestBackend","md5","md5Adapter","md5Async"],"mappings":"2kCAqDA,IAAMA,CAAAA,CAAN,KAAiB,CAAjB,WAAA,EAAA,CACE,KAAQ,OAAA,CAAsB,IAAA,CAC9B,IAAA,CAAQ,WAAA,CAA6B,KAAA,CAOrC,MAAM,KAAKC,CAAAA,CAA+B,CAExC,QADgB,MAAM,IAAA,CAAK,YAAW,EACvB,IAAA,CAAKA,CAAI,CAC1B,CAOA,MAAM,WAAWA,CAAAA,CAAiD,CAEhE,QADgB,MAAM,IAAA,CAAK,YAAW,EACvB,UAAA,CAAWA,CAAI,CAChC,CAMA,MAAM,gBAAkC,CACtC,GAAI,CAAC,IAAA,CAAK,WAAA,CAAa,CACrB,IAAMC,CAAAA,CAAY,MAAMC,CAAAA,EAAwB,CAChD,IAAA,CAAK,WAAA,CAAcC,EAAwBF,CAAS,EACtD,CACA,OAAO,IAAA,CAAK,WACd,CAMA,aAAa,oBAAA,EAA0C,CACrD,OAAO,MAAMC,GACf,CAMA,MAAM,UAAA,CAAWE,CAAAA,CAAoC,CACnD,KAAK,OAAA,CAAU,MAAM,IAAA,CAAK,mBAAA,CAAoBA,CAAW,CAAA,CACzD,KAAK,WAAA,CAAcA,EACrB,CAOA,MAAc,mBAAA,CAAoBC,EAA4B,CAC5D,OAAQA,CAAAA,EACN,KAAK,YAAA,CACH,OAAO,IAAIC,GAAAA,CACb,KAAK,WAAA,CACH,OAAO,IAAIC,IACb,KAAK,MAAA,CACH,OAAO,IAAIC,GAAAA,CACb,KAAK,SACH,OAAO,IAAIC,IAEb,QACE,OAAO,CACL,IAAA,CAAOT,GAAAA,EAAiBU,CAAAA,CAAQV,GAAI,CAAA,CACpC,UAAA,CAAY,MAAOA,GAAAA,EAAmCU,CAAAA,CAAQV,eAAgB,UAAA,CAAa,IAAI,aAAY,CAAE,MAAA,CAAOA,GAAI,CAAA,CAAI,IAAI,WAAA,GAAc,MAAA,CAAO,IAAI,WAAWA,GAAI,CAAC,CAAC,CAAA,CAC1K,MAAA,CAAQ,IAAM,CAAC,CAAA,CACf,MAAA,CAAQ,IAAM,EAAA,CACd,KAAA,CAAO,IAAM,CAAC,CAAA,CACd,IAAA,CAAM,SACN,OAAA,CAAS,OACX,CACJ,CACF,CAMA,MAAc,YAA2B,CACvC,GAAI,KAAK,OAAA,CACP,OAAO,KAAK,OAAA,CAId,IAAMC,CAAAA,CAAY,MAAMC,CAAAA,EAAwB,CAC1CS,EAAcR,CAAAA,CAAwBF,CAAS,CAAA,CAErD,OAAA,IAAA,CAAK,OAAA,CAAU,MAAM,KAAK,mBAAA,CAAoBU,CAAW,CAAA,CACzD,IAAA,CAAK,WAAA,CAAcA,CAAAA,CACZ,KAAK,OACd,CACF,EAGO,SAASC,CAAAA,CAAIZ,EAAsB,CACxC,OAAOU,CAAAA,CAAQV,CAAI,CACrB,KAGaa,CAAAA,CAAa,IAAId,EAG9B,eAAsBe,CAAAA,CAASd,CAAAA,CAA+B,CAC5D,OAAOa,CAAAA,CAAW,IAAA,CAAKb,CAAI,CAC7B","file":"index.js","sourcesContent":["/**\n * Pure MD5 - Unified adapter with auto-detection\n * Supports multiple backends: Web Crypto, Node.js crypto, IE11, and Pure JS\n */\n\nimport { md5Core as pureMD5 } from './core/index.js';\nimport { WebCryptoBackend } from './adapters/webcrypto.js';\nimport { NodeCryptoBackend } from './adapters/node.js';\nimport { IE11Backend } from './adapters/ie11.js';\nimport { StreamBackend } from './stream/adapter.js';\n//\n// PureJSBackend is exported below, not used directly in this file\nimport {\n getAllAvailableBackends,\n getBestAvailableBackend\n} from './utils/detect.js';\n\nexport { md5Core } from './core/index.js';\nexport { WebCryptoBackend } from './adapters/webcrypto.js';\nexport { NodeCryptoBackend } from './adapters/node.js';\nexport { IE11Backend } from './adapters/ie11.js';\nexport { PureJSBackend } from './adapters/pure-js.js';\nexport { MD5Backend } from './adapters/types.js';\nexport {\n MD5Stream,\n MD5Result,\n createMD5Stream,\n pipeThroughMD5,\n fromStream,\n hashFile,\n hashFileStream,\n hashFileDigest,\n hashFileStreamDigest,\n hashFileSync,\n verifyFile,\n createProgressTracker,\n HashFileOptions\n} from './stream/index.js';\nexport {\n getAllAvailableBackends,\n getBestAvailableBackend,\n BackendDetector,\n detector,\n FallbackManager,\n fallbackManager,\n robustHash,\n MetricsCollector,\n metrics\n} from './utils/detect.js';\n\n/**\n * Default MD5 adapter with auto-detection\n */\nclass MD5Adapter {\n private backend: any | null = null;\n private backendName: string | null = null;\n \n /**\n * Hash string data with automatic backend selection\n * @param data - String to hash\n * @returns MD5 hash as hex string\n */\n async hash(data: string): Promise<string> {\n const backend = await this.getBackend();\n return backend.hash(data);\n }\n \n /**\n * Hash binary data with automatic backend selection\n * @param data - Binary data to hash\n * @returns MD5 hash as hex string\n */\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const backend = await this.getBackend();\n return backend.hashBinary(data);\n }\n \n /**\n * Get backend name\n * @returns Name of the selected backend\n */\n async getBackendName(): Promise<string> {\n if (!this.backendName) {\n const available = await getAllAvailableBackends();\n this.backendName = getBestAvailableBackend(available);\n }\n return this.backendName;\n }\n \n /**\n * Get available backends\n * @returns List of available backend names\n */\n static async getAvailableBackends(): Promise<string[]> {\n return await getAllAvailableBackends();\n }\n \n /**\n * Force specific backend for all operations\n * @param backendName - Backend name to use\n */\n async useBackend(backendName: string): Promise<void> {\n this.backend = await this.createBackendByName(backendName);\n this.backendName = backendName;\n }\n \n /**\n * Create backend by name\n * @param name - Backend name\n * @returns Backend instance\n */\n private async createBackendByName(name: string): Promise<any> {\n switch (name) {\n case 'nodecrypto':\n return new NodeCryptoBackend();\n case 'webcrypto':\n return new WebCryptoBackend();\n case 'ie11':\n return new IE11Backend();\n case 'stream':\n return new StreamBackend();\n case 'purejs':\n default:\n return {\n hash: (data: string) => pureMD5(data),\n hashBinary: async (data: ArrayBuffer | Uint8Array) => pureMD5(data instanceof Uint8Array ? new TextDecoder().decode(data) : new TextDecoder().decode(new Uint8Array(data))),\n update: () => {},\n digest: () => '',\n reset: () => {},\n name: 'purejs',\n version: '0.1.0'\n };\n }\n }\n \n /**\n * Get backend instance (lazy initialization)\n * @returns Backend instance\n */\n private async getBackend(): Promise<any> {\n if (this.backend) {\n return this.backend;\n }\n \n // Get best available backend\n const available = await getAllAvailableBackends();\n const bestBackend = getBestAvailableBackend(available);\n \n this.backend = await this.createBackendByName(bestBackend);\n this.backendName = bestBackend;\n return this.backend;\n }\n}\n\n// Export backward-compatible function (synchronous)\nexport function md5(data: string): string {\n return pureMD5(data);\n}\n\n// Export adapter instance for advanced use cases\nexport const md5Adapter = new MD5Adapter();\n\n// Export async hash method for adapter use\nexport async function md5Async(data: string): Promise<string> {\n return md5Adapter.hash(data);\n}\n\n// Export original function for backward compatibility\nexport { pureMD5 as md5Original };\n"]}
|
package/dist/stream/adapter.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
'use strict';var stream=require('stream');function x(o,n){return o+n&4294967295}var l=x;function v(o,n,i,e,r){let t=r||l;return n=t(t(n,o),t(i,e)),n}function L(o,n,i,e){var t=(e||l)(o<<n|o>>>32-n,i);return t}function y(o,n,i,e,r,t,s){return n=v(o,n,e,t,s),L(n,r,i,s)}function M(o,n,i,e,r,t,s,a){return y(i&e|~i&r,n,i,t,s,a,o)}function D(o,n,i,e,r,t,s,a){return y(i&r|e&~r,n,i,t,s,a,o)}function A(o,n,i,e,r,t,s,a){return y(i^e^r,n,i,t,s,a,o)}function w(o,n,i,e,r,t,s,a){return y(e^(i|~r),n,i,t,s,a,o)}function R(o,n,i){typeof i>"u"&&(i=l);let e=o[0],r=o[1],t=o[2],s=o[3],a=M.bind(null,i);e=a(e,r,t,s,n[0],7,-680876936),s=a(s,e,r,t,n[1],12,-389564586),t=a(t,s,e,r,n[2],17,606105819),r=a(r,t,s,e,n[3],22,-1044525330),e=a(e,r,t,s,n[4],7,-176418897),s=a(s,e,r,t,n[5],12,1200080426),t=a(t,s,e,r,n[6],17,-1473231341),r=a(r,t,s,e,n[7],22,-45705983),e=a(e,r,t,s,n[8],7,1770035416),s=a(s,e,r,t,n[9],12,-1958414417),t=a(t,s,e,r,n[10],17,-42063),r=a(r,t,s,e,n[11],22,-1990404162),e=a(e,r,t,s,n[12],7,1804603682),s=a(s,e,r,t,n[13],12,-40341101),t=a(t,s,e,r,n[14],17,-1502002290),r=a(r,t,s,e,n[15],22,1236535329);let u=D.bind(null,i);e=u(e,r,t,s,n[1],5,-165796510),s=u(s,e,r,t,n[6],9,-1069501632),t=u(t,s,e,r,n[11],14,643717713),r=u(r,t,s,e,n[0],20,-373897302),e=u(e,r,t,s,n[5],5,-701558691),s=u(s,e,r,t,n[10],9,38016083),t=u(t,s,e,r,n[15],14,-660478335),r=u(r,t,s,e,n[4],20,-405537848),e=u(e,r,t,s,n[9],5,568446438),s=u(s,e,r,t,n[14],9,-1019803690),t=u(t,s,e,r,n[3],14,-187363961),r=u(r,t,s,e,n[8],20,1163531501),e=u(e,r,t,s,n[13],5,-1444681467),s=u(s,e,r,t,n[2],9,-51403784),t=u(t,s,e,r,n[7],14,1735328473),r=u(r,t,s,e,n[12],20,-1926607734);let f=A.bind(null,i);e=f(e,r,t,s,n[5],4,-378558),s=f(s,e,r,t,n[8],11,-2022574463),t=f(t,s,e,r,n[11],16,1839030562),r=f(r,t,s,e,n[14],23,-35309556),e=f(e,r,t,s,n[1],4,-1530992060),s=f(s,e,r,t,n[4],11,1272893353),t=f(t,s,e,r,n[7],16,-155497632),r=f(r,t,s,e,n[10],23,-1094730640),e=f(e,r,t,s,n[13],4,681279174),s=f(s,e,r,t,n[0],11,-358537222),t=f(t,s,e,r,n[3],16,-722521979),r=f(r,t,s,e,n[6],23,76029189),e=f(e,r,t,s,n[9],4,-640364487),s=f(s,e,r,t,n[12],11,-421815835),t=f(t,s,e,r,n[15],16,530742520),r=f(r,t,s,e,n[2],23,-995338651);let m=w.bind(null,i);e=m(e,r,t,s,n[0],6,-198630844),s=m(s,e,r,t,n[7],10,1126891415),t=m(t,s,e,r,n[14],15,-1416354905),r=m(r,t,s,e,n[5],21,-57434055),e=m(e,r,t,s,n[12],6,1700485571),s=m(s,e,r,t,n[3],10,-1894986606),t=m(t,s,e,r,n[10],15,-1051523),r=m(r,t,s,e,n[1],21,-2054922799),e=m(e,r,t,s,n[8],6,1873313359),s=m(s,e,r,t,n[15],10,-30611744),t=m(t,s,e,r,n[6],15,-1560198380),r=m(r,t,s,e,n[13],21,1309151649),e=m(e,r,t,s,n[4],6,-145523070),s=m(s,e,r,t,n[11],10,-1120210379),t=m(t,s,e,r,n[2],15,718787259),r=m(r,t,s,e,n[9],21,-343485551),o[0]=i(e,o[0]),o[1]=i(r,o[1]),o[2]=i(t,o[2]),o[3]=i(s,o[3]);}var p=R;var W="0123456789abcdef".split(""),S=W;function U(o){let n="";for(let i=0;i<4;i++)n+=S[o>>i*8+4&15]+S[o>>i*8&15];return n}function C(o){let n=o.length,i=new Array(n);for(let e=0;e<n;e++)i[e]=U(o[e]);return i.join("")}var B=C;var g=class o extends stream.Transform{constructor(i){super({readableObjectMode:false,writableObjectMode:false});this.initialMD5State=[1732584193,-271733879,-1732584194,271733878];this.bufferCapacity=64;this.buffer=new Uint8Array(this.bufferCapacity);this.add32=i?.add32||l,this.state={state:[...this.initialMD5State],bytesProcessed:0,bufferLength:0,buffer:this.buffer};}_transform(i,e,r){try{let t=i,s=t.length;if(s===0){r();return}if(this.state.bufferLength>0){let f=this.state.bufferLength,m=64-f,c=Math.min(s,m);for(let b=0;b<c;b++)this.buffer[f+b]=t[b];if(this.state.bufferLength+=c,this.state.bufferLength===64&&this._processBufferBlock(),c===s){r();return}let d=s-c;for(let b=0;b<d;b++)t[b]=t[c+b];let h=Buffer.alloc(d);for(let b=0;b<d;b++)h[b]=t[b];t=h;}let a=Math.floor(t.length/64);for(let f=0;f<a;f++){let m=f*64,c=[];for(let d=0;d<16;d++){let h=m+d*4;c[d]=t[h]+(t[h+1]<<8)+(t[h+2]<<16)+(t[h+3]<<24);}p(this.state.state,c,this.add32),this.state.bytesProcessed+=64;}let u=t.length%64;if(u>0){this.buffer.length<u&&(this.buffer=new Uint8Array(u),this.state.buffer=this.buffer);for(let f=0;f<u;f++)this.buffer[f]=t[a*64+f];this.state.bufferLength=u;}r();}catch(t){r(t);}}_processBufferBlock(){let i=this.state.buffer,e=[];for(let r=0;r<16;r++){let t=r*4;e[r]=i[t]+(i[t+1]<<8)+(i[t+2]<<16)+(i[t+3]<<24);}p(this.state.state,e,this.add32),this.state.bytesProcessed+=64,this.state.bufferLength=0;}_flush(i){try{let{state:e,bufferLength:r,buffer:t}=this.state,s=new Array(16).fill(0);for(let u=0;u<r;u++)s[u>>2]|=(t[u]&255)<<(u%4<<3);if(s[r>>2]|=128<<(r%4<<3),r>55){p(e,s,this.add32);for(let u=0;u<16;u++)s[u]=0;}s[14]=(this.state.bytesProcessed+r)*8,s[15]=0,p(e,s,this.add32);let a=B(e);this.emit("md5",{digest:a,bytesProcessed:this.state.bytesProcessed+r}),i();}catch(e){i(e);}}getCurrentState(){return {state:[...this.state.state],bytesProcessed:this.state.bytesProcessed+this.state.bufferLength}}getBytesProcessed(){return this.state.bytesProcessed+this.state.bufferLength}reset(){this.state={state:[...this.initialMD5State],bytesProcessed:0,bufferLength:0,buffer:this.buffer},this.buffer=new Uint8Array(this.bufferCapacity),this.state.buffer=this.buffer,this.state.bufferLength=0;}static fromStream(i,e){let r=new o(e),t=T.call(r,i);return {stream:r,result:t}}};async function T(o){return new Promise((n,i)=>{let e=[];o.pipe(this).on("md5",r=>{e.push(r);}).on("error",i).on("finish",()=>{n(e[0]);});})}var P=class{constructor(){this.name="stream";this.version="0.1.0";this.state=null;}initNodeStream(n){this.state={stream:n,type:"node"};}initWhatWGStream(n){this.state={stream:n,type:"whatwg"};}async hash(n){let i=new g;return (await new Promise((r,t)=>{i.on("md5",s=>r(s)).on("error",t).end(n);})).digest}async hashBinary(n){let i=new g,e;return n instanceof Uint8Array?e=Buffer.from(n):n instanceof ArrayBuffer?e=Buffer.from(new Uint8Array(n)):e=Buffer.from(n),(await new Promise((t,s)=>{i.on("md5",a=>t(a)).on("error",s).end(e);})).digest}update(n){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let i=this.state.stream,e;typeof n=="string"||n instanceof Uint8Array?e=Buffer.from(n):n instanceof ArrayBuffer?e=Buffer.from(new Uint8Array(n)):e=Buffer.from(n),i.write(e);}}digest(n){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let i=this.state.stream;return i.end(),new Promise((e,r)=>{i.on("md5",t=>{if(n==="buffer"){let s=t.digest,a=[];for(let u=0;u<s.length;u+=2)a.push(parseInt(s.substring(u,u+2),16));e(Buffer.from(a));}else e(t.digest);}).on("error",r);})}else return this.state.stream.getResult().then(e=>e.digest)}reset(){this.state&&this.state.type==="node"&&this.state.stream.reset();}static isAvailable(){return true}};exports.StreamBackend=P;//# sourceMappingURL=adapter.cjs.map
|
|
2
|
-
//# sourceMappingURL=adapter.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/add32.ts","../../src/round-functions.ts","../../src/md5cycle.ts","../../src/hex_chr.ts","../../src/hex.ts","../../src/stream/md5-stream.ts","../../src/stream/adapter.ts"],"names":["add32","x","y","add32_default","cmn1","q","a","t","fn","add","cmn2","s","b","result","cmn","ff","c","d","gg","hh","ii","md5cycle","k","fff","ggg","hhh","iii","md5cycle_default","hex_chr","hex_chr_default","rhex","n","j","hex","l","i","hex_default","MD5Stream","_MD5Stream","Transform","options","chunk","_encoding","callback","data","dataLength","currentBufferLength","neededBytes","bytesToCopy","remainingData","remainingBuffer","fullBlocks","blockStart","block","idx","remaining","error","buffer","state","bufferLength","tail","digest","source","stream","pipeThroughMD5","resolve","reject","results","StreamBackend","nodeStream","encoding","hexDigest","bytes"],"mappings":"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","file":"adapter.cjs","sourcesContent":["function add32(x: number, y: number): number {\n //let lsw = (x & 0xffff) + (y & 0xffff);\n //let msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n //return (msw << 16) | (lsw & 0xffff);\n return (x + y) & 0xffffffff;\n}\n\nexport default add32;\n","import add32 from './add32';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction cmn1(q: number, a: number, x: number, t: number, fn?: Add32Function) {\n const add = fn || add32;\n a = add(add(a, q), add(x, t));\n return a;\n}\n\nfunction cmn2(a: number, s: number, b: number, fn?: Add32Function) {\n const add = fn || add32;\n var result = add((a << s) | (a >>> (32 - s)), b);\n return result;\n}\n\nfunction cmn(\n q: number,\n a: number,\n b: number,\n x: number,\n s: number,\n t: number,\n fn?: Add32Function\n) {\n a = cmn1(q, a, x, t, fn);\n return cmn2(a, s, b, fn);\n}\n\nexport function ff(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn((b & c) | (~b & d), a, b, x, s, t, fn);\n}\n\nexport function gg(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn((b & d) | (c & ~d), a, b, x, s, t, fn);\n}\n\nexport function hh(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn(b ^ c ^ d, a, b, x, s, t, fn);\n}\n\nexport function ii(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn(c ^ (b | ~d), a, b, x, s, t, fn);\n}\n","import add32 from './add32';\nimport { ff, gg, hh, ii } from './round-functions';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction md5cycle(x: number[], k: number[], fn?: Add32Function): void {\n if (typeof fn === 'undefined') {\n fn = add32;\n }\n let a = x[0];\n let b = x[1];\n let c = x[2];\n let d = x[3];\n\n const fff = ff.bind(null, fn);\n a = fff(a, b, c, d, k[0], 7, -680876936);\n d = fff(d, a, b, c, k[1], 12, -389564586);\n c = fff(c, d, a, b, k[2], 17, 606105819);\n b = fff(b, c, d, a, k[3], 22, -1044525330);\n a = fff(a, b, c, d, k[4], 7, -176418897);\n d = fff(d, a, b, c, k[5], 12, 1200080426);\n c = fff(c, d, a, b, k[6], 17, -1473231341);\n b = fff(b, c, d, a, k[7], 22, -45705983);\n a = fff(a, b, c, d, k[8], 7, 1770035416);\n d = fff(d, a, b, c, k[9], 12, -1958414417);\n c = fff(c, d, a, b, k[10], 17, -42063);\n b = fff(b, c, d, a, k[11], 22, -1990404162);\n a = fff(a, b, c, d, k[12], 7, 1804603682);\n d = fff(d, a, b, c, k[13], 12, -40341101);\n c = fff(c, d, a, b, k[14], 17, -1502002290);\n b = fff(b, c, d, a, k[15], 22, 1236535329);\n\n const ggg = gg.bind(null, fn);\n a = ggg(a, b, c, d, k[1], 5, -165796510);\n d = ggg(d, a, b, c, k[6], 9, -1069501632);\n c = ggg(c, d, a, b, k[11], 14, 643717713);\n b = ggg(b, c, d, a, k[0], 20, -373897302);\n a = ggg(a, b, c, d, k[5], 5, -701558691);\n d = ggg(d, a, b, c, k[10], 9, 38016083);\n c = ggg(c, d, a, b, k[15], 14, -660478335);\n b = ggg(b, c, d, a, k[4], 20, -405537848);\n a = ggg(a, b, c, d, k[9], 5, 568446438);\n d = ggg(d, a, b, c, k[14], 9, -1019803690);\n c = ggg(c, d, a, b, k[3], 14, -187363961);\n b = ggg(b, c, d, a, k[8], 20, 1163531501);\n a = ggg(a, b, c, d, k[13], 5, -1444681467);\n d = ggg(d, a, b, c, k[2], 9, -51403784);\n c = ggg(c, d, a, b, k[7], 14, 1735328473);\n b = ggg(b, c, d, a, k[12], 20, -1926607734);\n\n const hhh = hh.bind(null, fn);\n a = hhh(a, b, c, d, k[5], 4, -378558);\n d = hhh(d, a, b, c, k[8], 11, -2022574463);\n c = hhh(c, d, a, b, k[11], 16, 1839030562);\n b = hhh(b, c, d, a, k[14], 23, -35309556);\n a = hhh(a, b, c, d, k[1], 4, -1530992060);\n d = hhh(d, a, b, c, k[4], 11, 1272893353);\n c = hhh(c, d, a, b, k[7], 16, -155497632);\n b = hhh(b, c, d, a, k[10], 23, -1094730640);\n a = hhh(a, b, c, d, k[13], 4, 681279174);\n d = hhh(d, a, b, c, k[0], 11, -358537222);\n c = hhh(c, d, a, b, k[3], 16, -722521979);\n b = hhh(b, c, d, a, k[6], 23, 76029189);\n a = hhh(a, b, c, d, k[9], 4, -640364487);\n d = hhh(d, a, b, c, k[12], 11, -421815835);\n c = hhh(c, d, a, b, k[15], 16, 530742520);\n b = hhh(b, c, d, a, k[2], 23, -995338651);\n\n const iii = ii.bind(null, fn);\n a = iii(a, b, c, d, k[0], 6, -198630844);\n d = iii(d, a, b, c, k[7], 10, 1126891415);\n c = iii(c, d, a, b, k[14], 15, -1416354905);\n b = iii(b, c, d, a, k[5], 21, -57434055);\n a = iii(a, b, c, d, k[12], 6, 1700485571);\n d = iii(d, a, b, c, k[3], 10, -1894986606);\n c = iii(c, d, a, b, k[10], 15, -1051523);\n b = iii(b, c, d, a, k[1], 21, -2054922799);\n a = iii(a, b, c, d, k[8], 6, 1873313359);\n d = iii(d, a, b, c, k[15], 10, -30611744);\n c = iii(c, d, a, b, k[6], 15, -1560198380);\n b = iii(b, c, d, a, k[13], 21, 1309151649);\n a = iii(a, b, c, d, k[4], 6, -145523070);\n d = iii(d, a, b, c, k[11], 10, -1120210379);\n c = iii(c, d, a, b, k[2], 15, 718787259);\n b = iii(b, c, d, a, k[9], 21, -343485551);\n\n x[0] = fn(a, x[0]);\n x[1] = fn(b, x[1]);\n x[2] = fn(c, x[2]);\n x[3] = fn(d, x[3]);\n}\n\nexport default md5cycle;\n","const hex_chr: string[] = \"0123456789abcdef\".split(\"\");\n\nexport default hex_chr;\n","import hex_chr from './hex_chr';\n\nfunction rhex(n: number): string {\n let s = '';\n for (let j = 0; j < 4; j++)\n s += hex_chr[(n >> (j * 8 + 4)) & 0x0f] + hex_chr[(n >> (j * 8)) & 0x0f];\n return s;\n}\n\nfunction hex(x: number[]): string {\n const l = x.length;\n const result: string[] = new Array(l);\n for (let i = 0; i < l; i++) result[i] = rhex(x[i]);\n return result.join('');\n}\n\nexport default hex;\n","/**\n * MD5Stream - Node.js Transform stream for MD5 hash computation\n * Provides streaming MD5 hashing with minimal overhead\n */\n\nimport { Transform, TransformCallback } from 'stream';\nimport md5cycle from '../md5cycle';\nimport hex from '../hex';\nimport add32 from '../add32';\n\n/**\n * State interface for MD5 computation\n */\ninterface MD5State {\n state: number[];\n bytesProcessed: number;\n bufferLength: number;\n buffer: Uint8Array;\n}\n\n/**\n * Options for MD5Stream constructor\n */\ninterface MD5StreamOptions {\n /**\n * Custom add32 function for compatibility testing\n */\n add32?: (x: number, y: number) => number;\n}\n\n/**\n * MD5Stream - Node.js Transform stream for computing MD5 hashes\n * \n * Usage example:\n * ```ts\n * import fs from 'fs';\n * import { MD5Stream } from 'pure-md5';\n * \n * const stream = new MD5Stream();\n * stream.on('md5', (result) => {\n * console.log('MD5:', result.digest);\n * console.log('Bytes:', result.bytesProcessed);\n * });\n * \n * fs.createReadStream('file.txt').pipe(stream);\n * ```\n */\nexport class MD5Stream extends Transform {\n private state: MD5State;\n private add32: (x: number, y: number) => number;\n private readonly initialMD5State = [1732584193, -271733879, -1732584194, 271733878];\n private readonly bufferCapacity: number = 64;\n private buffer: Uint8Array = new Uint8Array(this.bufferCapacity);\n\n /**\n * Create new MD5Stream instance\n * @param options - Stream options\n */\n constructor(options?: MD5StreamOptions) {\n super({\n readableObjectMode: false,\n writableObjectMode: false\n });\n\n this.add32 = options?.add32 || add32;\n this.state = {\n state: [...this.initialMD5State],\n bytesProcessed: 0,\n bufferLength: 0,\n buffer: this.buffer\n };\n }\n\n /**\n * Process data chunk and update MD5 state\n * @param chunk - Data chunk to process\n * @param callback - Callback to signal chunk processing complete\n */\n _transform(chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback): void {\n try {\n let data = chunk as Buffer;\n const dataLength = data.length;\n \n if (dataLength === 0) {\n callback();\n return;\n }\n\n // Combine with remaining buffer if needed\n if (this.state.bufferLength > 0) {\n const currentBufferLength = this.state.bufferLength;\n const neededBytes = 64 - currentBufferLength;\n const bytesToCopy = Math.min(dataLength, neededBytes);\n \n // Copy data to buffer\n for (let i = 0; i < bytesToCopy; i++) {\n this.buffer[currentBufferLength + i] = data[i];\n }\n \n this.state.bufferLength += bytesToCopy;\n \n // If buffer is full, process it\n if (this.state.bufferLength === 64) {\n this._processBufferBlock();\n }\n \n // If we used all data, we're done\n if (bytesToCopy === dataLength) {\n callback();\n return;\n }\n \n // Move to next position in original data\n // Shift remaining data to beginning of buffer\n const remainingData = dataLength - bytesToCopy;\n for (let i = 0; i < remainingData; i++) {\n data[i] = data[bytesToCopy + i];\n }\n // Create a new buffer with only the remaining data\n const remainingBuffer = Buffer.alloc(remainingData);\n for (let i = 0; i < remainingData; i++) {\n remainingBuffer[i] = data[i];\n }\n data = remainingBuffer;\n }\n \n // Process full 64-byte blocks directly from data\n const fullBlocks = Math.floor(data.length / 64);\n \n for (let i = 0; i < fullBlocks; i++) {\n const blockStart = i * 64;\n const block: number[] = [];\n \n for (let j = 0; j < 16; j++) {\n const idx = blockStart + j * 4;\n block[j] = \n data[idx] +\n (data[idx + 1] << 8) +\n (data[idx + 2] << 16) +\n (data[idx + 3] << 24);\n }\n \n md5cycle(this.state.state, block, this.add32);\n this.state.bytesProcessed += 64;\n }\n \n // Store remaining bytes in buffer\n const remaining = data.length % 64;\n if (remaining > 0) {\n // Ensure buffer is large enough\n if (this.buffer.length < remaining) {\n this.buffer = new Uint8Array(remaining);\n this.state.buffer = this.buffer;\n }\n \n // Copy remaining bytes to buffer\n for (let i = 0; i < remaining; i++) {\n this.buffer[i] = data[fullBlocks * 64 + i];\n }\n this.state.bufferLength = remaining;\n }\n \n callback();\n } catch (error) {\n callback(error as Error);\n }\n }\n\n /**\n * Process the current buffer as a complete block\n */\n private _processBufferBlock(): void {\n const buffer = this.state.buffer;\n const block: number[] = [];\n \n for (let j = 0; j < 16; j++) {\n const idx = j * 4;\n block[j] = \n buffer[idx] +\n (buffer[idx + 1] << 8) +\n (buffer[idx + 2] << 16) +\n (buffer[idx + 3] << 24);\n }\n \n md5cycle(this.state.state, block, this.add32);\n this.state.bytesProcessed += 64;\n this.state.bufferLength = 0;\n }\n\n /**\n * Finalize MD5 computation and emit result\n * @param callback - Callback to signal flush complete\n */\n _flush(callback: TransformCallback): void {\n try {\n const { state, bufferLength, buffer } = this.state;\n \n // Final padding\n const tail: number[] = new Array(16).fill(0);\n \n // Copy remaining buffer\n for (let i = 0; i < bufferLength; i++) {\n tail[i >> 2] |= (buffer[i] & 0xff) << ((i % 4) << 3);\n }\n \n // Append 0x80\n tail[bufferLength >> 2] |= 0x80 << ((bufferLength % 4) << 3);\n \n // If not enough space for length, process current block\n if (bufferLength > 55) {\n md5cycle(state, tail, this.add32);\n for (let i = 0; i < 16; i++) {\n tail[i] = 0;\n }\n }\n \n // Append length (in bits) - include remaining bytes\n tail[14] = (this.state.bytesProcessed + bufferLength) * 8;\n tail[15] = 0; // High 32 bits of length (not used for typical files)\n \n // Final MD5 cycle\n md5cycle(state, tail, this.add32);\n \n // Generate hex digest\n const digest = hex(state);\n \n // Emit result\n this.emit('md5', {\n digest,\n bytesProcessed: this.state.bytesProcessed + bufferLength\n });\n \n callback();\n } catch (error) {\n callback(error as Error);\n }\n }\n\n /**\n * Get current MD5 state (for debugging/testing)\n * @returns Current internal state\n */\n public getCurrentState(): { state: number[]; bytesProcessed: number } {\n return {\n state: [...this.state.state],\n bytesProcessed: this.state.bytesProcessed + this.state.bufferLength\n };\n }\n\n /**\n * Get bytes processed so far\n * @returns Number of bytes processed\n */\n public getBytesProcessed(): number {\n return this.state.bytesProcessed + this.state.bufferLength;\n }\n\n /**\n * Reset the stream state\n * Note: This resets the internal MD5 state but not the stream's ended state.\n * For full stream reset, use destroy() and create a new instance.\n */\n public reset(): void {\n // Reset internal MD5 state\n this.state = {\n state: [...this.initialMD5State],\n bytesProcessed: 0,\n bufferLength: 0,\n buffer: this.buffer\n };\n this.buffer = new Uint8Array(this.bufferCapacity);\n this.state.buffer = this.buffer;\n this.state.bufferLength = 0;\n }\n\n /**\n * Static method to create MD5Stream from existing readable stream\n * @param source - Source readable stream\n * @param options - MD5Stream options\n * @returns Object containing stream and result promise\n */\n static fromStream(\n source: import('stream').Readable,\n options?: MD5StreamOptions\n ): { stream: MD5Stream; result: Promise<MD5Result> } {\n const stream = new MD5Stream(options);\n const result = pipeThroughMD5.call(stream, source);\n \n return { stream, result };\n }\n}\n\n/**\n * Factory function to create MD5Stream instance\n * @param options - MD5Stream options\n * @returns New MD5Stream instance\n */\nexport function createMD5Stream(options?: MD5StreamOptions): MD5Stream {\n return new MD5Stream(options);\n}\n\n/**\n * Result type for MD5 computation\n */\nexport interface MD5Result {\n /**\n * MD5 hash as hex string\n */\n digest: string;\n /**\n * Number of bytes processed\n */\n bytesProcessed: number;\n}\n\n/**\n * Pipe through MD5 stream helper\n * @param this - MD5Stream instance\n * @param source - Source readable stream to process\n * @returns Promise with MD5 result\n */\nexport async function pipeThroughMD5(\n this: MD5Stream,\n source: import('stream').Readable\n): Promise<MD5Result> {\n return new Promise((resolve, reject) => {\n const results: MD5Result[] = [];\n \n source\n .pipe(this)\n .on('md5', (result: MD5Result) => {\n results.push(result);\n })\n .on('error', reject)\n .on('finish', () => {\n resolve(results[0]);\n });\n });\n}\n\n/**\n * Static method to create MD5Stream from existing readable stream\n * @param source - Source readable stream\n * @param options - MD5Stream options\n * @returns Object containing stream and result promise\n */\nexport function fromStream(\n source: import('stream').Readable,\n options?: MD5StreamOptions\n): { stream: MD5Stream; result: Promise<MD5Result> } {\n const stream = new MD5Stream(options);\n const result = pipeThroughMD5.call(stream, source);\n \n return { stream, result };\n}\n","/**\n * Stream Backend Adapter\n * Integrates MD5 stream computation with backend detection system\n */\n\nimport { MD5Backend } from '../adapters/types.js';\nimport { MD5Stream, MD5Result } from './md5-stream.js';\nimport { MD5ReadableStream as WHATWGMD5Stream } from './whatwg-stream.js';\n\n/**\n * Stream backend state\n */\ninterface StreamBackendState {\n stream: MD5Stream | WHATWGMD5Stream;\n type: 'node' | 'whatwg';\n}\n\n/**\n * Stream backend for MD5 operations that supports streaming\n * Can be used with both Node.js streams and WHATWG streams\n */\nexport class StreamBackend implements MD5Backend {\n name: string = 'stream';\n version: string = '0.1.0';\n \n private state: StreamBackendState | null = null;\n \n /**\n * Initialize with Node.js stream\n * @param stream Node.js Transform stream\n */\n initNodeStream(stream: MD5Stream): void {\n this.state = {\n stream,\n type: 'node'\n };\n }\n \n /**\n * Initialize with WHATWG stream\n * @param stream WHATWG ReadableStream\n */\n initWhatWGStream(stream: WHATWGMD5Stream): void {\n this.state = {\n stream,\n type: 'whatwg'\n };\n }\n \n /**\n * Hash string data (converts to stream internally)\n * @param data String to hash\n * @returns MD5 hash as hex string\n */\n async hash(data: string): Promise<string> {\n const stream = new MD5Stream();\n const result = await new Promise<MD5Result>((resolve, reject) => {\n stream\n .on('md5', (result) => resolve(result))\n .on('error', reject)\n .end(data);\n });\n return result.digest;\n }\n \n /**\n * Hash binary data (converts to stream internally)\n * @param data Binary data to hash\n * @returns MD5 hash as hex string\n */\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const stream = new MD5Stream();\n // Convert ArrayBuffer to Buffer first\n let buffer: Buffer;\n if (data instanceof Uint8Array) {\n buffer = Buffer.from(data);\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(new Uint8Array(data));\n } else {\n buffer = Buffer.from(data);\n }\n const result = await new Promise<MD5Result>((resolve, reject) => {\n stream\n .on('md5', (result) => resolve(result))\n .on('error', reject)\n .end(buffer);\n });\n return result.digest;\n }\n \n /**\n * Update hash with additional data (streaming)\n * @param data Data to add to hash\n */\n update(data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n if (!this.state) {\n throw new Error('Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.');\n }\n \n if (this.state.type === 'node') {\n const nodeStream = this.state.stream as MD5Stream;\n // Convert to Buffer properly based on type\n let buffer: Buffer;\n if (typeof data === 'string') {\n buffer = Buffer.from(data);\n } else if (data instanceof Uint8Array) {\n buffer = Buffer.from(data);\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(new Uint8Array(data));\n } else {\n buffer = Buffer.from(data);\n }\n nodeStream.write(buffer);\n }\n // WHATWG streams don't support update in the same way\n }\n \n /**\n * Get final hash digest\n * @param encoding Output encoding ('hex' or 'buffer')\n * @returns Hash digest\n */\n digest(encoding?: 'hex' | 'buffer'): string | Uint8Array | Promise<string | Uint8Array> {\n if (!this.state) {\n throw new Error('Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.');\n }\n \n if (this.state.type === 'node') {\n const nodeStream = this.state.stream as MD5Stream;\n nodeStream.end();\n \n return new Promise<string>((resolve, reject) => {\n nodeStream\n .on('md5', (result) => {\n if (encoding === 'buffer') {\n const hexDigest = result.digest;\n const bytes: number[] = [];\n for (let i = 0; i < hexDigest.length; i += 2) {\n bytes.push(parseInt(hexDigest.substring(i, i + 2), 16));\n }\n // Type assertion to avoid TypeScript error\n resolve(Buffer.from(bytes) as any);\n } else {\n resolve(result.digest);\n }\n })\n .on('error', reject);\n });\n } else {\n const whatwgStream = this.state.stream as WHATWGMD5Stream;\n return whatwgStream.getResult().then(result => result.digest);\n }\n }\n \n /**\n * Reset the hash state\n */\n reset(): void | Promise<void> {\n if (!this.state) {\n return;\n }\n \n if (this.state.type === 'node') {\n (this.state.stream as MD5Stream).reset();\n }\n // WHATWG streams don't support reset\n }\n \n /**\n * Check if backend is available\n * @returns Always true for stream backend\n */\n static isAvailable(): boolean {\n return true; // Stream backend is always available\n }\n}\n"]}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { M as MD5Backend } from '../types-edGoGJ5V.cjs';
|
|
2
|
-
import { MD5Stream } from './md5-stream.cjs';
|
|
3
|
-
import { MD5ReadableStream } from './whatwg-stream.cjs';
|
|
4
|
-
import 'stream';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Stream Backend Adapter
|
|
8
|
-
* Integrates MD5 stream computation with backend detection system
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Stream backend for MD5 operations that supports streaming
|
|
13
|
-
* Can be used with both Node.js streams and WHATWG streams
|
|
14
|
-
*/
|
|
15
|
-
declare class StreamBackend implements MD5Backend {
|
|
16
|
-
name: string;
|
|
17
|
-
version: string;
|
|
18
|
-
private state;
|
|
19
|
-
/**
|
|
20
|
-
* Initialize with Node.js stream
|
|
21
|
-
* @param stream Node.js Transform stream
|
|
22
|
-
*/
|
|
23
|
-
initNodeStream(stream: MD5Stream): void;
|
|
24
|
-
/**
|
|
25
|
-
* Initialize with WHATWG stream
|
|
26
|
-
* @param stream WHATWG ReadableStream
|
|
27
|
-
*/
|
|
28
|
-
initWhatWGStream(stream: MD5ReadableStream): void;
|
|
29
|
-
/**
|
|
30
|
-
* Hash string data (converts to stream internally)
|
|
31
|
-
* @param data String to hash
|
|
32
|
-
* @returns MD5 hash as hex string
|
|
33
|
-
*/
|
|
34
|
-
hash(data: string): Promise<string>;
|
|
35
|
-
/**
|
|
36
|
-
* Hash binary data (converts to stream internally)
|
|
37
|
-
* @param data Binary data to hash
|
|
38
|
-
* @returns MD5 hash as hex string
|
|
39
|
-
*/
|
|
40
|
-
hashBinary(data: ArrayBuffer | Uint8Array): Promise<string>;
|
|
41
|
-
/**
|
|
42
|
-
* Update hash with additional data (streaming)
|
|
43
|
-
* @param data Data to add to hash
|
|
44
|
-
*/
|
|
45
|
-
update(data: string | ArrayBuffer | Uint8Array): void | Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Get final hash digest
|
|
48
|
-
* @param encoding Output encoding ('hex' or 'buffer')
|
|
49
|
-
* @returns Hash digest
|
|
50
|
-
*/
|
|
51
|
-
digest(encoding?: 'hex' | 'buffer'): string | Uint8Array | Promise<string | Uint8Array>;
|
|
52
|
-
/**
|
|
53
|
-
* Reset the hash state
|
|
54
|
-
*/
|
|
55
|
-
reset(): void | Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Check if backend is available
|
|
58
|
-
* @returns Always true for stream backend
|
|
59
|
-
*/
|
|
60
|
-
static isAvailable(): boolean;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export { StreamBackend };
|
package/dist/stream/adapter.d.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { M as MD5Backend } from '../types-edGoGJ5V.js';
|
|
2
|
-
import { MD5Stream } from './md5-stream.js';
|
|
3
|
-
import { MD5ReadableStream } from './whatwg-stream.js';
|
|
4
|
-
import 'stream';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Stream Backend Adapter
|
|
8
|
-
* Integrates MD5 stream computation with backend detection system
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Stream backend for MD5 operations that supports streaming
|
|
13
|
-
* Can be used with both Node.js streams and WHATWG streams
|
|
14
|
-
*/
|
|
15
|
-
declare class StreamBackend implements MD5Backend {
|
|
16
|
-
name: string;
|
|
17
|
-
version: string;
|
|
18
|
-
private state;
|
|
19
|
-
/**
|
|
20
|
-
* Initialize with Node.js stream
|
|
21
|
-
* @param stream Node.js Transform stream
|
|
22
|
-
*/
|
|
23
|
-
initNodeStream(stream: MD5Stream): void;
|
|
24
|
-
/**
|
|
25
|
-
* Initialize with WHATWG stream
|
|
26
|
-
* @param stream WHATWG ReadableStream
|
|
27
|
-
*/
|
|
28
|
-
initWhatWGStream(stream: MD5ReadableStream): void;
|
|
29
|
-
/**
|
|
30
|
-
* Hash string data (converts to stream internally)
|
|
31
|
-
* @param data String to hash
|
|
32
|
-
* @returns MD5 hash as hex string
|
|
33
|
-
*/
|
|
34
|
-
hash(data: string): Promise<string>;
|
|
35
|
-
/**
|
|
36
|
-
* Hash binary data (converts to stream internally)
|
|
37
|
-
* @param data Binary data to hash
|
|
38
|
-
* @returns MD5 hash as hex string
|
|
39
|
-
*/
|
|
40
|
-
hashBinary(data: ArrayBuffer | Uint8Array): Promise<string>;
|
|
41
|
-
/**
|
|
42
|
-
* Update hash with additional data (streaming)
|
|
43
|
-
* @param data Data to add to hash
|
|
44
|
-
*/
|
|
45
|
-
update(data: string | ArrayBuffer | Uint8Array): void | Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Get final hash digest
|
|
48
|
-
* @param encoding Output encoding ('hex' or 'buffer')
|
|
49
|
-
* @returns Hash digest
|
|
50
|
-
*/
|
|
51
|
-
digest(encoding?: 'hex' | 'buffer'): string | Uint8Array | Promise<string | Uint8Array>;
|
|
52
|
-
/**
|
|
53
|
-
* Reset the hash state
|
|
54
|
-
*/
|
|
55
|
-
reset(): void | Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Check if backend is available
|
|
58
|
-
* @returns Always true for stream backend
|
|
59
|
-
*/
|
|
60
|
-
static isAvailable(): boolean;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export { StreamBackend };
|
package/dist/stream/adapter.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"adapter.js"}
|