@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.
Files changed (419) hide show
  1. package/dist/commonjs/{operations → core}/interfaces.d.ts +2 -5
  2. package/dist/commonjs/core/interfaces.d.ts.map +1 -0
  3. package/dist/commonjs/core/interfaces.js.map +1 -0
  4. package/dist/{esm/operations → commonjs/core}/objectLoader2.d.ts +1 -1
  5. package/dist/commonjs/core/objectLoader2.d.ts.map +1 -0
  6. package/dist/commonjs/core/objectLoader2.js +128 -0
  7. package/dist/commonjs/core/objectLoader2.js.map +1 -0
  8. package/dist/commonjs/core/objectLoader2Factory.d.ts +27 -0
  9. package/dist/commonjs/core/objectLoader2Factory.d.ts.map +1 -0
  10. package/dist/commonjs/core/objectLoader2Factory.js +74 -0
  11. package/dist/commonjs/core/objectLoader2Factory.js.map +1 -0
  12. package/dist/{esm/operations → commonjs/core}/options.d.ts +2 -1
  13. package/dist/commonjs/core/options.d.ts.map +1 -0
  14. package/dist/commonjs/{operations → core}/options.js.map +1 -1
  15. package/dist/commonjs/core/stages/ItemStore.d.ts +37 -0
  16. package/dist/commonjs/core/stages/ItemStore.d.ts.map +1 -0
  17. package/dist/commonjs/core/stages/ItemStore.js +167 -0
  18. package/dist/commonjs/core/stages/ItemStore.js.map +1 -0
  19. package/dist/commonjs/core/stages/cacheReader.d.ts +18 -0
  20. package/dist/commonjs/core/stages/cacheReader.d.ts.map +1 -0
  21. package/dist/commonjs/core/stages/cacheReader.js +72 -0
  22. package/dist/commonjs/core/stages/cacheReader.js.map +1 -0
  23. package/dist/commonjs/core/stages/cacheWriter.d.ts +15 -0
  24. package/dist/commonjs/core/stages/cacheWriter.d.ts.map +1 -0
  25. package/dist/commonjs/core/stages/cacheWriter.js +50 -0
  26. package/dist/commonjs/core/stages/cacheWriter.js.map +1 -0
  27. package/dist/commonjs/{operations/databases → core/stages}/indexedDatabase.d.ts +2 -7
  28. package/dist/commonjs/core/stages/indexedDatabase.d.ts.map +1 -0
  29. package/dist/commonjs/core/stages/indexedDatabase.js +31 -0
  30. package/dist/commonjs/core/stages/indexedDatabase.js.map +1 -0
  31. package/dist/commonjs/core/stages/memory/memoryDatabase.d.ts +13 -0
  32. package/dist/commonjs/core/stages/memory/memoryDatabase.d.ts.map +1 -0
  33. package/dist/commonjs/{operations/databases → core/stages/memory}/memoryDatabase.js +4 -8
  34. package/dist/commonjs/core/stages/memory/memoryDatabase.js.map +1 -0
  35. package/dist/commonjs/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +3 -3
  36. package/dist/commonjs/core/stages/memory/memoryDownloader.d.ts.map +1 -0
  37. package/dist/commonjs/{operations/downloaders → core/stages/memory}/memoryDownloader.js +1 -1
  38. package/dist/commonjs/core/stages/memory/memoryDownloader.js.map +1 -0
  39. package/dist/{esm/operations/downloaders → commonjs/core/stages}/serverDownloader.d.ts +4 -5
  40. package/dist/commonjs/core/stages/serverDownloader.d.ts.map +1 -0
  41. package/dist/commonjs/{operations/downloaders → core/stages}/serverDownloader.js +82 -32
  42. package/dist/commonjs/core/stages/serverDownloader.js.map +1 -0
  43. package/dist/commonjs/core/traverser.d.ts.map +1 -0
  44. package/dist/commonjs/{operations → core}/traverser.js +7 -7
  45. package/dist/commonjs/core/traverser.js.map +1 -0
  46. package/dist/commonjs/deferment/MemoryCache.d.ts +35 -0
  47. package/dist/commonjs/deferment/MemoryCache.d.ts.map +1 -0
  48. package/dist/commonjs/deferment/MemoryCache.js +162 -0
  49. package/dist/commonjs/deferment/MemoryCache.js.map +1 -0
  50. package/dist/commonjs/deferment/MemoryCache.test.d.ts +2 -0
  51. package/dist/commonjs/deferment/MemoryCache.test.d.ts.map +1 -0
  52. package/dist/commonjs/deferment/MemoryCache.test.js +153 -0
  53. package/dist/commonjs/deferment/MemoryCache.test.js.map +1 -0
  54. package/dist/commonjs/deferment/defermentManager.d.ts +16 -0
  55. package/dist/commonjs/deferment/defermentManager.d.ts.map +1 -0
  56. package/dist/commonjs/deferment/defermentManager.js +58 -0
  57. package/dist/commonjs/deferment/defermentManager.js.map +1 -0
  58. package/dist/commonjs/deferment/defermentManager.test.d.ts +2 -0
  59. package/dist/commonjs/deferment/defermentManager.test.d.ts.map +1 -0
  60. package/dist/commonjs/deferment/defermentManager.test.js +188 -0
  61. package/dist/commonjs/deferment/defermentManager.test.js.map +1 -0
  62. package/dist/commonjs/deferment/deferredBase.d.ts +12 -0
  63. package/dist/commonjs/deferment/deferredBase.d.ts.map +1 -0
  64. package/dist/commonjs/deferment/deferredBase.js +27 -0
  65. package/dist/commonjs/deferment/deferredBase.js.map +1 -0
  66. package/dist/commonjs/index.d.ts +3 -3
  67. package/dist/commonjs/index.d.ts.map +1 -1
  68. package/dist/commonjs/index.js +6 -5
  69. package/dist/commonjs/index.js.map +1 -1
  70. package/dist/commonjs/{helpers → queues}/aggregateQueue.d.ts +2 -1
  71. package/dist/commonjs/queues/aggregateQueue.d.ts.map +1 -0
  72. package/dist/commonjs/{helpers → queues}/aggregateQueue.js +4 -0
  73. package/dist/commonjs/queues/aggregateQueue.js.map +1 -0
  74. package/dist/{esm/helpers → commonjs/queues}/asyncGeneratorQueue.d.ts +1 -1
  75. package/dist/commonjs/queues/asyncGeneratorQueue.d.ts.map +1 -0
  76. package/dist/commonjs/{helpers → queues}/asyncGeneratorQueue.js +2 -1
  77. package/dist/commonjs/queues/asyncGeneratorQueue.js.map +1 -0
  78. package/dist/{esm/helpers → commonjs/queues}/batchedPool.d.ts +2 -1
  79. package/dist/commonjs/queues/batchedPool.d.ts.map +1 -0
  80. package/dist/commonjs/queues/batchedPool.js.map +1 -0
  81. package/dist/{esm/helpers → commonjs/queues}/batchingQueue.d.ts +4 -1
  82. package/dist/commonjs/queues/batchingQueue.d.ts.map +1 -0
  83. package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts +2 -0
  84. package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts.map +1 -0
  85. package/dist/commonjs/queues/batchingQueue.dispose.test.js +64 -0
  86. package/dist/commonjs/queues/batchingQueue.dispose.test.js.map +1 -0
  87. package/dist/commonjs/queues/batchingQueue.js +123 -0
  88. package/dist/commonjs/queues/batchingQueue.js.map +1 -0
  89. package/dist/commonjs/queues/batchingQueue.test.d.ts +2 -0
  90. package/dist/commonjs/queues/batchingQueue.test.d.ts.map +1 -0
  91. package/dist/commonjs/queues/batchingQueue.test.js +138 -0
  92. package/dist/commonjs/queues/batchingQueue.test.js.map +1 -0
  93. package/dist/{esm/helpers → commonjs/queues}/bufferQueue.d.ts +1 -0
  94. package/dist/commonjs/queues/bufferQueue.d.ts.map +1 -0
  95. package/dist/commonjs/{helpers → queues}/bufferQueue.js +3 -0
  96. package/dist/commonjs/queues/bufferQueue.js.map +1 -0
  97. package/dist/commonjs/{helpers → queues}/keyedQueue.d.ts +1 -0
  98. package/dist/commonjs/queues/keyedQueue.d.ts.map +1 -0
  99. package/dist/commonjs/{helpers → queues}/keyedQueue.js +11 -0
  100. package/dist/commonjs/queues/keyedQueue.js.map +1 -0
  101. package/dist/commonjs/queues/queue.d.ts +5 -0
  102. package/dist/commonjs/queues/queue.d.ts.map +1 -0
  103. package/dist/commonjs/{helpers → queues}/queue.js.map +1 -1
  104. package/dist/commonjs/types/functions.d.ts +21 -0
  105. package/dist/commonjs/types/functions.d.ts.map +1 -0
  106. package/dist/commonjs/types/functions.js +92 -0
  107. package/dist/commonjs/types/functions.js.map +1 -0
  108. package/dist/commonjs/types/types.d.ts +1 -7
  109. package/dist/commonjs/types/types.d.ts.map +1 -1
  110. package/dist/commonjs/types/types.js +0 -36
  111. package/dist/commonjs/types/types.js.map +1 -1
  112. package/dist/esm/{operations → core}/interfaces.d.ts +2 -5
  113. package/dist/esm/core/interfaces.d.ts.map +1 -0
  114. package/dist/esm/core/interfaces.js.map +1 -0
  115. package/dist/{commonjs/operations → esm/core}/objectLoader2.d.ts +1 -1
  116. package/dist/esm/core/objectLoader2.d.ts.map +1 -0
  117. package/dist/esm/core/objectLoader2.js +121 -0
  118. package/dist/esm/core/objectLoader2.js.map +1 -0
  119. package/dist/esm/core/objectLoader2Factory.d.ts +27 -0
  120. package/dist/esm/core/objectLoader2Factory.d.ts.map +1 -0
  121. package/dist/esm/core/objectLoader2Factory.js +67 -0
  122. package/dist/esm/core/objectLoader2Factory.js.map +1 -0
  123. package/dist/{commonjs/operations → esm/core}/options.d.ts +2 -1
  124. package/dist/esm/core/options.d.ts.map +1 -0
  125. package/dist/esm/{operations → core}/options.js.map +1 -1
  126. package/dist/esm/core/stages/ItemStore.d.ts +37 -0
  127. package/dist/esm/core/stages/ItemStore.d.ts.map +1 -0
  128. package/dist/esm/core/stages/ItemStore.js +163 -0
  129. package/dist/esm/core/stages/ItemStore.js.map +1 -0
  130. package/dist/esm/core/stages/cacheReader.d.ts +18 -0
  131. package/dist/esm/core/stages/cacheReader.d.ts.map +1 -0
  132. package/dist/esm/core/stages/cacheReader.js +65 -0
  133. package/dist/esm/core/stages/cacheReader.js.map +1 -0
  134. package/dist/esm/core/stages/cacheWriter.d.ts +15 -0
  135. package/dist/esm/core/stages/cacheWriter.d.ts.map +1 -0
  136. package/dist/esm/core/stages/cacheWriter.js +43 -0
  137. package/dist/esm/core/stages/cacheWriter.js.map +1 -0
  138. package/dist/esm/{operations/databases → core/stages}/indexedDatabase.d.ts +2 -7
  139. package/dist/esm/core/stages/indexedDatabase.d.ts.map +1 -0
  140. package/dist/esm/core/stages/indexedDatabase.js +28 -0
  141. package/dist/esm/core/stages/indexedDatabase.js.map +1 -0
  142. package/dist/esm/core/stages/memory/memoryDatabase.d.ts +13 -0
  143. package/dist/esm/core/stages/memory/memoryDatabase.d.ts.map +1 -0
  144. package/dist/esm/{operations/databases → core/stages/memory}/memoryDatabase.js +4 -8
  145. package/dist/esm/core/stages/memory/memoryDatabase.js.map +1 -0
  146. package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +3 -3
  147. package/dist/esm/core/stages/memory/memoryDownloader.d.ts.map +1 -0
  148. package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.js +1 -1
  149. package/dist/esm/core/stages/memory/memoryDownloader.js.map +1 -0
  150. package/dist/{commonjs/operations/downloaders → esm/core/stages}/serverDownloader.d.ts +4 -5
  151. package/dist/esm/core/stages/serverDownloader.d.ts.map +1 -0
  152. package/dist/esm/{operations/downloaders → core/stages}/serverDownloader.js +81 -31
  153. package/dist/esm/core/stages/serverDownloader.js.map +1 -0
  154. package/dist/esm/core/traverser.d.ts.map +1 -0
  155. package/dist/esm/{operations → core}/traverser.js +1 -1
  156. package/dist/esm/core/traverser.js.map +1 -0
  157. package/dist/esm/deferment/MemoryCache.d.ts +35 -0
  158. package/dist/esm/deferment/MemoryCache.d.ts.map +1 -0
  159. package/dist/esm/deferment/MemoryCache.js +157 -0
  160. package/dist/esm/deferment/MemoryCache.js.map +1 -0
  161. package/dist/esm/deferment/MemoryCache.test.d.ts +2 -0
  162. package/dist/esm/deferment/MemoryCache.test.d.ts.map +1 -0
  163. package/dist/esm/deferment/MemoryCache.test.js +151 -0
  164. package/dist/esm/deferment/MemoryCache.test.js.map +1 -0
  165. package/dist/esm/deferment/defermentManager.d.ts +16 -0
  166. package/dist/esm/deferment/defermentManager.d.ts.map +1 -0
  167. package/dist/esm/deferment/defermentManager.js +54 -0
  168. package/dist/esm/deferment/defermentManager.js.map +1 -0
  169. package/dist/esm/deferment/defermentManager.test.d.ts +2 -0
  170. package/dist/esm/deferment/defermentManager.test.d.ts.map +1 -0
  171. package/dist/esm/deferment/defermentManager.test.js +186 -0
  172. package/dist/esm/deferment/defermentManager.test.js.map +1 -0
  173. package/dist/esm/deferment/deferredBase.d.ts +12 -0
  174. package/dist/esm/deferment/deferredBase.d.ts.map +1 -0
  175. package/dist/esm/deferment/deferredBase.js +23 -0
  176. package/dist/esm/deferment/deferredBase.js.map +1 -0
  177. package/dist/esm/index.d.ts +3 -3
  178. package/dist/esm/index.d.ts.map +1 -1
  179. package/dist/esm/index.js +3 -3
  180. package/dist/esm/index.js.map +1 -1
  181. package/dist/esm/{helpers → queues}/aggregateQueue.d.ts +2 -1
  182. package/dist/esm/queues/aggregateQueue.d.ts.map +1 -0
  183. package/dist/esm/{helpers → queues}/aggregateQueue.js +4 -0
  184. package/dist/esm/queues/aggregateQueue.js.map +1 -0
  185. package/dist/{commonjs/helpers → esm/queues}/asyncGeneratorQueue.d.ts +1 -1
  186. package/dist/esm/queues/asyncGeneratorQueue.d.ts.map +1 -0
  187. package/dist/esm/{helpers → queues}/asyncGeneratorQueue.js +2 -1
  188. package/dist/esm/queues/asyncGeneratorQueue.js.map +1 -0
  189. package/dist/{commonjs/helpers → esm/queues}/batchedPool.d.ts +2 -1
  190. package/dist/esm/queues/batchedPool.d.ts.map +1 -0
  191. package/dist/esm/queues/batchedPool.js.map +1 -0
  192. package/dist/{commonjs/helpers → esm/queues}/batchingQueue.d.ts +4 -1
  193. package/dist/esm/queues/batchingQueue.d.ts.map +1 -0
  194. package/dist/esm/queues/batchingQueue.dispose.test.d.ts +2 -0
  195. package/dist/esm/queues/batchingQueue.dispose.test.d.ts.map +1 -0
  196. package/dist/esm/queues/batchingQueue.dispose.test.js +59 -0
  197. package/dist/esm/queues/batchingQueue.dispose.test.js.map +1 -0
  198. package/dist/esm/queues/batchingQueue.js +117 -0
  199. package/dist/esm/queues/batchingQueue.js.map +1 -0
  200. package/dist/esm/queues/batchingQueue.test.d.ts +2 -0
  201. package/dist/esm/queues/batchingQueue.test.d.ts.map +1 -0
  202. package/dist/esm/queues/batchingQueue.test.js +133 -0
  203. package/dist/esm/queues/batchingQueue.test.js.map +1 -0
  204. package/dist/{commonjs/helpers → esm/queues}/bufferQueue.d.ts +1 -0
  205. package/dist/esm/queues/bufferQueue.d.ts.map +1 -0
  206. package/dist/esm/{helpers → queues}/bufferQueue.js +3 -0
  207. package/dist/esm/queues/bufferQueue.js.map +1 -0
  208. package/dist/esm/{helpers → queues}/keyedQueue.d.ts +1 -0
  209. package/dist/esm/queues/keyedQueue.d.ts.map +1 -0
  210. package/dist/esm/{helpers → queues}/keyedQueue.js +11 -0
  211. package/dist/esm/queues/keyedQueue.js.map +1 -0
  212. package/dist/esm/queues/queue.d.ts +5 -0
  213. package/dist/esm/queues/queue.d.ts.map +1 -0
  214. package/dist/esm/{helpers → queues}/queue.js.map +1 -1
  215. package/dist/esm/types/functions.d.ts +21 -0
  216. package/dist/esm/types/functions.d.ts.map +1 -0
  217. package/dist/esm/types/functions.js +83 -0
  218. package/dist/esm/types/functions.js.map +1 -0
  219. package/dist/esm/types/types.d.ts +1 -7
  220. package/dist/esm/types/types.d.ts.map +1 -1
  221. package/dist/esm/types/types.js +1 -32
  222. package/dist/esm/types/types.js.map +1 -1
  223. package/package.json +2 -3
  224. package/readme.md +64 -16
  225. package/src/{operations → core}/interfaces.ts +2 -3
  226. package/src/{operations → core}/objectLoader2.spec.ts +22 -9
  227. package/src/core/objectLoader2.ts +162 -0
  228. package/src/core/objectLoader2Factory.ts +87 -0
  229. package/src/{operations → core}/options.ts +2 -1
  230. package/src/core/stages/ItemStore.ts +196 -0
  231. package/src/core/stages/__snapshots__/indexedDatabase.spec.ts.snap +18 -0
  232. package/src/{operations/downloaders → core/stages}/__snapshots__/serverDownloader.spec.ts.snap +25 -0
  233. package/src/{helpers → core/stages}/cacheReader.spec.ts +12 -7
  234. package/src/core/stages/cacheReader.ts +88 -0
  235. package/src/core/stages/cacheWriter.spec.ts +213 -0
  236. package/src/core/stages/cacheWriter.ts +64 -0
  237. package/src/core/stages/indexedDatabase.spec.ts +37 -0
  238. package/src/core/stages/indexedDatabase.ts +49 -0
  239. package/src/core/stages/memory/__snapshots__/memoryDownloader.spec.ts.snap +12 -0
  240. package/src/core/stages/memory/memoryDatabase.spec.ts +48 -0
  241. package/src/{operations/databases → core/stages/memory}/memoryDatabase.ts +7 -12
  242. package/src/core/stages/memory/memoryDownloader.spec.ts +49 -0
  243. package/src/{operations/downloaders → core/stages/memory}/memoryDownloader.ts +4 -4
  244. package/src/{operations/downloaders → core/stages}/serverDownloader.spec.ts +102 -11
  245. package/src/{operations/downloaders → core/stages}/serverDownloader.ts +88 -31
  246. package/src/{operations → core}/traverser.ts +2 -1
  247. package/src/deferment/MemoryCache.test.ts +187 -0
  248. package/src/deferment/MemoryCache.ts +189 -0
  249. package/src/deferment/defermentManager.test.ts +220 -0
  250. package/src/deferment/defermentManager.ts +59 -0
  251. package/src/deferment/deferredBase.ts +29 -0
  252. package/src/index.ts +3 -3
  253. package/src/{helpers → queues}/aggregateQueue.ts +5 -1
  254. package/src/{helpers → queues}/asyncGeneratorQueue.ts +2 -1
  255. package/src/{helpers → queues}/batchedPool.ts +3 -1
  256. package/src/queues/batchingQueue.dispose.test.ts +74 -0
  257. package/src/queues/batchingQueue.test.ts +149 -0
  258. package/src/queues/batchingQueue.ts +138 -0
  259. package/src/{helpers → queues}/bufferQueue.ts +3 -0
  260. package/src/{helpers → queues}/keyedQueue.ts +12 -0
  261. package/src/{helpers → queues}/queue.ts +1 -0
  262. package/src/test/e2e.spec.ts +6 -4
  263. package/src/types/functions.spec.ts +155 -0
  264. package/src/types/functions.ts +118 -0
  265. package/src/types/types.ts +1 -51
  266. package/dist/commonjs/helpers/aggregateQueue.d.ts.map +0 -1
  267. package/dist/commonjs/helpers/aggregateQueue.js.map +0 -1
  268. package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts.map +0 -1
  269. package/dist/commonjs/helpers/asyncGeneratorQueue.js.map +0 -1
  270. package/dist/commonjs/helpers/batchedPool.d.ts.map +0 -1
  271. package/dist/commonjs/helpers/batchedPool.js.map +0 -1
  272. package/dist/commonjs/helpers/batchingQueue.d.ts.map +0 -1
  273. package/dist/commonjs/helpers/batchingQueue.js +0 -77
  274. package/dist/commonjs/helpers/batchingQueue.js.map +0 -1
  275. package/dist/commonjs/helpers/bufferQueue.d.ts.map +0 -1
  276. package/dist/commonjs/helpers/bufferQueue.js.map +0 -1
  277. package/dist/commonjs/helpers/cachePump.d.ts +0 -21
  278. package/dist/commonjs/helpers/cachePump.d.ts.map +0 -1
  279. package/dist/commonjs/helpers/cachePump.js +0 -80
  280. package/dist/commonjs/helpers/cachePump.js.map +0 -1
  281. package/dist/commonjs/helpers/cacheReader.d.ts +0 -14
  282. package/dist/commonjs/helpers/cacheReader.d.ts.map +0 -1
  283. package/dist/commonjs/helpers/cacheReader.js +0 -58
  284. package/dist/commonjs/helpers/cacheReader.js.map +0 -1
  285. package/dist/commonjs/helpers/defermentManager.d.ts +0 -26
  286. package/dist/commonjs/helpers/defermentManager.d.ts.map +0 -1
  287. package/dist/commonjs/helpers/defermentManager.js +0 -131
  288. package/dist/commonjs/helpers/defermentManager.js.map +0 -1
  289. package/dist/commonjs/helpers/deferredBase.d.ts +0 -19
  290. package/dist/commonjs/helpers/deferredBase.d.ts.map +0 -1
  291. package/dist/commonjs/helpers/deferredBase.js +0 -51
  292. package/dist/commonjs/helpers/deferredBase.js.map +0 -1
  293. package/dist/commonjs/helpers/keyedQueue.d.ts.map +0 -1
  294. package/dist/commonjs/helpers/keyedQueue.js.map +0 -1
  295. package/dist/commonjs/helpers/memoryPump.d.ts +0 -15
  296. package/dist/commonjs/helpers/memoryPump.d.ts.map +0 -1
  297. package/dist/commonjs/helpers/memoryPump.js +0 -34
  298. package/dist/commonjs/helpers/memoryPump.js.map +0 -1
  299. package/dist/commonjs/helpers/pump.d.ts +0 -8
  300. package/dist/commonjs/helpers/pump.d.ts.map +0 -1
  301. package/dist/commonjs/helpers/pump.js +0 -3
  302. package/dist/commonjs/helpers/pump.js.map +0 -1
  303. package/dist/commonjs/helpers/queue.d.ts +0 -4
  304. package/dist/commonjs/helpers/queue.d.ts.map +0 -1
  305. package/dist/commonjs/operations/databases/indexedDatabase.d.ts.map +0 -1
  306. package/dist/commonjs/operations/databases/indexedDatabase.js +0 -117
  307. package/dist/commonjs/operations/databases/indexedDatabase.js.map +0 -1
  308. package/dist/commonjs/operations/databases/memoryDatabase.d.ts +0 -16
  309. package/dist/commonjs/operations/databases/memoryDatabase.d.ts.map +0 -1
  310. package/dist/commonjs/operations/databases/memoryDatabase.js.map +0 -1
  311. package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts.map +0 -1
  312. package/dist/commonjs/operations/downloaders/memoryDownloader.js.map +0 -1
  313. package/dist/commonjs/operations/downloaders/serverDownloader.d.ts.map +0 -1
  314. package/dist/commonjs/operations/downloaders/serverDownloader.js.map +0 -1
  315. package/dist/commonjs/operations/interfaces.d.ts.map +0 -1
  316. package/dist/commonjs/operations/interfaces.js.map +0 -1
  317. package/dist/commonjs/operations/objectLoader2.d.ts.map +0 -1
  318. package/dist/commonjs/operations/objectLoader2.js +0 -95
  319. package/dist/commonjs/operations/objectLoader2.js.map +0 -1
  320. package/dist/commonjs/operations/objectLoader2Factory.d.ts +0 -21
  321. package/dist/commonjs/operations/objectLoader2Factory.d.ts.map +0 -1
  322. package/dist/commonjs/operations/objectLoader2Factory.js +0 -50
  323. package/dist/commonjs/operations/objectLoader2Factory.js.map +0 -1
  324. package/dist/commonjs/operations/options.d.ts.map +0 -1
  325. package/dist/commonjs/operations/traverser.d.ts.map +0 -1
  326. package/dist/commonjs/operations/traverser.js.map +0 -1
  327. package/dist/esm/helpers/aggregateQueue.d.ts.map +0 -1
  328. package/dist/esm/helpers/aggregateQueue.js.map +0 -1
  329. package/dist/esm/helpers/asyncGeneratorQueue.d.ts.map +0 -1
  330. package/dist/esm/helpers/asyncGeneratorQueue.js.map +0 -1
  331. package/dist/esm/helpers/batchedPool.d.ts.map +0 -1
  332. package/dist/esm/helpers/batchedPool.js.map +0 -1
  333. package/dist/esm/helpers/batchingQueue.d.ts.map +0 -1
  334. package/dist/esm/helpers/batchingQueue.js +0 -71
  335. package/dist/esm/helpers/batchingQueue.js.map +0 -1
  336. package/dist/esm/helpers/bufferQueue.d.ts.map +0 -1
  337. package/dist/esm/helpers/bufferQueue.js.map +0 -1
  338. package/dist/esm/helpers/cachePump.d.ts +0 -21
  339. package/dist/esm/helpers/cachePump.d.ts.map +0 -1
  340. package/dist/esm/helpers/cachePump.js +0 -73
  341. package/dist/esm/helpers/cachePump.js.map +0 -1
  342. package/dist/esm/helpers/cacheReader.d.ts +0 -14
  343. package/dist/esm/helpers/cacheReader.d.ts.map +0 -1
  344. package/dist/esm/helpers/cacheReader.js +0 -51
  345. package/dist/esm/helpers/cacheReader.js.map +0 -1
  346. package/dist/esm/helpers/defermentManager.d.ts +0 -26
  347. package/dist/esm/helpers/defermentManager.d.ts.map +0 -1
  348. package/dist/esm/helpers/defermentManager.js +0 -127
  349. package/dist/esm/helpers/defermentManager.js.map +0 -1
  350. package/dist/esm/helpers/deferredBase.d.ts +0 -19
  351. package/dist/esm/helpers/deferredBase.d.ts.map +0 -1
  352. package/dist/esm/helpers/deferredBase.js +0 -47
  353. package/dist/esm/helpers/deferredBase.js.map +0 -1
  354. package/dist/esm/helpers/keyedQueue.d.ts.map +0 -1
  355. package/dist/esm/helpers/keyedQueue.js.map +0 -1
  356. package/dist/esm/helpers/memoryPump.d.ts +0 -15
  357. package/dist/esm/helpers/memoryPump.d.ts.map +0 -1
  358. package/dist/esm/helpers/memoryPump.js +0 -30
  359. package/dist/esm/helpers/memoryPump.js.map +0 -1
  360. package/dist/esm/helpers/pump.d.ts +0 -8
  361. package/dist/esm/helpers/pump.d.ts.map +0 -1
  362. package/dist/esm/helpers/pump.js +0 -2
  363. package/dist/esm/helpers/pump.js.map +0 -1
  364. package/dist/esm/helpers/queue.d.ts +0 -4
  365. package/dist/esm/helpers/queue.d.ts.map +0 -1
  366. package/dist/esm/operations/databases/indexedDatabase.d.ts.map +0 -1
  367. package/dist/esm/operations/databases/indexedDatabase.js +0 -114
  368. package/dist/esm/operations/databases/indexedDatabase.js.map +0 -1
  369. package/dist/esm/operations/databases/memoryDatabase.d.ts +0 -16
  370. package/dist/esm/operations/databases/memoryDatabase.d.ts.map +0 -1
  371. package/dist/esm/operations/databases/memoryDatabase.js.map +0 -1
  372. package/dist/esm/operations/downloaders/memoryDownloader.d.ts.map +0 -1
  373. package/dist/esm/operations/downloaders/memoryDownloader.js.map +0 -1
  374. package/dist/esm/operations/downloaders/serverDownloader.d.ts.map +0 -1
  375. package/dist/esm/operations/downloaders/serverDownloader.js.map +0 -1
  376. package/dist/esm/operations/interfaces.d.ts.map +0 -1
  377. package/dist/esm/operations/interfaces.js.map +0 -1
  378. package/dist/esm/operations/objectLoader2.d.ts.map +0 -1
  379. package/dist/esm/operations/objectLoader2.js +0 -88
  380. package/dist/esm/operations/objectLoader2.js.map +0 -1
  381. package/dist/esm/operations/objectLoader2Factory.d.ts +0 -21
  382. package/dist/esm/operations/objectLoader2Factory.d.ts.map +0 -1
  383. package/dist/esm/operations/objectLoader2Factory.js +0 -43
  384. package/dist/esm/operations/objectLoader2Factory.js.map +0 -1
  385. package/dist/esm/operations/options.d.ts.map +0 -1
  386. package/dist/esm/operations/traverser.d.ts.map +0 -1
  387. package/dist/esm/operations/traverser.js.map +0 -1
  388. package/src/helpers/__snapshots__/cachePump.spec.ts.snap +0 -31
  389. package/src/helpers/__snapshots__/defermentManager.spec.ts.snap +0 -8
  390. package/src/helpers/batchingQueue.ts +0 -85
  391. package/src/helpers/cachePump.disposal.spec.ts +0 -49
  392. package/src/helpers/cachePump.spec.ts +0 -103
  393. package/src/helpers/cachePump.ts +0 -99
  394. package/src/helpers/cacheReader.ts +0 -64
  395. package/src/helpers/defermentManager.disposal.spec.ts +0 -28
  396. package/src/helpers/defermentManager.spec.ts +0 -37
  397. package/src/helpers/defermentManager.ts +0 -141
  398. package/src/helpers/deferredBase.ts +0 -55
  399. package/src/helpers/memoryPump.ts +0 -40
  400. package/src/helpers/pump.ts +0 -8
  401. package/src/operations/databases/__snapshots__/indexedDatabase.spec.ts.snap +0 -31
  402. package/src/operations/databases/indexedDatabase.spec.ts +0 -37
  403. package/src/operations/databases/indexedDatabase.ts +0 -150
  404. package/src/operations/objectLoader2.ts +0 -111
  405. package/src/operations/objectLoader2Factory.ts +0 -56
  406. package/dist/commonjs/{operations → core}/interfaces.js +0 -0
  407. package/dist/commonjs/{operations → core}/options.js +0 -0
  408. package/dist/commonjs/{operations → core}/traverser.d.ts +0 -0
  409. package/dist/commonjs/{helpers → queues}/batchedPool.js +0 -0
  410. package/dist/commonjs/{helpers → queues}/queue.js +0 -0
  411. package/dist/esm/{operations → core}/interfaces.js +0 -0
  412. package/dist/esm/{operations → core}/options.js +0 -0
  413. package/dist/esm/{operations → core}/traverser.d.ts +0 -0
  414. package/dist/esm/{helpers → queues}/batchedPool.js +0 -0
  415. package/dist/esm/{helpers → queues}/queue.js +0 -0
  416. package/src/{operations → core}/__snapshots__/objectLoader2.spec.ts.snap +0 -0
  417. package/src/{operations → core}/__snapshots__/traverser.spec.ts.snap +0 -0
  418. package/src/{helpers → core/stages}/__snapshots__/cacheReader.spec.ts.snap +0 -0
  419. package/src/{operations → core}/traverser.spec.ts +1 -1
@@ -0,0 +1,189 @@
1
+ import { CustomLogger } from '../types/functions.js'
2
+ import { Item } from '../types/types.js'
3
+
4
+ export interface MemoryCacheOptions {
5
+ maxSizeInMb: number
6
+ ttlms: number
7
+ }
8
+
9
+ export class MemoryCacheItem {
10
+ private item: Item
11
+ private expiresAt: number // Timestamp in ms
12
+
13
+ constructor(item: Item, expiresAt: number) {
14
+ this.item = item
15
+ this.expiresAt = expiresAt
16
+ }
17
+
18
+ isExpired(now: number): boolean {
19
+ return now > this.expiresAt
20
+ }
21
+ setAccess(now: number, ttl: number): void {
22
+ this.expiresAt = now + ttl
23
+ }
24
+
25
+ getItem(): Item {
26
+ return this.item
27
+ }
28
+
29
+ done(now: number): boolean {
30
+ if (this.isExpired(now)) {
31
+ return true
32
+ }
33
+ return false
34
+ }
35
+ }
36
+
37
+ export class MemoryCache {
38
+ private isGathered: Map<string, boolean> = new Map()
39
+ private references: Map<string, number> = new Map()
40
+ private cache: Map<string, MemoryCacheItem> = new Map()
41
+
42
+ private options: MemoryCacheOptions
43
+ private logger: CustomLogger
44
+ private disposed = false
45
+ private currentSize = 0
46
+ private timer?: ReturnType<typeof setTimeout>
47
+
48
+ constructor(options: MemoryCacheOptions, logger: CustomLogger) {
49
+ this.options = options
50
+ this.logger = logger
51
+ this.resetGlobalTimer()
52
+ }
53
+
54
+ add(item: Item, requestItem: (id: string) => void, testNow?: number): void {
55
+ if (this.disposed) throw new Error('MemoryCache is disposed')
56
+ this.currentSize += item.size || 0
57
+ this.cache.set(
58
+ item.baseId,
59
+ new MemoryCacheItem(item, (testNow || this.now()) + this.options.ttlms)
60
+ )
61
+
62
+ if (!this.isGathered.has(item.baseId)) {
63
+ this.isGathered.set(item.baseId, true)
64
+ this.scanForReferences(item.base!, requestItem)
65
+ }
66
+ }
67
+
68
+ get(id: string): Item | undefined {
69
+ if (this.disposed) throw new Error('MemoryCache is disposed')
70
+ const item = this.cache.get(id)
71
+ if (item) {
72
+ item.setAccess(this.now(), this.options.ttlms)
73
+ return item.getItem()
74
+ }
75
+ return undefined
76
+ }
77
+
78
+ scanForReferences(data: unknown, requestItem: (id: string) => void): void {
79
+ const scan = (item: unknown): void => {
80
+ // Stop if the item is null or not an object (i.e., primitive)
81
+ if (item === null || typeof item !== 'object') {
82
+ return
83
+ }
84
+
85
+ // If it's an array, scan each element
86
+ if (Array.isArray(item)) {
87
+ for (const element of item) {
88
+ scan(element)
89
+ }
90
+ return
91
+ }
92
+
93
+ // If it's an object, scan its properties
94
+ for (const key in item) {
95
+ if (Object.prototype.hasOwnProperty.call(item, key)) {
96
+ // We found the target property!
97
+ if (key === 'referencedId') {
98
+ const value = (item as { referencedId: unknown }).referencedId
99
+ // Ensure the value is a string before adding it
100
+ if (typeof value === 'string') {
101
+ this.references.set(value, (this.references.get(value) || 0) + 1)
102
+ if (!this.cache.has(value)) {
103
+ requestItem(value)
104
+ }
105
+ }
106
+ }
107
+
108
+ // Continue scanning deeper into the object's properties
109
+ scan((item as Record<string, unknown>)[key])
110
+ }
111
+ }
112
+ }
113
+
114
+ scan(data)
115
+ }
116
+
117
+ private resetGlobalTimer(): void {
118
+ const run = (): void => {
119
+ this.cleanCache()
120
+ this.timer = setTimeout(run, this.options.ttlms)
121
+ }
122
+ this.timer = setTimeout(run, this.options.ttlms)
123
+ }
124
+
125
+ private now(): number {
126
+ return Date.now()
127
+ }
128
+
129
+ cleanCache(testNow?: number): void {
130
+ const maxSizeBytes = this.options.maxSizeInMb * 1024 * 1024
131
+ if (this.currentSize < maxSizeBytes) {
132
+ this.logger(
133
+ `cache size (${this.currentSize} < ${maxSizeBytes}) is ok, no need to clean`
134
+ )
135
+ return
136
+ }
137
+ const now = testNow || this.now()
138
+ let cleaned = 0
139
+ const start = performance.now()
140
+ for (const deferredBase of Array.from(this.cache.values())
141
+ .filter((x) => x.isExpired(now))
142
+ .sort((a, b) =>
143
+ this.compareMaybeBasesByReferences(a.getItem().baseId, b.getItem().baseId)
144
+ )) {
145
+ if (deferredBase.done(now)) {
146
+ const id = deferredBase.getItem().baseId
147
+ const referenceCount = this.references.get(id) || 0
148
+ if (referenceCount > 0) {
149
+ // Skip eviction for items with reference counts greater than 0,
150
+ // as they are still in use and should not be removed from the cache.
151
+ continue
152
+ }
153
+ this.currentSize -= deferredBase.getItem().size || 0
154
+ this.cache.delete(id)
155
+ cleaned++
156
+ if (this.currentSize < maxSizeBytes) {
157
+ break
158
+ }
159
+ }
160
+ }
161
+ this.logger(
162
+ `cleaned cache: cleaned ${cleaned}, cached ${this.cache.size}, time ${
163
+ performance.now() - start
164
+ }`
165
+ )
166
+ return
167
+ }
168
+
169
+ compareMaybeBasesByReferences(id1: string, id2: string): number {
170
+ const a = this.references.get(id1)
171
+ const b = this.references.get(id2)
172
+ if (a === undefined && b === undefined) return 0
173
+ if (a === undefined) return -1
174
+ if (b === undefined) return 1
175
+ return a - b
176
+ }
177
+
178
+ dispose(): void {
179
+ if (this.disposed) return
180
+ this.disposed = true
181
+ if (this.timer) {
182
+ clearTimeout(this.timer)
183
+ this.timer = undefined
184
+ }
185
+ this.cache.clear()
186
+ this.isGathered.clear()
187
+ this.references.clear()
188
+ }
189
+ }
@@ -0,0 +1,220 @@
1
+ import { vi, describe, it, expect } from 'vitest'
2
+ import { DefermentManager } from './defermentManager.js'
3
+ import { MemoryCache } from './MemoryCache.js'
4
+ import { CustomLogger } from '../types/functions.js'
5
+ import { Item } from '../types/types.js'
6
+
7
+ describe('DefermentManager', () => {
8
+ it('should be created', () => {
9
+ const mockLogger: CustomLogger = vi.fn()
10
+ const mockCache = {
11
+ get: vi.fn(),
12
+ add: vi.fn()
13
+ } as unknown as MemoryCache
14
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
15
+ expect(defermentManager).toBeDefined()
16
+ })
17
+
18
+ describe('defer', () => {
19
+ it('should return a resolved promise if item is in cache', async () => {
20
+ const mockLogger: CustomLogger = vi.fn()
21
+ const get = vi.fn()
22
+ const add = vi.fn()
23
+ const mockCache = {
24
+ get,
25
+ add
26
+ } as unknown as MemoryCache
27
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
28
+
29
+ const item: Item = {
30
+ // eslint-disable-next-line camelcase
31
+ base: { id: 'testId', speckle_type: 'Base' },
32
+ baseId: 'testId'
33
+ }
34
+ get.mockReturnValue(item)
35
+
36
+ const [promise, wasInCache] = defermentManager.defer({ id: 'testId' })
37
+ const result = await promise
38
+
39
+ expect(wasInCache).toBe(true)
40
+ expect(result).toEqual(item.base)
41
+ expect(get).toHaveBeenCalledWith('testId')
42
+ })
43
+
44
+ it('should return the same promise if item is already outstanding', () => {
45
+ const mockLogger: CustomLogger = vi.fn()
46
+ const get = vi.fn()
47
+ const add = vi.fn()
48
+ const mockCache = {
49
+ get,
50
+ add
51
+ } as unknown as MemoryCache
52
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
53
+
54
+ const [promise1, wasInCache1] = defermentManager.defer({ id: 'testId' })
55
+ const [promise2, wasInCache2] = defermentManager.defer({ id: 'testId' })
56
+
57
+ expect(wasInCache1).toBe(false)
58
+ expect(wasInCache2).toBe(true)
59
+ expect(promise1).toBe(promise2)
60
+ })
61
+
62
+ it('should create a new deferred base if not in cache and not outstanding', () => {
63
+ const mockLogger: CustomLogger = vi.fn()
64
+ const get = vi.fn()
65
+ const add = vi.fn()
66
+ const mockCache = {
67
+ get,
68
+ add
69
+ } as unknown as MemoryCache
70
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
71
+
72
+ const [promise, wasInCache] = defermentManager.defer({ id: 'testId' })
73
+
74
+ expect(wasInCache).toBe(false)
75
+ expect(promise).toBeInstanceOf(Promise)
76
+ })
77
+
78
+ it('should throw if disposed', () => {
79
+ const mockLogger: CustomLogger = vi.fn()
80
+ const get = vi.fn()
81
+ const add = vi.fn()
82
+ const mockCache = {
83
+ get,
84
+ add
85
+ } as unknown as MemoryCache
86
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
87
+
88
+ defermentManager.dispose()
89
+ expect(() => defermentManager.defer({ id: 'testId' })).toThrow(
90
+ 'DefermentManager is disposed'
91
+ )
92
+ })
93
+ })
94
+
95
+ describe('undefer', () => {
96
+ it('should resolve the promise when an outstanding item is found', async () => {
97
+ const mockLogger: CustomLogger = vi.fn()
98
+ const get = vi.fn()
99
+ const add = vi.fn()
100
+ const mockCache = {
101
+ get,
102
+ add
103
+ } as unknown as MemoryCache
104
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
105
+ const requestItem = vi.fn()
106
+
107
+ const [promise] = defermentManager.defer({ id: 'testId' })
108
+
109
+ const item: Item = {
110
+ // eslint-disable-next-line camelcase
111
+ base: { id: 'testId', speckle_type: 'Base' },
112
+ baseId: 'testId'
113
+ }
114
+ defermentManager.undefer(item, requestItem)
115
+
116
+ const result = await promise
117
+ expect(result).toEqual(item.base)
118
+ })
119
+
120
+ it('should log an error if item has no base', () => {
121
+ const mockLogger: CustomLogger = vi.fn()
122
+ const get = vi.fn()
123
+ const add = vi.fn()
124
+ const mockCache = {
125
+ get,
126
+ add
127
+ } as unknown as MemoryCache
128
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
129
+ const requestItem = vi.fn()
130
+
131
+ const item: Item = { baseId: 'testId' }
132
+ defermentManager.undefer(item, requestItem)
133
+ expect(mockLogger).toHaveBeenCalledWith('undefer called with no base', item)
134
+ })
135
+
136
+ it('should add to cache and request item if not outstanding', () => {
137
+ const mockLogger: CustomLogger = vi.fn()
138
+ const get = vi.fn()
139
+ const add = vi.fn()
140
+ const mockCache = {
141
+ get,
142
+ add
143
+ } as unknown as MemoryCache
144
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
145
+ const requestItem = vi.fn()
146
+
147
+ const item: Item = {
148
+ // eslint-disable-next-line camelcase
149
+ base: { id: 'testId', speckle_type: 'Base' },
150
+ baseId: 'testId'
151
+ }
152
+ add.mockImplementation((_item: Item, getDependencies?: (id: string) => void) => {
153
+ if (getDependencies) getDependencies('testId')
154
+ })
155
+
156
+ defermentManager.undefer(item, requestItem)
157
+
158
+ expect(add).toHaveBeenCalledWith(item, expect.any(Function))
159
+ expect(requestItem).toHaveBeenCalledWith('testId')
160
+ })
161
+
162
+ it('should throw if disposed', () => {
163
+ const mockLogger: CustomLogger = vi.fn()
164
+ const get = vi.fn()
165
+ const add = vi.fn()
166
+ const mockCache = {
167
+ get,
168
+ add
169
+ } as unknown as MemoryCache
170
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
171
+ const requestItem = vi.fn()
172
+
173
+ defermentManager.dispose()
174
+ const item: Item = {
175
+ // eslint-disable-next-line camelcase
176
+ base: { id: 'testId', speckle_type: 'Base' },
177
+ baseId: 'testId'
178
+ }
179
+ expect(() => defermentManager.undefer(item, requestItem)).toThrow(
180
+ 'DefermentManager is disposed'
181
+ )
182
+ })
183
+ })
184
+
185
+ describe('dispose', () => {
186
+ it('should clear all outstanding deferments', () => {
187
+ const mockLogger: CustomLogger = vi.fn()
188
+ const get = vi.fn()
189
+ const add = vi.fn()
190
+ const mockCache = {
191
+ get,
192
+ add
193
+ } as unknown as MemoryCache
194
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
195
+
196
+ void defermentManager.defer({ id: 'testId' })
197
+ defermentManager.dispose()
198
+ // @ts-expect-error - accessing private property for testing
199
+ expect(defermentManager.outstanding.size).toBe(0)
200
+ })
201
+
202
+ it('should not do anything if already disposed', () => {
203
+ const mockLogger: CustomLogger = vi.fn()
204
+ const get = vi.fn()
205
+ const add = vi.fn()
206
+ const mockCache = {
207
+ get,
208
+ add
209
+ } as unknown as MemoryCache
210
+ const defermentManager = new DefermentManager(mockCache, mockLogger)
211
+
212
+ defermentManager.dispose()
213
+ // @ts-expect-error - accessing private property for testing
214
+ const outstanding = defermentManager.outstanding
215
+ const clearSpy = vi.spyOn(outstanding, 'clear')
216
+ defermentManager.dispose()
217
+ expect(clearSpy).not.toHaveBeenCalled()
218
+ })
219
+ })
220
+ })
@@ -0,0 +1,59 @@
1
+ import { DeferredBase } from './deferredBase.js'
2
+ import { CustomLogger } from '../types/functions.js'
3
+ import { Item, Base } from '../types/types.js'
4
+ import { MemoryCache } from './MemoryCache.js'
5
+
6
+ export class DefermentManager {
7
+ private outstanding: Map<string, DeferredBase> = new Map()
8
+ private logger: CustomLogger
9
+ private disposed = false
10
+ private cache: MemoryCache
11
+
12
+ constructor(cache: MemoryCache, logger: CustomLogger) {
13
+ this.cache = cache
14
+ this.logger = logger
15
+ }
16
+
17
+ defer(params: { id: string }): [Promise<Base>, boolean] {
18
+ if (this.disposed) throw new Error('DefermentManager is disposed')
19
+ const item = this.cache.get(params.id)
20
+ if (item) {
21
+ return [Promise.resolve(item.base!), true]
22
+ }
23
+ const deferredBase = this.outstanding.get(params.id)
24
+ if (deferredBase) {
25
+ return [deferredBase.getPromise(), true]
26
+ }
27
+ const notYetFound = new DeferredBase(params.id)
28
+ this.outstanding.set(params.id, notYetFound)
29
+ return [notYetFound.getPromise(), false]
30
+ }
31
+
32
+ undefer(item: Item, requestItem: (id: string) => void): void {
33
+ if (this.disposed) throw new Error('DefermentManager is disposed')
34
+ const base = item.base
35
+ if (!base) {
36
+ this.logger('undefer called with no base', item)
37
+ return
38
+ }
39
+ this.cache.add(item, (id) => {
40
+ if (!this.outstanding.has(id)) {
41
+ requestItem(id)
42
+ }
43
+ })
44
+
45
+ //order matters here with found before undefer
46
+ const deferredBase = this.outstanding.get(item.baseId)
47
+ if (deferredBase) {
48
+ deferredBase.found(base)
49
+ this.outstanding.delete(item.baseId)
50
+ }
51
+ }
52
+
53
+ dispose(): void {
54
+ if (this.disposed) return
55
+ this.disposed = true
56
+ this.logger('cleared deferments, left', this.outstanding.size)
57
+ this.outstanding.clear()
58
+ }
59
+ }
@@ -0,0 +1,29 @@
1
+ import { Base } from '../types/types.js'
2
+
3
+ export class DeferredBase {
4
+ private promise: Promise<Base>
5
+ private resolve!: (value: Base) => void
6
+ private reject!: (reason?: Error) => void
7
+
8
+ private readonly id: string
9
+
10
+ constructor(id: string) {
11
+ this.id = id
12
+ this.promise = new Promise<Base>((resolve, reject) => {
13
+ this.resolve = resolve
14
+ this.reject = reject
15
+ })
16
+ }
17
+
18
+ getId(): string {
19
+ return this.id
20
+ }
21
+
22
+ getPromise(): Promise<Base> {
23
+ return this.promise
24
+ }
25
+
26
+ found(value: Base): void {
27
+ this.resolve(value)
28
+ }
29
+ }
package/src/index.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { MemoryDatabase } from './operations/databases/memoryDatabase.js'
2
- export { ObjectLoader2 } from './operations/objectLoader2.js'
3
- export { ObjectLoader2Factory } from './operations/objectLoader2Factory.js'
1
+ export { ObjectLoader2 } from './core/objectLoader2.js'
2
+ export { ObjectLoader2Factory } from './core/objectLoader2Factory.js'
3
+ export { getFeatureFlag, ObjectLoader2Flags } from './types/functions.js'
@@ -8,13 +8,17 @@ export default class AggregateQueue<T> implements Queue<T> {
8
8
  this.#queue1 = queue1
9
9
  this.#queue2 = queue2
10
10
  }
11
+ async disposeAsync(): Promise<void> {
12
+ await this.#queue1.disposeAsync()
13
+ await this.#queue2.disposeAsync()
14
+ }
11
15
 
12
16
  add(value: T): void {
13
17
  this.#queue1.add(value)
14
18
  this.#queue2.add(value)
15
19
  }
16
20
 
17
- values(): T[] {
21
+ values(): never {
18
22
  throw new Error('Not implemented')
19
23
  }
20
24
  }
@@ -29,7 +29,8 @@ export default class AsyncGeneratorQueue<T> implements Queue<T> {
29
29
  }
30
30
  }
31
31
  }
32
- dispose(): void {
32
+ disposeAsync(): Promise<void> {
33
33
  this.#finished = true
34
+ return Promise.resolve()
34
35
  }
35
36
  }
@@ -1,4 +1,6 @@
1
- export default class BatchedPool<T> {
1
+ import Queue from './queue.js'
2
+
3
+ export default class BatchedPool<T> implements Queue<T> {
2
4
  #queue: T[] = []
3
5
  #concurrencyAndSizes: number[]
4
6
  #processFunction: (batch: T[]) => Promise<void>
@@ -0,0 +1,74 @@
1
+ import { describe, test, expect, vi } from 'vitest'
2
+ import BatchingQueue from './batchingQueue.js'
3
+
4
+ describe('BatchingQueue disposal', () => {
5
+ test('should drain the queue on dispose', async () => {
6
+ const processFunction = vi.fn().mockResolvedValue(undefined)
7
+ const queue = new BatchingQueue<{ id: string }>({
8
+ batchSize: 5,
9
+ maxWaitTime: 1000,
10
+ processFunction
11
+ })
12
+
13
+ const items = Array.from({ length: 3 }, (_, i) => ({ id: `item-${i}` }))
14
+ items.forEach((item) => queue.add(item.id, item))
15
+
16
+ expect(queue.count()).toBe(3)
17
+
18
+ await queue.disposeAsync()
19
+
20
+ expect(processFunction).toHaveBeenCalledWith(items)
21
+ expect(queue.count()).toBe(0)
22
+ expect(queue.isDisposed()).toBe(true)
23
+ })
24
+
25
+ test('should wait for processing to finish before disposing', async () => {
26
+ let resolveProcess: (value: void | PromiseLike<void>) => void = () => {}
27
+ const processPromise = new Promise<void>((resolve) => {
28
+ resolveProcess = resolve
29
+ })
30
+
31
+ const processFunction = vi.fn().mockImplementation(() => processPromise)
32
+
33
+ const queue = new BatchingQueue<{ id: string }>({
34
+ batchSize: 2,
35
+ maxWaitTime: 100,
36
+ processFunction
37
+ })
38
+
39
+ const items1 = [{ id: 'item-1' }, { id: 'item-2' }]
40
+ items1.forEach((item) => queue.add(item.id, item))
41
+
42
+ // First batch is processing
43
+ expect(processFunction).toHaveBeenCalledWith(items1)
44
+
45
+ const items2 = [{ id: 'item-3' }]
46
+ items2.forEach((item) => queue.add(item.id, item))
47
+
48
+ const disposePromise = queue.disposeAsync()
49
+
50
+ // Queue should be disposed now, but processing is still ongoing
51
+ expect(queue.isDisposed()).toBe(true)
52
+ resolveProcess()
53
+ await disposePromise
54
+
55
+ expect(processFunction).toHaveBeenCalledTimes(2)
56
+ expect(processFunction).toHaveBeenCalledWith(items2)
57
+ expect(queue.count()).toBe(0)
58
+ expect(queue.isDisposed()).toBe(true)
59
+ })
60
+
61
+ test('adding items after dispose should do nothing', async () => {
62
+ const processFunction = vi.fn().mockResolvedValue(undefined)
63
+ const queue = new BatchingQueue<string>({
64
+ batchSize: 5,
65
+ maxWaitTime: 1000,
66
+ processFunction
67
+ })
68
+
69
+ await queue.disposeAsync()
70
+ queue.add('key1', 'item1')
71
+ expect(queue.count()).toBe(0)
72
+ expect(processFunction).not.toHaveBeenCalled()
73
+ })
74
+ })