@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
@@ -1,64 +0,0 @@
1
- import { Database } from '../operations/interfaces.js'
2
- import { CacheOptions } from '../operations/options.js'
3
- import { Base, CustomLogger, Item } from '../types/types.js'
4
- import BatchingQueue from './batchingQueue.js'
5
- import { DefermentManager } from './defermentManager.js'
6
-
7
- export class CacheReader {
8
- #database: Database
9
- #defermentManager: DefermentManager
10
- #logger: CustomLogger
11
- #options: CacheOptions
12
- #readQueue: BatchingQueue<string> | undefined
13
-
14
- constructor(
15
- database: Database,
16
- defermentManager: DefermentManager,
17
- options: CacheOptions
18
- ) {
19
- this.#database = database
20
- this.#defermentManager = defermentManager
21
- this.#options = options
22
- this.#logger = options.logger || ((): void => {})
23
- }
24
-
25
- async getObject(params: { id: string }): Promise<Base> {
26
- if (!this.#defermentManager.isDeferred(params.id)) {
27
- this.#getItem(params.id)
28
- }
29
- return await this.#defermentManager.defer({ id: params.id })
30
- }
31
-
32
- #getItem(id: string): void {
33
- if (!this.#readQueue) {
34
- this.#readQueue = new BatchingQueue({
35
- batchSize: this.#options.maxCacheReadSize,
36
- maxWaitTime: this.#options.maxCacheBatchReadWait,
37
- processFunction: this.#processBatch
38
- })
39
- }
40
- if (!this.#readQueue.get(id)) {
41
- this.#readQueue.add(id, id)
42
- }
43
- }
44
-
45
- async getAll(keys: string[]): Promise<(Item | undefined)[]> {
46
- return this.#database.getAll(keys)
47
- }
48
-
49
- #processBatch = async (batch: string[]): Promise<void> => {
50
- const items = await this.#database.getAll(batch)
51
- for (let i = 0; i < items.length; i++) {
52
- if (items[i]) {
53
- this.#defermentManager.undefer(items[i]!)
54
- } else {
55
- //this is okay!
56
- //this.#logger(`Item ${batch[i]} not found in cache`)
57
- }
58
- }
59
- }
60
-
61
- async disposeAsync(): Promise<void> {
62
- await this.#readQueue?.disposeAsync()
63
- }
64
- }
@@ -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,141 +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
-
12
- constructor(private options: DefermentManagerOptions) {
13
- this.resetGlobalTimer()
14
- this.logger = options.logger || ((): void => {})
15
- }
16
-
17
- private now(): number {
18
- return Date.now()
19
- }
20
-
21
- isDeferred(id: string): boolean {
22
- return this.deferments.has(id)
23
- }
24
-
25
- get(id: string): DeferredBase | undefined {
26
- if (this.disposed) throw new Error('DefermentManager is disposed')
27
- return this.deferments.get(id)
28
- }
29
-
30
- async defer(params: { id: string }): Promise<Base> {
31
- if (this.disposed) throw new Error('DefermentManager is disposed')
32
- const now = this.now()
33
- const deferredBase = this.deferments.get(params.id)
34
- if (deferredBase) {
35
- deferredBase.setAccess(now)
36
- return deferredBase.getPromise()
37
- }
38
- const notYetFound = new DeferredBase(
39
- this.options.ttlms,
40
- params.id,
41
- now + this.options.ttlms
42
- )
43
- this.deferments.set(params.id, notYetFound)
44
- return notYetFound.getPromise()
45
- }
46
-
47
- undefer(item: Item): void {
48
- if (this.disposed) throw new Error('DefermentManager is disposed')
49
- const now = this.now()
50
- this.currentSize += item.size || 0
51
- //order matters here with found before undefer
52
- const deferredBase = this.deferments.get(item.baseId)
53
- if (deferredBase) {
54
- deferredBase.found(item)
55
- deferredBase.setAccess(now)
56
- } else {
57
- const existing = new DeferredBase(this.options.ttlms, item.baseId, now)
58
- existing.found(item)
59
- this.deferments.set(item.baseId, existing)
60
- }
61
- }
62
-
63
- private resetGlobalTimer(): void {
64
- const run = (): void => {
65
- this.cleanDeferments()
66
- this.timer = setTimeout(run, this.options.ttlms)
67
- }
68
- this.timer = setTimeout(run, this.options.ttlms)
69
- }
70
-
71
- dispose(): void {
72
- if (this.disposed) return
73
- this.disposed = true
74
- if (this.timer) {
75
- clearTimeout(this.timer)
76
- this.timer = undefined
77
- }
78
- this.clearDeferments()
79
- }
80
-
81
- private clearDeferments(): void {
82
- let waiting = 0
83
- for (const deferredBase of this.deferments.values()) {
84
- deferredBase.done(0)
85
- if (deferredBase.getItem() === undefined) {
86
- waiting++
87
- }
88
- }
89
- this.currentSize = 0
90
- this.deferments.clear()
91
- this.logger('cleared deferments, left', waiting)
92
- }
93
-
94
- private cleanDeferments(): void {
95
- const maxSizeBytes = this.options.maxSizeInMb * 1024 * 1024
96
- if (this.currentSize < maxSizeBytes) {
97
- this.logger(
98
- 'deferments size is ok, no need to clean',
99
- this.currentSize,
100
- maxSizeBytes
101
- )
102
- return
103
- }
104
- const now = this.now()
105
- let cleaned = 0
106
- const start = performance.now()
107
- for (const deferredBase of Array.from(this.deferments.values())
108
- .filter((x) => x.isExpired(now))
109
- .sort((a, b) => this.compareMaybeBasesBySize(a.getItem(), b.getItem()))) {
110
- if (deferredBase.done(now)) {
111
- this.currentSize -= deferredBase.getItem()?.size || 0
112
- this.deferments.delete(deferredBase.getId())
113
- cleaned++
114
- if (this.currentSize < maxSizeBytes) {
115
- break
116
- }
117
- }
118
- }
119
- this.logger(
120
- 'cleaned deferments, cleaned, left',
121
- cleaned,
122
- this.deferments.size,
123
- performance.now() - start
124
- )
125
- return
126
- }
127
-
128
- compareMaybeBasesBySize(a: Item | undefined, b: Item | undefined): number {
129
- if (a === undefined && b === undefined) return 0
130
- if (a === undefined) return -1
131
- if (b === undefined) return 1
132
- return this.compareMaybe(a.size, b.size)
133
- }
134
-
135
- compareMaybe(a: number | undefined, b: number | undefined): number {
136
- if (a === undefined && b === undefined) return 0
137
- if (a === undefined) return -1
138
- if (b === undefined) return 1
139
- return a - b
140
- }
141
- }
@@ -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,31 +0,0 @@
1
- // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
-
3
- exports[`database cache > write single item to queue use getItem 1`] = `
4
- {
5
- "base": {
6
- "id": "id",
7
- "speckle_type": "type",
8
- },
9
- "baseId": "id",
10
- }
11
- `;
12
-
13
- exports[`database cache > write two items to queue use getItem 1`] = `
14
- {
15
- "base": {
16
- "id": "id",
17
- "speckle_type": "type",
18
- },
19
- "baseId": "id1",
20
- }
21
- `;
22
-
23
- exports[`database cache > write two items to queue use getItem 2`] = `
24
- {
25
- "base": {
26
- "id": "id",
27
- "speckle_type": "type",
28
- },
29
- "baseId": "id2",
30
- }
31
- `;
@@ -1,37 +0,0 @@
1
- import { describe, expect, test } from 'vitest'
2
- import IndexedDatabase from './indexedDatabase.js'
3
- import { IDBFactory, IDBKeyRange } from 'fake-indexeddb'
4
- import { Item } from '../../types/types.js'
5
-
6
- describe('database cache', () => {
7
- test('write single item to queue use getItem', async () => {
8
- const i: Item = { baseId: 'id', base: { id: 'id', speckle_type: 'type' } }
9
- const database = new IndexedDatabase({
10
- indexedDB: new IDBFactory(),
11
- keyRange: IDBKeyRange
12
- })
13
- await database.add(i)
14
- await database.disposeAsync()
15
-
16
- const x = await database.getItem({ id: 'id' })
17
- expect(x).toMatchSnapshot()
18
- })
19
-
20
- test('write two items to queue use getItem', async () => {
21
- const i1: Item = { baseId: 'id1', base: { id: 'id', speckle_type: 'type' } }
22
- const i2: Item = { baseId: 'id2', base: { id: 'id', speckle_type: 'type' } }
23
- const database = new IndexedDatabase({
24
- indexedDB: new IDBFactory(),
25
- keyRange: IDBKeyRange
26
- })
27
- await database.add(i1)
28
- await database.add(i2)
29
- await database.disposeAsync()
30
-
31
- const x1 = await database.getItem({ id: i1.baseId })
32
- expect(x1).toMatchSnapshot()
33
-
34
- const x2 = await database.getItem({ id: i2.baseId })
35
- expect(x2).toMatchSnapshot()
36
- })
37
- })
@@ -1,150 +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
- 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
- //this is for testing only - in the real world we will not use this
87
- async add(item: Item): Promise<void> {
88
- await this.#setupCacheDb()
89
- await this.#cacheDB!.transaction('rw', this.#cacheDB!.objects, async () => {
90
- return await this.#cacheDB?.objects.add(item)
91
- })
92
- }
93
-
94
- async getItem(params: { id: string }): Promise<Item | undefined> {
95
- const { id } = params
96
- await this.#setupCacheDb()
97
- //might not be in the real DB yet, so check the write queue first
98
- if (this.#writeQueue) {
99
- const item = this.#writeQueue.get(id)
100
- if (item) {
101
- return item
102
- }
103
- }
104
-
105
- return this.#cacheDB!.transaction('r', this.#cacheDB!.objects, async () => {
106
- return await this.#cacheDB?.objects.get(id)
107
- })
108
- }
109
-
110
- async cacheSaveBatch(params: { batch: Item[] }): Promise<void> {
111
- await this.#setupCacheDb()
112
- const { batch } = params
113
- //const x = this.#count
114
- //this.#count++
115
-
116
- // const startTime = performance.now()
117
- // this.#logger('Start save ' + x + ' ' + batch.length)
118
- await this.#cacheDB!.objects.bulkPut(batch)
119
- // const endTime = performance.now()
120
- // const duration = endTime - startTime
121
- //this.#logger('Saved batch ' + x + ' ' + batch.length + ' ' + duration / TIME_MS.second)
122
- }
123
-
124
- /**
125
- * Fixes a Safari bug where IndexedDB requests get lost and never resolve - invoke before you use IndexedDB
126
- * @link Credits and more info: https://github.com/jakearchibald/safari-14-idb-fix
127
- */
128
- async #safariFix(): Promise<void> {
129
- // No point putting other browsers or older versions of Safari through this mess.
130
- if (!isSafari() || !this.#options.indexedDB?.databases) return Promise.resolve()
131
-
132
- let intervalId: ReturnType<typeof setInterval>
133
-
134
- return new Promise<void>((resolve: () => void) => {
135
- const tryIdb = (): Promise<IDBDatabaseInfo[]> | undefined =>
136
- this.#options.indexedDB?.databases().finally(resolve)
137
- intervalId = setInterval(() => {
138
- void tryIdb()
139
- }, 100)
140
- void tryIdb()
141
- }).finally(() => clearInterval(intervalId))
142
- }
143
-
144
- async disposeAsync(): Promise<void> {
145
- this.#cacheDB?.close()
146
- this.#cacheDB = undefined
147
- await this.#writeQueue?.disposeAsync()
148
- this.#writeQueue = undefined
149
- }
150
- }