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.
Files changed (56) hide show
  1. package/.npmignore +1 -0
  2. package/.travis.yml +4 -2
  3. package/.zuul.yml +3 -3
  4. package/Makefile +2 -2
  5. package/README.md +109 -12
  6. package/bower.json +34 -0
  7. package/dist/msgpack.min.js +2 -2
  8. package/lib/buffer-global.js +11 -0
  9. package/lib/buffer-lite.js +88 -64
  10. package/lib/bufferish-array.js +41 -0
  11. package/lib/bufferish-buffer.js +46 -0
  12. package/lib/bufferish-proto.js +86 -0
  13. package/lib/bufferish-uint8array.js +51 -0
  14. package/lib/bufferish.js +108 -0
  15. package/lib/codec-base.js +67 -0
  16. package/lib/codec.js +10 -1
  17. package/lib/decode-buffer.js +16 -10
  18. package/lib/decode-stream.js +2 -3
  19. package/lib/decode.js +2 -3
  20. package/lib/decoder.js +2 -3
  21. package/lib/encode-buffer.js +15 -56
  22. package/lib/encode-stream.js +1 -2
  23. package/lib/encode.js +1 -2
  24. package/lib/encoder.js +1 -2
  25. package/lib/ext-buffer.js +3 -1
  26. package/lib/ext-packer.js +78 -0
  27. package/lib/ext-unpacker.js +81 -0
  28. package/lib/ext.js +5 -70
  29. package/lib/flex-buffer.js +194 -0
  30. package/lib/read-core.js +46 -25
  31. package/lib/read-format.js +118 -72
  32. package/lib/read-token.js +34 -4
  33. package/lib/write-core.js +64 -6
  34. package/lib/write-token.js +82 -42
  35. package/lib/write-type.js +218 -122
  36. package/lib/write-uint8.js +2 -2
  37. package/package.json +24 -12
  38. package/test/10.encode.js +50 -30
  39. package/test/11.decode.js +2 -0
  40. package/test/14.codec.js +95 -0
  41. package/test/15.useraw.js +92 -0
  42. package/test/16.binarraybuffer.js +91 -0
  43. package/test/17.uint8array.js +43 -0
  44. package/test/18.utf8.js +59 -0
  45. package/test/20.roundtrip.js +53 -33
  46. package/test/21.ext.js +2 -2
  47. package/test/23.extbuffer.js +44 -2
  48. package/test/24.int64.js +76 -0
  49. package/test/27.usemap.js +66 -0
  50. package/test/61.encode-only.js +26 -0
  51. package/test/62.decode-only.js +23 -0
  52. package/test/63.module-deps.js +77 -0
  53. package/lib/common.js +0 -3
  54. package/lib/ext-preset.js +0 -133
  55. package/lib/is-array.js +0 -3
  56. package/test/60.buffer-lite.js +0 -98
@@ -2,67 +2,26 @@
2
2
 
3
3
  exports.EncodeBuffer = EncodeBuffer;
4
4
 
5
- var preset = require("./ext-preset").preset;
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
- function EncodeBuffer(options) {
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.push = function(chunk) {
17
- var buffers = this.buffers || (this.buffers = []);
18
- buffers.push(chunk);
19
- };
9
+ FlexEncoder.mixin(EncodeBuffer.prototype);
20
10
 
21
- EncodeBuffer.prototype.read = function() {
22
- this.flush();
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
- EncodeBuffer.prototype.flush = function() {
31
- if (this.start < this.offset) {
32
- this.push(this.buffer.slice(this.start, this.offset));
33
- this.start = this.offset;
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.alloc = function(length) {
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.send = function(buffer) {
60
- var end = this.offset + buffer.length;
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
  };
@@ -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
- encode(this.encoder, chunk);
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
- encode(encoder, input);
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
- encode(this, chunk);
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-codec.js
1
+ // ext.js
2
2
 
3
- exports.Ext = Ext;
4
- exports.createCodec = createCodec;
3
+ // load both interfaces
4
+ require("./read-core");
5
+ require("./write-core");
5
6
 
6
- var ExtBuffer = require("./ext-buffer").ExtBuffer;
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
- exports.decode = decode;
4
- exports.decodeAsync = decodeAsync;
5
-
6
- var uint8 = require("./read-format").format.uint8;
7
- var token = require("./read-token").token;
8
- var BUFFER_SHORTAGE = require("./common").BUFFER_SHORTAGE;
9
-
10
- function decode(decoder) {
11
- var type = uint8(decoder);
12
- var func = token[type];
13
- if (!func) throw new Error("Invalid type: " + (type ? ("0x" + type.toString(16)) : type));
14
- return func(decoder);
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 decodeAsync(decoder) {
18
- while (decoder.offset < decoder.buffer.length) {
19
- var start = decoder.offset;
20
- var value;
21
- try {
22
- value = decode(decoder);
23
- } catch (e) {
24
- if (e !== BUFFER_SHORTAGE) throw e;
25
- // rollback
26
- decoder.offset = start;
27
- break;
28
- }
29
- decoder.push(value);
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
  }