@speckle/objectloader2 2.25.7 → 2.25.9

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 (414) hide show
  1. package/dist/commonjs/{operations → core}/interfaces.d.ts +2 -2
  2. package/dist/commonjs/core/interfaces.d.ts.map +1 -0
  3. package/dist/commonjs/core/interfaces.js.map +1 -0
  4. package/dist/commonjs/{operations → 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/{operations → core}/objectLoader2Factory.d.ts +4 -2
  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 -9
  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/{esm/operations/databases → commonjs/core/stages/memory}/memoryDatabase.d.ts +4 -4
  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 -1
  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/core/stages/memory/memoryDownloader.js.map +1 -0
  38. package/dist/{esm/operations/downloaders → commonjs/core/stages}/serverDownloader.d.ts +4 -5
  39. package/dist/commonjs/core/stages/serverDownloader.d.ts.map +1 -0
  40. package/dist/commonjs/{operations/downloaders → core/stages}/serverDownloader.js +81 -31
  41. package/dist/commonjs/core/stages/serverDownloader.js.map +1 -0
  42. package/dist/commonjs/core/traverser.d.ts.map +1 -0
  43. package/dist/commonjs/{operations → core}/traverser.js +7 -7
  44. package/dist/commonjs/core/traverser.js.map +1 -0
  45. package/dist/commonjs/deferment/MemoryCache.d.ts +35 -0
  46. package/dist/commonjs/deferment/MemoryCache.d.ts.map +1 -0
  47. package/dist/commonjs/deferment/MemoryCache.js +162 -0
  48. package/dist/commonjs/deferment/MemoryCache.js.map +1 -0
  49. package/dist/commonjs/deferment/MemoryCache.test.d.ts +2 -0
  50. package/dist/commonjs/deferment/MemoryCache.test.d.ts.map +1 -0
  51. package/dist/commonjs/deferment/MemoryCache.test.js +153 -0
  52. package/dist/commonjs/deferment/MemoryCache.test.js.map +1 -0
  53. package/dist/commonjs/deferment/defermentManager.d.ts +16 -0
  54. package/dist/commonjs/deferment/defermentManager.d.ts.map +1 -0
  55. package/dist/commonjs/deferment/defermentManager.js +58 -0
  56. package/dist/commonjs/deferment/defermentManager.js.map +1 -0
  57. package/dist/commonjs/deferment/defermentManager.test.d.ts +2 -0
  58. package/dist/commonjs/deferment/defermentManager.test.d.ts.map +1 -0
  59. package/dist/commonjs/deferment/defermentManager.test.js +188 -0
  60. package/dist/commonjs/deferment/defermentManager.test.js.map +1 -0
  61. package/dist/commonjs/deferment/deferredBase.d.ts +12 -0
  62. package/dist/commonjs/deferment/deferredBase.d.ts.map +1 -0
  63. package/dist/commonjs/deferment/deferredBase.js +27 -0
  64. package/dist/commonjs/deferment/deferredBase.js.map +1 -0
  65. package/dist/commonjs/index.d.ts +3 -2
  66. package/dist/commonjs/index.d.ts.map +1 -1
  67. package/dist/commonjs/index.js +6 -3
  68. package/dist/commonjs/index.js.map +1 -1
  69. package/dist/commonjs/{helpers → queues}/aggregateQueue.d.ts +2 -1
  70. package/dist/commonjs/queues/aggregateQueue.d.ts.map +1 -0
  71. package/dist/commonjs/{helpers → queues}/aggregateQueue.js +4 -0
  72. package/dist/commonjs/queues/aggregateQueue.js.map +1 -0
  73. package/dist/{esm/helpers → commonjs/queues}/asyncGeneratorQueue.d.ts +1 -1
  74. package/dist/commonjs/queues/asyncGeneratorQueue.d.ts.map +1 -0
  75. package/dist/commonjs/{helpers → queues}/asyncGeneratorQueue.js +2 -1
  76. package/dist/commonjs/queues/asyncGeneratorQueue.js.map +1 -0
  77. package/dist/{esm/helpers → commonjs/queues}/batchedPool.d.ts +2 -1
  78. package/dist/commonjs/queues/batchedPool.d.ts.map +1 -0
  79. package/dist/commonjs/queues/batchedPool.js.map +1 -0
  80. package/dist/{esm/helpers → commonjs/queues}/batchingQueue.d.ts +4 -1
  81. package/dist/commonjs/queues/batchingQueue.d.ts.map +1 -0
  82. package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts +2 -0
  83. package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts.map +1 -0
  84. package/dist/commonjs/queues/batchingQueue.dispose.test.js +64 -0
  85. package/dist/commonjs/queues/batchingQueue.dispose.test.js.map +1 -0
  86. package/dist/commonjs/queues/batchingQueue.js +123 -0
  87. package/dist/commonjs/queues/batchingQueue.js.map +1 -0
  88. package/dist/commonjs/queues/batchingQueue.test.d.ts +2 -0
  89. package/dist/commonjs/queues/batchingQueue.test.d.ts.map +1 -0
  90. package/dist/commonjs/queues/batchingQueue.test.js +138 -0
  91. package/dist/commonjs/queues/batchingQueue.test.js.map +1 -0
  92. package/dist/{esm/helpers → commonjs/queues}/bufferQueue.d.ts +1 -0
  93. package/dist/commonjs/queues/bufferQueue.d.ts.map +1 -0
  94. package/dist/commonjs/{helpers → queues}/bufferQueue.js +3 -0
  95. package/dist/commonjs/queues/bufferQueue.js.map +1 -0
  96. package/dist/commonjs/{helpers → queues}/keyedQueue.d.ts +1 -0
  97. package/dist/commonjs/queues/keyedQueue.d.ts.map +1 -0
  98. package/dist/commonjs/{helpers → queues}/keyedQueue.js +11 -0
  99. package/dist/commonjs/queues/keyedQueue.js.map +1 -0
  100. package/dist/commonjs/queues/queue.d.ts +5 -0
  101. package/dist/commonjs/queues/queue.d.ts.map +1 -0
  102. package/dist/commonjs/{helpers → queues}/queue.js.map +1 -1
  103. package/dist/commonjs/types/functions.d.ts +21 -0
  104. package/dist/commonjs/types/functions.d.ts.map +1 -0
  105. package/dist/commonjs/types/functions.js +92 -0
  106. package/dist/commonjs/types/functions.js.map +1 -0
  107. package/dist/commonjs/types/types.d.ts +1 -7
  108. package/dist/commonjs/types/types.d.ts.map +1 -1
  109. package/dist/commonjs/types/types.js +0 -36
  110. package/dist/commonjs/types/types.js.map +1 -1
  111. package/dist/esm/{operations → core}/interfaces.d.ts +2 -2
  112. package/dist/esm/core/interfaces.d.ts.map +1 -0
  113. package/dist/esm/core/interfaces.js.map +1 -0
  114. package/dist/esm/{operations → core}/objectLoader2.d.ts +1 -1
  115. package/dist/esm/core/objectLoader2.d.ts.map +1 -0
  116. package/dist/esm/core/objectLoader2.js +121 -0
  117. package/dist/esm/core/objectLoader2.js.map +1 -0
  118. package/dist/esm/{operations → core}/objectLoader2Factory.d.ts +4 -2
  119. package/dist/esm/core/objectLoader2Factory.d.ts.map +1 -0
  120. package/dist/esm/core/objectLoader2Factory.js +67 -0
  121. package/dist/esm/core/objectLoader2Factory.js.map +1 -0
  122. package/dist/{commonjs/operations → esm/core}/options.d.ts +2 -1
  123. package/dist/esm/core/options.d.ts.map +1 -0
  124. package/dist/esm/{operations → core}/options.js.map +1 -1
  125. package/dist/esm/core/stages/ItemStore.d.ts +37 -0
  126. package/dist/esm/core/stages/ItemStore.d.ts.map +1 -0
  127. package/dist/esm/core/stages/ItemStore.js +163 -0
  128. package/dist/esm/core/stages/ItemStore.js.map +1 -0
  129. package/dist/esm/core/stages/cacheReader.d.ts +18 -0
  130. package/dist/esm/core/stages/cacheReader.d.ts.map +1 -0
  131. package/dist/esm/core/stages/cacheReader.js +65 -0
  132. package/dist/esm/core/stages/cacheReader.js.map +1 -0
  133. package/dist/esm/core/stages/cacheWriter.d.ts +15 -0
  134. package/dist/esm/core/stages/cacheWriter.d.ts.map +1 -0
  135. package/dist/esm/core/stages/cacheWriter.js +43 -0
  136. package/dist/esm/core/stages/cacheWriter.js.map +1 -0
  137. package/dist/esm/{operations/databases → core/stages}/indexedDatabase.d.ts +2 -9
  138. package/dist/esm/core/stages/indexedDatabase.d.ts.map +1 -0
  139. package/dist/esm/core/stages/indexedDatabase.js +28 -0
  140. package/dist/esm/core/stages/indexedDatabase.js.map +1 -0
  141. package/dist/{commonjs/operations/databases → esm/core/stages/memory}/memoryDatabase.d.ts +4 -4
  142. package/dist/esm/core/stages/memory/memoryDatabase.d.ts.map +1 -0
  143. package/dist/esm/{operations/databases → core/stages/memory}/memoryDatabase.js +4 -1
  144. package/dist/esm/core/stages/memory/memoryDatabase.js.map +1 -0
  145. package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +3 -3
  146. package/dist/esm/core/stages/memory/memoryDownloader.d.ts.map +1 -0
  147. package/dist/esm/core/stages/memory/memoryDownloader.js.map +1 -0
  148. package/dist/{commonjs/operations/downloaders → esm/core/stages}/serverDownloader.d.ts +4 -5
  149. package/dist/esm/core/stages/serverDownloader.d.ts.map +1 -0
  150. package/dist/esm/{operations/downloaders → core/stages}/serverDownloader.js +80 -30
  151. package/dist/esm/core/stages/serverDownloader.js.map +1 -0
  152. package/dist/esm/core/traverser.d.ts.map +1 -0
  153. package/dist/esm/{operations → core}/traverser.js +1 -1
  154. package/dist/esm/core/traverser.js.map +1 -0
  155. package/dist/esm/deferment/MemoryCache.d.ts +35 -0
  156. package/dist/esm/deferment/MemoryCache.d.ts.map +1 -0
  157. package/dist/esm/deferment/MemoryCache.js +157 -0
  158. package/dist/esm/deferment/MemoryCache.js.map +1 -0
  159. package/dist/esm/deferment/MemoryCache.test.d.ts +2 -0
  160. package/dist/esm/deferment/MemoryCache.test.d.ts.map +1 -0
  161. package/dist/esm/deferment/MemoryCache.test.js +151 -0
  162. package/dist/esm/deferment/MemoryCache.test.js.map +1 -0
  163. package/dist/esm/deferment/defermentManager.d.ts +16 -0
  164. package/dist/esm/deferment/defermentManager.d.ts.map +1 -0
  165. package/dist/esm/deferment/defermentManager.js +54 -0
  166. package/dist/esm/deferment/defermentManager.js.map +1 -0
  167. package/dist/esm/deferment/defermentManager.test.d.ts +2 -0
  168. package/dist/esm/deferment/defermentManager.test.d.ts.map +1 -0
  169. package/dist/esm/deferment/defermentManager.test.js +186 -0
  170. package/dist/esm/deferment/defermentManager.test.js.map +1 -0
  171. package/dist/esm/deferment/deferredBase.d.ts +12 -0
  172. package/dist/esm/deferment/deferredBase.d.ts.map +1 -0
  173. package/dist/esm/deferment/deferredBase.js +23 -0
  174. package/dist/esm/deferment/deferredBase.js.map +1 -0
  175. package/dist/esm/index.d.ts +3 -2
  176. package/dist/esm/index.d.ts.map +1 -1
  177. package/dist/esm/index.js +3 -2
  178. package/dist/esm/index.js.map +1 -1
  179. package/dist/esm/{helpers → queues}/aggregateQueue.d.ts +2 -1
  180. package/dist/esm/queues/aggregateQueue.d.ts.map +1 -0
  181. package/dist/esm/{helpers → queues}/aggregateQueue.js +4 -0
  182. package/dist/esm/queues/aggregateQueue.js.map +1 -0
  183. package/dist/{commonjs/helpers → esm/queues}/asyncGeneratorQueue.d.ts +1 -1
  184. package/dist/esm/queues/asyncGeneratorQueue.d.ts.map +1 -0
  185. package/dist/esm/{helpers → queues}/asyncGeneratorQueue.js +2 -1
  186. package/dist/esm/queues/asyncGeneratorQueue.js.map +1 -0
  187. package/dist/{commonjs/helpers → esm/queues}/batchedPool.d.ts +2 -1
  188. package/dist/esm/queues/batchedPool.d.ts.map +1 -0
  189. package/dist/esm/queues/batchedPool.js.map +1 -0
  190. package/dist/{commonjs/helpers → esm/queues}/batchingQueue.d.ts +4 -1
  191. package/dist/esm/queues/batchingQueue.d.ts.map +1 -0
  192. package/dist/esm/queues/batchingQueue.dispose.test.d.ts +2 -0
  193. package/dist/esm/queues/batchingQueue.dispose.test.d.ts.map +1 -0
  194. package/dist/esm/queues/batchingQueue.dispose.test.js +59 -0
  195. package/dist/esm/queues/batchingQueue.dispose.test.js.map +1 -0
  196. package/dist/esm/queues/batchingQueue.js +117 -0
  197. package/dist/esm/queues/batchingQueue.js.map +1 -0
  198. package/dist/esm/queues/batchingQueue.test.d.ts +2 -0
  199. package/dist/esm/queues/batchingQueue.test.d.ts.map +1 -0
  200. package/dist/esm/queues/batchingQueue.test.js +133 -0
  201. package/dist/esm/queues/batchingQueue.test.js.map +1 -0
  202. package/dist/{commonjs/helpers → esm/queues}/bufferQueue.d.ts +1 -0
  203. package/dist/esm/queues/bufferQueue.d.ts.map +1 -0
  204. package/dist/esm/{helpers → queues}/bufferQueue.js +3 -0
  205. package/dist/esm/queues/bufferQueue.js.map +1 -0
  206. package/dist/esm/{helpers → queues}/keyedQueue.d.ts +1 -0
  207. package/dist/esm/queues/keyedQueue.d.ts.map +1 -0
  208. package/dist/esm/{helpers → queues}/keyedQueue.js +11 -0
  209. package/dist/esm/queues/keyedQueue.js.map +1 -0
  210. package/dist/esm/queues/queue.d.ts +5 -0
  211. package/dist/esm/queues/queue.d.ts.map +1 -0
  212. package/dist/esm/{helpers → queues}/queue.js.map +1 -1
  213. package/dist/esm/types/functions.d.ts +21 -0
  214. package/dist/esm/types/functions.d.ts.map +1 -0
  215. package/dist/esm/types/functions.js +83 -0
  216. package/dist/esm/types/functions.js.map +1 -0
  217. package/dist/esm/types/types.d.ts +1 -7
  218. package/dist/esm/types/types.d.ts.map +1 -1
  219. package/dist/esm/types/types.js +1 -32
  220. package/dist/esm/types/types.js.map +1 -1
  221. package/package.json +2 -3
  222. package/readme.md +64 -16
  223. package/src/{operations → core}/interfaces.ts +2 -2
  224. package/src/{operations → core}/objectLoader2.spec.ts +22 -9
  225. package/src/core/objectLoader2.ts +162 -0
  226. package/src/core/objectLoader2Factory.ts +87 -0
  227. package/src/{operations → core}/options.ts +2 -1
  228. package/src/core/stages/ItemStore.ts +196 -0
  229. package/src/{operations/databases → core/stages}/__snapshots__/indexedDatabase.spec.ts.snap +4 -4
  230. package/src/{operations/downloaders → core/stages}/__snapshots__/serverDownloader.spec.ts.snap +25 -0
  231. package/src/{helpers → core/stages}/cacheReader.spec.ts +12 -7
  232. package/src/core/stages/cacheReader.ts +88 -0
  233. package/src/core/stages/cacheWriter.spec.ts +213 -0
  234. package/src/core/stages/cacheWriter.ts +64 -0
  235. package/src/{operations/databases → core/stages}/indexedDatabase.spec.ts +7 -3
  236. package/src/core/stages/indexedDatabase.ts +49 -0
  237. package/src/{operations/databases → core/stages/memory}/memoryDatabase.spec.ts +5 -5
  238. package/src/{operations/databases → core/stages/memory}/memoryDatabase.ts +7 -4
  239. package/src/{operations/downloaders → core/stages/memory}/memoryDownloader.spec.ts +3 -3
  240. package/src/{operations/downloaders → core/stages/memory}/memoryDownloader.ts +3 -3
  241. package/src/{operations/downloaders → core/stages}/serverDownloader.spec.ts +102 -11
  242. package/src/{operations/downloaders → core/stages}/serverDownloader.ts +87 -30
  243. package/src/{operations → core}/traverser.ts +2 -1
  244. package/src/deferment/MemoryCache.test.ts +187 -0
  245. package/src/deferment/MemoryCache.ts +189 -0
  246. package/src/deferment/defermentManager.test.ts +220 -0
  247. package/src/deferment/defermentManager.ts +59 -0
  248. package/src/deferment/deferredBase.ts +29 -0
  249. package/src/index.ts +3 -2
  250. package/src/{helpers → queues}/aggregateQueue.ts +5 -1
  251. package/src/{helpers → queues}/asyncGeneratorQueue.ts +2 -1
  252. package/src/{helpers → queues}/batchedPool.ts +3 -1
  253. package/src/queues/batchingQueue.dispose.test.ts +74 -0
  254. package/src/queues/batchingQueue.test.ts +149 -0
  255. package/src/queues/batchingQueue.ts +138 -0
  256. package/src/{helpers → queues}/bufferQueue.ts +3 -0
  257. package/src/{helpers → queues}/keyedQueue.ts +12 -0
  258. package/src/{helpers → queues}/queue.ts +1 -0
  259. package/src/test/e2e.spec.ts +2 -2
  260. package/src/types/functions.spec.ts +155 -0
  261. package/src/types/functions.ts +118 -0
  262. package/src/types/types.ts +1 -51
  263. package/dist/commonjs/helpers/aggregateQueue.d.ts.map +0 -1
  264. package/dist/commonjs/helpers/aggregateQueue.js.map +0 -1
  265. package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts.map +0 -1
  266. package/dist/commonjs/helpers/asyncGeneratorQueue.js.map +0 -1
  267. package/dist/commonjs/helpers/batchedPool.d.ts.map +0 -1
  268. package/dist/commonjs/helpers/batchedPool.js.map +0 -1
  269. package/dist/commonjs/helpers/batchingQueue.d.ts.map +0 -1
  270. package/dist/commonjs/helpers/batchingQueue.js +0 -77
  271. package/dist/commonjs/helpers/batchingQueue.js.map +0 -1
  272. package/dist/commonjs/helpers/bufferQueue.d.ts.map +0 -1
  273. package/dist/commonjs/helpers/bufferQueue.js.map +0 -1
  274. package/dist/commonjs/helpers/cachePump.d.ts +0 -22
  275. package/dist/commonjs/helpers/cachePump.d.ts.map +0 -1
  276. package/dist/commonjs/helpers/cachePump.js +0 -86
  277. package/dist/commonjs/helpers/cachePump.js.map +0 -1
  278. package/dist/commonjs/helpers/cacheReader.d.ts +0 -14
  279. package/dist/commonjs/helpers/cacheReader.d.ts.map +0 -1
  280. package/dist/commonjs/helpers/cacheReader.js +0 -58
  281. package/dist/commonjs/helpers/cacheReader.js.map +0 -1
  282. package/dist/commonjs/helpers/defermentManager.d.ts +0 -28
  283. package/dist/commonjs/helpers/defermentManager.d.ts.map +0 -1
  284. package/dist/commonjs/helpers/defermentManager.js +0 -150
  285. package/dist/commonjs/helpers/defermentManager.js.map +0 -1
  286. package/dist/commonjs/helpers/deferredBase.d.ts +0 -19
  287. package/dist/commonjs/helpers/deferredBase.d.ts.map +0 -1
  288. package/dist/commonjs/helpers/deferredBase.js +0 -51
  289. package/dist/commonjs/helpers/deferredBase.js.map +0 -1
  290. package/dist/commonjs/helpers/keyedQueue.d.ts.map +0 -1
  291. package/dist/commonjs/helpers/keyedQueue.js.map +0 -1
  292. package/dist/commonjs/helpers/memoryPump.d.ts +0 -15
  293. package/dist/commonjs/helpers/memoryPump.d.ts.map +0 -1
  294. package/dist/commonjs/helpers/memoryPump.js +0 -34
  295. package/dist/commonjs/helpers/memoryPump.js.map +0 -1
  296. package/dist/commonjs/helpers/pump.d.ts +0 -8
  297. package/dist/commonjs/helpers/pump.d.ts.map +0 -1
  298. package/dist/commonjs/helpers/pump.js +0 -3
  299. package/dist/commonjs/helpers/pump.js.map +0 -1
  300. package/dist/commonjs/helpers/queue.d.ts +0 -4
  301. package/dist/commonjs/helpers/queue.d.ts.map +0 -1
  302. package/dist/commonjs/operations/databases/indexedDatabase.d.ts.map +0 -1
  303. package/dist/commonjs/operations/databases/indexedDatabase.js +0 -98
  304. package/dist/commonjs/operations/databases/indexedDatabase.js.map +0 -1
  305. package/dist/commonjs/operations/databases/memoryDatabase.d.ts.map +0 -1
  306. package/dist/commonjs/operations/databases/memoryDatabase.js.map +0 -1
  307. package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts.map +0 -1
  308. package/dist/commonjs/operations/downloaders/memoryDownloader.js.map +0 -1
  309. package/dist/commonjs/operations/downloaders/serverDownloader.d.ts.map +0 -1
  310. package/dist/commonjs/operations/downloaders/serverDownloader.js.map +0 -1
  311. package/dist/commonjs/operations/interfaces.d.ts.map +0 -1
  312. package/dist/commonjs/operations/interfaces.js.map +0 -1
  313. package/dist/commonjs/operations/objectLoader2.d.ts.map +0 -1
  314. package/dist/commonjs/operations/objectLoader2.js +0 -101
  315. package/dist/commonjs/operations/objectLoader2.js.map +0 -1
  316. package/dist/commonjs/operations/objectLoader2Factory.d.ts.map +0 -1
  317. package/dist/commonjs/operations/objectLoader2Factory.js +0 -68
  318. package/dist/commonjs/operations/objectLoader2Factory.js.map +0 -1
  319. package/dist/commonjs/operations/options.d.ts.map +0 -1
  320. package/dist/commonjs/operations/traverser.d.ts.map +0 -1
  321. package/dist/commonjs/operations/traverser.js.map +0 -1
  322. package/dist/esm/helpers/aggregateQueue.d.ts.map +0 -1
  323. package/dist/esm/helpers/aggregateQueue.js.map +0 -1
  324. package/dist/esm/helpers/asyncGeneratorQueue.d.ts.map +0 -1
  325. package/dist/esm/helpers/asyncGeneratorQueue.js.map +0 -1
  326. package/dist/esm/helpers/batchedPool.d.ts.map +0 -1
  327. package/dist/esm/helpers/batchedPool.js.map +0 -1
  328. package/dist/esm/helpers/batchingQueue.d.ts.map +0 -1
  329. package/dist/esm/helpers/batchingQueue.js +0 -71
  330. package/dist/esm/helpers/batchingQueue.js.map +0 -1
  331. package/dist/esm/helpers/bufferQueue.d.ts.map +0 -1
  332. package/dist/esm/helpers/bufferQueue.js.map +0 -1
  333. package/dist/esm/helpers/cachePump.d.ts +0 -22
  334. package/dist/esm/helpers/cachePump.d.ts.map +0 -1
  335. package/dist/esm/helpers/cachePump.js +0 -79
  336. package/dist/esm/helpers/cachePump.js.map +0 -1
  337. package/dist/esm/helpers/cacheReader.d.ts +0 -14
  338. package/dist/esm/helpers/cacheReader.d.ts.map +0 -1
  339. package/dist/esm/helpers/cacheReader.js +0 -51
  340. package/dist/esm/helpers/cacheReader.js.map +0 -1
  341. package/dist/esm/helpers/defermentManager.d.ts +0 -28
  342. package/dist/esm/helpers/defermentManager.d.ts.map +0 -1
  343. package/dist/esm/helpers/defermentManager.js +0 -146
  344. package/dist/esm/helpers/defermentManager.js.map +0 -1
  345. package/dist/esm/helpers/deferredBase.d.ts +0 -19
  346. package/dist/esm/helpers/deferredBase.d.ts.map +0 -1
  347. package/dist/esm/helpers/deferredBase.js +0 -47
  348. package/dist/esm/helpers/deferredBase.js.map +0 -1
  349. package/dist/esm/helpers/keyedQueue.d.ts.map +0 -1
  350. package/dist/esm/helpers/keyedQueue.js.map +0 -1
  351. package/dist/esm/helpers/memoryPump.d.ts +0 -15
  352. package/dist/esm/helpers/memoryPump.d.ts.map +0 -1
  353. package/dist/esm/helpers/memoryPump.js +0 -30
  354. package/dist/esm/helpers/memoryPump.js.map +0 -1
  355. package/dist/esm/helpers/pump.d.ts +0 -8
  356. package/dist/esm/helpers/pump.d.ts.map +0 -1
  357. package/dist/esm/helpers/pump.js +0 -2
  358. package/dist/esm/helpers/pump.js.map +0 -1
  359. package/dist/esm/helpers/queue.d.ts +0 -4
  360. package/dist/esm/helpers/queue.d.ts.map +0 -1
  361. package/dist/esm/operations/databases/indexedDatabase.d.ts.map +0 -1
  362. package/dist/esm/operations/databases/indexedDatabase.js +0 -93
  363. package/dist/esm/operations/databases/indexedDatabase.js.map +0 -1
  364. package/dist/esm/operations/databases/memoryDatabase.d.ts.map +0 -1
  365. package/dist/esm/operations/databases/memoryDatabase.js.map +0 -1
  366. package/dist/esm/operations/downloaders/memoryDownloader.d.ts.map +0 -1
  367. package/dist/esm/operations/downloaders/memoryDownloader.js.map +0 -1
  368. package/dist/esm/operations/downloaders/serverDownloader.d.ts.map +0 -1
  369. package/dist/esm/operations/downloaders/serverDownloader.js.map +0 -1
  370. package/dist/esm/operations/interfaces.d.ts.map +0 -1
  371. package/dist/esm/operations/interfaces.js.map +0 -1
  372. package/dist/esm/operations/objectLoader2.d.ts.map +0 -1
  373. package/dist/esm/operations/objectLoader2.js +0 -94
  374. package/dist/esm/operations/objectLoader2.js.map +0 -1
  375. package/dist/esm/operations/objectLoader2Factory.d.ts.map +0 -1
  376. package/dist/esm/operations/objectLoader2Factory.js +0 -61
  377. package/dist/esm/operations/objectLoader2Factory.js.map +0 -1
  378. package/dist/esm/operations/options.d.ts.map +0 -1
  379. package/dist/esm/operations/traverser.d.ts.map +0 -1
  380. package/dist/esm/operations/traverser.js.map +0 -1
  381. package/src/helpers/__snapshots__/cachePump.spec.ts.snap +0 -31
  382. package/src/helpers/__snapshots__/defermentManager.spec.ts.snap +0 -8
  383. package/src/helpers/batchingQueue.ts +0 -85
  384. package/src/helpers/cachePump.disposal.spec.ts +0 -51
  385. package/src/helpers/cachePump.spec.ts +0 -104
  386. package/src/helpers/cachePump.ts +0 -107
  387. package/src/helpers/cacheReader.ts +0 -64
  388. package/src/helpers/defermentManager.defermentTotals.spec.ts +0 -53
  389. package/src/helpers/defermentManager.disposal.spec.ts +0 -28
  390. package/src/helpers/defermentManager.spec.ts +0 -37
  391. package/src/helpers/defermentManager.ts +0 -160
  392. package/src/helpers/deferredBase.ts +0 -55
  393. package/src/helpers/memoryPump.ts +0 -40
  394. package/src/helpers/pump.ts +0 -8
  395. package/src/operations/databases/indexedDatabase.ts +0 -126
  396. package/src/operations/objectLoader2.ts +0 -119
  397. package/src/operations/objectLoader2Factory.ts +0 -78
  398. package/dist/commonjs/{operations → core}/interfaces.js +0 -0
  399. package/dist/commonjs/{operations → core}/options.js +0 -0
  400. package/dist/commonjs/{operations/downloaders → core/stages/memory}/memoryDownloader.js +0 -0
  401. package/dist/commonjs/{operations → core}/traverser.d.ts +0 -0
  402. package/dist/commonjs/{helpers → queues}/batchedPool.js +0 -0
  403. package/dist/commonjs/{helpers → queues}/queue.js +0 -0
  404. package/dist/esm/{operations → core}/interfaces.js +0 -0
  405. package/dist/esm/{operations → core}/options.js +0 -0
  406. package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.js +0 -0
  407. package/dist/esm/{operations → core}/traverser.d.ts +0 -0
  408. package/dist/esm/{helpers → queues}/batchedPool.js +0 -0
  409. package/dist/esm/{helpers → queues}/queue.js +0 -0
  410. package/src/{operations → core}/__snapshots__/objectLoader2.spec.ts.snap +0 -0
  411. package/src/{operations → core}/__snapshots__/traverser.spec.ts.snap +0 -0
  412. package/src/{helpers → core/stages}/__snapshots__/cacheReader.spec.ts.snap +0 -0
  413. package/src/{operations/downloaders → core/stages/memory}/__snapshots__/memoryDownloader.spec.ts.snap +0 -0
  414. package/src/{operations → core}/traverser.spec.ts +1 -1
@@ -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,2 +1,3 @@
1
- export { ObjectLoader2 } from './operations/objectLoader2.js'
2
- 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
+ })
@@ -0,0 +1,149 @@
1
+ import { describe, test, expect, vi } from 'vitest'
2
+ import BatchingQueue from './batchingQueue.js'
3
+
4
+ describe('BatchingQueue', () => {
5
+ test('should add items and process them in batches', async () => {
6
+ const processSpy = vi.fn()
7
+ const queue = new BatchingQueue({
8
+ batchSize: 2,
9
+ maxWaitTime: 100,
10
+ processFunction: async (batch: string[]): Promise<void> => {
11
+ await new Promise((resolve) => setTimeout(resolve, 0))
12
+ processSpy(batch)
13
+ }
14
+ })
15
+
16
+ try {
17
+ queue.add('key1', 'item1')
18
+ queue.add('key2', 'item2')
19
+
20
+ await new Promise((resolve) => setTimeout(resolve, 200))
21
+
22
+ expect(processSpy).toHaveBeenCalledTimes(1)
23
+ expect(processSpy).toHaveBeenCalledWith(['item1', 'item2'])
24
+ } finally {
25
+ await queue.disposeAsync()
26
+ }
27
+ })
28
+
29
+ test('should process items after timeout if batch size is not reached', async () => {
30
+ const processSpy = vi.fn()
31
+ const queue = new BatchingQueue({
32
+ batchSize: 5,
33
+ maxWaitTime: 100,
34
+ processFunction: async (batch: string[]): Promise<void> => {
35
+ await new Promise((resolve) => setTimeout(resolve, 0))
36
+ processSpy(batch)
37
+ }
38
+ })
39
+
40
+ try {
41
+ queue.add('key1', 'item1')
42
+ queue.add('key2', 'item2')
43
+
44
+ await new Promise((resolve) => setTimeout(resolve, 200))
45
+
46
+ expect(processSpy).toHaveBeenCalledTimes(1)
47
+ expect(processSpy).toHaveBeenCalledWith(['item1', 'item2'])
48
+ } finally {
49
+ await queue.disposeAsync()
50
+ }
51
+ })
52
+
53
+ test('should handle multiple batches correctly', async () => {
54
+ const processSpy = vi.fn()
55
+ const queue = new BatchingQueue({
56
+ batchSize: 2,
57
+ maxWaitTime: 100,
58
+ processFunction: async (batch: string[]): Promise<void> => {
59
+ await new Promise((resolve) => setTimeout(resolve, 0))
60
+ processSpy(batch)
61
+ }
62
+ })
63
+
64
+ try {
65
+ queue.add('key1', 'item1')
66
+ queue.add('key2', 'item2')
67
+ queue.add('key3', 'item3')
68
+ queue.add('key4', 'item4')
69
+
70
+ await new Promise((resolve) => setTimeout(resolve, 200))
71
+
72
+ expect(processSpy).toHaveBeenCalledTimes(2)
73
+ expect(processSpy).toHaveBeenCalledWith(['item1', 'item2'])
74
+ expect(processSpy).toHaveBeenCalledWith(['item3', 'item4'])
75
+ } finally {
76
+ await queue.disposeAsync()
77
+ }
78
+ })
79
+
80
+ test('should retrieve items by key', async () => {
81
+ const queue = new BatchingQueue<string>({
82
+ batchSize: 3,
83
+ maxWaitTime: 100,
84
+ processFunction: async (): Promise<void> => {
85
+ await new Promise((resolve) => setTimeout(resolve, 0))
86
+ }
87
+ })
88
+ try {
89
+ queue.add('key1', 'item1')
90
+ queue.add('key2', 'item2')
91
+
92
+ expect(queue.get('key1')).toBe('item1')
93
+ expect(queue.get('key2')).toBe('item2')
94
+ expect(queue.get('key3')).toBeUndefined()
95
+ } finally {
96
+ await queue.disposeAsync()
97
+ }
98
+ })
99
+
100
+ test('should return correct count of items', async () => {
101
+ const queue = new BatchingQueue<string>({
102
+ batchSize: 3,
103
+ maxWaitTime: 100,
104
+ processFunction: async (): Promise<void> => {
105
+ await new Promise((resolve) => setTimeout(resolve, 0))
106
+ }
107
+ })
108
+ try {
109
+ expect(queue.count()).toBe(0)
110
+
111
+ queue.add('key1', 'item1')
112
+ queue.add('key2', 'item2')
113
+
114
+ expect(queue.count()).toBe(2)
115
+ } finally {
116
+ await queue.disposeAsync()
117
+ }
118
+ })
119
+
120
+ test('should not process items if already processing', async () => {
121
+ const processSpy = vi.fn()
122
+ const queue = new BatchingQueue({
123
+ batchSize: 2,
124
+ maxWaitTime: 100,
125
+ processFunction: async (batch: string[]): Promise<void> => {
126
+ processSpy(batch)
127
+ await new Promise((resolve) => setTimeout(resolve, 300))
128
+ }
129
+ })
130
+
131
+ try {
132
+ queue.add('key1', 'item1')
133
+ queue.add('key2', 'item2')
134
+ queue.add('key3', 'item3')
135
+
136
+ await new Promise((resolve) => setTimeout(resolve, 200))
137
+
138
+ expect(processSpy).toHaveBeenCalledTimes(1)
139
+ expect(processSpy).toHaveBeenCalledWith(['item1', 'item2'])
140
+
141
+ await new Promise((resolve) => setTimeout(resolve, 500))
142
+
143
+ expect(processSpy).toHaveBeenCalledTimes(2)
144
+ expect(processSpy).toHaveBeenCalledWith(['item3'])
145
+ } finally {
146
+ await queue.disposeAsync()
147
+ }
148
+ })
149
+ })