@kingsy/objectloader2 2.25.7
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/.tshy/build.json +8 -0
- package/.tshy/commonjs.json +17 -0
- package/.tshy/esm.json +16 -0
- package/dist/commonjs/helpers/aggregateQueue.d.ts +8 -0
- package/dist/commonjs/helpers/aggregateQueue.d.ts.map +1 -0
- package/dist/commonjs/helpers/aggregateQueue.js +19 -0
- package/dist/commonjs/helpers/aggregateQueue.js.map +1 -0
- package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts +8 -0
- package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts.map +1 -0
- package/dist/commonjs/helpers/asyncGeneratorQueue.js +35 -0
- package/dist/commonjs/helpers/asyncGeneratorQueue.js.map +1 -0
- package/dist/commonjs/helpers/batchedPool.d.ts +12 -0
- package/dist/commonjs/helpers/batchedPool.d.ts.map +1 -0
- package/dist/commonjs/helpers/batchedPool.js +45 -0
- package/dist/commonjs/helpers/batchedPool.js.map +1 -0
- package/dist/commonjs/helpers/batchingQueue.d.ts +14 -0
- package/dist/commonjs/helpers/batchingQueue.d.ts.map +1 -0
- package/dist/commonjs/helpers/batchingQueue.js +77 -0
- package/dist/commonjs/helpers/batchingQueue.js.map +1 -0
- package/dist/commonjs/helpers/bufferQueue.d.ts +7 -0
- package/dist/commonjs/helpers/bufferQueue.d.ts.map +1 -0
- package/dist/commonjs/helpers/bufferQueue.js +13 -0
- package/dist/commonjs/helpers/bufferQueue.js.map +1 -0
- package/dist/commonjs/helpers/cachePump.d.ts +22 -0
- package/dist/commonjs/helpers/cachePump.d.ts.map +1 -0
- package/dist/commonjs/helpers/cachePump.js +86 -0
- package/dist/commonjs/helpers/cachePump.js.map +1 -0
- package/dist/commonjs/helpers/cacheReader.d.ts +14 -0
- package/dist/commonjs/helpers/cacheReader.d.ts.map +1 -0
- package/dist/commonjs/helpers/cacheReader.js +58 -0
- package/dist/commonjs/helpers/cacheReader.js.map +1 -0
- package/dist/commonjs/helpers/defermentManager.d.ts +28 -0
- package/dist/commonjs/helpers/defermentManager.d.ts.map +1 -0
- package/dist/commonjs/helpers/defermentManager.js +150 -0
- package/dist/commonjs/helpers/defermentManager.js.map +1 -0
- package/dist/commonjs/helpers/deferredBase.d.ts +19 -0
- package/dist/commonjs/helpers/deferredBase.d.ts.map +1 -0
- package/dist/commonjs/helpers/deferredBase.js +51 -0
- package/dist/commonjs/helpers/deferredBase.js.map +1 -0
- package/dist/commonjs/helpers/keyedQueue.d.ts +11 -0
- package/dist/commonjs/helpers/keyedQueue.d.ts.map +1 -0
- package/dist/commonjs/helpers/keyedQueue.js +41 -0
- package/dist/commonjs/helpers/keyedQueue.js.map +1 -0
- package/dist/commonjs/helpers/memoryPump.d.ts +15 -0
- package/dist/commonjs/helpers/memoryPump.d.ts.map +1 -0
- package/dist/commonjs/helpers/memoryPump.js +34 -0
- package/dist/commonjs/helpers/memoryPump.js.map +1 -0
- package/dist/commonjs/helpers/pump.d.ts +8 -0
- package/dist/commonjs/helpers/pump.d.ts.map +1 -0
- package/dist/commonjs/helpers/pump.js +3 -0
- package/dist/commonjs/helpers/pump.js.map +1 -0
- package/dist/commonjs/helpers/queue.d.ts +4 -0
- package/dist/commonjs/helpers/queue.d.ts.map +1 -0
- package/dist/commonjs/helpers/queue.js +3 -0
- package/dist/commonjs/helpers/queue.js.map +1 -0
- package/dist/commonjs/index.d.ts +3 -0
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +8 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/operations/databases/indexedDatabase.d.ts +27 -0
- package/dist/commonjs/operations/databases/indexedDatabase.d.ts.map +1 -0
- package/dist/commonjs/operations/databases/indexedDatabase.js +98 -0
- package/dist/commonjs/operations/databases/indexedDatabase.js.map +1 -0
- package/dist/commonjs/operations/databases/memoryDatabase.d.ts +13 -0
- package/dist/commonjs/operations/databases/memoryDatabase.d.ts.map +1 -0
- package/dist/commonjs/operations/databases/memoryDatabase.js +33 -0
- package/dist/commonjs/operations/databases/memoryDatabase.js.map +1 -0
- package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts +16 -0
- package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts.map +1 -0
- package/dist/commonjs/operations/downloaders/memoryDownloader.js +35 -0
- package/dist/commonjs/operations/downloaders/memoryDownloader.js.map +1 -0
- package/dist/commonjs/operations/downloaders/serverDownloader.d.ts +32 -0
- package/dist/commonjs/operations/downloaders/serverDownloader.d.ts.map +1 -0
- package/dist/commonjs/operations/downloaders/serverDownloader.js +169 -0
- package/dist/commonjs/operations/downloaders/serverDownloader.js.map +1 -0
- package/dist/commonjs/operations/interfaces.d.ts +19 -0
- package/dist/commonjs/operations/interfaces.d.ts.map +1 -0
- package/dist/commonjs/operations/interfaces.js +3 -0
- package/dist/commonjs/operations/interfaces.js.map +1 -0
- package/dist/commonjs/operations/objectLoader2.d.ts +16 -0
- package/dist/commonjs/operations/objectLoader2.d.ts.map +1 -0
- package/dist/commonjs/operations/objectLoader2.js +101 -0
- package/dist/commonjs/operations/objectLoader2.js.map +1 -0
- package/dist/commonjs/operations/objectLoader2Factory.d.ts +25 -0
- package/dist/commonjs/operations/objectLoader2Factory.d.ts.map +1 -0
- package/dist/commonjs/operations/objectLoader2Factory.js +68 -0
- package/dist/commonjs/operations/objectLoader2Factory.js.map +1 -0
- package/dist/commonjs/operations/options.d.ts +26 -0
- package/dist/commonjs/operations/options.d.ts.map +1 -0
- package/dist/commonjs/operations/options.js +3 -0
- package/dist/commonjs/operations/options.js.map +1 -0
- package/dist/commonjs/operations/traverser.d.ts +19 -0
- package/dist/commonjs/operations/traverser.d.ts.map +1 -0
- package/dist/commonjs/operations/traverser.js +96 -0
- package/dist/commonjs/operations/traverser.js.map +1 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/commonjs/types/errors.d.ts +21 -0
- package/dist/commonjs/types/errors.d.ts.map +1 -0
- package/dist/commonjs/types/errors.js +28 -0
- package/dist/commonjs/types/errors.js.map +1 -0
- package/dist/commonjs/types/types.d.ts +25 -0
- package/dist/commonjs/types/types.d.ts.map +1 -0
- package/dist/commonjs/types/types.js +39 -0
- package/dist/commonjs/types/types.js.map +1 -0
- package/dist/esm/helpers/aggregateQueue.d.ts +8 -0
- package/dist/esm/helpers/aggregateQueue.d.ts.map +1 -0
- package/dist/esm/helpers/aggregateQueue.js +16 -0
- package/dist/esm/helpers/aggregateQueue.js.map +1 -0
- package/dist/esm/helpers/asyncGeneratorQueue.d.ts +8 -0
- package/dist/esm/helpers/asyncGeneratorQueue.d.ts.map +1 -0
- package/dist/esm/helpers/asyncGeneratorQueue.js +32 -0
- package/dist/esm/helpers/asyncGeneratorQueue.js.map +1 -0
- package/dist/esm/helpers/batchedPool.d.ts +12 -0
- package/dist/esm/helpers/batchedPool.d.ts.map +1 -0
- package/dist/esm/helpers/batchedPool.js +42 -0
- package/dist/esm/helpers/batchedPool.js.map +1 -0
- package/dist/esm/helpers/batchingQueue.d.ts +14 -0
- package/dist/esm/helpers/batchingQueue.d.ts.map +1 -0
- package/dist/esm/helpers/batchingQueue.js +71 -0
- package/dist/esm/helpers/batchingQueue.js.map +1 -0
- package/dist/esm/helpers/bufferQueue.d.ts +7 -0
- package/dist/esm/helpers/bufferQueue.d.ts.map +1 -0
- package/dist/esm/helpers/bufferQueue.js +10 -0
- package/dist/esm/helpers/bufferQueue.js.map +1 -0
- package/dist/esm/helpers/cachePump.d.ts +22 -0
- package/dist/esm/helpers/cachePump.d.ts.map +1 -0
- package/dist/esm/helpers/cachePump.js +79 -0
- package/dist/esm/helpers/cachePump.js.map +1 -0
- package/dist/esm/helpers/cacheReader.d.ts +14 -0
- package/dist/esm/helpers/cacheReader.d.ts.map +1 -0
- package/dist/esm/helpers/cacheReader.js +51 -0
- package/dist/esm/helpers/cacheReader.js.map +1 -0
- package/dist/esm/helpers/defermentManager.d.ts +28 -0
- package/dist/esm/helpers/defermentManager.d.ts.map +1 -0
- package/dist/esm/helpers/defermentManager.js +146 -0
- package/dist/esm/helpers/defermentManager.js.map +1 -0
- package/dist/esm/helpers/deferredBase.d.ts +19 -0
- package/dist/esm/helpers/deferredBase.d.ts.map +1 -0
- package/dist/esm/helpers/deferredBase.js +47 -0
- package/dist/esm/helpers/deferredBase.js.map +1 -0
- package/dist/esm/helpers/keyedQueue.d.ts +11 -0
- package/dist/esm/helpers/keyedQueue.d.ts.map +1 -0
- package/dist/esm/helpers/keyedQueue.js +38 -0
- package/dist/esm/helpers/keyedQueue.js.map +1 -0
- package/dist/esm/helpers/memoryPump.d.ts +15 -0
- package/dist/esm/helpers/memoryPump.d.ts.map +1 -0
- package/dist/esm/helpers/memoryPump.js +30 -0
- package/dist/esm/helpers/memoryPump.js.map +1 -0
- package/dist/esm/helpers/pump.d.ts +8 -0
- package/dist/esm/helpers/pump.d.ts.map +1 -0
- package/dist/esm/helpers/pump.js +2 -0
- package/dist/esm/helpers/pump.js.map +1 -0
- package/dist/esm/helpers/queue.d.ts +4 -0
- package/dist/esm/helpers/queue.d.ts.map +1 -0
- package/dist/esm/helpers/queue.js +2 -0
- package/dist/esm/helpers/queue.js.map +1 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/operations/databases/indexedDatabase.d.ts +27 -0
- package/dist/esm/operations/databases/indexedDatabase.d.ts.map +1 -0
- package/dist/esm/operations/databases/indexedDatabase.js +93 -0
- package/dist/esm/operations/databases/indexedDatabase.js.map +1 -0
- package/dist/esm/operations/databases/memoryDatabase.d.ts +13 -0
- package/dist/esm/operations/databases/memoryDatabase.d.ts.map +1 -0
- package/dist/esm/operations/databases/memoryDatabase.js +29 -0
- package/dist/esm/operations/databases/memoryDatabase.js.map +1 -0
- package/dist/esm/operations/downloaders/memoryDownloader.d.ts +16 -0
- package/dist/esm/operations/downloaders/memoryDownloader.d.ts.map +1 -0
- package/dist/esm/operations/downloaders/memoryDownloader.js +31 -0
- package/dist/esm/operations/downloaders/memoryDownloader.js.map +1 -0
- package/dist/esm/operations/downloaders/serverDownloader.d.ts +32 -0
- package/dist/esm/operations/downloaders/serverDownloader.d.ts.map +1 -0
- package/dist/esm/operations/downloaders/serverDownloader.js +163 -0
- package/dist/esm/operations/downloaders/serverDownloader.js.map +1 -0
- package/dist/esm/operations/interfaces.d.ts +19 -0
- package/dist/esm/operations/interfaces.d.ts.map +1 -0
- package/dist/esm/operations/interfaces.js +2 -0
- package/dist/esm/operations/interfaces.js.map +1 -0
- package/dist/esm/operations/objectLoader2.d.ts +16 -0
- package/dist/esm/operations/objectLoader2.d.ts.map +1 -0
- package/dist/esm/operations/objectLoader2.js +94 -0
- package/dist/esm/operations/objectLoader2.js.map +1 -0
- package/dist/esm/operations/objectLoader2Factory.d.ts +25 -0
- package/dist/esm/operations/objectLoader2Factory.d.ts.map +1 -0
- package/dist/esm/operations/objectLoader2Factory.js +61 -0
- package/dist/esm/operations/objectLoader2Factory.js.map +1 -0
- package/dist/esm/operations/options.d.ts +26 -0
- package/dist/esm/operations/options.d.ts.map +1 -0
- package/dist/esm/operations/options.js +2 -0
- package/dist/esm/operations/options.js.map +1 -0
- package/dist/esm/operations/traverser.d.ts +19 -0
- package/dist/esm/operations/traverser.d.ts.map +1 -0
- package/dist/esm/operations/traverser.js +93 -0
- package/dist/esm/operations/traverser.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/types/errors.d.ts +21 -0
- package/dist/esm/types/errors.d.ts.map +1 -0
- package/dist/esm/types/errors.js +23 -0
- package/dist/esm/types/errors.js.map +1 -0
- package/dist/esm/types/types.d.ts +25 -0
- package/dist/esm/types/types.d.ts.map +1 -0
- package/dist/esm/types/types.js +33 -0
- package/dist/esm/types/types.js.map +1 -0
- package/eslint.config.mjs +60 -0
- package/package.json +76 -0
- package/readme.md +42 -0
- package/src/helpers/__snapshots__/cachePump.spec.ts.snap +31 -0
- package/src/helpers/__snapshots__/cacheReader.spec.ts.snap +8 -0
- package/src/helpers/__snapshots__/defermentManager.spec.ts.snap +8 -0
- package/src/helpers/aggregateQueue.ts +20 -0
- package/src/helpers/asyncGeneratorQueue.ts +35 -0
- package/src/helpers/batchedPool.ts +56 -0
- package/src/helpers/batchingQueue.ts +85 -0
- package/src/helpers/bufferQueue.ts +12 -0
- package/src/helpers/cachePump.disposal.spec.ts +51 -0
- package/src/helpers/cachePump.spec.ts +104 -0
- package/src/helpers/cachePump.ts +107 -0
- package/src/helpers/cacheReader.spec.ts +35 -0
- package/src/helpers/cacheReader.ts +64 -0
- package/src/helpers/defermentManager.defermentTotals.spec.ts +53 -0
- package/src/helpers/defermentManager.disposal.spec.ts +28 -0
- package/src/helpers/defermentManager.spec.ts +37 -0
- package/src/helpers/defermentManager.ts +160 -0
- package/src/helpers/deferredBase.ts +55 -0
- package/src/helpers/keyedQueue.ts +45 -0
- package/src/helpers/memoryPump.ts +40 -0
- package/src/helpers/pump.ts +8 -0
- package/src/helpers/queue.ts +3 -0
- package/src/index.ts +2 -0
- package/src/operations/__snapshots__/objectLoader2.spec.ts.snap +149 -0
- package/src/operations/__snapshots__/traverser.spec.ts.snap +45 -0
- package/src/operations/databases/__snapshots__/indexedDatabase.spec.ts.snap +18 -0
- package/src/operations/databases/indexedDatabase.spec.ts +33 -0
- package/src/operations/databases/indexedDatabase.ts +126 -0
- package/src/operations/databases/memoryDatabase.spec.ts +48 -0
- package/src/operations/databases/memoryDatabase.ts +35 -0
- package/src/operations/downloaders/__snapshots__/memoryDownloader.spec.ts.snap +12 -0
- package/src/operations/downloaders/__snapshots__/serverDownloader.spec.ts.snap +92 -0
- package/src/operations/downloaders/memoryDownloader.spec.ts +49 -0
- package/src/operations/downloaders/memoryDownloader.ts +39 -0
- package/src/operations/downloaders/serverDownloader.spec.ts +161 -0
- package/src/operations/downloaders/serverDownloader.ts +217 -0
- package/src/operations/interfaces.ts +18 -0
- package/src/operations/objectLoader2.spec.ts +229 -0
- package/src/operations/objectLoader2.ts +119 -0
- package/src/operations/objectLoader2Factory.ts +78 -0
- package/src/operations/options.ts +29 -0
- package/src/operations/traverser.spec.ts +58 -0
- package/src/operations/traverser.ts +112 -0
- package/src/test/e2e.spec.ts +43 -0
- package/src/types/errors.ts +25 -0
- package/src/types/types.ts +71 -0
- package/tsconfig.json +103 -0
- package/vitest.config.ts +3 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Base } from '../types/types.js';
|
|
2
|
+
import { ObjectLoader2 } from './objectLoader2.js';
|
|
3
|
+
export type ProgressStage = 'download' | 'construction';
|
|
4
|
+
export type OnProgress = (e: {
|
|
5
|
+
stage: ProgressStage;
|
|
6
|
+
current: number;
|
|
7
|
+
total: number;
|
|
8
|
+
}) => void;
|
|
9
|
+
export interface TraverserOptions {
|
|
10
|
+
excludeProps?: string[];
|
|
11
|
+
}
|
|
12
|
+
export default class Traverser {
|
|
13
|
+
#private;
|
|
14
|
+
constructor(loader: ObjectLoader2, options?: TraverserOptions);
|
|
15
|
+
traverse(onProgress?: OnProgress): Promise<Base>;
|
|
16
|
+
traverseArray(array: Array<unknown>, onProgress?: OnProgress): Promise<void>;
|
|
17
|
+
traverseBase(base: Base, onProgress?: OnProgress): Promise<Base>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=traverser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverser.d.ts","sourceRoot":"","sources":["../../../src/operations/traverser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA4C,MAAM,mBAAmB,CAAA;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,cAAc,CAAA;AACvD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE;IAC3B,KAAK,EAAE,aAAa,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,KAAK,IAAI,CAAA;AAEV,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,CAAC,OAAO,OAAO,SAAS;;gBAOhB,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAKvD,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAehD,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5E,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAuDvE"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { isBase, isReference, isScalar } from '../types/types.js';
|
|
2
|
+
export default class Traverser {
|
|
3
|
+
#loader;
|
|
4
|
+
#options;
|
|
5
|
+
#totalChildrenCount = 0;
|
|
6
|
+
#traversedReferencesCount = 0;
|
|
7
|
+
constructor(loader, options) {
|
|
8
|
+
this.#options = options || {};
|
|
9
|
+
this.#loader = loader;
|
|
10
|
+
}
|
|
11
|
+
async traverse(onProgress) {
|
|
12
|
+
let firstObjectPromise = undefined;
|
|
13
|
+
for await (const obj of this.#loader.getObjectIterator()) {
|
|
14
|
+
if (!firstObjectPromise) {
|
|
15
|
+
firstObjectPromise = this.traverseBase(obj, onProgress);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (firstObjectPromise) {
|
|
19
|
+
return await firstObjectPromise;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
throw new Error('No objects found');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async traverseArray(array, onProgress) {
|
|
26
|
+
for (let i = 0; i < 10; i++) {
|
|
27
|
+
const prop = array[i];
|
|
28
|
+
if (isScalar(prop))
|
|
29
|
+
continue;
|
|
30
|
+
if (isBase(prop)) {
|
|
31
|
+
array[i] = await this.traverseBase(prop, onProgress);
|
|
32
|
+
}
|
|
33
|
+
else if (isReference(prop)) {
|
|
34
|
+
array[i] = await this.traverseBase(await this.#loader.getObject({ id: prop.referencedId }), onProgress);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async traverseBase(base, onProgress) {
|
|
39
|
+
for (const ignoredProp of this.#options.excludeProps || []) {
|
|
40
|
+
delete base[ignoredProp];
|
|
41
|
+
}
|
|
42
|
+
if (base.__closure) {
|
|
43
|
+
const ids = Object.keys(base.__closure);
|
|
44
|
+
const promises = [];
|
|
45
|
+
for (const id of ids) {
|
|
46
|
+
promises.push(this.traverseBase(await this.#loader.getObject({ id }), onProgress));
|
|
47
|
+
}
|
|
48
|
+
await Promise.all(promises);
|
|
49
|
+
}
|
|
50
|
+
delete base['__closure'];
|
|
51
|
+
// De-chunk
|
|
52
|
+
if (base.kingsy_type?.includes('DataChunk')) {
|
|
53
|
+
const chunk = base;
|
|
54
|
+
if (chunk.data) {
|
|
55
|
+
await this.traverseArray(chunk.data, onProgress);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//other props
|
|
59
|
+
for (const prop in base) {
|
|
60
|
+
if (prop === '__closure')
|
|
61
|
+
continue;
|
|
62
|
+
if (prop === 'referenceId')
|
|
63
|
+
continue;
|
|
64
|
+
if (prop === 'kingsy_type')
|
|
65
|
+
continue;
|
|
66
|
+
if (prop === 'data')
|
|
67
|
+
continue;
|
|
68
|
+
const baseProp = base[prop];
|
|
69
|
+
if (isScalar(baseProp))
|
|
70
|
+
continue;
|
|
71
|
+
if (isBase(baseProp)) {
|
|
72
|
+
await this.traverseBase(baseProp, onProgress);
|
|
73
|
+
}
|
|
74
|
+
else if (isReference(baseProp)) {
|
|
75
|
+
await this.traverseBase(await this.#loader.getObject({ id: baseProp.referencedId }), onProgress);
|
|
76
|
+
}
|
|
77
|
+
else if (Array.isArray(baseProp)) {
|
|
78
|
+
await this.traverseArray(baseProp, onProgress);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (onProgress) {
|
|
82
|
+
onProgress({
|
|
83
|
+
stage: 'construction',
|
|
84
|
+
current: ++this.#traversedReferencesCount > this.#totalChildrenCount
|
|
85
|
+
? this.#totalChildrenCount
|
|
86
|
+
: this.#traversedReferencesCount,
|
|
87
|
+
total: this.#totalChildrenCount
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return base;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=traverser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverser.js","sourceRoot":"","sources":["../../../src/operations/traverser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base ObjectLoader error
|
|
3
|
+
*/
|
|
4
|
+
declare class BaseError extends Error {
|
|
5
|
+
/**
|
|
6
|
+
* Default message if none is passed
|
|
7
|
+
*/
|
|
8
|
+
static defaultMessage: string;
|
|
9
|
+
/**
|
|
10
|
+
* @param {string} [message]
|
|
11
|
+
*/
|
|
12
|
+
constructor(message: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class ObjectLoaderConfigurationError extends BaseError {
|
|
15
|
+
static defaultMessage: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class ObjectLoaderRuntimeError extends BaseError {
|
|
18
|
+
static defaultMessage: string;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAM,SAAU,SAAQ,KAAK;IAC3B;;OAEG;IACH,MAAM,CAAC,cAAc,SAA8B;IAEnD;;OAEG;gBACS,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,8BAA+B,SAAQ,SAAS;IAC3D,MAAM,CAAC,cAAc,SAA0C;CAChE;AAED,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,cAAc,SAAiD;CACvE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base ObjectLoader error
|
|
3
|
+
*/
|
|
4
|
+
class BaseError extends Error {
|
|
5
|
+
/**
|
|
6
|
+
* Default message if none is passed
|
|
7
|
+
*/
|
|
8
|
+
static defaultMessage = 'Unexpected error occurred';
|
|
9
|
+
/**
|
|
10
|
+
* @param {string} [message]
|
|
11
|
+
*/
|
|
12
|
+
constructor(message) {
|
|
13
|
+
message ||= new.target.defaultMessage;
|
|
14
|
+
super(message);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class ObjectLoaderConfigurationError extends BaseError {
|
|
18
|
+
static defaultMessage = 'Object loader configured incorrectly!';
|
|
19
|
+
}
|
|
20
|
+
export class ObjectLoaderRuntimeError extends BaseError {
|
|
21
|
+
static defaultMessage = 'Object loader encountered a runtime problem!';
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,SAAU,SAAQ,KAAK;IAC3B;;OAEG;IACH,MAAM,CAAC,cAAc,GAAG,2BAA2B,CAAA;IAEnD;;OAEG;IACH,YAAY,OAAe;QACzB,OAAO,KAAK,GAAG,CAAC,MAAM,CAAC,cAAc,CAAA;QACrC,KAAK,CAAC,OAAO,CAAC,CAAA;IAChB,CAAC;;AAGH,MAAM,OAAO,8BAA+B,SAAQ,SAAS;IAC3D,MAAM,CAAC,cAAc,GAAG,uCAAuC,CAAA;;AAGjE,MAAM,OAAO,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,cAAc,GAAG,8CAA8C,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type CustomLogger = (message?: string, ...optionalParams: unknown[]) => void;
|
|
2
|
+
export type Fetcher = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
3
|
+
export interface Item {
|
|
4
|
+
baseId: string;
|
|
5
|
+
base: Base;
|
|
6
|
+
size?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface Base {
|
|
9
|
+
id: string;
|
|
10
|
+
kingsy_type: string;
|
|
11
|
+
__closure?: Record<string, number>;
|
|
12
|
+
}
|
|
13
|
+
export interface Reference {
|
|
14
|
+
kingsy_type: string;
|
|
15
|
+
referencedId: string;
|
|
16
|
+
__closure?: Record<string, number>;
|
|
17
|
+
}
|
|
18
|
+
export interface DataChunk extends Base {
|
|
19
|
+
data?: Base[];
|
|
20
|
+
}
|
|
21
|
+
export declare function isBase(maybeBase?: unknown): maybeBase is Base;
|
|
22
|
+
export declare function isReference(maybeRef?: unknown): maybeRef is Reference;
|
|
23
|
+
export declare function isScalar(value: unknown): value is string | number | boolean | bigint | symbol | undefined;
|
|
24
|
+
export declare function take<T>(it: Iterator<T>, count: number): T[];
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;AAEnF,MAAM,MAAM,OAAO,GAAG,CACpB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEtB,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,SAAU,SAAQ,IAAI;IACrC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;CACd;AAED,wBAAgB,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,IAAI,IAAI,CAO7D;AAED,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,IAAI,SAAS,CAOrE;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAWlE;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAQ3D"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export function isBase(maybeBase) {
|
|
2
|
+
return (maybeBase !== null &&
|
|
3
|
+
typeof maybeBase === 'object' &&
|
|
4
|
+
'id' in maybeBase &&
|
|
5
|
+
typeof maybeBase.id === 'string');
|
|
6
|
+
}
|
|
7
|
+
export function isReference(maybeRef) {
|
|
8
|
+
return (maybeRef !== null &&
|
|
9
|
+
typeof maybeRef === 'object' &&
|
|
10
|
+
'referencedId' in maybeRef &&
|
|
11
|
+
typeof maybeRef.referencedId === 'string');
|
|
12
|
+
}
|
|
13
|
+
export function isScalar(value) {
|
|
14
|
+
const type = typeof value;
|
|
15
|
+
return (value === null ||
|
|
16
|
+
type === 'string' ||
|
|
17
|
+
type === 'number' ||
|
|
18
|
+
type === 'boolean' ||
|
|
19
|
+
type === 'bigint' ||
|
|
20
|
+
type === 'symbol' ||
|
|
21
|
+
type === 'undefined');
|
|
22
|
+
}
|
|
23
|
+
export function take(it, count) {
|
|
24
|
+
const result = [];
|
|
25
|
+
for (let i = 0; i < count; i++) {
|
|
26
|
+
const itr = it.next();
|
|
27
|
+
if (itr.done)
|
|
28
|
+
break;
|
|
29
|
+
result.push(itr.value);
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types/types.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,MAAM,CAAC,SAAmB;IACxC,OAAO,CACL,SAAS,KAAK,IAAI;QAClB,OAAO,SAAS,KAAK,QAAQ;QAC7B,IAAI,IAAI,SAAS;QACjB,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,CACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC5C,OAAO,CACL,QAAQ,KAAK,IAAI;QACjB,OAAO,QAAQ,KAAK,QAAQ;QAC5B,cAAc,IAAI,QAAQ;QAC1B,OAAO,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAC1C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,KAAc;IAEd,MAAM,IAAI,GAAG,OAAO,KAAK,CAAA;IACzB,OAAO,CACL,KAAK,KAAK,IAAI;QACd,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,SAAS;QAClB,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,WAAW,CACrB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAI,EAAe,EAAE,KAAa;IACpD,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAA;QACrB,IAAI,GAAG,CAAC,IAAI;YAAE,MAAK;QACnB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { baseConfigs, globals, getESMDirname } from '../../eslint.config.mjs'
|
|
2
|
+
import tseslint from 'typescript-eslint'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @type {Array<import('eslint').Linter.FlatConfig>}
|
|
6
|
+
*/
|
|
7
|
+
const configs = [
|
|
8
|
+
...baseConfigs,
|
|
9
|
+
{
|
|
10
|
+
files: ['examples/browser/**/*.{ts,js}'],
|
|
11
|
+
languageOptions: {
|
|
12
|
+
globals: {
|
|
13
|
+
...globals.browser
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
...tseslint.configs.recommendedTypeChecked.map((c) => ({
|
|
18
|
+
...c,
|
|
19
|
+
files: [...(c.files || []), '**/*.ts', '**/*.d.ts']
|
|
20
|
+
})),
|
|
21
|
+
{
|
|
22
|
+
files: ['**/*.ts', '**/*.d.ts'],
|
|
23
|
+
languageOptions: {
|
|
24
|
+
parserOptions: {
|
|
25
|
+
tsconfigRootDir: getESMDirname(import.meta.url),
|
|
26
|
+
projectService: {
|
|
27
|
+
allowDefaultProject: ['*.ts']
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
rules: {
|
|
32
|
+
'@typescript-eslint/restrict-template-expressions': 'off',
|
|
33
|
+
'@typescript-eslint/await-thenable': 'error',
|
|
34
|
+
'@typescript-eslint/explicit-function-return-type': 'error'
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
files: ['**/*.d.ts'],
|
|
39
|
+
rules: {
|
|
40
|
+
'@typescript-eslint/no-explicit-any': 'off'
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
files: ['vite.config.ts'],
|
|
45
|
+
languageOptions: {
|
|
46
|
+
globals: {
|
|
47
|
+
...globals.node
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
files: ['**/*.spec.ts'],
|
|
53
|
+
rules: {
|
|
54
|
+
camelcase: 'off',
|
|
55
|
+
'@typescript-eslint/no-unused-expressions': 'off'
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
export default configs
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kingsy/objectloader2",
|
|
3
|
+
"version": "2.25.7",
|
|
4
|
+
"description": "This is an updated objectloader for the KingSy viewer written in typescript",
|
|
5
|
+
"main": "./dist/commonjs/index.js",
|
|
6
|
+
"module": "./dist/esm/index.js",
|
|
7
|
+
"homepage": "https://kingsy.systems",
|
|
8
|
+
"types": "./dist/commonjs/index.d.ts",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/kingsysystems/kingsy-server.git",
|
|
13
|
+
"directory": "packages/objectloader2"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18.0.0"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"lint:eslint": "eslint .",
|
|
20
|
+
"lint:tsc": "tsc --noEmit",
|
|
21
|
+
"lint": "yarn lint:eslint && yarn lint:tsc",
|
|
22
|
+
"lint:ci": "yarn lint:tsc",
|
|
23
|
+
"build": "NODE_ENV=production tshy",
|
|
24
|
+
"dev": "tshy --watch",
|
|
25
|
+
"test": "vitest",
|
|
26
|
+
"test:single-run": "vitest run"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"kingsy",
|
|
30
|
+
"aec",
|
|
31
|
+
"kingsy api"
|
|
32
|
+
],
|
|
33
|
+
"author": "AEC Systems",
|
|
34
|
+
"license": "Apache-2.0",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@kingsy/shared": "^2.25.7",
|
|
37
|
+
"dexie": "^4.0.11"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/lodash": "^4.17.5",
|
|
41
|
+
"@types/lodash-es": "^4.17.6",
|
|
42
|
+
"@typescript-eslint/eslint-plugin": "^7.12.0",
|
|
43
|
+
"@typescript-eslint/parser": "^7.12.0",
|
|
44
|
+
"@vitest/ui": "^3.0.9",
|
|
45
|
+
"eslint": "^9.4.0",
|
|
46
|
+
"eslint-config-prettier": "^9.1.0",
|
|
47
|
+
"fake-indexeddb": "^6.0.0",
|
|
48
|
+
"prettier": "^3.3.2",
|
|
49
|
+
"tshy": "^3.0.2",
|
|
50
|
+
"typescript": "^5.2.2",
|
|
51
|
+
"vitest": "^3.0.7",
|
|
52
|
+
"vitest-fetch-mock": "^0.4.5"
|
|
53
|
+
},
|
|
54
|
+
"exports": {
|
|
55
|
+
"./package.json": "./package.json",
|
|
56
|
+
".": {
|
|
57
|
+
"import": {
|
|
58
|
+
"types": "./dist/esm/index.d.ts",
|
|
59
|
+
"default": "./dist/esm/index.js"
|
|
60
|
+
},
|
|
61
|
+
"require": {
|
|
62
|
+
"types": "./dist/commonjs/index.d.ts",
|
|
63
|
+
"default": "./dist/commonjs/index.js"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"tshy": {
|
|
68
|
+
"exclude": [
|
|
69
|
+
"**/*.spec.ts"
|
|
70
|
+
],
|
|
71
|
+
"exports": {
|
|
72
|
+
"./package.json": "./package.json",
|
|
73
|
+
".": "./src/index.ts"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# objectloader2 for the KingSy viewer
|
|
2
|
+
|
|
3
|
+
This is an updated object loader for the KingSy viewer rewritten in Typescript.
|
|
4
|
+
|
|
5
|
+
The main aim for the objectloader is:
|
|
6
|
+
|
|
7
|
+
- download KingSy objects as JSON
|
|
8
|
+
- cache in IndexedDB so the same objects aren't downloaded twice
|
|
9
|
+
- give data to the viewer, as returned by the `getObjectIterator` generator, as soon as possible
|
|
10
|
+
- do the above as concurrently as a browser allows
|
|
11
|
+
|
|
12
|
+
## Architecture
|
|
13
|
+
|
|
14
|
+
To achieve increased concurrency, the different phases of the objectloader are divided into pools of workers with queues to feed them.
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
flowchart TD
|
|
18
|
+
start(Root Commit)
|
|
19
|
+
getIds(Parse Root to get all IDs)
|
|
20
|
+
cached{Cached?}
|
|
21
|
+
download(Download IDs)
|
|
22
|
+
save(Write to Cache)
|
|
23
|
+
load(Load from Cache)
|
|
24
|
+
generate(Generate to Viewer!)
|
|
25
|
+
|
|
26
|
+
start --> getIds
|
|
27
|
+
getIds --> cached
|
|
28
|
+
cached -->|Yes| load
|
|
29
|
+
cached -->|No| download
|
|
30
|
+
load --> generate
|
|
31
|
+
download --> generate
|
|
32
|
+
download --> save
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
From the list of IDs, they are moved to a queue to be begin checking the cache from a pool of readers.
|
|
37
|
+
|
|
38
|
+
Results are then sent to the viewer, if found, else they're send to the download queue.
|
|
39
|
+
|
|
40
|
+
The download queue is a batching mechanism that gets what is available, up to a limit or a timeout. The results are parsed and given to the generator and written to another queue.
|
|
41
|
+
|
|
42
|
+
The write cache queue is processed with a single writer to the indexeddb.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`CachePump testing > write two items to queue use pumpItems that are NOT found 1`] = `[]`;
|
|
4
|
+
|
|
5
|
+
exports[`CachePump testing > write two items to queue use pumpItems that are NOT found 2`] = `
|
|
6
|
+
[
|
|
7
|
+
"id1",
|
|
8
|
+
"id2",
|
|
9
|
+
]
|
|
10
|
+
`;
|
|
11
|
+
|
|
12
|
+
exports[`CachePump testing > write two items to queue use pumpItems that are found 1`] = `
|
|
13
|
+
[
|
|
14
|
+
{
|
|
15
|
+
"base": {
|
|
16
|
+
"id": "id",
|
|
17
|
+
"kingsy_type": "type",
|
|
18
|
+
},
|
|
19
|
+
"baseId": "id1",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"base": {
|
|
23
|
+
"id": "id",
|
|
24
|
+
"kingsy_type": "type",
|
|
25
|
+
},
|
|
26
|
+
"baseId": "id2",
|
|
27
|
+
},
|
|
28
|
+
]
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
exports[`CachePump testing > write two items to queue use pumpItems that are found 2`] = `[]`;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import Queue from './queue.js'
|
|
2
|
+
|
|
3
|
+
export default class AggregateQueue<T> implements Queue<T> {
|
|
4
|
+
#queue1: Queue<T>
|
|
5
|
+
#queue2: Queue<T>
|
|
6
|
+
|
|
7
|
+
constructor(queue1: Queue<T>, queue2: Queue<T>) {
|
|
8
|
+
this.#queue1 = queue1
|
|
9
|
+
this.#queue2 = queue2
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
add(value: T): void {
|
|
13
|
+
this.#queue1.add(value)
|
|
14
|
+
this.#queue2.add(value)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
values(): T[] {
|
|
18
|
+
throw new Error('Not implemented')
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import Queue from './queue.js'
|
|
2
|
+
|
|
3
|
+
export default class AsyncGeneratorQueue<T> implements Queue<T> {
|
|
4
|
+
#buffer: T[] = []
|
|
5
|
+
#resolveQueue: ((value: T) => void)[] = []
|
|
6
|
+
#finished = false
|
|
7
|
+
|
|
8
|
+
add(value: T): void {
|
|
9
|
+
if (this.#resolveQueue.length > 0) {
|
|
10
|
+
// If there's a pending consumer, resolve immediately
|
|
11
|
+
const resolve = this.#resolveQueue.shift()!
|
|
12
|
+
resolve(value)
|
|
13
|
+
} else {
|
|
14
|
+
// Otherwise, add to the buffer
|
|
15
|
+
this.#buffer.push(value)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async *consume(): AsyncGenerator<T> {
|
|
20
|
+
while (
|
|
21
|
+
!this.#finished ||
|
|
22
|
+
this.#resolveQueue.length > 0 ||
|
|
23
|
+
this.#buffer.length > 0
|
|
24
|
+
) {
|
|
25
|
+
if (this.#buffer.length > 0) {
|
|
26
|
+
yield this.#buffer.shift()! // Yield available values
|
|
27
|
+
} else {
|
|
28
|
+
yield await new Promise<T>((resolve) => this.#resolveQueue.push(resolve))
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
dispose(): void {
|
|
33
|
+
this.#finished = true
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export default class BatchedPool<T> {
|
|
2
|
+
#queue: T[] = []
|
|
3
|
+
#concurrencyAndSizes: number[]
|
|
4
|
+
#processFunction: (batch: T[]) => Promise<void>
|
|
5
|
+
|
|
6
|
+
#baseInterval: number
|
|
7
|
+
|
|
8
|
+
#processingLoop: Promise<void>
|
|
9
|
+
#disposed = false
|
|
10
|
+
|
|
11
|
+
constructor(params: {
|
|
12
|
+
concurrencyAndSizes: number[]
|
|
13
|
+
maxWaitTime?: number
|
|
14
|
+
processFunction: (batch: T[]) => Promise<void>
|
|
15
|
+
}) {
|
|
16
|
+
this.#concurrencyAndSizes = params.concurrencyAndSizes
|
|
17
|
+
this.#baseInterval = Math.min(params.maxWaitTime ?? 200, 200) // Initial batch time (ms)
|
|
18
|
+
this.#processFunction = params.processFunction
|
|
19
|
+
this.#processingLoop = this.#loop()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
add(item: T): void {
|
|
23
|
+
this.#queue.push(item)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getBatch(batchSize: number): T[] {
|
|
27
|
+
return this.#queue.splice(0, Math.min(batchSize, this.#queue.length))
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async #runWorker(batchSize: number): Promise<void> {
|
|
31
|
+
while (!this.#disposed || this.#queue.length > 0) {
|
|
32
|
+
if (this.#queue.length > 0) {
|
|
33
|
+
const batch = this.getBatch(batchSize)
|
|
34
|
+
await this.#processFunction(batch)
|
|
35
|
+
}
|
|
36
|
+
await this.#delay(this.#baseInterval)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async disposeAsync(): Promise<void> {
|
|
41
|
+
this.#disposed = true
|
|
42
|
+
await this.#processingLoop
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async #loop(): Promise<void> {
|
|
46
|
+
// Initialize workers
|
|
47
|
+
const workers = Array.from(this.#concurrencyAndSizes, (batchSize: number) =>
|
|
48
|
+
this.#runWorker(batchSize)
|
|
49
|
+
)
|
|
50
|
+
await Promise.all(workers)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#delay(ms: number): Promise<void> {
|
|
54
|
+
return new Promise((resolve) => setTimeout(resolve, ms))
|
|
55
|
+
}
|
|
56
|
+
}
|