82 lines
2.6 KiB
JavaScript
82 lines
2.6 KiB
JavaScript
// ext-unpacker.js
|
|
|
|
exports.setExtUnpackers = setExtUnpackers;
|
|
|
|
var Bufferish = require("./bufferish");
|
|
var Buffer = Bufferish.global;
|
|
var _decode;
|
|
|
|
var ERROR_COLUMNS = {name: 1, message: 1, stack: 1, columnNumber: 1, fileName: 1, lineNumber: 1};
|
|
|
|
function setExtUnpackers(codec) {
|
|
codec.addExtUnpacker(0x0E, [decode, unpackError(Error)]);
|
|
codec.addExtUnpacker(0x01, [decode, unpackError(EvalError)]);
|
|
codec.addExtUnpacker(0x02, [decode, unpackError(RangeError)]);
|
|
codec.addExtUnpacker(0x03, [decode, unpackError(ReferenceError)]);
|
|
codec.addExtUnpacker(0x04, [decode, unpackError(SyntaxError)]);
|
|
codec.addExtUnpacker(0x05, [decode, unpackError(TypeError)]);
|
|
codec.addExtUnpacker(0x06, [decode, unpackError(URIError)]);
|
|
|
|
codec.addExtUnpacker(0x0A, [decode, unpackRegExp]);
|
|
codec.addExtUnpacker(0x0B, [decode, unpackClass(Boolean)]);
|
|
codec.addExtUnpacker(0x0C, [decode, unpackClass(String)]);
|
|
codec.addExtUnpacker(0x0D, [decode, unpackClass(Date)]);
|
|
codec.addExtUnpacker(0x0F, [decode, unpackClass(Number)]);
|
|
|
|
if ("undefined" !== typeof Uint8Array) {
|
|
codec.addExtUnpacker(0x11, unpackClass(Int8Array));
|
|
codec.addExtUnpacker(0x12, unpackClass(Uint8Array));
|
|
codec.addExtUnpacker(0x13, [unpackArrayBuffer, unpackClass(Int16Array)]);
|
|
codec.addExtUnpacker(0x14, [unpackArrayBuffer, unpackClass(Uint16Array)]);
|
|
codec.addExtUnpacker(0x15, [unpackArrayBuffer, unpackClass(Int32Array)]);
|
|
codec.addExtUnpacker(0x16, [unpackArrayBuffer, unpackClass(Uint32Array)]);
|
|
codec.addExtUnpacker(0x17, [unpackArrayBuffer, unpackClass(Float32Array)]);
|
|
|
|
// PhantomJS/1.9.7 doesn't have Float64Array
|
|
if ("undefined" !== typeof Float64Array) {
|
|
codec.addExtUnpacker(0x18, [unpackArrayBuffer, unpackClass(Float64Array)]);
|
|
}
|
|
|
|
// IE10 doesn't have Uint8ClampedArray
|
|
if ("undefined" !== typeof Uint8ClampedArray) {
|
|
codec.addExtUnpacker(0x19, unpackClass(Uint8ClampedArray));
|
|
}
|
|
|
|
codec.addExtUnpacker(0x1A, unpackArrayBuffer);
|
|
codec.addExtUnpacker(0x1D, [unpackArrayBuffer, unpackClass(DataView)]);
|
|
}
|
|
|
|
if (Bufferish.hasBuffer) {
|
|
codec.addExtUnpacker(0x1B, unpackClass(Buffer));
|
|
}
|
|
}
|
|
|
|
function decode(input) {
|
|
if (!_decode) _decode = require("./decode").decode; // lazy load
|
|
return _decode(input);
|
|
}
|
|
|
|
function unpackRegExp(value) {
|
|
return RegExp.apply(null, value);
|
|
}
|
|
|
|
function unpackError(Class) {
|
|
return function(value) {
|
|
var out = new Class();
|
|
for (var key in ERROR_COLUMNS) {
|
|
out[key] = value[key];
|
|
}
|
|
return out;
|
|
};
|
|
}
|
|
|
|
function unpackClass(Class) {
|
|
return function(value) {
|
|
return new Class(value);
|
|
};
|
|
}
|
|
|
|
function unpackArrayBuffer(value) {
|
|
return (new Uint8Array(value)).buffer;
|
|
}
|