All BatchedQueues should drain when disposed (also adds query string for output: "debug=true") (#5098)

* ensure disposal is correct

* add tests for disposal of batching queue

* fixes for draining disposal

* Update packages/objectloader2/src/queues/batchingQueue.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix comment

* fix tests and build

* add query string inspection of debug parameter

* Update packages/objectloader2/src/queues/batchingQueue.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/objectloader2/src/core/objectLoader2Factory.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix test

* fix AI

* export getQueryParameter to avoid dup code.  Sandbox uses it too

* add tests for functions

* prettier fix

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Adam Hathcock
2025-07-21 12:01:27 +01:00
committed by GitHub
parent 8b73e63bc2
commit 477db6ef02
14 changed files with 412 additions and 113 deletions
@@ -65,11 +65,10 @@ export class ObjectLoader2 {
await Promise.all([
this.#gathered.disposeAsync(),
this.#downloader.disposeAsync(),
this.#cacheWriter.disposeAsync()
this.#cacheWriter.disposeAsync(),
this.#cacheReader.disposeAsync()
])
this.#deferments.dispose()
this.#cacheReader.dispose()
this.#cache.dispose()
}
async getRootObject(): Promise<Item | undefined> {
@@ -1,4 +1,4 @@
import { CustomLogger } from '../types/functions.js'
import { CustomLogger, getQueryParameter } from '../types/functions.js'
import { Base } from '../types/types.js'
import { ObjectLoader2 } from './objectLoader2.js'
import IndexedDatabase from './stages/indexedDatabase.js'
@@ -11,7 +11,7 @@ export interface ObjectLoader2FactoryOptions {
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
keyRange?: { bound: Function; lowerBound: Function; upperBound: Function }
indexedDB?: IDBFactory
logger?: CustomLogger
logger2?: CustomLogger
}
export class ObjectLoader2Factory {
@@ -42,6 +42,7 @@ export class ObjectLoader2Factory {
headers?: Headers
options?: ObjectLoader2FactoryOptions
}): ObjectLoader2 {
const log = ObjectLoader2Factory.getLogger(params.options?.logger2)
let loader: ObjectLoader2
if (params.options?.useMemoryCache) {
loader = new ObjectLoader2({
@@ -56,7 +57,7 @@ export class ObjectLoader2Factory {
database: new MemoryDatabase({
items: new Map<string, Base>()
}),
logger: params.options.logger
logger: log
})
} else {
loader = new ObjectLoader2({
@@ -69,13 +70,24 @@ export class ObjectLoader2Factory {
headers: params.headers
}),
database: new IndexedDatabase({
logger: params.options?.logger,
logger: log,
indexedDB: params.options?.indexedDB,
keyRange: params.options?.keyRange
}),
logger: params.options?.logger
logger: log
})
}
return loader
}
static getLogger(providedLogger?: CustomLogger): CustomLogger | undefined {
if (getQueryParameter('debug', 'false') === 'true') {
return providedLogger || this.logger
}
return providedLogger
}
static logger: CustomLogger = (m?: string, ...optionalParams: unknown[]) => {
console.log(`[debug] ${m}`, ...optionalParams)
}
}
@@ -30,6 +30,6 @@ describe('CacheReader testing', () => {
const base = await objPromise
expect(base).toMatchSnapshot()
cacheReader.dispose()
await cacheReader.disposeAsync()
})
})
@@ -77,7 +77,7 @@ export class CacheReader {
this.#logger('readBatch: left, time', items.length, performance.now() - start)
}
dispose(): void {
this.#readQueue?.dispose()
disposeAsync(): Promise<void> {
return this.#readQueue?.disposeAsync() || Promise.resolve()
}
}
@@ -38,9 +38,8 @@ export class CacheWriter implements Queue<Item> {
}
async disposeAsync(): Promise<void> {
this.#writeQueue?.dispose()
this.#disposed = true
return Promise.resolve()
await this.#writeQueue?.disposeAsync()
}
get isDisposed(): boolean {
@@ -121,8 +121,7 @@ export default class IndexedDatabase implements Database {
async disposeAsync(): Promise<void> {
this.#cacheDB?.close()
this.#cacheDB = undefined
this.#writeQueue?.dispose()
await this.#writeQueue?.disposeAsync()
this.#writeQueue = undefined
return Promise.resolve()
}
}