You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.6 KiB
81 lines
2.6 KiB
// 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; |
|
}
|
|
|