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.
Files changed (45) hide show
  1. package/.npmignore +1 -0
  2. package/.travis.yml +1 -0
  3. package/.zuul.yml +1 -1
  4. package/Makefile +2 -2
  5. package/README.md +27 -7
  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/encode-buffer.js +6 -79
  18. package/lib/ext-buffer.js +3 -1
  19. package/lib/ext-packer.js +78 -0
  20. package/lib/ext-unpacker.js +81 -0
  21. package/lib/ext.js +4 -77
  22. package/lib/flex-buffer.js +194 -0
  23. package/lib/read-core.js +36 -2
  24. package/lib/read-format.js +83 -56
  25. package/lib/read-token.js +1 -1
  26. package/lib/write-core.js +55 -2
  27. package/lib/write-token.js +54 -26
  28. package/lib/write-type.js +81 -73
  29. package/lib/write-uint8.js +2 -2
  30. package/package.json +23 -13
  31. package/test/10.encode.js +50 -30
  32. package/test/11.decode.js +2 -0
  33. package/test/14.codec.js +8 -1
  34. package/test/16.binarraybuffer.js +91 -0
  35. package/test/17.uint8array.js +43 -0
  36. package/test/18.utf8.js +59 -0
  37. package/test/20.roundtrip.js +53 -33
  38. package/test/23.extbuffer.js +44 -2
  39. package/test/27.usemap.js +66 -0
  40. package/test/61.encode-only.js +26 -0
  41. package/test/62.decode-only.js +23 -0
  42. package/test/63.module-deps.js +77 -0
  43. package/lib/buffer-shortage.js +0 -8
  44. package/lib/ext-preset.js +0 -188
  45. package/test/60.buffer-lite.js +0 -98
@@ -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,80 +1,7 @@
1
1
  // ext.js
2
2
 
3
- var IS_ARRAY = require("isarray");
3
+ // load both interfaces
4
+ require("./read-core");
5
+ require("./write-core");
4
6
 
5
- exports.createCodec = createCodec;
6
-
7
- var ExtBuffer = require("./ext-buffer").ExtBuffer;
8
- var ExtPreset = require("./ext-preset");
9
- var ReadCore = require("./read-core");
10
- var WriteCore = require("./write-core");
11
-
12
- function Codec(options) {
13
- if (!(this instanceof Codec)) return new Codec(options);
14
- this.extPackers = {};
15
- this.extUnpackers = [];
16
- this.encode = WriteCore.getEncoder(options);
17
- this.decode = ReadCore.getDecoder(options);
18
- if (options && options.preset) {
19
- ExtPreset.setExtPreset(this);
20
- }
21
- }
22
-
23
- function createCodec(options) {
24
- return new Codec(options);
25
- }
26
-
27
- Codec.prototype.addExtPacker = function(etype, Class, packer) {
28
- if (IS_ARRAY(packer)) {
29
- packer = join(packer);
30
- }
31
- var name = Class.name;
32
- if (name && name !== "Object") {
33
- this.extPackers[name] = extPacker;
34
- } else {
35
- var list = this.extEncoderList || (this.extEncoderList = []);
36
- list.unshift([Class, extPacker]);
37
- }
38
-
39
- function extPacker(value) {
40
- var buffer = packer(value);
41
- return new ExtBuffer(buffer, etype);
42
- }
43
- };
44
-
45
- Codec.prototype.addExtUnpacker = function(etype, unpacker) {
46
- this.extUnpackers[etype] = IS_ARRAY(unpacker) ? join(unpacker) : unpacker;
47
- };
48
-
49
- Codec.prototype.getExtPacker = function(value) {
50
- var c = value.constructor;
51
- var e = c && c.name && this.extPackers[c.name];
52
- if (e) return e;
53
- var list = this.extEncoderList;
54
- if (!list) return;
55
- var len = list.length;
56
- for (var i = 0; i < len; i++) {
57
- var pair = list[i];
58
- if (c === pair[0]) return pair[1];
59
- }
60
- };
61
-
62
- Codec.prototype.getExtUnpacker = function(type) {
63
- return this.extUnpackers[type] || extUnpacker;
64
-
65
- function extUnpacker(buffer) {
66
- return new ExtBuffer(buffer, type);
67
- }
68
- };
69
-
70
- function join(filters) {
71
- filters = filters.slice();
72
-
73
- return function(value) {
74
- return filters.reduce(iterator, value);
75
- };
76
-
77
- function iterator(value, filter) {
78
- return filter(value);
79
- }
80
- }
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,9 +1,18 @@
1
1
  // read-core.js
2
2
 
3
- exports.getDecoder = getDecoder;
4
-
3
+ var ExtBuffer = require("./ext-buffer").ExtBuffer;
4
+ var ExtUnpacker = require("./ext-unpacker");
5
5
  var readUint8 = require("./read-format").readUint8;
6
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);
7
16
 
8
17
  function getDecoder(options) {
9
18
  var readToken = ReadToken.getReadToken(options);
@@ -16,3 +25,28 @@ function getDecoder(options) {
16
25
  return func(decoder);
17
26
  }
18
27
  }
28
+
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);
51
+ }
52
+ }
@@ -8,40 +8,39 @@ var Int64BE = Int64Buffer.Int64BE;
8
8
  exports.getReadFormat = getReadFormat;
9
9
  exports.readUint8 = uint8;
10
10
 
11
- var BufferLite = require("./buffer-lite");
12
- var BufferShortageError = require("./buffer-shortage").BufferShortageError;
11
+ var Bufferish = require("./bufferish");
12
+ var BufferProto = require("./bufferish-proto");
13
13
 
14
- var IS_BUFFER_SHIM = ("TYPED_ARRAY_SUPPORT" in Buffer);
14
+ var HAS_MAP = ("undefined" !== typeof Map);
15
15
  var NO_ASSERT = true;
16
16
 
17
17
  function getReadFormat(options) {
18
+ var binarraybuffer = Bufferish.hasArrayBuffer && options && options.binarraybuffer;
19
+ var int64 = options && options.int64;
20
+ var usemap = HAS_MAP && options && options.usemap;
21
+
18
22
  var readFormat = {
19
- map: map,
23
+ map: (usemap ? map_to_map : map_to_obj),
20
24
  array: array,
21
25
  str: str,
22
- bin: bin,
26
+ bin: (binarraybuffer ? bin_arraybuffer : bin_buffer),
23
27
  ext: ext,
24
28
  uint8: uint8,
25
29
  uint16: uint16,
26
- uint32: read(4, Buffer.prototype.readUInt32BE),
27
- uint64: read(8, readUInt64BE),
28
- int8: read(1, Buffer.prototype.readInt8),
29
- int16: read(2, Buffer.prototype.readInt16BE),
30
- int32: read(4, Buffer.prototype.readInt32BE),
31
- int64: read(8, readInt64BE),
30
+ uint32: uint32,
31
+ uint64: read(8, int64 ? readUInt64BE_int64 : readUInt64BE),
32
+ int8: int8,
33
+ int16: int16,
34
+ int32: int32,
35
+ int64: read(8, int64 ? readInt64BE_int64 : readInt64BE),
32
36
  float32: read(4, readFloatBE),
33
37
  float64: read(8, readDoubleBE)
34
38
  };
35
39
 
36
- if (options && options.int64) {
37
- readFormat.uint64 = read(8, readUInt64BE_int64);
38
- readFormat.int64 = read(8, readInt64BE_int64);
39
- }
40
-
41
40
  return readFormat;
42
41
  }
43
42
 
44
- function map(decoder, len) {
43
+ function map_to_obj(decoder, len) {
45
44
  var value = {};
46
45
  var i;
47
46
  var k = new Array(len);
@@ -58,6 +57,23 @@ function map(decoder, len) {
58
57
  return value;
59
58
  }
60
59
 
60
+ function map_to_map(decoder, len) {
61
+ var value = new Map();
62
+ var i;
63
+ var k = new Array(len);
64
+ var v = new Array(len);
65
+
66
+ var decode = decoder.codec.decode;
67
+ for (i = 0; i < len; i++) {
68
+ k[i] = decode(decoder);
69
+ v[i] = decode(decoder);
70
+ }
71
+ for (i = 0; i < len; i++) {
72
+ value.set(k[i], v[i]);
73
+ }
74
+ return value;
75
+ }
76
+
61
77
  function array(decoder, len) {
62
78
  var value = new Array(len);
63
79
  var decode = decoder.codec.decode;
@@ -68,54 +84,74 @@ function array(decoder, len) {
68
84
  }
69
85
 
70
86
  function str(decoder, len) {
71
- var start = decoder.offset;
72
- var end = decoder.offset = start + len;
73
- var buffer = decoder.buffer;
74
- if (end > buffer.length) throw new BufferShortageError();
75
- if (IS_BUFFER_SHIM || !Buffer.isBuffer(buffer)) {
76
- // slower (compat)
77
- return BufferLite.readString.call(buffer, start, end);
78
- } else {
79
- // 2x faster
80
- return buffer.toString("utf-8", start, end);
81
- }
87
+ var start = decoder.reserve(len);
88
+ var end = start + len;
89
+ return BufferProto.toString.call(decoder.buffer, "utf-8", start, end);
90
+ }
91
+
92
+ function bin_buffer(decoder, len) {
93
+ var start = decoder.reserve(len);
94
+ var end = start + len;
95
+ var buf = BufferProto.slice.call(decoder.buffer, start, end);
96
+ return Bufferish.from(buf);
82
97
  }
83
98
 
84
- function bin(decoder, len) {
85
- var start = decoder.offset;
86
- var end = decoder.offset = start + len;
87
- if (end > decoder.buffer.length) throw new BufferShortageError();
88
- return slice.call(decoder.buffer, start, end);
99
+ function bin_arraybuffer(decoder, len) {
100
+ var start = decoder.reserve(len);
101
+ var end = start + len;
102
+ var buf = BufferProto.slice.call(decoder.buffer, start, end);
103
+ return Bufferish.Uint8Array.from(buf).buffer;
89
104
  }
90
105
 
91
106
  function ext(decoder, len) {
92
- var start = decoder.offset;
93
- var end = decoder.offset = start + len + 1;
94
- if (end > decoder.buffer.length) throw new BufferShortageError();
95
- var type = decoder.buffer[start];
107
+ var start = decoder.reserve(len+1);
108
+ var type = decoder.buffer[start++];
109
+ var end = start + len;
96
110
  var unpack = decoder.codec.getExtUnpacker(type);
97
111
  if (!unpack) throw new Error("Invalid ext type: " + (type ? ("0x" + type.toString(16)) : type));
98
- var buf = slice.call(decoder.buffer, start + 1, end);
112
+ var buf = BufferProto.slice.call(decoder.buffer, start, end);
99
113
  return unpack(buf);
100
114
  }
101
115
 
102
116
  function uint8(decoder) {
103
- var buffer = decoder.buffer;
104
- if (decoder.offset >= buffer.length) throw new BufferShortageError();
105
- return buffer[decoder.offset++];
117
+ var start = decoder.reserve(1);
118
+ return decoder.buffer[start];
119
+ }
120
+
121
+ function int8(decoder) {
122
+ var start = decoder.reserve(1);
123
+ var value = decoder.buffer[start];
124
+ return (value & 0x80) ? value - 0x100 : value;
106
125
  }
107
126
 
108
127
  function uint16(decoder) {
128
+ var start = decoder.reserve(2);
129
+ var buffer = decoder.buffer;
130
+ return (buffer[start++] << 8) | buffer[start];
131
+ }
132
+
133
+ function int16(decoder) {
134
+ var start = decoder.reserve(2);
109
135
  var buffer = decoder.buffer;
110
- if (decoder.offset + 2 > buffer.length) throw new BufferShortageError();
111
- return (buffer[decoder.offset++] << 8) | buffer[decoder.offset++];
136
+ var value = (buffer[start++] << 8) | buffer[start];
137
+ return (value & 0x8000) ? value - 0x10000 : value;
138
+ }
139
+
140
+ function uint32(decoder) {
141
+ var start = decoder.reserve(4);
142
+ var buffer = decoder.buffer;
143
+ return (buffer[start++] * 16777216) + (buffer[start++] << 16) + (buffer[start++] << 8) + buffer[start];
144
+ }
145
+
146
+ function int32(decoder) {
147
+ var start = decoder.reserve(4);
148
+ var buffer = decoder.buffer;
149
+ return (buffer[start++] << 24) | (buffer[start++] << 16) | (buffer[start++] << 8) | buffer[start];
112
150
  }
113
151
 
114
152
  function read(len, method) {
115
153
  return function(decoder) {
116
- var start = decoder.offset;
117
- var end = decoder.offset = start + len;
118
- if (end > decoder.buffer.length) throw new BufferShortageError();
154
+ var start = decoder.reserve(len);
119
155
  return method.call(decoder.buffer, start, NO_ASSERT);
120
156
  };
121
157
  }
@@ -137,18 +173,9 @@ function readInt64BE_int64(start) {
137
173
  }
138
174
 
139
175
  function readFloatBE(start) {
140
- if (this.readFloatBE) return this.readFloatBE(start);
141
176
  return ieee754.read(this, start, false, 23, 4);
142
177
  }
143
178
 
144
179
  function readDoubleBE(start) {
145
- if (this.readDoubleBE) return this.readDoubleBE(start);
146
180
  return ieee754.read(this, start, false, 52, 8);
147
- }
148
-
149
- function slice(start, end) {
150
- var f = this.slice || Array.prototype.slice;
151
- var buf = f.call(this, start, end);
152
- if (!Buffer.isBuffer(buf)) buf = Buffer(buf);
153
- return buf;
154
- }
181
+ }
package/lib/read-token.js CHANGED
@@ -124,7 +124,7 @@ function init_token(format) {
124
124
 
125
125
  function init_useraw(format) {
126
126
  var i;
127
- var token = getReadToken(format).slice();
127
+ var token = init_token(format).slice();
128
128
 
129
129
  // raw 8 -- 0xd9
130
130
  // raw 16 -- 0xda
package/lib/write-core.js CHANGED
@@ -1,8 +1,17 @@
1
1
  // write-core.js
2
2
 
3
- exports.getEncoder = getEncoder;
4
-
3
+ var ExtBuffer = require("./ext-buffer").ExtBuffer;
4
+ var ExtPacker = require("./ext-packer");
5
5
  var WriteType = require("./write-type");
6
+ var CodecBase = require("./codec-base");
7
+
8
+ CodecBase.install({
9
+ addExtPacker: addExtPacker,
10
+ getExtPacker: getExtPacker,
11
+ init: init
12
+ });
13
+
14
+ exports.preset = init.call(CodecBase.preset);
6
15
 
7
16
  function getEncoder(options) {
8
17
  var writeType = WriteType.getWriteType(options);
@@ -14,3 +23,47 @@ function getEncoder(options) {
14
23
  func(encoder, value);
15
24
  }
16
25
  }
26
+
27
+ function init() {
28
+ var options = this.options;
29
+ this.encode = getEncoder(options);
30
+
31
+ if (options && options.preset) {
32
+ ExtPacker.setExtPackers(this);
33
+ }
34
+
35
+ return this;
36
+ }
37
+
38
+ function addExtPacker(etype, Class, packer) {
39
+ packer = CodecBase.filter(packer);
40
+ var name = Class.name;
41
+ if (name && name !== "Object") {
42
+ var packers = this.extPackers || (this.extPackers = {});
43
+ packers[name] = extPacker;
44
+ } else {
45
+ // fallback for IE
46
+ var list = this.extEncoderList || (this.extEncoderList = []);
47
+ list.unshift([Class, extPacker]);
48
+ }
49
+
50
+ function extPacker(value) {
51
+ if (packer) value = packer(value);
52
+ return new ExtBuffer(value, etype);
53
+ }
54
+ }
55
+
56
+ function getExtPacker(value) {
57
+ var packers = this.extPackers || (this.extPackers = {});
58
+ var c = value.constructor;
59
+ var e = c && c.name && packers[c.name];
60
+ if (e) return e;
61
+
62
+ // fallback for IE
63
+ var list = this.extEncoderList || (this.extEncoderList = []);
64
+ var len = list.length;
65
+ for (var i = 0; i < len; i++) {
66
+ var pair = list[i];
67
+ if (c === pair[0]) return pair[1];
68
+ }
69
+ }