bson 6.4.0 → 6.4.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/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "vendor"
15
15
  ],
16
16
  "types": "bson.d.ts",
17
- "version": "6.4.0",
17
+ "version": "6.4.1",
18
18
  "author": {
19
19
  "name": "The MongoDB NodeJS Team",
20
20
  "email": "dbx-node@mongodb.com"
@@ -1,6 +1,11 @@
1
1
  const FLOAT = new Float64Array(1);
2
2
  const FLOAT_BYTES = new Uint8Array(FLOAT.buffer, 0, 8);
3
3
 
4
+ FLOAT[0] = -1;
5
+ // Little endian [0, 0, 0, 0, 0, 0, 240, 191]
6
+ // Big endian [191, 240, 0, 0, 0, 0, 0, 0]
7
+ const isBigEndian = FLOAT_BYTES[7] === 0;
8
+
4
9
  /**
5
10
  * Number parsing and serializing utilities.
6
11
  *
@@ -39,28 +44,49 @@ export const NumberUtils = {
39
44
 
40
45
  /** Reads a little-endian 64-bit integer from source */
41
46
  getBigInt64LE(source: Uint8Array, offset: number): bigint {
42
- const lo = NumberUtils.getUint32LE(source, offset);
43
- const hi = NumberUtils.getUint32LE(source, offset + 4);
47
+ // eslint-disable-next-line no-restricted-globals
48
+ const hi = BigInt(
49
+ source[offset + 4] +
50
+ source[offset + 5] * 256 +
51
+ source[offset + 6] * 65536 +
52
+ (source[offset + 7] << 24)
53
+ ); // Overflow
44
54
 
45
- /*
46
- eslint-disable-next-line no-restricted-globals
47
- -- This is allowed since this helper should not be called unless bigint features are enabled
48
- */
49
- return (BigInt(hi) << BigInt(32)) + BigInt(lo);
55
+ // eslint-disable-next-line no-restricted-globals
56
+ const lo = BigInt(
57
+ source[offset] +
58
+ source[offset + 1] * 256 +
59
+ source[offset + 2] * 65536 +
60
+ source[offset + 3] * 16777216
61
+ );
62
+ // eslint-disable-next-line no-restricted-globals
63
+ return (hi << BigInt(32)) + lo;
50
64
  },
51
65
 
52
66
  /** Reads a little-endian 64-bit float from source */
53
- getFloat64LE(source: Uint8Array, offset: number): number {
54
- FLOAT_BYTES[0] = source[offset];
55
- FLOAT_BYTES[1] = source[offset + 1];
56
- FLOAT_BYTES[2] = source[offset + 2];
57
- FLOAT_BYTES[3] = source[offset + 3];
58
- FLOAT_BYTES[4] = source[offset + 4];
59
- FLOAT_BYTES[5] = source[offset + 5];
60
- FLOAT_BYTES[6] = source[offset + 6];
61
- FLOAT_BYTES[7] = source[offset + 7];
62
- return FLOAT[0];
63
- },
67
+ getFloat64LE: isBigEndian
68
+ ? (source: Uint8Array, offset: number) => {
69
+ FLOAT_BYTES[7] = source[offset];
70
+ FLOAT_BYTES[6] = source[offset + 1];
71
+ FLOAT_BYTES[5] = source[offset + 2];
72
+ FLOAT_BYTES[4] = source[offset + 3];
73
+ FLOAT_BYTES[3] = source[offset + 4];
74
+ FLOAT_BYTES[2] = source[offset + 5];
75
+ FLOAT_BYTES[1] = source[offset + 6];
76
+ FLOAT_BYTES[0] = source[offset + 7];
77
+ return FLOAT[0];
78
+ }
79
+ : (source: Uint8Array, offset: number) => {
80
+ FLOAT_BYTES[0] = source[offset];
81
+ FLOAT_BYTES[1] = source[offset + 1];
82
+ FLOAT_BYTES[2] = source[offset + 2];
83
+ FLOAT_BYTES[3] = source[offset + 3];
84
+ FLOAT_BYTES[4] = source[offset + 4];
85
+ FLOAT_BYTES[5] = source[offset + 5];
86
+ FLOAT_BYTES[6] = source[offset + 6];
87
+ FLOAT_BYTES[7] = source[offset + 7];
88
+ return FLOAT[0];
89
+ },
64
90
 
65
91
  /** Writes a big-endian 32-bit integer to destination, can be signed or unsigned */
66
92
  setInt32BE(destination: Uint8Array, offset: number, value: number): 4 {
@@ -120,16 +146,29 @@ export const NumberUtils = {
120
146
  },
121
147
 
122
148
  /** Writes a little-endian 64-bit float to destination */
123
- setFloat64LE(destination: Uint8Array, offset: number, value: number): 8 {
124
- FLOAT[0] = value;
125
- destination[offset] = FLOAT_BYTES[0];
126
- destination[offset + 1] = FLOAT_BYTES[1];
127
- destination[offset + 2] = FLOAT_BYTES[2];
128
- destination[offset + 3] = FLOAT_BYTES[3];
129
- destination[offset + 4] = FLOAT_BYTES[4];
130
- destination[offset + 5] = FLOAT_BYTES[5];
131
- destination[offset + 6] = FLOAT_BYTES[6];
132
- destination[offset + 7] = FLOAT_BYTES[7];
133
- return 8;
134
- }
149
+ setFloat64LE: isBigEndian
150
+ ? (destination: Uint8Array, offset: number, value: number) => {
151
+ FLOAT[0] = value;
152
+ destination[offset] = FLOAT_BYTES[7];
153
+ destination[offset + 1] = FLOAT_BYTES[6];
154
+ destination[offset + 2] = FLOAT_BYTES[5];
155
+ destination[offset + 3] = FLOAT_BYTES[4];
156
+ destination[offset + 4] = FLOAT_BYTES[3];
157
+ destination[offset + 5] = FLOAT_BYTES[2];
158
+ destination[offset + 6] = FLOAT_BYTES[1];
159
+ destination[offset + 7] = FLOAT_BYTES[0];
160
+ return 8;
161
+ }
162
+ : (destination: Uint8Array, offset: number, value: number) => {
163
+ FLOAT[0] = value;
164
+ destination[offset] = FLOAT_BYTES[0];
165
+ destination[offset + 1] = FLOAT_BYTES[1];
166
+ destination[offset + 2] = FLOAT_BYTES[2];
167
+ destination[offset + 3] = FLOAT_BYTES[3];
168
+ destination[offset + 4] = FLOAT_BYTES[4];
169
+ destination[offset + 5] = FLOAT_BYTES[5];
170
+ destination[offset + 6] = FLOAT_BYTES[6];
171
+ destination[offset + 7] = FLOAT_BYTES[7];
172
+ return 8;
173
+ }
135
174
  };