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.cjs CHANGED
@@ -165,8 +165,8 @@ const nodeJsByteUtils = {
165
165
  fromUTF8(text) {
166
166
  return Buffer.from(text, 'utf8');
167
167
  },
168
- toUTF8(buffer) {
169
- return nodeJsByteUtils.toLocalBufferType(buffer).toString('utf8');
168
+ toUTF8(buffer, start, end) {
169
+ return nodeJsByteUtils.toLocalBufferType(buffer).toString('utf8', start, end);
170
170
  },
171
171
  utf8ByteLength(input) {
172
172
  return Buffer.byteLength(input, 'utf8');
@@ -276,8 +276,8 @@ const webByteUtils = {
276
276
  fromUTF8(text) {
277
277
  return new TextEncoder().encode(text);
278
278
  },
279
- toUTF8(uint8array) {
280
- return new TextDecoder('utf8', { fatal: false }).decode(uint8array);
279
+ toUTF8(uint8array, start, end) {
280
+ return new TextDecoder('utf8', { fatal: false }).decode(uint8array.slice(start, end));
281
281
  },
282
282
  utf8ByteLength(input) {
283
283
  return webByteUtils.fromUTF8(input).byteLength;
@@ -409,8 +409,8 @@ class Binary extends BSONValue {
409
409
  if (encoding === 'base64')
410
410
  return ByteUtils.toBase64(this.buffer);
411
411
  if (encoding === 'utf8' || encoding === 'utf-8')
412
- return ByteUtils.toUTF8(this.buffer);
413
- return ByteUtils.toUTF8(this.buffer);
412
+ return ByteUtils.toUTF8(this.buffer, 0, this.buffer.byteLength);
413
+ return ByteUtils.toUTF8(this.buffer, 0, this.buffer.byteLength);
414
414
  }
415
415
  toExtendedJSON(options) {
416
416
  options = options || {};
@@ -1436,7 +1436,14 @@ class Decimal128 extends BSONValue {
1436
1436
  }
1437
1437
  }
1438
1438
  static fromString(representation) {
1439
+ return Decimal128._fromString(representation, { allowRounding: false });
1440
+ }
1441
+ static fromStringWithRounding(representation) {
1442
+ return Decimal128._fromString(representation, { allowRounding: true });
1443
+ }
1444
+ static _fromString(representation, options) {
1439
1445
  let isNegative = false;
1446
+ let sawSign = false;
1440
1447
  let sawRadix = false;
1441
1448
  let foundNonZero = false;
1442
1449
  let significantDigits = 0;
@@ -1447,10 +1454,8 @@ class Decimal128 extends BSONValue {
1447
1454
  const digits = [0];
1448
1455
  let nDigitsStored = 0;
1449
1456
  let digitsInsert = 0;
1450
- let firstDigit = 0;
1451
1457
  let lastDigit = 0;
1452
1458
  let exponent = 0;
1453
- let i = 0;
1454
1459
  let significandHigh = new Long(0, 0);
1455
1460
  let significandLow = new Long(0, 0);
1456
1461
  let biasedExponent = 0;
@@ -1478,6 +1483,7 @@ class Decimal128 extends BSONValue {
1478
1483
  }
1479
1484
  }
1480
1485
  if (representation[index] === '+' || representation[index] === '-') {
1486
+ sawSign = true;
1481
1487
  isNegative = representation[index++] === '-';
1482
1488
  }
1483
1489
  if (!isDigit(representation[index]) && representation[index] !== '.') {
@@ -1496,7 +1502,7 @@ class Decimal128 extends BSONValue {
1496
1502
  index = index + 1;
1497
1503
  continue;
1498
1504
  }
1499
- if (nDigitsStored < 34) {
1505
+ if (nDigitsStored < MAX_DIGITS) {
1500
1506
  if (representation[index] !== '0' || foundNonZero) {
1501
1507
  if (!foundNonZero) {
1502
1508
  firstNonZero = nDigitsRead;
@@ -1524,10 +1530,7 @@ class Decimal128 extends BSONValue {
1524
1530
  }
1525
1531
  if (representation[index])
1526
1532
  return new Decimal128(NAN_BUFFER);
1527
- firstDigit = 0;
1528
1533
  if (!nDigitsStored) {
1529
- firstDigit = 0;
1530
- lastDigit = 0;
1531
1534
  digits[0] = 0;
1532
1535
  nDigits = 1;
1533
1536
  nDigitsStored = 1;
@@ -1537,12 +1540,12 @@ class Decimal128 extends BSONValue {
1537
1540
  lastDigit = nDigitsStored - 1;
1538
1541
  significantDigits = nDigits;
1539
1542
  if (significantDigits !== 1) {
1540
- while (digits[firstNonZero + significantDigits - 1] === 0) {
1543
+ while (representation[firstNonZero + significantDigits - 1 + Number(sawSign) + Number(sawRadix)] === '0') {
1541
1544
  significantDigits = significantDigits - 1;
1542
1545
  }
1543
1546
  }
1544
1547
  }
1545
- if (exponent <= radixPosition && radixPosition - exponent > 1 << 14) {
1548
+ if (exponent <= radixPosition && radixPosition > exponent + (1 << 14)) {
1546
1549
  exponent = EXPONENT_MIN;
1547
1550
  }
1548
1551
  else {
@@ -1550,9 +1553,8 @@ class Decimal128 extends BSONValue {
1550
1553
  }
1551
1554
  while (exponent > EXPONENT_MAX) {
1552
1555
  lastDigit = lastDigit + 1;
1553
- if (lastDigit - firstDigit > MAX_DIGITS) {
1554
- const digitsString = digits.join('');
1555
- if (digitsString.match(/^0+$/)) {
1556
+ if (lastDigit >= MAX_DIGITS) {
1557
+ if (significantDigits === 0) {
1556
1558
  exponent = EXPONENT_MAX;
1557
1559
  break;
1558
1560
  }
@@ -1560,69 +1562,116 @@ class Decimal128 extends BSONValue {
1560
1562
  }
1561
1563
  exponent = exponent - 1;
1562
1564
  }
1563
- while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) {
1564
- if (lastDigit === 0 && significantDigits < nDigitsStored) {
1565
- exponent = EXPONENT_MIN;
1566
- significantDigits = 0;
1567
- break;
1568
- }
1569
- if (nDigitsStored < nDigits) {
1570
- nDigits = nDigits - 1;
1571
- }
1572
- else {
1573
- lastDigit = lastDigit - 1;
1574
- }
1575
- if (exponent < EXPONENT_MAX) {
1576
- exponent = exponent + 1;
1577
- }
1578
- else {
1579
- const digitsString = digits.join('');
1580
- if (digitsString.match(/^0+$/)) {
1581
- exponent = EXPONENT_MAX;
1565
+ if (options.allowRounding) {
1566
+ while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) {
1567
+ if (lastDigit === 0 && significantDigits < nDigitsStored) {
1568
+ exponent = EXPONENT_MIN;
1569
+ significantDigits = 0;
1582
1570
  break;
1583
1571
  }
1584
- invalidErr(representation, 'overflow');
1585
- }
1586
- }
1587
- if (lastDigit - firstDigit + 1 < significantDigits) {
1588
- let endOfString = nDigitsRead;
1589
- if (sawRadix) {
1590
- firstNonZero = firstNonZero + 1;
1591
- endOfString = endOfString + 1;
1592
- }
1593
- if (isNegative) {
1594
- firstNonZero = firstNonZero + 1;
1595
- endOfString = endOfString + 1;
1596
- }
1597
- const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10);
1598
- let roundBit = 0;
1599
- if (roundDigit >= 5) {
1600
- roundBit = 1;
1601
- if (roundDigit === 5) {
1602
- roundBit = digits[lastDigit] % 2 === 1 ? 1 : 0;
1603
- for (i = firstNonZero + lastDigit + 2; i < endOfString; i++) {
1604
- if (parseInt(representation[i], 10)) {
1605
- roundBit = 1;
1606
- break;
1607
- }
1572
+ if (nDigitsStored < nDigits) {
1573
+ nDigits = nDigits - 1;
1574
+ }
1575
+ else {
1576
+ lastDigit = lastDigit - 1;
1577
+ }
1578
+ if (exponent < EXPONENT_MAX) {
1579
+ exponent = exponent + 1;
1580
+ }
1581
+ else {
1582
+ const digitsString = digits.join('');
1583
+ if (digitsString.match(/^0+$/)) {
1584
+ exponent = EXPONENT_MAX;
1585
+ break;
1608
1586
  }
1587
+ invalidErr(representation, 'overflow');
1609
1588
  }
1610
1589
  }
1611
- if (roundBit) {
1612
- let dIdx = lastDigit;
1613
- for (; dIdx >= 0; dIdx--) {
1614
- if (++digits[dIdx] > 9) {
1615
- digits[dIdx] = 0;
1616
- if (dIdx === 0) {
1617
- if (exponent < EXPONENT_MAX) {
1618
- exponent = exponent + 1;
1619
- digits[dIdx] = 1;
1590
+ if (lastDigit + 1 < significantDigits) {
1591
+ let endOfString = nDigitsRead;
1592
+ if (sawRadix) {
1593
+ firstNonZero = firstNonZero + 1;
1594
+ endOfString = endOfString + 1;
1595
+ }
1596
+ if (sawSign) {
1597
+ firstNonZero = firstNonZero + 1;
1598
+ endOfString = endOfString + 1;
1599
+ }
1600
+ const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10);
1601
+ let roundBit = 0;
1602
+ if (roundDigit >= 5) {
1603
+ roundBit = 1;
1604
+ if (roundDigit === 5) {
1605
+ roundBit = digits[lastDigit] % 2 === 1 ? 1 : 0;
1606
+ for (let i = firstNonZero + lastDigit + 2; i < endOfString; i++) {
1607
+ if (parseInt(representation[i], 10)) {
1608
+ roundBit = 1;
1609
+ break;
1620
1610
  }
1621
- else {
1622
- return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER);
1611
+ }
1612
+ }
1613
+ }
1614
+ if (roundBit) {
1615
+ let dIdx = lastDigit;
1616
+ for (; dIdx >= 0; dIdx--) {
1617
+ if (++digits[dIdx] > 9) {
1618
+ digits[dIdx] = 0;
1619
+ if (dIdx === 0) {
1620
+ if (exponent < EXPONENT_MAX) {
1621
+ exponent = exponent + 1;
1622
+ digits[dIdx] = 1;
1623
+ }
1624
+ else {
1625
+ return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER);
1626
+ }
1623
1627
  }
1624
1628
  }
1629
+ else {
1630
+ break;
1631
+ }
1632
+ }
1633
+ }
1634
+ }
1635
+ }
1636
+ else {
1637
+ while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) {
1638
+ if (lastDigit === 0) {
1639
+ if (significantDigits === 0) {
1640
+ exponent = EXPONENT_MIN;
1641
+ break;
1625
1642
  }
1643
+ invalidErr(representation, 'exponent underflow');
1644
+ }
1645
+ if (nDigitsStored < nDigits) {
1646
+ if (representation[nDigits - 1 + Number(sawSign) + Number(sawRadix)] !== '0' &&
1647
+ significantDigits !== 0) {
1648
+ invalidErr(representation, 'inexact rounding');
1649
+ }
1650
+ nDigits = nDigits - 1;
1651
+ }
1652
+ else {
1653
+ if (digits[lastDigit] !== 0) {
1654
+ invalidErr(representation, 'inexact rounding');
1655
+ }
1656
+ lastDigit = lastDigit - 1;
1657
+ }
1658
+ if (exponent < EXPONENT_MAX) {
1659
+ exponent = exponent + 1;
1660
+ }
1661
+ else {
1662
+ invalidErr(representation, 'overflow');
1663
+ }
1664
+ }
1665
+ if (lastDigit + 1 < significantDigits) {
1666
+ if (sawRadix) {
1667
+ firstNonZero = firstNonZero + 1;
1668
+ }
1669
+ if (sawSign) {
1670
+ firstNonZero = firstNonZero + 1;
1671
+ }
1672
+ const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10);
1673
+ if (roundDigit !== 0) {
1674
+ invalidErr(representation, 'inexact rounding');
1626
1675
  }
1627
1676
  }
1628
1677
  }
@@ -1632,8 +1681,8 @@ class Decimal128 extends BSONValue {
1632
1681
  significandHigh = Long.fromNumber(0);
1633
1682
  significandLow = Long.fromNumber(0);
1634
1683
  }
1635
- else if (lastDigit - firstDigit < 17) {
1636
- let dIdx = firstDigit;
1684
+ else if (lastDigit < 17) {
1685
+ let dIdx = 0;
1637
1686
  significandLow = Long.fromNumber(digits[dIdx++]);
1638
1687
  significandHigh = new Long(0, 0);
1639
1688
  for (; dIdx <= lastDigit; dIdx++) {
@@ -1642,7 +1691,7 @@ class Decimal128 extends BSONValue {
1642
1691
  }
1643
1692
  }
1644
1693
  else {
1645
- let dIdx = firstDigit;
1694
+ let dIdx = 0;
1646
1695
  significandHigh = Long.fromNumber(digits[dIdx++]);
1647
1696
  for (; dIdx <= lastDigit - 17; dIdx++) {
1648
1697
  significandHigh = significandHigh.multiply(Long.fromNumber(10));
@@ -2416,19 +2465,21 @@ class Timestamp extends LongWithoutOverridesClass {
2416
2465
  if (typeof low.i !== 'number' && (typeof low.i !== 'object' || low.i._bsontype !== 'Int32')) {
2417
2466
  throw new BSONError('Timestamp constructed from { t, i } must provide i as a number');
2418
2467
  }
2419
- if (low.t < 0) {
2468
+ const t = Number(low.t);
2469
+ const i = Number(low.i);
2470
+ if (t < 0 || Number.isNaN(t)) {
2420
2471
  throw new BSONError('Timestamp constructed from { t, i } must provide a positive t');
2421
2472
  }
2422
- if (low.i < 0) {
2473
+ if (i < 0 || Number.isNaN(i)) {
2423
2474
  throw new BSONError('Timestamp constructed from { t, i } must provide a positive i');
2424
2475
  }
2425
- if (low.t > 4294967295) {
2476
+ if (t > 4294967295) {
2426
2477
  throw new BSONError('Timestamp constructed from { t, i } must provide t equal or less than uint32 max');
2427
2478
  }
2428
- if (low.i > 4294967295) {
2479
+ if (i > 4294967295) {
2429
2480
  throw new BSONError('Timestamp constructed from { t, i } must provide i equal or less than uint32 max');
2430
2481
  }
2431
- super(low.i.valueOf(), low.t.valueOf(), true);
2482
+ super(i, t, true);
2432
2483
  }
2433
2484
  else {
2434
2485
  throw new BSONError('A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }');
@@ -2600,7 +2651,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2600
2651
  }
2601
2652
  if (i >= buffer.byteLength)
2602
2653
  throw new BSONError('Bad BSON Document: illegal CString');
2603
- const name = isArray ? arrayIndex++ : ByteUtils.toUTF8(buffer.subarray(index, i));
2654
+ const name = isArray ? arrayIndex++ : ByteUtils.toUTF8(buffer, index, i);
2604
2655
  let shouldValidateKey = true;
2605
2656
  if (globalUTFValidation || utf8KeysSet.has(name)) {
2606
2657
  shouldValidateKey = validationSetting;
@@ -2815,7 +2866,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2815
2866
  }
2816
2867
  if (i >= buffer.length)
2817
2868
  throw new BSONError('Bad BSON Document: illegal CString');
2818
- const source = ByteUtils.toUTF8(buffer.subarray(index, i));
2869
+ const source = ByteUtils.toUTF8(buffer, index, i);
2819
2870
  index = i + 1;
2820
2871
  i = index;
2821
2872
  while (buffer[i] !== 0x00 && i < buffer.length) {
@@ -2823,7 +2874,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2823
2874
  }
2824
2875
  if (i >= buffer.length)
2825
2876
  throw new BSONError('Bad BSON Document: illegal CString');
2826
- const regExpOptions = ByteUtils.toUTF8(buffer.subarray(index, i));
2877
+ const regExpOptions = ByteUtils.toUTF8(buffer, index, i);
2827
2878
  index = i + 1;
2828
2879
  const optionsArray = new Array(regExpOptions.length);
2829
2880
  for (i = 0; i < regExpOptions.length; i++) {
@@ -2848,7 +2899,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2848
2899
  }
2849
2900
  if (i >= buffer.length)
2850
2901
  throw new BSONError('Bad BSON Document: illegal CString');
2851
- const source = ByteUtils.toUTF8(buffer.subarray(index, i));
2902
+ const source = ByteUtils.toUTF8(buffer, index, i);
2852
2903
  index = i + 1;
2853
2904
  i = index;
2854
2905
  while (buffer[i] !== 0x00 && i < buffer.length) {
@@ -2856,7 +2907,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2856
2907
  }
2857
2908
  if (i >= buffer.length)
2858
2909
  throw new BSONError('Bad BSON Document: illegal CString');
2859
- const regExpOptions = ByteUtils.toUTF8(buffer.subarray(index, i));
2910
+ const regExpOptions = ByteUtils.toUTF8(buffer, index, i);
2860
2911
  index = i + 1;
2861
2912
  value = new BSONRegExp(source, regExpOptions);
2862
2913
  }
@@ -2953,7 +3004,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2953
3004
  throw new BSONError('Invalid UTF-8 string in BSON document');
2954
3005
  }
2955
3006
  }
2956
- const namespace = ByteUtils.toUTF8(buffer.subarray(index, index + stringSize - 1));
3007
+ const namespace = ByteUtils.toUTF8(buffer, index, index + stringSize - 1);
2957
3008
  index = index + stringSize;
2958
3009
  const oidBuffer = ByteUtils.allocate(12);
2959
3010
  oidBuffer.set(buffer.subarray(index, index + 12), 0);
@@ -2993,7 +3044,7 @@ function deserializeObject(buffer, index, options, isArray = false) {
2993
3044
  return object;
2994
3045
  }
2995
3046
  function getValidatedString(buffer, start, end, shouldValidateUtf8) {
2996
- const value = ByteUtils.toUTF8(buffer.subarray(start, end));
3047
+ const value = ByteUtils.toUTF8(buffer, start, end);
2997
3048
  if (shouldValidateUtf8) {
2998
3049
  for (let i = 0; i < value.length; i++) {
2999
3050
  if (value.charCodeAt(i) === 0xfffd) {