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/utils/detect.cjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
'use strict';var stream=require('stream');var C=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,s)=>(typeof require<"u"?require:e)[s]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var N="0123456789abcdef".split(""),U=N;function F(a){let e="";for(let s=0;s<4;s++)e+=U[a>>s*8+4&15]+U[a>>s*8&15];return e}function L(a){let e=a.length,s=new Array(e);for(let r=0;r<e;r++)s[r]=F(a[r]);return s.join("")}var v=L;function I(a,e){return a+e&4294967295}var m=I;function H(a,e,s,r,t){let n=t||m;return e=n(n(e,a),n(s,r)),e}function _(a,e,s,r){var n=(r||m)(a<<e|a>>>32-e,s);return n}function x(a,e,s,r,t,n,i){return e=H(a,e,r,n,i),_(e,t,s,i)}function W(a,e,s,r,t,n,i,c){return x(s&r|~s&t,e,s,n,i,c,a)}function R(a,e,s,r,t,n,i,c){return x(s&t|r&~t,e,s,n,i,c,a)}function T(a,e,s,r,t,n,i,c){return x(s^r^t,e,s,n,i,c,a)}function E(a,e,s,r,t,n,i,c){return x(r^(s|~t),e,s,n,i,c,a)}function G(a,e,s){typeof s>"u"&&(s=m);let r=a[0],t=a[1],n=a[2],i=a[3],c=W.bind(null,s);r=c(r,t,n,i,e[0],7,-680876936),i=c(i,r,t,n,e[1],12,-389564586),n=c(n,i,r,t,e[2],17,606105819),t=c(t,n,i,r,e[3],22,-1044525330),r=c(r,t,n,i,e[4],7,-176418897),i=c(i,r,t,n,e[5],12,1200080426),n=c(n,i,r,t,e[6],17,-1473231341),t=c(t,n,i,r,e[7],22,-45705983),r=c(r,t,n,i,e[8],7,1770035416),i=c(i,r,t,n,e[9],12,-1958414417),n=c(n,i,r,t,e[10],17,-42063),t=c(t,n,i,r,e[11],22,-1990404162),r=c(r,t,n,i,e[12],7,1804603682),i=c(i,r,t,n,e[13],12,-40341101),n=c(n,i,r,t,e[14],17,-1502002290),t=c(t,n,i,r,e[15],22,1236535329);let o=R.bind(null,s);r=o(r,t,n,i,e[1],5,-165796510),i=o(i,r,t,n,e[6],9,-1069501632),n=o(n,i,r,t,e[11],14,643717713),t=o(t,n,i,r,e[0],20,-373897302),r=o(r,t,n,i,e[5],5,-701558691),i=o(i,r,t,n,e[10],9,38016083),n=o(n,i,r,t,e[15],14,-660478335),t=o(t,n,i,r,e[4],20,-405537848),r=o(r,t,n,i,e[9],5,568446438),i=o(i,r,t,n,e[14],9,-1019803690),n=o(n,i,r,t,e[3],14,-187363961),t=o(t,n,i,r,e[8],20,1163531501),r=o(r,t,n,i,e[13],5,-1444681467),i=o(i,r,t,n,e[2],9,-51403784),n=o(n,i,r,t,e[7],14,1735328473),t=o(t,n,i,r,e[12],20,-1926607734);let u=T.bind(null,s);r=u(r,t,n,i,e[5],4,-378558),i=u(i,r,t,n,e[8],11,-2022574463),n=u(n,i,r,t,e[11],16,1839030562),t=u(t,n,i,r,e[14],23,-35309556),r=u(r,t,n,i,e[1],4,-1530992060),i=u(i,r,t,n,e[4],11,1272893353),n=u(n,i,r,t,e[7],16,-155497632),t=u(t,n,i,r,e[10],23,-1094730640),r=u(r,t,n,i,e[13],4,681279174),i=u(i,r,t,n,e[0],11,-358537222),n=u(n,i,r,t,e[3],16,-722521979),t=u(t,n,i,r,e[6],23,76029189),r=u(r,t,n,i,e[9],4,-640364487),i=u(i,r,t,n,e[12],11,-421815835),n=u(n,i,r,t,e[15],16,530742520),t=u(t,n,i,r,e[2],23,-995338651);let f=E.bind(null,s);r=f(r,t,n,i,e[0],6,-198630844),i=f(i,r,t,n,e[7],10,1126891415),n=f(n,i,r,t,e[14],15,-1416354905),t=f(t,n,i,r,e[5],21,-57434055),r=f(r,t,n,i,e[12],6,1700485571),i=f(i,r,t,n,e[3],10,-1894986606),n=f(n,i,r,t,e[10],15,-1051523),t=f(t,n,i,r,e[1],21,-2054922799),r=f(r,t,n,i,e[8],6,1873313359),i=f(i,r,t,n,e[15],10,-30611744),n=f(n,i,r,t,e[6],15,-1560198380),t=f(t,n,i,r,e[13],21,1309151649),r=f(r,t,n,i,e[4],6,-145523070),i=f(i,r,t,n,e[11],10,-1120210379),n=f(n,i,r,t,e[2],15,718787259),t=f(t,n,i,r,e[9],21,-343485551),a[0]=s(r,a[0]),a[1]=s(t,a[1]),a[2]=s(n,a[2]),a[3]=s(i,a[3]);}var l=G;function $(a){let e=[];for(let s=0;s<64;s+=4)e[s>>2]=(a.charCodeAt(s)||0)+((a.charCodeAt(s+1)||0)<<8)+((a.charCodeAt(s+2)||0)<<16)+((a.charCodeAt(s+3)||0)<<24);return e}var O=$;function K(a,e){let s=a.length,r=[1732584193,-271733879,-1732584194,271733878],t;for(t=64;t<=s;t+=64)l(r,O(a.substring(t-64,t)),e);a=a.substring(t-64);var n=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],i=a.length;for(t=0;t<i;t++)n[t>>2]|=(a.charCodeAt(t)&255)<<(t%4<<3);if(n[t>>2]|=128<<(t%4<<3),t>55)for(l(r,n,e),t=16;t--;)n[t]=0;return n[14]=s*8,l(r,n,e),r}var j=K;function y(a){return v(j(a,m))}var g=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(e){return y(e)}async hashBinary(e){let s=e instanceof ArrayBuffer?new TextDecoder().decode(e):new TextDecoder().decode(e);return y(s)}update(e){throw new Error("Web Crypto API does not support streaming updates")}digest(e){throw new Error("Web Crypto API does not support streaming")}reset(){}};var w=class{constructor(){this.name="nodecrypto";this.version="1.0.0";}static isAvailable(){try{return typeof C("crypto").createHash=="function"}catch{return false}}hash(e){return C("crypto").createHash("md5").update(e).digest("hex")}async hashBinary(e){let s=C("crypto"),r=e instanceof Uint8Array?e:new Uint8Array(e);return s.createHash("md5").update(r).digest("hex")}update(e){}digest(e){throw new Error("Node crypto streaming not implemented")}reset(){}};var A=class{constructor(){this.name="ie11";this.version="1.0.0";}static isAvailable(){if(typeof window>"u")return false;let e=window;return typeof e.msCrypto<"u"&&typeof e.msCrypto.subtle<"u"&&typeof e.msCrypto.subtle.digest=="function"}async hash(e){let r=new TextEncoder().encode(e);return await this.hashBinary(r)}async hashBinary(e){let s=window,r=e instanceof Uint8Array?e.buffer:e,t=await s.msCrypto.subtle.digest("MD5",r);return this.bufferToHex(t)}bufferToHex(e){return Array.from(new Uint8Array(e)).map(s=>s.toString(16).padStart(2,"0")).join("")}update(e){throw new Error("msCrypto does not support streaming updates")}digest(e){throw new Error("msCrypto does not support streaming")}reset(){}};var P=class{constructor(){this.name="purejs";this.version="0.1.0";this.state={data:"",finished:false};}hash(e){return y(e)}async hashBinary(e){let s=e instanceof ArrayBuffer?new TextDecoder().decode(e):new TextDecoder().decode(e);return y(s)}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 s=y(this.state.data);return this.state.finished=true,e==="buffer"?this.hexToBuffer(s):s}reset(){this.state={data:"",finished:false};}static isAvailable(){return true}hexToBuffer(e){let s=[];for(let r=0;r<e.length;r+=2)s.push(parseInt(e.substring(r,r+2),16));return new Uint8Array(s)}};var B=class a extends stream.Transform{constructor(s){super({readableObjectMode:false,writableObjectMode:false});this.initialMD5State=[1732584193,-271733879,-1732584194,271733878];this.bufferCapacity=64;this.buffer=new Uint8Array(this.bufferCapacity);this.add32=s?.add32||m,this.state={state:[...this.initialMD5State],bytesProcessed:0,bufferLength:0,buffer:this.buffer};}_transform(s,r,t){try{let n=s,i=n.length;if(i===0){t();return}if(this.state.bufferLength>0){let u=this.state.bufferLength,f=64-u,b=Math.min(i,f);for(let d=0;d<b;d++)this.buffer[u+d]=n[d];if(this.state.bufferLength+=b,this.state.bufferLength===64&&this._processBufferBlock(),b===i){t();return}let p=i-b;for(let d=0;d<p;d++)n[d]=n[b+d];let h=Buffer.alloc(p);for(let d=0;d<p;d++)h[d]=n[d];n=h;}let c=Math.floor(n.length/64);for(let u=0;u<c;u++){let f=u*64,b=[];for(let p=0;p<16;p++){let h=f+p*4;b[p]=n[h]+(n[h+1]<<8)+(n[h+2]<<16)+(n[h+3]<<24);}l(this.state.state,b,this.add32),this.state.bytesProcessed+=64;}let o=n.length%64;if(o>0){this.buffer.length<o&&(this.buffer=new Uint8Array(o),this.state.buffer=this.buffer);for(let u=0;u<o;u++)this.buffer[u]=n[c*64+u];this.state.bufferLength=o;}t();}catch(n){t(n);}}_processBufferBlock(){let s=this.state.buffer,r=[];for(let t=0;t<16;t++){let n=t*4;r[t]=s[n]+(s[n+1]<<8)+(s[n+2]<<16)+(s[n+3]<<24);}l(this.state.state,r,this.add32),this.state.bytesProcessed+=64,this.state.bufferLength=0;}_flush(s){try{let{state:r,bufferLength:t,buffer:n}=this.state,i=new Array(16).fill(0);for(let o=0;o<t;o++)i[o>>2]|=(n[o]&255)<<(o%4<<3);if(i[t>>2]|=128<<(t%4<<3),t>55){l(r,i,this.add32);for(let o=0;o<16;o++)i[o]=0;}i[14]=(this.state.bytesProcessed+t)*8,i[15]=0,l(r,i,this.add32);let c=v(r);this.emit("md5",{digest:c,bytesProcessed:this.state.bytesProcessed+t}),s();}catch(r){s(r);}}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(s,r){let t=new a(r),n=z.call(t,s);return {stream:t,result:n}}};async function z(a){return new Promise((e,s)=>{let r=[];a.pipe(this).on("md5",t=>{r.push(t);}).on("error",s).on("finish",()=>{e(r[0]);});})}var D=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 s=new B;return (await new Promise((t,n)=>{s.on("md5",i=>t(i)).on("error",n).end(e);})).digest}async hashBinary(e){let s=new B,r;return e instanceof Uint8Array?r=Buffer.from(e):e instanceof ArrayBuffer?r=Buffer.from(new Uint8Array(e)):r=Buffer.from(e),(await new Promise((n,i)=>{s.on("md5",c=>n(c)).on("error",i).end(r);})).digest}update(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let s=this.state.stream,r;typeof e=="string"||e instanceof Uint8Array?r=Buffer.from(e):e instanceof ArrayBuffer?r=Buffer.from(new Uint8Array(e)):r=Buffer.from(e),s.write(r);}}digest(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let s=this.state.stream;return s.end(),new Promise((r,t)=>{s.on("md5",n=>{if(e==="buffer"){let i=n.digest,c=[];for(let o=0;o<i.length;o+=2)c.push(parseInt(i.substring(o,o+2),16));r(Buffer.from(c));}else r(n.digest);}).on("error",t);})}else return this.state.stream.getResult().then(r=>r.digest)}reset(){this.state&&this.state.type==="node"&&this.state.stream.reset();}static isAvailable(){return true}};var J=(t=>(t.BROWSER="browser",t.NODE="node",t.WEBWORKER="webworker",t.UNKNOWN="unknown",t))(J||{});function Ne(){return typeof process<"u"&&process.versions&&process.versions.node?"node":typeof importScripts<"u"?"webworker":typeof window<"u"&&window.document?"browser":"unknown"}function Fe(){return typeof process<"u"&&process.versions!==void 0&&"node"in process.versions}function Le(){return typeof window<"u"&&typeof document<"u"}function Ie(){return typeof importScripts<"u"}async function Y(a){switch(a){case "webcrypto":let e=g.isAvailable();return {backend:"webcrypto",available:e,reason:e?void 0:"Web Crypto API not available"};case "nodecrypto":let s=w.isAvailable();return {backend:"nodecrypto",available:s,reason:s?void 0:"Node.js crypto not available"};case "ie11":let r=A.isAvailable();return {backend:"ie11",available:r,reason:r?void 0:"IE11 msCrypto not available"};case "purejs":return {backend:"purejs",available:true,reason:"Always available"};case "stream":let t=typeof process<"u"&&process.versions&&"node"in process.versions,n=typeof window<"u";return {backend:"stream",available:t||n,reason:t||n?void 0:"Streams not available"};default:return {backend:a||"unknown",available:false,reason:"Unknown backend"}}}async function Q(){let a=["webcrypto","nodecrypto","ie11","purejs","stream"],e=[];for(let s of a){let{available:r}=await Y(s);r&&e.push(s);}return e}var V=[{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 X(a){let e=[...V].sort((s,r)=>s.priority-r.priority);for(let{name:s}of e)if(a.includes(s))return s;return "purejs"}var M=class a{constructor(){}static getInstance(){return a.instance||(a.instance=new a),a.instance}async createBackendByName(e){switch(e){case "nodecrypto":return new w;case "webcrypto":return new g;case "ie11":return new A;case "stream":return new D;default:return new P}}async createBackend(e){let s=e||X(await Q());return this.createBackendByName(s)}},He=M.getInstance(),S=class{constructor(e=["nodecrypto","webcrypto","stream","ie11","purejs"]){this.detector=M.getInstance(),this.fallbackOrder=e;}async execute(e){let s=[];for(let r of this.fallbackOrder)try{let t=await this.detector.createBackendByName(r),n=await e(t);return {success:!0,backend:r,data:n}}catch(t){if(s.push({backend:r,error:t}),r===this.fallbackOrder[this.fallbackOrder.length-1])return {success:false,backend:r,data:null,errors:s}}return {success:false,backend:"",data:null,errors:s}}async hash(e){return this.execute(async s=>s.hash(e))}async hashBinary(e){return this.execute(async s=>s.hashBinary(e))}async getBestBackend(){let e=await this.getAvailableBackends();return e.length===0?"purejs":e[0]}async getAvailableBackends(){let e=[];for(let s of this.fallbackOrder)try{await this.detector.createBackendByName(s),e.push(s);}catch{}return e}getMetrics(){return {}}},_e=new S;async function Ge(a,e={}){let s=new S;if(e.forceBackend)return (await s.detector.createBackendByName(e.forceBackend)).hash(a);if(e.fallback===false)return (await s.detector.createBackend()).hash(a);let r=await s.hash(a);if(r.success)return e.reportFallback&&r.backend!=="nodecrypto"&&r.backend!=="webcrypto"&&console.info(`MD5 used fallback backend: ${r.backend}`),r.data;let t=r.errors?r.errors.map(n=>`${n.backend}: ${n.error.message}`).join(", "):"All backends failed";throw new Error(`MD5 hash failed after all attempts: ${t}`)}var k=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((s,r)=>s+r.success+r.fail,0)}
|
|
2
2
|
`+Object.entries(this.metrics).map(([,s])=>`${s.success} success, ${s.fail} fail`).join(`
|
|
3
|
-
`)}reset(){Object.keys(this.metrics).forEach(e=>{this.metrics[e]={success:0,fail:0};});}},$e=new k;exports.BACKEND_PRIORITY=V;exports.BackendDetector=M;exports.FallbackManager=S;exports.MetricsCollector=k;exports.RuntimeEnvironment=J;exports.checkBackendAvailability=Y;exports.detectEnvironment=Ne;exports.detector=He;exports.fallbackManager=_e;exports.getAllAvailableBackends=Q;exports.getBestAvailableBackend=X;exports.isBrowser=Le;exports.isNode=Fe;exports.isWebWorker=Ie;exports.metrics=$e;exports.robustHash=Ge
|
|
4
|
-
//# sourceMappingURL=detect.cjs.map
|
|
3
|
+
`)}reset(){Object.keys(this.metrics).forEach(e=>{this.metrics[e]={success:0,fail:0};});}},$e=new k;exports.BACKEND_PRIORITY=V;exports.BackendDetector=M;exports.FallbackManager=S;exports.MetricsCollector=k;exports.RuntimeEnvironment=J;exports.checkBackendAvailability=Y;exports.detectEnvironment=Ne;exports.detector=He;exports.fallbackManager=_e;exports.getAllAvailableBackends=Q;exports.getBestAvailableBackend=X;exports.isBrowser=Le;exports.isNode=Fe;exports.isWebWorker=Ie;exports.metrics=$e;exports.robustHash=Ge;
|
package/dist/utils/detect.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export{i as BACKEND_PRIORITY,k as BackendDetector,m as FallbackManager,p as MetricsCollector,b as RuntimeEnvironment,g as checkBackendAvailability,c as detectEnvironment,l as detector,n as fallbackManager,h as getAllAvailableBackends,j as getBestAvailableBackend,e as isBrowser,d as isNode,f as isWebWorker,q as metrics,o as robustHash}from'../chunk-6P2QV5SR.js';import'../chunk-VFOAY6XI.js';import'../chunk-PNZTVQA7.js';import'../chunk-G5WHEAIQ.js';import'../chunk-4KSCMS4Q.js';import'../chunk-NWQ4N5RX.js';import'../chunk-JKVD5LHZ.js';import'../chunk-R4JB5MBR.js';import'../chunk-2YXXFGBV.js';//# sourceMappingURL=detect.js.map
|
|
2
|
-
|
|
1
|
+
import {Transform}from'stream';var C=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,s)=>(typeof require<"u"?require:e)[s]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var N="0123456789abcdef".split(""),U=N;function F(a){let e="";for(let s=0;s<4;s++)e+=U[a>>s*8+4&15]+U[a>>s*8&15];return e}function L(a){let e=a.length,s=new Array(e);for(let r=0;r<e;r++)s[r]=F(a[r]);return s.join("")}var v=L;function I(a,e){return a+e&4294967295}var m=I;function H(a,e,s,r,t){let n=t||m;return e=n(n(e,a),n(s,r)),e}function _(a,e,s,r){var n=(r||m)(a<<e|a>>>32-e,s);return n}function x(a,e,s,r,t,n,i){return e=H(a,e,r,n,i),_(e,t,s,i)}function W(a,e,s,r,t,n,i,c){return x(s&r|~s&t,e,s,n,i,c,a)}function R(a,e,s,r,t,n,i,c){return x(s&t|r&~t,e,s,n,i,c,a)}function T(a,e,s,r,t,n,i,c){return x(s^r^t,e,s,n,i,c,a)}function E(a,e,s,r,t,n,i,c){return x(r^(s|~t),e,s,n,i,c,a)}function G(a,e,s){typeof s>"u"&&(s=m);let r=a[0],t=a[1],n=a[2],i=a[3],c=W.bind(null,s);r=c(r,t,n,i,e[0],7,-680876936),i=c(i,r,t,n,e[1],12,-389564586),n=c(n,i,r,t,e[2],17,606105819),t=c(t,n,i,r,e[3],22,-1044525330),r=c(r,t,n,i,e[4],7,-176418897),i=c(i,r,t,n,e[5],12,1200080426),n=c(n,i,r,t,e[6],17,-1473231341),t=c(t,n,i,r,e[7],22,-45705983),r=c(r,t,n,i,e[8],7,1770035416),i=c(i,r,t,n,e[9],12,-1958414417),n=c(n,i,r,t,e[10],17,-42063),t=c(t,n,i,r,e[11],22,-1990404162),r=c(r,t,n,i,e[12],7,1804603682),i=c(i,r,t,n,e[13],12,-40341101),n=c(n,i,r,t,e[14],17,-1502002290),t=c(t,n,i,r,e[15],22,1236535329);let o=R.bind(null,s);r=o(r,t,n,i,e[1],5,-165796510),i=o(i,r,t,n,e[6],9,-1069501632),n=o(n,i,r,t,e[11],14,643717713),t=o(t,n,i,r,e[0],20,-373897302),r=o(r,t,n,i,e[5],5,-701558691),i=o(i,r,t,n,e[10],9,38016083),n=o(n,i,r,t,e[15],14,-660478335),t=o(t,n,i,r,e[4],20,-405537848),r=o(r,t,n,i,e[9],5,568446438),i=o(i,r,t,n,e[14],9,-1019803690),n=o(n,i,r,t,e[3],14,-187363961),t=o(t,n,i,r,e[8],20,1163531501),r=o(r,t,n,i,e[13],5,-1444681467),i=o(i,r,t,n,e[2],9,-51403784),n=o(n,i,r,t,e[7],14,1735328473),t=o(t,n,i,r,e[12],20,-1926607734);let u=T.bind(null,s);r=u(r,t,n,i,e[5],4,-378558),i=u(i,r,t,n,e[8],11,-2022574463),n=u(n,i,r,t,e[11],16,1839030562),t=u(t,n,i,r,e[14],23,-35309556),r=u(r,t,n,i,e[1],4,-1530992060),i=u(i,r,t,n,e[4],11,1272893353),n=u(n,i,r,t,e[7],16,-155497632),t=u(t,n,i,r,e[10],23,-1094730640),r=u(r,t,n,i,e[13],4,681279174),i=u(i,r,t,n,e[0],11,-358537222),n=u(n,i,r,t,e[3],16,-722521979),t=u(t,n,i,r,e[6],23,76029189),r=u(r,t,n,i,e[9],4,-640364487),i=u(i,r,t,n,e[12],11,-421815835),n=u(n,i,r,t,e[15],16,530742520),t=u(t,n,i,r,e[2],23,-995338651);let f=E.bind(null,s);r=f(r,t,n,i,e[0],6,-198630844),i=f(i,r,t,n,e[7],10,1126891415),n=f(n,i,r,t,e[14],15,-1416354905),t=f(t,n,i,r,e[5],21,-57434055),r=f(r,t,n,i,e[12],6,1700485571),i=f(i,r,t,n,e[3],10,-1894986606),n=f(n,i,r,t,e[10],15,-1051523),t=f(t,n,i,r,e[1],21,-2054922799),r=f(r,t,n,i,e[8],6,1873313359),i=f(i,r,t,n,e[15],10,-30611744),n=f(n,i,r,t,e[6],15,-1560198380),t=f(t,n,i,r,e[13],21,1309151649),r=f(r,t,n,i,e[4],6,-145523070),i=f(i,r,t,n,e[11],10,-1120210379),n=f(n,i,r,t,e[2],15,718787259),t=f(t,n,i,r,e[9],21,-343485551),a[0]=s(r,a[0]),a[1]=s(t,a[1]),a[2]=s(n,a[2]),a[3]=s(i,a[3]);}var l=G;function $(a){let e=[];for(let s=0;s<64;s+=4)e[s>>2]=(a.charCodeAt(s)||0)+((a.charCodeAt(s+1)||0)<<8)+((a.charCodeAt(s+2)||0)<<16)+((a.charCodeAt(s+3)||0)<<24);return e}var O=$;function K(a,e){let s=a.length,r=[1732584193,-271733879,-1732584194,271733878],t;for(t=64;t<=s;t+=64)l(r,O(a.substring(t-64,t)),e);a=a.substring(t-64);var n=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],i=a.length;for(t=0;t<i;t++)n[t>>2]|=(a.charCodeAt(t)&255)<<(t%4<<3);if(n[t>>2]|=128<<(t%4<<3),t>55)for(l(r,n,e),t=16;t--;)n[t]=0;return n[14]=s*8,l(r,n,e),r}var j=K;function y(a){return v(j(a,m))}var g=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(e){return y(e)}async hashBinary(e){let s=e instanceof ArrayBuffer?new TextDecoder().decode(e):new TextDecoder().decode(e);return y(s)}update(e){throw new Error("Web Crypto API does not support streaming updates")}digest(e){throw new Error("Web Crypto API does not support streaming")}reset(){}};var w=class{constructor(){this.name="nodecrypto";this.version="1.0.0";}static isAvailable(){try{return typeof C("crypto").createHash=="function"}catch{return false}}hash(e){return C("crypto").createHash("md5").update(e).digest("hex")}async hashBinary(e){let s=C("crypto"),r=e instanceof Uint8Array?e:new Uint8Array(e);return s.createHash("md5").update(r).digest("hex")}update(e){}digest(e){throw new Error("Node crypto streaming not implemented")}reset(){}};var A=class{constructor(){this.name="ie11";this.version="1.0.0";}static isAvailable(){if(typeof window>"u")return false;let e=window;return typeof e.msCrypto<"u"&&typeof e.msCrypto.subtle<"u"&&typeof e.msCrypto.subtle.digest=="function"}async hash(e){let r=new TextEncoder().encode(e);return await this.hashBinary(r)}async hashBinary(e){let s=window,r=e instanceof Uint8Array?e.buffer:e,t=await s.msCrypto.subtle.digest("MD5",r);return this.bufferToHex(t)}bufferToHex(e){return Array.from(new Uint8Array(e)).map(s=>s.toString(16).padStart(2,"0")).join("")}update(e){throw new Error("msCrypto does not support streaming updates")}digest(e){throw new Error("msCrypto does not support streaming")}reset(){}};var P=class{constructor(){this.name="purejs";this.version="0.1.0";this.state={data:"",finished:false};}hash(e){return y(e)}async hashBinary(e){let s=e instanceof ArrayBuffer?new TextDecoder().decode(e):new TextDecoder().decode(e);return y(s)}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 s=y(this.state.data);return this.state.finished=true,e==="buffer"?this.hexToBuffer(s):s}reset(){this.state={data:"",finished:false};}static isAvailable(){return true}hexToBuffer(e){let s=[];for(let r=0;r<e.length;r+=2)s.push(parseInt(e.substring(r,r+2),16));return new Uint8Array(s)}};var B=class a extends Transform{constructor(s){super({readableObjectMode:false,writableObjectMode:false});this.initialMD5State=[1732584193,-271733879,-1732584194,271733878];this.bufferCapacity=64;this.buffer=new Uint8Array(this.bufferCapacity);this.add32=s?.add32||m,this.state={state:[...this.initialMD5State],bytesProcessed:0,bufferLength:0,buffer:this.buffer};}_transform(s,r,t){try{let n=s,i=n.length;if(i===0){t();return}if(this.state.bufferLength>0){let u=this.state.bufferLength,f=64-u,b=Math.min(i,f);for(let d=0;d<b;d++)this.buffer[u+d]=n[d];if(this.state.bufferLength+=b,this.state.bufferLength===64&&this._processBufferBlock(),b===i){t();return}let p=i-b;for(let d=0;d<p;d++)n[d]=n[b+d];let h=Buffer.alloc(p);for(let d=0;d<p;d++)h[d]=n[d];n=h;}let c=Math.floor(n.length/64);for(let u=0;u<c;u++){let f=u*64,b=[];for(let p=0;p<16;p++){let h=f+p*4;b[p]=n[h]+(n[h+1]<<8)+(n[h+2]<<16)+(n[h+3]<<24);}l(this.state.state,b,this.add32),this.state.bytesProcessed+=64;}let o=n.length%64;if(o>0){this.buffer.length<o&&(this.buffer=new Uint8Array(o),this.state.buffer=this.buffer);for(let u=0;u<o;u++)this.buffer[u]=n[c*64+u];this.state.bufferLength=o;}t();}catch(n){t(n);}}_processBufferBlock(){let s=this.state.buffer,r=[];for(let t=0;t<16;t++){let n=t*4;r[t]=s[n]+(s[n+1]<<8)+(s[n+2]<<16)+(s[n+3]<<24);}l(this.state.state,r,this.add32),this.state.bytesProcessed+=64,this.state.bufferLength=0;}_flush(s){try{let{state:r,bufferLength:t,buffer:n}=this.state,i=new Array(16).fill(0);for(let o=0;o<t;o++)i[o>>2]|=(n[o]&255)<<(o%4<<3);if(i[t>>2]|=128<<(t%4<<3),t>55){l(r,i,this.add32);for(let o=0;o<16;o++)i[o]=0;}i[14]=(this.state.bytesProcessed+t)*8,i[15]=0,l(r,i,this.add32);let c=v(r);this.emit("md5",{digest:c,bytesProcessed:this.state.bytesProcessed+t}),s();}catch(r){s(r);}}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(s,r){let t=new a(r),n=z.call(t,s);return {stream:t,result:n}}};async function z(a){return new Promise((e,s)=>{let r=[];a.pipe(this).on("md5",t=>{r.push(t);}).on("error",s).on("finish",()=>{e(r[0]);});})}var D=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 s=new B;return (await new Promise((t,n)=>{s.on("md5",i=>t(i)).on("error",n).end(e);})).digest}async hashBinary(e){let s=new B,r;return e instanceof Uint8Array?r=Buffer.from(e):e instanceof ArrayBuffer?r=Buffer.from(new Uint8Array(e)):r=Buffer.from(e),(await new Promise((n,i)=>{s.on("md5",c=>n(c)).on("error",i).end(r);})).digest}update(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let s=this.state.stream,r;typeof e=="string"||e instanceof Uint8Array?r=Buffer.from(e):e instanceof ArrayBuffer?r=Buffer.from(new Uint8Array(e)):r=Buffer.from(e),s.write(r);}}digest(e){if(!this.state)throw new Error("Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.");if(this.state.type==="node"){let s=this.state.stream;return s.end(),new Promise((r,t)=>{s.on("md5",n=>{if(e==="buffer"){let i=n.digest,c=[];for(let o=0;o<i.length;o+=2)c.push(parseInt(i.substring(o,o+2),16));r(Buffer.from(c));}else r(n.digest);}).on("error",t);})}else return this.state.stream.getResult().then(r=>r.digest)}reset(){this.state&&this.state.type==="node"&&this.state.stream.reset();}static isAvailable(){return true}};var J=(t=>(t.BROWSER="browser",t.NODE="node",t.WEBWORKER="webworker",t.UNKNOWN="unknown",t))(J||{});function Ne(){return typeof process<"u"&&process.versions&&process.versions.node?"node":typeof importScripts<"u"?"webworker":typeof window<"u"&&window.document?"browser":"unknown"}function Fe(){return typeof process<"u"&&process.versions!==void 0&&"node"in process.versions}function Le(){return typeof window<"u"&&typeof document<"u"}function Ie(){return typeof importScripts<"u"}async function Y(a){switch(a){case "webcrypto":let e=g.isAvailable();return {backend:"webcrypto",available:e,reason:e?void 0:"Web Crypto API not available"};case "nodecrypto":let s=w.isAvailable();return {backend:"nodecrypto",available:s,reason:s?void 0:"Node.js crypto not available"};case "ie11":let r=A.isAvailable();return {backend:"ie11",available:r,reason:r?void 0:"IE11 msCrypto not available"};case "purejs":return {backend:"purejs",available:true,reason:"Always available"};case "stream":let t=typeof process<"u"&&process.versions&&"node"in process.versions,n=typeof window<"u";return {backend:"stream",available:t||n,reason:t||n?void 0:"Streams not available"};default:return {backend:a||"unknown",available:false,reason:"Unknown backend"}}}async function Q(){let a=["webcrypto","nodecrypto","ie11","purejs","stream"],e=[];for(let s of a){let{available:r}=await Y(s);r&&e.push(s);}return e}var V=[{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 X(a){let e=[...V].sort((s,r)=>s.priority-r.priority);for(let{name:s}of e)if(a.includes(s))return s;return "purejs"}var M=class a{constructor(){}static getInstance(){return a.instance||(a.instance=new a),a.instance}async createBackendByName(e){switch(e){case "nodecrypto":return new w;case "webcrypto":return new g;case "ie11":return new A;case "stream":return new D;default:return new P}}async createBackend(e){let s=e||X(await Q());return this.createBackendByName(s)}},He=M.getInstance(),S=class{constructor(e=["nodecrypto","webcrypto","stream","ie11","purejs"]){this.detector=M.getInstance(),this.fallbackOrder=e;}async execute(e){let s=[];for(let r of this.fallbackOrder)try{let t=await this.detector.createBackendByName(r),n=await e(t);return {success:!0,backend:r,data:n}}catch(t){if(s.push({backend:r,error:t}),r===this.fallbackOrder[this.fallbackOrder.length-1])return {success:false,backend:r,data:null,errors:s}}return {success:false,backend:"",data:null,errors:s}}async hash(e){return this.execute(async s=>s.hash(e))}async hashBinary(e){return this.execute(async s=>s.hashBinary(e))}async getBestBackend(){let e=await this.getAvailableBackends();return e.length===0?"purejs":e[0]}async getAvailableBackends(){let e=[];for(let s of this.fallbackOrder)try{await this.detector.createBackendByName(s),e.push(s);}catch{}return e}getMetrics(){return {}}},_e=new S;async function Ge(a,e={}){let s=new S;if(e.forceBackend)return (await s.detector.createBackendByName(e.forceBackend)).hash(a);if(e.fallback===false)return (await s.detector.createBackend()).hash(a);let r=await s.hash(a);if(r.success)return e.reportFallback&&r.backend!=="nodecrypto"&&r.backend!=="webcrypto"&&console.info(`MD5 used fallback backend: ${r.backend}`),r.data;let t=r.errors?r.errors.map(n=>`${n.backend}: ${n.error.message}`).join(", "):"All backends failed";throw new Error(`MD5 hash failed after all attempts: ${t}`)}var k=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((s,r)=>s+r.success+r.fail,0)}
|
|
2
|
+
`+Object.entries(this.metrics).map(([,s])=>`${s.success} success, ${s.fail} fail`).join(`
|
|
3
|
+
`)}reset(){Object.keys(this.metrics).forEach(e=>{this.metrics[e]={success:0,fail:0};});}},$e=new k;export{V as BACKEND_PRIORITY,M as BackendDetector,S as FallbackManager,k as MetricsCollector,J as RuntimeEnvironment,Y as checkBackendAvailability,Ne as detectEnvironment,He as detector,_e as fallbackManager,Q as getAllAvailableBackends,X as getBestAvailableBackend,Le as isBrowser,Fe as isNode,Ie as isWebWorker,$e as metrics,Ge as robustHash};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pure-md5",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "A lightweight JavaScript function for hashing messages by the MD5 algorithm",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,21 +39,21 @@
|
|
|
39
39
|
"import": "./dist/index.js",
|
|
40
40
|
"require": "./dist/index.js"
|
|
41
41
|
},
|
|
42
|
-
"./
|
|
43
|
-
"types": "./dist/
|
|
44
|
-
"import": "./dist/
|
|
45
|
-
"require": "./dist/
|
|
46
|
-
},
|
|
47
|
-
"./adapters/webcrypto": {
|
|
48
|
-
"types": "./dist/adapters/webcrypto.d.ts",
|
|
49
|
-
"import": "./dist/adapters/webcrypto.js",
|
|
50
|
-
"require": "./dist/adapters/webcrypto.js"
|
|
42
|
+
"./md5": {
|
|
43
|
+
"types": "./dist/md5.d.ts",
|
|
44
|
+
"import": "./dist/md5.js",
|
|
45
|
+
"require": "./dist/md5.cjs"
|
|
51
46
|
},
|
|
52
47
|
"./adapters/node": {
|
|
53
48
|
"types": "./dist/adapters/node.d.ts",
|
|
54
49
|
"import": "./dist/adapters/node.js",
|
|
55
50
|
"require": "./dist/adapters/node.js"
|
|
56
51
|
},
|
|
52
|
+
"./adapters/webcrypto": {
|
|
53
|
+
"types": "./dist/adapters/webcrypto.d.ts",
|
|
54
|
+
"import": "./dist/adapters/webcrypto.js",
|
|
55
|
+
"require": "./dist/adapters/webcrypto.js"
|
|
56
|
+
},
|
|
57
57
|
"./adapters/ie11": {
|
|
58
58
|
"types": "./dist/adapters/ie11.d.ts",
|
|
59
59
|
"import": "./dist/adapters/ie11.js",
|
|
@@ -79,11 +79,6 @@
|
|
|
79
79
|
"import": "./dist/stream/index.js",
|
|
80
80
|
"require": "./dist/stream/index.js"
|
|
81
81
|
},
|
|
82
|
-
"./stream/light": {
|
|
83
|
-
"types": "./dist/stream/light/index.d.ts",
|
|
84
|
-
"import": "./dist/stream/light/index.js",
|
|
85
|
-
"require": "./dist/stream/light/index.js"
|
|
86
|
-
},
|
|
87
82
|
"./package.json": "./package.json"
|
|
88
83
|
},
|
|
89
84
|
"devDependencies": {
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Тестируем tree-shaking: импортируем только md5
|
|
2
|
+
// Должны увидеть только необходимые части, а не весь бандл
|
|
3
|
+
|
|
4
|
+
const code = `
|
|
5
|
+
import { md5 } from './dist/index.js';
|
|
6
|
+
|
|
7
|
+
console.log(md5('test'));
|
|
8
|
+
`;
|
|
9
|
+
|
|
10
|
+
console.log('Testing tree-shaking with current setup...');
|
|
11
|
+
console.log('If you see all module exports, tree-shaking is not working well.');
|
|
12
|
+
console.log('If you see only md5, tree-shaking is working.');
|
package/.aliases
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Detect which `ls` flavor is in use
|
|
2
|
-
if ls --color > /dev/null 2>&1; then # GNU `ls`
|
|
3
|
-
colorflag="--color"
|
|
4
|
-
else # OS X `ls`
|
|
5
|
-
colorflag="-G"
|
|
6
|
-
fi
|
|
7
|
-
|
|
8
|
-
# List all files colorized in long format
|
|
9
|
-
alias ll='ls -lh'
|
|
10
|
-
|
|
11
|
-
# List all files colorized in long format, including dot files
|
|
12
|
-
alias la="ls -lha"
|
|
13
|
-
|
|
14
|
-
# List only directories
|
|
15
|
-
alias lsd='ls -l | grep "^d"'
|
|
16
|
-
|
|
17
|
-
# Always use color output for `ls`
|
|
18
|
-
alias ls="command ls ${colorflag}"
|
|
19
|
-
export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:'
|
package/.bash_profile
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Add Homebrew `/usr/local/bin` and User `~/bin` to the `$PATH`
|
|
2
|
-
PATH=/usr/local/bin:$PATH
|
|
3
|
-
PATH=$HOME/bin:$PATH
|
|
4
|
-
export PATH
|
|
5
|
-
|
|
6
|
-
# Load the shell dotfiles, and then some:
|
|
7
|
-
# * ~/.path can be used to extend `$PATH`.
|
|
8
|
-
# * ~/.extra can be used for other settings you don’t want to commit.
|
|
9
|
-
for file in ~/.{path,bash_prompt,exports,aliases,functions,extra}; do
|
|
10
|
-
[ -r "$file" ] && source "$file"
|
|
11
|
-
done
|
|
12
|
-
unset file
|
package/.bash_prompt
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
# @gf3’s Sexy Bash Prompt, inspired by “Extravagant Zsh Prompt”
|
|
2
|
-
# Shamelessly copied from https://github.com/gf3/dotfiles
|
|
3
|
-
# Screenshot: http://i.imgur.com/s0Blh.png
|
|
4
|
-
|
|
5
|
-
if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then
|
|
6
|
-
export TERM=gnome-256color
|
|
7
|
-
elif infocmp xterm-256color >/dev/null 2>&1; then
|
|
8
|
-
export TERM=xterm-256color
|
|
9
|
-
fi
|
|
10
|
-
|
|
11
|
-
if tput setaf 1 &> /dev/null; then
|
|
12
|
-
tput sgr0
|
|
13
|
-
if [[ $(tput colors) -ge 256 ]] 2>/dev/null; then
|
|
14
|
-
# Changed these colors to fit Solarized theme
|
|
15
|
-
MAGENTA=$(tput setaf 125)
|
|
16
|
-
ORANGE=$(tput setaf 166)
|
|
17
|
-
GREEN=$(tput setaf 64)
|
|
18
|
-
PURPLE=$(tput setaf 61)
|
|
19
|
-
WHITE=$(tput setaf 244)
|
|
20
|
-
else
|
|
21
|
-
MAGENTA=$(tput setaf 5)
|
|
22
|
-
ORANGE=$(tput setaf 4)
|
|
23
|
-
GREEN=$(tput setaf 2)
|
|
24
|
-
PURPLE=$(tput setaf 1)
|
|
25
|
-
WHITE=$(tput setaf 7)
|
|
26
|
-
fi
|
|
27
|
-
BOLD=$(tput bold)
|
|
28
|
-
RESET=$(tput sgr0)
|
|
29
|
-
else
|
|
30
|
-
MAGENTA="\033[1;31m"
|
|
31
|
-
ORANGE="\033[1;33m"
|
|
32
|
-
GREEN="\033[1;32m"
|
|
33
|
-
PURPLE="\033[1;35m"
|
|
34
|
-
WHITE="\033[1;37m"
|
|
35
|
-
BOLD=""
|
|
36
|
-
RESET="\033[m"
|
|
37
|
-
fi
|
|
38
|
-
|
|
39
|
-
export MAGENTA
|
|
40
|
-
export ORANGE
|
|
41
|
-
export GREEN
|
|
42
|
-
export PURPLE
|
|
43
|
-
export WHITE
|
|
44
|
-
export BOLD
|
|
45
|
-
export RESET
|
|
46
|
-
|
|
47
|
-
function parse_git_dirty() {
|
|
48
|
-
[[ $(git status 2> /dev/null | tail -n1) != *"working directory clean"* ]] && echo "*"
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function parse_git_branch() {
|
|
52
|
-
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1$(parse_git_dirty)/"
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export PS1="\[${BOLD}${MAGENTA}\]\u \[$WHITE\]at \[$ORANGE\]\h \[$WHITE\]in \[$GREEN\]\w\[$WHITE\]\$([[ -n \$(git branch 2> /dev/null) ]] && echo \" on \")\[$PURPLE\]\$(parse_git_branch)\[$WHITE\]\n\$ \[$RESET\]"
|
|
56
|
-
export PS2="\[$ORANGE\]→ \[$RESET\]"
|
package/.changeset/README.md
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Changesets
|
|
2
|
-
|
|
3
|
-
This is a monorepo using [Changesets](https://github.com/changesets/changesets).
|
|
4
|
-
|
|
5
|
-
## Adding a changeset
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm run changeset
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
You will be prompted to:
|
|
12
|
-
|
|
13
|
-
1. Select which packages to include
|
|
14
|
-
2. Select the type of change (major, minor, patch)
|
|
15
|
-
3. Write a summary of the change
|
|
16
|
-
|
|
17
|
-
This will create a new file in the `.changeset` directory. Commit this file to your branch.
|
|
18
|
-
|
|
19
|
-
## Versioning and Publishing
|
|
20
|
-
|
|
21
|
-
When ready to release:
|
|
22
|
-
|
|
23
|
-
1. Merge changes to `main` branch
|
|
24
|
-
2. GitHub Actions will create a release PR
|
|
25
|
-
3. Review and merge the release PR
|
|
26
|
-
4. GitHub Actions will publish to npm and create GitHub releases
|
|
27
|
-
|
|
28
|
-
## Configuration
|
|
29
|
-
|
|
30
|
-
- **Base Branch**: `main`
|
|
31
|
-
- **Access**: Public
|
|
32
|
-
- **Version Updates**: Patch for internal dependencies
|
package/.changeset/config.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
|
|
3
|
-
"changelog": [
|
|
4
|
-
"@changesets/changelog-github",
|
|
5
|
-
{
|
|
6
|
-
"repo": "eustatos/pure-md5"
|
|
7
|
-
}
|
|
8
|
-
],
|
|
9
|
-
"commit": false,
|
|
10
|
-
"fixed": [],
|
|
11
|
-
"linked": [],
|
|
12
|
-
"access": "public",
|
|
13
|
-
"baseBranch": "main",
|
|
14
|
-
"updateInternalDependencies": "patch",
|
|
15
|
-
"ignore": []
|
|
16
|
-
}
|
package/.continue/rules
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Project Style Rules
|
|
2
|
-
|
|
3
|
-
## Language Policy
|
|
4
|
-
|
|
5
|
-
**All documentation, commits, and comments must be written in English.**
|
|
6
|
-
|
|
7
|
-
### Commit Messages
|
|
8
|
-
- Use clear, descriptive commit messages in English
|
|
9
|
-
- Follow conventional commit format when applicable:
|
|
10
|
-
```
|
|
11
|
-
feat: add streaming support for large files
|
|
12
|
-
fix: correct md5 block padding calculation
|
|
13
|
-
docs: update installation instructions
|
|
14
|
-
test: add coverage for edge cases
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
### Code Comments
|
|
18
|
-
- Write all comments in English
|
|
19
|
-
- Use clear, descriptive variable and function names
|
|
20
|
-
- Include JSDoc/type descriptions in English for all public APIs
|
|
21
|
-
|
|
22
|
-
### Documentation
|
|
23
|
-
- Write all documentation in English
|
|
24
|
-
- Include English examples showing expected input/output
|
|
25
|
-
- Keep README files and guides in English
|
|
26
|
-
|
|
27
|
-
### Pull Requests
|
|
28
|
-
- Describe changes in English
|
|
29
|
-
- Reference issues using proper syntax (e.g., `Fixes #123`)
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Bug Report
|
|
3
|
-
about: Create a report to help us improve
|
|
4
|
-
title: "[BUG] "
|
|
5
|
-
labels: bug
|
|
6
|
-
assignees: ""
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
**Describe the bug**
|
|
11
|
-
A clear and concise description of what the bug is.
|
|
12
|
-
|
|
13
|
-
**To Reproduce**
|
|
14
|
-
Steps to reproduce the behavior:
|
|
15
|
-
1. Go to '...'
|
|
16
|
-
2. Click on '....'
|
|
17
|
-
3. Scroll down to '....'
|
|
18
|
-
4. See error
|
|
19
|
-
|
|
20
|
-
**Code Example**
|
|
21
|
-
```javascript
|
|
22
|
-
// Code that reproduces the issue
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
**Expected behavior**
|
|
26
|
-
A clear and concise description of what you expected to happen.
|
|
27
|
-
|
|
28
|
-
**Environment:**
|
|
29
|
-
- OS: [e.g. macOS, Windows, Linux]
|
|
30
|
-
- Node.js version: [e.g. 14, 16, 18]
|
|
31
|
-
- Package version: [e.g. 0.1.0]
|
|
32
|
-
- Browser (if applicable): [e.g. chrome, safari]
|
|
33
|
-
|
|
34
|
-
**Additional context**
|
|
35
|
-
Add any other context about the problem here.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Documentation Update
|
|
3
|
-
about: Improve documentation
|
|
4
|
-
title: "[DOCS] "
|
|
5
|
-
labels: documentation
|
|
6
|
-
assignees: ""
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
**Describe what the documentation should cover:**
|
|
11
|
-
A clear and concise description of what topics should be included.
|
|
12
|
-
|
|
13
|
-
**Current state:**
|
|
14
|
-
What is currently documented?
|
|
15
|
-
|
|
16
|
-
**Proposed changes:**
|
|
17
|
-
Describe the improvements to the documentation.
|
|
18
|
-
|
|
19
|
-
**Additional context:**
|
|
20
|
-
Add any other context about the documentation update.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Feature Request
|
|
3
|
-
about: Suggest an idea for this project
|
|
4
|
-
title: "[FEATURE] "
|
|
5
|
-
labels: enhancement
|
|
6
|
-
assignees: ""
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
**Is your feature request related to a problem? Please describe.**
|
|
11
|
-
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
12
|
-
|
|
13
|
-
**Describe the solution you'd like**
|
|
14
|
-
A clear and concise description of what you want to happen.
|
|
15
|
-
|
|
16
|
-
**Describe alternatives you've considered**
|
|
17
|
-
A clear and concise description of any alternative solutions or features you've considered.
|
|
18
|
-
|
|
19
|
-
**Additional context**
|
|
20
|
-
Add any other context or screenshots about the feature request here.
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
## Description
|
|
2
|
-
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context.
|
|
3
|
-
|
|
4
|
-
Fixes # (issue)
|
|
5
|
-
|
|
6
|
-
## Type of change
|
|
7
|
-
Please delete options that are not relevant.
|
|
8
|
-
|
|
9
|
-
- [ ] Bug fix (non-breaking change which fixes an issue)
|
|
10
|
-
- [ ] New feature (non-breaking change which adds functionality)
|
|
11
|
-
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
|
12
|
-
- [ ] This change requires a documentation update
|
|
13
|
-
|
|
14
|
-
## How Has This Been Tested?
|
|
15
|
-
Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce.
|
|
16
|
-
|
|
17
|
-
```javascript
|
|
18
|
-
// Test code
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
**Test Configuration**:
|
|
22
|
-
* Node.js version:
|
|
23
|
-
* OS:
|
|
24
|
-
|
|
25
|
-
## Checklist:
|
|
26
|
-
- [ ] My code follows the style guidelines of this project
|
|
27
|
-
- [ ] I have performed a self-review of my own code
|
|
28
|
-
- [ ] I have commented my code, particularly in hard-to-understand areas
|
|
29
|
-
- [ ] I have made corresponding changes to the documentation
|
|
30
|
-
- [ ] My changes generate no new warnings
|
|
31
|
-
- [ ] I have added tests that prove my fix is effective or that my feature works
|
|
32
|
-
- [ ] New and existing unit tests pass locally with my changes
|
|
33
|
-
- [ ] Any dependent changes have been merged and published in downstream modules
|
|
34
|
-
|
|
35
|
-
## Screenshots (if appropriate):
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
|
|
2
|
-
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
|
|
3
|
-
|
|
4
|
-
name: Node.js Package
|
|
5
|
-
|
|
6
|
-
on:
|
|
7
|
-
release:
|
|
8
|
-
types: [created]
|
|
9
|
-
|
|
10
|
-
jobs:
|
|
11
|
-
build:
|
|
12
|
-
runs-on: ubuntu-latest
|
|
13
|
-
steps:
|
|
14
|
-
- uses: actions/checkout@v3
|
|
15
|
-
- uses: actions/setup-node@v3
|
|
16
|
-
with:
|
|
17
|
-
node-version: 16
|
|
18
|
-
- run: npm ci
|
|
19
|
-
- run: npm test
|
|
20
|
-
|
|
21
|
-
publish-npm:
|
|
22
|
-
needs: build
|
|
23
|
-
runs-on: ubuntu-latest
|
|
24
|
-
steps:
|
|
25
|
-
- uses: actions/checkout@v3
|
|
26
|
-
- uses: actions/setup-node@v3
|
|
27
|
-
with:
|
|
28
|
-
node-version: 16
|
|
29
|
-
registry-url: https://registry.npmjs.org/
|
|
30
|
-
- run: npm ci
|
|
31
|
-
- run: npm publish
|
|
32
|
-
env:
|
|
33
|
-
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
name: Release
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- main
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
release:
|
|
10
|
-
name: Release
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
steps:
|
|
13
|
-
- name: Checkout Repo
|
|
14
|
-
uses: actions/checkout@v4
|
|
15
|
-
with:
|
|
16
|
-
fetch-depth: 0
|
|
17
|
-
|
|
18
|
-
- name: Setup Node.js
|
|
19
|
-
uses: actions/setup-node@v4
|
|
20
|
-
with:
|
|
21
|
-
node-version: 20
|
|
22
|
-
|
|
23
|
-
- name: Install Dependencies
|
|
24
|
-
run: npm ci
|
|
25
|
-
|
|
26
|
-
- name: Build
|
|
27
|
-
run: npm run build
|
|
28
|
-
|
|
29
|
-
- name: Test
|
|
30
|
-
run: npm test
|
|
31
|
-
|
|
32
|
-
- name: Create Release Pull Request
|
|
33
|
-
id: changeset
|
|
34
|
-
uses: changesets/action@v1
|
|
35
|
-
with:
|
|
36
|
-
version: npm run ci && npm run changeset:version
|
|
37
|
-
publish: npm run ci && npm run changeset:publish
|
|
38
|
-
commit: "chore: update versions"
|
|
39
|
-
title: "chore: version packages"
|
|
40
|
-
env:
|
|
41
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
42
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|