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
@@ -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
+ }
@@ -1,21 +1,40 @@
1
1
  // write-token.js
2
2
 
3
- var BufferLite = require("./buffer-lite");
4
- var uint8 = require("./write-uint8").uint8;
3
+ var ieee754 = require("ieee754");
4
+ var Int64Buffer = require("int64-buffer");
5
+ var Uint64BE = Int64Buffer.Uint64BE;
6
+ var Int64BE = Int64Buffer.Int64BE;
5
7
 
6
- var IS_BUFFER_SHIM = ("TYPED_ARRAY_SUPPORT" in Buffer);
8
+ var uint8 = require("./write-uint8").uint8;
9
+ var Bufferish = require("./bufferish");
10
+ var Buffer = Bufferish.global;
11
+ var IS_BUFFER_SHIM = Bufferish.hasBuffer && ("TYPED_ARRAY_SUPPORT" in Buffer);
7
12
  var NO_TYPED_ARRAY = IS_BUFFER_SHIM && !Buffer.TYPED_ARRAY_SUPPORT;
13
+ var Buffer_prototype = Bufferish.hasBuffer && Buffer.prototype || {};
8
14
 
9
15
  exports.getWriteToken = getWriteToken;
10
16
 
11
17
  function getWriteToken(options) {
12
- if (NO_TYPED_ARRAY || (options && options.safe)) {
18
+ if (options && options.uint8array) {
19
+ return init_uint8array();
20
+ } else if (NO_TYPED_ARRAY || (Bufferish.hasBuffer && options && options.safe)) {
13
21
  return init_safe();
14
22
  } else {
15
23
  return init_token();
16
24
  }
17
25
  }
18
26
 
27
+ function init_uint8array() {
28
+ var token = init_token();
29
+
30
+ // float 32 -- 0xca
31
+ // float 64 -- 0xcb
32
+ token[0xca] = writeN(0xca, 4, writeFloatBE);
33
+ token[0xcb] = writeN(0xcb, 8, writeDoubleBE);
34
+
35
+ return token;
36
+ }
37
+
19
38
  // Node.js and browsers with TypedArray
20
39
 
21
40
  function init_token() {
@@ -43,8 +62,8 @@ function init_token() {
43
62
 
44
63
  // float 32 -- 0xca
45
64
  // float 64 -- 0xcb
46
- token[0xca] = writeN(0xca, 4, Buffer.prototype.writeFloatBE, true);
47
- token[0xcb] = writeN(0xcb, 8, Buffer.prototype.writeDoubleBE, true);
65
+ token[0xca] = writeN(0xca, 4, (Buffer_prototype.writeFloatBE || writeFloatBE), true);
66
+ token[0xcb] = writeN(0xcb, 8, (Buffer_prototype.writeDoubleBE || writeDoubleBE), true);
48
67
 
49
68
  // uint 8 -- 0xcc
50
69
  // uint 16 -- 0xcd
@@ -53,7 +72,7 @@ function init_token() {
53
72
  token[0xcc] = write1(0xcc);
54
73
  token[0xcd] = write2(0xcd);
55
74
  token[0xce] = write4(0xce);
56
- token[0xcf] = writeN(0xcf, 8, BufferLite.writeUint64BE);
75
+ token[0xcf] = writeN(0xcf, 8, writeUInt64BE);
57
76
 
58
77
  // int 8 -- 0xd0
59
78
  // int 16 -- 0xd1
@@ -62,7 +81,7 @@ function init_token() {
62
81
  token[0xd0] = write1(0xd0);
63
82
  token[0xd1] = write2(0xd1);
64
83
  token[0xd2] = write4(0xd2);
65
- token[0xd3] = writeN(0xd3, 8, BufferLite.writeUint64BE);
84
+ token[0xd3] = writeN(0xd3, 8, writeInt64BE);
66
85
 
67
86
  // str 8 -- 0xd9
68
87
  // str 16 -- 0xda
@@ -121,7 +140,7 @@ function init_safe() {
121
140
  token[0xcc] = writeN(0xcc, 1, Buffer.prototype.writeUInt8);
122
141
  token[0xcd] = writeN(0xcd, 2, Buffer.prototype.writeUInt16BE);
123
142
  token[0xce] = writeN(0xce, 4, Buffer.prototype.writeUInt32BE);
124
- token[0xcf] = writeN(0xcf, 8, BufferLite.writeUint64BE);
143
+ token[0xcf] = writeN(0xcf, 8, writeUInt64BE);
125
144
 
126
145
  // int 8 -- 0xd0
127
146
  // int 16 -- 0xd1
@@ -130,7 +149,7 @@ function init_safe() {
130
149
  token[0xd0] = writeN(0xd0, 1, Buffer.prototype.writeInt8);
131
150
  token[0xd1] = writeN(0xd1, 2, Buffer.prototype.writeInt16BE);
132
151
  token[0xd2] = writeN(0xd2, 4, Buffer.prototype.writeInt32BE);
133
- token[0xd3] = writeN(0xd3, 8, BufferLite.writeUint64BE);
152
+ token[0xd3] = writeN(0xd3, 8, writeInt64BE);
134
153
 
135
154
  // str 8 -- 0xd9
136
155
  // str 16 -- 0xda
@@ -154,46 +173,55 @@ function init_safe() {
154
173
 
155
174
  function write1(type) {
156
175
  return function(encoder, value) {
157
- encoder.reserve(2);
176
+ var offset = encoder.reserve(2);
158
177
  var buffer = encoder.buffer;
159
- var offset = encoder.offset;
160
178
  buffer[offset++] = type;
161
- buffer[offset++] = value;
162
- encoder.offset = offset;
179
+ buffer[offset] = value;
163
180
  };
164
181
  }
165
182
 
166
183
  function write2(type) {
167
184
  return function(encoder, value) {
168
- encoder.reserve(3);
185
+ var offset = encoder.reserve(3);
169
186
  var buffer = encoder.buffer;
170
- var offset = encoder.offset;
171
187
  buffer[offset++] = type;
172
188
  buffer[offset++] = value >>> 8;
173
- buffer[offset++] = value;
174
- encoder.offset = offset;
189
+ buffer[offset] = value;
175
190
  };
176
191
  }
177
192
 
178
193
  function write4(type) {
179
194
  return function(encoder, value) {
180
- encoder.reserve(5);
195
+ var offset = encoder.reserve(5);
181
196
  var buffer = encoder.buffer;
182
- var offset = encoder.offset;
183
197
  buffer[offset++] = type;
184
198
  buffer[offset++] = value >>> 24;
185
199
  buffer[offset++] = value >>> 16;
186
200
  buffer[offset++] = value >>> 8;
187
- buffer[offset++] = value;
188
- encoder.offset = offset;
201
+ buffer[offset] = value;
189
202
  };
190
203
  }
191
204
 
192
205
  function writeN(type, len, method, noAssert) {
193
206
  return function(encoder, value) {
194
- encoder.reserve(len + 1);
195
- encoder.buffer[encoder.offset++] = type;
196
- method.call(encoder.buffer, value, encoder.offset, noAssert);
197
- encoder.offset += len;
207
+ var offset = encoder.reserve(len + 1);
208
+ encoder.buffer[offset++] = type;
209
+ method.call(encoder.buffer, value, offset, noAssert);
198
210
  };
199
211
  }
212
+
213
+ function writeUInt64BE(value, offset) {
214
+ new Uint64BE(this, offset, value);
215
+ }
216
+
217
+ function writeInt64BE(value, offset) {
218
+ new Int64BE(this, offset, value);
219
+ }
220
+
221
+ function writeFloatBE(value, offset) {
222
+ ieee754.write(this, value, offset, false, 23, 4);
223
+ }
224
+
225
+ function writeDoubleBE(value, offset) {
226
+ ieee754.write(this, value, offset, false, 52, 8);
227
+ }
package/lib/write-type.js CHANGED
@@ -5,12 +5,14 @@ var Int64Buffer = require("int64-buffer");
5
5
  var Uint64BE = Int64Buffer.Uint64BE;
6
6
  var Int64BE = Int64Buffer.Int64BE;
7
7
 
8
- var BufferLite = require("./buffer-lite");
8
+ var Bufferish = require("./bufferish");
9
+ var BufferProto = require("./bufferish-proto");
9
10
  var WriteToken = require("./write-token");
10
11
  var uint8 = require("./write-uint8").uint8;
11
12
  var ExtBuffer = require("./ext-buffer").ExtBuffer;
12
13
 
13
- var IS_BUFFER_SHIM = ("TYPED_ARRAY_SUPPORT" in Buffer);
14
+ var HAS_UINT8ARRAY = ("undefined" !== typeof Uint8Array);
15
+ var HAS_MAP = ("undefined" !== typeof Map);
14
16
 
15
17
  var extmap = [];
16
18
  extmap[1] = 0xd4;
@@ -23,22 +25,23 @@ exports.getWriteType = getWriteType;
23
25
 
24
26
  function getWriteType(options) {
25
27
  var token = WriteToken.getWriteToken(options);
28
+ var useraw = options && options.useraw;
29
+ var binarraybuffer = HAS_UINT8ARRAY && options && options.binarraybuffer;
30
+ var isBuffer = binarraybuffer ? Bufferish.isArrayBuffer : Bufferish.isBuffer;
31
+ var bin = binarraybuffer ? bin_arraybuffer : bin_buffer;
32
+ var usemap = HAS_MAP && options && options.usemap;
33
+ var map = usemap ? map_to_map : obj_to_map;
26
34
 
27
35
  var writeType = {
28
36
  "boolean": bool,
29
37
  "function": nil,
30
38
  "number": number,
31
- "object": object,
32
- "string": string,
39
+ "object": (useraw ? object_raw : object),
40
+ "string": _string(useraw ? raw_head_size : str_head_size),
33
41
  "symbol": nil,
34
42
  "undefined": nil
35
43
  };
36
44
 
37
- if (options && options.useraw) {
38
- writeType.object = object_raw;
39
- writeType.string = string_raw;
40
- }
41
-
42
45
  return writeType;
43
46
 
44
47
  // false -- 0xc2
@@ -90,33 +93,53 @@ function getWriteType(options) {
90
93
  // str 16 -- 0xda
91
94
  // str 32 -- 0xdb
92
95
  // fixstr -- 0xa0 - 0xbf
93
- function string(encoder, value) {
94
- // prepare buffer
95
- var length = value.length;
96
- var maxsize = 5 + length * 3;
97
- encoder.reserve(maxsize);
96
+ function str_head_size(length) {
97
+ return (length < 32) ? 1 : (length <= 0xFF) ? 2 : (length <= 0xFFFF) ? 3 : 5;
98
+ }
98
99
 
99
- // expected header size
100
- var expected = (length < 32) ? 1 : (length <= 0xFF) ? 2 : (length <= 0xFFFF) ? 3 : 5;
100
+ // raw 16 -- 0xda
101
+ // raw 32 -- 0xdb
102
+ // fixraw -- 0xa0 - 0xbf
103
+ function raw_head_size(length) {
104
+ return (length < 32) ? 1 : (length <= 0xFFFF) ? 3 : 5;
105
+ }
101
106
 
102
- // expected start point
103
- var start = encoder.offset + expected;
107
+ function _string(head_size) {
108
+ return string;
104
109
 
105
- // write string
106
- length = BufferLite.writeString.call(encoder.buffer, value, start);
110
+ function string(encoder, value) {
111
+ // prepare buffer
112
+ var length = value.length;
113
+ var maxsize = 5 + length * 3;
114
+ encoder.offset = encoder.reserve(maxsize);
115
+ var buffer = encoder.buffer;
107
116
 
108
- // actual header size
109
- var actual = (length < 32) ? 1 : (length <= 0xFF) ? 2 : (length <= 0xFFFF) ? 3 : 5;
117
+ // expected header size
118
+ var expected = head_size(length);
110
119
 
111
- // move content when needed
112
- if (expected !== actual) move(encoder, start, length, actual - expected);
120
+ // expected start point
121
+ var start = encoder.offset + expected;
113
122
 
114
- // write header
115
- var type = (actual === 1) ? (0xa0 + length) : (actual <= 3) ? 0xd7 + actual : 0xdb;
116
- token[type](encoder, length);
123
+ // write string
124
+ length = BufferProto.write.call(buffer, value, start);
125
+
126
+ // actual header size
127
+ var actual = head_size(length);
128
+
129
+ // move content when needed
130
+ if (expected !== actual) {
131
+ var targetStart = start + actual - expected;
132
+ var end = start + length;
133
+ BufferProto.copy.call(buffer, buffer, targetStart, start, end);
134
+ }
117
135
 
118
- // move cursor
119
- encoder.offset += length;
136
+ // write header
137
+ var type = (actual === 1) ? (0xa0 + length) : (actual <= 3) ? (0xd7 + actual) : 0xdb;
138
+ token[type](encoder, length);
139
+
140
+ // move cursor
141
+ encoder.offset += length;
142
+ }
120
143
  }
121
144
 
122
145
  function object(encoder, value) {
@@ -124,7 +147,7 @@ function getWriteType(options) {
124
147
  if (value === null) return nil(encoder, value);
125
148
 
126
149
  // Buffer
127
- if (Buffer.isBuffer(value)) return bin(encoder, value);
150
+ if (isBuffer(value)) return bin(encoder, value);
128
151
 
129
152
  // Array
130
153
  if (IS_ARRAY(value)) return array(encoder, value);
@@ -138,10 +161,18 @@ function getWriteType(options) {
138
161
  if (packer) value = packer(value);
139
162
  if (value instanceof ExtBuffer) return ext(encoder, value);
140
163
 
141
- // plain old objects
164
+ // plain old Objects or Map
142
165
  map(encoder, value);
143
166
  }
144
167
 
168
+ function object_raw(encoder, value) {
169
+ // Buffer
170
+ if (isBuffer(value)) return raw(encoder, value);
171
+
172
+ // others
173
+ object(encoder, value);
174
+ }
175
+
145
176
  // nil -- 0xc0
146
177
  function nil(encoder, value) {
147
178
  var type = 0xc0;
@@ -165,13 +196,17 @@ function getWriteType(options) {
165
196
  // bin 8 -- 0xc4
166
197
  // bin 16 -- 0xc5
167
198
  // bin 32 -- 0xc6
168
- function bin(encoder, value) {
199
+ function bin_buffer(encoder, value) {
169
200
  var length = value.length;
170
201
  var type = (length < 0xFF) ? 0xc4 : (length <= 0xFFFF) ? 0xc5 : 0xc6;
171
202
  token[type](encoder, length);
172
203
  encoder.send(value);
173
204
  }
174
205
 
206
+ function bin_arraybuffer(encoder, value) {
207
+ bin_buffer(encoder, new Uint8Array(value));
208
+ }
209
+
175
210
  // fixext 1 -- 0xd4
176
211
  // fixext 2 -- 0xd5
177
212
  // fixext 4 -- 0xd6
@@ -192,7 +227,7 @@ function getWriteType(options) {
192
227
  // fixmap -- 0x80 - 0x8f
193
228
  // map 16 -- 0xde
194
229
  // map 32 -- 0xdf
195
- function map(encoder, value) {
230
+ function obj_to_map(encoder, value) {
196
231
  var keys = Object.keys(value);
197
232
  var length = keys.length;
198
233
  var type = (length < 16) ? (0x80 + length) : (length <= 0xFFFF) ? 0xde : 0xdf;
@@ -205,57 +240,30 @@ function getWriteType(options) {
205
240
  });
206
241
  }
207
242
 
208
- // raw 16 -- 0xda
209
- // raw 32 -- 0xdb
210
- // fixraw -- 0xa0 - 0xbf
211
- function string_raw(encoder, value) {
212
- // prepare buffer
213
- var length = value.length;
214
- var maxsize = 5 + length * 3;
215
- encoder.reserve(maxsize);
216
-
217
- // expected header size
218
- var expected = (length < 32) ? 1 : (length <= 0xFFFF) ? 3 : 5;
219
-
220
- // expected start point
221
- var start = encoder.offset + expected;
222
-
223
- // write string
224
- length = BufferLite.writeString.call(encoder.buffer, value, start);
225
-
226
- // actual header size
227
- var actual = (length < 32) ? 1 : (length <= 0xFFFF) ? 3 : 5;
228
-
229
- // move content when needed
230
- if (expected !== actual) move(encoder, start, length, actual - expected);
243
+ // fixmap -- 0x80 - 0x8f
244
+ // map 16 -- 0xde
245
+ // map 32 -- 0xdf
246
+ function map_to_map(encoder, value) {
247
+ if (!(value instanceof Map)) return obj_to_map(encoder, value);
231
248
 
232
- // write header
233
- var type = (length < 32) ? (0xa0 + length) : (length <= 0xFFFF) ? 0xda : 0xdb;
249
+ var length = value.size;
250
+ var type = (length < 16) ? (0x80 + length) : (length <= 0xFFFF) ? 0xde : 0xdf;
234
251
  token[type](encoder, length);
235
252
 
236
- // move cursor
237
- encoder.offset += length;
253
+ var encode = encoder.codec.encode;
254
+ value.forEach(function(val, key, m) {
255
+ encode(encoder, key);
256
+ encode(encoder, val);
257
+ });
238
258
  }
239
259
 
240
260
  // raw 16 -- 0xda
241
261
  // raw 32 -- 0xdb
242
262
  // fixraw -- 0xa0 - 0xbf
243
- function object_raw(encoder, value) {
244
- if (!Buffer.isBuffer(value)) return object(encoder, value);
245
-
263
+ function raw(encoder, value) {
246
264
  var length = value.length;
247
265
  var type = (length < 32) ? (0xa0 + length) : (length <= 0xFFFF) ? 0xda : 0xdb;
248
266
  token[type](encoder, length);
249
267
  encoder.send(value);
250
268
  }
251
269
  }
252
-
253
- function move(encoder, start, length, diff) {
254
- var targetStart = start + diff;
255
- var end = start + length;
256
- if (IS_BUFFER_SHIM) {
257
- BufferLite.copy.call(encoder.buffer, encoder.buffer, targetStart, start, end);
258
- } else {
259
- encoder.buffer.copy(encoder.buffer, targetStart, start, end);
260
- }
261
- }