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
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Performance benchmarks for MD5 stream implementations
|
|
3
|
-
* Compares performance across different chunk sizes and data sizes
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { MD5Stream, createMD5Stream, pipeThroughMD5 } from '../src/stream/md5-stream.js';
|
|
7
|
-
import crypto from 'crypto';
|
|
8
|
-
import { createReadStream, readFileSync } from 'fs';
|
|
9
|
-
import { Readable } from 'stream';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Helper to measure execution time
|
|
13
|
-
*/
|
|
14
|
-
function measureTime<T>(fn: () => Promise<T> | T): { result: T; duration: number } {
|
|
15
|
-
const start = process.hrtime.bigint();
|
|
16
|
-
const result = fn();
|
|
17
|
-
const end = process.hrtime.bigint();
|
|
18
|
-
|
|
19
|
-
const duration = Number(end - start) / 1e6; // Convert to milliseconds
|
|
20
|
-
return { result, duration };
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Benchmark MD5Stream with different chunk sizes
|
|
25
|
-
*/
|
|
26
|
-
async function benchmarkMD5StreamChunkSizes(): Promise<void> {
|
|
27
|
-
console.log('\n=== MD5Stream Chunk Size Benchmarks ===\n');
|
|
28
|
-
|
|
29
|
-
const testString = 'a'.repeat(1024 * 1024); // 1MB
|
|
30
|
-
const chunkSizes = [1, 10, 64, 1024, 16 * 1024, 64 * 1024, 256 * 1024, 1024 * 1024];
|
|
31
|
-
|
|
32
|
-
console.log('Chunk Size (bytes) | Avg Time (ms) | Throughput (MB/s)');
|
|
33
|
-
console.log('-'.repeat(60));
|
|
34
|
-
|
|
35
|
-
for (const chunkSize of chunkSizes) {
|
|
36
|
-
const times: number[] = [];
|
|
37
|
-
|
|
38
|
-
for (let i = 0; i < 5; i++) {
|
|
39
|
-
const stream = new MD5Stream();
|
|
40
|
-
const chunks = Math.ceil(testString.length / chunkSize);
|
|
41
|
-
|
|
42
|
-
for (let j = 0; j < chunks; j++) {
|
|
43
|
-
const start = j * chunkSize;
|
|
44
|
-
const end = Math.min(start + chunkSize, testString.length);
|
|
45
|
-
stream.write(testString.substring(start, end));
|
|
46
|
-
}
|
|
47
|
-
stream.end();
|
|
48
|
-
|
|
49
|
-
const result = await new Promise<string>((resolve) => {
|
|
50
|
-
stream.on('md5', (r: { digest: string }) => resolve(r.digest));
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
// Verify result
|
|
54
|
-
const expected = require('crypto').createHash('md5').update(testString).digest('hex');
|
|
55
|
-
if (result !== expected) {
|
|
56
|
-
console.error(`Mismatch! Expected: ${expected}, Got: ${result}`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const avgTime = times.reduce((a, b) => a + b, 0) / times.length;
|
|
61
|
-
const throughput = (testString.length / 1024 / 1024) / (avgTime / 1000);
|
|
62
|
-
|
|
63
|
-
console.log(`${chunkSize.toString().padStart(18)} | ${avgTime.toFixed(2).padStart(13)} | ${throughput.toFixed(2).padStart(17)}`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Benchmark against Node.js native crypto
|
|
69
|
-
*/
|
|
70
|
-
async function benchmarkNativeCrypto(): Promise<void> {
|
|
71
|
-
console.log('\n=== Native Crypto Comparison ===\n');
|
|
72
|
-
|
|
73
|
-
const sizes = [1024, 1024 * 1024, 10 * 1024 * 1024]; // 1KB, 1MB, 10MB
|
|
74
|
-
|
|
75
|
-
console.log('Size (MB) | MD5Stream (ms) | Native Crypto (ms) | Ratio');
|
|
76
|
-
console.log('-'.repeat(60));
|
|
77
|
-
|
|
78
|
-
for (const size of sizes) {
|
|
79
|
-
const data = 'a'.repeat(size);
|
|
80
|
-
|
|
81
|
-
// Benchmark MD5Stream
|
|
82
|
-
const { duration: md5StreamTime } = measureTime(async () => {
|
|
83
|
-
const stream = new MD5Stream();
|
|
84
|
-
stream.write(data);
|
|
85
|
-
stream.end();
|
|
86
|
-
await new Promise((resolve) => stream.on('md5', resolve));
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// Benchmark native crypto
|
|
90
|
-
const { duration: nativeTime } = measureTime(() => {
|
|
91
|
-
crypto.createHash('md5').update(data).digest('hex');
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
const sizeMB = size / 1024 / 1024;
|
|
95
|
-
const ratio = md5StreamTime / nativeTime;
|
|
96
|
-
|
|
97
|
-
console.log(`${sizeMB.toString().padStart(9)} | ${md5StreamTime.toFixed(2).padStart(14)} | ${nativeTime.toFixed(2).padStart(18)} | ${ratio.toFixed(2).padStart(6)}`);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Benchmark memory usage
|
|
103
|
-
*/
|
|
104
|
-
async function benchmarkMemoryUsage(): Promise<void> {
|
|
105
|
-
console.log('\n=== Memory Usage Benchmarks ===\n');
|
|
106
|
-
|
|
107
|
-
// Force garbage collection if available
|
|
108
|
-
if (global.gc) {
|
|
109
|
-
global.gc();
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const sizes = [1024 * 1024, 10 * 1024 * 1024, 100 * 1024 * 1024]; // 1MB, 10MB, 100MB
|
|
113
|
-
|
|
114
|
-
console.log('Size (MB) | Peak Memory (MB) | Streams Created');
|
|
115
|
-
console.log('-'.repeat(60));
|
|
116
|
-
|
|
117
|
-
for (const size of sizes) {
|
|
118
|
-
const initialMemory = process.memoryUsage().heapUsed;
|
|
119
|
-
|
|
120
|
-
// Process with streaming
|
|
121
|
-
const stream = new MD5Stream();
|
|
122
|
-
const chunkSize = 64 * 1024; // 64KB chunks
|
|
123
|
-
const chunks = Math.ceil(size / chunkSize);
|
|
124
|
-
|
|
125
|
-
for (let i = 0; i < chunks; i++) {
|
|
126
|
-
stream.write('a'.repeat(chunkSize));
|
|
127
|
-
}
|
|
128
|
-
stream.end();
|
|
129
|
-
|
|
130
|
-
await new Promise((resolve) => stream.on('md5', resolve));
|
|
131
|
-
|
|
132
|
-
const finalMemory = process.memoryUsage().heapUsed;
|
|
133
|
-
const peakMemory = (finalMemory - initialMemory) / 1024 / 1024;
|
|
134
|
-
|
|
135
|
-
console.log(`${(size / 1024 / 1024).toString().padStart(9)} | ${peakMemory.toFixed(2).padStart(16)} | ${chunks}`);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Benchmark with file I/O
|
|
141
|
-
*/
|
|
142
|
-
async function benchmarkFileIO(filePath: string): Promise<void> {
|
|
143
|
-
console.log('\n=== File I/O Benchmark ===\n');
|
|
144
|
-
|
|
145
|
-
if (!filePath) {
|
|
146
|
-
console.log('No file provided. Skipping file benchmark.');
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Benchmark MD5Stream
|
|
151
|
-
const { duration: md5StreamTime } = measureTime(async () => {
|
|
152
|
-
const stream = createReadStream(filePath);
|
|
153
|
-
const md5Stream = new MD5Stream();
|
|
154
|
-
|
|
155
|
-
await new Promise((resolve, reject) => {
|
|
156
|
-
stream
|
|
157
|
-
.pipe(md5Stream)
|
|
158
|
-
.on('md5', resolve)
|
|
159
|
-
.on('error', reject);
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
// Benchmark native crypto
|
|
164
|
-
const { duration: nativeTime } = measureTime(() => {
|
|
165
|
-
const hash = crypto.createHash('md5');
|
|
166
|
-
const fileContent = readFileSync(filePath);
|
|
167
|
-
hash.update(fileContent);
|
|
168
|
-
return hash.digest('hex');
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
console.log(`File: ${filePath}`);
|
|
172
|
-
console.log(`MD5Stream: ${md5StreamTime.toFixed(2)} ms`);
|
|
173
|
-
console.log(`Native Crypto: ${nativeTime.toFixed(2)} ms`);
|
|
174
|
-
console.log(`Ratio: ${md5StreamTime / nativeTime.toFixed(2)}`);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Run all benchmarks
|
|
179
|
-
*/
|
|
180
|
-
async function runAllBenchmarks(): Promise<void> {
|
|
181
|
-
console.log('Starting MD5 Stream Performance Benchmarks');
|
|
182
|
-
console.log('===========================================\n');
|
|
183
|
-
|
|
184
|
-
try {
|
|
185
|
-
await benchmarkMD5StreamChunkSizes();
|
|
186
|
-
await benchmarkNativeCrypto();
|
|
187
|
-
await benchmarkMemoryUsage();
|
|
188
|
-
|
|
189
|
-
// File benchmark if file provided
|
|
190
|
-
const filePath = process.argv[2];
|
|
191
|
-
if (filePath) {
|
|
192
|
-
await benchmarkFileIO(filePath);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
console.log('\n=== Benchmarks Complete ===\n');
|
|
196
|
-
} catch (error) {
|
|
197
|
-
console.error('Benchmark error:', error);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Run benchmarks if executed directly
|
|
202
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
203
|
-
runAllBenchmarks();
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
export {
|
|
207
|
-
benchmarkMD5StreamChunkSizes,
|
|
208
|
-
benchmarkNativeCrypto,
|
|
209
|
-
benchmarkMemoryUsage,
|
|
210
|
-
benchmarkFileIO,
|
|
211
|
-
runAllBenchmarks
|
|
212
|
-
};
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Performance benchmarks for WHATWG stream implementations
|
|
3
|
-
* Compares performance in browser-like environments
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { MD5ReadableStream, hashBlob } from '../src/stream/whatwg-stream.js';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Helper to measure execution time
|
|
10
|
-
*/
|
|
11
|
-
function measureTime<T>(fn: () => Promise<T> | T): { result: T; duration: number } {
|
|
12
|
-
const start = process.hrtime.bigint();
|
|
13
|
-
const result = fn();
|
|
14
|
-
const end = process.hrtime.bigint();
|
|
15
|
-
|
|
16
|
-
const duration = Number(end - start) / 1e6; // Convert to milliseconds
|
|
17
|
-
return { result, duration };
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Benchmark MD5ReadableStream with different chunk sizes
|
|
22
|
-
*/
|
|
23
|
-
async function benchmarkMD5ReadableStreamChunkSizes(): Promise<void> {
|
|
24
|
-
console.log('\n=== WHATWG Stream Chunk Size Benchmarks ===\n');
|
|
25
|
-
|
|
26
|
-
const testString = 'a'.repeat(1024 * 1024); // 1MB
|
|
27
|
-
const chunkSizes = [1, 10, 64, 1024, 16 * 1024, 64 * 1024, 256 * 1024, 1024 * 1024];
|
|
28
|
-
|
|
29
|
-
console.log('Chunk Size (bytes) | Avg Time (ms) | Throughput (MB/s)');
|
|
30
|
-
console.log('-'.repeat(60));
|
|
31
|
-
|
|
32
|
-
for (const chunkSize of chunkSizes) {
|
|
33
|
-
const times: number[] = [];
|
|
34
|
-
|
|
35
|
-
for (let i = 0; i < 3; i++) {
|
|
36
|
-
const chunks = Math.ceil(testString.length / chunkSize);
|
|
37
|
-
const source = new ReadableStream({
|
|
38
|
-
start(controller) {
|
|
39
|
-
for (let j = 0; j < chunks; j++) {
|
|
40
|
-
const start = j * chunkSize;
|
|
41
|
-
const end = Math.min(start + chunkSize, testString.length);
|
|
42
|
-
controller.enqueue(new TextEncoder().encode(testString.substring(start, end)));
|
|
43
|
-
}
|
|
44
|
-
controller.close();
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
const { duration } = measureTime(async () => {
|
|
49
|
-
await MD5ReadableStream.hash(source);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
times.push(duration);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const avgTime = times.reduce((a, b) => a + b, 0) / times.length;
|
|
56
|
-
const throughput = (testString.length / 1024 / 1024) / (avgTime / 1000);
|
|
57
|
-
|
|
58
|
-
console.log(`${chunkSize.toString().padStart(18)} | ${avgTime.toFixed(2).padStart(13)} | ${throughput.toFixed(2).padStart(17)}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Benchmark large file processing
|
|
64
|
-
*/
|
|
65
|
-
async function benchmarkLargeFileProcessing(): Promise<void> {
|
|
66
|
-
console.log('\n=== Large File Processing Benchmarks ===\n');
|
|
67
|
-
|
|
68
|
-
const sizes = [
|
|
69
|
-
1024 * 1024, // 1MB
|
|
70
|
-
10 * 1024 * 1024, // 10MB
|
|
71
|
-
100 * 1024 * 1024 // 100MB
|
|
72
|
-
];
|
|
73
|
-
|
|
74
|
-
console.log('Size (MB) | Time (ms) | Throughput (MB/s)');
|
|
75
|
-
console.log('-'.repeat(60));
|
|
76
|
-
|
|
77
|
-
for (const size of sizes) {
|
|
78
|
-
const data = new Blob(['a'.repeat(size)]);
|
|
79
|
-
|
|
80
|
-
const { duration } = measureTime(async () => {
|
|
81
|
-
await hashBlob(data);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
const sizeMB = size / 1024 / 1024;
|
|
85
|
-
const throughput = sizeMB / (duration / 1000);
|
|
86
|
-
|
|
87
|
-
console.log(`${sizeMB.toString().padStart(9)} | ${duration.toFixed(2).padStart(9)} | ${throughput.toFixed(2).padStart(17)}`);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Benchmark concurrent hashing
|
|
93
|
-
*/
|
|
94
|
-
async function benchmarkConcurrentHashing(): Promise<void> {
|
|
95
|
-
console.log('\n=== Concurrent Hashing Benchmarks ===\n');
|
|
96
|
-
|
|
97
|
-
const numFiles = [1, 5, 10, 20];
|
|
98
|
-
const fileSize = 1024 * 1024; // 1MB each
|
|
99
|
-
|
|
100
|
-
console.log('Concurrent Files | Total Time (ms) | Avg Time per File (ms)');
|
|
101
|
-
console.log('-'.repeat(60));
|
|
102
|
-
|
|
103
|
-
for (const count of numFiles) {
|
|
104
|
-
const files: Blob[] = [];
|
|
105
|
-
for (let i = 0; i < count; i++) {
|
|
106
|
-
files.push(new Blob(['a'.repeat(fileSize)]));
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const { duration } = measureTime(async () => {
|
|
110
|
-
const promises = files.map(file => hashBlob(file));
|
|
111
|
-
await Promise.all(promises);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
const avgTime = duration / count;
|
|
115
|
-
|
|
116
|
-
console.log(`${count.toString().padStart(16)} | ${duration.toFixed(2).padStart(16)} | ${avgTime.toFixed(2).padStart(22)}`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Benchmark memory efficiency with large streams
|
|
122
|
-
*/
|
|
123
|
-
async function benchmarkMemoryEfficiency(): Promise<void> {
|
|
124
|
-
console.log('\n=== Memory Efficiency Benchmarks ===\n');
|
|
125
|
-
|
|
126
|
-
// Force garbage collection if available
|
|
127
|
-
if (global.gc) {
|
|
128
|
-
global.gc();
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const sizes = [10 * 1024 * 1024, 50 * 1024 * 1024, 100 * 1024 * 1024]; // 10MB, 50MB, 100MB
|
|
132
|
-
|
|
133
|
-
console.log('Size (MB) | Peak Memory (MB) | Streams Created');
|
|
134
|
-
console.log('-'.repeat(60));
|
|
135
|
-
|
|
136
|
-
for (const size of sizes) {
|
|
137
|
-
const initialMemory = process.memoryUsage().heapUsed;
|
|
138
|
-
|
|
139
|
-
// Process with streaming
|
|
140
|
-
const blob = new Blob(['a'.repeat(size)]);
|
|
141
|
-
await hashBlob(blob);
|
|
142
|
-
|
|
143
|
-
const finalMemory = process.memoryUsage().heapUsed;
|
|
144
|
-
const peakMemory = (finalMemory - initialMemory) / 1024 / 1024;
|
|
145
|
-
|
|
146
|
-
console.log(`${(size / 1024 / 1024).toString().padStart(9)} | ${peakMemory.toFixed(2).padStart(16)} | 1`);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Run all WHATWG stream benchmarks
|
|
152
|
-
*/
|
|
153
|
-
async function runAllBenchmarks(): Promise<void> {
|
|
154
|
-
console.log('Starting WHATWG Stream Performance Benchmarks');
|
|
155
|
-
console.log('============================================\n');
|
|
156
|
-
|
|
157
|
-
try {
|
|
158
|
-
await benchmarkMD5ReadableStreamChunkSizes();
|
|
159
|
-
await benchmarkLargeFileProcessing();
|
|
160
|
-
await benchmarkConcurrentHashing();
|
|
161
|
-
await benchmarkMemoryEfficiency();
|
|
162
|
-
|
|
163
|
-
console.log('\n=== WHATWG Stream Benchmarks Complete ===\n');
|
|
164
|
-
} catch (error) {
|
|
165
|
-
console.error('Benchmark error:', error);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Run benchmarks if executed directly
|
|
170
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
171
|
-
runAllBenchmarks();
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export {
|
|
175
|
-
benchmarkMD5ReadableStreamChunkSizes,
|
|
176
|
-
benchmarkLargeFileProcessing,
|
|
177
|
-
benchmarkConcurrentHashing,
|
|
178
|
-
benchmarkMemoryEfficiency,
|
|
179
|
-
runAllBenchmarks
|
|
180
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/ie11.ts"],"names":["IE11Backend","win","data","buffer","hashBuffer","b","_data","_encoding"],"mappings":"aAWO,IAAMA,CAAAA,CAAN,KAAwC,CAAxC,WAAA,EAAA,CACL,IAAA,CAAA,IAAA,CAAe,MAAA,CACf,IAAA,CAAA,OAAA,CAAkB,QAAA,CAElB,OAAO,WAAA,EAAuB,CAC5B,GAAI,OAAO,MAAA,CAAW,GAAA,CACpB,OAAO,MAAA,CAET,IAAMC,CAAAA,CAAM,MAAA,CACZ,OAAO,OAAOA,CAAAA,CAAI,QAAA,CAAa,GAAA,EAC7B,OAAOA,CAAAA,CAAI,QAAA,CAAS,OAAW,GAAA,EAC/B,OAAOA,CAAAA,CAAI,QAAA,CAAS,MAAA,CAAO,MAAA,EAAW,UAC1C,CAEA,MAAM,IAAA,CAAKC,CAAAA,CAA+B,CAExC,IAAMC,CAAAA,CADU,IAAI,WAAA,GACG,MAAA,CAAOD,CAAI,CAAA,CAClC,OAAO,MAAM,IAAA,CAAK,UAAA,CAAWC,CAAM,CACrC,CAEA,MAAM,UAAA,CAAWD,CAAAA,CAAiD,CAChE,IAAMD,CAAAA,CAAM,OACNE,CAAAA,CAASD,CAAAA,YAAgB,UAAA,CAAaA,CAAAA,CAAK,MAAA,CAAwBA,CAAAA,CACnEE,CAAAA,CAAa,MAAMH,CAAAA,CAAI,QAAA,CAAU,MAAA,CAAO,MAAA,CAAO,KAAA,CAAOE,CAAM,CAAA,CAClE,OAAO,IAAA,CAAK,WAAA,CAAYC,CAAU,CACpC,CAEQ,WAAA,CAAYD,CAAAA,CAA6B,CAC/C,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAWA,CAAM,CAAC,CAAA,CACrC,IAAKE,CAAAA,EAAMA,CAAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CACZ,CAEA,MAAA,CAAOC,CAAAA,CAAgE,CACrE,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAC/D,CAEA,MAAA,CAAOC,CAAAA,CAAkF,CACvF,MAAM,IAAI,KAAA,CAAM,qCAAqC,CACvD,CAEA,KAAA,EAA8B,CAE9B,CACF","file":"ie11.cjs","sourcesContent":["/**\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ie11.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/node.ts"],"names":["NodeCryptoBackend","data","nodeCrypto","buffer","_data","_encoding"],"mappings":"aAOO,IAAA,CAAA,CAAA,CAAA,CAAA,EAAA,OAAA,OAAA,CAAA,GAAA,CAAA,OAAA,CAAA,OAAA,KAAA,CAAA,GAAA,CAAA,IAAA,KAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,OAAA,OAAA,CAAA,GAAA,CAAA,OAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,SAAA,CAAA,CAAA,CAAA,GAAA,OAAA,OAAA,CAAA,GAAA,CAAA,OAAA,OAAA,CAAA,KAAA,CAAA,IAAA,CAAA,SAAA,CAAA,CAAA,MAAA,KAAA,CAAA,sBAAA,CAAA,CAAA,CAAA,oBAAA,CAAA,CAAA,CAAA,CAAA,IAAMA,EAAN,KAA8C,CAA9C,cACL,IAAA,CAAA,IAAA,CAAe,YAAA,CACf,aAAkB,QAAA,CAElB,OAAO,WAAA,EAAuB,CAC5B,GAAI,CAEF,OAAO,OADY,CAAA,CAAQ,QAAa,EACf,UAAA,EAAe,UAC1C,CAAA,KAAQ,CACN,OAAO,MACT,CACF,CAEA,IAAA,CAAKC,CAAAA,CAAsB,CAEzB,OADmB,CAAA,CAAQ,QAAa,CAAA,CACtB,UAAA,CAAW,KAAK,CAAA,CAAE,MAAA,CAAOA,CAAI,CAAA,CAAE,MAAA,CAAO,KAAK,CAC/D,CAEA,MAAM,UAAA,CAAWA,EAAiD,CAChE,IAAMC,EAAa,CAAA,CAAQ,QAAa,EAClCC,CAAAA,CAASF,CAAAA,YAAgB,WAAaA,CAAAA,CAAO,IAAI,WAAWA,CAAI,CAAA,CACtE,OAAOC,CAAAA,CAAW,UAAA,CAAW,KAAK,CAAA,CAAE,MAAA,CAAOC,CAAM,CAAA,CAAE,OAAO,KAAK,CACjE,CAEA,MAAA,CAAOC,CAAAA,CAAgE,CAGvE,CAEA,MAAA,CAAOC,EAAkF,CACvF,MAAM,IAAI,KAAA,CAAM,uCAAuC,CACzD,CAEA,KAAA,EAA8B,CAE9B,CACF","file":"node.cjs","sourcesContent":["/**\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"node.js"}
|
|
@@ -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/core/index.ts","../../src/adapters/webcrypto.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","md5Core","string","WebCryptoBackend","data","text","_data","_encoding"],"mappings":"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","file":"webcrypto.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","/**\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"webcrypto.js"}
|
package/dist/chunk-2YXXFGBV.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var d=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});export{d as a};//# sourceMappingURL=chunk-2YXXFGBV.js.map
|
|
2
|
-
//# sourceMappingURL=chunk-2YXXFGBV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-2YXXFGBV.js"}
|
package/dist/chunk-4KSCMS4Q.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import {a}from'./chunk-JKVD5LHZ.js';var m=class{constructor(){this.name="stream";this.version="0.1.0";this.state=null;}initNodeStream(e){this.state={stream:e,type:"node"};}initWhatWGStream(e){this.state={stream:e,type:"whatwg"};}async hash(e){let r=new a;return (await new Promise((n,s)=>{r.on("md5",i=>n(i)).on("error",s).end(e);})).digest}async hashBinary(e){let r=new a,t;return e instanceof Uint8Array?t=Buffer.from(e):e instanceof ArrayBuffer?t=Buffer.from(new Uint8Array(e)):t=Buffer.from(e),(await new Promise((s,i)=>{r.on("md5",a=>s(a)).on("error",i).end(t);})).digest}update(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let r=this.state.stream,t;typeof e=="string"||e instanceof Uint8Array?t=Buffer.from(e):e instanceof ArrayBuffer?t=Buffer.from(new Uint8Array(e)):t=Buffer.from(e),r.write(t);}}digest(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let r=this.state.stream;return r.end(),new Promise((t,n)=>{r.on("md5",s=>{if(e==="buffer"){let i=s.digest,a=[];for(let o=0;o<i.length;o+=2)a.push(parseInt(i.substring(o,o+2),16));t(Buffer.from(a));}else t(s.digest);}).on("error",n);})}else return this.state.stream.getResult().then(t=>t.digest)}reset(){this.state&&this.state.type==="node"&&this.state.stream.reset();}static isAvailable(){return true}};export{m as a};//# sourceMappingURL=chunk-4KSCMS4Q.js.map
|
|
2
|
-
//# sourceMappingURL=chunk-4KSCMS4Q.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stream/adapter.ts"],"names":["StreamBackend","stream","data","MD5Stream","resolve","reject","result","buffer","nodeStream","encoding","hexDigest","bytes","i"],"mappings":"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","file":"chunk-4KSCMS4Q.js","sourcesContent":["/**\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"]}
|
package/dist/chunk-6P2QV5SR.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import {a as a$1}from'./chunk-VFOAY6XI.js';import {a as a$2}from'./chunk-PNZTVQA7.js';import {a as a$3}from'./chunk-G5WHEAIQ.js';import {a as a$4}from'./chunk-4KSCMS4Q.js';import {a}from'./chunk-NWQ4N5RX.js';var c=class{constructor(){this.name="purejs";this.version="0.1.0";this.state={data:"",finished:false};}hash(e){return a(e)}async hashBinary(e){let r=e instanceof ArrayBuffer?new TextDecoder().decode(e):new TextDecoder().decode(e);return a(r)}update(e){this.state.finished&&(this.state={data:"",finished:false}),e instanceof ArrayBuffer?this.state.data+=new TextDecoder().decode(e):e instanceof Uint8Array?this.state.data+=new TextDecoder().decode(e):this.state.data+=e;}digest(e){let r=a(this.state.data);return this.state.finished=true,e==="buffer"?this.hexToBuffer(r):r}reset(){this.state={data:"",finished:false};}static isAvailable(){return true}hexToBuffer(e){let r=[];for(let t=0;t<e.length;t+=2)r.push(parseInt(e.substring(t,t+2),16));return new Uint8Array(r)}};var y=(n=>(n.BROWSER="browser",n.NODE="node",n.WEBWORKER="webworker",n.UNKNOWN="unknown",n))(y||{});function E(){return typeof process<"u"&&process.versions&&process.versions.node?"node":typeof importScripts<"u"?"webworker":typeof window<"u"&&window.document?"browser":"unknown"}function O(){return typeof process<"u"&&process.versions!==void 0&&"node"in process.versions}function R(){return typeof window<"u"&&typeof document<"u"}function j(){return typeof importScripts<"u"}async function m(s){switch(s){case "webcrypto":let e=a$3.isAvailable();return {backend:"webcrypto",available:e,reason:e?void 0:"Web Crypto API not available"};case "nodecrypto":let r=a$2.isAvailable();return {backend:"nodecrypto",available:r,reason:r?void 0:"Node.js crypto not available"};case "ie11":let t=a$1.isAvailable();return {backend:"ie11",available:t,reason:t?void 0:"IE11 msCrypto not available"};case "purejs":return {backend:"purejs",available:true,reason:"Always available"};case "stream":let n=typeof process<"u"&&process.versions&&"node"in process.versions,a=typeof window<"u";return {backend:"stream",available:n||a,reason:n||a?void 0:"Streams not available"};default:return {backend:s||"unknown",available:false,reason:"Unknown backend"}}}async function k(){let s=["webcrypto","nodecrypto","ie11","purejs","stream"],e=[];for(let r of s){let{available:t}=await m(r);t&&e.push(r);}return e}var h=[{name:"nodecrypto",priority:1,description:"Node.js native crypto (fastest)"},{name:"webcrypto",priority:2,description:"Web Crypto API (fast, hardware accelerated)"},{name:"ie11",priority:3,description:"IE11 msCrypto (legacy)"},{name:"stream",priority:4,description:"Streaming backend (for large files and memory efficiency)"},{name:"purejs",priority:5,description:"Pure JavaScript (always available, slower)"}];function g(s){let e=[...h].sort((r,t)=>r.priority-t.priority);for(let{name:r}of e)if(s.includes(r))return r;return "purejs"}var o=class s{constructor(){}static getInstance(){return s.instance||(s.instance=new s),s.instance}async createBackendByName(e){switch(e){case "nodecrypto":return new a$2;case "webcrypto":return new a$3;case "ie11":return new a$1;case "stream":return new a$4;default:return new c}}async createBackend(e){let r=e||g(await k());return this.createBackendByName(r)}},T=o.getInstance(),d=class{constructor(e=["nodecrypto","webcrypto","stream","ie11","purejs"]){this.detector=o.getInstance(),this.fallbackOrder=e;}async execute(e){let r=[];for(let t of this.fallbackOrder)try{let n=await this.detector.createBackendByName(t),a=await e(n);return {success:!0,backend:t,data:a}}catch(n){if(r.push({backend:t,error:n}),t===this.fallbackOrder[this.fallbackOrder.length-1])return {success:false,backend:t,data:null,errors:r}}return {success:false,backend:"",data:null,errors:r}}async hash(e){return this.execute(async r=>r.hash(e))}async hashBinary(e){return this.execute(async r=>r.hashBinary(e))}async getBestBackend(){let e=await this.getAvailableBackends();return e.length===0?"purejs":e[0]}async getAvailableBackends(){let e=[];for(let r of this.fallbackOrder)try{await this.detector.createBackendByName(r),e.push(r);}catch{}return e}getMetrics(){return {}}},D=new d;async function W(s,e={}){let r=new d;if(e.forceBackend)return (await r.detector.createBackendByName(e.forceBackend)).hash(s);if(e.fallback===false)return (await r.detector.createBackend()).hash(s);let t=await r.hash(s);if(t.success)return e.reportFallback&&t.backend!=="nodecrypto"&&t.backend!=="webcrypto"&&console.info(`MD5 used fallback backend: ${t.backend}`),t.data;let n=t.errors?t.errors.map(a=>`${a.backend}: ${a.error.message}`).join(", "):"All backends failed";throw new Error(`MD5 hash failed after all attempts: ${n}`)}var p=class{constructor(){this.metrics={nodecrypto:{success:0,fail:0},webcrypto:{success:0,fail:0},ie11:{success:0,fail:0},stream:{success:0,fail:0},purejs:{success:0,fail:0}};}recordSuccess(e){this.metrics[e]&&this.metrics[e].success++;}recordFail(e){this.metrics[e]&&this.metrics[e].fail++;}getMetrics(){return this.metrics}getSummary(){return `Total operations: ${Object.values(this.metrics).reduce((r,t)=>r+t.success+t.fail,0)}
|
|
2
|
-
`+Object.entries(this.metrics).map(([,r])=>`${r.success} success, ${r.fail} fail`).join(`
|
|
3
|
-
`)}reset(){Object.keys(this.metrics).forEach(e=>{this.metrics[e]={success:0,fail:0};});}},I=new p;export{c as a,y as b,E as c,O as d,R as e,j as f,m as g,k as h,h as i,g as j,o as k,T as l,d as m,D as n,W as o,p,I as q};//# sourceMappingURL=chunk-6P2QV5SR.js.map
|
|
4
|
-
//# sourceMappingURL=chunk-6P2QV5SR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/pure-js.ts","../src/utils/detect.ts"],"names":["PureJSBackend","data","md5Core","text","encoding","result","hex","bytes","i","RuntimeEnvironment","detectEnvironment","isNode","isBrowser","isWebWorker","checkBackendAvailability","backendName","webCryptoAvailable","WebCryptoBackend","nodeCryptoAvailable","NodeCryptoBackend","ie11Available","IE11Backend","getAllAvailableBackends","backends","available","backend","isAvailable","BACKEND_PRIORITY","getBestAvailableBackend","availableBackends","sortedPriority","a","b","name","BackendDetector","_BackendDetector","StreamBackend","detectedBackend","detector","FallbackManager","fallbackOrder","operation","errors","error","fallbackManager","robustHash","options","fm","errorMessage","e","MetricsCollector","sum","m","key","metrics"],"mappings":"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","file":"chunk-6P2QV5SR.js","sourcesContent":["/**\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"]}
|
package/dist/chunk-G5WHEAIQ.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import {a}from'./chunk-NWQ4N5RX.js';var t=class{constructor(){this.name="webcrypto";this.version="1.0.0";}static isAvailable(){return typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.digest=="function"}async hash(r){return a(r)}async hashBinary(r){let o=r instanceof ArrayBuffer?new TextDecoder().decode(r):new TextDecoder().decode(r);return a(o)}update(r){throw new Error("Web Crypto API does not support streaming updates")}digest(r){throw new Error("Web Crypto API does not support streaming")}reset(){}};export{t as a};//# sourceMappingURL=chunk-G5WHEAIQ.js.map
|
|
2
|
-
//# sourceMappingURL=chunk-G5WHEAIQ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/webcrypto.ts"],"names":["WebCryptoBackend","data","md5Core","text","_data","_encoding"],"mappings":"oCAUO,IAAMA,EAAN,KAA6C,CAA7C,WAAA,EAAA,CACL,IAAA,CAAA,IAAA,CAAe,YACf,IAAA,CAAA,OAAA,CAAkB,QAAA,CAElB,OAAO,WAAA,EAAuB,CAE5B,OAAO,OAAO,MAAA,CAAW,GAAA,EACvB,OAAO,MAAA,CAAO,MAAA,CAAW,GAAA,EACzB,OAAO,OAAO,MAAA,CAAO,MAAA,EAAW,UACpC,CAEA,MAAM,IAAA,CAAKC,CAAAA,CAA+B,CAExC,OAAOC,EAAQD,CAAI,CACrB,CAEA,MAAM,UAAA,CAAWA,EAAiD,CAEhE,IAAME,CAAAA,CAAOF,CAAAA,YAAgB,YACzB,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOA,CAAI,CAAA,CAC7B,IAAI,WAAA,EAAY,CAAE,OAAOA,CAAI,CAAA,CACjC,OAAOC,CAAAA,CAAQC,CAAI,CACrB,CAEA,MAAA,CAAOC,CAAAA,CAAgE,CACrE,MAAM,IAAI,KAAA,CAAM,mDAAmD,CACrE,CAEA,MAAA,CAAOC,CAAAA,CAAkF,CACvF,MAAM,IAAI,KAAA,CAAM,2CAA2C,CAC7D,CAEA,KAAA,EAA8B,CAE9B,CACF","file":"chunk-G5WHEAIQ.js","sourcesContent":["/**\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"]}
|
package/dist/chunk-H2K353LR.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import {b as b$2}from'./chunk-NWQ4N5RX.js';import {b as b$1}from'./chunk-JKVD5LHZ.js';import s from'fs';async function u(r,t={}){if(typeof r!="string"||r.trim()==="")throw new Error("Invalid file path: must be a non-empty string");if(!s.existsSync(r))throw new Error(`File not found: ${r}`);let e;try{e=s.statSync(r);}catch(o){throw new Error(`Failed to access file ${r}: ${o.message}`)}if(!e.isFile())throw new Error(`Path is not a file: ${r}`);let n=s.createReadStream(r,{highWaterMark:t.chunkSize||64*1024});try{return await l(n,{onProgress:t.onProgress,totalSize:e.size})}finally{n.destroy();}}async function l(r,t={}){if(!r||typeof r.on!="function")throw new Error("Invalid readable stream: stream must have event listener support");let e=b$1(),n=0;return t.onProgress&&r.on("data",o=>{n+=o.length,t.onProgress?.(n);}),r.on("error",o=>{e.destroy(o);}),r.on("end",()=>{e.end();}),new Promise((o,m)=>{e.on("md5",i=>{o(i);}).on("error",i=>{m(i);}),r.pipe(e);})}async function w(r,t={}){return (await u(r,t)).digest}async function h(r,t={}){return (await l(r,t)).digest}async function y(r,t,e={}){return (await u(r,e)).digest.toLowerCase()===t.toLowerCase()}function b(r){if(typeof r!="string"||r.trim()==="")throw new Error("Invalid file path: must be a non-empty string");if(!s.existsSync(r))throw new Error(`File not found: ${r}`);let t;try{t=s.statSync(r);}catch(n){throw new Error(`Failed to access file ${r}: ${n.message}`)}if(!t.isFile())throw new Error(`Path is not a file: ${r}`);let e;try{e=s.readFileSync(r);}catch(n){throw new Error(`Failed to read file ${r}: ${n.message}`)}return b$2(e)}function F(r,t){let e=0;return n=>{if(r>0){let o=Math.min(100,n/r*100);Math.floor(o)!==Math.floor(e)&&(t(o),e=o);}}}export{u as a,l as b,w as c,h as d,y as e,b as f,F as g};//# sourceMappingURL=chunk-H2K353LR.js.map
|
|
2
|
-
//# sourceMappingURL=chunk-H2K353LR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stream/fs-utils.ts"],"names":["hashFile","filePath","options","fs","stats","error","readStream","hashFileStream","md5Stream","createMD5Stream","bytesProcessed","chunk","resolve","reject","result","hashFileDigest","hashFileStreamDigest","verifyFile","expectedDigest","hashFileSync","content","md5Buffer","createProgressTracker","totalSize","onUpdate","lastPercentage","current","percentage"],"mappings":"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","file":"chunk-H2K353LR.js","sourcesContent":["/**\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"]}
|