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
@@ -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
- }
@@ -8,7 +8,7 @@ for (var i = 0x00; i <= 0xFF; i++) {
8
8
 
9
9
  function write0(type) {
10
10
  return function(encoder) {
11
- encoder.reserve(1);
12
- encoder.buffer[encoder.offset++] = type;
11
+ var offset = encoder.reserve(1);
12
+ encoder.buffer[offset] = type;
13
13
  };
14
14
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "msgpack-lite",
3
3
  "description": "Fast Pure JavaScript MessagePack Encoder and Decoder",
4
- "version": "0.1.20",
4
+ "version": "0.1.26",
5
5
  "author": "@kawanet",
6
6
  "bin": {
7
7
  "msgpack": "./bin/msgpack"
@@ -11,26 +11,28 @@
11
11
  "url": "https://github.com/kawanet/msgpack-lite/issues"
12
12
  },
13
13
  "contributors": [
14
+ "Christopher Vermilion <chris@figlyinc.com>",
14
15
  "Frederik Dudzik <4004blog@gmail.com>",
15
16
  "Garrett Serack <gserack@gmail.com>",
16
17
  "Jesse Armand <jesse@jessearmand.com>",
17
- "Joshua Wise <josh@joshuawise.ninja>"
18
+ "Joshua Wise <josh@joshuawise.ninja>",
19
+ "Maciej Hirsz <maciej.hirsz@gmail.com>"
18
20
  ],
19
21
  "dependencies": {
20
22
  "event-lite": "^0.1.1",
21
- "ieee754": "^1.1.6",
22
- "int64-buffer": "^0.1.6",
23
+ "ieee754": "^1.1.8",
24
+ "int64-buffer": "^0.1.9",
23
25
  "isarray": "^1.0.0"
24
26
  },
25
27
  "devDependencies": {
26
- "async": "^1.5.2",
27
- "browserify": "^13.0.0",
28
- "concat-stream": "^1.5.1",
29
- "jshint": "^2.9.2",
30
- "mocha": "^2.4.5",
28
+ "async": "^2.1.1",
29
+ "browserify": "^13.1.0",
30
+ "concat-stream": "^1.5.2",
31
+ "jshint": "^2.9.3",
32
+ "mocha": "^3.1.2",
31
33
  "msgpack.codec": "git+https://github.com/kawanet/msgpack-javascript.git#msgpack.codec",
32
- "uglify-js": "^2.6.2",
33
- "zuul": "^3.10.1"
34
+ "uglify-js": "^2.7.3",
35
+ "zuul": "^3.11.1"
34
36
  },
35
37
  "homepage": "https://github.com/kawanet/msgpack-lite",
36
38
  "jshintConfig": {
@@ -38,6 +40,7 @@
38
40
  "globals": {
39
41
  "JSON": true,
40
42
  "Symbol": true,
43
+ "Map": true,
41
44
  "window": true
42
45
  },
43
46
  "mocha": true,
@@ -45,6 +48,7 @@
45
48
  "undef": true
46
49
  },
47
50
  "keywords": [
51
+ "arraybuffer",
48
52
  "buffer",
49
53
  "fluentd",
50
54
  "messagepack",
@@ -52,7 +56,6 @@
52
56
  "serialize",
53
57
  "stream",
54
58
  "typedarray",
55
- "arraybuffer",
56
59
  "uint8array"
57
60
  ],
58
61
  "license": "MIT",
@@ -62,6 +65,13 @@
62
65
  "url": "https://github.com/kawanet/msgpack-lite.git"
63
66
  },
64
67
  "scripts": {
65
- "test": "make test"
68
+ "benchmark": "./lib/benchmark.js",
69
+ "benchmark-lite": "./lib/benchmark.js msgpack-lite",
70
+ "benchmark-stream": "./lib/benchmark-stream.js",
71
+ "fixpack": "fixpack",
72
+ "make": "make",
73
+ "size": "make clean dist/msgpack.min.js && gzip -9fkv dist/msgpack.min.js && ls -l dist",
74
+ "test": "make test",
75
+ "test-browser-local": "make test-browser-local"
66
76
  }
67
77
  }