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,46 @@
|
|
|
1
|
+
// bufferish-buffer.js
|
|
2
|
+
|
|
3
|
+
var Bufferish = require("./bufferish");
|
|
4
|
+
var Buffer = Bufferish.global;
|
|
5
|
+
|
|
6
|
+
var exports = module.exports = Bufferish.hasBuffer ? alloc(0) : [];
|
|
7
|
+
|
|
8
|
+
exports.alloc = Bufferish.hasBuffer && Buffer.alloc || alloc;
|
|
9
|
+
exports.concat = Bufferish.concat;
|
|
10
|
+
exports.from = from;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param size {Number}
|
|
14
|
+
* @returns {Buffer|Uint8Array|Array}
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
function alloc(size) {
|
|
18
|
+
return new Buffer(size);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param value {Array|ArrayBuffer|Buffer|String}
|
|
23
|
+
* @returns {Buffer}
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
function from(value) {
|
|
27
|
+
if (!Bufferish.isBuffer(value) && Bufferish.isView(value)) {
|
|
28
|
+
// TypedArray to Uint8Array
|
|
29
|
+
value = Bufferish.Uint8Array.from(value);
|
|
30
|
+
} else if (Bufferish.isArrayBuffer(value)) {
|
|
31
|
+
// ArrayBuffer to Uint8Array
|
|
32
|
+
value = new Uint8Array(value);
|
|
33
|
+
} else if (typeof value === "string") {
|
|
34
|
+
// String to Buffer
|
|
35
|
+
return Bufferish.from.call(exports, value);
|
|
36
|
+
} else if (typeof value === "number") {
|
|
37
|
+
throw new TypeError('"value" argument must not be a number');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Array-like to Buffer
|
|
41
|
+
if (Buffer.from && Buffer.from.length !== 1) {
|
|
42
|
+
return Buffer.from(value); // node v6+
|
|
43
|
+
} else {
|
|
44
|
+
return new Buffer(value); // node v4
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// bufferish-proto.js
|
|
2
|
+
|
|
3
|
+
/* jshint eqnull:true */
|
|
4
|
+
|
|
5
|
+
var BufferLite = require("./buffer-lite");
|
|
6
|
+
|
|
7
|
+
exports.copy = copy;
|
|
8
|
+
exports.slice = slice;
|
|
9
|
+
exports.toString = toString;
|
|
10
|
+
exports.write = gen("write");
|
|
11
|
+
|
|
12
|
+
var Bufferish = require("./bufferish");
|
|
13
|
+
var Buffer = Bufferish.global;
|
|
14
|
+
|
|
15
|
+
var isBufferShim = Bufferish.hasBuffer && ("TYPED_ARRAY_SUPPORT" in Buffer);
|
|
16
|
+
var brokenTypedArray = isBufferShim && !Buffer.TYPED_ARRAY_SUPPORT;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param target {Buffer|Uint8Array|Array}
|
|
20
|
+
* @param [targetStart] {Number}
|
|
21
|
+
* @param [start] {Number}
|
|
22
|
+
* @param [end] {Number}
|
|
23
|
+
* @returns {Buffer|Uint8Array|Array}
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
function copy(target, targetStart, start, end) {
|
|
27
|
+
var thisIsBuffer = Bufferish.isBuffer(this);
|
|
28
|
+
var targetIsBuffer = Bufferish.isBuffer(target);
|
|
29
|
+
if (thisIsBuffer && targetIsBuffer) {
|
|
30
|
+
// Buffer to Buffer
|
|
31
|
+
return this.copy(target, targetStart, start, end);
|
|
32
|
+
} else if (!brokenTypedArray && !thisIsBuffer && !targetIsBuffer &&
|
|
33
|
+
Bufferish.isView(this) && Bufferish.isView(target)) {
|
|
34
|
+
// Uint8Array to Uint8Array (except for minor some browsers)
|
|
35
|
+
var buffer = (start || end != null) ? slice.call(this, start, end) : this;
|
|
36
|
+
target.set(buffer, targetStart);
|
|
37
|
+
return buffer.length;
|
|
38
|
+
} else {
|
|
39
|
+
// other cases
|
|
40
|
+
return BufferLite.copy.call(this, target, targetStart, start, end);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @param [start] {Number}
|
|
46
|
+
* @param [end] {Number}
|
|
47
|
+
* @returns {Buffer|Uint8Array|Array}
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
function slice(start, end) {
|
|
51
|
+
// for Buffer, Uint8Array (except for minor some browsers) and Array
|
|
52
|
+
var f = this.slice || (!brokenTypedArray && this.subarray);
|
|
53
|
+
if (f) return f.call(this, start, end);
|
|
54
|
+
|
|
55
|
+
// Uint8Array (for minor some browsers)
|
|
56
|
+
var target = Bufferish.alloc.call(this, end - start);
|
|
57
|
+
copy.call(this, target, 0, start, end);
|
|
58
|
+
return target;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Buffer.prototype.toString()
|
|
63
|
+
*
|
|
64
|
+
* @param [encoding] {String} ignored
|
|
65
|
+
* @param [start] {Number}
|
|
66
|
+
* @param [end] {Number}
|
|
67
|
+
* @returns {String}
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
function toString(encoding, start, end) {
|
|
71
|
+
var f = (!isBufferShim && Bufferish.isBuffer(this)) ? this.toString : BufferLite.toString;
|
|
72
|
+
return f.apply(this, arguments);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @private
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
function gen(method) {
|
|
80
|
+
return wrap;
|
|
81
|
+
|
|
82
|
+
function wrap() {
|
|
83
|
+
var f = this[method] || BufferLite[method];
|
|
84
|
+
return f.apply(this, arguments);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// bufferish-uint8array.js
|
|
2
|
+
|
|
3
|
+
var Bufferish = require("./bufferish");
|
|
4
|
+
|
|
5
|
+
var exports = module.exports = Bufferish.hasArrayBuffer ? alloc(0) : [];
|
|
6
|
+
|
|
7
|
+
exports.alloc = alloc;
|
|
8
|
+
exports.concat = Bufferish.concat;
|
|
9
|
+
exports.from = from;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param size {Number}
|
|
13
|
+
* @returns {Buffer|Uint8Array|Array}
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
function alloc(size) {
|
|
17
|
+
return new Uint8Array(size);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param value {Array|ArrayBuffer|Buffer|String}
|
|
22
|
+
* @returns {Uint8Array}
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
function from(value) {
|
|
26
|
+
if (Bufferish.isView(value)) {
|
|
27
|
+
// TypedArray to ArrayBuffer
|
|
28
|
+
var byteOffset = value.byteOffset;
|
|
29
|
+
var byteLength = value.byteLength;
|
|
30
|
+
value = value.buffer;
|
|
31
|
+
if (value.byteLength !== byteLength) {
|
|
32
|
+
if (value.slice) {
|
|
33
|
+
value = value.slice(byteOffset, byteOffset + byteLength);
|
|
34
|
+
} else {
|
|
35
|
+
// Android 4.1 does not have ArrayBuffer.prototype.slice
|
|
36
|
+
value = new Uint8Array(value);
|
|
37
|
+
if (value.byteLength !== byteLength) {
|
|
38
|
+
// TypedArray to ArrayBuffer to Uint8Array to Array
|
|
39
|
+
value = Array.prototype.slice.call(value, byteOffset, byteOffset + byteLength);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
} else if (typeof value === "string") {
|
|
44
|
+
// String to Uint8Array
|
|
45
|
+
return Bufferish.from.call(exports, value);
|
|
46
|
+
} else if (typeof value === "number") {
|
|
47
|
+
throw new TypeError('"value" argument must not be a number');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return new Uint8Array(value);
|
|
51
|
+
}
|
package/lib/bufferish.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// bufferish.js
|
|
2
|
+
|
|
3
|
+
var Buffer = exports.global = require("./buffer-global");
|
|
4
|
+
var hasBuffer = exports.hasBuffer = Buffer && !!Buffer.isBuffer;
|
|
5
|
+
var hasArrayBuffer = exports.hasArrayBuffer = ("undefined" !== typeof ArrayBuffer);
|
|
6
|
+
|
|
7
|
+
var isArray = exports.isArray = require("isarray");
|
|
8
|
+
exports.isArrayBuffer = hasArrayBuffer ? isArrayBuffer : _false;
|
|
9
|
+
var isBuffer = exports.isBuffer = hasBuffer ? Buffer.isBuffer : _false;
|
|
10
|
+
var isView = exports.isView = hasArrayBuffer ? (ArrayBuffer.isView || _is("ArrayBuffer", "buffer")) : _false;
|
|
11
|
+
|
|
12
|
+
exports.alloc = alloc;
|
|
13
|
+
exports.concat = concat;
|
|
14
|
+
exports.from = from;
|
|
15
|
+
|
|
16
|
+
var BufferArray = exports.Array = require("./bufferish-array");
|
|
17
|
+
var BufferBuffer = exports.Buffer = require("./bufferish-buffer");
|
|
18
|
+
var BufferUint8Array = exports.Uint8Array = require("./bufferish-uint8array");
|
|
19
|
+
var BufferProto = exports.prototype = require("./bufferish-proto");
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param value {Array|ArrayBuffer|Buffer|String}
|
|
23
|
+
* @returns {Buffer|Uint8Array|Array}
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
function from(value) {
|
|
27
|
+
if (typeof value === "string") {
|
|
28
|
+
return fromString.call(this, value);
|
|
29
|
+
} else {
|
|
30
|
+
return auto(this).from(value);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @param size {Number}
|
|
36
|
+
* @returns {Buffer|Uint8Array|Array}
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
function alloc(size) {
|
|
40
|
+
return auto(this).alloc(size);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param list {Array} array of (Buffer|Uint8Array|Array)s
|
|
45
|
+
* @param [length]
|
|
46
|
+
* @returns {Buffer|Uint8Array|Array}
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
function concat(list, length) {
|
|
50
|
+
if (!length) {
|
|
51
|
+
length = 0;
|
|
52
|
+
Array.prototype.forEach.call(list, dryrun);
|
|
53
|
+
}
|
|
54
|
+
var ref = (this !== exports) && this || list[0];
|
|
55
|
+
var result = alloc.call(ref, length);
|
|
56
|
+
var offset = 0;
|
|
57
|
+
Array.prototype.forEach.call(list, append);
|
|
58
|
+
return result;
|
|
59
|
+
|
|
60
|
+
function dryrun(buffer) {
|
|
61
|
+
length += buffer.length;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function append(buffer) {
|
|
65
|
+
offset += BufferProto.copy.call(buffer, result, offset);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
var _isArrayBuffer = _is("ArrayBuffer");
|
|
70
|
+
|
|
71
|
+
function isArrayBuffer(value) {
|
|
72
|
+
return (value instanceof ArrayBuffer) || _isArrayBuffer(value);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @private
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
function fromString(value) {
|
|
80
|
+
var expected = value.length * 3;
|
|
81
|
+
var that = alloc.call(this, expected);
|
|
82
|
+
var actual = BufferProto.write.call(that, value);
|
|
83
|
+
if (expected !== actual) {
|
|
84
|
+
that = BufferProto.slice.call(that, 0, actual);
|
|
85
|
+
}
|
|
86
|
+
return that;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function auto(that) {
|
|
90
|
+
return isBuffer(that) ? BufferBuffer
|
|
91
|
+
: isView(that) ? BufferUint8Array
|
|
92
|
+
: isArray(that) ? BufferArray
|
|
93
|
+
: hasBuffer ? BufferBuffer
|
|
94
|
+
: hasArrayBuffer ? BufferUint8Array
|
|
95
|
+
: BufferArray;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function _false() {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function _is(name, key) {
|
|
103
|
+
/* jshint eqnull:true */
|
|
104
|
+
name = "[object " + name + "]";
|
|
105
|
+
return function(value) {
|
|
106
|
+
return (value != null) && {}.toString.call(key ? value[key] : value) === name;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// codec-base.js
|
|
2
|
+
|
|
3
|
+
var IS_ARRAY = require("isarray");
|
|
4
|
+
|
|
5
|
+
exports.createCodec = createCodec;
|
|
6
|
+
exports.install = install;
|
|
7
|
+
exports.filter = filter;
|
|
8
|
+
|
|
9
|
+
var Bufferish = require("./bufferish");
|
|
10
|
+
|
|
11
|
+
function Codec(options) {
|
|
12
|
+
if (!(this instanceof Codec)) return new Codec(options);
|
|
13
|
+
this.options = options;
|
|
14
|
+
this.init();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
Codec.prototype.init = function() {
|
|
18
|
+
var options = this.options;
|
|
19
|
+
|
|
20
|
+
if (options && options.uint8array) {
|
|
21
|
+
this.bufferish = Bufferish.Uint8Array;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return this;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function install(props) {
|
|
28
|
+
for (var key in props) {
|
|
29
|
+
Codec.prototype[key] = add(Codec.prototype[key], props[key]);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function add(a, b) {
|
|
34
|
+
return (a && b) ? ab : (a || b);
|
|
35
|
+
|
|
36
|
+
function ab() {
|
|
37
|
+
a.apply(this, arguments);
|
|
38
|
+
return b.apply(this, arguments);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function join(filters) {
|
|
43
|
+
filters = filters.slice();
|
|
44
|
+
|
|
45
|
+
return function(value) {
|
|
46
|
+
return filters.reduce(iterator, value);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
function iterator(value, filter) {
|
|
50
|
+
return filter(value);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function filter(filter) {
|
|
55
|
+
return IS_ARRAY(filter) ? join(filter) : filter;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// @public
|
|
59
|
+
// msgpack.createCodec()
|
|
60
|
+
|
|
61
|
+
function createCodec(options) {
|
|
62
|
+
return new Codec(options);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// default shared codec
|
|
66
|
+
|
|
67
|
+
exports.preset = createCodec({preset: true});
|
package/lib/codec.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
// codec.js
|
|
2
2
|
|
|
3
|
+
// load both interfaces
|
|
4
|
+
require("./read-core");
|
|
5
|
+
require("./write-core");
|
|
6
|
+
|
|
7
|
+
// @public
|
|
8
|
+
// msgpack.codec.preset
|
|
9
|
+
|
|
3
10
|
exports.codec = {
|
|
4
|
-
preset: require("./
|
|
11
|
+
preset: require("./codec-base").preset
|
|
5
12
|
};
|
package/lib/decode-buffer.js
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
exports.DecodeBuffer = DecodeBuffer;
|
|
4
4
|
|
|
5
|
-
var preset = require("./
|
|
5
|
+
var preset = require("./read-core").preset;
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var FlexDecoder = require("./flex-buffer").FlexDecoder;
|
|
8
|
+
|
|
9
|
+
FlexDecoder.mixin(DecodeBuffer.prototype);
|
|
8
10
|
|
|
9
11
|
function DecodeBuffer(options) {
|
|
10
12
|
if (!(this instanceof DecodeBuffer)) return new DecodeBuffer(options);
|
|
@@ -12,60 +14,14 @@ function DecodeBuffer(options) {
|
|
|
12
14
|
if (options) {
|
|
13
15
|
this.options = options;
|
|
14
16
|
if (options.codec) {
|
|
15
|
-
this.codec = options.codec;
|
|
17
|
+
var codec = this.codec = options.codec;
|
|
18
|
+
if (codec.bufferish) this.bufferish = codec.bufferish;
|
|
16
19
|
}
|
|
17
20
|
}
|
|
18
21
|
}
|
|
19
22
|
|
|
20
|
-
DecodeBuffer.prototype.offset = 0;
|
|
21
|
-
|
|
22
|
-
DecodeBuffer.prototype.push = function(chunk) {
|
|
23
|
-
var buffers = this.buffers || (this.buffers = []);
|
|
24
|
-
buffers.push(chunk);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
23
|
DecodeBuffer.prototype.codec = preset;
|
|
28
24
|
|
|
29
|
-
DecodeBuffer.prototype.write = function(chunk) {
|
|
30
|
-
var prev = this.offset ? this.buffer.slice(this.offset) : this.buffer;
|
|
31
|
-
this.buffer = prev ? (chunk ? Buffer.concat([prev, chunk]) : prev) : chunk;
|
|
32
|
-
this.offset = 0;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
DecodeBuffer.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
|
-
DecodeBuffer.prototype.pull = function() {
|
|
49
|
-
var buffers = this.buffers || (this.buffers = []);
|
|
50
|
-
return buffers.shift();
|
|
51
|
-
};
|
|
52
|
-
|
|
53
25
|
DecodeBuffer.prototype.fetch = function() {
|
|
54
26
|
return this.codec.decode(this);
|
|
55
27
|
};
|
|
56
|
-
|
|
57
|
-
DecodeBuffer.prototype.flush = function() {
|
|
58
|
-
while (this.offset < this.buffer.length) {
|
|
59
|
-
var start = this.offset;
|
|
60
|
-
var value;
|
|
61
|
-
try {
|
|
62
|
-
value = this.fetch();
|
|
63
|
-
} catch (e) {
|
|
64
|
-
if (!(e instanceof BufferShortageError)) throw e;
|
|
65
|
-
// rollback
|
|
66
|
-
this.offset = start;
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
this.push(value);
|
|
70
|
-
}
|
|
71
|
-
};
|
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/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
|
+
}
|