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.
- package/README.md +4 -11
- package/bson.d.ts +20 -0
- package/lib/bson.bundle.js +137 -86
- package/lib/bson.bundle.js.map +1 -1
- package/lib/bson.cjs +137 -86
- package/lib/bson.cjs.map +1 -1
- package/lib/bson.mjs +137 -86
- package/lib/bson.mjs.map +1 -1
- package/lib/bson.rn.cjs +4159 -0
- package/lib/bson.rn.cjs.map +1 -0
- package/package.json +8 -7
- package/src/binary.ts +3 -2
- package/src/bson.ts +2 -2
- package/src/decimal128.ts +165 -84
- package/src/parser/deserializer.ts +8 -8
- package/src/timestamp.ts +7 -5
- package/src/utils/byte_utils.ts +1 -1
- package/src/utils/node_byte_utils.ts +3 -3
- package/src/utils/web_byte_utils.ts +2 -2
- package/vendor/base64/LICENSE-MIT.txt +20 -0
- package/vendor/base64/README.md +112 -0
- package/vendor/base64/base64.js +157 -0
- package/vendor/base64/package.json +43 -0
- package/vendor/text-encoding/LICENSE.md +237 -0
- package/vendor/text-encoding/README.md +111 -0
- package/vendor/text-encoding/index.js +9 -0
- package/vendor/text-encoding/lib/encoding-indexes.js +47 -0
- package/vendor/text-encoding/lib/encoding.js +3301 -0
- package/vendor/text-encoding/package.json +37 -0
- package/lib/binary.d.ts +0 -182
- package/lib/binary.d.ts.map +0 -1
- package/lib/bson.d.ts +0 -97
- package/lib/bson.d.ts.map +0 -1
- package/lib/bson_value.d.ts +0 -10
- package/lib/bson_value.d.ts.map +0 -1
- package/lib/code.d.ts +0 -32
- package/lib/code.d.ts.map +0 -1
- package/lib/constants.d.ts +0 -107
- package/lib/constants.d.ts.map +0 -1
- package/lib/db_ref.d.ts +0 -40
- package/lib/db_ref.d.ts.map +0 -1
- package/lib/decimal128.d.ts +0 -34
- package/lib/decimal128.d.ts.map +0 -1
- package/lib/double.d.ts +0 -35
- package/lib/double.d.ts.map +0 -1
- package/lib/error.d.ts +0 -50
- package/lib/error.d.ts.map +0 -1
- package/lib/extended_json.d.ts +0 -82
- package/lib/extended_json.d.ts.map +0 -1
- package/lib/index.d.ts +0 -4
- package/lib/index.d.ts.map +0 -1
- package/lib/int_32.d.ts +0 -35
- package/lib/int_32.d.ts.map +0 -1
- package/lib/long.d.ts +0 -323
- package/lib/long.d.ts.map +0 -1
- package/lib/max_key.d.ts +0 -19
- package/lib/max_key.d.ts.map +0 -1
- package/lib/min_key.d.ts +0 -19
- package/lib/min_key.d.ts.map +0 -1
- package/lib/objectid.d.ts +0 -96
- package/lib/objectid.d.ts.map +0 -1
- package/lib/regexp.d.ts +0 -36
- package/lib/regexp.d.ts.map +0 -1
- package/lib/symbol.d.ts +0 -28
- package/lib/symbol.d.ts.map +0 -1
- package/lib/timestamp.d.ts +0 -66
- package/lib/timestamp.d.ts.map +0 -1
- package/lib/validate_utf8.d.ts +0 -10
- 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 <
|
|
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 (
|
|
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
|
|
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
|
|
1552
|
-
|
|
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
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
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
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
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 (
|
|
1610
|
-
let
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
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
|
-
|
|
1620
|
-
|
|
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
|
|
1634
|
-
let dIdx =
|
|
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 =
|
|
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
|
-
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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) {
|