msgpack-lite 0.1.20 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmignore +1 -0
- package/.travis.yml +1 -0
- package/.zuul.yml +1 -1
- package/Makefile +2 -2
- package/README.md +27 -7
- package/dist/msgpack.min.js +2 -2
- package/lib/buffer-global.js +11 -0
- package/lib/buffer-lite.js +88 -60
- package/lib/bufferish-array.js +41 -0
- package/lib/bufferish-buffer.js +46 -0
- package/lib/bufferish-proto.js +86 -0
- package/lib/bufferish-uint8array.js +51 -0
- package/lib/bufferish.js +108 -0
- package/lib/codec-base.js +67 -0
- package/lib/codec.js +8 -1
- package/lib/decode-buffer.js +6 -50
- package/lib/encode-buffer.js +6 -79
- package/lib/ext-buffer.js +3 -1
- package/lib/ext-packer.js +78 -0
- package/lib/ext-unpacker.js +81 -0
- package/lib/ext.js +4 -77
- package/lib/flex-buffer.js +194 -0
- package/lib/read-core.js +36 -2
- package/lib/read-format.js +83 -56
- package/lib/read-token.js +1 -1
- package/lib/write-core.js +55 -2
- package/lib/write-token.js +54 -26
- package/lib/write-type.js +81 -73
- package/lib/write-uint8.js +2 -2
- package/package.json +23 -13
- package/test/10.encode.js +50 -30
- package/test/11.decode.js +2 -0
- package/test/14.codec.js +8 -1
- package/test/16.binarraybuffer.js +91 -0
- package/test/17.uint8array.js +43 -0
- package/test/18.utf8.js +59 -0
- package/test/20.roundtrip.js +53 -33
- package/test/23.extbuffer.js +44 -2
- package/test/27.usemap.js +66 -0
- package/test/61.encode-only.js +26 -0
- package/test/62.decode-only.js +23 -0
- package/test/63.module-deps.js +77 -0
- package/lib/buffer-shortage.js +0 -8
- package/lib/ext-preset.js +0 -188
- package/test/60.buffer-lite.js +0 -98
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// ext-unpacker.js
|
|
2
|
+
|
|
3
|
+
exports.setExtUnpackers = setExtUnpackers;
|
|
4
|
+
|
|
5
|
+
var Bufferish = require("./bufferish");
|
|
6
|
+
var Buffer = Bufferish.global;
|
|
7
|
+
var _decode;
|
|
8
|
+
|
|
9
|
+
var ERROR_COLUMNS = {name: 1, message: 1, stack: 1, columnNumber: 1, fileName: 1, lineNumber: 1};
|
|
10
|
+
|
|
11
|
+
function setExtUnpackers(codec) {
|
|
12
|
+
codec.addExtUnpacker(0x0E, [decode, unpackError(Error)]);
|
|
13
|
+
codec.addExtUnpacker(0x01, [decode, unpackError(EvalError)]);
|
|
14
|
+
codec.addExtUnpacker(0x02, [decode, unpackError(RangeError)]);
|
|
15
|
+
codec.addExtUnpacker(0x03, [decode, unpackError(ReferenceError)]);
|
|
16
|
+
codec.addExtUnpacker(0x04, [decode, unpackError(SyntaxError)]);
|
|
17
|
+
codec.addExtUnpacker(0x05, [decode, unpackError(TypeError)]);
|
|
18
|
+
codec.addExtUnpacker(0x06, [decode, unpackError(URIError)]);
|
|
19
|
+
|
|
20
|
+
codec.addExtUnpacker(0x0A, [decode, unpackRegExp]);
|
|
21
|
+
codec.addExtUnpacker(0x0B, [decode, unpackClass(Boolean)]);
|
|
22
|
+
codec.addExtUnpacker(0x0C, [decode, unpackClass(String)]);
|
|
23
|
+
codec.addExtUnpacker(0x0D, [decode, unpackClass(Date)]);
|
|
24
|
+
codec.addExtUnpacker(0x0F, [decode, unpackClass(Number)]);
|
|
25
|
+
|
|
26
|
+
if ("undefined" !== typeof Uint8Array) {
|
|
27
|
+
codec.addExtUnpacker(0x11, unpackClass(Int8Array));
|
|
28
|
+
codec.addExtUnpacker(0x12, unpackClass(Uint8Array));
|
|
29
|
+
codec.addExtUnpacker(0x13, [unpackArrayBuffer, unpackClass(Int16Array)]);
|
|
30
|
+
codec.addExtUnpacker(0x14, [unpackArrayBuffer, unpackClass(Uint16Array)]);
|
|
31
|
+
codec.addExtUnpacker(0x15, [unpackArrayBuffer, unpackClass(Int32Array)]);
|
|
32
|
+
codec.addExtUnpacker(0x16, [unpackArrayBuffer, unpackClass(Uint32Array)]);
|
|
33
|
+
codec.addExtUnpacker(0x17, [unpackArrayBuffer, unpackClass(Float32Array)]);
|
|
34
|
+
|
|
35
|
+
// PhantomJS/1.9.7 doesn't have Float64Array
|
|
36
|
+
if ("undefined" !== typeof Float64Array) {
|
|
37
|
+
codec.addExtUnpacker(0x18, [unpackArrayBuffer, unpackClass(Float64Array)]);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// IE10 doesn't have Uint8ClampedArray
|
|
41
|
+
if ("undefined" !== typeof Uint8ClampedArray) {
|
|
42
|
+
codec.addExtUnpacker(0x19, unpackClass(Uint8ClampedArray));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
codec.addExtUnpacker(0x1A, unpackArrayBuffer);
|
|
46
|
+
codec.addExtUnpacker(0x1D, [unpackArrayBuffer, unpackClass(DataView)]);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (Bufferish.hasBuffer) {
|
|
50
|
+
codec.addExtUnpacker(0x1B, unpackClass(Buffer));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function decode(input) {
|
|
55
|
+
if (!_decode) _decode = require("./decode").decode; // lazy load
|
|
56
|
+
return _decode(input);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function unpackRegExp(value) {
|
|
60
|
+
return RegExp.apply(null, value);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function unpackError(Class) {
|
|
64
|
+
return function(value) {
|
|
65
|
+
var out = new Class();
|
|
66
|
+
for (var key in ERROR_COLUMNS) {
|
|
67
|
+
out[key] = value[key];
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function unpackClass(Class) {
|
|
74
|
+
return function(value) {
|
|
75
|
+
return new Class(value);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function unpackArrayBuffer(value) {
|
|
80
|
+
return (new Uint8Array(value)).buffer;
|
|
81
|
+
}
|
package/lib/ext.js
CHANGED
|
@@ -1,80 +1,7 @@
|
|
|
1
1
|
// ext.js
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// load both interfaces
|
|
4
|
+
require("./read-core");
|
|
5
|
+
require("./write-core");
|
|
4
6
|
|
|
5
|
-
exports.createCodec = createCodec;
|
|
6
|
-
|
|
7
|
-
var ExtBuffer = require("./ext-buffer").ExtBuffer;
|
|
8
|
-
var ExtPreset = require("./ext-preset");
|
|
9
|
-
var ReadCore = require("./read-core");
|
|
10
|
-
var WriteCore = require("./write-core");
|
|
11
|
-
|
|
12
|
-
function Codec(options) {
|
|
13
|
-
if (!(this instanceof Codec)) return new Codec(options);
|
|
14
|
-
this.extPackers = {};
|
|
15
|
-
this.extUnpackers = [];
|
|
16
|
-
this.encode = WriteCore.getEncoder(options);
|
|
17
|
-
this.decode = ReadCore.getDecoder(options);
|
|
18
|
-
if (options && options.preset) {
|
|
19
|
-
ExtPreset.setExtPreset(this);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function createCodec(options) {
|
|
24
|
-
return new Codec(options);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
Codec.prototype.addExtPacker = function(etype, Class, packer) {
|
|
28
|
-
if (IS_ARRAY(packer)) {
|
|
29
|
-
packer = join(packer);
|
|
30
|
-
}
|
|
31
|
-
var name = Class.name;
|
|
32
|
-
if (name && name !== "Object") {
|
|
33
|
-
this.extPackers[name] = extPacker;
|
|
34
|
-
} else {
|
|
35
|
-
var list = this.extEncoderList || (this.extEncoderList = []);
|
|
36
|
-
list.unshift([Class, extPacker]);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function extPacker(value) {
|
|
40
|
-
var buffer = packer(value);
|
|
41
|
-
return new ExtBuffer(buffer, etype);
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
Codec.prototype.addExtUnpacker = function(etype, unpacker) {
|
|
46
|
-
this.extUnpackers[etype] = IS_ARRAY(unpacker) ? join(unpacker) : unpacker;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
Codec.prototype.getExtPacker = function(value) {
|
|
50
|
-
var c = value.constructor;
|
|
51
|
-
var e = c && c.name && this.extPackers[c.name];
|
|
52
|
-
if (e) return e;
|
|
53
|
-
var list = this.extEncoderList;
|
|
54
|
-
if (!list) return;
|
|
55
|
-
var len = list.length;
|
|
56
|
-
for (var i = 0; i < len; i++) {
|
|
57
|
-
var pair = list[i];
|
|
58
|
-
if (c === pair[0]) return pair[1];
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
Codec.prototype.getExtUnpacker = function(type) {
|
|
63
|
-
return this.extUnpackers[type] || extUnpacker;
|
|
64
|
-
|
|
65
|
-
function extUnpacker(buffer) {
|
|
66
|
-
return new ExtBuffer(buffer, type);
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
function join(filters) {
|
|
71
|
-
filters = filters.slice();
|
|
72
|
-
|
|
73
|
-
return function(value) {
|
|
74
|
-
return filters.reduce(iterator, value);
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
function iterator(value, filter) {
|
|
78
|
-
return filter(value);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
7
|
+
exports.createCodec = require("./codec-base").createCodec;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// flex-buffer.js
|
|
2
|
+
|
|
3
|
+
exports.FlexDecoder = FlexDecoder;
|
|
4
|
+
exports.FlexEncoder = FlexEncoder;
|
|
5
|
+
|
|
6
|
+
var Bufferish = require("./bufferish");
|
|
7
|
+
|
|
8
|
+
var MIN_BUFFER_SIZE = 2048;
|
|
9
|
+
var MAX_BUFFER_SIZE = 65536;
|
|
10
|
+
var BUFFER_SHORTAGE = "BUFFER_SHORTAGE";
|
|
11
|
+
|
|
12
|
+
function FlexDecoder() {
|
|
13
|
+
if (!(this instanceof FlexDecoder)) return new FlexDecoder();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function FlexEncoder() {
|
|
17
|
+
if (!(this instanceof FlexEncoder)) return new FlexEncoder();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
FlexDecoder.mixin = mixinFactory(getDecoderMethods());
|
|
21
|
+
FlexDecoder.mixin(FlexDecoder.prototype);
|
|
22
|
+
|
|
23
|
+
FlexEncoder.mixin = mixinFactory(getEncoderMethods());
|
|
24
|
+
FlexEncoder.mixin(FlexEncoder.prototype);
|
|
25
|
+
|
|
26
|
+
function getDecoderMethods() {
|
|
27
|
+
return {
|
|
28
|
+
bufferish: Bufferish,
|
|
29
|
+
write: write,
|
|
30
|
+
fetch: fetch,
|
|
31
|
+
flush: flush,
|
|
32
|
+
push: push,
|
|
33
|
+
pull: pull,
|
|
34
|
+
read: read,
|
|
35
|
+
reserve: reserve,
|
|
36
|
+
offset: 0
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
function write(chunk) {
|
|
40
|
+
var prev = this.offset ? Bufferish.prototype.slice.call(this.buffer, this.offset) : this.buffer;
|
|
41
|
+
this.buffer = prev ? (chunk ? this.bufferish.concat([prev, chunk]) : prev) : chunk;
|
|
42
|
+
this.offset = 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function flush() {
|
|
46
|
+
while (this.offset < this.buffer.length) {
|
|
47
|
+
var start = this.offset;
|
|
48
|
+
var value;
|
|
49
|
+
try {
|
|
50
|
+
value = this.fetch();
|
|
51
|
+
} catch (e) {
|
|
52
|
+
if (e && e.message != BUFFER_SHORTAGE) throw e;
|
|
53
|
+
// rollback
|
|
54
|
+
this.offset = start;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
this.push(value);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function reserve(length) {
|
|
62
|
+
var start = this.offset;
|
|
63
|
+
var end = start + length;
|
|
64
|
+
if (end > this.buffer.length) throw new Error(BUFFER_SHORTAGE);
|
|
65
|
+
this.offset = end;
|
|
66
|
+
return start;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function getEncoderMethods() {
|
|
71
|
+
return {
|
|
72
|
+
bufferish: Bufferish,
|
|
73
|
+
write: write,
|
|
74
|
+
fetch: fetch,
|
|
75
|
+
flush: flush,
|
|
76
|
+
push: push,
|
|
77
|
+
pull: pull,
|
|
78
|
+
read: read,
|
|
79
|
+
reserve: reserve,
|
|
80
|
+
send: send,
|
|
81
|
+
maxBufferSize: MAX_BUFFER_SIZE,
|
|
82
|
+
minBufferSize: MIN_BUFFER_SIZE,
|
|
83
|
+
offset: 0,
|
|
84
|
+
start: 0
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
function fetch() {
|
|
88
|
+
var start = this.start;
|
|
89
|
+
if (start < this.offset) {
|
|
90
|
+
var end = this.start = this.offset;
|
|
91
|
+
return Bufferish.prototype.slice.call(this.buffer, start, end);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function flush() {
|
|
96
|
+
while (this.start < this.offset) {
|
|
97
|
+
var value = this.fetch();
|
|
98
|
+
if (value) this.push(value);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function pull() {
|
|
103
|
+
var buffers = this.buffers || (this.buffers = []);
|
|
104
|
+
var chunk = buffers.length > 1 ? this.bufferish.concat(buffers) : buffers[0];
|
|
105
|
+
buffers.length = 0; // buffer exhausted
|
|
106
|
+
return chunk;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function reserve(length) {
|
|
110
|
+
var req = length | 0;
|
|
111
|
+
|
|
112
|
+
if (this.buffer) {
|
|
113
|
+
var size = this.buffer.length;
|
|
114
|
+
var start = this.offset | 0;
|
|
115
|
+
var end = start + req;
|
|
116
|
+
|
|
117
|
+
// is it long enough?
|
|
118
|
+
if (end < size) {
|
|
119
|
+
this.offset = end;
|
|
120
|
+
return start;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// flush current buffer
|
|
124
|
+
this.flush();
|
|
125
|
+
|
|
126
|
+
// resize it to 2x current length
|
|
127
|
+
length = Math.max(length, Math.min(size * 2, this.maxBufferSize));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// minimum buffer size
|
|
131
|
+
length = Math.max(length, this.minBufferSize);
|
|
132
|
+
|
|
133
|
+
// allocate new buffer
|
|
134
|
+
this.buffer = this.bufferish.alloc(length);
|
|
135
|
+
this.start = 0;
|
|
136
|
+
this.offset = req;
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function send(buffer) {
|
|
141
|
+
var length = buffer.length;
|
|
142
|
+
if (length > this.minBufferSize) {
|
|
143
|
+
this.flush();
|
|
144
|
+
this.push(buffer);
|
|
145
|
+
} else {
|
|
146
|
+
var offset = this.reserve(length);
|
|
147
|
+
Bufferish.prototype.copy.call(buffer, this.buffer, offset);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// common methods
|
|
153
|
+
|
|
154
|
+
function write() {
|
|
155
|
+
throw new Error("method not implemented: write()");
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function fetch() {
|
|
159
|
+
throw new Error("method not implemented: fetch()");
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function read() {
|
|
163
|
+
var length = this.buffers && this.buffers.length;
|
|
164
|
+
|
|
165
|
+
// fetch the first result
|
|
166
|
+
if (!length) return this.fetch();
|
|
167
|
+
|
|
168
|
+
// flush current buffer
|
|
169
|
+
this.flush();
|
|
170
|
+
|
|
171
|
+
// read from the results
|
|
172
|
+
return this.pull();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function push(chunk) {
|
|
176
|
+
var buffers = this.buffers || (this.buffers = []);
|
|
177
|
+
buffers.push(chunk);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function pull() {
|
|
181
|
+
var buffers = this.buffers || (this.buffers = []);
|
|
182
|
+
return buffers.shift();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function mixinFactory(source) {
|
|
186
|
+
return mixin;
|
|
187
|
+
|
|
188
|
+
function mixin(target) {
|
|
189
|
+
for (var key in source) {
|
|
190
|
+
target[key] = source[key];
|
|
191
|
+
}
|
|
192
|
+
return target;
|
|
193
|
+
}
|
|
194
|
+
}
|
package/lib/read-core.js
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
// read-core.js
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
var ExtBuffer = require("./ext-buffer").ExtBuffer;
|
|
4
|
+
var ExtUnpacker = require("./ext-unpacker");
|
|
5
5
|
var readUint8 = require("./read-format").readUint8;
|
|
6
6
|
var ReadToken = require("./read-token");
|
|
7
|
+
var CodecBase = require("./codec-base");
|
|
8
|
+
|
|
9
|
+
CodecBase.install({
|
|
10
|
+
addExtUnpacker: addExtUnpacker,
|
|
11
|
+
getExtUnpacker: getExtUnpacker,
|
|
12
|
+
init: init
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
exports.preset = init.call(CodecBase.preset);
|
|
7
16
|
|
|
8
17
|
function getDecoder(options) {
|
|
9
18
|
var readToken = ReadToken.getReadToken(options);
|
|
@@ -16,3 +25,28 @@ function getDecoder(options) {
|
|
|
16
25
|
return func(decoder);
|
|
17
26
|
}
|
|
18
27
|
}
|
|
28
|
+
|
|
29
|
+
function init() {
|
|
30
|
+
var options = this.options;
|
|
31
|
+
this.decode = getDecoder(options);
|
|
32
|
+
|
|
33
|
+
if (options && options.preset) {
|
|
34
|
+
ExtUnpacker.setExtUnpackers(this);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function addExtUnpacker(etype, unpacker) {
|
|
41
|
+
var unpackers = this.extUnpackers || (this.extUnpackers = []);
|
|
42
|
+
unpackers[etype] = CodecBase.filter(unpacker);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function getExtUnpacker(type) {
|
|
46
|
+
var unpackers = this.extUnpackers || (this.extUnpackers = []);
|
|
47
|
+
return unpackers[type] || extUnpacker;
|
|
48
|
+
|
|
49
|
+
function extUnpacker(buffer) {
|
|
50
|
+
return new ExtBuffer(buffer, type);
|
|
51
|
+
}
|
|
52
|
+
}
|
package/lib/read-format.js
CHANGED
|
@@ -8,40 +8,39 @@ var Int64BE = Int64Buffer.Int64BE;
|
|
|
8
8
|
exports.getReadFormat = getReadFormat;
|
|
9
9
|
exports.readUint8 = uint8;
|
|
10
10
|
|
|
11
|
-
var
|
|
12
|
-
var
|
|
11
|
+
var Bufferish = require("./bufferish");
|
|
12
|
+
var BufferProto = require("./bufferish-proto");
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var HAS_MAP = ("undefined" !== typeof Map);
|
|
15
15
|
var NO_ASSERT = true;
|
|
16
16
|
|
|
17
17
|
function getReadFormat(options) {
|
|
18
|
+
var binarraybuffer = Bufferish.hasArrayBuffer && options && options.binarraybuffer;
|
|
19
|
+
var int64 = options && options.int64;
|
|
20
|
+
var usemap = HAS_MAP && options && options.usemap;
|
|
21
|
+
|
|
18
22
|
var readFormat = {
|
|
19
|
-
map:
|
|
23
|
+
map: (usemap ? map_to_map : map_to_obj),
|
|
20
24
|
array: array,
|
|
21
25
|
str: str,
|
|
22
|
-
bin:
|
|
26
|
+
bin: (binarraybuffer ? bin_arraybuffer : bin_buffer),
|
|
23
27
|
ext: ext,
|
|
24
28
|
uint8: uint8,
|
|
25
29
|
uint16: uint16,
|
|
26
|
-
uint32:
|
|
27
|
-
uint64: read(8, readUInt64BE),
|
|
28
|
-
int8:
|
|
29
|
-
int16:
|
|
30
|
-
int32:
|
|
31
|
-
int64: read(8, readInt64BE),
|
|
30
|
+
uint32: uint32,
|
|
31
|
+
uint64: read(8, int64 ? readUInt64BE_int64 : readUInt64BE),
|
|
32
|
+
int8: int8,
|
|
33
|
+
int16: int16,
|
|
34
|
+
int32: int32,
|
|
35
|
+
int64: read(8, int64 ? readInt64BE_int64 : readInt64BE),
|
|
32
36
|
float32: read(4, readFloatBE),
|
|
33
37
|
float64: read(8, readDoubleBE)
|
|
34
38
|
};
|
|
35
39
|
|
|
36
|
-
if (options && options.int64) {
|
|
37
|
-
readFormat.uint64 = read(8, readUInt64BE_int64);
|
|
38
|
-
readFormat.int64 = read(8, readInt64BE_int64);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
40
|
return readFormat;
|
|
42
41
|
}
|
|
43
42
|
|
|
44
|
-
function
|
|
43
|
+
function map_to_obj(decoder, len) {
|
|
45
44
|
var value = {};
|
|
46
45
|
var i;
|
|
47
46
|
var k = new Array(len);
|
|
@@ -58,6 +57,23 @@ function map(decoder, len) {
|
|
|
58
57
|
return value;
|
|
59
58
|
}
|
|
60
59
|
|
|
60
|
+
function map_to_map(decoder, len) {
|
|
61
|
+
var value = new Map();
|
|
62
|
+
var i;
|
|
63
|
+
var k = new Array(len);
|
|
64
|
+
var v = new Array(len);
|
|
65
|
+
|
|
66
|
+
var decode = decoder.codec.decode;
|
|
67
|
+
for (i = 0; i < len; i++) {
|
|
68
|
+
k[i] = decode(decoder);
|
|
69
|
+
v[i] = decode(decoder);
|
|
70
|
+
}
|
|
71
|
+
for (i = 0; i < len; i++) {
|
|
72
|
+
value.set(k[i], v[i]);
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
|
|
61
77
|
function array(decoder, len) {
|
|
62
78
|
var value = new Array(len);
|
|
63
79
|
var decode = decoder.codec.decode;
|
|
@@ -68,54 +84,74 @@ function array(decoder, len) {
|
|
|
68
84
|
}
|
|
69
85
|
|
|
70
86
|
function str(decoder, len) {
|
|
71
|
-
var start = decoder.
|
|
72
|
-
var end =
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
87
|
+
var start = decoder.reserve(len);
|
|
88
|
+
var end = start + len;
|
|
89
|
+
return BufferProto.toString.call(decoder.buffer, "utf-8", start, end);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function bin_buffer(decoder, len) {
|
|
93
|
+
var start = decoder.reserve(len);
|
|
94
|
+
var end = start + len;
|
|
95
|
+
var buf = BufferProto.slice.call(decoder.buffer, start, end);
|
|
96
|
+
return Bufferish.from(buf);
|
|
82
97
|
}
|
|
83
98
|
|
|
84
|
-
function
|
|
85
|
-
var start = decoder.
|
|
86
|
-
var end =
|
|
87
|
-
|
|
88
|
-
return
|
|
99
|
+
function bin_arraybuffer(decoder, len) {
|
|
100
|
+
var start = decoder.reserve(len);
|
|
101
|
+
var end = start + len;
|
|
102
|
+
var buf = BufferProto.slice.call(decoder.buffer, start, end);
|
|
103
|
+
return Bufferish.Uint8Array.from(buf).buffer;
|
|
89
104
|
}
|
|
90
105
|
|
|
91
106
|
function ext(decoder, len) {
|
|
92
|
-
var start = decoder.
|
|
93
|
-
var
|
|
94
|
-
|
|
95
|
-
var type = decoder.buffer[start];
|
|
107
|
+
var start = decoder.reserve(len+1);
|
|
108
|
+
var type = decoder.buffer[start++];
|
|
109
|
+
var end = start + len;
|
|
96
110
|
var unpack = decoder.codec.getExtUnpacker(type);
|
|
97
111
|
if (!unpack) throw new Error("Invalid ext type: " + (type ? ("0x" + type.toString(16)) : type));
|
|
98
|
-
var buf = slice.call(decoder.buffer, start
|
|
112
|
+
var buf = BufferProto.slice.call(decoder.buffer, start, end);
|
|
99
113
|
return unpack(buf);
|
|
100
114
|
}
|
|
101
115
|
|
|
102
116
|
function uint8(decoder) {
|
|
103
|
-
var
|
|
104
|
-
|
|
105
|
-
|
|
117
|
+
var start = decoder.reserve(1);
|
|
118
|
+
return decoder.buffer[start];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function int8(decoder) {
|
|
122
|
+
var start = decoder.reserve(1);
|
|
123
|
+
var value = decoder.buffer[start];
|
|
124
|
+
return (value & 0x80) ? value - 0x100 : value;
|
|
106
125
|
}
|
|
107
126
|
|
|
108
127
|
function uint16(decoder) {
|
|
128
|
+
var start = decoder.reserve(2);
|
|
129
|
+
var buffer = decoder.buffer;
|
|
130
|
+
return (buffer[start++] << 8) | buffer[start];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function int16(decoder) {
|
|
134
|
+
var start = decoder.reserve(2);
|
|
109
135
|
var buffer = decoder.buffer;
|
|
110
|
-
|
|
111
|
-
return (
|
|
136
|
+
var value = (buffer[start++] << 8) | buffer[start];
|
|
137
|
+
return (value & 0x8000) ? value - 0x10000 : value;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function uint32(decoder) {
|
|
141
|
+
var start = decoder.reserve(4);
|
|
142
|
+
var buffer = decoder.buffer;
|
|
143
|
+
return (buffer[start++] * 16777216) + (buffer[start++] << 16) + (buffer[start++] << 8) + buffer[start];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function int32(decoder) {
|
|
147
|
+
var start = decoder.reserve(4);
|
|
148
|
+
var buffer = decoder.buffer;
|
|
149
|
+
return (buffer[start++] << 24) | (buffer[start++] << 16) | (buffer[start++] << 8) | buffer[start];
|
|
112
150
|
}
|
|
113
151
|
|
|
114
152
|
function read(len, method) {
|
|
115
153
|
return function(decoder) {
|
|
116
|
-
var start = decoder.
|
|
117
|
-
var end = decoder.offset = start + len;
|
|
118
|
-
if (end > decoder.buffer.length) throw new BufferShortageError();
|
|
154
|
+
var start = decoder.reserve(len);
|
|
119
155
|
return method.call(decoder.buffer, start, NO_ASSERT);
|
|
120
156
|
};
|
|
121
157
|
}
|
|
@@ -137,18 +173,9 @@ function readInt64BE_int64(start) {
|
|
|
137
173
|
}
|
|
138
174
|
|
|
139
175
|
function readFloatBE(start) {
|
|
140
|
-
if (this.readFloatBE) return this.readFloatBE(start);
|
|
141
176
|
return ieee754.read(this, start, false, 23, 4);
|
|
142
177
|
}
|
|
143
178
|
|
|
144
179
|
function readDoubleBE(start) {
|
|
145
|
-
if (this.readDoubleBE) return this.readDoubleBE(start);
|
|
146
180
|
return ieee754.read(this, start, false, 52, 8);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function slice(start, end) {
|
|
150
|
-
var f = this.slice || Array.prototype.slice;
|
|
151
|
-
var buf = f.call(this, start, end);
|
|
152
|
-
if (!Buffer.isBuffer(buf)) buf = Buffer(buf);
|
|
153
|
-
return buf;
|
|
154
|
-
}
|
|
181
|
+
}
|
package/lib/read-token.js
CHANGED
package/lib/write-core.js
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
// write-core.js
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
var ExtBuffer = require("./ext-buffer").ExtBuffer;
|
|
4
|
+
var ExtPacker = require("./ext-packer");
|
|
5
5
|
var WriteType = require("./write-type");
|
|
6
|
+
var CodecBase = require("./codec-base");
|
|
7
|
+
|
|
8
|
+
CodecBase.install({
|
|
9
|
+
addExtPacker: addExtPacker,
|
|
10
|
+
getExtPacker: getExtPacker,
|
|
11
|
+
init: init
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
exports.preset = init.call(CodecBase.preset);
|
|
6
15
|
|
|
7
16
|
function getEncoder(options) {
|
|
8
17
|
var writeType = WriteType.getWriteType(options);
|
|
@@ -14,3 +23,47 @@ function getEncoder(options) {
|
|
|
14
23
|
func(encoder, value);
|
|
15
24
|
}
|
|
16
25
|
}
|
|
26
|
+
|
|
27
|
+
function init() {
|
|
28
|
+
var options = this.options;
|
|
29
|
+
this.encode = getEncoder(options);
|
|
30
|
+
|
|
31
|
+
if (options && options.preset) {
|
|
32
|
+
ExtPacker.setExtPackers(this);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function addExtPacker(etype, Class, packer) {
|
|
39
|
+
packer = CodecBase.filter(packer);
|
|
40
|
+
var name = Class.name;
|
|
41
|
+
if (name && name !== "Object") {
|
|
42
|
+
var packers = this.extPackers || (this.extPackers = {});
|
|
43
|
+
packers[name] = extPacker;
|
|
44
|
+
} else {
|
|
45
|
+
// fallback for IE
|
|
46
|
+
var list = this.extEncoderList || (this.extEncoderList = []);
|
|
47
|
+
list.unshift([Class, extPacker]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function extPacker(value) {
|
|
51
|
+
if (packer) value = packer(value);
|
|
52
|
+
return new ExtBuffer(value, etype);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function getExtPacker(value) {
|
|
57
|
+
var packers = this.extPackers || (this.extPackers = {});
|
|
58
|
+
var c = value.constructor;
|
|
59
|
+
var e = c && c.name && packers[c.name];
|
|
60
|
+
if (e) return e;
|
|
61
|
+
|
|
62
|
+
// fallback for IE
|
|
63
|
+
var list = this.extEncoderList || (this.extEncoderList = []);
|
|
64
|
+
var len = list.length;
|
|
65
|
+
for (var i = 0; i < len; i++) {
|
|
66
|
+
var pair = list[i];
|
|
67
|
+
if (c === pair[0]) return pair[1];
|
|
68
|
+
}
|
|
69
|
+
}
|