msgpack-lite 0.1.20 → 0.1.27
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/.github/workflows/nodejs.yml +23 -0
- package/.github/workflows/publish.yml +64 -0
- package/LICENSE +1 -1
- package/Makefile +8 -13
- package/README.md +28 -91
- 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/decode-stream.js +7 -3
- package/lib/encode-buffer.js +6 -79
- package/lib/encode-stream.js +12 -4
- 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 +22 -12
- package/test/10.encode.js +53 -33
- package/test/11.decode.js +16 -3
- package/test/14.codec.js +10 -3
- package/test/15.useraw.js +4 -4
- 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 +54 -34
- package/test/23.extbuffer.js +46 -4
- package/test/27.usemap.js +66 -0
- package/test/30.stream.js +49 -1
- package/test/50.compat.js +6 -6
- 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/.npmignore +0 -7
- package/.travis.yml +0 -25
- package/.zuul.yml +0 -20
- package/bower.json +0 -34
- package/lib/buffer-shortage.js +0 -8
- package/lib/ext-preset.js +0 -188
- package/test/60.buffer-lite.js +0 -98
- package/test/zuul/ie.html +0 -4
package/lib/encode-buffer.js
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
exports.EncodeBuffer = EncodeBuffer;
|
|
4
4
|
|
|
5
|
-
var preset = require("./
|
|
5
|
+
var preset = require("./write-core").preset;
|
|
6
6
|
|
|
7
|
-
var
|
|
8
|
-
|
|
7
|
+
var FlexEncoder = require("./flex-buffer").FlexEncoder;
|
|
8
|
+
|
|
9
|
+
FlexEncoder.mixin(EncodeBuffer.prototype);
|
|
9
10
|
|
|
10
11
|
function EncodeBuffer(options) {
|
|
11
12
|
if (!(this instanceof EncodeBuffer)) return new EncodeBuffer(options);
|
|
@@ -13,88 +14,14 @@ function EncodeBuffer(options) {
|
|
|
13
14
|
if (options) {
|
|
14
15
|
this.options = options;
|
|
15
16
|
if (options.codec) {
|
|
16
|
-
this.codec = options.codec;
|
|
17
|
+
var codec = this.codec = options.codec;
|
|
18
|
+
if (codec.bufferish) this.bufferish = codec.bufferish;
|
|
17
19
|
}
|
|
18
20
|
}
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
EncodeBuffer.prototype.offset = 0;
|
|
22
|
-
EncodeBuffer.prototype.start = 0;
|
|
23
|
-
|
|
24
|
-
EncodeBuffer.prototype.push = function(chunk) {
|
|
25
|
-
var buffers = this.buffers || (this.buffers = []);
|
|
26
|
-
buffers.push(chunk);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
23
|
EncodeBuffer.prototype.codec = preset;
|
|
30
24
|
|
|
31
25
|
EncodeBuffer.prototype.write = function(input) {
|
|
32
26
|
this.codec.encode(this, input);
|
|
33
27
|
};
|
|
34
|
-
|
|
35
|
-
EncodeBuffer.prototype.read = function() {
|
|
36
|
-
var length = this.buffers && this.buffers.length;
|
|
37
|
-
|
|
38
|
-
// fetch the first result
|
|
39
|
-
if (!length) return this.fetch();
|
|
40
|
-
|
|
41
|
-
// flush current buffer
|
|
42
|
-
this.flush();
|
|
43
|
-
|
|
44
|
-
// read from the results
|
|
45
|
-
return this.pull();
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
EncodeBuffer.prototype.pull = function() {
|
|
49
|
-
var buffers = this.buffers || (this.buffers = []);
|
|
50
|
-
var chunk = buffers.length > 1 ? Buffer.concat(buffers) : buffers[0];
|
|
51
|
-
buffers.length = 0; // buffer exhausted
|
|
52
|
-
return chunk;
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
EncodeBuffer.prototype.fetch = function() {
|
|
56
|
-
var start = this.start;
|
|
57
|
-
if (start < this.offset) {
|
|
58
|
-
this.start = this.offset;
|
|
59
|
-
return this.buffer.slice(start, this.offset);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
EncodeBuffer.prototype.flush = function() {
|
|
64
|
-
var buffer = this.fetch();
|
|
65
|
-
if (buffer) this.push(buffer);
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
EncodeBuffer.prototype.reserve = function(length) {
|
|
69
|
-
if (this.buffer) {
|
|
70
|
-
var size = this.buffer.length;
|
|
71
|
-
|
|
72
|
-
// is it long enough?
|
|
73
|
-
if (this.offset + length < size) return;
|
|
74
|
-
|
|
75
|
-
// flush current buffer
|
|
76
|
-
this.flush();
|
|
77
|
-
|
|
78
|
-
// resize it to 2x current length
|
|
79
|
-
length = Math.max(length, Math.min(size * 2, MAX_BUFFER_SIZE));
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// minimum buffer size
|
|
83
|
-
length = length > MIN_BUFFER_SIZE ? length : MIN_BUFFER_SIZE;
|
|
84
|
-
|
|
85
|
-
// allocate new buffer
|
|
86
|
-
this.buffer = new Buffer(length);
|
|
87
|
-
this.start = 0;
|
|
88
|
-
this.offset = 0;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
EncodeBuffer.prototype.send = function(buffer) {
|
|
92
|
-
var end = this.offset + buffer.length;
|
|
93
|
-
if (this.buffer && end < this.buffer.length) {
|
|
94
|
-
buffer.copy(this.buffer, this.offset);
|
|
95
|
-
this.offset = end;
|
|
96
|
-
} else {
|
|
97
|
-
this.flush();
|
|
98
|
-
this.push(buffer);
|
|
99
|
-
}
|
|
100
|
-
};
|
package/lib/encode-stream.js
CHANGED
|
@@ -27,11 +27,19 @@ function EncodeStream(options) {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
EncodeStream.prototype._transform = function(chunk, encoding, callback) {
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
try {
|
|
31
|
+
this.encoder.write(chunk);
|
|
32
|
+
} catch(e) {
|
|
33
|
+
return callback(e);
|
|
34
|
+
}
|
|
35
|
+
callback();
|
|
32
36
|
};
|
|
33
37
|
|
|
34
38
|
EncodeStream.prototype._flush = function(callback) {
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
try {
|
|
40
|
+
this.encoder.flush();
|
|
41
|
+
} catch(e) {
|
|
42
|
+
return callback(e);
|
|
43
|
+
}
|
|
44
|
+
callback();
|
|
37
45
|
};
|
package/lib/ext-buffer.js
CHANGED
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
exports.ExtBuffer = ExtBuffer;
|
|
4
4
|
|
|
5
|
+
var Bufferish = require("./bufferish");
|
|
6
|
+
|
|
5
7
|
function ExtBuffer(buffer, type) {
|
|
6
8
|
if (!(this instanceof ExtBuffer)) return new ExtBuffer(buffer, type);
|
|
7
|
-
this.buffer = buffer;
|
|
9
|
+
this.buffer = Bufferish.from(buffer);
|
|
8
10
|
this.type = type;
|
|
9
11
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// ext-packer.js
|
|
2
|
+
|
|
3
|
+
exports.setExtPackers = setExtPackers;
|
|
4
|
+
|
|
5
|
+
var Bufferish = require("./bufferish");
|
|
6
|
+
var Buffer = Bufferish.global;
|
|
7
|
+
var packTypedArray = Bufferish.Uint8Array.from;
|
|
8
|
+
var _encode;
|
|
9
|
+
|
|
10
|
+
var ERROR_COLUMNS = {name: 1, message: 1, stack: 1, columnNumber: 1, fileName: 1, lineNumber: 1};
|
|
11
|
+
|
|
12
|
+
function setExtPackers(codec) {
|
|
13
|
+
codec.addExtPacker(0x0E, Error, [packError, encode]);
|
|
14
|
+
codec.addExtPacker(0x01, EvalError, [packError, encode]);
|
|
15
|
+
codec.addExtPacker(0x02, RangeError, [packError, encode]);
|
|
16
|
+
codec.addExtPacker(0x03, ReferenceError, [packError, encode]);
|
|
17
|
+
codec.addExtPacker(0x04, SyntaxError, [packError, encode]);
|
|
18
|
+
codec.addExtPacker(0x05, TypeError, [packError, encode]);
|
|
19
|
+
codec.addExtPacker(0x06, URIError, [packError, encode]);
|
|
20
|
+
|
|
21
|
+
codec.addExtPacker(0x0A, RegExp, [packRegExp, encode]);
|
|
22
|
+
codec.addExtPacker(0x0B, Boolean, [packValueOf, encode]);
|
|
23
|
+
codec.addExtPacker(0x0C, String, [packValueOf, encode]);
|
|
24
|
+
codec.addExtPacker(0x0D, Date, [Number, encode]);
|
|
25
|
+
codec.addExtPacker(0x0F, Number, [packValueOf, encode]);
|
|
26
|
+
|
|
27
|
+
if ("undefined" !== typeof Uint8Array) {
|
|
28
|
+
codec.addExtPacker(0x11, Int8Array, packTypedArray);
|
|
29
|
+
codec.addExtPacker(0x12, Uint8Array, packTypedArray);
|
|
30
|
+
codec.addExtPacker(0x13, Int16Array, packTypedArray);
|
|
31
|
+
codec.addExtPacker(0x14, Uint16Array, packTypedArray);
|
|
32
|
+
codec.addExtPacker(0x15, Int32Array, packTypedArray);
|
|
33
|
+
codec.addExtPacker(0x16, Uint32Array, packTypedArray);
|
|
34
|
+
codec.addExtPacker(0x17, Float32Array, packTypedArray);
|
|
35
|
+
|
|
36
|
+
// PhantomJS/1.9.7 doesn't have Float64Array
|
|
37
|
+
if ("undefined" !== typeof Float64Array) {
|
|
38
|
+
codec.addExtPacker(0x18, Float64Array, packTypedArray);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// IE10 doesn't have Uint8ClampedArray
|
|
42
|
+
if ("undefined" !== typeof Uint8ClampedArray) {
|
|
43
|
+
codec.addExtPacker(0x19, Uint8ClampedArray, packTypedArray);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
codec.addExtPacker(0x1A, ArrayBuffer, packTypedArray);
|
|
47
|
+
codec.addExtPacker(0x1D, DataView, packTypedArray);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (Bufferish.hasBuffer) {
|
|
51
|
+
codec.addExtPacker(0x1B, Buffer, Bufferish.from);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function encode(input) {
|
|
56
|
+
if (!_encode) _encode = require("./encode").encode; // lazy load
|
|
57
|
+
return _encode(input);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function packValueOf(value) {
|
|
61
|
+
return (value).valueOf();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function packRegExp(value) {
|
|
65
|
+
value = RegExp.prototype.toString.call(value).split("/");
|
|
66
|
+
value.shift();
|
|
67
|
+
var out = [value.pop()];
|
|
68
|
+
out.unshift(value.join("/"));
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function packError(value) {
|
|
73
|
+
var out = {};
|
|
74
|
+
for (var key in ERROR_COLUMNS) {
|
|
75
|
+
out[key] = value[key];
|
|
76
|
+
}
|
|
77
|
+
return out;
|
|
78
|
+
}
|
|
@@ -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, Bufferish.from);
|
|
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
|
+
}
|