diff --git a/.flowconfig b/.flowconfig index 91b9157..82f6f3e 100644 --- a/.flowconfig +++ b/.flowconfig @@ -25,3 +25,5 @@ misc/flowdeps.js [options] module.file_ext=.js module.file_ext=.njs +module.ignore_non_literal_requires=true +suppress_comment= \\(.\\|\n\\)*\\$FlowIgnore diff --git a/adler32.flow.js b/adler32.flow.js index 0aff418..fae0e23 100644 --- a/adler32.flow.js +++ b/adler32.flow.js @@ -23,7 +23,7 @@ var ADLER32; } /*jshint ignore:end */ }(function(ADLER32) { -ADLER32.version = '1.0.0'; +ADLER32.version = '1.1.0'; /*:: type ADLER32Type = number; type ABuf = Array | Buffer; diff --git a/adler32.js b/adler32.js index 895d37f..7dfff51 100644 --- a/adler32.js +++ b/adler32.js @@ -21,7 +21,7 @@ var ADLER32; } /*jshint ignore:end */ }(function(ADLER32) { -ADLER32.version = '1.0.0'; +ADLER32.version = '1.1.0'; function adler32_bstr(bstr, seed) { var a = 1, b = 0, L = bstr.length, M = 0; if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; } diff --git a/bin/adler32.njs b/bin/adler32.njs index 534e09e..fa6b075 100755 --- a/bin/adler32.njs +++ b/bin/adler32.njs @@ -68,11 +68,18 @@ for(var i = 0; i < args.length; ++i) { if(!process.stdin.isTTY) filename = filename || "-"; if(filename.length===0) die("adler32: must specify a filename ('-' for stdin)",1); -function process_data(data/*:Buffer*/) { - var out/*:ADLER32Type*/ = X.buf(data, seed); - return console.log(fmt === "" ? out : require("printj").sprintf(fmt, out)); -} +var adler32 = seed; +// $FlowIgnore -- Writable is callable but type sig disagrees +var writable = require('stream').Writable(); +writable._write = function(chunk, e, cb) { adler32 = X.buf(chunk, adler32); cb(); }; +writable._writev = function(chunks, cb) { + chunks.forEach(function(c) { adler32 = X.buf(c.chunk, adler32);}); + cb(); +}; +writable.on('finish', function() { + console.log(fmt === "" ? adler32 : require("printj").sprintf(fmt, adler32)); +}); -if(filename === "-") process.stdin.pipe(require('concat-stream')(process_data)); -else if(fs.existsSync(filename)) process_data(fs.readFileSync(filename)); +if(filename === "-") process.stdin.pipe(writable); +else if(fs.existsSync(filename)) fs.createReadStream(filename).pipe(writable); else die("adler32: " + filename + ": No such file or directory", 2); diff --git a/bits/01_version.js b/bits/01_version.js index b5778c1..3f19edd 100644 --- a/bits/01_version.js +++ b/bits/01_version.js @@ -1 +1 @@ -ADLER32.version = '1.0.0'; +ADLER32.version = '1.1.0'; diff --git a/ctest/adler32.js b/ctest/adler32.js index 895d37f..7dfff51 100644 --- a/ctest/adler32.js +++ b/ctest/adler32.js @@ -21,7 +21,7 @@ var ADLER32; } /*jshint ignore:end */ }(function(ADLER32) { -ADLER32.version = '1.0.0'; +ADLER32.version = '1.1.0'; function adler32_bstr(bstr, seed) { var a = 1, b = 0, L = bstr.length, M = 0; if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; } diff --git a/demo/browser.js b/demo/browser.js index 2f46fb1..f7dcf00 100644 --- a/demo/browser.js +++ b/demo/browser.js @@ -2,7 +2,6 @@ /*global ADLER32, console */ var X = ADLER32; -// $FlowIgnore function console_log() { if(typeof console !== 'undefined') console.log.apply(console, [].slice.call(arguments)); } function lpad(s, len, chr){ diff --git a/demo/work.js b/demo/work.js new file mode 100644 index 0000000..7b87a28 --- /dev/null +++ b/demo/work.js @@ -0,0 +1,28 @@ +/* js-adler32 (C) 2014-present SheetJS -- http://sheetjs.com */ +/*:: declare var ADLER32: ADLER32Module; */ +/*:: declare var self: DedicatedWorkerGlobalScope; */ +importScripts('../adler32.js'); +/*::self.*/postMessage({t:"ready"}); + +var readler = function(f, adler, l) { + /*::self.*/postMessage({t:"iter", f:f, adler:adler, l:l, sz:f.size}); + if(l >= f.size) return /*::self.*/postMessage({t:"done"}); + var sz = 0x100000; if(l + sz > f.size) sz = f.size - l; + var d = f.slice(l, l + sz); + var r = new FileReader(); + r.onload = function(e) { + var b = new Uint8Array(e.target.result); + var newadler = ADLER32.buf(b, adler); + /*::self.*/postMessage({t:"data", adler:newadler, bytes:l+sz}); + readler(f, newadler, l + sz); + }; + r.readAsArrayBuffer(d); +}; + +onmessage = function (oEvent) { + /*::self.*/postMessage({t:"start"}); + var f/*:File*/ = oEvent.data; + var seed = 1; + readler(f, seed, 0); +}; + diff --git a/demo/worker.flow.js b/demo/worker.flow.js new file mode 100644 index 0000000..8426bf4 --- /dev/null +++ b/demo/worker.flow.js @@ -0,0 +1,69 @@ +/*jshint browser:true */ + +function lpad(s/*:string*/, len/*:number*/, chr/*:?string*/)/*:string*/{ + var L/*:number*/ = len - s.length, C/*:string*/ = chr || " "; + if(L <= 0) return s; + return new Array(L+1).join(C) + s; +} + +function is_defined(val/*:any*/, keys/*:Array*/)/*:boolean*/ { + if(typeof val === "undefined") return false; + return keys.length === 0 || is_defined(val[keys[0]], keys.slice(1)); +} + +/*## Process Result */ +/*:: declare class HTMLPreElement extends HTMLElement { innerText?:string; } */ +function process_value(val/*:ADLER32Type*/, progress/*:number*/) { + var output = []; + output[0] = "Progress : %" + lpad(progress.toFixed(2), 6, " "); + output[1] = "Signed : " + val; + output[2] = "Unsigned : " + (val>>>0); + output[3] = "Hex value : " + lpad((val>>>0).toString(16),8,'0'); + + var out/*:HTMLPreElement*/ = (document.getElementById('out')/*:any*/); + var o = output.join("\n"); + if(typeof out.innerText == "undefined") out.textContent = o; + else out.innerText = o; +} + +/*:: +type WMessage = { + t:string; + f:File; + adler:ADLER32Type; + l:number; + sz:number; + bytes:number; +}; +*/ + +/*# Drag and Drop File */ +var handle_drop/*:EventHandler*/ = (function(e/*:DragEvent*/) { + e.stopPropagation(); + e.preventDefault(); + if(!e.dataTransfer) return; + var files/*:FileList*/ = e.dataTransfer.files; + var f/*:File*/ = files[0]; + + var worker = new Worker("demo/work.js"); + worker.postMessage(f); + worker.onmessage = function(M) { var m/*:WMessage*/ = (M.data/*:any*/); switch(m.t) { + case 'ready': break; + case 'start': break; + case 'data': process_value(m.adler, 100 * m.bytes / f.size); break; + case 'done': break; + } }; +}/*:any*/); + +var handle_drag/*:EventHandler*/ = (function (e/*:DragEvent*/) { + e.stopPropagation(); + e.preventDefault(); + if(e.dataTransfer) e.dataTransfer.dropEffect = 'copy'; +}/*:any*/); + +var drop/*:HTMLDivElement*/ = (document.getElementById('drop')/*:any*/); +if(drop.addEventListener) { + drop.addEventListener('dragenter', handle_drag, false); + drop.addEventListener('dragover', handle_drag, false); + drop.addEventListener('drop', handle_drop, false); +} diff --git a/index.html b/index.html index a719405..b5d43d2 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ - + @@ -18,20 +18,27 @@ #rawdata{ width:100%; } +a { text-decoration: none } -JS-ADLER32 Live Demo
-Source Code Repo
-Issues? Something look weird? Click here and report an issue
+
+SheetJS JS-ADLER32 Live Demo
+(text works back to IE6; drag and drop works back to IE10)
+(This demo loads the entire file at once!  For newer browsers, try the large file demo)
 
+Source Code Repo
+Issues?  Something look weird?  Click here and report an issue
+
Drop a text file to compute the ADLER-32 checksum
-

... or click here to select a file

- + ... or click here to select a file + +
-Advanced Demo Options:
+Advanced Demo Options: Use readAsBinaryString: (when available)
-
.
+
+

 
diff --git a/large.html b/large.html new file mode 100644 index 0000000..3553ed6 --- /dev/null +++ b/large.html @@ -0,0 +1,52 @@ + + + + + + +JS-ADLER32 Live Demo + + + +
+SheetJS JS-ADLER32 Live Demo
+(text works back to IE6; drag and drop works back to IE10)
+
+Source Code Repo
+Issues?  Something look weird?  Click here and report an issue
+
+
Drop a text file to compute the ADLER-32 checksum
+ +

+
+ + + + + + + diff --git a/package.json b/package.json index 6c6a6ce..b1b0dcf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "adler-32", - "version": "1.0.0", + "version": "1.1.0", "author": "sheetjs", "description": "Pure-JS ADLER-32", "keywords": [ "adler32", "checksum" ], @@ -9,13 +9,12 @@ }, "main": "./adler32", "dependencies": { - "concat-stream":"", - "printj":"", - "exit-on-epipe":"" + "printj":"~1.1.0", + "exit-on-epipe":"~1.0.1" }, "devDependencies": { - "mocha":"", - "codepage":"" + "mocha":"~2.5.3", + "codepage":"~1.10.0" }, "repository": { "type":"git", "url":"git://github.com/SheetJS/js-adler32.git" }, "scripts": {