@speckle/objectloader2 2.25.7 → 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 (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
@@ -1,53 +0,0 @@
1
- import { describe, test, expect, beforeEach } from 'vitest'
2
- import { DefermentManager } from './defermentManager.js'
3
- import { DefermentManagerOptions } from '../operations/options.js'
4
- import { Base, Item } from '../types/types.js'
5
-
6
- const makeItem = (id: string, size = 1): Item => ({
7
- baseId: id,
8
- base: { foo: 'bar' } as unknown as Base,
9
- size
10
- })
11
-
12
- describe('DefermentManager totalDefermentRequests', () => {
13
- let manager: DefermentManager
14
- let options: DefermentManagerOptions
15
-
16
- beforeEach(() => {
17
- options = { maxSizeInMb: 1, ttlms: 1000, logger: (): void => {} }
18
- manager = new DefermentManager(options)
19
- })
20
-
21
- test('tracks deferment requests for each id', () => {
22
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
23
- manager.defer({ id: 'a' })
24
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
25
- manager.defer({ id: 'a' })
26
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
27
- manager.defer({ id: 'b' })
28
- // @ts-expect-error: access private for test
29
- expect(manager.totalDefermentRequests.get('a')).toBe(2)
30
- // @ts-expect-error: access private for test
31
- expect(manager.totalDefermentRequests.get('b')).toBe(1)
32
- })
33
-
34
- test('increments and does not reset on undefer', () => {
35
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
36
- manager.defer({ id: 'x' })
37
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
38
- manager.defer({ id: 'x' })
39
- manager.undefer(makeItem('x'))
40
- // @ts-expect-error: access private for test
41
- expect(manager.totalDefermentRequests.get('x')).toBe(2)
42
- // @ts-expect-error: access private for test
43
- const deferredBase = manager.deferments.get('x')
44
- expect(deferredBase).toBeDefined()
45
- expect(deferredBase?.getId()).toBe('x')
46
- })
47
-
48
- test('does not increment for undefer only', () => {
49
- manager.undefer(makeItem('y'))
50
- // @ts-expect-error: access private for test
51
- expect(manager.totalDefermentRequests.get('y')).toBeUndefined()
52
- })
53
- })
@@ -1,28 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { DefermentManager } from './defermentManager.js'
3
- import { DefermentManagerOptions } from '../operations/options.js'
4
- import { Item } from '../types/types.js'
5
-
6
- describe('DefermentManager disposal', () => {
7
- const options: DefermentManagerOptions = { ttlms: 10, maxSizeInMb: 1 }
8
- const makeItem = (id: string): Item => ({
9
- baseId: id,
10
- base: { id, speckle_type: 'test' }
11
- })
12
-
13
- it('should throw on get/defer/undefer after dispose', async () => {
14
- const manager = new DefermentManager(options)
15
- manager.dispose()
16
- expect(() => manager.get('a')).toThrow('DefermentManager is disposed')
17
- expect(() => manager.undefer(makeItem('a'))).toThrow('DefermentManager is disposed')
18
- await expect(manager.defer({ id: 'a' })).rejects.toThrow(
19
- 'DefermentManager is disposed'
20
- )
21
- })
22
-
23
- it('dispose is idempotent', () => {
24
- const manager = new DefermentManager(options)
25
- manager.dispose()
26
- expect(() => manager.dispose()).not.toThrow()
27
- })
28
- })
@@ -1,37 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
- import { describe, expect, test } from 'vitest'
4
- import { DefermentManager } from './defermentManager.js'
5
-
6
- describe('deferments', () => {
7
- test('defer one', async () => {
8
- const deferments = new DefermentManager({ maxSizeInMb: 1, ttlms: 1 })
9
- const x = deferments.defer({ id: 'id' })
10
- expect(x).toBeInstanceOf(Promise)
11
- deferments.undefer({ baseId: 'id', base: { id: 'id', speckle_type: 'type' } })
12
- const b = await x
13
- expect(b).toMatchSnapshot()
14
- })
15
-
16
- test('expireAt timeout', async () => {
17
- const now = 1
18
- const deferments = new DefermentManager({ maxSizeInMb: 1, ttlms: 1 })
19
- deferments['now'] = (): number => now
20
- const x = deferments.defer({ id: 'id' })
21
- expect(x).toBeInstanceOf(Promise)
22
- const d = deferments.get('id')
23
- expect(d).toBeDefined()
24
- expect(d?.getId()).toBe('id')
25
- expect((d as any).expiresAt).toBe(2)
26
- expect((d as any).ttl).toBe(1)
27
- expect((d as any).item).toBeUndefined()
28
- expect(d?.isExpired(1)).toBe(false)
29
- deferments.undefer({ baseId: 'id', base: { id: 'id', speckle_type: 'type' } })
30
- await x
31
- expect((d as any).expiresAt).toBe(2)
32
- expect((d as any).ttl).toBe(1)
33
- expect((d as any).item).toBeDefined()
34
- expect(d?.isExpired(1)).toBe(false)
35
- expect(d?.isExpired(3)).toBe(true)
36
- })
37
- })
@@ -1,160 +0,0 @@
1
- import { DeferredBase } from './deferredBase.js'
2
- import { Base, CustomLogger, Item } from '../types/types.js'
3
- import { DefermentManagerOptions } from '../operations/options.js'
4
-
5
- export class DefermentManager {
6
- private deferments: Map<string, DeferredBase> = new Map()
7
- private timer?: ReturnType<typeof setTimeout>
8
- private logger: CustomLogger
9
- private currentSize = 0
10
- private disposed = false
11
- //tracks total deferment requests for each id
12
- //this is used to prevent cleaning up deferments that are still being requested
13
- private totalDefermentRequests: Map<string, number> = new Map()
14
-
15
- constructor(private options: DefermentManagerOptions) {
16
- this.resetGlobalTimer()
17
- this.logger = options.logger || ((): void => {})
18
- }
19
-
20
- private now(): number {
21
- return Date.now()
22
- }
23
-
24
- isDeferred(id: string): boolean {
25
- return this.deferments.has(id)
26
- }
27
-
28
- get(id: string): DeferredBase | undefined {
29
- if (this.disposed) throw new Error('DefermentManager is disposed')
30
- return this.deferments.get(id)
31
- }
32
-
33
- async defer(params: { id: string }): Promise<Base> {
34
- if (this.disposed) throw new Error('DefermentManager is disposed')
35
- this.trackDefermentRequest(params.id)
36
- const now = this.now()
37
- const deferredBase = this.deferments.get(params.id)
38
- if (deferredBase) {
39
- deferredBase.setAccess(now)
40
- return deferredBase.getPromise()
41
- }
42
- const notYetFound = new DeferredBase(
43
- this.options.ttlms,
44
- params.id,
45
- now + this.options.ttlms
46
- )
47
- this.deferments.set(params.id, notYetFound)
48
- return notYetFound.getPromise()
49
- }
50
-
51
- private trackDefermentRequest(id: string): void {
52
- const request = this.totalDefermentRequests.get(id)
53
- if (request) {
54
- this.totalDefermentRequests.set(id, request + 1)
55
- } else {
56
- this.totalDefermentRequests.set(id, 1)
57
- }
58
- }
59
-
60
- undefer(item: Item): void {
61
- if (this.disposed) throw new Error('DefermentManager is disposed')
62
- const now = this.now()
63
- this.currentSize += item.size || 0
64
- //order matters here with found before undefer
65
- const deferredBase = this.deferments.get(item.baseId)
66
- if (deferredBase) {
67
- deferredBase.found(item)
68
- deferredBase.setAccess(now)
69
- } else {
70
- const existing = new DeferredBase(this.options.ttlms, item.baseId, now)
71
- existing.found(item)
72
- this.deferments.set(item.baseId, existing)
73
- }
74
- }
75
-
76
- private resetGlobalTimer(): void {
77
- const run = (): void => {
78
- this.cleanDeferments()
79
- this.timer = setTimeout(run, this.options.ttlms)
80
- }
81
- this.timer = setTimeout(run, this.options.ttlms)
82
- }
83
-
84
- dispose(): void {
85
- if (this.disposed) return
86
- this.disposed = true
87
- if (this.timer) {
88
- clearTimeout(this.timer)
89
- this.timer = undefined
90
- }
91
- this.clearDeferments()
92
- }
93
-
94
- private clearDeferments(): void {
95
- let waiting = 0
96
- for (const deferredBase of this.deferments.values()) {
97
- deferredBase.done(0)
98
- if (deferredBase.getItem() === undefined) {
99
- waiting++
100
- }
101
- }
102
- this.currentSize = 0
103
- this.deferments.clear()
104
- this.logger('cleared deferments, left', waiting)
105
- }
106
-
107
- private cleanDeferments(): void {
108
- const maxSizeBytes = this.options.maxSizeInMb * 1024 * 1024
109
- if (this.currentSize < maxSizeBytes) {
110
- this.logger(
111
- 'deferments size is ok, no need to clean',
112
- this.currentSize,
113
- maxSizeBytes
114
- )
115
- return
116
- }
117
- const now = this.now()
118
- let cleaned = 0
119
- const start = performance.now()
120
- for (const deferredBase of Array.from(this.deferments.values())
121
- .filter((x) => x.isExpired(now))
122
- .sort((a, b) => this.compareMaybeBasesBySize(a.getItem(), b.getItem()))) {
123
- if (deferredBase.done(now)) {
124
- //if the deferment is done but has been requested multiple times,
125
- //we do not clean it up to allow the requests to resolve
126
- const requestCount = this.totalDefermentRequests.get(deferredBase.getId())
127
- if (requestCount && requestCount > 1) {
128
- return
129
- }
130
- this.currentSize -= deferredBase.getItem()?.size || 0
131
- this.deferments.delete(deferredBase.getId())
132
- cleaned++
133
- if (this.currentSize < maxSizeBytes) {
134
- break
135
- }
136
- }
137
- }
138
- this.logger(
139
- 'cleaned deferments: cleaned, left, time',
140
- cleaned,
141
- this.deferments.size,
142
- performance.now() - start
143
- )
144
- return
145
- }
146
-
147
- compareMaybeBasesBySize(a: Item | undefined, b: Item | undefined): number {
148
- if (a === undefined && b === undefined) return 0
149
- if (a === undefined) return -1
150
- if (b === undefined) return 1
151
- return this.compareMaybe(a.size, b.size)
152
- }
153
-
154
- compareMaybe(a: number | undefined, b: number | undefined): number {
155
- if (a === undefined && b === undefined) return 0
156
- if (a === undefined) return -1
157
- if (b === undefined) return 1
158
- return a - b
159
- }
160
- }
@@ -1,55 +0,0 @@
1
- import { Base, Item } 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
- private item?: Item
8
-
9
- private readonly id: string
10
- private expiresAt: number // Timestamp in ms
11
- private ttl: number // ttl in ms
12
-
13
- constructor(ttl: number, id: string, expiresAt: number) {
14
- this.expiresAt = expiresAt
15
- this.ttl = ttl
16
- this.id = id
17
- this.promise = new Promise<Base>((resolve, reject) => {
18
- this.resolve = resolve
19
- this.reject = reject
20
- })
21
- }
22
-
23
- getId(): string {
24
- return this.id
25
- }
26
-
27
- getItem(): Item | undefined {
28
- return this.item
29
- }
30
-
31
- getPromise(): Promise<Base> {
32
- return this.promise
33
- }
34
-
35
- isExpired(now: number): boolean {
36
- return this.item !== undefined && now > this.expiresAt
37
- }
38
- setAccess(now: number): void {
39
- this.expiresAt = now + this.ttl
40
- }
41
-
42
- found(value: Item): void {
43
- this.item = value
44
- this.resolve(value.base)
45
- }
46
- done(now: number): boolean {
47
- if (this.item) {
48
- this.resolve(this.item.base)
49
- }
50
- if (this.isExpired(now)) {
51
- return true
52
- }
53
- return false
54
- }
55
- }
@@ -1,40 +0,0 @@
1
- import { Item } from '../types/types.js'
2
- import { Pump } from './pump.js'
3
- import Queue from './queue.js'
4
-
5
- export class MemoryPump implements Pump {
6
- #items: Map<string, Item> = new Map()
7
-
8
- add(item: Item): void {
9
- this.#items.set(item.baseId, item)
10
- }
11
-
12
- async pumpItems(params: {
13
- ids: string[]
14
- foundItems: Queue<Item>
15
- notFoundItems: Queue<string>
16
- }): Promise<void> {
17
- const { ids, foundItems, notFoundItems } = params
18
- for (const id of ids) {
19
- const item = this.#items.get(id)
20
- if (item) {
21
- foundItems.add(item)
22
- } else {
23
- notFoundItems.add(id)
24
- }
25
- }
26
- return Promise.resolve()
27
- }
28
-
29
- async *gather(ids: string[]): AsyncGenerator<Item> {
30
- for (const id of ids) {
31
- const item = this.#items.get(id)
32
- if (item) {
33
- yield item
34
- }
35
- }
36
- return Promise.resolve()
37
- }
38
-
39
- async disposeAsync(): Promise<void> {}
40
- }
@@ -1,8 +0,0 @@
1
- import { Downloader } from '../operations/interfaces.js'
2
- import { Item } from '../types/types.js'
3
- import Queue from './queue.js'
4
-
5
- export interface Pump extends Queue<Item> {
6
- gather(ids: string[], downloader: Downloader): AsyncGenerator<Item>
7
- disposeAsync(): Promise<void>
8
- }
@@ -1,126 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unsafe-function-type */
2
- import BatchingQueue from '../../helpers/batchingQueue.js'
3
- import { CustomLogger, Item } from '../../types/types.js'
4
- import { isSafari } from '@speckle/shared'
5
- import { Dexie, DexieOptions, Table } from 'dexie'
6
- import { Database } from '../interfaces.js'
7
-
8
- export class ObjectStore extends Dexie {
9
- static #databaseName: string = 'speckle-cache'
10
- objects!: Table<Item, string> // Table type: <entity, primaryKey>
11
-
12
- constructor(options: DexieOptions) {
13
- super(ObjectStore.#databaseName, options)
14
-
15
- this.version(1).stores({
16
- objects: 'baseId, item' // baseId is primary key
17
- })
18
- }
19
- }
20
-
21
- export interface IndexedDatabaseOptions {
22
- logger?: CustomLogger
23
- indexedDB?: IDBFactory
24
- keyRange?: {
25
- bound: Function
26
- lowerBound: Function
27
- upperBound: Function
28
- }
29
- }
30
-
31
- export default class IndexedDatabase implements Database {
32
- #options: IndexedDatabaseOptions
33
- #logger: CustomLogger
34
-
35
- #cacheDB?: ObjectStore
36
-
37
- #writeQueue: BatchingQueue<Item> | undefined
38
-
39
- // #count: number = 0
40
-
41
- constructor(options: IndexedDatabaseOptions) {
42
- this.#options = options
43
- this.#logger = options.logger || ((): void => {})
44
- }
45
-
46
- async getAll(keys: string[]): Promise<(Item | undefined)[]> {
47
- await this.#setupCacheDb()
48
- let items: (Item | undefined)[] = []
49
- // this.#count++
50
- // const startTime = performance.now()
51
- // this.#logger('Start read ' + x + ' ' + batch.length)
52
-
53
- //faster than BulkGet with dexie
54
- await this.#cacheDB!.transaction('r', this.#cacheDB!.objects, async () => {
55
- const gets = keys.map((key) => this.#cacheDB!.objects.get(key))
56
- const cachedData = await Promise.all(gets)
57
- items = cachedData
58
- })
59
- // const endTime = performance.now()
60
- // const duration = endTime - startTime
61
- //this.#logger('Saved batch ' + x + ' ' + batch.length + ' ' + duration / TIME_MS.second)
62
-
63
- return items
64
- }
65
-
66
- async #openDatabase(): Promise<ObjectStore> {
67
- const db = new ObjectStore({
68
- indexedDB: this.#options.indexedDB ?? globalThis.indexedDB,
69
- IDBKeyRange: this.#options.keyRange ?? IDBKeyRange,
70
- chromeTransactionDurability: 'relaxed'
71
- })
72
- await db.open()
73
- return db
74
- }
75
-
76
- async #setupCacheDb(): Promise<void> {
77
- if (this.#cacheDB !== undefined) {
78
- return
79
- }
80
-
81
- // Initialize
82
- await this.#safariFix()
83
- this.#cacheDB = await this.#openDatabase()
84
- }
85
-
86
- async cacheSaveBatch(params: { batch: Item[] }): Promise<void> {
87
- await this.#setupCacheDb()
88
- const { batch } = params
89
- //const x = this.#count
90
- //this.#count++
91
-
92
- // const startTime = performance.now()
93
- // this.#logger('Start save ' + x + ' ' + batch.length)
94
- await this.#cacheDB!.objects.bulkPut(batch)
95
- // const endTime = performance.now()
96
- // const duration = endTime - startTime
97
- //this.#logger('Saved batch ' + x + ' ' + batch.length + ' ' + duration / TIME_MS.second)
98
- }
99
-
100
- /**
101
- * Fixes a Safari bug where IndexedDB requests get lost and never resolve - invoke before you use IndexedDB
102
- * @link Credits and more info: https://github.com/jakearchibald/safari-14-idb-fix
103
- */
104
- async #safariFix(): Promise<void> {
105
- // No point putting other browsers or older versions of Safari through this mess.
106
- if (!isSafari() || !this.#options.indexedDB?.databases) return Promise.resolve()
107
-
108
- let intervalId: ReturnType<typeof setInterval>
109
-
110
- return new Promise<void>((resolve: () => void) => {
111
- const tryIdb = (): Promise<IDBDatabaseInfo[]> | undefined =>
112
- this.#options.indexedDB?.databases().finally(resolve)
113
- intervalId = setInterval(() => {
114
- void tryIdb()
115
- }, 100)
116
- void tryIdb()
117
- }).finally(() => clearInterval(intervalId))
118
- }
119
-
120
- async disposeAsync(): Promise<void> {
121
- this.#cacheDB?.close()
122
- this.#cacheDB = undefined
123
- await this.#writeQueue?.disposeAsync()
124
- this.#writeQueue = undefined
125
- }
126
- }
@@ -1,119 +0,0 @@
1
- import AsyncGeneratorQueue from '../helpers/asyncGeneratorQueue.js'
2
- import { Downloader, Database } from './interfaces.js'
3
- import { CustomLogger, Base, Item } from '../types/types.js'
4
- import { CacheOptions, ObjectLoader2Options } from './options.js'
5
- import { DefermentManager } from '../helpers/defermentManager.js'
6
- import { CacheReader } from '../helpers/cacheReader.js'
7
- import { CachePump } from '../helpers/cachePump.js'
8
- import AggregateQueue from '../helpers/aggregateQueue.js'
9
- import { ObjectLoader2Factory } from './objectLoader2Factory.js'
10
-
11
- export class ObjectLoader2 {
12
- #rootId: string
13
-
14
- #logger: CustomLogger
15
-
16
- #database: Database
17
- #downloader: Downloader
18
- #pump: CachePump
19
- #cache: CacheReader
20
-
21
- #deferments: DefermentManager
22
-
23
- #gathered: AsyncGeneratorQueue<Item>
24
-
25
- #root?: Item = undefined
26
-
27
- constructor(options: ObjectLoader2Options) {
28
- this.#rootId = options.rootId
29
- this.#logger = options.logger || console.log
30
-
31
- const cacheOptions: CacheOptions = {
32
- logger: this.#logger,
33
- maxCacheReadSize: 10_000,
34
- maxCacheWriteSize: 10_000,
35
- maxWriteQueueSize: 40_000,
36
- maxCacheBatchWriteWait: 3_000,
37
- maxCacheBatchReadWait: 3_000
38
- }
39
-
40
- this.#gathered = new AsyncGeneratorQueue()
41
- this.#database = options.database
42
- this.#deferments = new DefermentManager({
43
- maxSizeInMb: 2_000, // 2 GBs
44
- ttlms: 15_000, // 15 seconds
45
- logger: this.#logger
46
- })
47
- this.#cache = new CacheReader(this.#database, this.#deferments, cacheOptions)
48
- this.#pump = new CachePump(
49
- this.#database,
50
- this.#gathered,
51
- this.#deferments,
52
- cacheOptions
53
- )
54
- this.#downloader = options.downloader
55
- }
56
-
57
- async disposeAsync(): Promise<void> {
58
- await Promise.all([
59
- this.#downloader.disposeAsync(),
60
- this.#cache.disposeAsync(),
61
- this.#pump.disposeAsync()
62
- ])
63
- this.#deferments.dispose()
64
- }
65
-
66
- async getRootObject(): Promise<Item | undefined> {
67
- if (!this.#root) {
68
- this.#root = (await this.#database.getAll([this.#rootId]))[0]
69
- if (!this.#root) {
70
- this.#root = await this.#downloader.downloadSingle()
71
- }
72
- }
73
- return this.#root
74
- }
75
-
76
- async getObject(params: { id: string }): Promise<Base> {
77
- return await this.#cache.getObject({ id: params.id })
78
- }
79
-
80
- async getTotalObjectCount(): Promise<number> {
81
- const rootObj = await this.getRootObject()
82
- const totalChildrenCount = Object.keys(rootObj?.base.__closure || {}).length
83
- return totalChildrenCount + 1 //count the root
84
- }
85
-
86
- async *getObjectIterator(): AsyncGenerator<Base> {
87
- const rootItem = await this.getRootObject()
88
- if (rootItem === undefined) {
89
- this.#logger('No root object found!')
90
- return
91
- }
92
- //only for root
93
- this.#pump.add(rootItem)
94
- yield rootItem.base
95
- if (!rootItem.base.__closure) return
96
-
97
- //sort the closures by their values descending
98
- const sortedClosures = Object.entries(rootItem.base.__closure).sort(
99
- (a, b) => b[1] - a[1]
100
- )
101
- const children = sortedClosures.map((x) => x[0])
102
- const total = children.length
103
- this.#downloader.initializePool({
104
- results: new AggregateQueue(this.#gathered, this.#pump),
105
- total
106
- })
107
- for await (const item of this.#pump.gather(children, this.#downloader)) {
108
- yield item.base
109
- }
110
- }
111
-
112
- static createFromObjects(objects: Base[]): ObjectLoader2 {
113
- return ObjectLoader2Factory.createFromObjects(objects)
114
- }
115
-
116
- static createFromJSON(json: string): ObjectLoader2 {
117
- return ObjectLoader2Factory.createFromJSON(json)
118
- }
119
- }