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.
Files changed (55) hide show
  1. package/.github/workflows/nodejs.yml +23 -0
  2. package/.github/workflows/publish.yml +64 -0
  3. package/LICENSE +1 -1
  4. package/Makefile +8 -13
  5. package/README.md +28 -91
  6. package/dist/msgpack.min.js +2 -2
  7. package/lib/buffer-global.js +11 -0
  8. package/lib/buffer-lite.js +88 -60
  9. package/lib/bufferish-array.js +41 -0
  10. package/lib/bufferish-buffer.js +46 -0
  11. package/lib/bufferish-proto.js +86 -0
  12. package/lib/bufferish-uint8array.js +51 -0
  13. package/lib/bufferish.js +108 -0
  14. package/lib/codec-base.js +67 -0
  15. package/lib/codec.js +8 -1
  16. package/lib/decode-buffer.js +6 -50
  17. package/lib/decode-stream.js +7 -3
  18. package/lib/encode-buffer.js +6 -79
  19. package/lib/encode-stream.js +12 -4
  20. package/lib/ext-buffer.js +3 -1
  21. package/lib/ext-packer.js +78 -0
  22. package/lib/ext-unpacker.js +81 -0
  23. package/lib/ext.js +4 -77
  24. package/lib/flex-buffer.js +194 -0
  25. package/lib/read-core.js +36 -2
  26. package/lib/read-format.js +83 -56
  27. package/lib/read-token.js +1 -1
  28. package/lib/write-core.js +55 -2
  29. package/lib/write-token.js +54 -26
  30. package/lib/write-type.js +81 -73
  31. package/lib/write-uint8.js +2 -2
  32. package/package.json +22 -12
  33. package/test/10.encode.js +53 -33
  34. package/test/11.decode.js +16 -3
  35. package/test/14.codec.js +10 -3
  36. package/test/15.useraw.js +4 -4
  37. package/test/16.binarraybuffer.js +91 -0
  38. package/test/17.uint8array.js +43 -0
  39. package/test/18.utf8.js +59 -0
  40. package/test/20.roundtrip.js +54 -34
  41. package/test/23.extbuffer.js +46 -4
  42. package/test/27.usemap.js +66 -0
  43. package/test/30.stream.js +49 -1
  44. package/test/50.compat.js +6 -6
  45. package/test/61.encode-only.js +26 -0
  46. package/test/62.decode-only.js +23 -0
  47. package/test/63.module-deps.js +77 -0
  48. package/.npmignore +0 -7
  49. package/.travis.yml +0 -25
  50. package/.zuul.yml +0 -20
  51. package/bower.json +0 -34
  52. package/lib/buffer-shortage.js +0 -8
  53. package/lib/ext-preset.js +0 -188
  54. package/test/60.buffer-lite.js +0 -98
  55. package/test/zuul/ie.html +0 -4
@@ -1,79 +1,115 @@
1
- // util.js
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.writeUint64BE = writeUint64BE;
14
- exports.writeInt64BE = writeInt64BE;
6
+ exports.toString = toString;
7
+ exports.write = write;
15
8
 
16
- // new Buffer(string, "utf-8") is SLOWER then below
9
+ /**
10
+ * Buffer.prototype.write()
11
+ *
12
+ * @param string {String}
13
+ * @param [offset] {Number}
14
+ * @returns {Number}
15
+ */
17
16
 
18
- function writeString(string, start) {
17
+ function write(string, offset) {
19
18
  var buffer = this;
20
- var index = start || 0;
19
+ var index = offset || (offset |= 0);
21
20
  var length = string.length;
22
- // JavaScript's string uses UTF-16 surrogate pairs for characters other than BMP.
23
- // This encodes string as CESU-8 which never reaches 4 octets per character.
24
- for (var i = 0; i < length; i++) {
25
- var chr = string.charCodeAt(i);
26
- if (chr < 0x80) {
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
- buffer[index++] = 0xC0 | (chr >> 6);
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
- buffer[index++] = 0xE0 | (chr >> 12);
33
- buffer[index++] = 0x80 | ((chr >> 6) & 0x3F);
34
- buffer[index++] = 0x80 | (chr & 0x3F);
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 - start;
46
+ return index - offset;
38
47
  }
39
48
 
40
- // Buffer.ptototype.toString is 2x FASTER then below
41
- // https://github.com/feross/buffer may throw "Maximum call stack size exceeded." at String.fromCharCode.apply.
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 readString(start, end) {
58
+ function toString(encoding, start, end) {
44
59
  var buffer = this;
45
- var index = start - 0 || 0;
60
+ var index = start|0;
46
61
  if (!end) end = buffer.length;
47
- var size = end - start;
48
- if (size > MAXBUFLEN) size = MAXBUFLEN;
49
- var out = [];
50
- for (; index < end;) {
51
- var array = new Array(size);
52
- for (var pos = 0; pos < size && index < end;) {
53
- var chr = buffer[index++];
54
- chr = (chr < 0x80) ? chr :
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
- // Buffer.byteLength is FASTER than below
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
- function byteLength(string) {
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
- // https://github.com/feross/buffer lacks descending copying feature
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
+ }
@@ -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("./ext").createCodec({preset: true})
11
+ preset: require("./codec-base").preset
5
12
  };
@@ -2,9 +2,11 @@
2
2
 
3
3
  exports.DecodeBuffer = DecodeBuffer;
4
4
 
5
- var preset = require("./codec").codec.preset;
5
+ var preset = require("./read-core").preset;
6
6
 
7
- var BufferShortageError = require("./buffer-shortage").BufferShortageError;
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
- };
@@ -26,7 +26,11 @@ function DecodeStream(options) {
26
26
  }
27
27
 
28
28
  DecodeStream.prototype._transform = function(chunk, encoding, callback) {
29
- this.decoder.write(chunk);
30
- this.decoder.flush();
31
- if (callback) callback();
29
+ try {
30
+ this.decoder.write(chunk);
31
+ this.decoder.flush();
32
+ } catch(e) {
33
+ return callback(e);
34
+ }
35
+ callback();
32
36
  };