import AggregateQueue from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/queues/aggregateQueue.js"; import AsyncGeneratorQueue from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/queues/asyncGeneratorQueue.js"; import { take } from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/types/functions.js"; import { ObjectLoader2Factory } from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/core/objectLoader2Factory.js"; import { CacheReader } from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/core/stages/cacheReader.js"; import { CacheWriter } from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/core/stages/cacheWriter.js"; const MAX_CLOSURES_TO_TAKE = 100; const EXPECTED_CLOSURE_VALUE = 100; export class ObjectLoader2 { #rootId; #logger; #database; #downloader; #cacheReader; #cacheWriter; #deferments; #gathered; #root = undefined; #isRootStored = false; constructor(options) { this.#rootId = options.rootId; this.#logger = options.logger || (() => { }); this.#logger('ObjectLoader2 initialized with rootId:', this.#rootId); const cacheOptions = { logger: this.#logger, maxCacheReadSize: 10_000, maxCacheWriteSize: 10_000, maxWriteQueueSize: 40_000, maxCacheBatchWriteWait: 100, //100 ms, next to nothing! maxCacheBatchReadWait: 100 //100 ms, next to nothing! }; this.#gathered = new AsyncGeneratorQueue(); this.#database = options.database; this.#deferments = options.deferments; this.#downloader = options.downloader; this.#cacheReader = new CacheReader(this.#database, this.#deferments, this.#logger, cacheOptions); this.#cacheReader.initializeQueue(this.#gathered, this.#downloader); this.#cacheWriter = new CacheWriter(this.#database, this.#logger, this.#deferments, cacheOptions, (id) => { this.#cacheReader.requestItem(id); }); } async disposeAsync() { await Promise.all([ this.#gathered.disposeAsync(), this.#downloader.disposeAsync(), this.#cacheWriter.disposeAsync(), this.#cacheReader.disposeAsync() ]); this.#deferments.dispose(); } async getRootObject() { if (!this.#root) { this.#root = (await this.#database.getAll([this.#rootId]))[0]; if (!this.#root) { this.#root = await this.#downloader.downloadSingle(); } else { this.#isRootStored = true; } } return this.#root; } async getObject(params) { return await this.#cacheReader.getObject({ id: params.id }); } async getTotalObjectCount() { const rootObj = await this.getRootObject(); const totalChildrenCount = Object.keys(rootObj?.base?.__closure || {}).length; return totalChildrenCount + 1; //count the root } async *getObjectIterator() { const rootItem = await this.getRootObject(); if (rootItem?.base === undefined) { this.#logger('No root object found!'); return; } if (!rootItem.base.__closure) { yield rootItem.base; return; } //sort the closures by their values descending const sortedClosures = Object.entries(rootItem.base.__closure ?? []).sort((a, b) => b[1] - a[1]); this.#logger('calculated closures: ', !take(sortedClosures.values(), MAX_CLOSURES_TO_TAKE).every((x) => x[1] === EXPECTED_CLOSURE_VALUE)); const children = sortedClosures.map((x) => x[0]); const total = children.length + 1; // +1 for the root object this.#downloader.initialize({ results: new AggregateQueue(this.#gathered, this.#cacheWriter), total }); //only for root this.#gathered.add(rootItem); this.#cacheReader.requestAll(children); let count = 0; for await (const item of this.#gathered.consume()) { yield item.base; //always defined, as we add it to the queue count++; if (count >= total) { break; } } if (!this.#isRootStored) { await this.#database.putAll([rootItem]); this.#isRootStored = true; } } static createFromObjects(objects) { return ObjectLoader2Factory.createFromObjects(objects); } static createFromJSON(json) { return ObjectLoader2Factory.createFromJSON(json); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0TG9hZGVyMi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL29iamVjdExvYWRlcjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxjQUFjLE1BQU0sNkJBQTZCLENBQUE7QUFDeEQsT0FBTyxtQkFBbUIsTUFBTSxrQ0FBa0MsQ0FBQTtBQUNsRSxPQUFPLEVBQWdCLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRzFELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFFckQsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUE7QUFDaEMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUE7QUFFbEMsTUFBTSxPQUFPLGFBQWE7SUFDeEIsT0FBTyxDQUFRO0lBRWYsT0FBTyxDQUFjO0lBRXJCLFNBQVMsQ0FBVTtJQUNuQixXQUFXLENBQVk7SUFDdkIsWUFBWSxDQUFhO0lBQ3pCLFlBQVksQ0FBYTtJQUV6QixXQUFXLENBQVc7SUFFdEIsU0FBUyxDQUEyQjtJQUVwQyxLQUFLLEdBQVUsU0FBUyxDQUFBO0lBQ3hCLGFBQWEsR0FBRyxLQUFLLENBQUE7SUFFckIsWUFBWSxPQUE2QjtRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBUyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUE7UUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFcEUsTUFBTSxZQUFZLEdBQWlCO1lBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNw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QUFZLENBQUM7WUFDOUQsS0FBSztTQUNOLENBQUMsQ0FBQTtRQUNGLGVBQWU7UUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7UUFDYixJQUFJLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLENBQUMsSUFBSyxDQUFBLENBQUMsMkNBQTJDO1lBQzVELEtBQUssRUFBRSxDQUFBO1lBQ1AsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ25CLE1BQUs7WUFDUCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7WUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FBZTtRQUN0QyxPQUFPLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQVk7UUFDaEMsT0FBTyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmZXJtZW50IH0gZnJvbSAnLi4vZGVmZXJtZW50L2RlZmVybWVudE1hbmFnZXIuanMnXHJcbmltcG9ydCBBZ2dyZWdhdGVRdWV1ZSBmcm9tICcuLi9xdWV1ZXMvYWdncmVnYXRlUXVldWUuanMnXHJcbmltcG9ydCBBc3luY0dlbmVyYXRvclF1ZXVlIGZyb20gJy4uL3F1ZXVlcy9hc3luY0dlbmVyYXRvclF1ZXVlLmpzJ1xyXG5pbXBvcnQgeyBDdXN0b21Mb2dnZXIsIHRha2UgfSBmcm9tICcuLi90eXBlcy9mdW5jdGlvbnMuanMnXHJcbmltcG9ydCB7IEl0ZW0sIEJhc2UgfSBmcm9tICcuLi90eXBlcy90eXBlcy5qcydcclxuaW1wb3J0IHsgRGF0YWJhc2UsIERvd25sb2FkZXIgfSBmcm9tICcuL2ludGVyZmFjZXMuanMnXHJcbmltcG9ydCB7IE9iamVjdExvYWRlcjJGYWN0b3J5IH0gZnJvbSAnLi9vYmplY3RMb2FkZXIyRmFjdG9yeS5qcydcclxuaW1wb3J0IHsgT2JqZWN0TG9hZGVyMk9wdGlvbnMsIENhY2hlT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcydcclxuaW1wb3J0IHsgQ2FjaGVSZWFkZXIgfSBmcm9tICcuL3N0YWdlcy9jYWNoZVJlYWRlci5qcydcclxuaW1wb3J0IHsgQ2FjaGVXcml0ZXIgfSBmcm9tICcuL3N0YWdlcy9jYWNoZVdyaXRlci5qcydcclxuXHJcbmNvbnN0IE1BWF9DTE9TVVJFU19UT19UQUtFID0gMTAwXHJcbmNvbnN0IEVYUEVDVEVEX0NMT1NVUkVfVkFMVUUgPSAxMDBcclxuXHJcbmV4cG9ydCBjbGFzcyBPYmplY3RMb2FkZXIyIHtcclxuICAjcm9vdElkOiBzdHJpbmdcclxuXHJcbiAgI2xvZ2dlcjogQ3VzdG9tTG9nZ2VyXHJcblxyXG4gICNkYXRhYmFzZTogRGF0YWJhc2VcclxuICAjZG93bmxvYWRlcjogRG93bmxvYWRlclxyXG4gICNjYWNoZVJlYWRlcjogQ2FjaGVSZWFkZXJcclxuICAjY2FjaGVXcml0ZXI6IENhY2hlV3JpdGVyXHJcblxyXG4gICNkZWZlcm1lbnRzOiBEZWZlcm1lbnRcclxuXHJcbiAgI2dhdGhlcmVkOiBBc3luY0dlbmVyYXRvclF1ZXVlPEl0ZW0+XHJcblxyXG4gICNyb290PzogSXRlbSA9IHVuZGVmaW5lZFxyXG4gICNpc1Jvb3RTdG9yZWQgPSBmYWxzZVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPYmplY3RMb2FkZXIyT3B0aW9ucykge1xyXG4gICAgdGhpcy4jcm9vdElkID0gb3B0aW9ucy5yb290SWRcclxuICAgIHRoaXMuI2xvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8ICgoKTogdm9pZCA9PiB7fSlcclxuICAgIHRoaXMuI2xvZ2dlcignT2JqZWN0TG9hZGVyMiBpbml0aWFsaXplZCB3aXRoIHJvb3RJZDonLCB0aGlzLiNyb290SWQpXHJcblxyXG4gICAgY29uc3QgY2FjaGVPcHRpb25zOiBDYWNoZU9wdGlvbnMgPSB7XHJcbiAgICAgIGxvZ2dlcjogdGhpcy4jbG9nZ2VyLFxyXG4gICAgICBtYXhDYWNoZVJlYWRTaXplOiAxMF8wMDAsXHJcbiAgICAgIG1heENhY2hlV3JpdGVTaXplOiAxMF8wMDAsXHJcbiAgICAgIG1heFdyaXRlUXVldWVTaXplOiA0MF8wMDAsXHJcbiAgICAgIG1heENhY2hlQmF0Y2hXcml0ZVdhaXQ6IDEwMCwgLy8xMDAgbXMsIG5leHQgdG8gbm90aGluZyFcclxuICAgICAgbWF4Q2FjaGVCYXRjaFJlYWRXYWl0OiAxMDAgLy8xMDAgbXMsIG5leHQgdG8gbm90aGluZyFcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiNnYXRoZXJlZCA9IG5ldyBBc3luY0dlbmVyYXRvclF1ZXVlKClcclxuXHJcbiAgICB0aGlzLiNkYXRhYmFzZSA9IG9wdGlvbnMuZGF0YWJhc2VcclxuICAgIHRoaXMuI2RlZmVybWVudHMgPSBvcHRpb25zLmRlZmVybWVudHNcclxuICAgIHRoaXMuI2Rvd25sb2FkZXIgPSBvcHRpb25zLmRvd25sb2FkZXJcclxuICAgIHRoaXMuI2NhY2hlUmVhZGVyID0gbmV3IENhY2hlUmVhZGVyKFxyXG4gICAgICB0aGlzLiNkYXRhYmFzZSxcclxuICAgICAgdGhpcy4jZGVmZXJtZW50cyxcclxuICAgICAgdGhpcy4jbG9nZ2VyLFxyXG4gICAgICBjYWNoZU9wdGlvbnNcclxuICAgIClcclxuICAgIHRoaXMuI2NhY2hlUmVhZGVyLmluaXRpYWxpemVRdWV1ZSh0aGlzLiNnYXRoZXJlZCwgdGhpcy4jZG93bmxvYWRlcilcclxuICAgIHRoaXMuI2NhY2hlV3JpdGVyID0gbmV3IENhY2hlV3JpdGVyKFxyXG4gICAgICB0aGlzLiNkYXRhYmFzZSxcclxuICAgICAgdGhpcy4jbG9nZ2VyLFxyXG4gICAgICB0aGlzLiNkZWZlcm1lbnRzLFxyXG4gICAgICBjYWNoZU9wdGlvbnMsXHJcbiAgICAgIChpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy4jY2FjaGVSZWFkZXIucmVxdWVzdEl0ZW0oaWQpXHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIGFzeW5jIGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy4jZ2F0aGVyZWQuZGlzcG9zZUFzeW5jKCksXHJcbiAgICAgIHRoaXMuI2Rvd25sb2FkZXIuZGlzcG9zZUFzeW5jKCksXHJcbiAgICAgIHRoaXMuI2NhY2hlV3JpdGVyLmRpc3Bvc2VBc3luYygpLFxyXG4gICAgICB0aGlzLiNjYWNoZVJlYWRlci5kaXNwb3NlQXN5bmMoKVxyXG4gICAgXSlcclxuICAgIHRoaXMuI2RlZmVybWVudHMuZGlzcG9zZSgpXHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRSb290T2JqZWN0KCk6IFByb21pc2U8SXRlbSB8IHVuZGVmaW5lZD4ge1xyXG4gICAgaWYgKCF0aGlzLiNyb290KSB7XHJcbiAgICAgIHRoaXMuI3Jvb3QgPSAoYXdhaXQgdGhpcy4jZGF0YWJhc2UuZ2V0QWxsKFt0aGlzLiNyb290SWRdKSlbMF1cclxuICAgICAgaWYgKCF0aGlzLiNyb290KSB7XHJcbiAgICAgICAgdGhpcy4jcm9vdCA9IGF3YWl0IHRoaXMuI2Rvd25sb2FkZXIuZG93bmxvYWRTaW5nbGUoKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuI2lzUm9vdFN0b3JlZCA9IHRydWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuI3Jvb3RcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldE9iamVjdChwYXJhbXM6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxCYXNlPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy4jY2FjaGVSZWFkZXIuZ2V0T2JqZWN0KHsgaWQ6IHBhcmFtcy5pZCB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VG90YWxPYmplY3RDb3VudCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgY29uc3Qgcm9vdE9iaiA9IGF3YWl0IHRoaXMuZ2V0Um9vdE9iamVjdCgpXHJcbiAgICBjb25zdCB0b3RhbENoaWxkcmVuQ291bnQgPSBPYmplY3Qua2V5cyhyb290T2JqPy5iYXNlPy5fX2Nsb3N1cmUgfHwge30pLmxlbmd0aFxyXG4gICAgcmV0dXJuIHRvdGFsQ2hpbGRyZW5Db3VudCArIDEgLy9jb3VudCB0aGUgcm9vdFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgKmdldE9iamVjdEl0ZXJhdG9yKCk6IEFzeW5jR2VuZXJhdG9yPEJhc2U+IHtcclxuICAgIGNvbnN0IHJvb3RJdGVtID0gYXdhaXQgdGhpcy5nZXRSb290T2JqZWN0KClcclxuICAgIGlmIChyb290SXRlbT8uYmFzZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuI2xvZ2dlcignTm8gcm9vdCBvYmplY3QgZm91bmQhJylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBpZiAoIXJvb3RJdGVtLmJhc2UuX19jbG9zdXJlKSB7XHJcbiAgICAgIHlpZWxkIHJvb3RJdGVtLmJhc2VcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy9zb3J0IHRoZSBjbG9zdXJlcyBieSB0aGVpciB2YWx1ZXMgZGVzY2VuZGluZ1xyXG4gICAgY29uc3Qgc29ydGVkQ2xvc3VyZXMgPSBPYmplY3QuZW50cmllcyhyb290SXRlbS5iYXNlLl9fY2xvc3VyZSA/PyBbXSkuc29ydChcclxuICAgICAgKGEsIGIpID0+IGJbMV0gLSBhWzFdXHJcbiAgICApXHJcbiAgICB0aGlzLiNsb2dnZXIoXHJcbiAgICAgICdjYWxjdWxhdGVkIGNsb3N1cmVzOiAnLFxyXG4gICAgICAhdGFrZShzb3J0ZWRDbG9zdXJlcy52YWx1ZXMoKSwgTUFYX0NMT1NVUkVTX1RPX1RBS0UpLmV2ZXJ5KFxyXG4gICAgICAgICh4KSA9PiB4WzFdID09PSBFWFBFQ1RFRF9DTE9TVVJFX1ZBTFVFXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gc29ydGVkQ2xvc3VyZXMubWFwKCh4KSA9PiB4WzBdKVxyXG4gICAgY29uc3QgdG90YWwgPSBjaGlsZHJlbi5sZW5ndGggKyAxIC8vICsxIGZvciB0aGUgcm9vdCBvYmplY3RcclxuICAgIHRoaXMuI2Rvd25sb2FkZXIuaW5pdGlhbGl6ZSh7XHJcbiAgICAgIHJlc3VsdHM6IG5ldyBBZ2dyZWdhdGVRdWV1ZSh0aGlzLiNnYXRoZXJlZCwgdGhpcy4jY2FjaGVXcml0ZXIpLFxyXG4gICAgICB0b3RhbFxyXG4gICAgfSlcclxuICAgIC8vb25seSBmb3Igcm9vdFxyXG4gICAgdGhpcy4jZ2F0aGVyZWQuYWRkKHJvb3RJdGVtKVxyXG4gICAgdGhpcy4jY2FjaGVSZWFkZXIucmVxdWVzdEFsbChjaGlsZHJlbilcclxuICAgIGxldCBjb3VudCA9IDBcclxuICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiB0aGlzLiNnYXRoZXJlZC5jb25zdW1lKCkpIHtcclxuICAgICAgeWllbGQgaXRlbS5iYXNlISAvL2Fsd2F5cyBkZWZpbmVkLCBhcyB3ZSBhZGQgaXQgdG8gdGhlIHF1ZXVlXHJcbiAgICAgIGNvdW50KytcclxuICAgICAgaWYgKGNvdW50ID49IHRvdGFsKSB7XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLiNpc1Jvb3RTdG9yZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy4jZGF0YWJhc2UucHV0QWxsKFtyb290SXRlbV0pXHJcbiAgICAgIHRoaXMuI2lzUm9vdFN0b3JlZCA9IHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVGcm9tT2JqZWN0cyhvYmplY3RzOiBCYXNlW10pOiBPYmplY3RMb2FkZXIyIHtcclxuICAgIHJldHVybiBPYmplY3RMb2FkZXIyRmFjdG9yeS5jcmVhdGVGcm9tT2JqZWN0cyhvYmplY3RzKVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZUZyb21KU09OKGpzb246IHN0cmluZyk6IE9iamVjdExvYWRlcjIge1xyXG4gICAgcmV0dXJuIE9iamVjdExvYWRlcjJGYWN0b3J5LmNyZWF0ZUZyb21KU09OKGpzb24pXHJcbiAgfVxyXG59XHJcbiJdfQ==