@speckle/objectloader2 2.25.4 → 2.25.8
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/dist/commonjs/{operations → core}/interfaces.d.ts +2 -5
- package/dist/commonjs/core/interfaces.d.ts.map +1 -0
- package/dist/commonjs/core/interfaces.js.map +1 -0
- package/dist/{esm/operations → commonjs/core}/objectLoader2.d.ts +1 -1
- package/dist/commonjs/core/objectLoader2.d.ts.map +1 -0
- package/dist/commonjs/core/objectLoader2.js +128 -0
- package/dist/commonjs/core/objectLoader2.js.map +1 -0
- package/dist/commonjs/core/objectLoader2Factory.d.ts +27 -0
- package/dist/commonjs/core/objectLoader2Factory.d.ts.map +1 -0
- package/dist/commonjs/core/objectLoader2Factory.js +74 -0
- package/dist/commonjs/core/objectLoader2Factory.js.map +1 -0
- package/dist/{esm/operations → commonjs/core}/options.d.ts +2 -1
- package/dist/commonjs/core/options.d.ts.map +1 -0
- package/dist/commonjs/{operations → core}/options.js.map +1 -1
- package/dist/commonjs/core/stages/ItemStore.d.ts +37 -0
- package/dist/commonjs/core/stages/ItemStore.d.ts.map +1 -0
- package/dist/commonjs/core/stages/ItemStore.js +167 -0
- package/dist/commonjs/core/stages/ItemStore.js.map +1 -0
- package/dist/commonjs/core/stages/cacheReader.d.ts +18 -0
- package/dist/commonjs/core/stages/cacheReader.d.ts.map +1 -0
- package/dist/commonjs/core/stages/cacheReader.js +72 -0
- package/dist/commonjs/core/stages/cacheReader.js.map +1 -0
- package/dist/commonjs/core/stages/cacheWriter.d.ts +15 -0
- package/dist/commonjs/core/stages/cacheWriter.d.ts.map +1 -0
- package/dist/commonjs/core/stages/cacheWriter.js +50 -0
- package/dist/commonjs/core/stages/cacheWriter.js.map +1 -0
- package/dist/commonjs/{operations/databases → core/stages}/indexedDatabase.d.ts +2 -7
- package/dist/commonjs/core/stages/indexedDatabase.d.ts.map +1 -0
- package/dist/commonjs/core/stages/indexedDatabase.js +31 -0
- package/dist/commonjs/core/stages/indexedDatabase.js.map +1 -0
- package/dist/commonjs/core/stages/memory/memoryDatabase.d.ts +13 -0
- package/dist/commonjs/core/stages/memory/memoryDatabase.d.ts.map +1 -0
- package/dist/commonjs/{operations/databases → core/stages/memory}/memoryDatabase.js +4 -8
- package/dist/commonjs/core/stages/memory/memoryDatabase.js.map +1 -0
- package/dist/commonjs/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +3 -3
- package/dist/commonjs/core/stages/memory/memoryDownloader.d.ts.map +1 -0
- package/dist/commonjs/{operations/downloaders → core/stages/memory}/memoryDownloader.js +1 -1
- package/dist/commonjs/core/stages/memory/memoryDownloader.js.map +1 -0
- package/dist/{esm/operations/downloaders → commonjs/core/stages}/serverDownloader.d.ts +4 -5
- package/dist/commonjs/core/stages/serverDownloader.d.ts.map +1 -0
- package/dist/commonjs/{operations/downloaders → core/stages}/serverDownloader.js +82 -32
- package/dist/commonjs/core/stages/serverDownloader.js.map +1 -0
- package/dist/commonjs/core/traverser.d.ts.map +1 -0
- package/dist/commonjs/{operations → core}/traverser.js +7 -7
- package/dist/commonjs/core/traverser.js.map +1 -0
- package/dist/commonjs/deferment/MemoryCache.d.ts +35 -0
- package/dist/commonjs/deferment/MemoryCache.d.ts.map +1 -0
- package/dist/commonjs/deferment/MemoryCache.js +162 -0
- package/dist/commonjs/deferment/MemoryCache.js.map +1 -0
- package/dist/commonjs/deferment/MemoryCache.test.d.ts +2 -0
- package/dist/commonjs/deferment/MemoryCache.test.d.ts.map +1 -0
- package/dist/commonjs/deferment/MemoryCache.test.js +153 -0
- package/dist/commonjs/deferment/MemoryCache.test.js.map +1 -0
- package/dist/commonjs/deferment/defermentManager.d.ts +16 -0
- package/dist/commonjs/deferment/defermentManager.d.ts.map +1 -0
- package/dist/commonjs/deferment/defermentManager.js +58 -0
- package/dist/commonjs/deferment/defermentManager.js.map +1 -0
- package/dist/commonjs/deferment/defermentManager.test.d.ts +2 -0
- package/dist/commonjs/deferment/defermentManager.test.d.ts.map +1 -0
- package/dist/commonjs/deferment/defermentManager.test.js +188 -0
- package/dist/commonjs/deferment/defermentManager.test.js.map +1 -0
- package/dist/commonjs/deferment/deferredBase.d.ts +12 -0
- package/dist/commonjs/deferment/deferredBase.d.ts.map +1 -0
- package/dist/commonjs/deferment/deferredBase.js +27 -0
- package/dist/commonjs/deferment/deferredBase.js.map +1 -0
- package/dist/commonjs/index.d.ts +3 -3
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +6 -5
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/{helpers → queues}/aggregateQueue.d.ts +2 -1
- package/dist/commonjs/queues/aggregateQueue.d.ts.map +1 -0
- package/dist/commonjs/{helpers → queues}/aggregateQueue.js +4 -0
- package/dist/commonjs/queues/aggregateQueue.js.map +1 -0
- package/dist/{esm/helpers → commonjs/queues}/asyncGeneratorQueue.d.ts +1 -1
- package/dist/commonjs/queues/asyncGeneratorQueue.d.ts.map +1 -0
- package/dist/commonjs/{helpers → queues}/asyncGeneratorQueue.js +2 -1
- package/dist/commonjs/queues/asyncGeneratorQueue.js.map +1 -0
- package/dist/{esm/helpers → commonjs/queues}/batchedPool.d.ts +2 -1
- package/dist/commonjs/queues/batchedPool.d.ts.map +1 -0
- package/dist/commonjs/queues/batchedPool.js.map +1 -0
- package/dist/{esm/helpers → commonjs/queues}/batchingQueue.d.ts +4 -1
- package/dist/commonjs/queues/batchingQueue.d.ts.map +1 -0
- package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts +2 -0
- package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts.map +1 -0
- package/dist/commonjs/queues/batchingQueue.dispose.test.js +64 -0
- package/dist/commonjs/queues/batchingQueue.dispose.test.js.map +1 -0
- package/dist/commonjs/queues/batchingQueue.js +123 -0
- package/dist/commonjs/queues/batchingQueue.js.map +1 -0
- package/dist/commonjs/queues/batchingQueue.test.d.ts +2 -0
- package/dist/commonjs/queues/batchingQueue.test.d.ts.map +1 -0
- package/dist/commonjs/queues/batchingQueue.test.js +138 -0
- package/dist/commonjs/queues/batchingQueue.test.js.map +1 -0
- package/dist/{esm/helpers → commonjs/queues}/bufferQueue.d.ts +1 -0
- package/dist/commonjs/queues/bufferQueue.d.ts.map +1 -0
- package/dist/commonjs/{helpers → queues}/bufferQueue.js +3 -0
- package/dist/commonjs/queues/bufferQueue.js.map +1 -0
- package/dist/commonjs/{helpers → queues}/keyedQueue.d.ts +1 -0
- package/dist/commonjs/queues/keyedQueue.d.ts.map +1 -0
- package/dist/commonjs/{helpers → queues}/keyedQueue.js +11 -0
- package/dist/commonjs/queues/keyedQueue.js.map +1 -0
- package/dist/commonjs/queues/queue.d.ts +5 -0
- package/dist/commonjs/queues/queue.d.ts.map +1 -0
- package/dist/commonjs/{helpers → queues}/queue.js.map +1 -1
- package/dist/commonjs/types/functions.d.ts +21 -0
- package/dist/commonjs/types/functions.d.ts.map +1 -0
- package/dist/commonjs/types/functions.js +92 -0
- package/dist/commonjs/types/functions.js.map +1 -0
- package/dist/commonjs/types/types.d.ts +1 -7
- package/dist/commonjs/types/types.d.ts.map +1 -1
- package/dist/commonjs/types/types.js +0 -36
- package/dist/commonjs/types/types.js.map +1 -1
- package/dist/esm/{operations → core}/interfaces.d.ts +2 -5
- package/dist/esm/core/interfaces.d.ts.map +1 -0
- package/dist/esm/core/interfaces.js.map +1 -0
- package/dist/{commonjs/operations → esm/core}/objectLoader2.d.ts +1 -1
- package/dist/esm/core/objectLoader2.d.ts.map +1 -0
- package/dist/esm/core/objectLoader2.js +121 -0
- package/dist/esm/core/objectLoader2.js.map +1 -0
- package/dist/esm/core/objectLoader2Factory.d.ts +27 -0
- package/dist/esm/core/objectLoader2Factory.d.ts.map +1 -0
- package/dist/esm/core/objectLoader2Factory.js +67 -0
- package/dist/esm/core/objectLoader2Factory.js.map +1 -0
- package/dist/{commonjs/operations → esm/core}/options.d.ts +2 -1
- package/dist/esm/core/options.d.ts.map +1 -0
- package/dist/esm/{operations → core}/options.js.map +1 -1
- package/dist/esm/core/stages/ItemStore.d.ts +37 -0
- package/dist/esm/core/stages/ItemStore.d.ts.map +1 -0
- package/dist/esm/core/stages/ItemStore.js +163 -0
- package/dist/esm/core/stages/ItemStore.js.map +1 -0
- package/dist/esm/core/stages/cacheReader.d.ts +18 -0
- package/dist/esm/core/stages/cacheReader.d.ts.map +1 -0
- package/dist/esm/core/stages/cacheReader.js +65 -0
- package/dist/esm/core/stages/cacheReader.js.map +1 -0
- package/dist/esm/core/stages/cacheWriter.d.ts +15 -0
- package/dist/esm/core/stages/cacheWriter.d.ts.map +1 -0
- package/dist/esm/core/stages/cacheWriter.js +43 -0
- package/dist/esm/core/stages/cacheWriter.js.map +1 -0
- package/dist/esm/{operations/databases → core/stages}/indexedDatabase.d.ts +2 -7
- package/dist/esm/core/stages/indexedDatabase.d.ts.map +1 -0
- package/dist/esm/core/stages/indexedDatabase.js +28 -0
- package/dist/esm/core/stages/indexedDatabase.js.map +1 -0
- package/dist/esm/core/stages/memory/memoryDatabase.d.ts +13 -0
- package/dist/esm/core/stages/memory/memoryDatabase.d.ts.map +1 -0
- package/dist/esm/{operations/databases → core/stages/memory}/memoryDatabase.js +4 -8
- package/dist/esm/core/stages/memory/memoryDatabase.js.map +1 -0
- package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +3 -3
- package/dist/esm/core/stages/memory/memoryDownloader.d.ts.map +1 -0
- package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.js +1 -1
- package/dist/esm/core/stages/memory/memoryDownloader.js.map +1 -0
- package/dist/{commonjs/operations/downloaders → esm/core/stages}/serverDownloader.d.ts +4 -5
- package/dist/esm/core/stages/serverDownloader.d.ts.map +1 -0
- package/dist/esm/{operations/downloaders → core/stages}/serverDownloader.js +81 -31
- package/dist/esm/core/stages/serverDownloader.js.map +1 -0
- package/dist/esm/core/traverser.d.ts.map +1 -0
- package/dist/esm/{operations → core}/traverser.js +1 -1
- package/dist/esm/core/traverser.js.map +1 -0
- package/dist/esm/deferment/MemoryCache.d.ts +35 -0
- package/dist/esm/deferment/MemoryCache.d.ts.map +1 -0
- package/dist/esm/deferment/MemoryCache.js +157 -0
- package/dist/esm/deferment/MemoryCache.js.map +1 -0
- package/dist/esm/deferment/MemoryCache.test.d.ts +2 -0
- package/dist/esm/deferment/MemoryCache.test.d.ts.map +1 -0
- package/dist/esm/deferment/MemoryCache.test.js +151 -0
- package/dist/esm/deferment/MemoryCache.test.js.map +1 -0
- package/dist/esm/deferment/defermentManager.d.ts +16 -0
- package/dist/esm/deferment/defermentManager.d.ts.map +1 -0
- package/dist/esm/deferment/defermentManager.js +54 -0
- package/dist/esm/deferment/defermentManager.js.map +1 -0
- package/dist/esm/deferment/defermentManager.test.d.ts +2 -0
- package/dist/esm/deferment/defermentManager.test.d.ts.map +1 -0
- package/dist/esm/deferment/defermentManager.test.js +186 -0
- package/dist/esm/deferment/defermentManager.test.js.map +1 -0
- package/dist/esm/deferment/deferredBase.d.ts +12 -0
- package/dist/esm/deferment/deferredBase.d.ts.map +1 -0
- package/dist/esm/deferment/deferredBase.js +23 -0
- package/dist/esm/deferment/deferredBase.js.map +1 -0
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{helpers → queues}/aggregateQueue.d.ts +2 -1
- package/dist/esm/queues/aggregateQueue.d.ts.map +1 -0
- package/dist/esm/{helpers → queues}/aggregateQueue.js +4 -0
- package/dist/esm/queues/aggregateQueue.js.map +1 -0
- package/dist/{commonjs/helpers → esm/queues}/asyncGeneratorQueue.d.ts +1 -1
- package/dist/esm/queues/asyncGeneratorQueue.d.ts.map +1 -0
- package/dist/esm/{helpers → queues}/asyncGeneratorQueue.js +2 -1
- package/dist/esm/queues/asyncGeneratorQueue.js.map +1 -0
- package/dist/{commonjs/helpers → esm/queues}/batchedPool.d.ts +2 -1
- package/dist/esm/queues/batchedPool.d.ts.map +1 -0
- package/dist/esm/queues/batchedPool.js.map +1 -0
- package/dist/{commonjs/helpers → esm/queues}/batchingQueue.d.ts +4 -1
- package/dist/esm/queues/batchingQueue.d.ts.map +1 -0
- package/dist/esm/queues/batchingQueue.dispose.test.d.ts +2 -0
- package/dist/esm/queues/batchingQueue.dispose.test.d.ts.map +1 -0
- package/dist/esm/queues/batchingQueue.dispose.test.js +59 -0
- package/dist/esm/queues/batchingQueue.dispose.test.js.map +1 -0
- package/dist/esm/queues/batchingQueue.js +117 -0
- package/dist/esm/queues/batchingQueue.js.map +1 -0
- package/dist/esm/queues/batchingQueue.test.d.ts +2 -0
- package/dist/esm/queues/batchingQueue.test.d.ts.map +1 -0
- package/dist/esm/queues/batchingQueue.test.js +133 -0
- package/dist/esm/queues/batchingQueue.test.js.map +1 -0
- package/dist/{commonjs/helpers → esm/queues}/bufferQueue.d.ts +1 -0
- package/dist/esm/queues/bufferQueue.d.ts.map +1 -0
- package/dist/esm/{helpers → queues}/bufferQueue.js +3 -0
- package/dist/esm/queues/bufferQueue.js.map +1 -0
- package/dist/esm/{helpers → queues}/keyedQueue.d.ts +1 -0
- package/dist/esm/queues/keyedQueue.d.ts.map +1 -0
- package/dist/esm/{helpers → queues}/keyedQueue.js +11 -0
- package/dist/esm/queues/keyedQueue.js.map +1 -0
- package/dist/esm/queues/queue.d.ts +5 -0
- package/dist/esm/queues/queue.d.ts.map +1 -0
- package/dist/esm/{helpers → queues}/queue.js.map +1 -1
- package/dist/esm/types/functions.d.ts +21 -0
- package/dist/esm/types/functions.d.ts.map +1 -0
- package/dist/esm/types/functions.js +83 -0
- package/dist/esm/types/functions.js.map +1 -0
- package/dist/esm/types/types.d.ts +1 -7
- package/dist/esm/types/types.d.ts.map +1 -1
- package/dist/esm/types/types.js +1 -32
- package/dist/esm/types/types.js.map +1 -1
- package/package.json +2 -3
- package/readme.md +64 -16
- package/src/{operations → core}/interfaces.ts +2 -3
- package/src/{operations → core}/objectLoader2.spec.ts +22 -9
- package/src/core/objectLoader2.ts +162 -0
- package/src/core/objectLoader2Factory.ts +87 -0
- package/src/{operations → core}/options.ts +2 -1
- package/src/core/stages/ItemStore.ts +196 -0
- package/src/core/stages/__snapshots__/indexedDatabase.spec.ts.snap +18 -0
- package/src/{operations/downloaders → core/stages}/__snapshots__/serverDownloader.spec.ts.snap +25 -0
- package/src/{helpers → core/stages}/cacheReader.spec.ts +12 -7
- package/src/core/stages/cacheReader.ts +88 -0
- package/src/core/stages/cacheWriter.spec.ts +213 -0
- package/src/core/stages/cacheWriter.ts +64 -0
- package/src/core/stages/indexedDatabase.spec.ts +37 -0
- package/src/core/stages/indexedDatabase.ts +49 -0
- package/src/core/stages/memory/__snapshots__/memoryDownloader.spec.ts.snap +12 -0
- package/src/core/stages/memory/memoryDatabase.spec.ts +48 -0
- package/src/{operations/databases → core/stages/memory}/memoryDatabase.ts +7 -12
- package/src/core/stages/memory/memoryDownloader.spec.ts +49 -0
- package/src/{operations/downloaders → core/stages/memory}/memoryDownloader.ts +4 -4
- package/src/{operations/downloaders → core/stages}/serverDownloader.spec.ts +102 -11
- package/src/{operations/downloaders → core/stages}/serverDownloader.ts +88 -31
- package/src/{operations → core}/traverser.ts +2 -1
- package/src/deferment/MemoryCache.test.ts +187 -0
- package/src/deferment/MemoryCache.ts +189 -0
- package/src/deferment/defermentManager.test.ts +220 -0
- package/src/deferment/defermentManager.ts +59 -0
- package/src/deferment/deferredBase.ts +29 -0
- package/src/index.ts +3 -3
- package/src/{helpers → queues}/aggregateQueue.ts +5 -1
- package/src/{helpers → queues}/asyncGeneratorQueue.ts +2 -1
- package/src/{helpers → queues}/batchedPool.ts +3 -1
- package/src/queues/batchingQueue.dispose.test.ts +74 -0
- package/src/queues/batchingQueue.test.ts +149 -0
- package/src/queues/batchingQueue.ts +138 -0
- package/src/{helpers → queues}/bufferQueue.ts +3 -0
- package/src/{helpers → queues}/keyedQueue.ts +12 -0
- package/src/{helpers → queues}/queue.ts +1 -0
- package/src/test/e2e.spec.ts +6 -4
- package/src/types/functions.spec.ts +155 -0
- package/src/types/functions.ts +118 -0
- package/src/types/types.ts +1 -51
- package/dist/commonjs/helpers/aggregateQueue.d.ts.map +0 -1
- package/dist/commonjs/helpers/aggregateQueue.js.map +0 -1
- package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts.map +0 -1
- package/dist/commonjs/helpers/asyncGeneratorQueue.js.map +0 -1
- package/dist/commonjs/helpers/batchedPool.d.ts.map +0 -1
- package/dist/commonjs/helpers/batchedPool.js.map +0 -1
- package/dist/commonjs/helpers/batchingQueue.d.ts.map +0 -1
- package/dist/commonjs/helpers/batchingQueue.js +0 -77
- package/dist/commonjs/helpers/batchingQueue.js.map +0 -1
- package/dist/commonjs/helpers/bufferQueue.d.ts.map +0 -1
- package/dist/commonjs/helpers/bufferQueue.js.map +0 -1
- package/dist/commonjs/helpers/cachePump.d.ts +0 -21
- package/dist/commonjs/helpers/cachePump.d.ts.map +0 -1
- package/dist/commonjs/helpers/cachePump.js +0 -80
- package/dist/commonjs/helpers/cachePump.js.map +0 -1
- package/dist/commonjs/helpers/cacheReader.d.ts +0 -14
- package/dist/commonjs/helpers/cacheReader.d.ts.map +0 -1
- package/dist/commonjs/helpers/cacheReader.js +0 -58
- package/dist/commonjs/helpers/cacheReader.js.map +0 -1
- package/dist/commonjs/helpers/defermentManager.d.ts +0 -26
- package/dist/commonjs/helpers/defermentManager.d.ts.map +0 -1
- package/dist/commonjs/helpers/defermentManager.js +0 -131
- package/dist/commonjs/helpers/defermentManager.js.map +0 -1
- package/dist/commonjs/helpers/deferredBase.d.ts +0 -19
- package/dist/commonjs/helpers/deferredBase.d.ts.map +0 -1
- package/dist/commonjs/helpers/deferredBase.js +0 -51
- package/dist/commonjs/helpers/deferredBase.js.map +0 -1
- package/dist/commonjs/helpers/keyedQueue.d.ts.map +0 -1
- package/dist/commonjs/helpers/keyedQueue.js.map +0 -1
- package/dist/commonjs/helpers/memoryPump.d.ts +0 -15
- package/dist/commonjs/helpers/memoryPump.d.ts.map +0 -1
- package/dist/commonjs/helpers/memoryPump.js +0 -34
- package/dist/commonjs/helpers/memoryPump.js.map +0 -1
- package/dist/commonjs/helpers/pump.d.ts +0 -8
- package/dist/commonjs/helpers/pump.d.ts.map +0 -1
- package/dist/commonjs/helpers/pump.js +0 -3
- package/dist/commonjs/helpers/pump.js.map +0 -1
- package/dist/commonjs/helpers/queue.d.ts +0 -4
- package/dist/commonjs/helpers/queue.d.ts.map +0 -1
- package/dist/commonjs/operations/databases/indexedDatabase.d.ts.map +0 -1
- package/dist/commonjs/operations/databases/indexedDatabase.js +0 -117
- package/dist/commonjs/operations/databases/indexedDatabase.js.map +0 -1
- package/dist/commonjs/operations/databases/memoryDatabase.d.ts +0 -16
- package/dist/commonjs/operations/databases/memoryDatabase.d.ts.map +0 -1
- package/dist/commonjs/operations/databases/memoryDatabase.js.map +0 -1
- package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts.map +0 -1
- package/dist/commonjs/operations/downloaders/memoryDownloader.js.map +0 -1
- package/dist/commonjs/operations/downloaders/serverDownloader.d.ts.map +0 -1
- package/dist/commonjs/operations/downloaders/serverDownloader.js.map +0 -1
- package/dist/commonjs/operations/interfaces.d.ts.map +0 -1
- package/dist/commonjs/operations/interfaces.js.map +0 -1
- package/dist/commonjs/operations/objectLoader2.d.ts.map +0 -1
- package/dist/commonjs/operations/objectLoader2.js +0 -95
- package/dist/commonjs/operations/objectLoader2.js.map +0 -1
- package/dist/commonjs/operations/objectLoader2Factory.d.ts +0 -21
- package/dist/commonjs/operations/objectLoader2Factory.d.ts.map +0 -1
- package/dist/commonjs/operations/objectLoader2Factory.js +0 -50
- package/dist/commonjs/operations/objectLoader2Factory.js.map +0 -1
- package/dist/commonjs/operations/options.d.ts.map +0 -1
- package/dist/commonjs/operations/traverser.d.ts.map +0 -1
- package/dist/commonjs/operations/traverser.js.map +0 -1
- package/dist/esm/helpers/aggregateQueue.d.ts.map +0 -1
- package/dist/esm/helpers/aggregateQueue.js.map +0 -1
- package/dist/esm/helpers/asyncGeneratorQueue.d.ts.map +0 -1
- package/dist/esm/helpers/asyncGeneratorQueue.js.map +0 -1
- package/dist/esm/helpers/batchedPool.d.ts.map +0 -1
- package/dist/esm/helpers/batchedPool.js.map +0 -1
- package/dist/esm/helpers/batchingQueue.d.ts.map +0 -1
- package/dist/esm/helpers/batchingQueue.js +0 -71
- package/dist/esm/helpers/batchingQueue.js.map +0 -1
- package/dist/esm/helpers/bufferQueue.d.ts.map +0 -1
- package/dist/esm/helpers/bufferQueue.js.map +0 -1
- package/dist/esm/helpers/cachePump.d.ts +0 -21
- package/dist/esm/helpers/cachePump.d.ts.map +0 -1
- package/dist/esm/helpers/cachePump.js +0 -73
- package/dist/esm/helpers/cachePump.js.map +0 -1
- package/dist/esm/helpers/cacheReader.d.ts +0 -14
- package/dist/esm/helpers/cacheReader.d.ts.map +0 -1
- package/dist/esm/helpers/cacheReader.js +0 -51
- package/dist/esm/helpers/cacheReader.js.map +0 -1
- package/dist/esm/helpers/defermentManager.d.ts +0 -26
- package/dist/esm/helpers/defermentManager.d.ts.map +0 -1
- package/dist/esm/helpers/defermentManager.js +0 -127
- package/dist/esm/helpers/defermentManager.js.map +0 -1
- package/dist/esm/helpers/deferredBase.d.ts +0 -19
- package/dist/esm/helpers/deferredBase.d.ts.map +0 -1
- package/dist/esm/helpers/deferredBase.js +0 -47
- package/dist/esm/helpers/deferredBase.js.map +0 -1
- package/dist/esm/helpers/keyedQueue.d.ts.map +0 -1
- package/dist/esm/helpers/keyedQueue.js.map +0 -1
- package/dist/esm/helpers/memoryPump.d.ts +0 -15
- package/dist/esm/helpers/memoryPump.d.ts.map +0 -1
- package/dist/esm/helpers/memoryPump.js +0 -30
- package/dist/esm/helpers/memoryPump.js.map +0 -1
- package/dist/esm/helpers/pump.d.ts +0 -8
- package/dist/esm/helpers/pump.d.ts.map +0 -1
- package/dist/esm/helpers/pump.js +0 -2
- package/dist/esm/helpers/pump.js.map +0 -1
- package/dist/esm/helpers/queue.d.ts +0 -4
- package/dist/esm/helpers/queue.d.ts.map +0 -1
- package/dist/esm/operations/databases/indexedDatabase.d.ts.map +0 -1
- package/dist/esm/operations/databases/indexedDatabase.js +0 -114
- package/dist/esm/operations/databases/indexedDatabase.js.map +0 -1
- package/dist/esm/operations/databases/memoryDatabase.d.ts +0 -16
- package/dist/esm/operations/databases/memoryDatabase.d.ts.map +0 -1
- package/dist/esm/operations/databases/memoryDatabase.js.map +0 -1
- package/dist/esm/operations/downloaders/memoryDownloader.d.ts.map +0 -1
- package/dist/esm/operations/downloaders/memoryDownloader.js.map +0 -1
- package/dist/esm/operations/downloaders/serverDownloader.d.ts.map +0 -1
- package/dist/esm/operations/downloaders/serverDownloader.js.map +0 -1
- package/dist/esm/operations/interfaces.d.ts.map +0 -1
- package/dist/esm/operations/interfaces.js.map +0 -1
- package/dist/esm/operations/objectLoader2.d.ts.map +0 -1
- package/dist/esm/operations/objectLoader2.js +0 -88
- package/dist/esm/operations/objectLoader2.js.map +0 -1
- package/dist/esm/operations/objectLoader2Factory.d.ts +0 -21
- package/dist/esm/operations/objectLoader2Factory.d.ts.map +0 -1
- package/dist/esm/operations/objectLoader2Factory.js +0 -43
- package/dist/esm/operations/objectLoader2Factory.js.map +0 -1
- package/dist/esm/operations/options.d.ts.map +0 -1
- package/dist/esm/operations/traverser.d.ts.map +0 -1
- package/dist/esm/operations/traverser.js.map +0 -1
- package/src/helpers/__snapshots__/cachePump.spec.ts.snap +0 -31
- package/src/helpers/__snapshots__/defermentManager.spec.ts.snap +0 -8
- package/src/helpers/batchingQueue.ts +0 -85
- package/src/helpers/cachePump.disposal.spec.ts +0 -49
- package/src/helpers/cachePump.spec.ts +0 -103
- package/src/helpers/cachePump.ts +0 -99
- package/src/helpers/cacheReader.ts +0 -64
- package/src/helpers/defermentManager.disposal.spec.ts +0 -28
- package/src/helpers/defermentManager.spec.ts +0 -37
- package/src/helpers/defermentManager.ts +0 -141
- package/src/helpers/deferredBase.ts +0 -55
- package/src/helpers/memoryPump.ts +0 -40
- package/src/helpers/pump.ts +0 -8
- package/src/operations/databases/__snapshots__/indexedDatabase.spec.ts.snap +0 -31
- package/src/operations/databases/indexedDatabase.spec.ts +0 -37
- package/src/operations/databases/indexedDatabase.ts +0 -150
- package/src/operations/objectLoader2.ts +0 -111
- package/src/operations/objectLoader2Factory.ts +0 -56
- package/dist/commonjs/{operations → core}/interfaces.js +0 -0
- package/dist/commonjs/{operations → core}/options.js +0 -0
- package/dist/commonjs/{operations → core}/traverser.d.ts +0 -0
- package/dist/commonjs/{helpers → queues}/batchedPool.js +0 -0
- package/dist/commonjs/{helpers → queues}/queue.js +0 -0
- package/dist/esm/{operations → core}/interfaces.js +0 -0
- package/dist/esm/{operations → core}/options.js +0 -0
- package/dist/esm/{operations → core}/traverser.d.ts +0 -0
- package/dist/esm/{helpers → queues}/batchedPool.js +0 -0
- package/dist/esm/{helpers → queues}/queue.js +0 -0
- package/src/{operations → core}/__snapshots__/objectLoader2.spec.ts.snap +0 -0
- package/src/{operations → core}/__snapshots__/traverser.spec.ts.snap +0 -0
- package/src/{helpers → core/stages}/__snapshots__/cacheReader.spec.ts.snap +0 -0
- package/src/{operations → core}/traverser.spec.ts +1 -1
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { CustomLogger } from '../types/functions.js'
|
|
2
|
+
import { Item } from '../types/types.js'
|
|
3
|
+
|
|
4
|
+
export interface MemoryCacheOptions {
|
|
5
|
+
maxSizeInMb: number
|
|
6
|
+
ttlms: number
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class MemoryCacheItem {
|
|
10
|
+
private item: Item
|
|
11
|
+
private expiresAt: number // Timestamp in ms
|
|
12
|
+
|
|
13
|
+
constructor(item: Item, expiresAt: number) {
|
|
14
|
+
this.item = item
|
|
15
|
+
this.expiresAt = expiresAt
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
isExpired(now: number): boolean {
|
|
19
|
+
return now > this.expiresAt
|
|
20
|
+
}
|
|
21
|
+
setAccess(now: number, ttl: number): void {
|
|
22
|
+
this.expiresAt = now + ttl
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
getItem(): Item {
|
|
26
|
+
return this.item
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
done(now: number): boolean {
|
|
30
|
+
if (this.isExpired(now)) {
|
|
31
|
+
return true
|
|
32
|
+
}
|
|
33
|
+
return false
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export class MemoryCache {
|
|
38
|
+
private isGathered: Map<string, boolean> = new Map()
|
|
39
|
+
private references: Map<string, number> = new Map()
|
|
40
|
+
private cache: Map<string, MemoryCacheItem> = new Map()
|
|
41
|
+
|
|
42
|
+
private options: MemoryCacheOptions
|
|
43
|
+
private logger: CustomLogger
|
|
44
|
+
private disposed = false
|
|
45
|
+
private currentSize = 0
|
|
46
|
+
private timer?: ReturnType<typeof setTimeout>
|
|
47
|
+
|
|
48
|
+
constructor(options: MemoryCacheOptions, logger: CustomLogger) {
|
|
49
|
+
this.options = options
|
|
50
|
+
this.logger = logger
|
|
51
|
+
this.resetGlobalTimer()
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
add(item: Item, requestItem: (id: string) => void, testNow?: number): void {
|
|
55
|
+
if (this.disposed) throw new Error('MemoryCache is disposed')
|
|
56
|
+
this.currentSize += item.size || 0
|
|
57
|
+
this.cache.set(
|
|
58
|
+
item.baseId,
|
|
59
|
+
new MemoryCacheItem(item, (testNow || this.now()) + this.options.ttlms)
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
if (!this.isGathered.has(item.baseId)) {
|
|
63
|
+
this.isGathered.set(item.baseId, true)
|
|
64
|
+
this.scanForReferences(item.base!, requestItem)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
get(id: string): Item | undefined {
|
|
69
|
+
if (this.disposed) throw new Error('MemoryCache is disposed')
|
|
70
|
+
const item = this.cache.get(id)
|
|
71
|
+
if (item) {
|
|
72
|
+
item.setAccess(this.now(), this.options.ttlms)
|
|
73
|
+
return item.getItem()
|
|
74
|
+
}
|
|
75
|
+
return undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
scanForReferences(data: unknown, requestItem: (id: string) => void): void {
|
|
79
|
+
const scan = (item: unknown): void => {
|
|
80
|
+
// Stop if the item is null or not an object (i.e., primitive)
|
|
81
|
+
if (item === null || typeof item !== 'object') {
|
|
82
|
+
return
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// If it's an array, scan each element
|
|
86
|
+
if (Array.isArray(item)) {
|
|
87
|
+
for (const element of item) {
|
|
88
|
+
scan(element)
|
|
89
|
+
}
|
|
90
|
+
return
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// If it's an object, scan its properties
|
|
94
|
+
for (const key in item) {
|
|
95
|
+
if (Object.prototype.hasOwnProperty.call(item, key)) {
|
|
96
|
+
// We found the target property!
|
|
97
|
+
if (key === 'referencedId') {
|
|
98
|
+
const value = (item as { referencedId: unknown }).referencedId
|
|
99
|
+
// Ensure the value is a string before adding it
|
|
100
|
+
if (typeof value === 'string') {
|
|
101
|
+
this.references.set(value, (this.references.get(value) || 0) + 1)
|
|
102
|
+
if (!this.cache.has(value)) {
|
|
103
|
+
requestItem(value)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Continue scanning deeper into the object's properties
|
|
109
|
+
scan((item as Record<string, unknown>)[key])
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
scan(data)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private resetGlobalTimer(): void {
|
|
118
|
+
const run = (): void => {
|
|
119
|
+
this.cleanCache()
|
|
120
|
+
this.timer = setTimeout(run, this.options.ttlms)
|
|
121
|
+
}
|
|
122
|
+
this.timer = setTimeout(run, this.options.ttlms)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private now(): number {
|
|
126
|
+
return Date.now()
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
cleanCache(testNow?: number): void {
|
|
130
|
+
const maxSizeBytes = this.options.maxSizeInMb * 1024 * 1024
|
|
131
|
+
if (this.currentSize < maxSizeBytes) {
|
|
132
|
+
this.logger(
|
|
133
|
+
`cache size (${this.currentSize} < ${maxSizeBytes}) is ok, no need to clean`
|
|
134
|
+
)
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
const now = testNow || this.now()
|
|
138
|
+
let cleaned = 0
|
|
139
|
+
const start = performance.now()
|
|
140
|
+
for (const deferredBase of Array.from(this.cache.values())
|
|
141
|
+
.filter((x) => x.isExpired(now))
|
|
142
|
+
.sort((a, b) =>
|
|
143
|
+
this.compareMaybeBasesByReferences(a.getItem().baseId, b.getItem().baseId)
|
|
144
|
+
)) {
|
|
145
|
+
if (deferredBase.done(now)) {
|
|
146
|
+
const id = deferredBase.getItem().baseId
|
|
147
|
+
const referenceCount = this.references.get(id) || 0
|
|
148
|
+
if (referenceCount > 0) {
|
|
149
|
+
// Skip eviction for items with reference counts greater than 0,
|
|
150
|
+
// as they are still in use and should not be removed from the cache.
|
|
151
|
+
continue
|
|
152
|
+
}
|
|
153
|
+
this.currentSize -= deferredBase.getItem().size || 0
|
|
154
|
+
this.cache.delete(id)
|
|
155
|
+
cleaned++
|
|
156
|
+
if (this.currentSize < maxSizeBytes) {
|
|
157
|
+
break
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
this.logger(
|
|
162
|
+
`cleaned cache: cleaned ${cleaned}, cached ${this.cache.size}, time ${
|
|
163
|
+
performance.now() - start
|
|
164
|
+
}`
|
|
165
|
+
)
|
|
166
|
+
return
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
compareMaybeBasesByReferences(id1: string, id2: string): number {
|
|
170
|
+
const a = this.references.get(id1)
|
|
171
|
+
const b = this.references.get(id2)
|
|
172
|
+
if (a === undefined && b === undefined) return 0
|
|
173
|
+
if (a === undefined) return -1
|
|
174
|
+
if (b === undefined) return 1
|
|
175
|
+
return a - b
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
dispose(): void {
|
|
179
|
+
if (this.disposed) return
|
|
180
|
+
this.disposed = true
|
|
181
|
+
if (this.timer) {
|
|
182
|
+
clearTimeout(this.timer)
|
|
183
|
+
this.timer = undefined
|
|
184
|
+
}
|
|
185
|
+
this.cache.clear()
|
|
186
|
+
this.isGathered.clear()
|
|
187
|
+
this.references.clear()
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { vi, describe, it, expect } from 'vitest'
|
|
2
|
+
import { DefermentManager } from './defermentManager.js'
|
|
3
|
+
import { MemoryCache } from './MemoryCache.js'
|
|
4
|
+
import { CustomLogger } from '../types/functions.js'
|
|
5
|
+
import { Item } from '../types/types.js'
|
|
6
|
+
|
|
7
|
+
describe('DefermentManager', () => {
|
|
8
|
+
it('should be created', () => {
|
|
9
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
10
|
+
const mockCache = {
|
|
11
|
+
get: vi.fn(),
|
|
12
|
+
add: vi.fn()
|
|
13
|
+
} as unknown as MemoryCache
|
|
14
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
15
|
+
expect(defermentManager).toBeDefined()
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
describe('defer', () => {
|
|
19
|
+
it('should return a resolved promise if item is in cache', async () => {
|
|
20
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
21
|
+
const get = vi.fn()
|
|
22
|
+
const add = vi.fn()
|
|
23
|
+
const mockCache = {
|
|
24
|
+
get,
|
|
25
|
+
add
|
|
26
|
+
} as unknown as MemoryCache
|
|
27
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
28
|
+
|
|
29
|
+
const item: Item = {
|
|
30
|
+
// eslint-disable-next-line camelcase
|
|
31
|
+
base: { id: 'testId', speckle_type: 'Base' },
|
|
32
|
+
baseId: 'testId'
|
|
33
|
+
}
|
|
34
|
+
get.mockReturnValue(item)
|
|
35
|
+
|
|
36
|
+
const [promise, wasInCache] = defermentManager.defer({ id: 'testId' })
|
|
37
|
+
const result = await promise
|
|
38
|
+
|
|
39
|
+
expect(wasInCache).toBe(true)
|
|
40
|
+
expect(result).toEqual(item.base)
|
|
41
|
+
expect(get).toHaveBeenCalledWith('testId')
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('should return the same promise if item is already outstanding', () => {
|
|
45
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
46
|
+
const get = vi.fn()
|
|
47
|
+
const add = vi.fn()
|
|
48
|
+
const mockCache = {
|
|
49
|
+
get,
|
|
50
|
+
add
|
|
51
|
+
} as unknown as MemoryCache
|
|
52
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
53
|
+
|
|
54
|
+
const [promise1, wasInCache1] = defermentManager.defer({ id: 'testId' })
|
|
55
|
+
const [promise2, wasInCache2] = defermentManager.defer({ id: 'testId' })
|
|
56
|
+
|
|
57
|
+
expect(wasInCache1).toBe(false)
|
|
58
|
+
expect(wasInCache2).toBe(true)
|
|
59
|
+
expect(promise1).toBe(promise2)
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
it('should create a new deferred base if not in cache and not outstanding', () => {
|
|
63
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
64
|
+
const get = vi.fn()
|
|
65
|
+
const add = vi.fn()
|
|
66
|
+
const mockCache = {
|
|
67
|
+
get,
|
|
68
|
+
add
|
|
69
|
+
} as unknown as MemoryCache
|
|
70
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
71
|
+
|
|
72
|
+
const [promise, wasInCache] = defermentManager.defer({ id: 'testId' })
|
|
73
|
+
|
|
74
|
+
expect(wasInCache).toBe(false)
|
|
75
|
+
expect(promise).toBeInstanceOf(Promise)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('should throw if disposed', () => {
|
|
79
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
80
|
+
const get = vi.fn()
|
|
81
|
+
const add = vi.fn()
|
|
82
|
+
const mockCache = {
|
|
83
|
+
get,
|
|
84
|
+
add
|
|
85
|
+
} as unknown as MemoryCache
|
|
86
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
87
|
+
|
|
88
|
+
defermentManager.dispose()
|
|
89
|
+
expect(() => defermentManager.defer({ id: 'testId' })).toThrow(
|
|
90
|
+
'DefermentManager is disposed'
|
|
91
|
+
)
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
describe('undefer', () => {
|
|
96
|
+
it('should resolve the promise when an outstanding item is found', async () => {
|
|
97
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
98
|
+
const get = vi.fn()
|
|
99
|
+
const add = vi.fn()
|
|
100
|
+
const mockCache = {
|
|
101
|
+
get,
|
|
102
|
+
add
|
|
103
|
+
} as unknown as MemoryCache
|
|
104
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
105
|
+
const requestItem = vi.fn()
|
|
106
|
+
|
|
107
|
+
const [promise] = defermentManager.defer({ id: 'testId' })
|
|
108
|
+
|
|
109
|
+
const item: Item = {
|
|
110
|
+
// eslint-disable-next-line camelcase
|
|
111
|
+
base: { id: 'testId', speckle_type: 'Base' },
|
|
112
|
+
baseId: 'testId'
|
|
113
|
+
}
|
|
114
|
+
defermentManager.undefer(item, requestItem)
|
|
115
|
+
|
|
116
|
+
const result = await promise
|
|
117
|
+
expect(result).toEqual(item.base)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
it('should log an error if item has no base', () => {
|
|
121
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
122
|
+
const get = vi.fn()
|
|
123
|
+
const add = vi.fn()
|
|
124
|
+
const mockCache = {
|
|
125
|
+
get,
|
|
126
|
+
add
|
|
127
|
+
} as unknown as MemoryCache
|
|
128
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
129
|
+
const requestItem = vi.fn()
|
|
130
|
+
|
|
131
|
+
const item: Item = { baseId: 'testId' }
|
|
132
|
+
defermentManager.undefer(item, requestItem)
|
|
133
|
+
expect(mockLogger).toHaveBeenCalledWith('undefer called with no base', item)
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
it('should add to cache and request item if not outstanding', () => {
|
|
137
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
138
|
+
const get = vi.fn()
|
|
139
|
+
const add = vi.fn()
|
|
140
|
+
const mockCache = {
|
|
141
|
+
get,
|
|
142
|
+
add
|
|
143
|
+
} as unknown as MemoryCache
|
|
144
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
145
|
+
const requestItem = vi.fn()
|
|
146
|
+
|
|
147
|
+
const item: Item = {
|
|
148
|
+
// eslint-disable-next-line camelcase
|
|
149
|
+
base: { id: 'testId', speckle_type: 'Base' },
|
|
150
|
+
baseId: 'testId'
|
|
151
|
+
}
|
|
152
|
+
add.mockImplementation((_item: Item, getDependencies?: (id: string) => void) => {
|
|
153
|
+
if (getDependencies) getDependencies('testId')
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
defermentManager.undefer(item, requestItem)
|
|
157
|
+
|
|
158
|
+
expect(add).toHaveBeenCalledWith(item, expect.any(Function))
|
|
159
|
+
expect(requestItem).toHaveBeenCalledWith('testId')
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
it('should throw if disposed', () => {
|
|
163
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
164
|
+
const get = vi.fn()
|
|
165
|
+
const add = vi.fn()
|
|
166
|
+
const mockCache = {
|
|
167
|
+
get,
|
|
168
|
+
add
|
|
169
|
+
} as unknown as MemoryCache
|
|
170
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
171
|
+
const requestItem = vi.fn()
|
|
172
|
+
|
|
173
|
+
defermentManager.dispose()
|
|
174
|
+
const item: Item = {
|
|
175
|
+
// eslint-disable-next-line camelcase
|
|
176
|
+
base: { id: 'testId', speckle_type: 'Base' },
|
|
177
|
+
baseId: 'testId'
|
|
178
|
+
}
|
|
179
|
+
expect(() => defermentManager.undefer(item, requestItem)).toThrow(
|
|
180
|
+
'DefermentManager is disposed'
|
|
181
|
+
)
|
|
182
|
+
})
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
describe('dispose', () => {
|
|
186
|
+
it('should clear all outstanding deferments', () => {
|
|
187
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
188
|
+
const get = vi.fn()
|
|
189
|
+
const add = vi.fn()
|
|
190
|
+
const mockCache = {
|
|
191
|
+
get,
|
|
192
|
+
add
|
|
193
|
+
} as unknown as MemoryCache
|
|
194
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
195
|
+
|
|
196
|
+
void defermentManager.defer({ id: 'testId' })
|
|
197
|
+
defermentManager.dispose()
|
|
198
|
+
// @ts-expect-error - accessing private property for testing
|
|
199
|
+
expect(defermentManager.outstanding.size).toBe(0)
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
it('should not do anything if already disposed', () => {
|
|
203
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
204
|
+
const get = vi.fn()
|
|
205
|
+
const add = vi.fn()
|
|
206
|
+
const mockCache = {
|
|
207
|
+
get,
|
|
208
|
+
add
|
|
209
|
+
} as unknown as MemoryCache
|
|
210
|
+
const defermentManager = new DefermentManager(mockCache, mockLogger)
|
|
211
|
+
|
|
212
|
+
defermentManager.dispose()
|
|
213
|
+
// @ts-expect-error - accessing private property for testing
|
|
214
|
+
const outstanding = defermentManager.outstanding
|
|
215
|
+
const clearSpy = vi.spyOn(outstanding, 'clear')
|
|
216
|
+
defermentManager.dispose()
|
|
217
|
+
expect(clearSpy).not.toHaveBeenCalled()
|
|
218
|
+
})
|
|
219
|
+
})
|
|
220
|
+
})
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { DeferredBase } from './deferredBase.js'
|
|
2
|
+
import { CustomLogger } from '../types/functions.js'
|
|
3
|
+
import { Item, Base } from '../types/types.js'
|
|
4
|
+
import { MemoryCache } from './MemoryCache.js'
|
|
5
|
+
|
|
6
|
+
export class DefermentManager {
|
|
7
|
+
private outstanding: Map<string, DeferredBase> = new Map()
|
|
8
|
+
private logger: CustomLogger
|
|
9
|
+
private disposed = false
|
|
10
|
+
private cache: MemoryCache
|
|
11
|
+
|
|
12
|
+
constructor(cache: MemoryCache, logger: CustomLogger) {
|
|
13
|
+
this.cache = cache
|
|
14
|
+
this.logger = logger
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
defer(params: { id: string }): [Promise<Base>, boolean] {
|
|
18
|
+
if (this.disposed) throw new Error('DefermentManager is disposed')
|
|
19
|
+
const item = this.cache.get(params.id)
|
|
20
|
+
if (item) {
|
|
21
|
+
return [Promise.resolve(item.base!), true]
|
|
22
|
+
}
|
|
23
|
+
const deferredBase = this.outstanding.get(params.id)
|
|
24
|
+
if (deferredBase) {
|
|
25
|
+
return [deferredBase.getPromise(), true]
|
|
26
|
+
}
|
|
27
|
+
const notYetFound = new DeferredBase(params.id)
|
|
28
|
+
this.outstanding.set(params.id, notYetFound)
|
|
29
|
+
return [notYetFound.getPromise(), false]
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
undefer(item: Item, requestItem: (id: string) => void): void {
|
|
33
|
+
if (this.disposed) throw new Error('DefermentManager is disposed')
|
|
34
|
+
const base = item.base
|
|
35
|
+
if (!base) {
|
|
36
|
+
this.logger('undefer called with no base', item)
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
this.cache.add(item, (id) => {
|
|
40
|
+
if (!this.outstanding.has(id)) {
|
|
41
|
+
requestItem(id)
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
//order matters here with found before undefer
|
|
46
|
+
const deferredBase = this.outstanding.get(item.baseId)
|
|
47
|
+
if (deferredBase) {
|
|
48
|
+
deferredBase.found(base)
|
|
49
|
+
this.outstanding.delete(item.baseId)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
dispose(): void {
|
|
54
|
+
if (this.disposed) return
|
|
55
|
+
this.disposed = true
|
|
56
|
+
this.logger('cleared deferments, left', this.outstanding.size)
|
|
57
|
+
this.outstanding.clear()
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Base } from '../types/types.js'
|
|
2
|
+
|
|
3
|
+
export class DeferredBase {
|
|
4
|
+
private promise: Promise<Base>
|
|
5
|
+
private resolve!: (value: Base) => void
|
|
6
|
+
private reject!: (reason?: Error) => void
|
|
7
|
+
|
|
8
|
+
private readonly id: string
|
|
9
|
+
|
|
10
|
+
constructor(id: string) {
|
|
11
|
+
this.id = id
|
|
12
|
+
this.promise = new Promise<Base>((resolve, reject) => {
|
|
13
|
+
this.resolve = resolve
|
|
14
|
+
this.reject = reject
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
getId(): string {
|
|
19
|
+
return this.id
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
getPromise(): Promise<Base> {
|
|
23
|
+
return this.promise
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
found(value: Base): void {
|
|
27
|
+
this.resolve(value)
|
|
28
|
+
}
|
|
29
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
1
|
+
export { ObjectLoader2 } from './core/objectLoader2.js'
|
|
2
|
+
export { ObjectLoader2Factory } from './core/objectLoader2Factory.js'
|
|
3
|
+
export { getFeatureFlag, ObjectLoader2Flags } from './types/functions.js'
|
|
@@ -8,13 +8,17 @@ export default class AggregateQueue<T> implements Queue<T> {
|
|
|
8
8
|
this.#queue1 = queue1
|
|
9
9
|
this.#queue2 = queue2
|
|
10
10
|
}
|
|
11
|
+
async disposeAsync(): Promise<void> {
|
|
12
|
+
await this.#queue1.disposeAsync()
|
|
13
|
+
await this.#queue2.disposeAsync()
|
|
14
|
+
}
|
|
11
15
|
|
|
12
16
|
add(value: T): void {
|
|
13
17
|
this.#queue1.add(value)
|
|
14
18
|
this.#queue2.add(value)
|
|
15
19
|
}
|
|
16
20
|
|
|
17
|
-
values():
|
|
21
|
+
values(): never {
|
|
18
22
|
throw new Error('Not implemented')
|
|
19
23
|
}
|
|
20
24
|
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { describe, test, expect, vi } from 'vitest'
|
|
2
|
+
import BatchingQueue from './batchingQueue.js'
|
|
3
|
+
|
|
4
|
+
describe('BatchingQueue disposal', () => {
|
|
5
|
+
test('should drain the queue on dispose', async () => {
|
|
6
|
+
const processFunction = vi.fn().mockResolvedValue(undefined)
|
|
7
|
+
const queue = new BatchingQueue<{ id: string }>({
|
|
8
|
+
batchSize: 5,
|
|
9
|
+
maxWaitTime: 1000,
|
|
10
|
+
processFunction
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
const items = Array.from({ length: 3 }, (_, i) => ({ id: `item-${i}` }))
|
|
14
|
+
items.forEach((item) => queue.add(item.id, item))
|
|
15
|
+
|
|
16
|
+
expect(queue.count()).toBe(3)
|
|
17
|
+
|
|
18
|
+
await queue.disposeAsync()
|
|
19
|
+
|
|
20
|
+
expect(processFunction).toHaveBeenCalledWith(items)
|
|
21
|
+
expect(queue.count()).toBe(0)
|
|
22
|
+
expect(queue.isDisposed()).toBe(true)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('should wait for processing to finish before disposing', async () => {
|
|
26
|
+
let resolveProcess: (value: void | PromiseLike<void>) => void = () => {}
|
|
27
|
+
const processPromise = new Promise<void>((resolve) => {
|
|
28
|
+
resolveProcess = resolve
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const processFunction = vi.fn().mockImplementation(() => processPromise)
|
|
32
|
+
|
|
33
|
+
const queue = new BatchingQueue<{ id: string }>({
|
|
34
|
+
batchSize: 2,
|
|
35
|
+
maxWaitTime: 100,
|
|
36
|
+
processFunction
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const items1 = [{ id: 'item-1' }, { id: 'item-2' }]
|
|
40
|
+
items1.forEach((item) => queue.add(item.id, item))
|
|
41
|
+
|
|
42
|
+
// First batch is processing
|
|
43
|
+
expect(processFunction).toHaveBeenCalledWith(items1)
|
|
44
|
+
|
|
45
|
+
const items2 = [{ id: 'item-3' }]
|
|
46
|
+
items2.forEach((item) => queue.add(item.id, item))
|
|
47
|
+
|
|
48
|
+
const disposePromise = queue.disposeAsync()
|
|
49
|
+
|
|
50
|
+
// Queue should be disposed now, but processing is still ongoing
|
|
51
|
+
expect(queue.isDisposed()).toBe(true)
|
|
52
|
+
resolveProcess()
|
|
53
|
+
await disposePromise
|
|
54
|
+
|
|
55
|
+
expect(processFunction).toHaveBeenCalledTimes(2)
|
|
56
|
+
expect(processFunction).toHaveBeenCalledWith(items2)
|
|
57
|
+
expect(queue.count()).toBe(0)
|
|
58
|
+
expect(queue.isDisposed()).toBe(true)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
test('adding items after dispose should do nothing', async () => {
|
|
62
|
+
const processFunction = vi.fn().mockResolvedValue(undefined)
|
|
63
|
+
const queue = new BatchingQueue<string>({
|
|
64
|
+
batchSize: 5,
|
|
65
|
+
maxWaitTime: 1000,
|
|
66
|
+
processFunction
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
await queue.disposeAsync()
|
|
70
|
+
queue.add('key1', 'item1')
|
|
71
|
+
expect(queue.count()).toBe(0)
|
|
72
|
+
expect(processFunction).not.toHaveBeenCalled()
|
|
73
|
+
})
|
|
74
|
+
})
|