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/buffer-lite.js
CHANGED
|
@@ -1,79 +1,115 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
var Int64Buffer = require("int64-buffer");
|
|
4
|
-
var Uint64BE = Int64Buffer.Uint64BE;
|
|
5
|
-
var Int64BE = Int64Buffer.Int64BE;
|
|
1
|
+
// buffer-lite.js
|
|
6
2
|
|
|
7
3
|
var MAXBUFLEN = 8192;
|
|
8
4
|
|
|
9
|
-
exports.writeString = writeString;
|
|
10
|
-
exports.readString = readString;
|
|
11
|
-
exports.byteLength = byteLength;
|
|
12
5
|
exports.copy = copy;
|
|
13
|
-
exports.
|
|
14
|
-
exports.
|
|
6
|
+
exports.toString = toString;
|
|
7
|
+
exports.write = write;
|
|
15
8
|
|
|
16
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Buffer.prototype.write()
|
|
11
|
+
*
|
|
12
|
+
* @param string {String}
|
|
13
|
+
* @param [offset] {Number}
|
|
14
|
+
* @returns {Number}
|
|
15
|
+
*/
|
|
17
16
|
|
|
18
|
-
function
|
|
17
|
+
function write(string, offset) {
|
|
19
18
|
var buffer = this;
|
|
20
|
-
var index =
|
|
19
|
+
var index = offset || (offset |= 0);
|
|
21
20
|
var length = string.length;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
var chr = 0;
|
|
22
|
+
var i = 0;
|
|
23
|
+
while (i < length) {
|
|
24
|
+
chr = string.charCodeAt(i++);
|
|
25
|
+
|
|
26
|
+
if (chr < 128) {
|
|
27
27
|
buffer[index++] = chr;
|
|
28
28
|
} else if (chr < 0x800) {
|
|
29
|
-
|
|
29
|
+
// 2 bytes
|
|
30
|
+
buffer[index++] = 0xC0 | (chr >>> 6);
|
|
30
31
|
buffer[index++] = 0x80 | (chr & 0x3F);
|
|
32
|
+
} else if (chr < 0xD800 || chr > 0xDFFF) {
|
|
33
|
+
// 3 bytes
|
|
34
|
+
buffer[index++] = 0xE0 | (chr >>> 12);
|
|
35
|
+
buffer[index++] = 0x80 | ((chr >>> 6) & 0x3F);
|
|
36
|
+
buffer[index++] = 0x80 | (chr & 0x3F);
|
|
31
37
|
} else {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
buffer[index++] =
|
|
38
|
+
// 4 bytes - surrogate pair
|
|
39
|
+
chr = (((chr - 0xD800) << 10) | (string.charCodeAt(i++) - 0xDC00)) + 0x10000;
|
|
40
|
+
buffer[index++] = 0xF0 | (chr >>> 18);
|
|
41
|
+
buffer[index++] = 0x80 | ((chr >>> 12) & 0x3F);
|
|
42
|
+
buffer[index++] = 0x80 | ((chr >>> 6) & 0x3F);
|
|
43
|
+
buffer[index++] = 0x80 | (chr & 0x3F);
|
|
35
44
|
}
|
|
36
45
|
}
|
|
37
|
-
return index -
|
|
46
|
+
return index - offset;
|
|
38
47
|
}
|
|
39
48
|
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Buffer.prototype.toString()
|
|
51
|
+
*
|
|
52
|
+
* @param [encoding] {String} ignored
|
|
53
|
+
* @param [start] {Number}
|
|
54
|
+
* @param [end] {Number}
|
|
55
|
+
* @returns {String}
|
|
56
|
+
*/
|
|
42
57
|
|
|
43
|
-
function
|
|
58
|
+
function toString(encoding, start, end) {
|
|
44
59
|
var buffer = this;
|
|
45
|
-
var index = start
|
|
60
|
+
var index = start|0;
|
|
46
61
|
if (!end) end = buffer.length;
|
|
47
|
-
var
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
(chr < 0xE0) ? (((chr & 0x3F) << 6) | (buffer[index++] & 0x3F)) :
|
|
56
|
-
(((chr & 0x3F) << 12) | ((buffer[index++] & 0x3F) << 6) | ((buffer[index++] & 0x3F)));
|
|
57
|
-
array[pos++] = chr;
|
|
62
|
+
var string = '';
|
|
63
|
+
var chr = 0;
|
|
64
|
+
|
|
65
|
+
while (index < end) {
|
|
66
|
+
chr = buffer[index++];
|
|
67
|
+
if (chr < 128) {
|
|
68
|
+
string += String.fromCharCode(chr);
|
|
69
|
+
continue;
|
|
58
70
|
}
|
|
59
|
-
if (pos < size) array = array.slice(0, pos);
|
|
60
|
-
out.push(String.fromCharCode.apply("", array));
|
|
61
|
-
}
|
|
62
|
-
return (out.length > 1) ? out.join("") : out.length ? out.shift() : "";
|
|
63
|
-
}
|
|
64
71
|
|
|
65
|
-
|
|
72
|
+
if ((chr & 0xE0) === 0xC0) {
|
|
73
|
+
// 2 bytes
|
|
74
|
+
chr = (chr & 0x1F) << 6 |
|
|
75
|
+
(buffer[index++] & 0x3F);
|
|
76
|
+
|
|
77
|
+
} else if ((chr & 0xF0) === 0xE0) {
|
|
78
|
+
// 3 bytes
|
|
79
|
+
chr = (chr & 0x0F) << 12 |
|
|
80
|
+
(buffer[index++] & 0x3F) << 6 |
|
|
81
|
+
(buffer[index++] & 0x3F);
|
|
82
|
+
|
|
83
|
+
} else if ((chr & 0xF8) === 0xF0) {
|
|
84
|
+
// 4 bytes
|
|
85
|
+
chr = (chr & 0x07) << 18 |
|
|
86
|
+
(buffer[index++] & 0x3F) << 12 |
|
|
87
|
+
(buffer[index++] & 0x3F) << 6 |
|
|
88
|
+
(buffer[index++] & 0x3F);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (chr >= 0x010000) {
|
|
92
|
+
// A surrogate pair
|
|
93
|
+
chr -= 0x010000;
|
|
94
|
+
|
|
95
|
+
string += String.fromCharCode((chr >>> 10) + 0xD800, (chr & 0x3FF) + 0xDC00);
|
|
96
|
+
} else {
|
|
97
|
+
string += String.fromCharCode(chr);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
66
100
|
|
|
67
|
-
|
|
68
|
-
var length = 0 | 0;
|
|
69
|
-
Array.prototype.forEach.call(string, function(chr) {
|
|
70
|
-
var code = chr.charCodeAt(0);
|
|
71
|
-
length += (code < 0x80) ? 1 : (code < 0x800) ? 2 : 3;
|
|
72
|
-
});
|
|
73
|
-
return length;
|
|
101
|
+
return string;
|
|
74
102
|
}
|
|
75
103
|
|
|
76
|
-
|
|
104
|
+
/**
|
|
105
|
+
* Buffer.prototype.copy()
|
|
106
|
+
*
|
|
107
|
+
* @param target {Buffer}
|
|
108
|
+
* @param [targetStart] {Number}
|
|
109
|
+
* @param [start] {Number}
|
|
110
|
+
* @param [end] {Number}
|
|
111
|
+
* @returns {number}
|
|
112
|
+
*/
|
|
77
113
|
|
|
78
114
|
function copy(target, targetStart, start, end) {
|
|
79
115
|
var i;
|
|
@@ -96,11 +132,3 @@ function copy(target, targetStart, start, end) {
|
|
|
96
132
|
|
|
97
133
|
return len;
|
|
98
134
|
}
|
|
99
|
-
|
|
100
|
-
function writeUint64BE(value, offset) {
|
|
101
|
-
new Uint64BE(this, offset, value);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function writeInt64BE(value, offset) {
|
|
105
|
-
new Int64BE(this, offset, value);
|
|
106
|
-
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// bufferish-array.js
|
|
2
|
+
|
|
3
|
+
var Bufferish = require("./bufferish");
|
|
4
|
+
|
|
5
|
+
var exports = module.exports = 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 Array(size);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param value {Array|ArrayBuffer|Buffer|String}
|
|
22
|
+
* @returns {Array}
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
function from(value) {
|
|
26
|
+
if (!Bufferish.isBuffer(value) && Bufferish.isView(value)) {
|
|
27
|
+
// TypedArray to Uint8Array
|
|
28
|
+
value = Bufferish.Uint8Array.from(value);
|
|
29
|
+
} else if (Bufferish.isArrayBuffer(value)) {
|
|
30
|
+
// ArrayBuffer to Uint8Array
|
|
31
|
+
value = new Uint8Array(value);
|
|
32
|
+
} else if (typeof value === "string") {
|
|
33
|
+
// String to Array
|
|
34
|
+
return Bufferish.from.call(exports, value);
|
|
35
|
+
} else if (typeof value === "number") {
|
|
36
|
+
throw new TypeError('"value" argument must not be a number');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Array-like to Array
|
|
40
|
+
return Array.prototype.slice.call(value);
|
|
41
|
+
}
|
|
@@ -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 ? (Buffer.alloc ? Buffer.alloc(0) : 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/decode-stream.js
CHANGED
|
@@ -26,7 +26,11 @@ function DecodeStream(options) {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
DecodeStream.prototype._transform = function(chunk, encoding, callback) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
try {
|
|
30
|
+
this.decoder.write(chunk);
|
|
31
|
+
this.decoder.flush();
|
|
32
|
+
} catch(e) {
|
|
33
|
+
return callback(e);
|
|
34
|
+
}
|
|
35
|
+
callback();
|
|
32
36
|
};
|