@synchronized-console/objectloader2 2.25.7 → 2.31.14
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 +5 -7
- package/dist/commonjs/core/interfaces.d.ts.map +1 -0
- package/dist/commonjs/core/interfaces.js.map +1 -0
- package/dist/commonjs/{operations → core}/objectLoader2.d.ts +1 -1
- package/dist/commonjs/core/objectLoader2.d.ts.map +1 -0
- package/dist/commonjs/core/objectLoader2.js +120 -0
- package/dist/commonjs/core/objectLoader2.js.map +1 -0
- package/dist/{esm/operations → commonjs/core}/objectLoader2Factory.d.ts +10 -2
- package/dist/commonjs/core/objectLoader2Factory.d.ts.map +1 -0
- package/dist/commonjs/core/objectLoader2Factory.js +86 -0
- package/dist/commonjs/core/objectLoader2Factory.js.map +1 -0
- package/dist/commonjs/core/objectLoader2Factory.test.d.ts +2 -0
- package/dist/commonjs/core/objectLoader2Factory.test.d.ts.map +1 -0
- package/dist/commonjs/core/objectLoader2Factory.test.js +106 -0
- package/dist/commonjs/core/objectLoader2Factory.test.js.map +1 -0
- package/dist/{esm/operations → commonjs/core}/options.d.ts +4 -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/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/core/stages/indexedDatabase.d.ts +34 -0
- package/dist/commonjs/core/stages/indexedDatabase.d.ts.map +1 -0
- package/dist/commonjs/core/stages/indexedDatabase.js +150 -0
- package/dist/commonjs/core/stages/indexedDatabase.js.map +1 -0
- package/dist/commonjs/core/stages/memory/memoryDatabase.d.ts +11 -0
- package/dist/commonjs/core/stages/memory/memoryDatabase.d.ts.map +1 -0
- package/dist/commonjs/{operations/databases → core/stages/memory}/memoryDatabase.js +6 -3
- package/dist/commonjs/core/stages/memory/memoryDatabase.js.map +1 -0
- package/dist/commonjs/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +4 -4
- 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 +8 -6
- package/dist/commonjs/core/stages/serverDownloader.d.ts.map +1 -0
- package/dist/commonjs/{operations/downloaders → core/stages}/serverDownloader.js +99 -50
- 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 +32 -0
- package/dist/commonjs/deferment/defermentManager.d.ts.map +1 -0
- package/dist/commonjs/deferment/defermentManager.js +85 -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 +193 -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 +4 -2
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +6 -3
- 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/commonjs/{helpers → 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 +62 -0
- package/dist/commonjs/queues/batchingQueue.dispose.test.js.map +1 -0
- package/dist/commonjs/queues/batchingQueue.js +128 -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 +236 -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/keyedQueue.test.d.ts +2 -0
- package/dist/commonjs/queues/keyedQueue.test.d.ts.map +1 -0
- package/dist/commonjs/queues/keyedQueue.test.js +118 -0
- package/dist/commonjs/queues/keyedQueue.test.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 +6 -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 +5 -7
- package/dist/esm/core/interfaces.d.ts.map +1 -0
- package/dist/esm/core/interfaces.js.map +1 -0
- package/dist/esm/{operations → core}/objectLoader2.d.ts +1 -1
- package/dist/esm/core/objectLoader2.d.ts.map +1 -0
- package/dist/esm/core/objectLoader2.js +113 -0
- package/dist/esm/core/objectLoader2.js.map +1 -0
- package/dist/{commonjs/operations → esm/core}/objectLoader2Factory.d.ts +10 -2
- package/dist/esm/core/objectLoader2Factory.d.ts.map +1 -0
- package/dist/esm/core/objectLoader2Factory.js +79 -0
- package/dist/esm/core/objectLoader2Factory.js.map +1 -0
- package/dist/esm/core/objectLoader2Factory.test.d.ts +2 -0
- package/dist/esm/core/objectLoader2Factory.test.d.ts.map +1 -0
- package/dist/esm/core/objectLoader2Factory.test.js +104 -0
- package/dist/esm/core/objectLoader2Factory.test.js.map +1 -0
- package/dist/{commonjs/operations → esm/core}/options.d.ts +4 -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/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/core/stages/indexedDatabase.d.ts +34 -0
- package/dist/esm/core/stages/indexedDatabase.d.ts.map +1 -0
- package/dist/esm/core/stages/indexedDatabase.js +146 -0
- package/dist/esm/core/stages/indexedDatabase.js.map +1 -0
- package/dist/esm/core/stages/memory/memoryDatabase.d.ts +11 -0
- package/dist/esm/core/stages/memory/memoryDatabase.d.ts.map +1 -0
- package/dist/esm/{operations/databases → core/stages/memory}/memoryDatabase.js +6 -3
- package/dist/esm/core/stages/memory/memoryDatabase.js.map +1 -0
- package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +4 -4
- 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 +8 -6
- package/dist/esm/core/stages/serverDownloader.d.ts.map +1 -0
- package/dist/esm/{operations/downloaders → core/stages}/serverDownloader.js +98 -49
- 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 +32 -0
- package/dist/esm/deferment/defermentManager.d.ts.map +1 -0
- package/dist/esm/deferment/defermentManager.js +80 -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 +191 -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 +4 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -2
- 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/esm/{helpers → 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 +57 -0
- package/dist/esm/queues/batchingQueue.dispose.test.js.map +1 -0
- package/dist/esm/queues/batchingQueue.js +122 -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 +231 -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/keyedQueue.test.d.ts +2 -0
- package/dist/esm/queues/keyedQueue.test.d.ts.map +1 -0
- package/dist/esm/queues/keyedQueue.test.js +113 -0
- package/dist/esm/queues/keyedQueue.test.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 +6 -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 +5 -3
- package/src/{operations → core}/interfaces.ts +5 -5
- package/src/{operations → core}/objectLoader2.spec.ts +31 -11
- package/src/core/objectLoader2.ts +152 -0
- package/src/core/objectLoader2Factory.test.ts +135 -0
- package/src/core/objectLoader2Factory.ts +113 -0
- package/src/{operations → core}/options.ts +4 -1
- package/src/{operations/databases → core/stages}/__snapshots__/indexedDatabase.spec.ts.snap +4 -4
- 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/{operations/databases → core/stages}/indexedDatabase.spec.ts +12 -8
- package/src/core/stages/indexedDatabase.ts +178 -0
- package/src/{operations/databases → core/stages/memory}/memoryDatabase.spec.ts +7 -7
- package/src/{operations/databases → core/stages/memory}/memoryDatabase.ts +9 -6
- package/src/{operations/downloaders → core/stages/memory}/memoryDownloader.spec.ts +5 -5
- package/src/{operations/downloaders → core/stages/memory}/memoryDownloader.ts +4 -4
- package/src/core/stages/serverDownloader.spec.ts +382 -0
- package/src/{operations/downloaders → core/stages}/serverDownloader.ts +115 -52
- 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 +225 -0
- package/src/deferment/defermentManager.ts +95 -0
- package/src/deferment/deferredBase.ts +29 -0
- package/src/index.ts +4 -2
- package/src/{helpers → queues}/aggregateQueue.ts +5 -1
- package/src/{helpers → queues}/asyncGeneratorQueue.ts +2 -1
- package/src/queues/batchingQueue.dispose.test.ts +72 -0
- package/src/queues/batchingQueue.test.ts +270 -0
- package/src/queues/batchingQueue.ts +140 -0
- package/src/{helpers → queues}/bufferQueue.ts +3 -0
- package/src/queues/keyedQueue.test.ts +146 -0
- package/src/{helpers → queues}/keyedQueue.ts +12 -0
- package/src/{helpers → queues}/queue.ts +1 -0
- package/src/test/e2e.spec.ts +2 -2
- package/src/types/functions.spec.ts +155 -0
- package/src/types/functions.ts +116 -0
- package/src/types/types.ts +5 -50
- 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 +0 -12
- package/dist/commonjs/helpers/batchedPool.d.ts.map +0 -1
- package/dist/commonjs/helpers/batchedPool.js +0 -45
- 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 -22
- package/dist/commonjs/helpers/cachePump.d.ts.map +0 -1
- package/dist/commonjs/helpers/cachePump.js +0 -86
- 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 -28
- package/dist/commonjs/helpers/defermentManager.d.ts.map +0 -1
- package/dist/commonjs/helpers/defermentManager.js +0 -150
- 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 +0 -27
- package/dist/commonjs/operations/databases/indexedDatabase.d.ts.map +0 -1
- package/dist/commonjs/operations/databases/indexedDatabase.js +0 -98
- package/dist/commonjs/operations/databases/indexedDatabase.js.map +0 -1
- package/dist/commonjs/operations/databases/memoryDatabase.d.ts +0 -13
- 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 -101
- package/dist/commonjs/operations/objectLoader2.js.map +0 -1
- package/dist/commonjs/operations/objectLoader2Factory.d.ts.map +0 -1
- package/dist/commonjs/operations/objectLoader2Factory.js +0 -68
- 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 +0 -12
- package/dist/esm/helpers/batchedPool.d.ts.map +0 -1
- package/dist/esm/helpers/batchedPool.js +0 -42
- 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 -22
- package/dist/esm/helpers/cachePump.d.ts.map +0 -1
- package/dist/esm/helpers/cachePump.js +0 -79
- 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 -28
- package/dist/esm/helpers/defermentManager.d.ts.map +0 -1
- package/dist/esm/helpers/defermentManager.js +0 -146
- 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 +0 -27
- package/dist/esm/operations/databases/indexedDatabase.d.ts.map +0 -1
- package/dist/esm/operations/databases/indexedDatabase.js +0 -93
- package/dist/esm/operations/databases/indexedDatabase.js.map +0 -1
- package/dist/esm/operations/databases/memoryDatabase.d.ts +0 -13
- 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 -94
- package/dist/esm/operations/objectLoader2.js.map +0 -1
- package/dist/esm/operations/objectLoader2Factory.d.ts.map +0 -1
- package/dist/esm/operations/objectLoader2Factory.js +0 -61
- 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/batchedPool.ts +0 -56
- package/src/helpers/batchingQueue.ts +0 -85
- package/src/helpers/cachePump.disposal.spec.ts +0 -51
- package/src/helpers/cachePump.spec.ts +0 -104
- package/src/helpers/cachePump.ts +0 -107
- package/src/helpers/cacheReader.ts +0 -64
- package/src/helpers/defermentManager.defermentTotals.spec.ts +0 -53
- package/src/helpers/defermentManager.disposal.spec.ts +0 -28
- package/src/helpers/defermentManager.spec.ts +0 -37
- package/src/helpers/defermentManager.ts +0 -160
- 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/indexedDatabase.ts +0 -126
- package/src/operations/downloaders/serverDownloader.spec.ts +0 -161
- package/src/operations/objectLoader2.ts +0 -119
- package/src/operations/objectLoader2Factory.ts +0 -78
- 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}/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}/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/downloaders → core/stages/memory}/__snapshots__/memoryDownloader.spec.ts.snap +0 -0
- package/src/{operations → core}/traverser.spec.ts +1 -1
|
@@ -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
|
+
synchronized_type: 'Base'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (referencedIds.length > 0) {
|
|
23
|
+
base.data = referencedIds.map((referencedId) => ({
|
|
24
|
+
// eslint-disable-next-line camelcase
|
|
25
|
+
synchronized_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
|
+
})
|
|
@@ -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,225 @@
|
|
|
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
|
+
dispose: vi.fn()
|
|
14
|
+
} as unknown as MemoryCache
|
|
15
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
16
|
+
expect(defermentManager).toBeDefined()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
describe('defer', () => {
|
|
20
|
+
it('should return a resolved promise if item is in cache', async () => {
|
|
21
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
22
|
+
const get = vi.fn()
|
|
23
|
+
const add = vi.fn()
|
|
24
|
+
const mockCache = {
|
|
25
|
+
get,
|
|
26
|
+
add
|
|
27
|
+
} as unknown as MemoryCache
|
|
28
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
29
|
+
|
|
30
|
+
const item: Item = {
|
|
31
|
+
// eslint-disable-next-line camelcase
|
|
32
|
+
base: { id: 'testId', synchronized_type: 'Base' },
|
|
33
|
+
baseId: 'testId'
|
|
34
|
+
}
|
|
35
|
+
get.mockReturnValue(item)
|
|
36
|
+
|
|
37
|
+
const [promise, wasInCache] = defermentManager.defer({ id: 'testId' })
|
|
38
|
+
const result = await promise
|
|
39
|
+
|
|
40
|
+
expect(wasInCache).toBe(true)
|
|
41
|
+
expect(result).toEqual(item.base)
|
|
42
|
+
expect(get).toHaveBeenCalledWith('testId')
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('should return the same promise if item is already outstanding', () => {
|
|
46
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
47
|
+
const get = vi.fn()
|
|
48
|
+
const add = vi.fn()
|
|
49
|
+
const mockCache = {
|
|
50
|
+
get,
|
|
51
|
+
add
|
|
52
|
+
} as unknown as MemoryCache
|
|
53
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
54
|
+
|
|
55
|
+
const [promise1, wasInCache1] = defermentManager.defer({ id: 'testId' })
|
|
56
|
+
const [promise2, wasInCache2] = defermentManager.defer({ id: 'testId' })
|
|
57
|
+
|
|
58
|
+
expect(wasInCache1).toBe(false)
|
|
59
|
+
expect(wasInCache2).toBe(true)
|
|
60
|
+
expect(promise1).toBe(promise2)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('should create a new deferred base if not in cache and not outstanding', () => {
|
|
64
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
65
|
+
const get = vi.fn()
|
|
66
|
+
const add = vi.fn()
|
|
67
|
+
const mockCache = {
|
|
68
|
+
get,
|
|
69
|
+
add
|
|
70
|
+
} as unknown as MemoryCache
|
|
71
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
72
|
+
|
|
73
|
+
const [promise, wasInCache] = defermentManager.defer({ id: 'testId' })
|
|
74
|
+
|
|
75
|
+
expect(wasInCache).toBe(false)
|
|
76
|
+
expect(promise).toBeInstanceOf(Promise)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('should throw if disposed', () => {
|
|
80
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
81
|
+
const get = vi.fn()
|
|
82
|
+
const add = vi.fn()
|
|
83
|
+
const mockCache = {
|
|
84
|
+
get,
|
|
85
|
+
add,
|
|
86
|
+
dispose: vi.fn()
|
|
87
|
+
} as unknown as MemoryCache
|
|
88
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
89
|
+
|
|
90
|
+
defermentManager.dispose()
|
|
91
|
+
expect(() => defermentManager.defer({ id: 'testId' })).toThrow(
|
|
92
|
+
'DefermentManager is disposed'
|
|
93
|
+
)
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
describe('undefer', () => {
|
|
98
|
+
it('should resolve the promise when an outstanding item is found', async () => {
|
|
99
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
100
|
+
const get = vi.fn()
|
|
101
|
+
const add = vi.fn()
|
|
102
|
+
const mockCache = {
|
|
103
|
+
get,
|
|
104
|
+
add
|
|
105
|
+
} as unknown as MemoryCache
|
|
106
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
107
|
+
const requestItem = vi.fn()
|
|
108
|
+
|
|
109
|
+
const [promise] = defermentManager.defer({ id: 'testId' })
|
|
110
|
+
|
|
111
|
+
const item: Item = {
|
|
112
|
+
// eslint-disable-next-line camelcase
|
|
113
|
+
base: { id: 'testId', synchronized_type: 'Base' },
|
|
114
|
+
baseId: 'testId'
|
|
115
|
+
}
|
|
116
|
+
defermentManager.undefer(item, requestItem)
|
|
117
|
+
|
|
118
|
+
const result = await promise
|
|
119
|
+
expect(result).toEqual(item.base)
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
it('should log an error if item has no base', () => {
|
|
123
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
124
|
+
const get = vi.fn()
|
|
125
|
+
const add = vi.fn()
|
|
126
|
+
const mockCache = {
|
|
127
|
+
get,
|
|
128
|
+
add
|
|
129
|
+
} as unknown as MemoryCache
|
|
130
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
131
|
+
const requestItem = vi.fn()
|
|
132
|
+
|
|
133
|
+
const item: Item = { baseId: 'testId' }
|
|
134
|
+
defermentManager.undefer(item, requestItem)
|
|
135
|
+
expect(mockLogger).toHaveBeenCalledWith('undefer called with no base', item)
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
it('should add to cache and request item if not outstanding', () => {
|
|
139
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
140
|
+
const get = vi.fn()
|
|
141
|
+
const add = vi.fn()
|
|
142
|
+
const mockCache = {
|
|
143
|
+
get,
|
|
144
|
+
add
|
|
145
|
+
} as unknown as MemoryCache
|
|
146
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
147
|
+
const requestItem = vi.fn()
|
|
148
|
+
|
|
149
|
+
const item: Item = {
|
|
150
|
+
// eslint-disable-next-line camelcase
|
|
151
|
+
base: { id: 'testId', synchronized_type: 'Base' },
|
|
152
|
+
baseId: 'testId'
|
|
153
|
+
}
|
|
154
|
+
add.mockImplementation((_item: Item, getDependencies?: (id: string) => void) => {
|
|
155
|
+
if (getDependencies) getDependencies('testId')
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
defermentManager.undefer(item, requestItem)
|
|
159
|
+
|
|
160
|
+
expect(add).toHaveBeenCalledWith(item, expect.any(Function))
|
|
161
|
+
expect(requestItem).toHaveBeenCalledWith('testId')
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
it('should throw if disposed', () => {
|
|
165
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
166
|
+
const get = vi.fn()
|
|
167
|
+
const add = vi.fn()
|
|
168
|
+
const mockCache = {
|
|
169
|
+
get,
|
|
170
|
+
add,
|
|
171
|
+
dispose: vi.fn()
|
|
172
|
+
} as unknown as MemoryCache
|
|
173
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
174
|
+
const requestItem = vi.fn()
|
|
175
|
+
|
|
176
|
+
defermentManager.dispose()
|
|
177
|
+
const item: Item = {
|
|
178
|
+
// eslint-disable-next-line camelcase
|
|
179
|
+
base: { id: 'testId', synchronized_type: 'Base' },
|
|
180
|
+
baseId: 'testId'
|
|
181
|
+
}
|
|
182
|
+
expect(() => defermentManager.undefer(item, requestItem)).toThrow(
|
|
183
|
+
'DefermentManager is disposed'
|
|
184
|
+
)
|
|
185
|
+
})
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
describe('dispose', () => {
|
|
189
|
+
it('should clear all outstanding deferments', () => {
|
|
190
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
191
|
+
const get = vi.fn()
|
|
192
|
+
const add = vi.fn()
|
|
193
|
+
const mockCache = {
|
|
194
|
+
get,
|
|
195
|
+
add,
|
|
196
|
+
dispose: vi.fn()
|
|
197
|
+
} as unknown as MemoryCache
|
|
198
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
199
|
+
|
|
200
|
+
void defermentManager.defer({ id: 'testId' })
|
|
201
|
+
defermentManager.dispose()
|
|
202
|
+
// @ts-expect-error - accessing private property for testing
|
|
203
|
+
expect(defermentManager.outstanding.size).toBe(0)
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
it('should not do anything if already disposed', () => {
|
|
207
|
+
const mockLogger: CustomLogger = vi.fn()
|
|
208
|
+
const get = vi.fn()
|
|
209
|
+
const add = vi.fn()
|
|
210
|
+
const mockCache = {
|
|
211
|
+
get,
|
|
212
|
+
add,
|
|
213
|
+
dispose: vi.fn()
|
|
214
|
+
} as unknown as MemoryCache
|
|
215
|
+
const defermentManager = new DefermentManager(mockLogger, mockCache)
|
|
216
|
+
|
|
217
|
+
defermentManager.dispose()
|
|
218
|
+
// @ts-expect-error - accessing private property for testing
|
|
219
|
+
const outstanding = defermentManager.outstanding
|
|
220
|
+
const clearSpy = vi.spyOn(outstanding, 'clear')
|
|
221
|
+
defermentManager.dispose()
|
|
222
|
+
expect(clearSpy).not.toHaveBeenCalled()
|
|
223
|
+
})
|
|
224
|
+
})
|
|
225
|
+
})
|
|
@@ -0,0 +1,95 @@
|
|
|
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 interface Deferment {
|
|
7
|
+
defer(params: { id: string }): [Promise<Base>, boolean]
|
|
8
|
+
undefer(item: Item, requestItem: (id: string) => void): void
|
|
9
|
+
dispose(): void
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class MemoryOnlyDeferment implements Deferment {
|
|
13
|
+
private items: Map<string, Base>
|
|
14
|
+
|
|
15
|
+
constructor(items: Map<string, Base>) {
|
|
16
|
+
this.items = items
|
|
17
|
+
}
|
|
18
|
+
defer(params: { id: string }): [Promise<Base>, boolean] {
|
|
19
|
+
const item = this.items.get(params.id)
|
|
20
|
+
if (item) {
|
|
21
|
+
return [Promise.resolve(item), true]
|
|
22
|
+
}
|
|
23
|
+
return [Promise.reject(new Error('Not found in cache: ' + params.id)), false]
|
|
24
|
+
}
|
|
25
|
+
undefer(): void {
|
|
26
|
+
//no-op
|
|
27
|
+
}
|
|
28
|
+
dispose(): void {
|
|
29
|
+
//no-op
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class DefermentManager implements Deferment {
|
|
34
|
+
private outstanding: Map<string, DeferredBase> = new Map()
|
|
35
|
+
private logger: CustomLogger
|
|
36
|
+
private disposed = false
|
|
37
|
+
private cache: MemoryCache
|
|
38
|
+
|
|
39
|
+
constructor(logger: CustomLogger, cache?: MemoryCache) {
|
|
40
|
+
this.logger = logger
|
|
41
|
+
this.cache =
|
|
42
|
+
cache ||
|
|
43
|
+
new MemoryCache(
|
|
44
|
+
{
|
|
45
|
+
maxSizeInMb: 500, // 500 MB
|
|
46
|
+
ttlms: 5_000 // 5 seconds
|
|
47
|
+
},
|
|
48
|
+
logger
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
defer(params: { id: string }): [Promise<Base>, boolean] {
|
|
53
|
+
if (this.disposed) throw new Error('DefermentManager is disposed')
|
|
54
|
+
const item = this.cache.get(params.id)
|
|
55
|
+
if (item) {
|
|
56
|
+
return [Promise.resolve(item.base!), true]
|
|
57
|
+
}
|
|
58
|
+
const deferredBase = this.outstanding.get(params.id)
|
|
59
|
+
if (deferredBase) {
|
|
60
|
+
return [deferredBase.getPromise(), true]
|
|
61
|
+
}
|
|
62
|
+
const notYetFound = new DeferredBase(params.id)
|
|
63
|
+
this.outstanding.set(params.id, notYetFound)
|
|
64
|
+
return [notYetFound.getPromise(), false]
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
undefer(item: Item, requestItem: (id: string) => void): void {
|
|
68
|
+
if (this.disposed) throw new Error('DefermentManager is disposed')
|
|
69
|
+
const base = item.base
|
|
70
|
+
if (!base) {
|
|
71
|
+
this.logger('undefer called with no base', item)
|
|
72
|
+
return
|
|
73
|
+
}
|
|
74
|
+
this.cache.add(item, (id) => {
|
|
75
|
+
if (!this.outstanding.has(id)) {
|
|
76
|
+
requestItem(id)
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
//order matters here with found before undefer
|
|
81
|
+
const deferredBase = this.outstanding.get(item.baseId)
|
|
82
|
+
if (deferredBase) {
|
|
83
|
+
deferredBase.found(base)
|
|
84
|
+
this.outstanding.delete(item.baseId)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
dispose(): void {
|
|
89
|
+
if (this.disposed) return
|
|
90
|
+
this.disposed = true
|
|
91
|
+
this.logger('cleared deferments, left', this.outstanding.size)
|
|
92
|
+
this.outstanding.clear()
|
|
93
|
+
this.cache.dispose()
|
|
94
|
+
}
|
|
95
|
+
}
|