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/node.cjs CHANGED
@@ -1334,6 +1334,23 @@ class Packr extends Unpackr {
1334
1334
  position = start;
1335
1335
  }
1336
1336
  };
1337
+ const packArray = (value) => {
1338
+ var length = value.length;
1339
+ if (length < 0x10) {
1340
+ target[position++] = 0x90 | length;
1341
+ } else if (length < 0x10000) {
1342
+ target[position++] = 0xdc;
1343
+ target[position++] = length >> 8;
1344
+ target[position++] = length & 0xff;
1345
+ } else {
1346
+ target[position++] = 0xdd;
1347
+ targetView.setUint32(position, length);
1348
+ position += 4;
1349
+ }
1350
+ for (let i = 0; i < length; i++) {
1351
+ pack(value[i]);
1352
+ }
1353
+ };
1337
1354
  const pack = (value) => {
1338
1355
  if (position > safeEnd)
1339
1356
  target = makeRoom(position);
@@ -1516,22 +1533,8 @@ class Packr extends Unpackr {
1516
1533
  let constructor = value.constructor;
1517
1534
  if (constructor === Object) {
1518
1535
  writeObject(value, true);
1519
- } else if (constructor === Array || Array.isArray(value)) {
1520
- length = value.length;
1521
- if (length < 0x10) {
1522
- target[position++] = 0x90 | length;
1523
- } else if (length < 0x10000) {
1524
- target[position++] = 0xdc;
1525
- target[position++] = length >> 8;
1526
- target[position++] = length & 0xff;
1527
- } else {
1528
- target[position++] = 0xdd;
1529
- targetView.setUint32(position, length);
1530
- position += 4;
1531
- }
1532
- for (let i = 0; i < length; i++) {
1533
- pack(value[i]);
1534
- }
1536
+ } else if (constructor === Array) {
1537
+ packArray(value);
1535
1538
  } else if (constructor === Map) {
1536
1539
  length = value.size;
1537
1540
  if (length < 0x10) {
@@ -1560,7 +1563,16 @@ class Packr extends Unpackr {
1560
1563
  target[position++] = extension.type;
1561
1564
  target[position++] = 0;
1562
1565
  }
1563
- pack(extension.write.call(this, value));
1566
+ let writeResult = extension.write.call(this, value);
1567
+ if (writeResult === value) { // avoid infinite recursion
1568
+ if (Array.isArray(value)) {
1569
+ packArray(value);
1570
+ } else {
1571
+ writeObject(value);
1572
+ }
1573
+ } else {
1574
+ pack(writeResult);
1575
+ }
1564
1576
  return
1565
1577
  }
1566
1578
  let currentTarget = target;
@@ -1597,8 +1609,13 @@ class Packr extends Unpackr {
1597
1609
  return
1598
1610
  }
1599
1611
  }
1600
- // no extension found, write as object
1601
- writeObject(value, !value.hasOwnProperty); // if it doesn't have hasOwnProperty, don't do hasOwnProperty checks
1612
+ // check isArray after extensions, because extensions can extend Array
1613
+ if (Array.isArray(value)) {
1614
+ packArray(value);
1615
+ } else {
1616
+ // no extension found, write as object
1617
+ writeObject(value, !value.hasOwnProperty); // if it doesn't have hasOwnProperty, don't do hasOwnProperty checks
1618
+ }
1602
1619
  }
1603
1620
  }
1604
1621
  } else if (type === 'boolean') {