@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
|
@@ -3,14 +3,14 @@ import createFetchMock from 'vitest-fetch-mock'
|
|
|
3
3
|
import { vi } from 'vitest'
|
|
4
4
|
import { Item } from '../../types/types.js'
|
|
5
5
|
import ServerDownloader from './serverDownloader.js'
|
|
6
|
-
import
|
|
6
|
+
import AsyncGeneratorQueue from '../../queues/asyncGeneratorQueue.js'
|
|
7
7
|
|
|
8
8
|
describe('downloader', () => {
|
|
9
9
|
test('download batch of one', async () => {
|
|
10
10
|
const fetchMocker = createFetchMock(vi)
|
|
11
11
|
const i: Item = { baseId: 'id', base: { id: 'id', speckle_type: 'type' } }
|
|
12
12
|
fetchMocker.mockResponseOnce('id\t' + JSON.stringify(i.base) + '\n')
|
|
13
|
-
const
|
|
13
|
+
const gathered = new AsyncGeneratorQueue<Item>()
|
|
14
14
|
const downloader = new ServerDownloader({
|
|
15
15
|
serverUrl: 'http://speckle.test',
|
|
16
16
|
streamId: 'streamId',
|
|
@@ -18,12 +18,18 @@ describe('downloader', () => {
|
|
|
18
18
|
token: 'token',
|
|
19
19
|
fetch: fetchMocker
|
|
20
20
|
})
|
|
21
|
-
downloader.initializePool({
|
|
21
|
+
downloader.initializePool({
|
|
22
|
+
results: gathered,
|
|
23
|
+
total: 1,
|
|
24
|
+
maxDownloadBatchWait: 200
|
|
25
|
+
})
|
|
22
26
|
downloader.add('id')
|
|
23
|
-
await downloader.disposeAsync()
|
|
24
27
|
const r = []
|
|
25
|
-
for await (const x of
|
|
28
|
+
for await (const x of gathered.consume()) {
|
|
26
29
|
r.push(x)
|
|
30
|
+
if (r.length >= 1) {
|
|
31
|
+
break
|
|
32
|
+
}
|
|
27
33
|
}
|
|
28
34
|
|
|
29
35
|
expect(r).toMatchSnapshot()
|
|
@@ -38,7 +44,7 @@ describe('downloader', () => {
|
|
|
38
44
|
'id1\t' + JSON.stringify(i1.base) + '\nid2\t' + JSON.stringify(i2.base) + '\n'
|
|
39
45
|
)
|
|
40
46
|
|
|
41
|
-
const
|
|
47
|
+
const gathered = new AsyncGeneratorQueue<Item>()
|
|
42
48
|
const downloader = new ServerDownloader({
|
|
43
49
|
serverUrl: 'http://speckle.test',
|
|
44
50
|
streamId: 'streamId',
|
|
@@ -47,13 +53,20 @@ describe('downloader', () => {
|
|
|
47
53
|
|
|
48
54
|
fetch: fetchMocker
|
|
49
55
|
})
|
|
50
|
-
downloader.initializePool({
|
|
56
|
+
downloader.initializePool({
|
|
57
|
+
results: gathered,
|
|
58
|
+
total: 2,
|
|
59
|
+
maxDownloadBatchWait: 200
|
|
60
|
+
})
|
|
51
61
|
downloader.add('id1')
|
|
52
62
|
downloader.add('id2')
|
|
53
63
|
await downloader.disposeAsync()
|
|
54
64
|
const r = []
|
|
55
|
-
for await (const x of
|
|
65
|
+
for await (const x of gathered.consume()) {
|
|
56
66
|
r.push(x)
|
|
67
|
+
if (r.length >= 2) {
|
|
68
|
+
break
|
|
69
|
+
}
|
|
57
70
|
}
|
|
58
71
|
|
|
59
72
|
expect(r).toMatchSnapshot()
|
|
@@ -75,7 +88,7 @@ describe('downloader', () => {
|
|
|
75
88
|
'\n'
|
|
76
89
|
)
|
|
77
90
|
|
|
78
|
-
const
|
|
91
|
+
const gathered = new AsyncGeneratorQueue<Item>()
|
|
79
92
|
const downloader = new ServerDownloader({
|
|
80
93
|
serverUrl: 'http://speckle.test',
|
|
81
94
|
streamId: 'streamId',
|
|
@@ -84,20 +97,98 @@ describe('downloader', () => {
|
|
|
84
97
|
|
|
85
98
|
fetch: fetchMocker
|
|
86
99
|
})
|
|
87
|
-
downloader.initializePool({
|
|
100
|
+
downloader.initializePool({
|
|
101
|
+
results: gathered,
|
|
102
|
+
total: 3,
|
|
103
|
+
maxDownloadBatchWait: 200
|
|
104
|
+
})
|
|
88
105
|
downloader.add('id1')
|
|
89
106
|
downloader.add('id2')
|
|
90
107
|
downloader.add('id3')
|
|
91
108
|
await downloader.disposeAsync()
|
|
92
109
|
const r = []
|
|
93
|
-
for await (const x of
|
|
110
|
+
for await (const x of gathered.consume()) {
|
|
94
111
|
r.push(x)
|
|
112
|
+
if (r.length >= 3) {
|
|
113
|
+
break
|
|
114
|
+
}
|
|
95
115
|
}
|
|
96
116
|
|
|
97
117
|
expect(r).toMatchSnapshot()
|
|
98
118
|
await downloader.disposeAsync()
|
|
99
119
|
})
|
|
100
120
|
|
|
121
|
+
test('download batch of three with Objects.Other.RawEncoding', async () => {
|
|
122
|
+
const fetchMocker = createFetchMock(vi)
|
|
123
|
+
const i1: Item = { baseId: 'id1', base: { id: 'id1', speckle_type: 'type' } }
|
|
124
|
+
const i2: Item = {
|
|
125
|
+
baseId: 'id2',
|
|
126
|
+
base: { id: 'id2', speckle_type: 'Objects.Other.RawEncoding' }
|
|
127
|
+
}
|
|
128
|
+
const i3: Item = { baseId: 'id3', base: { id: 'id3', speckle_type: 'type' } }
|
|
129
|
+
fetchMocker.mockResponseOnce(
|
|
130
|
+
'id1\t' +
|
|
131
|
+
JSON.stringify(i1.base) +
|
|
132
|
+
'\nid2\t' +
|
|
133
|
+
JSON.stringify(i2.base) +
|
|
134
|
+
'\nid3\t' +
|
|
135
|
+
JSON.stringify(i3.base) +
|
|
136
|
+
'\n'
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
const gathered = new AsyncGeneratorQueue<Item>()
|
|
140
|
+
const downloader = new ServerDownloader({
|
|
141
|
+
serverUrl: 'http://speckle.test',
|
|
142
|
+
streamId: 'streamId',
|
|
143
|
+
objectId: 'objectId',
|
|
144
|
+
token: 'token',
|
|
145
|
+
|
|
146
|
+
fetch: fetchMocker
|
|
147
|
+
})
|
|
148
|
+
downloader.initializePool({
|
|
149
|
+
results: gathered,
|
|
150
|
+
total: 3,
|
|
151
|
+
maxDownloadBatchWait: 200
|
|
152
|
+
})
|
|
153
|
+
downloader.add('id1')
|
|
154
|
+
downloader.add('id2')
|
|
155
|
+
downloader.add('id3')
|
|
156
|
+
await downloader.disposeAsync()
|
|
157
|
+
const r = []
|
|
158
|
+
for await (const x of gathered.consume()) {
|
|
159
|
+
r.push(x)
|
|
160
|
+
if (r.length >= 3) {
|
|
161
|
+
break
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
expect(r).toMatchSnapshot()
|
|
166
|
+
await downloader.disposeAsync()
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
test("download Objects.Other.RawEncoding doesn't exist", async () => {
|
|
170
|
+
const fetchMocker = createFetchMock(vi)
|
|
171
|
+
const i: Item = {
|
|
172
|
+
baseId: 'id',
|
|
173
|
+
base: {
|
|
174
|
+
id: 'id',
|
|
175
|
+
speckle_type: 'Objects.Other.RawEncoding',
|
|
176
|
+
__closure: { childIds: 1 }
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
fetchMocker.mockResponseOnce(JSON.stringify(i.base))
|
|
180
|
+
const downloader = new ServerDownloader({
|
|
181
|
+
serverUrl: 'http://speckle.test',
|
|
182
|
+
streamId: 'streamId',
|
|
183
|
+
objectId: i.baseId,
|
|
184
|
+
token: 'token',
|
|
185
|
+
|
|
186
|
+
fetch: fetchMocker
|
|
187
|
+
})
|
|
188
|
+
await expect(downloader.downloadSingle()).rejects.toThrow()
|
|
189
|
+
await downloader.disposeAsync()
|
|
190
|
+
})
|
|
191
|
+
|
|
101
192
|
test('download single exists', async () => {
|
|
102
193
|
const fetchMocker = createFetchMock(vi)
|
|
103
194
|
const i: Item = {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import BatchedPool from '../../
|
|
2
|
-
import Queue from '../../
|
|
1
|
+
import BatchedPool from '../../queues/batchedPool.js'
|
|
2
|
+
import Queue from '../../queues/queue.js'
|
|
3
3
|
import { ObjectLoaderRuntimeError } from '../../types/errors.js'
|
|
4
|
-
import { Fetcher,
|
|
4
|
+
import { Fetcher, indexOf, isBase, take } from '../../types/functions.js'
|
|
5
|
+
import { Item } from '../../types/types.js'
|
|
5
6
|
import { Downloader } from '../interfaces.js'
|
|
6
7
|
|
|
7
8
|
export interface ServerDownloaderOptions {
|
|
@@ -13,6 +14,8 @@ export interface ServerDownloaderOptions {
|
|
|
13
14
|
fetch?: Fetcher
|
|
14
15
|
}
|
|
15
16
|
|
|
17
|
+
const MAX_SAFARI_DECODE_BYTES = 2 * 1024 * 1024 * 1024 - 1024 * 1024 // 2GB minus a margin
|
|
18
|
+
|
|
16
19
|
export default class ServerDownloader implements Downloader {
|
|
17
20
|
#requestUrlRootObj: string
|
|
18
21
|
#requestUrlChildren: string
|
|
@@ -20,9 +23,14 @@ export default class ServerDownloader implements Downloader {
|
|
|
20
23
|
#options: ServerDownloaderOptions
|
|
21
24
|
#fetch: Fetcher
|
|
22
25
|
#results?: Queue<Item>
|
|
26
|
+
#total?: number
|
|
23
27
|
|
|
24
28
|
#downloadQueue?: BatchedPool<string>
|
|
25
|
-
#decoder = new TextDecoder()
|
|
29
|
+
#decoder = new TextDecoder('utf-8', { fatal: true })
|
|
30
|
+
#decodedBytesCount = 0
|
|
31
|
+
|
|
32
|
+
#rawString: string = 'Objects.Other.RawEncoding'
|
|
33
|
+
#rawEncoding: Uint8Array
|
|
26
34
|
|
|
27
35
|
constructor(options: ServerDownloaderOptions) {
|
|
28
36
|
this.#options = options
|
|
@@ -46,6 +54,9 @@ export default class ServerDownloader implements Downloader {
|
|
|
46
54
|
this.#requestUrlRootObj = `${this.#options.serverUrl}/objects/${
|
|
47
55
|
this.#options.streamId
|
|
48
56
|
}/${this.#options.objectId}/single`
|
|
57
|
+
|
|
58
|
+
const encoder = new TextEncoder()
|
|
59
|
+
this.#rawEncoding = encoder.encode(this.#rawString)
|
|
49
60
|
}
|
|
50
61
|
|
|
51
62
|
#getDownloadCountAndSizes(total: number): number[] {
|
|
@@ -53,7 +64,7 @@ export default class ServerDownloader implements Downloader {
|
|
|
53
64
|
return [total]
|
|
54
65
|
}
|
|
55
66
|
|
|
56
|
-
return [10000,
|
|
67
|
+
return [10000, 25000, 10000, 1000]
|
|
57
68
|
}
|
|
58
69
|
|
|
59
70
|
initializePool(params: {
|
|
@@ -63,6 +74,7 @@ export default class ServerDownloader implements Downloader {
|
|
|
63
74
|
}): void {
|
|
64
75
|
const { results, total } = params
|
|
65
76
|
this.#results = results
|
|
77
|
+
this.#total = total
|
|
66
78
|
this.#downloadQueue = new BatchedPool<string>({
|
|
67
79
|
concurrencyAndSizes: this.#getDownloadCountAndSizes(total),
|
|
68
80
|
maxWaitTime: params.maxDownloadBatchWait,
|
|
@@ -86,22 +98,26 @@ export default class ServerDownloader implements Downloader {
|
|
|
86
98
|
this.#getPool().add(id)
|
|
87
99
|
}
|
|
88
100
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
101
|
+
/*
|
|
102
|
+
This is the most frequently reported and confirmed reason for this error in Safari. There's a known bug in WebKit (Safari's rendering engine) where TextDecoder can fail or throw a RangeError after decoding around 2GB of data. Chrome and other browsers handle much larger amounts of data without this specific limitation.
|
|
92
103
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
} else {
|
|
103
|
-
throw new ObjectLoaderRuntimeError(`${baseId} is not a base`)
|
|
104
|
+
Why it happens: It seems to be an internal memory or indexing limitation within Safari's TextDecoder implementation. After a certain threshold of data has been processed by a TextDecoder instance, it starts throwing this error.
|
|
105
|
+
|
|
106
|
+
Chrome's behavior: Chrome generally handles larger data sizes without this specific RangeError. It might become slow or run out of general memory, but not typically with this specific error.
|
|
107
|
+
*/
|
|
108
|
+
decodeChunk(chunkBuffer: Uint8Array): string {
|
|
109
|
+
if (this.#decodedBytesCount + chunkBuffer.byteLength > MAX_SAFARI_DECODE_BYTES) {
|
|
110
|
+
// Safari is approaching its limit, create a new decoder
|
|
111
|
+
this.#decoder = new TextDecoder('utf-8', { fatal: true })
|
|
112
|
+
this.#decodedBytesCount = 0 // Reset counter for the new decoder
|
|
104
113
|
}
|
|
114
|
+
const decodedText = this.#decoder.decode(chunkBuffer)
|
|
115
|
+
this.#decodedBytesCount += chunkBuffer.byteLength
|
|
116
|
+
return decodedText
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async disposeAsync(): Promise<void> {
|
|
120
|
+
await this.#downloadQueue?.disposeAsync()
|
|
105
121
|
}
|
|
106
122
|
|
|
107
123
|
async downloadBatch(params: {
|
|
@@ -130,7 +146,7 @@ export default class ServerDownloader implements Downloader {
|
|
|
130
146
|
const { done, value } = await reader.read()
|
|
131
147
|
if (done) break
|
|
132
148
|
|
|
133
|
-
leftover = await this
|
|
149
|
+
leftover = await this.#processArray(leftover, value, keys, async () => {
|
|
134
150
|
count++
|
|
135
151
|
if (count % 1000 === 0) {
|
|
136
152
|
await new Promise((resolve) => setTimeout(resolve, 100)) //allow other stuff to happen
|
|
@@ -142,16 +158,20 @@ export default class ServerDownloader implements Downloader {
|
|
|
142
158
|
'Items requested were not downloaded: ' + take(keys.values(), 10).join(',')
|
|
143
159
|
)
|
|
144
160
|
}
|
|
161
|
+
count += keys.size // count the leftovers
|
|
162
|
+
if (count >= this.#total!) {
|
|
163
|
+
await this.#results?.disposeAsync() // mark the queue as done
|
|
164
|
+
}
|
|
145
165
|
}
|
|
146
166
|
|
|
147
|
-
async processArray(
|
|
167
|
+
async #processArray(
|
|
148
168
|
leftover: Uint8Array,
|
|
149
169
|
value: Uint8Array,
|
|
150
170
|
keys: Set<string>,
|
|
151
171
|
callback: () => Promise<void>
|
|
152
172
|
): Promise<Uint8Array> {
|
|
153
173
|
//this concat will allocate a new array
|
|
154
|
-
const combined = this
|
|
174
|
+
const combined = this.#concatUint8Arrays(leftover, value)
|
|
155
175
|
let start = 0
|
|
156
176
|
|
|
157
177
|
//subarray doesn't allocate
|
|
@@ -159,34 +179,65 @@ export default class ServerDownloader implements Downloader {
|
|
|
159
179
|
if (combined[i] === 0x0a) {
|
|
160
180
|
const line = combined.subarray(start, i) // line without \n
|
|
161
181
|
//strings are allocated here
|
|
162
|
-
const item = this
|
|
163
|
-
this.#results?.add(item)
|
|
182
|
+
const item = this.#processLine(line)
|
|
164
183
|
start = i + 1
|
|
165
184
|
await callback()
|
|
166
185
|
keys.delete(item.baseId)
|
|
186
|
+
this.#results?.add(item)
|
|
167
187
|
}
|
|
168
188
|
}
|
|
169
189
|
return combined.subarray(start) // carry over remainder
|
|
170
190
|
}
|
|
171
191
|
|
|
172
|
-
processLine(line: Uint8Array): Item {
|
|
192
|
+
#processLine(line: Uint8Array): Item {
|
|
173
193
|
for (let i = 0; i < line.length; i++) {
|
|
174
194
|
if (line[i] === 0x09) {
|
|
175
195
|
//this is a tab
|
|
176
|
-
const baseId = this
|
|
177
|
-
const
|
|
178
|
-
|
|
196
|
+
const baseId = this.decodeChunk(line.subarray(0, i))
|
|
197
|
+
const jsonBytes = line.subarray(i + 1)
|
|
198
|
+
|
|
199
|
+
if (!this.#isValidBytes(jsonBytes)) {
|
|
200
|
+
return { baseId, base: undefined }
|
|
201
|
+
}
|
|
202
|
+
const base = this.decodeChunk(jsonBytes)
|
|
179
203
|
const item = this.#processJson(baseId, base)
|
|
180
|
-
item.size =
|
|
204
|
+
item.size = jsonBytes.length
|
|
181
205
|
return item
|
|
182
206
|
}
|
|
183
207
|
}
|
|
184
208
|
throw new ObjectLoaderRuntimeError(
|
|
185
|
-
'Invalid line format: ' + this
|
|
209
|
+
'Invalid line format in response: ' + this.decodeChunk(line)
|
|
186
210
|
)
|
|
187
211
|
}
|
|
188
212
|
|
|
189
|
-
|
|
213
|
+
#processJson(baseId: string, unparsedBase: string): Item {
|
|
214
|
+
let base: unknown
|
|
215
|
+
try {
|
|
216
|
+
base = JSON.parse(unparsedBase)
|
|
217
|
+
} catch (e: unknown) {
|
|
218
|
+
throw new Error(`Error parsing object ${baseId}: ${(e as Error).message}`)
|
|
219
|
+
}
|
|
220
|
+
if (isBase(base)) {
|
|
221
|
+
return { baseId, base }
|
|
222
|
+
} else {
|
|
223
|
+
throw new ObjectLoaderRuntimeError(`${baseId} is not a base`)
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
#isValidString(json: string): boolean {
|
|
227
|
+
if (!json.includes(this.#rawString)) {
|
|
228
|
+
return true
|
|
229
|
+
}
|
|
230
|
+
return false
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
#isValidBytes(json: Uint8Array): boolean {
|
|
234
|
+
if (indexOf(json, this.#rawEncoding) === -1) {
|
|
235
|
+
return true
|
|
236
|
+
}
|
|
237
|
+
return false
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
#concatUint8Arrays(a: Uint8Array, b: Uint8Array): Uint8Array {
|
|
190
241
|
const c = new Uint8Array(a.length + b.length)
|
|
191
242
|
c.set(a, 0)
|
|
192
243
|
c.set(b, a.length)
|
|
@@ -199,7 +250,13 @@ export default class ServerDownloader implements Downloader {
|
|
|
199
250
|
})
|
|
200
251
|
this.#validateResponse(response)
|
|
201
252
|
const responseText = await response.text()
|
|
253
|
+
if (!this.#isValidString(responseText)) {
|
|
254
|
+
throw new ObjectLoaderRuntimeError('Invalid base object')
|
|
255
|
+
}
|
|
202
256
|
const item = this.#processJson(this.#options.objectId, responseText)
|
|
257
|
+
if (!item.base) {
|
|
258
|
+
throw new ObjectLoaderRuntimeError('Invalid base object')
|
|
259
|
+
}
|
|
203
260
|
item.size = 0
|
|
204
261
|
return item
|
|
205
262
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isScalar, isBase, isReference } from '../types/functions.js'
|
|
2
|
+
import { Base, DataChunk } from '../types/types.js'
|
|
2
3
|
import { ObjectLoader2 } from './objectLoader2.js'
|
|
3
4
|
|
|
4
5
|
export type ProgressStage = 'download' | 'construction'
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
2
|
+
import { MemoryCache, MemoryCacheItem, MemoryCacheOptions } from './MemoryCache.js'
|
|
3
|
+
import { Item, Base } from '../types/types.js'
|
|
4
|
+
import { CustomLogger } from '../types/functions.js'
|
|
5
|
+
|
|
6
|
+
const logger: CustomLogger = () => {
|
|
7
|
+
// console.log(message, ...optionalParams)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const defaultOptions: MemoryCacheOptions = {
|
|
11
|
+
maxSizeInMb: 10,
|
|
12
|
+
ttlms: 1000
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const createItem = (id: string, size: number, referencedIds: string[] = []): Item => {
|
|
16
|
+
const base: Base & { data?: unknown } = {
|
|
17
|
+
id,
|
|
18
|
+
// eslint-disable-next-line camelcase
|
|
19
|
+
speckle_type: 'Base'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (referencedIds.length > 0) {
|
|
23
|
+
base.data = referencedIds.map((referencedId) => ({
|
|
24
|
+
// eslint-disable-next-line camelcase
|
|
25
|
+
speckle_type: 'reference',
|
|
26
|
+
referencedId
|
|
27
|
+
}))
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
baseId: id,
|
|
32
|
+
base,
|
|
33
|
+
size
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
describe('MemoryCacheItem', () => {
|
|
38
|
+
it('should correctly determine if it is expired', () => {
|
|
39
|
+
const item = createItem('1', 100)
|
|
40
|
+
const now = Date.now()
|
|
41
|
+
const cacheItem = new MemoryCacheItem(item, now + 1000)
|
|
42
|
+
expect(cacheItem.isExpired(now + 500)).toBe(false)
|
|
43
|
+
expect(cacheItem.isExpired(now + 1500)).toBe(true)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('should update its access time', () => {
|
|
47
|
+
const item = createItem('1', 100)
|
|
48
|
+
const now = Date.now()
|
|
49
|
+
const cacheItem = new MemoryCacheItem(item, now + 1000)
|
|
50
|
+
cacheItem.setAccess(now + 500, 1000)
|
|
51
|
+
expect(cacheItem.isExpired(now + 1000)).toBe(false)
|
|
52
|
+
expect(cacheItem.isExpired(now + 1600)).toBe(true)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should return the correct item', () => {
|
|
56
|
+
const item = createItem('1', 100)
|
|
57
|
+
const cacheItem = new MemoryCacheItem(item, Date.now() + 1000)
|
|
58
|
+
expect(cacheItem.getItem()).toEqual(item)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('should be done if expired', () => {
|
|
62
|
+
const item = createItem('1', 100)
|
|
63
|
+
const now = Date.now()
|
|
64
|
+
const cacheItem = new MemoryCacheItem(item, now + 1000)
|
|
65
|
+
expect(cacheItem.done(now + 1500)).toBe(true)
|
|
66
|
+
expect(cacheItem.done(now + 500)).toBe(false)
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
describe('MemoryCache', () => {
|
|
71
|
+
beforeEach(() => {
|
|
72
|
+
vi.useFakeTimers()
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
afterEach(() => {
|
|
76
|
+
vi.useRealTimers()
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('should add and get an item', () => {
|
|
80
|
+
const cache = new MemoryCache(defaultOptions, logger)
|
|
81
|
+
const item = createItem('1', 100)
|
|
82
|
+
const requestItem = vi.fn()
|
|
83
|
+
|
|
84
|
+
cache.add(item, requestItem)
|
|
85
|
+
const retrieved = cache.get('1')
|
|
86
|
+
|
|
87
|
+
expect(retrieved).toEqual(item)
|
|
88
|
+
expect(requestItem).not.toHaveBeenCalled()
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('should update expiry on get', () => {
|
|
92
|
+
const cache = new MemoryCache({ ...defaultOptions, ttlms: 100 }, logger)
|
|
93
|
+
const item = createItem('1', 100)
|
|
94
|
+
cache.add(item, vi.fn())
|
|
95
|
+
|
|
96
|
+
vi.advanceTimersByTime(50)
|
|
97
|
+
const retrieved = cache.get('1')
|
|
98
|
+
expect(retrieved).toBeDefined()
|
|
99
|
+
|
|
100
|
+
vi.advanceTimersByTime(80)
|
|
101
|
+
const retrievedAgain = cache.get('1')
|
|
102
|
+
expect(retrievedAgain).toBeDefined()
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
it('should return undefined for non-existent item', () => {
|
|
106
|
+
const cache = new MemoryCache(defaultOptions, logger)
|
|
107
|
+
expect(cache.get('non-existent')).toBeUndefined()
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
it('should scan for references and request missing ones', () => {
|
|
111
|
+
const cache = new MemoryCache(defaultOptions, logger)
|
|
112
|
+
const requestItem = vi.fn()
|
|
113
|
+
const item = createItem('1', 100, ['2', '3'])
|
|
114
|
+
|
|
115
|
+
cache.add(createItem('3', 50), vi.fn()) // pre-cache one of the references
|
|
116
|
+
cache.scanForReferences(item.base, requestItem)
|
|
117
|
+
|
|
118
|
+
expect(requestItem).toHaveBeenCalledTimes(1)
|
|
119
|
+
expect(requestItem).toHaveBeenCalledWith('2')
|
|
120
|
+
expect(requestItem).not.toHaveBeenCalledWith('3')
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
it('should clean up expired items when size exceeds max', () => {
|
|
124
|
+
const options = { maxSizeInMb: 0, ttlms: 100 } // 100 bytes
|
|
125
|
+
const cache = new MemoryCache(options, logger)
|
|
126
|
+
const requestItem = vi.fn()
|
|
127
|
+
|
|
128
|
+
const item1 = createItem('1', 60)
|
|
129
|
+
const item2 = createItem('2', 60)
|
|
130
|
+
|
|
131
|
+
const now = 1
|
|
132
|
+
cache.add(item1, requestItem, now - 200)
|
|
133
|
+
cache.cleanCache(now)
|
|
134
|
+
cache.add(item2, requestItem, now + 100)
|
|
135
|
+
|
|
136
|
+
expect(cache.get('1')).toBeUndefined()
|
|
137
|
+
expect(cache.get('2')).toBeDefined()
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
it('should not clean up expired items if they have references', () => {
|
|
141
|
+
const options = { maxSizeInMb: 0.0001, ttlms: 100 } // 100 bytes
|
|
142
|
+
const cache = new MemoryCache(options, logger)
|
|
143
|
+
const requestItem = vi.fn()
|
|
144
|
+
|
|
145
|
+
const item1 = createItem('1', 60)
|
|
146
|
+
const item2 = createItem('2', 60, ['1'])
|
|
147
|
+
|
|
148
|
+
cache.add(item1, requestItem)
|
|
149
|
+
vi.advanceTimersByTime(110) // item1 expires
|
|
150
|
+
cache.add(item2, requestItem) // item2 adds a reference to item1
|
|
151
|
+
|
|
152
|
+
vi.advanceTimersByTime(100)
|
|
153
|
+
|
|
154
|
+
expect(cache.get('1')).toBeDefined()
|
|
155
|
+
expect(cache.get('2')).toBeDefined()
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
it('compareMaybeBasesByReferences should sort correctly', () => {
|
|
159
|
+
const cache = new MemoryCache(defaultOptions, logger)
|
|
160
|
+
const requestItem = vi.fn()
|
|
161
|
+
|
|
162
|
+
const item1 = createItem('1', 10)
|
|
163
|
+
const item2 = createItem('2', 10)
|
|
164
|
+
const item3 = createItem('3', 10, ['1', '2'])
|
|
165
|
+
const item4 = createItem('4', 10, ['2'])
|
|
166
|
+
|
|
167
|
+
cache.add(item1, requestItem)
|
|
168
|
+
cache.add(item2, requestItem)
|
|
169
|
+
cache.add(item3, requestItem)
|
|
170
|
+
cache.add(item4, requestItem)
|
|
171
|
+
|
|
172
|
+
expect(cache.compareMaybeBasesByReferences('1', '2')).toBe(-1)
|
|
173
|
+
expect(cache.compareMaybeBasesByReferences('2', '1')).toBe(1)
|
|
174
|
+
expect(cache.compareMaybeBasesByReferences('1', '1')).toBe(0)
|
|
175
|
+
expect(cache.compareMaybeBasesByReferences('1', '5')).toBe(1)
|
|
176
|
+
expect(cache.compareMaybeBasesByReferences('5', '1')).toBe(-1)
|
|
177
|
+
expect(cache.compareMaybeBasesByReferences('5', '6')).toBe(0)
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
it('should throw when used after dispose', () => {
|
|
181
|
+
const cache = new MemoryCache(defaultOptions, logger)
|
|
182
|
+
cache.dispose()
|
|
183
|
+
const item = createItem('1', 100)
|
|
184
|
+
expect(() => cache.add(item, vi.fn())).toThrow('MemoryCache is disposed')
|
|
185
|
+
expect(() => cache.get('1')).toThrow('MemoryCache is disposed')
|
|
186
|
+
})
|
|
187
|
+
})
|