UNPKG

js-untar

Version:
103 lines (86 loc) 2.43 kB
/* globals Blob: false, Promise: false, console: false, Worker: false, ProgressivePromise: false */ var workerScriptUri; // Included at compile time var global = window || this; var URL = global.URL || global.webkitURL; /** Returns a ProgressivePromise. */ function untar(arrayBuffer) { if (!(arrayBuffer instanceof ArrayBuffer)) { throw new TypeError("arrayBuffer is not an instance of ArrayBuffer."); } if (!global.Worker) { throw new Error("Worker implementation is not available in this environment."); } return new ProgressivePromise(function(resolve, reject, progress) { var worker = new Worker(workerScriptUri); var files = []; worker.onerror = function(err) { reject(err); }; worker.onmessage = function(message) { message = message.data; switch (message.type) { case "log": console[message.data.level]("Worker: " + message.data.msg); break; case "extract": var file = decorateExtractedFile(message.data); files.push(file); progress(file); break; case "complete": worker.terminate(); resolve(files); break; case "error": //console.log("error message"); worker.terminate(); reject(new Error(message.data.message)); break; default: worker.terminate(); reject(new Error("Unknown message from worker: " + message.type)); break; } }; //console.info("Sending arraybuffer to worker for extraction."); worker.postMessage({ type: "extract", buffer: arrayBuffer }, [arrayBuffer]); }); } var decoratedFileProps = { blob: { get: function() { return this._blob || (this._blob = new Blob([this.buffer])); } }, getBlobUrl: { value: function() { return this._blobUrl || (this._blobUrl = URL.createObjectURL(this.blob)); } }, readAsString: { value: function() { var buffer = this.buffer; var charCount = buffer.byteLength; var charSize = 1; var byteCount = charCount * charSize; var bufferView = new DataView(buffer); var charCodes = []; for (var i = 0; i < charCount; ++i) { var charCode = bufferView.getUint8(i * charSize, true); charCodes.push(charCode); } return (this._string = String.fromCharCode.apply(null, charCodes)); } }, readAsJSON: { value: function() { return JSON.parse(this.readAsString()); } } }; function decorateExtractedFile(file) { Object.defineProperties(file, decoratedFileProps); return file; }