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
package/lib/write-type.js CHANGED
@@ -1,147 +1,212 @@
1
1
  // write-type.js
2
2
 
3
- exports.type = {
4
- "boolean": bool,
5
- "function": nil,
6
- "number": number,
7
- "object": object,
8
- "string": string,
9
- "symbol": nil,
10
- "undefined": nil
11
- };
12
-
13
- var BufferLite = require("./buffer-lite");
14
- var token = require("./write-token").token;
15
- var encode = require("./write-core").encode;
3
+ var IS_ARRAY = require("isarray");
4
+ var Int64Buffer = require("int64-buffer");
5
+ var Uint64BE = Int64Buffer.Uint64BE;
6
+ var Int64BE = Int64Buffer.Int64BE;
7
+
8
+ var Bufferish = require("./bufferish");
9
+ var BufferProto = require("./bufferish-proto");
10
+ var WriteToken = require("./write-token");
16
11
  var uint8 = require("./write-uint8").uint8;
17
12
  var ExtBuffer = require("./ext-buffer").ExtBuffer;
18
13
 
19
- var IS_BUFFER_SHIM = ("TYPED_ARRAY_SUPPORT" in Buffer);
20
- var IS_ARRAY = require('./is-array');
14
+ var HAS_UINT8ARRAY = ("undefined" !== typeof Uint8Array);
15
+ var HAS_MAP = ("undefined" !== typeof Map);
16
+
17
+ var extmap = [];
18
+ extmap[1] = 0xd4;
19
+ extmap[2] = 0xd5;
20
+ extmap[4] = 0xd6;
21
+ extmap[8] = 0xd7;
22
+ extmap[16] = 0xd8;
23
+
24
+ exports.getWriteType = getWriteType;
25
+
26
+ function getWriteType(options) {
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;
34
+
35
+ var writeType = {
36
+ "boolean": bool,
37
+ "function": nil,
38
+ "number": number,
39
+ "object": (useraw ? object_raw : object),
40
+ "string": _string(useraw ? raw_head_size : str_head_size),
41
+ "symbol": nil,
42
+ "undefined": nil
43
+ };
44
+
45
+ return writeType;
21
46
 
22
- function bool(encoder, value) {
23
47
  // false -- 0xc2
24
48
  // true -- 0xc3
25
- var type = value ? 0xc3 : 0xc2;
26
- token[type](encoder, value);
27
- }
28
-
29
- function number(encoder, value) {
30
- var ivalue = value | 0;
31
- var type;
32
- if (value !== ivalue) {
33
- // float 64 -- 0xcb
34
- type = 0xcb;
49
+ function bool(encoder, value) {
50
+ var type = value ? 0xc3 : 0xc2;
35
51
  token[type](encoder, value);
36
- return;
37
- } else if (-0x20 <= ivalue && ivalue <= 0x7F) {
38
- // positive fixint -- 0x00 - 0x7f
39
- // negative fixint -- 0xe0 - 0xff
40
- type = ivalue & 0xFF;
41
- } else if (0 <= ivalue) {
42
- // uint 8 -- 0xcc
43
- // uint 16 -- 0xcd
44
- // uint 32 -- 0xce
45
- // uint 64 -- 0xcf
46
- type = (ivalue <= 0xFF) ? 0xcc : (ivalue <= 0xFFFF) ? 0xcd : 0xce;
47
- } else {
48
- // int 8 -- 0xd0
49
- // int 16 -- 0xd1
50
- // int 32 -- 0xd2
51
- // int 64 -- 0xd3
52
- type = (-0x80 <= ivalue) ? 0xd0 : (-0x8000 <= ivalue) ? 0xd1 : 0xd2;
53
- }
54
- token[type](encoder, ivalue);
55
- }
52
+ }
53
+
54
+ function number(encoder, value) {
55
+ var ivalue = value | 0;
56
+ var type;
57
+ if (value !== ivalue) {
58
+ // float 64 -- 0xcb
59
+ type = 0xcb;
60
+ token[type](encoder, value);
61
+ return;
62
+ } else if (-0x20 <= ivalue && ivalue <= 0x7F) {
63
+ // positive fixint -- 0x00 - 0x7f
64
+ // negative fixint -- 0xe0 - 0xff
65
+ type = ivalue & 0xFF;
66
+ } else if (0 <= ivalue) {
67
+ // uint 8 -- 0xcc
68
+ // uint 16 -- 0xcd
69
+ // uint 32 -- 0xce
70
+ type = (ivalue <= 0xFF) ? 0xcc : (ivalue <= 0xFFFF) ? 0xcd : 0xce;
71
+ } else {
72
+ // int 8 -- 0xd0
73
+ // int 16 -- 0xd1
74
+ // int 32 -- 0xd2
75
+ type = (-0x80 <= ivalue) ? 0xd0 : (-0x8000 <= ivalue) ? 0xd1 : 0xd2;
76
+ }
77
+ token[type](encoder, ivalue);
78
+ }
79
+
80
+ // uint 64 -- 0xcf
81
+ function uint64(encoder, value) {
82
+ var type = 0xcf;
83
+ token[type](encoder, value.toArray());
84
+ }
85
+
86
+ // int 64 -- 0xd3
87
+ function int64(encoder, value) {
88
+ var type = 0xd3;
89
+ token[type](encoder, value.toArray());
90
+ }
56
91
 
57
- function string(encoder, value) {
58
92
  // str 8 -- 0xd9
59
93
  // str 16 -- 0xda
60
94
  // str 32 -- 0xdb
61
95
  // fixstr -- 0xa0 - 0xbf
96
+ function str_head_size(length) {
97
+ return (length < 32) ? 1 : (length <= 0xFF) ? 2 : (length <= 0xFFFF) ? 3 : 5;
98
+ }
62
99
 
63
- // prepare buffer
64
- var length = value.length;
65
- var maxsize = 5 + length * 3;
66
- encoder.reserve(maxsize);
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
+ }
67
106
 
68
- // expected header size
69
- var expected = (length < 32) ? 1 : (length <= 0xFF) ? 2 : (length <= 0xFFFF) ? 3 : 5;
107
+ function _string(head_size) {
108
+ return string;
70
109
 
71
- // expected start point
72
- var start = encoder.offset + expected;
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;
73
116
 
74
- // write string
75
- length = BufferLite.writeString.call(encoder.buffer, value, start);
117
+ // expected header size
118
+ var expected = head_size(length);
76
119
 
77
- // actual header size
78
- var actual = (length < 32) ? 1 : (length <= 0xFF) ? 2 : (length <= 0xFFFF) ? 3 : 5;
120
+ // expected start point
121
+ var start = encoder.offset + expected;
79
122
 
80
- // move content when needed
81
- if (expected !== actual) {
82
- var targetStart = encoder.offset + actual;
83
- var end = start + length;
84
- if (IS_BUFFER_SHIM) {
85
- BufferLite.copy.call(encoder.buffer, encoder.buffer, targetStart, start, end);
86
- } else {
87
- encoder.buffer.copy(encoder.buffer, targetStart, start, end);
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
+ }
135
+
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;
88
142
  }
89
143
  }
90
144
 
91
- // write header
92
- var type = (actual === 1) ? (0xa0 + length) : (actual <= 3) ? 0xd7 + actual : 0xdb;
93
- token[type](encoder, length);
145
+ function object(encoder, value) {
146
+ // null
147
+ if (value === null) return nil(encoder, value);
94
148
 
95
- // move cursor
96
- encoder.offset += length;
97
- }
149
+ // Buffer
150
+ if (isBuffer(value)) return bin(encoder, value);
98
151
 
99
- var extmap = [];
100
- extmap[1] = 0xd4;
101
- extmap[2] = 0xd5;
102
- extmap[4] = 0xd6;
103
- extmap[8] = 0xd7;
104
- extmap[16] = 0xd8;
152
+ // Array
153
+ if (IS_ARRAY(value)) return array(encoder, value);
105
154
 
106
- function object(encoder, value) {
107
- if (IS_ARRAY(value)) return array(encoder, value);
108
- if (value === null) return nil(encoder, value);
109
- if (Buffer.isBuffer(value)) return bin(encoder, value);
110
- var packer = encoder.codec.getExtPacker(value);
111
- if (packer) value = packer(value);
112
- if (value instanceof ExtBuffer) return ext(encoder, value);
113
- map(encoder, value);
114
- }
155
+ // int64-buffer objects
156
+ if (Uint64BE.isUint64BE(value)) return uint64(encoder, value);
157
+ if (Int64BE.isInt64BE(value)) return int64(encoder, value);
158
+
159
+ // ext formats
160
+ var packer = encoder.codec.getExtPacker(value);
161
+ if (packer) value = packer(value);
162
+ if (value instanceof ExtBuffer) return ext(encoder, value);
163
+
164
+ // plain old Objects or Map
165
+ map(encoder, value);
166
+ }
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
+ }
115
175
 
116
- function nil(encoder, value) {
117
176
  // nil -- 0xc0
118
- var type = 0xc0;
119
- token[type](encoder, value);
120
- }
177
+ function nil(encoder, value) {
178
+ var type = 0xc0;
179
+ token[type](encoder, value);
180
+ }
121
181
 
122
- function array(encoder, value) {
123
182
  // fixarray -- 0x90 - 0x9f
124
183
  // array 16 -- 0xdc
125
184
  // array 32 -- 0xdd
126
- var length = value.length;
127
- var type = (length < 16) ? (0x90 + length) : (length <= 0xFFFF) ? 0xdc : 0xdd;
128
- token[type](encoder, length);
129
- for (var i = 0; i < length; i++) {
130
- encode(encoder, value[i]);
185
+ function array(encoder, value) {
186
+ var length = value.length;
187
+ var type = (length < 16) ? (0x90 + length) : (length <= 0xFFFF) ? 0xdc : 0xdd;
188
+ token[type](encoder, length);
189
+
190
+ var encode = encoder.codec.encode;
191
+ for (var i = 0; i < length; i++) {
192
+ encode(encoder, value[i]);
193
+ }
131
194
  }
132
- }
133
195
 
134
- function bin(encoder, value) {
135
196
  // bin 8 -- 0xc4
136
197
  // bin 16 -- 0xc5
137
198
  // bin 32 -- 0xc6
138
- var length = value.length;
139
- var type = (length < 0xFF) ? 0xc4 : (length <= 0xFFFF) ? 0xc5 : 0xc6;
140
- token[type](encoder, length);
141
- encoder.send(value);
142
- }
199
+ function bin_buffer(encoder, value) {
200
+ var length = value.length;
201
+ var type = (length < 0xFF) ? 0xc4 : (length <= 0xFFFF) ? 0xc5 : 0xc6;
202
+ token[type](encoder, length);
203
+ encoder.send(value);
204
+ }
205
+
206
+ function bin_arraybuffer(encoder, value) {
207
+ bin_buffer(encoder, new Uint8Array(value));
208
+ }
143
209
 
144
- function ext(encoder, value) {
145
210
  // fixext 1 -- 0xd4
146
211
  // fixext 2 -- 0xd5
147
212
  // fixext 4 -- 0xd6
@@ -150,24 +215,55 @@ function ext(encoder, value) {
150
215
  // ext 8 -- 0xc7
151
216
  // ext 16 -- 0xc8
152
217
  // ext 32 -- 0xc9
153
- var buffer = value.buffer;
154
- var length = buffer.length;
155
- var type = extmap[length] || ((length < 0xFF) ? 0xc7 : (length <= 0xFFFF) ? 0xc8 : 0xc9);
156
- token[type](encoder, length);
157
- uint8[value.type](encoder);
158
- encoder.send(buffer);
159
- }
218
+ function ext(encoder, value) {
219
+ var buffer = value.buffer;
220
+ var length = buffer.length;
221
+ var type = extmap[length] || ((length < 0xFF) ? 0xc7 : (length <= 0xFFFF) ? 0xc8 : 0xc9);
222
+ token[type](encoder, length);
223
+ uint8[value.type](encoder);
224
+ encoder.send(buffer);
225
+ }
160
226
 
161
- function map(encoder, value) {
162
227
  // fixmap -- 0x80 - 0x8f
163
228
  // map 16 -- 0xde
164
229
  // map 32 -- 0xdf
165
- var keys = Object.keys(value);
166
- var length = keys.length;
167
- var type = (length < 16) ? (0x80 + length) : (length <= 0xFFFF) ? 0xde : 0xdf;
168
- token[type](encoder, length);
169
- keys.forEach(function(key) {
170
- encode(encoder, key);
171
- encode(encoder, value[key]);
172
- });
230
+ function obj_to_map(encoder, value) {
231
+ var keys = Object.keys(value);
232
+ var length = keys.length;
233
+ var type = (length < 16) ? (0x80 + length) : (length <= 0xFFFF) ? 0xde : 0xdf;
234
+ token[type](encoder, length);
235
+
236
+ var encode = encoder.codec.encode;
237
+ keys.forEach(function(key) {
238
+ encode(encoder, key);
239
+ encode(encoder, value[key]);
240
+ });
241
+ }
242
+
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);
248
+
249
+ var length = value.size;
250
+ var type = (length < 16) ? (0x80 + length) : (length <= 0xFFFF) ? 0xde : 0xdf;
251
+ token[type](encoder, length);
252
+
253
+ var encode = encoder.codec.encode;
254
+ value.forEach(function(val, key, m) {
255
+ encode(encoder, key);
256
+ encode(encoder, val);
257
+ });
258
+ }
259
+
260
+ // raw 16 -- 0xda
261
+ // raw 32 -- 0xdb
262
+ // fixraw -- 0xa0 - 0xbf
263
+ function raw(encoder, value) {
264
+ var length = value.length;
265
+ var type = (length < 32) ? (0xa0 + length) : (length <= 0xFFFF) ? 0xda : 0xdb;
266
+ token[type](encoder, length);
267
+ encoder.send(value);
268
+ }
173
269
  }
@@ -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.17",
4
+ "version": "0.1.26",
5
5
  "author": "@kawanet",
6
6
  "bin": {
7
7
  "msgpack": "./bin/msgpack"
@@ -11,24 +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"
23
+ "ieee754": "^1.1.8",
24
+ "int64-buffer": "^0.1.9",
25
+ "isarray": "^1.0.0"
22
26
  },
23
27
  "devDependencies": {
24
- "async": "^1.5.2",
25
- "browserify": "^13.0.0",
26
- "concat-stream": "^1.5.1",
27
- "jshint": "^2.9.1",
28
- "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",
29
33
  "msgpack.codec": "git+https://github.com/kawanet/msgpack-javascript.git#msgpack.codec",
30
- "uglify-js": "^2.6.2",
31
- "zuul": "^3.9.0"
34
+ "uglify-js": "^2.7.3",
35
+ "zuul": "^3.11.1"
32
36
  },
33
37
  "homepage": "https://github.com/kawanet/msgpack-lite",
34
38
  "jshintConfig": {
@@ -36,6 +40,7 @@
36
40
  "globals": {
37
41
  "JSON": true,
38
42
  "Symbol": true,
43
+ "Map": true,
39
44
  "window": true
40
45
  },
41
46
  "mocha": true,
@@ -43,6 +48,7 @@
43
48
  "undef": true
44
49
  },
45
50
  "keywords": [
51
+ "arraybuffer",
46
52
  "buffer",
47
53
  "fluentd",
48
54
  "messagepack",
@@ -50,7 +56,6 @@
50
56
  "serialize",
51
57
  "stream",
52
58
  "typedarray",
53
- "arraybuffer",
54
59
  "uint8array"
55
60
  ],
56
61
  "license": "MIT",
@@ -60,6 +65,13 @@
60
65
  "url": "https://github.com/kawanet/msgpack-lite.git"
61
66
  },
62
67
  "scripts": {
63
- "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"
64
76
  }
65
77
  }