@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,162 @@
1
+ import { MemoryCache } from '../deferment/MemoryCache.js'
2
+ import { DefermentManager } from '../deferment/defermentManager.js'
3
+ import AggregateQueue from '../queues/aggregateQueue.js'
4
+ import AsyncGeneratorQueue from '../queues/asyncGeneratorQueue.js'
5
+ import { CustomLogger, take } from '../types/functions.js'
6
+ import { Item, Base } from '../types/types.js'
7
+ import { Database, Downloader } from './interfaces.js'
8
+ import { ObjectLoader2Factory } from './objectLoader2Factory.js'
9
+ import { ObjectLoader2Options, CacheOptions } from './options.js'
10
+ import { CacheReader } from './stages/cacheReader.js'
11
+ import { CacheWriter } from './stages/cacheWriter.js'
12
+
13
+ const MAX_CLOSURES_TO_TAKE = 100
14
+ const EXPECTED_CLOSURE_VALUE = 100
15
+
16
+ export class ObjectLoader2 {
17
+ #rootId: string
18
+
19
+ #logger: CustomLogger
20
+
21
+ #database: Database
22
+ #downloader: Downloader
23
+ #cacheReader: CacheReader
24
+ #cacheWriter: CacheWriter
25
+
26
+ #deferments: DefermentManager
27
+ #cache: MemoryCache
28
+
29
+ #gathered: AsyncGeneratorQueue<Item>
30
+
31
+ #root?: Item = undefined
32
+ #isRootStored = false
33
+
34
+ constructor(options: ObjectLoader2Options) {
35
+ this.#rootId = options.rootId
36
+ this.#logger = options.logger || ((): void => {})
37
+ this.#logger('ObjectLoader2 initialized with rootId:', this.#rootId)
38
+
39
+ const cacheOptions: CacheOptions = {
40
+ logger: this.#logger,
41
+ maxCacheReadSize: 10_000,
42
+ maxCacheWriteSize: 10_000,
43
+ maxWriteQueueSize: 40_000,
44
+ maxCacheBatchWriteWait: 100, //100 ms, next to nothing!
45
+ maxCacheBatchReadWait: 100 //100 ms, next to nothing!
46
+ }
47
+
48
+ this.#gathered = new AsyncGeneratorQueue()
49
+
50
+ this.#database = options.database
51
+ this.#cache = new MemoryCache(
52
+ {
53
+ maxSizeInMb: 500, // 500 MB
54
+ ttlms: 5_000 // 5 seconds
55
+ },
56
+ this.#logger
57
+ )
58
+ this.#deferments = new DefermentManager(this.#cache, this.#logger)
59
+ this.#downloader = options.downloader
60
+ this.#cacheReader = new CacheReader(
61
+ this.#database,
62
+ this.#deferments,
63
+ this.#logger,
64
+ cacheOptions
65
+ )
66
+ this.#cacheReader.initializeQueue(this.#gathered, this.#downloader)
67
+ this.#cacheWriter = new CacheWriter(
68
+ this.#database,
69
+ this.#logger,
70
+ this.#deferments,
71
+ cacheOptions,
72
+ (id: string) => {
73
+ this.#cacheReader.requestItem(id)
74
+ }
75
+ )
76
+ }
77
+
78
+ async disposeAsync(): Promise<void> {
79
+ await Promise.all([
80
+ this.#gathered.disposeAsync(),
81
+ this.#downloader.disposeAsync(),
82
+ this.#cacheWriter.disposeAsync(),
83
+ this.#cacheReader.disposeAsync()
84
+ ])
85
+ this.#deferments.dispose()
86
+ this.#cache.dispose()
87
+ }
88
+
89
+ async getRootObject(): Promise<Item | undefined> {
90
+ if (!this.#root) {
91
+ this.#root = (await this.#database.getAll([this.#rootId]))[0]
92
+ if (!this.#root) {
93
+ this.#root = await this.#downloader.downloadSingle()
94
+ } else {
95
+ this.#isRootStored = true
96
+ }
97
+ }
98
+ return this.#root
99
+ }
100
+
101
+ async getObject(params: { id: string }): Promise<Base> {
102
+ return await this.#cacheReader.getObject({ id: params.id })
103
+ }
104
+
105
+ async getTotalObjectCount(): Promise<number> {
106
+ const rootObj = await this.getRootObject()
107
+ const totalChildrenCount = Object.keys(rootObj?.base?.__closure || {}).length
108
+ return totalChildrenCount + 1 //count the root
109
+ }
110
+
111
+ async *getObjectIterator(): AsyncGenerator<Base> {
112
+ const rootItem = await this.getRootObject()
113
+ if (rootItem?.base === undefined) {
114
+ this.#logger('No root object found!')
115
+ return
116
+ }
117
+ if (!rootItem.base.__closure) {
118
+ yield rootItem.base
119
+ return
120
+ }
121
+
122
+ //sort the closures by their values descending
123
+ const sortedClosures = Object.entries(rootItem.base.__closure ?? []).sort(
124
+ (a, b) => b[1] - a[1]
125
+ )
126
+ this.#logger(
127
+ 'calculated closures: ',
128
+ !take(sortedClosures.values(), MAX_CLOSURES_TO_TAKE).every(
129
+ (x) => x[1] === EXPECTED_CLOSURE_VALUE
130
+ )
131
+ )
132
+ const children = sortedClosures.map((x) => x[0])
133
+ const total = children.length + 1 // +1 for the root object
134
+ this.#downloader.initializePool({
135
+ results: new AggregateQueue(this.#gathered, this.#cacheWriter),
136
+ total
137
+ })
138
+ //only for root
139
+ this.#gathered.add(rootItem)
140
+ this.#cacheReader.requestAll(children)
141
+ let count = 0
142
+ for await (const item of this.#gathered.consume()) {
143
+ yield item.base! //always defined, as we add it to the queue
144
+ count++
145
+ if (count >= total) {
146
+ break
147
+ }
148
+ }
149
+ if (!this.#isRootStored) {
150
+ await this.#database.saveBatch({ batch: [rootItem] })
151
+ this.#isRootStored = true
152
+ }
153
+ }
154
+
155
+ static createFromObjects(objects: Base[]): ObjectLoader2 {
156
+ return ObjectLoader2Factory.createFromObjects(objects)
157
+ }
158
+
159
+ static createFromJSON(json: string): ObjectLoader2 {
160
+ return ObjectLoader2Factory.createFromJSON(json)
161
+ }
162
+ }
@@ -0,0 +1,87 @@
1
+ import { CustomLogger, getFeatureFlag, ObjectLoader2Flags } from '../types/functions.js'
2
+ import { Base } from '../types/types.js'
3
+ import { ObjectLoader2 } from './objectLoader2.js'
4
+ import IndexedDatabase from './stages/indexedDatabase.js'
5
+ import { MemoryDatabase } from './stages/memory/memoryDatabase.js'
6
+ import { MemoryDownloader } from './stages/memory/memoryDownloader.js'
7
+ import ServerDownloader from './stages/serverDownloader.js'
8
+
9
+ export interface ObjectLoader2FactoryOptions {
10
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
11
+ keyRange?: { bound: Function; lowerBound: Function; upperBound: Function }
12
+ indexedDB?: IDBFactory
13
+ logger?: CustomLogger
14
+ }
15
+
16
+ export class ObjectLoader2Factory {
17
+ static createFromObjects(objects: Base[]): ObjectLoader2 {
18
+ const root = objects[0]
19
+ const records: Map<string, Base> = new Map<string, Base>()
20
+ objects.forEach((element) => {
21
+ records.set(element.id, element)
22
+ })
23
+ const loader = new ObjectLoader2({
24
+ rootId: root.id,
25
+ database: new MemoryDatabase({ items: records }),
26
+ downloader: new MemoryDownloader(root.id, records)
27
+ })
28
+ return loader
29
+ }
30
+
31
+ static createFromJSON(json: string): ObjectLoader2 {
32
+ const jsonObj = JSON.parse(json) as Base[]
33
+ return this.createFromObjects(jsonObj)
34
+ }
35
+
36
+ static createFromUrl(params: {
37
+ serverUrl: string
38
+ streamId: string
39
+ objectId: string
40
+ token?: string
41
+ headers?: Headers
42
+ options?: ObjectLoader2FactoryOptions
43
+ }): ObjectLoader2 {
44
+ const log = ObjectLoader2Factory.getLogger(params.options?.logger)
45
+ let database
46
+ if (getFeatureFlag(ObjectLoader2Flags.DEBUG) === 'true') {
47
+ this.logger('Using DEBUG mode for ObjectLoader2Factory')
48
+ }
49
+ if (getFeatureFlag(ObjectLoader2Flags.USE_CACHE) === 'true') {
50
+ database = new IndexedDatabase({
51
+ indexedDB: params.options?.indexedDB,
52
+ keyRange: params.options?.keyRange
53
+ })
54
+ } else {
55
+ database = new MemoryDatabase({
56
+ items: new Map<string, Base>()
57
+ })
58
+ this.logger(
59
+ 'Disabled persistent caching for ObjectLoader2. Using MemoryDatabase'
60
+ )
61
+ }
62
+ const loader = new ObjectLoader2({
63
+ rootId: params.objectId,
64
+ downloader: new ServerDownloader({
65
+ serverUrl: params.serverUrl,
66
+ streamId: params.streamId,
67
+ objectId: params.objectId,
68
+ token: params.token,
69
+ headers: params.headers
70
+ }),
71
+ database,
72
+ logger: log
73
+ })
74
+ return loader
75
+ }
76
+
77
+ static getLogger(providedLogger?: CustomLogger): CustomLogger | undefined {
78
+ if (getFeatureFlag(ObjectLoader2Flags.DEBUG) === 'true') {
79
+ return providedLogger || this.logger
80
+ }
81
+ return providedLogger
82
+ }
83
+
84
+ static logger: CustomLogger = (m?: string, ...optionalParams: unknown[]) => {
85
+ console.log(`[debug] ${m}`, ...optionalParams)
86
+ }
87
+ }
@@ -1,4 +1,5 @@
1
- import { Base, CustomLogger } from '../types/types.js'
1
+ import { CustomLogger } from '../types/functions.js'
2
+ import { Base } from '../types/types.js'
2
3
  import { Downloader, Database } from './interfaces.js'
3
4
 
4
5
  export interface ObjectLoader2Options {
@@ -0,0 +1,196 @@
1
+ /* eslint-disable @typescript-eslint/no-base-to-string */
2
+ /* eslint-disable @typescript-eslint/prefer-promise-reject-errors */
3
+ /* eslint-disable @typescript-eslint/no-explicit-any */
4
+ /* eslint-disable @typescript-eslint/no-unsafe-function-type */
5
+ import { isSafari } from '@speckle/shared'
6
+ import { Item } from '../../types/types.js'
7
+
8
+ /**
9
+ * A wrapper class for IndexedDB to simplify common database operations.
10
+ */
11
+ export interface ItemStoreOptions {
12
+ indexedDB?: IDBFactory
13
+ keyRange?: {
14
+ bound: Function
15
+ lowerBound: Function
16
+ upperBound: Function
17
+ }
18
+ }
19
+ export class ItemStore {
20
+ #options: ItemStoreOptions
21
+
22
+ #db: IDBDatabase | undefined = undefined
23
+ readonly #dbName: string
24
+ readonly #storeName: string
25
+
26
+ constructor(options: ItemStoreOptions, dbName: string, storeName: string) {
27
+ this.#options = options
28
+ this.#dbName = dbName
29
+ this.#storeName = storeName
30
+ }
31
+
32
+ /**
33
+ * Initializes the database connection and creates the object store if needed.
34
+ * This must be called before any other database operations.
35
+ */
36
+ async init(): Promise<void> {
37
+ if (this.#db) return
38
+ await this.#safariFix()
39
+ return this.#openDatabase()
40
+ }
41
+
42
+ /**
43
+ * Opens the database, and if there's an error, deletes the database and tries again.
44
+ */
45
+ async #openDatabase(): Promise<void> {
46
+ const idb = this.#options.indexedDB ?? indexedDB
47
+
48
+ return new Promise((resolve, reject) => {
49
+ const request = idb.open(this.#dbName, 1)
50
+
51
+ request.onerror = (): any => {
52
+ console.warn(
53
+ `Failed to open database: ${this.#dbName}, deleting and trying again`
54
+ )
55
+ // Delete the database and try again
56
+ const deleteRequest = idb.deleteDatabase(this.#dbName)
57
+ deleteRequest.onsuccess = (): any => {
58
+ // Try opening again after deletion
59
+ void this.#openDatabase().then(resolve).catch(reject)
60
+ }
61
+ deleteRequest.onerror = (): any => {
62
+ reject(`Failed to delete and reopen database: ${this.#dbName}`)
63
+ }
64
+ }
65
+
66
+ request.onupgradeneeded = (event): any => {
67
+ const db = (event.target as IDBOpenDBRequest).result
68
+ if (db.objectStoreNames.contains(this.#storeName)) {
69
+ db.deleteObjectStore(this.#storeName)
70
+ }
71
+ db.createObjectStore(this.#storeName, { keyPath: 'baseId' })
72
+ }
73
+
74
+ request.onsuccess = (event): any => {
75
+ this.#db = (event.target as IDBOpenDBRequest).result
76
+ resolve()
77
+ }
78
+ })
79
+ }
80
+
81
+ #getDB(): IDBDatabase {
82
+ if (!this.#db) {
83
+ throw new Error('Database not initialized. Call init() first.')
84
+ }
85
+ return this.#db
86
+ }
87
+
88
+ /**
89
+ * Fixes a Safari bug where IndexedDB requests get lost and never resolve - invoke before you use IndexedDB
90
+ * @link Credits and more info: https://github.com/jakearchibald/safari-14-idb-fix
91
+ */
92
+ async #safariFix(): Promise<void> {
93
+ // No point putting other browsers or older versions of Safari through this mess.
94
+ if (!isSafari() || !this.#options.indexedDB?.databases) return Promise.resolve()
95
+
96
+ let intervalId: ReturnType<typeof setInterval>
97
+
98
+ return new Promise<void>((resolve: () => void) => {
99
+ const tryIdb = (): Promise<IDBDatabaseInfo[]> | undefined =>
100
+ this.#options.indexedDB?.databases().finally(resolve)
101
+ intervalId = setInterval(() => {
102
+ void tryIdb()
103
+ }, 100)
104
+ void tryIdb()
105
+ }).finally(() => clearInterval(intervalId))
106
+ }
107
+
108
+ /**
109
+ * Inserts or updates an array of items in a single transaction.
110
+ * @param data The array of items to insert.
111
+ */
112
+ bulkInsert(data: Item[]): Promise<void> {
113
+ return new Promise((resolve, reject) => {
114
+ try {
115
+ const transaction = this.#getDB().transaction(this.#storeName, 'readwrite', {
116
+ durability: 'relaxed'
117
+ })
118
+ const store = transaction.objectStore(this.#storeName)
119
+
120
+ transaction.onerror = (): any => {
121
+ reject(`Transaction error: ${transaction.error}`)
122
+ }
123
+ transaction.oncomplete = (): any => {
124
+ resolve()
125
+ }
126
+
127
+ data.forEach((item) => store.put(item))
128
+ } catch (error) {
129
+ reject(error)
130
+ }
131
+ })
132
+ }
133
+
134
+ /**
135
+ * Retrieves an array of items from the object store based on their IDs.
136
+ * @param ids The array of IDs to retrieve.
137
+ */
138
+ bulkGet(ids: string[]): Promise<(Item | undefined)[]> {
139
+ return new Promise((resolve, reject) => {
140
+ if (ids.length === 0) {
141
+ return resolve([])
142
+ }
143
+ try {
144
+ const transaction = this.#getDB().transaction(this.#storeName, 'readonly', {
145
+ durability: 'relaxed'
146
+ })
147
+ const store = transaction.objectStore(this.#storeName)
148
+ const promises: Promise<Item | undefined>[] = []
149
+
150
+ for (const id of ids) {
151
+ promises.push(
152
+ new Promise((resolveGet, rejectGet) => {
153
+ const request = store.get(id)
154
+ request.onerror = (): void =>
155
+ rejectGet(`Request error for id ${id}: ${request.error}`)
156
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
157
+ request.onsuccess = (): void => resolveGet(request.result)
158
+ })
159
+ )
160
+ }
161
+
162
+ Promise.all(promises)
163
+ .then((results) => {
164
+ resolve(results)
165
+ })
166
+ .catch(reject)
167
+ } catch (error) {
168
+ reject(error)
169
+ }
170
+ })
171
+ }
172
+
173
+ /**
174
+ * Retrieves all items from the object store.
175
+ */
176
+ getAll(): Promise<Item[]> {
177
+ return new Promise((resolve, reject) => {
178
+ try {
179
+ const transaction = this.#getDB().transaction(this.#storeName, 'readonly')
180
+ const store = transaction.objectStore(this.#storeName)
181
+ const request = store.getAll()
182
+
183
+ request.onerror = (): any => reject(`Request error: ${request.error}`)
184
+ request.onsuccess = (): any => resolve(request.result)
185
+ } catch (error) {
186
+ reject(error)
187
+ }
188
+ })
189
+ }
190
+
191
+ close(): void {
192
+ if (!this.#db) return
193
+ this.#db.close()
194
+ this.#db = undefined
195
+ }
196
+ }
@@ -0,0 +1,18 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`IndexedDatabase > should add and get multiple items 1`] = `
4
+ [
5
+ {
6
+ "base": {
7
+ "foo": "bar",
8
+ },
9
+ "baseId": "id1",
10
+ },
11
+ {
12
+ "base": {
13
+ "foo": "bar",
14
+ },
15
+ "baseId": "id2",
16
+ },
17
+ ]
18
+ `;
@@ -56,6 +56,31 @@ exports[`downloader > download batch of three 1`] = `
56
56
  ]
57
57
  `;
58
58
 
59
+ exports[`downloader > download batch of three with Objects.Other.RawEncoding 1`] = `
60
+ [
61
+ {
62
+ "base": {
63
+ "id": "id1",
64
+ "speckle_type": "type",
65
+ },
66
+ "baseId": "id1",
67
+ "size": 34,
68
+ },
69
+ {
70
+ "base": undefined,
71
+ "baseId": "id2",
72
+ },
73
+ {
74
+ "base": {
75
+ "id": "id3",
76
+ "speckle_type": "type",
77
+ },
78
+ "baseId": "id3",
79
+ "size": 34,
80
+ },
81
+ ]
82
+ `;
83
+
59
84
  exports[`downloader > download batch of two 1`] = `
60
85
  [
61
86
  {
@@ -1,19 +1,22 @@
1
- import { describe, expect, test } from 'vitest'
2
- import { Base, Item } from '../types/types.js'
3
- import { DefermentManager } from './defermentManager.js'
1
+ import { describe, test, expect } from 'vitest'
2
+ import { DefermentManager } from '../../deferment/defermentManager.js'
3
+ import { Item, Base } from '../../types/types.js'
4
4
  import { CacheReader } from './cacheReader.js'
5
- import { MemoryDatabase } from '../operations/databases/memoryDatabase.js'
5
+ import { MemoryDatabase } from './memory/memoryDatabase.js'
6
+ import { MemoryCache } from '../../deferment/MemoryCache.js'
6
7
 
7
8
  describe('CacheReader testing', () => {
8
9
  test('deferred getObject', async () => {
9
10
  const i1: Item = { baseId: 'id1', base: { id: 'id', speckle_type: 'type' } }
10
11
 
11
- const deferments = new DefermentManager({ maxSizeInMb: 1, ttlms: 1 })
12
+ const cache = new MemoryCache({ maxSizeInMb: 1, ttlms: 1 }, () => {})
13
+ const deferments = new DefermentManager(cache, () => {})
12
14
  const cacheReader = new CacheReader(
13
15
  new MemoryDatabase({
14
- items: new Map<string, Base>([[i1.baseId, i1.base]])
16
+ items: new Map<string, Base>([[i1.baseId, i1.base!]])
15
17
  }),
16
18
  deferments,
19
+ () => {},
17
20
  {
18
21
  maxCacheReadSize: 1,
19
22
  maxCacheWriteSize: 1,
@@ -26,7 +29,9 @@ describe('CacheReader testing', () => {
26
29
  const objPromise = cacheReader.getObject({
27
30
  id: i1.baseId
28
31
  })
29
- deferments.undefer(i1)
32
+ deferments.undefer(i1, (id: string) => {
33
+ throw new Error(`Requesting item ${id} not implemented`)
34
+ })
30
35
  const base = await objPromise
31
36
 
32
37
  expect(base).toMatchSnapshot()
@@ -0,0 +1,88 @@
1
+ import { DefermentManager } from '../../deferment/defermentManager.js'
2
+ import BatchingQueue from '../../queues/batchingQueue.js'
3
+ import Queue from '../../queues/queue.js'
4
+ import { CustomLogger } from '../../types/functions.js'
5
+ import { Item, Base } from '../../types/types.js'
6
+ import { Database } from '../interfaces.js'
7
+ import { CacheOptions } from '../options.js'
8
+
9
+ export class CacheReader {
10
+ #database: Database
11
+ #defermentManager: DefermentManager
12
+ #logger: CustomLogger
13
+ #options: CacheOptions
14
+ #readQueue: BatchingQueue<string> | undefined
15
+ #foundQueue: Queue<Item> | undefined
16
+ #notFoundQueue: Queue<string> | undefined
17
+
18
+ constructor(
19
+ database: Database,
20
+ defermentManager: DefermentManager,
21
+ logger: CustomLogger,
22
+ options: CacheOptions
23
+ ) {
24
+ this.#database = database
25
+ this.#defermentManager = defermentManager
26
+ this.#logger = logger
27
+ this.#options = options
28
+ }
29
+
30
+ initializeQueue(foundQueue: Queue<Item>, notFoundQueue: Queue<string>): void {
31
+ this.#foundQueue = foundQueue
32
+ this.#notFoundQueue = notFoundQueue
33
+ }
34
+
35
+ getObject(params: { id: string }): Promise<Base> {
36
+ const [p, b] = this.#defermentManager.defer({ id: params.id })
37
+ if (!b) {
38
+ this.requestItem(params.id)
39
+ }
40
+ return p
41
+ }
42
+
43
+ #createReadQueue(): void {
44
+ if (!this.#readQueue) {
45
+ this.#readQueue = new BatchingQueue({
46
+ batchSize: this.#options.maxCacheReadSize,
47
+ maxWaitTime: this.#options.maxCacheBatchReadWait,
48
+ processFunction: this.#processBatch
49
+ })
50
+ }
51
+ }
52
+
53
+ requestItem(id: string): void {
54
+ this.#createReadQueue()
55
+ if (!this.#readQueue?.get(id)) {
56
+ this.#readQueue?.add(id, id)
57
+ }
58
+ }
59
+
60
+ requestAll(keys: string[]): void {
61
+ this.#createReadQueue()
62
+
63
+ this.#readQueue?.addAll(keys, keys)
64
+ }
65
+
66
+ #processBatch = async (batch: string[]): Promise<void> => {
67
+ const start = performance.now()
68
+ const items = await this.#database.getAll(batch)
69
+ for (let i = 0; i < items.length; i++) {
70
+ const item = items[i]
71
+ if (item) {
72
+ this.#foundQueue?.add(item)
73
+ this.#defermentManager.undefer(item, (id) => this.requestItem(id))
74
+ } else {
75
+ this.#notFoundQueue?.add(batch[i])
76
+ }
77
+ }
78
+ this.#logger(
79
+ `readBatch: batch ${batch.length}, time ${
80
+ performance.now() - start
81
+ } ms left ${this.#readQueue?.count()}`
82
+ )
83
+ }
84
+
85
+ disposeAsync(): Promise<void> {
86
+ return this.#readQueue?.disposeAsync() || Promise.resolve()
87
+ }
88
+ }