Skip to content

Commit 2fca3d1

Browse files
author
Avaer Kazmer
committed
Add untar dependencies source
1 parent 16a3f8e commit 2fca3d1

File tree

3 files changed

+181
-0
lines changed

3 files changed

+181
-0
lines changed

ProgressivePromise.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/* globals window: false, Promise: false */
2+
3+
/**
4+
Returns a Promise decorated with a progress() event.
5+
*/
6+
function ProgressivePromise(fn) {
7+
if (typeof Promise !== "function") {
8+
throw new Error("Promise implementation not available in this environment.");
9+
}
10+
11+
var progressCallbacks = [];
12+
var progressHistory = [];
13+
14+
function doProgress(value) {
15+
for (var i = 0, l = progressCallbacks.length; i < l; ++i) {
16+
progressCallbacks[i](value);
17+
}
18+
19+
progressHistory.push(value);
20+
}
21+
22+
var promise = new Promise(function(resolve, reject) {
23+
fn(resolve, reject, doProgress);
24+
});
25+
26+
promise.progress = function(cb) {
27+
if (typeof cb !== "function") {
28+
throw new Error("cb is not a function.");
29+
}
30+
31+
// Report the previous progress history
32+
for (var i = 0, l = progressHistory.length; i < l; ++i) {
33+
cb(progressHistory[i]);
34+
}
35+
36+
progressCallbacks.push(cb);
37+
return promise;
38+
};
39+
40+
var origThen = promise.then;
41+
42+
promise.then = function(onSuccess, onFail, onProgress) {
43+
origThen.call(promise, onSuccess, onFail);
44+
45+
if (onProgress !== undefined) {
46+
promise.progress(onProgress);
47+
}
48+
49+
return promise;
50+
};
51+
52+
return promise;
53+
}

gunzip.min.js

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

untar.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/* globals Blob: false, Promise: false, console: false, Worker: false, ProgressivePromise: false */
2+
3+
var workerScriptUri = 'untar-worker.js'; // Included at compile time
4+
5+
var global = window || this;
6+
7+
var URL = global.URL || global.webkitURL;
8+
9+
/**
10+
Returns a ProgressivePromise.
11+
*/
12+
function untar(arrayBuffer) {
13+
if (!(arrayBuffer instanceof ArrayBuffer)) {
14+
throw new TypeError("arrayBuffer is not an instance of ArrayBuffer.");
15+
}
16+
17+
if (!global.Worker) {
18+
throw new Error("Worker implementation is not available in this environment.");
19+
}
20+
21+
return new ProgressivePromise(function(resolve, reject, progress) {
22+
var worker = new Worker(workerScriptUri);
23+
24+
var files = [];
25+
26+
worker.onerror = function(err) {
27+
reject(err);
28+
};
29+
30+
worker.onmessage = function(message) {
31+
message = message.data;
32+
33+
switch (message.type) {
34+
case "log":
35+
console[message.data.level]("Worker: " + message.data.msg);
36+
break;
37+
case "extract":
38+
var file = decorateExtractedFile(message.data);
39+
files.push(file);
40+
progress(file);
41+
break;
42+
case "complete":
43+
worker.terminate();
44+
resolve(files);
45+
break;
46+
case "error":
47+
//console.log("error message");
48+
worker.terminate();
49+
reject(new Error(message.data.message));
50+
break;
51+
default:
52+
worker.terminate();
53+
reject(new Error("Unknown message from worker: " + message.type));
54+
break;
55+
}
56+
};
57+
58+
//console.info("Sending arraybuffer to worker for extraction.");
59+
worker.postMessage({ type: "extract", buffer: arrayBuffer }, [arrayBuffer]);
60+
});
61+
}
62+
63+
var decoratedFileProps = {
64+
blob: {
65+
get: function() {
66+
return this._blob || (this._blob = new Blob([this.buffer]));
67+
}
68+
},
69+
getBlobUrl: {
70+
value: function() {
71+
return this._blobUrl || (this._blobUrl = URL.createObjectURL(this.blob));
72+
}
73+
},
74+
readAsString: {
75+
value: function() {
76+
var buffer = this.buffer;
77+
var charCount = buffer.byteLength;
78+
var charSize = 1;
79+
var byteCount = charCount * charSize;
80+
var bufferView = new DataView(buffer);
81+
82+
var charCodes = [];
83+
84+
for (var i = 0; i < charCount; ++i) {
85+
var charCode = bufferView.getUint8(i * charSize, true);
86+
charCodes.push(charCode);
87+
}
88+
89+
return (this._string = String.fromCharCode.apply(null, charCodes));
90+
}
91+
},
92+
readAsJSON: {
93+
value: function() {
94+
return JSON.parse(this.readAsString());
95+
}
96+
}
97+
};
98+
99+
function decorateExtractedFile(file) {
100+
Object.defineProperties(file, decoratedFileProps);
101+
return file;
102+
}

0 commit comments

Comments
 (0)