1
+ import { BSONOffsetError } from '../error' ;
2
+
1
3
const FLOAT = new Float64Array ( 1 ) ;
2
4
const FLOAT_BYTES = new Uint8Array ( FLOAT . buffer , 0 , 8 ) ;
3
5
@@ -13,15 +15,20 @@ const isBigEndian = FLOAT_BYTES[7] === 0;
13
15
* A collection of functions that get or set various numeric types and bit widths from a Uint8Array.
14
16
*/
15
17
export type NumberUtils = {
16
- getInt32LE ( source : Uint8Array , offset : number ) : number ;
17
- getUint32LE ( source : Uint8Array , offset : number ) : number ;
18
- getUint32BE ( source : Uint8Array , offset : number ) : number ;
19
- getBigInt64LE ( source : Uint8Array , offset : number ) : bigint ;
20
- getFloat64LE ( source : Uint8Array , offset : number ) : number ;
21
- setInt32BE ( destination : Uint8Array , offset : number , value : number ) : 4 ;
22
- setInt32LE ( destination : Uint8Array , offset : number , value : number ) : 4 ;
23
- setBigInt64LE ( destination : Uint8Array , offset : number , value : bigint ) : 8 ;
24
- setFloat64LE ( destination : Uint8Array , offset : number , value : number ) : 8 ;
18
+ /**
19
+ * Parses a int32 little-endian at offset, throws if it is negative.
20
+ * - size as in `size_t`
21
+ */
22
+ getSize : ( source : Uint8Array , offset : number ) => number ;
23
+ getInt32LE : ( source : Uint8Array , offset : number ) => number ;
24
+ getUint32LE : ( source : Uint8Array , offset : number ) => number ;
25
+ getUint32BE : ( source : Uint8Array , offset : number ) => number ;
26
+ getBigInt64LE : ( source : Uint8Array , offset : number ) => bigint ;
27
+ getFloat64LE : ( source : Uint8Array , offset : number ) => number ;
28
+ setInt32BE : ( destination : Uint8Array , offset : number , value : number ) => 4 ;
29
+ setInt32LE : ( destination : Uint8Array , offset : number , value : number ) => 4 ;
30
+ setBigInt64LE : ( destination : Uint8Array , offset : number , value : bigint ) => 8 ;
31
+ setFloat64LE : ( destination : Uint8Array , offset : number , value : number ) => 8 ;
25
32
} ;
26
33
27
34
/**
@@ -31,6 +38,18 @@ export type NumberUtils = {
31
38
* @public
32
39
*/
33
40
export const NumberUtils : NumberUtils = {
41
+ getSize ( source : Uint8Array , offset : number ) : number {
42
+ if ( source [ offset + 3 ] > 127 ) {
43
+ throw new BSONOffsetError ( 'BSON size cannot be negative' , offset ) ;
44
+ }
45
+ return (
46
+ source [ offset ] |
47
+ ( source [ offset + 1 ] << 8 ) |
48
+ ( source [ offset + 2 ] << 16 ) |
49
+ ( source [ offset + 3 ] << 24 )
50
+ ) ;
51
+ } ,
52
+
34
53
/** Reads a little-endian 32-bit integer from source */
35
54
getInt32LE ( source : Uint8Array , offset : number ) : number {
36
55
return (
0 commit comments