1+ import { BSONOffsetError } from '../error' ;
2+
13const FLOAT = new Float64Array ( 1 ) ;
24const FLOAT_BYTES = new Uint8Array ( FLOAT . buffer , 0 , 8 ) ;
35
@@ -13,15 +15,20 @@ const isBigEndian = FLOAT_BYTES[7] === 0;
1315 * A collection of functions that get or set various numeric types and bit widths from a Uint8Array.
1416 */
1517export 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 ;
2532} ;
2633
2734/**
@@ -31,6 +38,18 @@ export type NumberUtils = {
3138 * @public
3239 */
3340export 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+
3453 /** Reads a little-endian 32-bit integer from source */
3554 getInt32LE ( source : Uint8Array , offset : number ) : number {
3655 return (
0 commit comments