msgpack-lite 0.1.17 → 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 +4 -2
- package/.zuul.yml +3 -3
- package/Makefile +2 -2
- package/README.md +109 -12
- package/bower.json +34 -0
- package/dist/msgpack.min.js +2 -2
- package/lib/buffer-global.js +11 -0
- package/lib/buffer-lite.js +88 -64
- 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 +10 -1
- package/lib/decode-buffer.js +16 -10
- package/lib/decode-stream.js +2 -3
- package/lib/decode.js +2 -3
- package/lib/decoder.js +2 -3
- package/lib/encode-buffer.js +15 -56
- package/lib/encode-stream.js +1 -2
- package/lib/encode.js +1 -2
- package/lib/encoder.js +1 -2
- 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 +5 -70
- package/lib/flex-buffer.js +194 -0
- package/lib/read-core.js +46 -25
- package/lib/read-format.js +118 -72
- package/lib/read-token.js +34 -4
- package/lib/write-core.js +64 -6
- package/lib/write-token.js +82 -42
- package/lib/write-type.js +218 -122
- package/lib/write-uint8.js +2 -2
- package/package.json +24 -12
- package/test/10.encode.js +50 -30
- package/test/11.decode.js +2 -0
- package/test/14.codec.js +95 -0
- package/test/15.useraw.js +92 -0
- 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/21.ext.js +2 -2
- package/test/23.extbuffer.js +44 -2
- package/test/24.int64.js +76 -0
- 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/common.js +0 -3
- package/lib/ext-preset.js +0 -133
- package/lib/is-array.js +0 -3
- package/test/60.buffer-lite.js +0 -98
package/lib/encode-buffer.js
CHANGED
|
@@ -2,67 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
exports.EncodeBuffer = EncodeBuffer;
|
|
4
4
|
|
|
5
|
-
var preset = require("./
|
|
6
|
-
var MIN_BUFFER_SIZE = 2048;
|
|
7
|
-
var MAX_BUFFER_SIZE = 65536;
|
|
8
|
-
var DEFAULT_OPTIONS = {};
|
|
5
|
+
var preset = require("./write-core").preset;
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
if (!(this instanceof EncodeBuffer)) return new EncodeBuffer(options);
|
|
12
|
-
this.options = options || DEFAULT_OPTIONS;
|
|
13
|
-
this.codec = this.options.codec || preset;
|
|
14
|
-
}
|
|
7
|
+
var FlexEncoder = require("./flex-buffer").FlexEncoder;
|
|
15
8
|
|
|
16
|
-
EncodeBuffer.prototype
|
|
17
|
-
var buffers = this.buffers || (this.buffers = []);
|
|
18
|
-
buffers.push(chunk);
|
|
19
|
-
};
|
|
9
|
+
FlexEncoder.mixin(EncodeBuffer.prototype);
|
|
20
10
|
|
|
21
|
-
EncodeBuffer
|
|
22
|
-
this
|
|
23
|
-
var buffers = this.buffers;
|
|
24
|
-
if (!buffers) return;
|
|
25
|
-
var chunk = buffers.length > 1 ? Buffer.concat(buffers) : buffers[0];
|
|
26
|
-
buffers.length = 0;
|
|
27
|
-
return chunk;
|
|
28
|
-
};
|
|
11
|
+
function EncodeBuffer(options) {
|
|
12
|
+
if (!(this instanceof EncodeBuffer)) return new EncodeBuffer(options);
|
|
29
13
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
14
|
+
if (options) {
|
|
15
|
+
this.options = options;
|
|
16
|
+
if (options.codec) {
|
|
17
|
+
var codec = this.codec = options.codec;
|
|
18
|
+
if (codec.bufferish) this.bufferish = codec.bufferish;
|
|
19
|
+
}
|
|
34
20
|
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
EncodeBuffer.prototype.reserve = function(length) {
|
|
38
|
-
if (!this.buffer) return this.alloc(length);
|
|
39
|
-
|
|
40
|
-
var size = this.buffer.length;
|
|
41
|
-
|
|
42
|
-
// is it long enough?
|
|
43
|
-
if (this.offset + length < size) return;
|
|
44
|
-
|
|
45
|
-
// flush current buffer
|
|
46
|
-
if (this.offset) this.flush();
|
|
47
|
-
|
|
48
|
-
// resize it to 2x current length
|
|
49
|
-
this.alloc(Math.max(length, Math.min(size * 2, MAX_BUFFER_SIZE)));
|
|
50
|
-
};
|
|
21
|
+
}
|
|
51
22
|
|
|
52
|
-
EncodeBuffer.prototype.
|
|
53
|
-
// allocate new buffer
|
|
54
|
-
this.buffer = new Buffer(length > MIN_BUFFER_SIZE ? length : MIN_BUFFER_SIZE);
|
|
55
|
-
this.start = 0;
|
|
56
|
-
this.offset = 0;
|
|
57
|
-
};
|
|
23
|
+
EncodeBuffer.prototype.codec = preset;
|
|
58
24
|
|
|
59
|
-
EncodeBuffer.prototype.
|
|
60
|
-
|
|
61
|
-
if (this.buffer && end < this.buffer.length) {
|
|
62
|
-
buffer.copy(this.buffer, this.offset);
|
|
63
|
-
this.offset = end;
|
|
64
|
-
} else {
|
|
65
|
-
this.flush();
|
|
66
|
-
this.push(buffer);
|
|
67
|
-
}
|
|
25
|
+
EncodeBuffer.prototype.write = function(input) {
|
|
26
|
+
this.codec.encode(this, input);
|
|
68
27
|
};
|
package/lib/encode-stream.js
CHANGED
|
@@ -5,7 +5,6 @@ exports.createEncodeStream = EncodeStream;
|
|
|
5
5
|
var util = require("util");
|
|
6
6
|
var Transform = require("stream").Transform;
|
|
7
7
|
var EncodeBuffer = require("./encode-buffer").EncodeBuffer;
|
|
8
|
-
var encode = require("./write-core").encode;
|
|
9
8
|
|
|
10
9
|
util.inherits(EncodeStream, Transform);
|
|
11
10
|
|
|
@@ -28,7 +27,7 @@ function EncodeStream(options) {
|
|
|
28
27
|
}
|
|
29
28
|
|
|
30
29
|
EncodeStream.prototype._transform = function(chunk, encoding, callback) {
|
|
31
|
-
|
|
30
|
+
this.encoder.write(chunk);
|
|
32
31
|
if (callback) callback();
|
|
33
32
|
};
|
|
34
33
|
|
package/lib/encode.js
CHANGED
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
exports.encode = encode;
|
|
4
4
|
|
|
5
|
-
var encode = require("./write-core").encode;
|
|
6
5
|
var EncodeBuffer = require("./encode-buffer").EncodeBuffer;
|
|
7
6
|
|
|
8
7
|
function encode(input, options) {
|
|
9
8
|
var encoder = new EncodeBuffer(options);
|
|
10
|
-
|
|
9
|
+
encoder.write(input);
|
|
11
10
|
return encoder.read();
|
|
12
11
|
}
|
package/lib/encoder.js
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
exports.Encoder = Encoder;
|
|
4
4
|
|
|
5
5
|
var EventLite = require("event-lite");
|
|
6
|
-
var encode = require("./write-core").encode;
|
|
7
6
|
var EncodeBuffer = require("./encode-buffer").EncodeBuffer;
|
|
8
7
|
|
|
9
8
|
function Encoder(options) {
|
|
@@ -16,7 +15,7 @@ Encoder.prototype = new EncodeBuffer();
|
|
|
16
15
|
EventLite.mixin(Encoder.prototype);
|
|
17
16
|
|
|
18
17
|
Encoder.prototype.encode = function(chunk) {
|
|
19
|
-
|
|
18
|
+
this.write(chunk);
|
|
20
19
|
this.emit("data", this.read());
|
|
21
20
|
};
|
|
22
21
|
|
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, 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,72 +1,7 @@
|
|
|
1
|
-
// ext
|
|
1
|
+
// ext.js
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
// load both interfaces
|
|
4
|
+
require("./read-core");
|
|
5
|
+
require("./write-core");
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
var IS_ARRAY = require('./is-array');
|
|
8
|
-
|
|
9
|
-
function Ext() {
|
|
10
|
-
if (!(this instanceof Ext)) return new Ext();
|
|
11
|
-
this.extPackers = {};
|
|
12
|
-
this.extUnpackers = [];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function createCodec() {
|
|
16
|
-
return new Ext();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
Ext.prototype.addExtPacker = function(etype, Class, packer) {
|
|
20
|
-
if (IS_ARRAY(packer)) {
|
|
21
|
-
packer = join(packer);
|
|
22
|
-
}
|
|
23
|
-
var name = Class.name;
|
|
24
|
-
if (name && name !== "Object") {
|
|
25
|
-
this.extPackers[name] = extPacker;
|
|
26
|
-
} else {
|
|
27
|
-
var list = this.extEncoderList || (this.extEncoderList = []);
|
|
28
|
-
list.unshift([Class, extPacker]);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function extPacker(value) {
|
|
32
|
-
var buffer = packer(value);
|
|
33
|
-
return new ExtBuffer(buffer, etype);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
Ext.prototype.addExtUnpacker = function(etype, unpacker) {
|
|
38
|
-
this.extUnpackers[etype] = IS_ARRAY(unpacker) ? join(unpacker) : unpacker;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
Ext.prototype.getExtPacker = function(value) {
|
|
42
|
-
var c = value.constructor;
|
|
43
|
-
var e = c && c.name && this.extPackers[c.name];
|
|
44
|
-
if (e) return e;
|
|
45
|
-
var list = this.extEncoderList;
|
|
46
|
-
if (!list) return;
|
|
47
|
-
var len = list.length;
|
|
48
|
-
for (var i = 0; i < len; i++) {
|
|
49
|
-
var pair = list[i];
|
|
50
|
-
if (c === pair[0]) return pair[1];
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
Ext.prototype.getExtUnpacker = function(type) {
|
|
55
|
-
return this.extUnpackers[type] || extUnpacker;
|
|
56
|
-
|
|
57
|
-
function extUnpacker(buffer) {
|
|
58
|
-
return new ExtBuffer(buffer, type);
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
function join(filters) {
|
|
63
|
-
filters = filters.slice();
|
|
64
|
-
|
|
65
|
-
return function(value) {
|
|
66
|
-
return filters.reduce(iterator, value);
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
function iterator(value, filter) {
|
|
70
|
-
return filter(value);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
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,31 +1,52 @@
|
|
|
1
1
|
// read-core.js
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
var ExtBuffer = require("./ext-buffer").ExtBuffer;
|
|
4
|
+
var ExtUnpacker = require("./ext-unpacker");
|
|
5
|
+
var readUint8 = require("./read-format").readUint8;
|
|
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);
|
|
16
|
+
|
|
17
|
+
function getDecoder(options) {
|
|
18
|
+
var readToken = ReadToken.getReadToken(options);
|
|
19
|
+
return decode;
|
|
20
|
+
|
|
21
|
+
function decode(decoder) {
|
|
22
|
+
var type = readUint8(decoder);
|
|
23
|
+
var func = readToken[type];
|
|
24
|
+
if (!func) throw new Error("Invalid type: " + (type ? ("0x" + type.toString(16)) : type));
|
|
25
|
+
return func(decoder);
|
|
26
|
+
}
|
|
15
27
|
}
|
|
16
28
|
|
|
17
|
-
function
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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);
|
|
30
51
|
}
|
|
31
52
|
}
|