@@ -4,6 +4,7 @@ import type { DBWorkerModule } from './workers/dbWorkerModule';
4
4
import os from 'os' ;
5
5
import path from 'path' ;
6
6
import fs from 'fs' ;
7
+ import nodeCrypto from 'crypto' ;
7
8
import lexi from 'lexicographic-integer' ;
8
9
import Logger , { LogLevel , StreamHandler } from '@matrixai/logger' ;
9
10
import { WorkerManager } from '@matrixai/workers' ;
@@ -259,6 +260,29 @@ describe('DB', () => {
259
260
expect ( keys . sort ( ) ) . toEqual ( keysIterated ) ;
260
261
await db . stop ( ) ;
261
262
} ) ;
263
+ test ( 'lexicographic buffer iteration order' , async ( ) => {
264
+ const dbPath = `${ dataDir } /db` ;
265
+ const db = await DB . createDB ( { dbPath, crypto, logger } ) ;
266
+ const keys : Array < Buffer > = Array . from ( { length : 100 } , ( ) =>
267
+ nodeCrypto . randomBytes ( 3 ) ,
268
+ ) ;
269
+ for ( const k of keys ) {
270
+ await db . put ( [ ] , k , 'value' ) ;
271
+ }
272
+ const keysIterated : Array < Buffer > = [ ] ;
273
+ for await ( const k of db . db . createKeyStream ( ) ) {
274
+ keysIterated . push ( k as Buffer ) ;
275
+ }
276
+ expect ( keys ) . not . toStrictEqual ( keysIterated ) ;
277
+ expect ( keys . sort ( Buffer . compare ) ) . toStrictEqual ( keysIterated ) ;
278
+ // Buffers can be considered can be considered big-endian numbers
279
+ const keysNumeric = keys . map ( utils . bytes2BigInt ) ;
280
+ // Therefore lexicographic ordering of buffers is equal to numeric ordering of bytes
281
+ expect (
282
+ keysNumeric . slice ( 1 ) . every ( ( item , i ) => keysNumeric [ i ] <= item ) ,
283
+ ) . toBe ( true ) ;
284
+ await db . stop ( ) ;
285
+ } ) ;
262
286
test ( 'lexicographic integer iteration' , async ( ) => {
263
287
// Using the lexicographic-integer encoding
264
288
const dbPath = `${ dataDir } /db` ;
0 commit comments