bson 5.3.0 → 5.5.0

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 (69) hide show
  1. package/README.md +4 -11
  2. package/bson.d.ts +20 -0
  3. package/lib/bson.bundle.js +137 -86
  4. package/lib/bson.bundle.js.map +1 -1
  5. package/lib/bson.cjs +137 -86
  6. package/lib/bson.cjs.map +1 -1
  7. package/lib/bson.mjs +137 -86
  8. package/lib/bson.mjs.map +1 -1
  9. package/lib/bson.rn.cjs +4159 -0
  10. package/lib/bson.rn.cjs.map +1 -0
  11. package/package.json +8 -7
  12. package/src/binary.ts +3 -2
  13. package/src/bson.ts +2 -2
  14. package/src/decimal128.ts +165 -84
  15. package/src/parser/deserializer.ts +8 -8
  16. package/src/timestamp.ts +7 -5
  17. package/src/utils/byte_utils.ts +1 -1
  18. package/src/utils/node_byte_utils.ts +3 -3
  19. package/src/utils/web_byte_utils.ts +2 -2
  20. package/vendor/base64/LICENSE-MIT.txt +20 -0
  21. package/vendor/base64/README.md +112 -0
  22. package/vendor/base64/base64.js +157 -0
  23. package/vendor/base64/package.json +43 -0
  24. package/vendor/text-encoding/LICENSE.md +237 -0
  25. package/vendor/text-encoding/README.md +111 -0
  26. package/vendor/text-encoding/index.js +9 -0
  27. package/vendor/text-encoding/lib/encoding-indexes.js +47 -0
  28. package/vendor/text-encoding/lib/encoding.js +3301 -0
  29. package/vendor/text-encoding/package.json +37 -0
  30. package/lib/binary.d.ts +0 -182
  31. package/lib/binary.d.ts.map +0 -1
  32. package/lib/bson.d.ts +0 -97
  33. package/lib/bson.d.ts.map +0 -1
  34. package/lib/bson_value.d.ts +0 -10
  35. package/lib/bson_value.d.ts.map +0 -1
  36. package/lib/code.d.ts +0 -32
  37. package/lib/code.d.ts.map +0 -1
  38. package/lib/constants.d.ts +0 -107
  39. package/lib/constants.d.ts.map +0 -1
  40. package/lib/db_ref.d.ts +0 -40
  41. package/lib/db_ref.d.ts.map +0 -1
  42. package/lib/decimal128.d.ts +0 -34
  43. package/lib/decimal128.d.ts.map +0 -1
  44. package/lib/double.d.ts +0 -35
  45. package/lib/double.d.ts.map +0 -1
  46. package/lib/error.d.ts +0 -50
  47. package/lib/error.d.ts.map +0 -1
  48. package/lib/extended_json.d.ts +0 -82
  49. package/lib/extended_json.d.ts.map +0 -1
  50. package/lib/index.d.ts +0 -4
  51. package/lib/index.d.ts.map +0 -1
  52. package/lib/int_32.d.ts +0 -35
  53. package/lib/int_32.d.ts.map +0 -1
  54. package/lib/long.d.ts +0 -323
  55. package/lib/long.d.ts.map +0 -1
  56. package/lib/max_key.d.ts +0 -19
  57. package/lib/max_key.d.ts.map +0 -1
  58. package/lib/min_key.d.ts +0 -19
  59. package/lib/min_key.d.ts.map +0 -1
  60. package/lib/objectid.d.ts +0 -96
  61. package/lib/objectid.d.ts.map +0 -1
  62. package/lib/regexp.d.ts +0 -36
  63. package/lib/regexp.d.ts.map +0 -1
  64. package/lib/symbol.d.ts +0 -28
  65. package/lib/symbol.d.ts.map +0 -1
  66. package/lib/timestamp.d.ts +0 -66
  67. package/lib/timestamp.d.ts.map +0 -1
  68. package/lib/validate_utf8.d.ts +0 -10
  69. package/lib/validate_utf8.d.ts.map +0 -1
package/lib/bson.mjs CHANGED
@@ -163,8 +163,8 @@ const nodeJsByteUtils = {
163
163
  fromUTF8(text) {
164
164
  return Buffer.from(text, 'utf8');
165
165
  },
166
- toUTF8(buffer) {
167
- return nodeJsByteUtils.toLocalBufferType(buffer).toString('utf8');
166
+ toUTF8(buffer, start, end) {
167
+ return nodeJsByteUtils.toLocalBufferType(buffer).toString('utf8', start, end);
168
168
  },
169
169
  utf8ByteLength(input) {
170
170
  return Buffer.byteLength(input, 'utf8');
@@ -274,8 +274,8 @@ const webByteUtils = {
274
274
  fromUTF8(text) {
275
275
  return new TextEncoder().encode(text);
276
276
  },
277
- toUTF8(uint8array) {
278
- return new TextDecoder('utf8', { fatal: false }).decode(uint8array);
277
+ toUTF8(uint8array, start, end) {
278
+ return new TextDecoder('utf8', { fatal: false }).decode(uint8array.slice(start, end));
279
279
  },
280
280
  utf8ByteLength(input) {
281
281
  return webByteUtils.fromUTF8(input).byteLength;
@@ -407,8 +407,8 @@ class Binary extends BSONValue {
407
407
  if (encoding === 'base64')
408
408
  return ByteUtils.toBase64(this.buffer);
409
409
  if (encoding === 'utf8' || encoding === 'utf-8')
410
- return ByteUtils.toUTF8(this.buffer);
411
- return ByteUtils.toUTF8(this.buffer);
410
+ return ByteUtils.toUTF8(this.buffer, 0, this.buffer.byteLength);
411
+ return ByteUtils.toUTF8(this.buffer, 0, this.buffer.byteLength);
412
412
  }
413
413
  toExtendedJSON(options) {
414
414
  options = options || {};
@@ -1434,7 +1434,14 @@ class Decimal128 extends BSONValue {
1434
1434
  }
1435
1435
  }
1436
1436
  static fromString(representation) {
1437
+ return Decimal128._fromString(representation, { allowRounding: false });
1438
+ }
1439
+ static fromStringWithRounding(representation) {
1440
+ return Decimal128._fromString(representation, { allowRounding: true });
1441
+ }
1442
+ static _fromString(representation, options) {
1437
1443
  let isNegative = false;
1444
+ let sawSign = false;
1438
1445
  let sawRadix = false;
1439
1446
  let foundNonZero = false;
1440
1447
  let significantDigits = 0;
@@ -1445,10 +1452,8 @@ class Decimal128 extends BSONValue {
1445
1452
  const digits = [0];
1446
1453
  let nDigitsStored = 0;
1447
1454
  let digitsInsert = 0;
1448
- let firstDigit = 0;
1449
1455
  let lastDigit = 0;
1450
1456
  let exponent = 0;
1451
- let i = 0;
1452
1457
  let significandHigh = new Long(0, 0);
1453
1458
  let significandLow = new Long(0, 0);
1454
1459
  let biasedExponent = 0;
@@ -1476,6 +1481,7 @@ class Decimal128 extends BSONValue {
1476
1481
  }
1477
1482
  }
1478
1483
  if (representation[index] === '+' || representation[index] === '-') {
1484
+ sawSign = true;
1479
1485
  isNegative = representation[index++] === '-';
1480
1486
  }
1481
1487
  if (!isDigit(representation[index]) && representation[index] !== '.') {
@@ -1494,7 +1500,7 @@ class Decimal128 extends BSONValue {
1494
1500
  index = index + 1;
1495
1501
  continue;
1496
1502
  }
1497
- if (nDigitsStored < 34) {
1503
+ if (nDigitsStored < MAX_DIGITS) {
1498
1504
  if (representation[index] !== '0' || foundNonZero) {
1499
1505
  if (!foundNonZero) {
1500
1506
  firstNonZero = nDigitsRead;
@@ -1522,10 +1528,7 @@ class Decimal128 extends BSONValue {
1522
1528
  }
1523
1529
  if (representation[index])
1524
1530
  return new Decimal128(NAN_BUFFER);
1525
- firstDigit = 0;
1526
1531
  if (!nDigitsStored) {
1527
- firstDigit = 0;
1528
- lastDigit = 0;
1529
1532
  digits[0] = 0;
1530
1533
  nDigits = 1;
1531
1534
  nDigitsStored = 1;
@@ -1535,12 +1538,12 @@ class Decimal128 extends BSONValue {
1535
1538
  lastDigit = nDigitsStored - 1;
1536
1539
  significantDigits = nDigits;
1537
1540
  if (significantDigits !== 1) {
1538
- while (digits[firstNonZero + significantDigits - 1] === 0) {
1541
+ while (representation[firstNonZero + significantDigits - 1 + Number(sawSign) + Number(sawRadix)] === '0') {
1539
1542
  significantDigits = significantDigits - 1;
1540
1543
  }
1541
1544
  }
1542
1545
  }
1543
- if (exponent <= radixPosition && radixPosition - exponent > 1 << 14) {
1546
+ if (exponent <= radixPosition && radixPosition > exponent + (1 << 14)) {
1544
1547
  exponent = EXPONENT_MIN;
1545
1548
  }
1546
1549
  else {
@@ -1548,9 +1551,8 @@ class Decimal128 extends BSONValue {
1548
1551
  }
1549
1552
  while (exponent > EXPONENT_MAX) {
1550
1553
  lastDigit = lastDigit + 1;
1551
- if (lastDigit - firstDigit > MAX_DIGITS) {
1552
- const digitsString = digits.join('');
1553
- if (digitsString.match(/^0+$/)) {
1554
+ if (lastDigit >= MAX_DIGITS) {
1555
+ if (significantDigits === 0) {
1554
1556
  exponent = EXPONENT_MAX;
1555
1557
  break;
1556
1558
  }
@@ -1558,69 +1560,116 @@ class Decimal128 extends BSONValue {
1558
1560
  }
1559
1561
  exponent = exponent - 1;
1560
1562
  }
1561
- while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) {
1562
- if (lastDigit === 0 && significantDigits < nDigitsStored) {
1563
- exponent = EXPONENT_MIN;
1564
- significantDigits = 0;
1565
- break;
1566
- }
1567
- if (nDigitsStored < nDigits) {
1568
- nDigits = nDigits - 1;
1569
- }
1570
- else {
1571
- lastDigit = lastDigit - 1;
1572
- }
1573
- if (exponent < EXPONENT_MAX) {
1574
- exponent = exponent + 1;
1575
- }
1576
- else {
1577
- const digitsString = digits.join('');
1578
- if (digitsString.match(/^0+$/)) {
1579
- exponent = EXPONENT_MAX;
1563
+ if (options.allowRounding) {
1564
+ while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) {
1565
+ if (lastDigit === 0 && significantDigits < nDigitsStored) {
1566
+ exponent = EXPONENT_MIN;
1567
+ significantDigits = 0;
1580
1568
  break;
1581
1569
  }
1582
- invalidErr(representation, 'overflow');
1583
- }
1584
- }
1585
- if (lastDigit - firstDigit + 1 < significantDigits) {
1586
- let endOfString = nDigitsRead;
1587
- if (sawRadix) {
1588
- firstNonZero = firstNonZero + 1;
1589
- endOfString = endOfString + 1;
1590
- }
1591
- if (isNegative) {
1592
- firstNonZero = firstNonZero + 1;
1593
- endOfString = endOfString + 1;
1594
- }
1595
- const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10);
1596
- let roundBit = 0;
1597
- if (roundDigit >= 5) {
1598
- roundBit = 1;
1599
- if (roundDigit === 5) {
1600
- roundBit = digits[lastDigit] % 2 === 1 ? 1 : 0;
1601
- for (i = firstNonZero + lastDigit + 2; i < endOfString; i++) {
1602
- if (parseInt(representation[i], 10)) {
1603
- roundBit = 1;
1604
- break;
1605
- }
1570
+ if (nDigitsStored < nDigits) {
1571
+ nDigits = nDigits - 1;
1572
+ }
1573
+ else {
1574
+ lastDigit = lastDigit - 1;
1575
+ }
1576
+ if (exponent < EXPONENT_MAX) {
1577
+ exponent = exponent + 1;
1578
+ }
1579
+ else {
1580
+ const digitsString = digits.join('');
1581
+ if (digitsString.match(/^0+$/)) {
1582
+ exponent = EXPONENT_MAX;
1583
+ break;
1606
1584
  }
1585
+ invalidErr(representation, 'overflow');
1607
1586
  }
1608
1587
  }
1609
- if (roundBit) {
1610
- let dIdx = lastDigit;
1611
- for (; dIdx >= 0; dIdx--) {
1612
- if (++digits[dIdx] > 9) {
1613
- digits[dIdx] = 0;
1614
- if (dIdx === 0) {
1615
- if (exponent < EXPONENT_MAX) {
1616
- exponent = exponent + 1;
1617
- digits[dIdx] = 1;
1588
+ if (lastDigit + 1 < significantDigits) {
1589
+ let endOfString = nDigitsRead;
1590
+ if (sawRadix) {
1591
+ firstNonZero = firstNonZero + 1;
1592
+ endOfString = endOfString + 1;
1593
+ }
1594
+ if (sawSign) {
1595
+ firstNonZero = firstNonZero + 1;
1596
+ endOfString = endOfString + 1;
1597
+ }
1598
+ const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10);
1599
+ let roundBit = 0;
1600
+ if (roundDigit >= 5) {
1601
+ roundBit = 1;
1602
+ if (roundDigit === 5) {
1603
+ roundBit = digits[lastDigit] % 2 === 1 ? 1 : 0;
1604
+ for (let i = firstNonZero + lastDigit + 2; i < endOfString; i++) {
1605
+ if (parseInt(representation[i], 10)) {
1606
+ roundBit = 1;
1607
+ break;
1618
1608
  }
1619
- else {
1620
- return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER);
1609
+ }
1610
+ }
1611
+ }
1612
+ if (roundBit) {
1613
+ let dIdx = lastDigit;
1614
+ for (; dIdx >= 0; dIdx--) {
1615
+ if (++digits[dIdx] > 9) {
1616
+ digits[dIdx] = 0;
1617
+ if (dIdx === 0) {
1618
+ if (exponent < EXPONENT_MAX) {
1619
+ exponent = exponent + 1;
1620
+ digits[dIdx] = 1;
1621
+ }
1622
+ else {
1623
+ return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER);
1624
+ }
1621
1625
  }
1622
1626
  }
1627
+ else {
1628
+ break;
1629
+ }
1630
+ }
1631
+ }
1632
+ }
1633
+ }
1634
+ else {
1635
+ while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) {
1636
+ if (lastDigit === 0) {
1637
+ if (significantDigits === 0) {
1638
+ exponent = EXPONENT_MIN;
1639
+ break;
1623
1640
  }
1641
+ invalidErr(representation, 'exponent underflow');
1642
+ }
1643
+ if (nDigitsStored < nDigits) {
1644
+ if (representation[nDigits - 1 + Number(sawSign) + Number(sawRadix)] !== '0' &&
1645
+ significantDigits !== 0) {
1646
+ invalidErr(representation, 'inexact rounding');
1647
+ }
1648
+ nDigits = nDigits - 1;
1649
+ }
1650
+ else {
1651
+ if (digits[lastDigit] !== 0) {
1652
+ invalidErr(representation, 'inexact rounding');
1653
+ }
1654
+ lastDigit = lastDigit - 1;
1655
+ }
1656
+ if (exponent < EXPONENT_MAX) {
1657
+ exponent = exponent + 1;
1658
+ }
1659
+ else {
1660
+ invalidErr(representation, 'overflow');
1661
+ }
1662
+ }
1663
+ if (lastDigit + 1 < significantDigits) {
1664
+ if (sawRadix) {
1665
+ firstNonZero = firstNonZero + 1;
1666
+ }
1667
+ if (sawSign) {
1668
+ firstNonZero = firstNonZero + 1;
1669
+ }
1670
+ const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10);
1671
+ if (roundDigit !== 0) {
1672
+ invalidErr(representation, 'inexact rounding');
1624
1673
  }
1625
1674
  }
1626
1675
  }
@@ -1630,8 +1679,8 @@ class Decimal128 extends BSONValue {
1630
1679
  significandHigh = Long.fromNumber(0);
1631
1680
  significandLow = Long.fromNumber(0);
1632
1681
  }
1633
- else if (lastDigit - firstDigit < 17) {
1634
- let dIdx = firstDigit;
1682
+ else if (lastDigit < 17) {
1683
+ let dIdx = 0;
1635
1684
  significandLow = Long.fromNumber(digits[dIdx++]);
1636
1685
  significandHigh = new Long(0, 0);
1637
1686
  for (; dIdx <= lastDigit; dIdx++) {
@@ -1640,7 +1689,7 @@ class Decimal128 extends BSONValue {
1640
1689
  }
1641
1690
  }
1642
1691
  else {
1643
- let dIdx = firstDigit;
1692
+ let dIdx = 0;
1644
1693
  significandHigh = Long.fromNumber(digits[dIdx++]);
1645
1694
  for (; dIdx <= lastDigit - 17; dIdx++) {
1646
1695
  significandHigh = significandHigh.multiply(Long.fromNumber(10));
@@ -2414,19 +2463,21 @@ class Timestamp extends LongWithoutOverridesClass {
2414
2463
  if (typeof low.i !== 'number' && (typeof low.i !== 'object' || low.i._bsontype !== 'Int32')) {
2415
2464
  throw new BSONError('Timestamp constructed from { t, i } must provide i as a number');
2416
2465
  }
2417
- if (low.t < 0) {
2466
+ const t = Number(low.t);
2467
+ const i = Number(low.i);
2468
+ if (t < 0 || Number.isNaN(t)) {
2418
2469
  throw new BSONError('Timestamp constructed from { t, i } must provide a positive t');
2419
2470
  }
2420
- if (low.i < 0) {
2471
+ if (i < 0 || Number.isNaN(i)) {
2421
2472
  throw new BSONError('Timestamp constructed from { t, i } must provide a positive i');
2422
2473
  }
2423
- if (low.t > 4294967295) {
2474
+ if (t > 4294967295) {
2424
2475
  throw new BSONError('Timestamp constructed from { t, i } must provide t equal or less than uint32 max');
2425
2476
  }
2426
- if (low.i > 4294967295) {
2477
+ if (i > 4294967295) {
2427
2478
  throw new BSONError('Timestamp constructed from { t, i } must provide i equal or less than uint32 max');
2428
2479
  }
2429
- super(low.i.valueOf(), low.t.valueOf(), true);
2480
+ super(i, t, true);
2430
2481
  }
2431
2482
  else {
2432
2483
  throw new BSONError('A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }');
@@ -2598,7 +2649,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2598
2649
  }
2599
2650
  if (i >= buffer.byteLength)
2600
2651
  throw new BSONError('Bad BSON Document: illegal CString');
2601
- const name = isArray ? arrayIndex++ : ByteUtils.toUTF8(buffer.subarray(index, i));
2652
+ const name = isArray ? arrayIndex++ : ByteUtils.toUTF8(buffer, index, i);
2602
2653
  let shouldValidateKey = true;
2603
2654
  if (globalUTFValidation || utf8KeysSet.has(name)) {
2604
2655
  shouldValidateKey = validationSetting;
@@ -2813,7 +2864,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2813
2864
  }
2814
2865
  if (i >= buffer.length)
2815
2866
  throw new BSONError('Bad BSON Document: illegal CString');
2816
- const source = ByteUtils.toUTF8(buffer.subarray(index, i));
2867
+ const source = ByteUtils.toUTF8(buffer, index, i);
2817
2868
  index = i + 1;
2818
2869
  i = index;
2819
2870
  while (buffer[i] !== 0x00 && i < buffer.length) {
@@ -2821,7 +2872,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2821
2872
  }
2822
2873
  if (i >= buffer.length)
2823
2874
  throw new BSONError('Bad BSON Document: illegal CString');
2824
- const regExpOptions = ByteUtils.toUTF8(buffer.subarray(index, i));
2875
+ const regExpOptions = ByteUtils.toUTF8(buffer, index, i);
2825
2876
  index = i + 1;
2826
2877
  const optionsArray = new Array(regExpOptions.length);
2827
2878
  for (i = 0; i < regExpOptions.length; i++) {
@@ -2846,7 +2897,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2846
2897
  }
2847
2898
  if (i >= buffer.length)
2848
2899
  throw new BSONError('Bad BSON Document: illegal CString');
2849
- const source = ByteUtils.toUTF8(buffer.subarray(index, i));
2900
+ const source = ByteUtils.toUTF8(buffer, index, i);
2850
2901
  index = i + 1;
2851
2902
  i = index;
2852
2903
  while (buffer[i] !== 0x00 && i < buffer.length) {
@@ -2854,7 +2905,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2854
2905
  }
2855
2906
  if (i >= buffer.length)
2856
2907
  throw new BSONError('Bad BSON Document: illegal CString');
2857
- const regExpOptions = ByteUtils.toUTF8(buffer.subarray(index, i));
2908
+ const regExpOptions = ByteUtils.toUTF8(buffer, index, i);
2858
2909
  index = i + 1;
2859
2910
  value = new BSONRegExp(source, regExpOptions);
2860
2911
  }
@@ -2951,7 +3002,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2951
3002
  throw new BSONError('Invalid UTF-8 string in BSON document');
2952
3003
  }
2953
3004
  }
2954
- const namespace = ByteUtils.toUTF8(buffer.subarray(index, index + stringSize - 1));
3005
+ const namespace = ByteUtils.toUTF8(buffer, index, index + stringSize - 1);
2955
3006
  index = index + stringSize;
2956
3007
  const oidBuffer = ByteUtils.allocate(12);
2957
3008
  oidBuffer.set(buffer.subarray(index, index + 12), 0);
@@ -2991,7 +3042,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2991
3042
  return object;
2992
3043
  }
2993
3044
  function getValidatedString(buffer, start, end, shouldValidateUtf8) {
2994
- const value = ByteUtils.toUTF8(buffer.subarray(start, end));
3045
+ const value = ByteUtils.toUTF8(buffer, start, end);
2995
3046
  if (shouldValidateUtf8) {
2996
3047
  for (let i = 0; i < value.length; i++) {
2997
3048
  if (value.charCodeAt(i) === 0xfffd) {