1 |
|
2 |
|
3 | var Ext = require("./ext").Ext;
|
4 |
|
5 | var preset = exports.preset = new Ext();
|
6 |
|
7 | var encode = require("./encode").encode;
|
8 | var decode = require("./decode").decode;
|
9 |
|
10 | var ERROR_COLUMNS = {name: 1, message: 1, stack: 1, columnNumber: 1, fileName: 1, lineNumber: 1};
|
11 |
|
12 | init();
|
13 |
|
14 | function 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 |
|
62 | preset.addExtPacker(0x18, Float64Array, packTypedArray);
|
63 | preset.addExtUnpacker(0x18, join(unpackArrayBuffer, unpackClass(Float64Array)));
|
64 | }
|
65 |
|
66 | if ("undefined" !== typeof Uint8ClampedArray) {
|
67 |
|
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 |
|
79 | function 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 |
|
91 | function packBuffer(value) {
|
92 | return new Buffer(value);
|
93 | }
|
94 |
|
95 | function packValueOf(value) {
|
96 | return (value).valueOf();
|
97 | }
|
98 |
|
99 | function 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 |
|
107 | function unpackRegExp(value) {
|
108 | return RegExp.apply(null, value);
|
109 | }
|
110 |
|
111 | function packError(value) {
|
112 | var out = {};
|
113 | for (var key in ERROR_COLUMNS) {
|
114 | out[key] = value[key];
|
115 | }
|
116 | return out;
|
117 | }
|
118 |
|
119 | function 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 |
|
129 | function unpackClass(Class) {
|
130 | return function(value) {
|
131 | return new Class(value);
|
132 | };
|
133 | }
|
134 |
|
135 | function packTypedArray(value) {
|
136 | return new Buffer(new Uint8Array(value.buffer));
|
137 | }
|
138 |
|
139 | function packArrayBuffer(value) {
|
140 | return new Buffer(new Uint8Array(value));
|
141 | }
|
142 |
|
143 | function unpackArrayBuffer(value) {
|
144 | return (new Uint8Array(value)).buffer;
|
145 | }
|