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/README.md +19 -4
- package/dist/{index-no-eval.js → index-no-eval.cjs} +37 -20
- package/dist/index-no-eval.cjs.map +1 -0
- package/dist/index-no-eval.min.js +1 -1
- package/dist/index-no-eval.min.js.map +1 -1
- package/dist/index.js +36 -19
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/node.cjs +36 -19
- package/dist/node.cjs.map +1 -1
- package/dist/test.js +180 -19
- package/dist/test.js.map +1 -1
- package/dist/unpack-no-eval.cjs +1158 -0
- package/dist/unpack-no-eval.cjs.map +1 -0
- package/pack.js +36 -19
- package/package.json +4 -2
- package/rollup.config.js +13 -1
- package/dist/index-no-eval.js.map +0 -1
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
|
|
1515
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
1596
|
-
|
|
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));
|