msgpackr 1.8.0 → 1.8.1

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.
package/dist/test.js CHANGED
@@ -1329,6 +1329,23 @@
1329
1329
  position = start;
1330
1330
  }
1331
1331
  };
1332
+ const packArray = (value) => {
1333
+ var length = value.length;
1334
+ if (length < 0x10) {
1335
+ target[position++] = 0x90 | length;
1336
+ } else if (length < 0x10000) {
1337
+ target[position++] = 0xdc;
1338
+ target[position++] = length >> 8;
1339
+ target[position++] = length & 0xff;
1340
+ } else {
1341
+ target[position++] = 0xdd;
1342
+ targetView.setUint32(position, length);
1343
+ position += 4;
1344
+ }
1345
+ for (let i = 0; i < length; i++) {
1346
+ pack(value[i]);
1347
+ }
1348
+ };
1332
1349
  const pack = (value) => {
1333
1350
  if (position > safeEnd)
1334
1351
  target = makeRoom(position);
@@ -1511,22 +1528,8 @@
1511
1528
  let constructor = value.constructor;
1512
1529
  if (constructor === Object) {
1513
1530
  writeObject(value, true);
1514
- } else if (constructor === Array || Array.isArray(value)) {
1515
- length = value.length;
1516
- if (length < 0x10) {
1517
- target[position++] = 0x90 | length;
1518
- } else if (length < 0x10000) {
1519
- target[position++] = 0xdc;
1520
- target[position++] = length >> 8;
1521
- target[position++] = length & 0xff;
1522
- } else {
1523
- target[position++] = 0xdd;
1524
- targetView.setUint32(position, length);
1525
- position += 4;
1526
- }
1527
- for (let i = 0; i < length; i++) {
1528
- pack(value[i]);
1529
- }
1531
+ } else if (constructor === Array) {
1532
+ packArray(value);
1530
1533
  } else if (constructor === Map) {
1531
1534
  length = value.size;
1532
1535
  if (length < 0x10) {
@@ -1555,7 +1558,16 @@
1555
1558
  target[position++] = extension.type;
1556
1559
  target[position++] = 0;
1557
1560
  }
1558
- pack(extension.write.call(this, value));
1561
+ let writeResult = extension.write.call(this, value);
1562
+ if (writeResult === value) { // avoid infinite recursion
1563
+ if (Array.isArray(value)) {
1564
+ packArray(value);
1565
+ } else {
1566
+ writeObject(value);
1567
+ }
1568
+ } else {
1569
+ pack(writeResult);
1570
+ }
1559
1571
  return
1560
1572
  }
1561
1573
  let currentTarget = target;
@@ -1592,8 +1604,13 @@
1592
1604
  return
1593
1605
  }
1594
1606
  }
1595
- // no extension found, write as object
1596
- writeObject(value, !value.hasOwnProperty); // if it doesn't have hasOwnProperty, don't do hasOwnProperty checks
1607
+ // check isArray after extensions, because extensions can extend Array
1608
+ if (Array.isArray(value)) {
1609
+ packArray(value);
1610
+ } else {
1611
+ // no extension found, write as object
1612
+ writeObject(value, !value.hasOwnProperty); // if it doesn't have hasOwnProperty, don't do hasOwnProperty checks
1613
+ }
1597
1614
  }
1598
1615
  }
1599
1616
  } else if (type === 'boolean') {
@@ -2920,6 +2937,20 @@
2920
2937
 
2921
2938
  var ITERATIONS = 4000;
2922
2939
 
2940
+ class ExtendArray extends Array {
2941
+ }
2942
+
2943
+ class ExtendArray2 extends Array {
2944
+ }
2945
+
2946
+ class ExtendArray3 extends Array {
2947
+ }
2948
+
2949
+
2950
+ class ExtendObject {
2951
+ }
2952
+
2953
+
2923
2954
  suite('msgpackr basic tests', function() {
2924
2955
  test('pack/unpack data', function () {
2925
2956
  var data = {
@@ -3187,6 +3218,73 @@
3187
3218
  assert.deepEqual(data, deserialized);
3188
3219
  assert.equal(deserialized.extendedInstance.getDouble(), 8);
3189
3220
  });
3221
+
3222
+ test('extended Array class read/write', function(){
3223
+ var instance = new ExtendArray();
3224
+ instance.push(0);
3225
+ instance.push(1);
3226
+ instance.push(2);
3227
+ var data = {
3228
+ prop1: 'has multi-byte: ᾜ',
3229
+ extendedInstance: instance,
3230
+ prop2: 'more string',
3231
+ num: 3,
3232
+ };
3233
+ new Packr();
3234
+ addExtension({
3235
+ Class: ExtendArray,
3236
+ type: 12,
3237
+ read: function(data) {
3238
+ Object.setPrototypeOf(data, ExtendArray.prototype);
3239
+ return data
3240
+ },
3241
+ write: function(instance) {
3242
+ return [...instance]
3243
+ }
3244
+ });
3245
+ var serialized = pack(data);
3246
+ var deserialized = unpack(serialized);
3247
+ assert.strictEqual(Object.getPrototypeOf(deserialized.extendedInstance), ExtendArray.prototype);
3248
+ assert.deepEqual(data, deserialized);
3249
+ });
3250
+
3251
+
3252
+ test('unregistered extended Array class read/write', function(){
3253
+ var instance = new ExtendArray2();
3254
+ instance.push(0);
3255
+ instance.push(1);
3256
+ instance.push(2);
3257
+ var data = {
3258
+ prop1: 'has multi-byte: ᾜ',
3259
+ extendedInstance: instance,
3260
+ prop2: 'more string',
3261
+ num: 3,
3262
+ };
3263
+ new Packr();
3264
+ var serialized = pack(data);
3265
+ var deserialized = unpack(serialized);
3266
+ assert.strictEqual(Object.getPrototypeOf(deserialized.extendedInstance), Array.prototype);
3267
+ assert.deepEqual(data, deserialized);
3268
+ });
3269
+
3270
+
3271
+ test('unregistered extended Object class read/write', function(){
3272
+ var instance = new ExtendObject();
3273
+ instance.test1 = "string";
3274
+ instance.test2 = 3421321;
3275
+ var data = {
3276
+ prop1: 'has multi-byte: ᾜ',
3277
+ extendedInstance: instance,
3278
+ prop2: 'more string',
3279
+ num: 3,
3280
+ };
3281
+ new Packr();
3282
+ var serialized = pack(data);
3283
+ var deserialized = unpack(serialized);
3284
+ assert.strictEqual(Object.getPrototypeOf(deserialized.extendedInstance), Object.prototype);
3285
+ assert.deepEqual(data, deserialized);
3286
+ });
3287
+
3190
3288
  test('extended class pack/unpack custom size', function(){
3191
3289
  function TestClass() {
3192
3290
 
@@ -3240,6 +3338,69 @@
3240
3338
  assert.deepEqual(data, deserialized);
3241
3339
  assert.equal(deserialized.extendedInstance.getDouble(), 8);
3242
3340
  });
3341
+ test('extended class return self', function(){
3342
+ function Extended() {
3343
+
3344
+ }
3345
+ Extended.prototype.getDouble = function() {
3346
+ return this.value * 2
3347
+ };
3348
+ var instance = new Extended();
3349
+ instance.value = 4;
3350
+ instance.string = 'decode this: ᾜ';
3351
+ var data = {
3352
+ prop1: 'has multi-byte: ᾜ',
3353
+ extendedInstance: instance,
3354
+ prop2: 'more string',
3355
+ num: 3,
3356
+ };
3357
+ new Packr();
3358
+ addExtension({
3359
+ Class: Extended,
3360
+ type: 13,
3361
+ read: function(data) {
3362
+ Object.setPrototypeOf(data, Extended.prototype);
3363
+ return data
3364
+ },
3365
+ write: function(data) {
3366
+ return data
3367
+ }
3368
+ });
3369
+ var serialized = pack(data);
3370
+ var deserialized = unpack(serialized);
3371
+ assert.deepEqual(data, deserialized);
3372
+ assert.strictEqual(Object.getPrototypeOf(deserialized.extendedInstance), Extended.prototype);
3373
+ assert.equal(deserialized.extendedInstance.getDouble(), 8);
3374
+ });
3375
+ test('extended Array class return self', function(){
3376
+ var instance = new ExtendArray3();
3377
+ instance.push(0);
3378
+ instance.push('has multi-byte: ᾜ');
3379
+ var data = {
3380
+ prop1: 'has multi-byte: ᾜ',
3381
+ extendedInstance: instance,
3382
+ prop2: 'more string',
3383
+ num: 3,
3384
+ };
3385
+ new Packr();
3386
+ addExtension({
3387
+ Class: ExtendArray3,
3388
+ type: 14,
3389
+ read: function(data) {
3390
+ Object.setPrototypeOf(data, ExtendArray3.prototype);
3391
+ return data
3392
+ },
3393
+ write: function(data) {
3394
+ return data
3395
+ }
3396
+ });
3397
+ var serialized = pack(data);
3398
+ var deserialized = unpack(serialized);
3399
+ assert.deepEqual(data, deserialized);
3400
+ assert.strictEqual(Object.getPrototypeOf(deserialized.extendedInstance), ExtendArray3.prototype);
3401
+ assert.equal(deserialized.extendedInstance[0], 0);
3402
+ });
3403
+
3243
3404
  test('proto handling', function() {
3244
3405
  var objectWithProto = JSON.parse('{"__proto__":{"foo":3}}');
3245
3406
  var decoded = unpack(pack(objectWithProto));