UNPKG

4.87 kBJavaScriptView Raw
1// ext-preset.js
2
3var Ext = require("./ext").Ext;
4
5var preset = exports.preset = new Ext();
6
7var encode = require("./encode").encode;
8var decode = require("./decode").decode;
9
10var ERROR_COLUMNS = {name: 1, message: 1, stack: 1, columnNumber: 1, fileName: 1, lineNumber: 1};
11
12init();
13
14function init() {
15 preset.addExtPacker(0x0E, Error, join(packError, encode));
16 preset.addExtPacker(0x01, EvalError, join(packError, encode));
17 preset.addExtPacker(0x02, RangeError, join(packError, encode));
18 preset.addExtPacker(0x03, ReferenceError, join(packError, encode));
19 preset.addExtPacker(0x04, SyntaxError, join(packError, encode));
20 preset.addExtPacker(0x05, TypeError, join(packError, encode));
21 preset.addExtPacker(0x06, URIError, join(packError, encode));
22
23 preset.addExtUnpacker(0x0E, join(decode, unpackError(Error)));
24 preset.addExtUnpacker(0x01, join(decode, unpackError(EvalError)));
25 preset.addExtUnpacker(0x02, join(decode, unpackError(RangeError)));
26 preset.addExtUnpacker(0x03, join(decode, unpackError(ReferenceError)));
27 preset.addExtUnpacker(0x04, join(decode, unpackError(SyntaxError)));
28 preset.addExtUnpacker(0x05, join(decode, unpackError(TypeError)));
29 preset.addExtUnpacker(0x06, join(decode, unpackError(URIError)));
30
31 preset.addExtPacker(0x0A, RegExp, join(packRegExp, encode));
32 preset.addExtPacker(0x0B, Boolean, join(packValueOf, encode));
33 preset.addExtPacker(0x0C, String, join(packValueOf, encode));
34 preset.addExtPacker(0x0D, Date, join(Number, encode));
35 preset.addExtPacker(0x0F, Number, join(packValueOf, encode));
36
37 preset.addExtUnpacker(0x0A, join(decode, unpackRegExp));
38 preset.addExtUnpacker(0x0B, join(decode, unpackClass(Boolean)));
39 preset.addExtUnpacker(0x0C, join(decode, unpackClass(String)));
40 preset.addExtUnpacker(0x0D, join(decode, unpackClass(Date)));
41 preset.addExtUnpacker(0x0F, join(decode, unpackClass(Number)));
42
43 if ("undefined" !== typeof Uint8Array) {
44 preset.addExtPacker(0x11, Int8Array, packBuffer);
45 preset.addExtPacker(0x12, Uint8Array, packBuffer);
46 preset.addExtPacker(0x13, Int16Array, packTypedArray);
47 preset.addExtPacker(0x14, Uint16Array, packTypedArray);
48 preset.addExtPacker(0x15, Int32Array, packTypedArray);
49 preset.addExtPacker(0x16, Uint32Array, packTypedArray);
50 preset.addExtPacker(0x17, Float32Array, packTypedArray);
51
52 preset.addExtUnpacker(0x11, unpackClass(Int8Array));
53 preset.addExtUnpacker(0x12, unpackClass(Uint8Array));
54 preset.addExtUnpacker(0x13, join(unpackArrayBuffer, unpackClass(Int16Array)));
55 preset.addExtUnpacker(0x14, join(unpackArrayBuffer, unpackClass(Uint16Array)));
56 preset.addExtUnpacker(0x15, join(unpackArrayBuffer, unpackClass(Int32Array)));
57 preset.addExtUnpacker(0x16, join(unpackArrayBuffer, unpackClass(Uint32Array)));
58 preset.addExtUnpacker(0x17, join(unpackArrayBuffer, unpackClass(Float32Array)));
59
60 if ("undefined" !== typeof Float64Array) {
61 // PhantomJS/1.9.7 doesn't have Float64Array
62 preset.addExtPacker(0x18, Float64Array, packTypedArray);
63 preset.addExtUnpacker(0x18, join(unpackArrayBuffer, unpackClass(Float64Array)));
64 }
65
66 if ("undefined" !== typeof Uint8ClampedArray) {
67 // IE10 doesn't have Uint8ClampedArray
68 preset.addExtPacker(0x19, Uint8ClampedArray, packBuffer);
69 preset.addExtUnpacker(0x19, unpackClass(Uint8ClampedArray));
70 }
71
72 preset.addExtPacker(0x1A, ArrayBuffer, packArrayBuffer);
73 preset.addExtPacker(0x1D, DataView, packTypedArray);
74 preset.addExtUnpacker(0x1A, unpackArrayBuffer);
75 preset.addExtUnpacker(0x1D, join(unpackArrayBuffer, unpackClass(DataView)));
76 }
77}
78
79function join(filters) {
80 filters = Array.prototype.slice.call(arguments);
81
82 return function(value) {
83 return filters.reduce(iterator, value);
84 };
85
86 function iterator(value, filter) {
87 return filter(value);
88 }
89}
90
91function packBuffer(value) {
92 return new Buffer(value);
93}
94
95function packValueOf(value) {
96 return (value).valueOf();
97}
98
99function packRegExp(value) {
100 value = RegExp.prototype.toString.call(value).split("/");
101 value.shift();
102 var out = [value.pop()];
103 out.unshift(value.join("/"));
104 return out;
105}
106
107function unpackRegExp(value) {
108 return RegExp.apply(null, value);
109}
110
111function packError(value) {
112 var out = {};
113 for (var key in ERROR_COLUMNS) {
114 out[key] = value[key];
115 }
116 return out;
117}
118
119function unpackError(Class) {
120 return function(value) {
121 var out = new Class();
122 for (var key in ERROR_COLUMNS) {
123 out[key] = value[key];
124 }
125 return out;
126 };
127}
128
129function unpackClass(Class) {
130 return function(value) {
131 return new Class(value);
132 };
133}
134
135function packTypedArray(value) {
136 return new Buffer(new Uint8Array(value.buffer));
137}
138
139function packArrayBuffer(value) {
140 return new Buffer(new Uint8Array(value));
141}
142
143function unpackArrayBuffer(value) {
144 return (new Uint8Array(value)).buffer;
145}