@speckle/objectloader2 2.25.4 → 2.25.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/dist/commonjs/{operations → core}/interfaces.d.ts +2 -5
  2. package/dist/commonjs/core/interfaces.d.ts.map +1 -0
  3. package/dist/commonjs/core/interfaces.js.map +1 -0
  4. package/dist/{esm/operations → commonjs/core}/objectLoader2.d.ts +1 -1
  5. package/dist/commonjs/core/objectLoader2.d.ts.map +1 -0
  6. package/dist/commonjs/core/objectLoader2.js +128 -0
  7. package/dist/commonjs/core/objectLoader2.js.map +1 -0
  8. package/dist/commonjs/core/objectLoader2Factory.d.ts +27 -0
  9. package/dist/commonjs/core/objectLoader2Factory.d.ts.map +1 -0
  10. package/dist/commonjs/core/objectLoader2Factory.js +74 -0
  11. package/dist/commonjs/core/objectLoader2Factory.js.map +1 -0
  12. package/dist/{esm/operations → commonjs/core}/options.d.ts +2 -1
  13. package/dist/commonjs/core/options.d.ts.map +1 -0
  14. package/dist/commonjs/{operations → core}/options.js.map +1 -1
  15. package/dist/commonjs/core/stages/ItemStore.d.ts +37 -0
  16. package/dist/commonjs/core/stages/ItemStore.d.ts.map +1 -0
  17. package/dist/commonjs/core/stages/ItemStore.js +167 -0
  18. package/dist/commonjs/core/stages/ItemStore.js.map +1 -0
  19. package/dist/commonjs/core/stages/cacheReader.d.ts +18 -0
  20. package/dist/commonjs/core/stages/cacheReader.d.ts.map +1 -0
  21. package/dist/commonjs/core/stages/cacheReader.js +72 -0
  22. package/dist/commonjs/core/stages/cacheReader.js.map +1 -0
  23. package/dist/commonjs/core/stages/cacheWriter.d.ts +15 -0
  24. package/dist/commonjs/core/stages/cacheWriter.d.ts.map +1 -0
  25. package/dist/commonjs/core/stages/cacheWriter.js +50 -0
  26. package/dist/commonjs/core/stages/cacheWriter.js.map +1 -0
  27. package/dist/commonjs/{operations/databases → core/stages}/indexedDatabase.d.ts +2 -7
  28. package/dist/commonjs/core/stages/indexedDatabase.d.ts.map +1 -0
  29. package/dist/commonjs/core/stages/indexedDatabase.js +31 -0
  30. package/dist/commonjs/core/stages/indexedDatabase.js.map +1 -0
  31. package/dist/commonjs/core/stages/memory/memoryDatabase.d.ts +13 -0
  32. package/dist/commonjs/core/stages/memory/memoryDatabase.d.ts.map +1 -0
  33. package/dist/commonjs/{operations/databases → core/stages/memory}/memoryDatabase.js +4 -8
  34. package/dist/commonjs/core/stages/memory/memoryDatabase.js.map +1 -0
  35. package/dist/commonjs/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +3 -3
  36. package/dist/commonjs/core/stages/memory/memoryDownloader.d.ts.map +1 -0
  37. package/dist/commonjs/{operations/downloaders → core/stages/memory}/memoryDownloader.js +1 -1
  38. package/dist/commonjs/core/stages/memory/memoryDownloader.js.map +1 -0
  39. package/dist/{esm/operations/downloaders → commonjs/core/stages}/serverDownloader.d.ts +4 -5
  40. package/dist/commonjs/core/stages/serverDownloader.d.ts.map +1 -0
  41. package/dist/commonjs/{operations/downloaders → core/stages}/serverDownloader.js +82 -32
  42. package/dist/commonjs/core/stages/serverDownloader.js.map +1 -0
  43. package/dist/commonjs/core/traverser.d.ts.map +1 -0
  44. package/dist/commonjs/{operations → core}/traverser.js +7 -7
  45. package/dist/commonjs/core/traverser.js.map +1 -0
  46. package/dist/commonjs/deferment/MemoryCache.d.ts +35 -0
  47. package/dist/commonjs/deferment/MemoryCache.d.ts.map +1 -0
  48. package/dist/commonjs/deferment/MemoryCache.js +162 -0
  49. package/dist/commonjs/deferment/MemoryCache.js.map +1 -0
  50. package/dist/commonjs/deferment/MemoryCache.test.d.ts +2 -0
  51. package/dist/commonjs/deferment/MemoryCache.test.d.ts.map +1 -0
  52. package/dist/commonjs/deferment/MemoryCache.test.js +153 -0
  53. package/dist/commonjs/deferment/MemoryCache.test.js.map +1 -0
  54. package/dist/commonjs/deferment/defermentManager.d.ts +16 -0
  55. package/dist/commonjs/deferment/defermentManager.d.ts.map +1 -0
  56. package/dist/commonjs/deferment/defermentManager.js +58 -0
  57. package/dist/commonjs/deferment/defermentManager.js.map +1 -0
  58. package/dist/commonjs/deferment/defermentManager.test.d.ts +2 -0
  59. package/dist/commonjs/deferment/defermentManager.test.d.ts.map +1 -0
  60. package/dist/commonjs/deferment/defermentManager.test.js +188 -0
  61. package/dist/commonjs/deferment/defermentManager.test.js.map +1 -0
  62. package/dist/commonjs/deferment/deferredBase.d.ts +12 -0
  63. package/dist/commonjs/deferment/deferredBase.d.ts.map +1 -0
  64. package/dist/commonjs/deferment/deferredBase.js +27 -0
  65. package/dist/commonjs/deferment/deferredBase.js.map +1 -0
  66. package/dist/commonjs/index.d.ts +3 -3
  67. package/dist/commonjs/index.d.ts.map +1 -1
  68. package/dist/commonjs/index.js +6 -5
  69. package/dist/commonjs/index.js.map +1 -1
  70. package/dist/commonjs/{helpers → queues}/aggregateQueue.d.ts +2 -1
  71. package/dist/commonjs/queues/aggregateQueue.d.ts.map +1 -0
  72. package/dist/commonjs/{helpers → queues}/aggregateQueue.js +4 -0
  73. package/dist/commonjs/queues/aggregateQueue.js.map +1 -0
  74. package/dist/{esm/helpers → commonjs/queues}/asyncGeneratorQueue.d.ts +1 -1
  75. package/dist/commonjs/queues/asyncGeneratorQueue.d.ts.map +1 -0
  76. package/dist/commonjs/{helpers → queues}/asyncGeneratorQueue.js +2 -1
  77. package/dist/commonjs/queues/asyncGeneratorQueue.js.map +1 -0
  78. package/dist/{esm/helpers → commonjs/queues}/batchedPool.d.ts +2 -1
  79. package/dist/commonjs/queues/batchedPool.d.ts.map +1 -0
  80. package/dist/commonjs/queues/batchedPool.js.map +1 -0
  81. package/dist/{esm/helpers → commonjs/queues}/batchingQueue.d.ts +4 -1
  82. package/dist/commonjs/queues/batchingQueue.d.ts.map +1 -0
  83. package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts +2 -0
  84. package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts.map +1 -0
  85. package/dist/commonjs/queues/batchingQueue.dispose.test.js +64 -0
  86. package/dist/commonjs/queues/batchingQueue.dispose.test.js.map +1 -0
  87. package/dist/commonjs/queues/batchingQueue.js +123 -0
  88. package/dist/commonjs/queues/batchingQueue.js.map +1 -0
  89. package/dist/commonjs/queues/batchingQueue.test.d.ts +2 -0
  90. package/dist/commonjs/queues/batchingQueue.test.d.ts.map +1 -0
  91. package/dist/commonjs/queues/batchingQueue.test.js +138 -0
  92. package/dist/commonjs/queues/batchingQueue.test.js.map +1 -0
  93. package/dist/{esm/helpers → commonjs/queues}/bufferQueue.d.ts +1 -0
  94. package/dist/commonjs/queues/bufferQueue.d.ts.map +1 -0
  95. package/dist/commonjs/{helpers → queues}/bufferQueue.js +3 -0
  96. package/dist/commonjs/queues/bufferQueue.js.map +1 -0
  97. package/dist/commonjs/{helpers → queues}/keyedQueue.d.ts +1 -0
  98. package/dist/commonjs/queues/keyedQueue.d.ts.map +1 -0
  99. package/dist/commonjs/{helpers → queues}/keyedQueue.js +11 -0
  100. package/dist/commonjs/queues/keyedQueue.js.map +1 -0
  101. package/dist/commonjs/queues/queue.d.ts +5 -0
  102. package/dist/commonjs/queues/queue.d.ts.map +1 -0
  103. package/dist/commonjs/{helpers → queues}/queue.js.map +1 -1
  104. package/dist/commonjs/types/functions.d.ts +21 -0
  105. package/dist/commonjs/types/functions.d.ts.map +1 -0
  106. package/dist/commonjs/types/functions.js +92 -0
  107. package/dist/commonjs/types/functions.js.map +1 -0
  108. package/dist/commonjs/types/types.d.ts +1 -7
  109. package/dist/commonjs/types/types.d.ts.map +1 -1
  110. package/dist/commonjs/types/types.js +0 -36
  111. package/dist/commonjs/types/types.js.map +1 -1
  112. package/dist/esm/{operations → core}/interfaces.d.ts +2 -5
  113. package/dist/esm/core/interfaces.d.ts.map +1 -0
  114. package/dist/esm/core/interfaces.js.map +1 -0
  115. package/dist/{commonjs/operations → esm/core}/objectLoader2.d.ts +1 -1
  116. package/dist/esm/core/objectLoader2.d.ts.map +1 -0
  117. package/dist/esm/core/objectLoader2.js +121 -0
  118. package/dist/esm/core/objectLoader2.js.map +1 -0
  119. package/dist/esm/core/objectLoader2Factory.d.ts +27 -0
  120. package/dist/esm/core/objectLoader2Factory.d.ts.map +1 -0
  121. package/dist/esm/core/objectLoader2Factory.js +67 -0
  122. package/dist/esm/core/objectLoader2Factory.js.map +1 -0
  123. package/dist/{commonjs/operations → esm/core}/options.d.ts +2 -1
  124. package/dist/esm/core/options.d.ts.map +1 -0
  125. package/dist/esm/{operations → core}/options.js.map +1 -1
  126. package/dist/esm/core/stages/ItemStore.d.ts +37 -0
  127. package/dist/esm/core/stages/ItemStore.d.ts.map +1 -0
  128. package/dist/esm/core/stages/ItemStore.js +163 -0
  129. package/dist/esm/core/stages/ItemStore.js.map +1 -0
  130. package/dist/esm/core/stages/cacheReader.d.ts +18 -0
  131. package/dist/esm/core/stages/cacheReader.d.ts.map +1 -0
  132. package/dist/esm/core/stages/cacheReader.js +65 -0
  133. package/dist/esm/core/stages/cacheReader.js.map +1 -0
  134. package/dist/esm/core/stages/cacheWriter.d.ts +15 -0
  135. package/dist/esm/core/stages/cacheWriter.d.ts.map +1 -0
  136. package/dist/esm/core/stages/cacheWriter.js +43 -0
  137. package/dist/esm/core/stages/cacheWriter.js.map +1 -0
  138. package/dist/esm/{operations/databases → core/stages}/indexedDatabase.d.ts +2 -7
  139. package/dist/esm/core/stages/indexedDatabase.d.ts.map +1 -0
  140. package/dist/esm/core/stages/indexedDatabase.js +28 -0
  141. package/dist/esm/core/stages/indexedDatabase.js.map +1 -0
  142. package/dist/esm/core/stages/memory/memoryDatabase.d.ts +13 -0
  143. package/dist/esm/core/stages/memory/memoryDatabase.d.ts.map +1 -0
  144. package/dist/esm/{operations/databases → core/stages/memory}/memoryDatabase.js +4 -8
  145. package/dist/esm/core/stages/memory/memoryDatabase.js.map +1 -0
  146. package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +3 -3
  147. package/dist/esm/core/stages/memory/memoryDownloader.d.ts.map +1 -0
  148. package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.js +1 -1
  149. package/dist/esm/core/stages/memory/memoryDownloader.js.map +1 -0
  150. package/dist/{commonjs/operations/downloaders → esm/core/stages}/serverDownloader.d.ts +4 -5
  151. package/dist/esm/core/stages/serverDownloader.d.ts.map +1 -0
  152. package/dist/esm/{operations/downloaders → core/stages}/serverDownloader.js +81 -31
  153. package/dist/esm/core/stages/serverDownloader.js.map +1 -0
  154. package/dist/esm/core/traverser.d.ts.map +1 -0
  155. package/dist/esm/{operations → core}/traverser.js +1 -1
  156. package/dist/esm/core/traverser.js.map +1 -0
  157. package/dist/esm/deferment/MemoryCache.d.ts +35 -0
  158. package/dist/esm/deferment/MemoryCache.d.ts.map +1 -0
  159. package/dist/esm/deferment/MemoryCache.js +157 -0
  160. package/dist/esm/deferment/MemoryCache.js.map +1 -0
  161. package/dist/esm/deferment/MemoryCache.test.d.ts +2 -0
  162. package/dist/esm/deferment/MemoryCache.test.d.ts.map +1 -0
  163. package/dist/esm/deferment/MemoryCache.test.js +151 -0
  164. package/dist/esm/deferment/MemoryCache.test.js.map +1 -0
  165. package/dist/esm/deferment/defermentManager.d.ts +16 -0
  166. package/dist/esm/deferment/defermentManager.d.ts.map +1 -0
  167. package/dist/esm/deferment/defermentManager.js +54 -0
  168. package/dist/esm/deferment/defermentManager.js.map +1 -0
  169. package/dist/esm/deferment/defermentManager.test.d.ts +2 -0
  170. package/dist/esm/deferment/defermentManager.test.d.ts.map +1 -0
  171. package/dist/esm/deferment/defermentManager.test.js +186 -0
  172. package/dist/esm/deferment/defermentManager.test.js.map +1 -0
  173. package/dist/esm/deferment/deferredBase.d.ts +12 -0
  174. package/dist/esm/deferment/deferredBase.d.ts.map +1 -0
  175. package/dist/esm/deferment/deferredBase.js +23 -0
  176. package/dist/esm/deferment/deferredBase.js.map +1 -0
  177. package/dist/esm/index.d.ts +3 -3
  178. package/dist/esm/index.d.ts.map +1 -1
  179. package/dist/esm/index.js +3 -3
  180. package/dist/esm/index.js.map +1 -1
  181. package/dist/esm/{helpers → queues}/aggregateQueue.d.ts +2 -1
  182. package/dist/esm/queues/aggregateQueue.d.ts.map +1 -0
  183. package/dist/esm/{helpers → queues}/aggregateQueue.js +4 -0
  184. package/dist/esm/queues/aggregateQueue.js.map +1 -0
  185. package/dist/{commonjs/helpers → esm/queues}/asyncGeneratorQueue.d.ts +1 -1
  186. package/dist/esm/queues/asyncGeneratorQueue.d.ts.map +1 -0
  187. package/dist/esm/{helpers → queues}/asyncGeneratorQueue.js +2 -1
  188. package/dist/esm/queues/asyncGeneratorQueue.js.map +1 -0
  189. package/dist/{commonjs/helpers → esm/queues}/batchedPool.d.ts +2 -1
  190. package/dist/esm/queues/batchedPool.d.ts.map +1 -0
  191. package/dist/esm/queues/batchedPool.js.map +1 -0
  192. package/dist/{commonjs/helpers → esm/queues}/batchingQueue.d.ts +4 -1
  193. package/dist/esm/queues/batchingQueue.d.ts.map +1 -0
  194. package/dist/esm/queues/batchingQueue.dispose.test.d.ts +2 -0
  195. package/dist/esm/queues/batchingQueue.dispose.test.d.ts.map +1 -0
  196. package/dist/esm/queues/batchingQueue.dispose.test.js +59 -0
  197. package/dist/esm/queues/batchingQueue.dispose.test.js.map +1 -0
  198. package/dist/esm/queues/batchingQueue.js +117 -0
  199. package/dist/esm/queues/batchingQueue.js.map +1 -0
  200. package/dist/esm/queues/batchingQueue.test.d.ts +2 -0
  201. package/dist/esm/queues/batchingQueue.test.d.ts.map +1 -0
  202. package/dist/esm/queues/batchingQueue.test.js +133 -0
  203. package/dist/esm/queues/batchingQueue.test.js.map +1 -0
  204. package/dist/{commonjs/helpers → esm/queues}/bufferQueue.d.ts +1 -0
  205. package/dist/esm/queues/bufferQueue.d.ts.map +1 -0
  206. package/dist/esm/{helpers → queues}/bufferQueue.js +3 -0
  207. package/dist/esm/queues/bufferQueue.js.map +1 -0
  208. package/dist/esm/{helpers → queues}/keyedQueue.d.ts +1 -0
  209. package/dist/esm/queues/keyedQueue.d.ts.map +1 -0
  210. package/dist/esm/{helpers → queues}/keyedQueue.js +11 -0
  211. package/dist/esm/queues/keyedQueue.js.map +1 -0
  212. package/dist/esm/queues/queue.d.ts +5 -0
  213. package/dist/esm/queues/queue.d.ts.map +1 -0
  214. package/dist/esm/{helpers → queues}/queue.js.map +1 -1
  215. package/dist/esm/types/functions.d.ts +21 -0
  216. package/dist/esm/types/functions.d.ts.map +1 -0
  217. package/dist/esm/types/functions.js +83 -0
  218. package/dist/esm/types/functions.js.map +1 -0
  219. package/dist/esm/types/types.d.ts +1 -7
  220. package/dist/esm/types/types.d.ts.map +1 -1
  221. package/dist/esm/types/types.js +1 -32
  222. package/dist/esm/types/types.js.map +1 -1
  223. package/package.json +2 -3
  224. package/readme.md +64 -16
  225. package/src/{operations → core}/interfaces.ts +2 -3
  226. package/src/{operations → core}/objectLoader2.spec.ts +22 -9
  227. package/src/core/objectLoader2.ts +162 -0
  228. package/src/core/objectLoader2Factory.ts +87 -0
  229. package/src/{operations → core}/options.ts +2 -1
  230. package/src/core/stages/ItemStore.ts +196 -0
  231. package/src/core/stages/__snapshots__/indexedDatabase.spec.ts.snap +18 -0
  232. package/src/{operations/downloaders → core/stages}/__snapshots__/serverDownloader.spec.ts.snap +25 -0
  233. package/src/{helpers → core/stages}/cacheReader.spec.ts +12 -7
  234. package/src/core/stages/cacheReader.ts +88 -0
  235. package/src/core/stages/cacheWriter.spec.ts +213 -0
  236. package/src/core/stages/cacheWriter.ts +64 -0
  237. package/src/core/stages/indexedDatabase.spec.ts +37 -0
  238. package/src/core/stages/indexedDatabase.ts +49 -0
  239. package/src/core/stages/memory/__snapshots__/memoryDownloader.spec.ts.snap +12 -0
  240. package/src/core/stages/memory/memoryDatabase.spec.ts +48 -0
  241. package/src/{operations/databases → core/stages/memory}/memoryDatabase.ts +7 -12
  242. package/src/core/stages/memory/memoryDownloader.spec.ts +49 -0
  243. package/src/{operations/downloaders → core/stages/memory}/memoryDownloader.ts +4 -4
  244. package/src/{operations/downloaders → core/stages}/serverDownloader.spec.ts +102 -11
  245. package/src/{operations/downloaders → core/stages}/serverDownloader.ts +88 -31
  246. package/src/{operations → core}/traverser.ts +2 -1
  247. package/src/deferment/MemoryCache.test.ts +187 -0
  248. package/src/deferment/MemoryCache.ts +189 -0
  249. package/src/deferment/defermentManager.test.ts +220 -0
  250. package/src/deferment/defermentManager.ts +59 -0
  251. package/src/deferment/deferredBase.ts +29 -0
  252. package/src/index.ts +3 -3
  253. package/src/{helpers → queues}/aggregateQueue.ts +5 -1
  254. package/src/{helpers → queues}/asyncGeneratorQueue.ts +2 -1
  255. package/src/{helpers → queues}/batchedPool.ts +3 -1
  256. package/src/queues/batchingQueue.dispose.test.ts +74 -0
  257. package/src/queues/batchingQueue.test.ts +149 -0
  258. package/src/queues/batchingQueue.ts +138 -0
  259. package/src/{helpers → queues}/bufferQueue.ts +3 -0
  260. package/src/{helpers → queues}/keyedQueue.ts +12 -0
  261. package/src/{helpers → queues}/queue.ts +1 -0
  262. package/src/test/e2e.spec.ts +6 -4
  263. package/src/types/functions.spec.ts +155 -0
  264. package/src/types/functions.ts +118 -0
  265. package/src/types/types.ts +1 -51
  266. package/dist/commonjs/helpers/aggregateQueue.d.ts.map +0 -1
  267. package/dist/commonjs/helpers/aggregateQueue.js.map +0 -1
  268. package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts.map +0 -1
  269. package/dist/commonjs/helpers/asyncGeneratorQueue.js.map +0 -1
  270. package/dist/commonjs/helpers/batchedPool.d.ts.map +0 -1
  271. package/dist/commonjs/helpers/batchedPool.js.map +0 -1
  272. package/dist/commonjs/helpers/batchingQueue.d.ts.map +0 -1
  273. package/dist/commonjs/helpers/batchingQueue.js +0 -77
  274. package/dist/commonjs/helpers/batchingQueue.js.map +0 -1
  275. package/dist/commonjs/helpers/bufferQueue.d.ts.map +0 -1
  276. package/dist/commonjs/helpers/bufferQueue.js.map +0 -1
  277. package/dist/commonjs/helpers/cachePump.d.ts +0 -21
  278. package/dist/commonjs/helpers/cachePump.d.ts.map +0 -1
  279. package/dist/commonjs/helpers/cachePump.js +0 -80
  280. package/dist/commonjs/helpers/cachePump.js.map +0 -1
  281. package/dist/commonjs/helpers/cacheReader.d.ts +0 -14
  282. package/dist/commonjs/helpers/cacheReader.d.ts.map +0 -1
  283. package/dist/commonjs/helpers/cacheReader.js +0 -58
  284. package/dist/commonjs/helpers/cacheReader.js.map +0 -1
  285. package/dist/commonjs/helpers/defermentManager.d.ts +0 -26
  286. package/dist/commonjs/helpers/defermentManager.d.ts.map +0 -1
  287. package/dist/commonjs/helpers/defermentManager.js +0 -131
  288. package/dist/commonjs/helpers/defermentManager.js.map +0 -1
  289. package/dist/commonjs/helpers/deferredBase.d.ts +0 -19
  290. package/dist/commonjs/helpers/deferredBase.d.ts.map +0 -1
  291. package/dist/commonjs/helpers/deferredBase.js +0 -51
  292. package/dist/commonjs/helpers/deferredBase.js.map +0 -1
  293. package/dist/commonjs/helpers/keyedQueue.d.ts.map +0 -1
  294. package/dist/commonjs/helpers/keyedQueue.js.map +0 -1
  295. package/dist/commonjs/helpers/memoryPump.d.ts +0 -15
  296. package/dist/commonjs/helpers/memoryPump.d.ts.map +0 -1
  297. package/dist/commonjs/helpers/memoryPump.js +0 -34
  298. package/dist/commonjs/helpers/memoryPump.js.map +0 -1
  299. package/dist/commonjs/helpers/pump.d.ts +0 -8
  300. package/dist/commonjs/helpers/pump.d.ts.map +0 -1
  301. package/dist/commonjs/helpers/pump.js +0 -3
  302. package/dist/commonjs/helpers/pump.js.map +0 -1
  303. package/dist/commonjs/helpers/queue.d.ts +0 -4
  304. package/dist/commonjs/helpers/queue.d.ts.map +0 -1
  305. package/dist/commonjs/operations/databases/indexedDatabase.d.ts.map +0 -1
  306. package/dist/commonjs/operations/databases/indexedDatabase.js +0 -117
  307. package/dist/commonjs/operations/databases/indexedDatabase.js.map +0 -1
  308. package/dist/commonjs/operations/databases/memoryDatabase.d.ts +0 -16
  309. package/dist/commonjs/operations/databases/memoryDatabase.d.ts.map +0 -1
  310. package/dist/commonjs/operations/databases/memoryDatabase.js.map +0 -1
  311. package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts.map +0 -1
  312. package/dist/commonjs/operations/downloaders/memoryDownloader.js.map +0 -1
  313. package/dist/commonjs/operations/downloaders/serverDownloader.d.ts.map +0 -1
  314. package/dist/commonjs/operations/downloaders/serverDownloader.js.map +0 -1
  315. package/dist/commonjs/operations/interfaces.d.ts.map +0 -1
  316. package/dist/commonjs/operations/interfaces.js.map +0 -1
  317. package/dist/commonjs/operations/objectLoader2.d.ts.map +0 -1
  318. package/dist/commonjs/operations/objectLoader2.js +0 -95
  319. package/dist/commonjs/operations/objectLoader2.js.map +0 -1
  320. package/dist/commonjs/operations/objectLoader2Factory.d.ts +0 -21
  321. package/dist/commonjs/operations/objectLoader2Factory.d.ts.map +0 -1
  322. package/dist/commonjs/operations/objectLoader2Factory.js +0 -50
  323. package/dist/commonjs/operations/objectLoader2Factory.js.map +0 -1
  324. package/dist/commonjs/operations/options.d.ts.map +0 -1
  325. package/dist/commonjs/operations/traverser.d.ts.map +0 -1
  326. package/dist/commonjs/operations/traverser.js.map +0 -1
  327. package/dist/esm/helpers/aggregateQueue.d.ts.map +0 -1
  328. package/dist/esm/helpers/aggregateQueue.js.map +0 -1
  329. package/dist/esm/helpers/asyncGeneratorQueue.d.ts.map +0 -1
  330. package/dist/esm/helpers/asyncGeneratorQueue.js.map +0 -1
  331. package/dist/esm/helpers/batchedPool.d.ts.map +0 -1
  332. package/dist/esm/helpers/batchedPool.js.map +0 -1
  333. package/dist/esm/helpers/batchingQueue.d.ts.map +0 -1
  334. package/dist/esm/helpers/batchingQueue.js +0 -71
  335. package/dist/esm/helpers/batchingQueue.js.map +0 -1
  336. package/dist/esm/helpers/bufferQueue.d.ts.map +0 -1
  337. package/dist/esm/helpers/bufferQueue.js.map +0 -1
  338. package/dist/esm/helpers/cachePump.d.ts +0 -21
  339. package/dist/esm/helpers/cachePump.d.ts.map +0 -1
  340. package/dist/esm/helpers/cachePump.js +0 -73
  341. package/dist/esm/helpers/cachePump.js.map +0 -1
  342. package/dist/esm/helpers/cacheReader.d.ts +0 -14
  343. package/dist/esm/helpers/cacheReader.d.ts.map +0 -1
  344. package/dist/esm/helpers/cacheReader.js +0 -51
  345. package/dist/esm/helpers/cacheReader.js.map +0 -1
  346. package/dist/esm/helpers/defermentManager.d.ts +0 -26
  347. package/dist/esm/helpers/defermentManager.d.ts.map +0 -1
  348. package/dist/esm/helpers/defermentManager.js +0 -127
  349. package/dist/esm/helpers/defermentManager.js.map +0 -1
  350. package/dist/esm/helpers/deferredBase.d.ts +0 -19
  351. package/dist/esm/helpers/deferredBase.d.ts.map +0 -1
  352. package/dist/esm/helpers/deferredBase.js +0 -47
  353. package/dist/esm/helpers/deferredBase.js.map +0 -1
  354. package/dist/esm/helpers/keyedQueue.d.ts.map +0 -1
  355. package/dist/esm/helpers/keyedQueue.js.map +0 -1
  356. package/dist/esm/helpers/memoryPump.d.ts +0 -15
  357. package/dist/esm/helpers/memoryPump.d.ts.map +0 -1
  358. package/dist/esm/helpers/memoryPump.js +0 -30
  359. package/dist/esm/helpers/memoryPump.js.map +0 -1
  360. package/dist/esm/helpers/pump.d.ts +0 -8
  361. package/dist/esm/helpers/pump.d.ts.map +0 -1
  362. package/dist/esm/helpers/pump.js +0 -2
  363. package/dist/esm/helpers/pump.js.map +0 -1
  364. package/dist/esm/helpers/queue.d.ts +0 -4
  365. package/dist/esm/helpers/queue.d.ts.map +0 -1
  366. package/dist/esm/operations/databases/indexedDatabase.d.ts.map +0 -1
  367. package/dist/esm/operations/databases/indexedDatabase.js +0 -114
  368. package/dist/esm/operations/databases/indexedDatabase.js.map +0 -1
  369. package/dist/esm/operations/databases/memoryDatabase.d.ts +0 -16
  370. package/dist/esm/operations/databases/memoryDatabase.d.ts.map +0 -1
  371. package/dist/esm/operations/databases/memoryDatabase.js.map +0 -1
  372. package/dist/esm/operations/downloaders/memoryDownloader.d.ts.map +0 -1
  373. package/dist/esm/operations/downloaders/memoryDownloader.js.map +0 -1
  374. package/dist/esm/operations/downloaders/serverDownloader.d.ts.map +0 -1
  375. package/dist/esm/operations/downloaders/serverDownloader.js.map +0 -1
  376. package/dist/esm/operations/interfaces.d.ts.map +0 -1
  377. package/dist/esm/operations/interfaces.js.map +0 -1
  378. package/dist/esm/operations/objectLoader2.d.ts.map +0 -1
  379. package/dist/esm/operations/objectLoader2.js +0 -88
  380. package/dist/esm/operations/objectLoader2.js.map +0 -1
  381. package/dist/esm/operations/objectLoader2Factory.d.ts +0 -21
  382. package/dist/esm/operations/objectLoader2Factory.d.ts.map +0 -1
  383. package/dist/esm/operations/objectLoader2Factory.js +0 -43
  384. package/dist/esm/operations/objectLoader2Factory.js.map +0 -1
  385. package/dist/esm/operations/options.d.ts.map +0 -1
  386. package/dist/esm/operations/traverser.d.ts.map +0 -1
  387. package/dist/esm/operations/traverser.js.map +0 -1
  388. package/src/helpers/__snapshots__/cachePump.spec.ts.snap +0 -31
  389. package/src/helpers/__snapshots__/defermentManager.spec.ts.snap +0 -8
  390. package/src/helpers/batchingQueue.ts +0 -85
  391. package/src/helpers/cachePump.disposal.spec.ts +0 -49
  392. package/src/helpers/cachePump.spec.ts +0 -103
  393. package/src/helpers/cachePump.ts +0 -99
  394. package/src/helpers/cacheReader.ts +0 -64
  395. package/src/helpers/defermentManager.disposal.spec.ts +0 -28
  396. package/src/helpers/defermentManager.spec.ts +0 -37
  397. package/src/helpers/defermentManager.ts +0 -141
  398. package/src/helpers/deferredBase.ts +0 -55
  399. package/src/helpers/memoryPump.ts +0 -40
  400. package/src/helpers/pump.ts +0 -8
  401. package/src/operations/databases/__snapshots__/indexedDatabase.spec.ts.snap +0 -31
  402. package/src/operations/databases/indexedDatabase.spec.ts +0 -37
  403. package/src/operations/databases/indexedDatabase.ts +0 -150
  404. package/src/operations/objectLoader2.ts +0 -111
  405. package/src/operations/objectLoader2Factory.ts +0 -56
  406. package/dist/commonjs/{operations → core}/interfaces.js +0 -0
  407. package/dist/commonjs/{operations → core}/options.js +0 -0
  408. package/dist/commonjs/{operations → core}/traverser.d.ts +0 -0
  409. package/dist/commonjs/{helpers → queues}/batchedPool.js +0 -0
  410. package/dist/commonjs/{helpers → queues}/queue.js +0 -0
  411. package/dist/esm/{operations → core}/interfaces.js +0 -0
  412. package/dist/esm/{operations → core}/options.js +0 -0
  413. package/dist/esm/{operations → core}/traverser.d.ts +0 -0
  414. package/dist/esm/{helpers → queues}/batchedPool.js +0 -0
  415. package/dist/esm/{helpers → queues}/queue.js +0 -0
  416. package/src/{operations → core}/__snapshots__/objectLoader2.spec.ts.snap +0 -0
  417. package/src/{operations → core}/__snapshots__/traverser.spec.ts.snap +0 -0
  418. package/src/{helpers → core/stages}/__snapshots__/cacheReader.spec.ts.snap +0 -0
  419. package/src/{operations → core}/traverser.spec.ts +1 -1
@@ -0,0 +1,149 @@
1
+ import { describe, test, expect, vi } from 'vitest'
2
+ import BatchingQueue from './batchingQueue.js'
3
+
4
+ describe('BatchingQueue', () => {
5
+ test('should add items and process them in batches', async () => {
6
+ const processSpy = vi.fn()
7
+ const queue = new BatchingQueue({
8
+ batchSize: 2,
9
+ maxWaitTime: 100,
10
+ processFunction: async (batch: string[]): Promise<void> => {
11
+ await new Promise((resolve) => setTimeout(resolve, 0))
12
+ processSpy(batch)
13
+ }
14
+ })
15
+
16
+ try {
17
+ queue.add('key1', 'item1')
18
+ queue.add('key2', 'item2')
19
+
20
+ await new Promise((resolve) => setTimeout(resolve, 200))
21
+
22
+ expect(processSpy).toHaveBeenCalledTimes(1)
23
+ expect(processSpy).toHaveBeenCalledWith(['item1', 'item2'])
24
+ } finally {
25
+ await queue.disposeAsync()
26
+ }
27
+ })
28
+
29
+ test('should process items after timeout if batch size is not reached', async () => {
30
+ const processSpy = vi.fn()
31
+ const queue = new BatchingQueue({
32
+ batchSize: 5,
33
+ maxWaitTime: 100,
34
+ processFunction: async (batch: string[]): Promise<void> => {
35
+ await new Promise((resolve) => setTimeout(resolve, 0))
36
+ processSpy(batch)
37
+ }
38
+ })
39
+
40
+ try {
41
+ queue.add('key1', 'item1')
42
+ queue.add('key2', 'item2')
43
+
44
+ await new Promise((resolve) => setTimeout(resolve, 200))
45
+
46
+ expect(processSpy).toHaveBeenCalledTimes(1)
47
+ expect(processSpy).toHaveBeenCalledWith(['item1', 'item2'])
48
+ } finally {
49
+ await queue.disposeAsync()
50
+ }
51
+ })
52
+
53
+ test('should handle multiple batches correctly', async () => {
54
+ const processSpy = vi.fn()
55
+ const queue = new BatchingQueue({
56
+ batchSize: 2,
57
+ maxWaitTime: 100,
58
+ processFunction: async (batch: string[]): Promise<void> => {
59
+ await new Promise((resolve) => setTimeout(resolve, 0))
60
+ processSpy(batch)
61
+ }
62
+ })
63
+
64
+ try {
65
+ queue.add('key1', 'item1')
66
+ queue.add('key2', 'item2')
67
+ queue.add('key3', 'item3')
68
+ queue.add('key4', 'item4')
69
+
70
+ await new Promise((resolve) => setTimeout(resolve, 200))
71
+
72
+ expect(processSpy).toHaveBeenCalledTimes(2)
73
+ expect(processSpy).toHaveBeenCalledWith(['item1', 'item2'])
74
+ expect(processSpy).toHaveBeenCalledWith(['item3', 'item4'])
75
+ } finally {
76
+ await queue.disposeAsync()
77
+ }
78
+ })
79
+
80
+ test('should retrieve items by key', async () => {
81
+ const queue = new BatchingQueue<string>({
82
+ batchSize: 3,
83
+ maxWaitTime: 100,
84
+ processFunction: async (): Promise<void> => {
85
+ await new Promise((resolve) => setTimeout(resolve, 0))
86
+ }
87
+ })
88
+ try {
89
+ queue.add('key1', 'item1')
90
+ queue.add('key2', 'item2')
91
+
92
+ expect(queue.get('key1')).toBe('item1')
93
+ expect(queue.get('key2')).toBe('item2')
94
+ expect(queue.get('key3')).toBeUndefined()
95
+ } finally {
96
+ await queue.disposeAsync()
97
+ }
98
+ })
99
+
100
+ test('should return correct count of items', async () => {
101
+ const queue = new BatchingQueue<string>({
102
+ batchSize: 3,
103
+ maxWaitTime: 100,
104
+ processFunction: async (): Promise<void> => {
105
+ await new Promise((resolve) => setTimeout(resolve, 0))
106
+ }
107
+ })
108
+ try {
109
+ expect(queue.count()).toBe(0)
110
+
111
+ queue.add('key1', 'item1')
112
+ queue.add('key2', 'item2')
113
+
114
+ expect(queue.count()).toBe(2)
115
+ } finally {
116
+ await queue.disposeAsync()
117
+ }
118
+ })
119
+
120
+ test('should not process items if already processing', async () => {
121
+ const processSpy = vi.fn()
122
+ const queue = new BatchingQueue({
123
+ batchSize: 2,
124
+ maxWaitTime: 100,
125
+ processFunction: async (batch: string[]): Promise<void> => {
126
+ processSpy(batch)
127
+ await new Promise((resolve) => setTimeout(resolve, 300))
128
+ }
129
+ })
130
+
131
+ try {
132
+ queue.add('key1', 'item1')
133
+ queue.add('key2', 'item2')
134
+ queue.add('key3', 'item3')
135
+
136
+ await new Promise((resolve) => setTimeout(resolve, 200))
137
+
138
+ expect(processSpy).toHaveBeenCalledTimes(1)
139
+ expect(processSpy).toHaveBeenCalledWith(['item1', 'item2'])
140
+
141
+ await new Promise((resolve) => setTimeout(resolve, 500))
142
+
143
+ expect(processSpy).toHaveBeenCalledTimes(2)
144
+ expect(processSpy).toHaveBeenCalledWith(['item3'])
145
+ } finally {
146
+ await queue.disposeAsync()
147
+ }
148
+ })
149
+ })
@@ -0,0 +1,138 @@
1
+ import { CustomLogger } from '../types/functions.js'
2
+ import KeyedQueue from './keyedQueue.js'
3
+
4
+ /**
5
+ * Default wait time in milliseconds for processing ongoing tasks during disposal.
6
+ * This value was chosen to balance responsiveness and CPU usage in typical scenarios.
7
+ */
8
+ const PROCESSING_WAIT_TIME_MS = 100
9
+
10
+ export default class BatchingQueue<T> {
11
+ #queue: KeyedQueue<string, T> = new KeyedQueue<string, T>()
12
+ #batchSize: number
13
+ #processFunction: (batch: T[]) => Promise<void>
14
+ #timeoutId: ReturnType<typeof setTimeout> | null = null
15
+ #isProcessing = false
16
+ #logger: CustomLogger
17
+
18
+ #disposed = false
19
+ #batchTimeout: number
20
+
21
+ // Helper methods for cross-environment timeout handling
22
+ #getSetTimeoutFn(): typeof setTimeout {
23
+ // First check for window object (browser), then fallback to global (node), then just use setTimeout
24
+ return typeof window !== 'undefined'
25
+ ? window.setTimeout.bind(window)
26
+ : typeof global !== 'undefined'
27
+ ? global.setTimeout
28
+ : setTimeout
29
+ }
30
+
31
+ #getClearTimeoutFn(): typeof clearTimeout {
32
+ // First check for window object (browser), then fallback to global (node), then just use clearTimeout
33
+ return typeof window !== 'undefined'
34
+ ? window.clearTimeout.bind(window)
35
+ : typeof global !== 'undefined'
36
+ ? global.clearTimeout
37
+ : clearTimeout
38
+ }
39
+
40
+ constructor(params: {
41
+ batchSize: number
42
+ maxWaitTime: number
43
+ processFunction: (batch: T[]) => Promise<void>
44
+ logger?: CustomLogger
45
+ }) {
46
+ this.#batchSize = params.batchSize
47
+ this.#processFunction = params.processFunction
48
+ this.#batchTimeout = params.maxWaitTime
49
+ this.#logger = params.logger || ((): void => {})
50
+ }
51
+
52
+ async disposeAsync(): Promise<void> {
53
+ this.#disposed = true
54
+ if (this.#timeoutId) {
55
+ this.#getClearTimeoutFn()(this.#timeoutId)
56
+ this.#timeoutId = null
57
+ }
58
+
59
+ // Wait for any ongoing processing to finish
60
+ while (this.#isProcessing) {
61
+ await new Promise((resolve) =>
62
+ this.#getSetTimeoutFn()(resolve, PROCESSING_WAIT_TIME_MS)
63
+ )
64
+ }
65
+
66
+ // After any ongoing flush is completed, there might be items in the queue.
67
+ // We should flush them.
68
+ if (this.#queue.size > 0) {
69
+ await this.#flush()
70
+ }
71
+ }
72
+
73
+ add(key: string, item: T): void {
74
+ if (this.#disposed) return
75
+ this.#queue.enqueue(key, item)
76
+ this.#addCheck()
77
+ }
78
+
79
+ addAll(keys: string[], items: T[]): void {
80
+ if (this.#disposed) return
81
+ this.#queue.enqueueAll(keys, items)
82
+ this.#addCheck()
83
+ }
84
+
85
+ #addCheck(): void {
86
+ if (this.#disposed) return
87
+ if (this.#queue.size >= this.#batchSize) {
88
+ // Fire and forget, no need to await
89
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
90
+ this.#flush()
91
+ } else {
92
+ if (this.#timeoutId) {
93
+ this.#getClearTimeoutFn()(this.#timeoutId)
94
+ }
95
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
96
+ this.#timeoutId = this.#getSetTimeoutFn()(() => this.#flush(), this.#batchTimeout)
97
+ }
98
+ }
99
+
100
+ async #flush(): Promise<void> {
101
+ if (this.#timeoutId) {
102
+ this.#getClearTimeoutFn()(this.#timeoutId)
103
+ this.#timeoutId = null
104
+ }
105
+
106
+ if (this.#isProcessing || this.#queue.size === 0) {
107
+ return
108
+ }
109
+ this.#isProcessing = true
110
+
111
+ const batchToProcess = this.#getBatch(this.#batchSize)
112
+
113
+ try {
114
+ await this.#processFunction(batchToProcess)
115
+ } catch (error) {
116
+ this.#logger('Batch processing failed:', error)
117
+ } finally {
118
+ this.#isProcessing = false
119
+ }
120
+ this.#addCheck()
121
+ }
122
+
123
+ get(id: string): T | undefined {
124
+ return this.#queue.get(id)
125
+ }
126
+
127
+ count(): number {
128
+ return this.#queue.size
129
+ }
130
+
131
+ isDisposed(): boolean {
132
+ return this.#disposed
133
+ }
134
+
135
+ #getBatch(batchSize: number): T[] {
136
+ return this.#queue.spliceValues(0, Math.min(batchSize, this.#queue.size))
137
+ }
138
+ }
@@ -9,4 +9,7 @@ export default class BufferQueue<T> implements Queue<T> {
9
9
  values(): T[] {
10
10
  return this.#buffer
11
11
  }
12
+ disposeAsync(): Promise<void> {
13
+ return Promise.resolve()
14
+ }
12
15
  }
@@ -16,6 +16,18 @@ export default class KeyedQueue<K, V> {
16
16
  return true
17
17
  }
18
18
 
19
+ enqueueAll(keys: K[], values: V[]): number {
20
+ let count = 0
21
+ for (let i = 0; i < keys.length; i++) {
22
+ if (!this._map.has(keys[i])) {
23
+ this._map.set(keys[i], values[i])
24
+ this._order.push(keys[i])
25
+ count++
26
+ }
27
+ }
28
+ return count
29
+ }
30
+
19
31
  get(key: K): V | undefined {
20
32
  return this._map.get(key)
21
33
  }
@@ -1,3 +1,4 @@
1
1
  export default interface Queue<T> {
2
2
  add(value: T): void
3
+ disposeAsync(): Promise<void>
3
4
  }
@@ -1,8 +1,8 @@
1
1
  import { describe, test, expect } from 'vitest'
2
2
  import { IDBFactory, IDBKeyRange } from 'fake-indexeddb'
3
- import { Base } from '../types/types.js'
4
3
  import { TIME_MS } from '@speckle/shared'
5
- import { ObjectLoader2Factory } from '../operations/objectLoader2Factory.js'
4
+ import { ObjectLoader2Factory } from '../core/objectLoader2Factory.js'
5
+ import { Base } from '../types/types.js'
6
6
 
7
7
  describe('e2e', () => {
8
8
  test(
@@ -14,8 +14,10 @@ describe('e2e', () => {
14
14
  serverUrl: 'https://app.speckle.systems',
15
15
  streamId: 'da9e320dad',
16
16
  objectId: '31d10c0cea569a1e26809658ed27e281',
17
- indexedDB: new IDBFactory(),
18
- keyRange: IDBKeyRange
17
+ options: {
18
+ indexedDB: new IDBFactory(),
19
+ keyRange: IDBKeyRange
20
+ }
19
21
  })
20
22
 
21
23
  const getObjectPromise = loader.getObject({
@@ -0,0 +1,155 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
2
+ import {
3
+ isBase,
4
+ isReference,
5
+ isScalar,
6
+ take,
7
+ getFeatureFlag,
8
+ ObjectLoader2Flags
9
+ } from './functions.js'
10
+
11
+ describe('isBase', () => {
12
+ it('should return true for valid Base objects', () => {
13
+ expect(isBase({ id: '123', speckle_type: 'Base' })).toBe(true)
14
+ })
15
+
16
+ it('should return false for objects without an id', () => {
17
+ expect(isBase({ speckle_type: 'Base' })).toBe(false)
18
+ })
19
+
20
+ it('should return false for objects with a non-string id', () => {
21
+ expect(isBase({ id: 123, speckle_type: 'Base' })).toBe(false)
22
+ })
23
+
24
+ it('should return false for null or undefined', () => {
25
+ expect(isBase(null)).toBe(false)
26
+ expect(isBase(undefined)).toBe(false)
27
+ })
28
+
29
+ it('should return false for non-objects', () => {
30
+ expect(isBase('a string')).toBe(false)
31
+ expect(isBase(123)).toBe(false)
32
+ })
33
+ })
34
+
35
+ describe('isReference', () => {
36
+ it('should return true for valid Reference objects', () => {
37
+ expect(isReference({ referencedId: '456' })).toBe(true)
38
+ })
39
+
40
+ it('should return false for objects without a referencedId', () => {
41
+ expect(isReference({ id: '456' })).toBe(false)
42
+ })
43
+
44
+ it('should return false for objects with a non-string referencedId', () => {
45
+ expect(isReference({ referencedId: 456 })).toBe(false)
46
+ })
47
+
48
+ it('should return false for null or undefined', () => {
49
+ expect(isReference(null)).toBe(false)
50
+ expect(isReference(undefined)).toBe(false)
51
+ })
52
+
53
+ it('should return false for non-objects', () => {
54
+ expect(isReference('a string')).toBe(false)
55
+ expect(isReference(123)).toBe(false)
56
+ })
57
+ })
58
+
59
+ describe('isScalar', () => {
60
+ it('should return true for scalar values', () => {
61
+ expect(isScalar('hello')).toBe(true)
62
+ expect(isScalar(123)).toBe(true)
63
+ expect(isScalar(true)).toBe(true)
64
+ expect(isScalar(BigInt(9007199254740991))).toBe(true)
65
+ expect(isScalar(Symbol('id'))).toBe(true)
66
+ expect(isScalar(undefined)).toBe(true)
67
+ expect(isScalar(null)).toBe(true)
68
+ })
69
+
70
+ it('should return false for non-scalar values', () => {
71
+ expect(isScalar({})).toBe(false)
72
+ expect(isScalar([])).toBe(false)
73
+ expect(isScalar(() => {})).toBe(false)
74
+ })
75
+ })
76
+
77
+ describe('take', () => {
78
+ it('should take the specified number of items from an iterator', () => {
79
+ const arr = [1, 2, 3, 4, 5]
80
+ const iterator = arr[Symbol.iterator]()
81
+ expect(take(iterator, 3)).toEqual([1, 2, 3])
82
+ })
83
+
84
+ it('should take all items if count is larger than the number of items', () => {
85
+ const arr = [1, 2]
86
+ const iterator = arr[Symbol.iterator]()
87
+ expect(take(iterator, 5)).toEqual([1, 2])
88
+ })
89
+
90
+ it('should take no items if count is 0', () => {
91
+ const arr = [1, 2, 3]
92
+ const iterator = arr[Symbol.iterator]()
93
+ expect(take(iterator, 0)).toEqual([])
94
+ })
95
+
96
+ it('should work with an empty iterator', () => {
97
+ const arr: number[] = []
98
+ const iterator = arr[Symbol.iterator]()
99
+ expect(take(iterator, 3)).toEqual([])
100
+ })
101
+ })
102
+
103
+ describe('getFeatureFlag', () => {
104
+ describe('in a non-browser environment', () => {
105
+ it('should return the default value', () => {
106
+ expect(getFeatureFlag(ObjectLoader2Flags.USE_CACHE)).toBe('true')
107
+ })
108
+
109
+ it('should return undefined when useDefault is false', () => {
110
+ expect(getFeatureFlag(ObjectLoader2Flags.USE_CACHE, false)).toBe(undefined)
111
+ })
112
+ })
113
+
114
+ describe('in a browser environment', () => {
115
+ const mockWindow = {
116
+ document: {},
117
+ location: {
118
+ search: ''
119
+ }
120
+ }
121
+
122
+ beforeEach(() => {
123
+ vi.stubGlobal('window', mockWindow)
124
+ })
125
+
126
+ afterEach(() => {
127
+ vi.unstubAllGlobals()
128
+ })
129
+
130
+ it('should return the parameter value from the URL', () => {
131
+ mockWindow.location.search = '?debug=value'
132
+ expect(getFeatureFlag(ObjectLoader2Flags.DEBUG)).toBe('value')
133
+ })
134
+
135
+ it('should return the default value if the parameter is not in the URL', () => {
136
+ mockWindow.location.search = '?otherparam=value'
137
+ expect(getFeatureFlag(ObjectLoader2Flags.DEBUG)).toBe('false')
138
+ })
139
+
140
+ it('should return the default value if the URL has no query string', () => {
141
+ mockWindow.location.search = ''
142
+ expect(getFeatureFlag(ObjectLoader2Flags.DEBUG)).toBe('false')
143
+ })
144
+
145
+ it('should return undefined if useDefault is false and parameter is not in URL', () => {
146
+ mockWindow.location.search = '?otherparam=value'
147
+ expect(getFeatureFlag(ObjectLoader2Flags.DEBUG, false)).toBe(undefined)
148
+ })
149
+
150
+ it('should still return the parameter value from URL when useDefault is false', () => {
151
+ mockWindow.location.search = '?debug=custom'
152
+ expect(getFeatureFlag(ObjectLoader2Flags.DEBUG, false)).toBe('custom')
153
+ })
154
+ })
155
+ })
@@ -0,0 +1,118 @@
1
+ import { Base, Reference } from './types.js'
2
+
3
+ export type CustomLogger = (message?: string, ...optionalParams: unknown[]) => void
4
+
5
+ export type Fetcher = (
6
+ input: string | URL | Request,
7
+ init?: RequestInit
8
+ ) => Promise<Response>
9
+
10
+ export function isBase(maybeBase?: unknown): maybeBase is Base {
11
+ return (
12
+ maybeBase !== null &&
13
+ typeof maybeBase === 'object' &&
14
+ 'id' in maybeBase &&
15
+ typeof maybeBase.id === 'string'
16
+ )
17
+ }
18
+
19
+ export function isReference(maybeRef?: unknown): maybeRef is Reference {
20
+ return (
21
+ maybeRef !== null &&
22
+ typeof maybeRef === 'object' &&
23
+ 'referencedId' in maybeRef &&
24
+ typeof maybeRef.referencedId === 'string'
25
+ )
26
+ }
27
+
28
+ export function isScalar(
29
+ value: unknown
30
+ ): value is string | number | boolean | bigint | symbol | undefined {
31
+ const type = typeof value
32
+ return (
33
+ value === null ||
34
+ type === 'string' ||
35
+ type === 'number' ||
36
+ type === 'boolean' ||
37
+ type === 'bigint' ||
38
+ type === 'symbol' ||
39
+ type === 'undefined'
40
+ )
41
+ }
42
+
43
+ export function take<T>(it: Iterator<T>, count: number): T[] {
44
+ const result: T[] = []
45
+ for (let i = 0; i < count; i++) {
46
+ const itr = it.next()
47
+ if (itr.done) break
48
+ result.push(itr.value)
49
+ }
50
+ return result
51
+ }
52
+
53
+ export enum ObjectLoader2Flags {
54
+ DEBUG = 'debug',
55
+ USE_CACHE = 'useCache'
56
+ }
57
+
58
+ const defaultValues: Record<ObjectLoader2Flags, string> = {
59
+ [ObjectLoader2Flags.DEBUG]: 'false',
60
+ [ObjectLoader2Flags.USE_CACHE]: 'true'
61
+ }
62
+
63
+ export function getFeatureFlag(
64
+ paramName: ObjectLoader2Flags,
65
+ useDefault: boolean = true
66
+ ): string | undefined {
67
+ // Check if the code is running in a browser environment 🌐
68
+ const isBrowser =
69
+ typeof window !== 'undefined' && typeof window.document !== 'undefined'
70
+
71
+ if (!isBrowser) {
72
+ // If in Node.js or another server environment, return the default
73
+ return useDefault ? defaultValues[paramName] : undefined
74
+ }
75
+
76
+ // In a browser, parse the query string
77
+ const params = new URLSearchParams(window.location.search)
78
+
79
+ // .get() returns the value, or null if it's not found.
80
+ // The nullish coalescing operator (??) provides the default value
81
+ // if the left-hand side is null or undefined.
82
+ return params.get(paramName) ?? (useDefault ? defaultValues[paramName] : undefined)
83
+ }
84
+
85
+ /**
86
+ * Finds the first index of a "needle" Uint8Array within a "haystack" Uint8Array.
87
+ * @param haystack The larger array to search within.
88
+ * @param needle The smaller array to search for.
89
+ * @param start The index to start searching from. Defaults to 0.
90
+ * @returns The starting index of the needle, or -1 if not found.
91
+ */
92
+ export function indexOf(
93
+ haystack: Uint8Array,
94
+ needle: Uint8Array,
95
+ start: number = 0
96
+ ): number {
97
+ if (needle.length === 0) {
98
+ return 0
99
+ }
100
+
101
+ // The last possible starting position for a match
102
+ const limit = haystack.length - needle.length
103
+
104
+ for (let i = start; i <= limit; i++) {
105
+ let foundMatch = true
106
+ for (let j = 0; j < needle.length; j++) {
107
+ if (haystack[i + j] !== needle[j]) {
108
+ foundMatch = false
109
+ break // Mismatch, break inner loop
110
+ }
111
+ }
112
+ if (foundMatch) {
113
+ return i // Found a full match at index i
114
+ }
115
+ }
116
+
117
+ return -1 // No match found
118
+ }
@@ -1,13 +1,6 @@
1
- export type CustomLogger = (message?: string, ...optionalParams: unknown[]) => void
2
-
3
- export type Fetcher = (
4
- input: string | URL | Request,
5
- init?: RequestInit
6
- ) => Promise<Response>
7
-
8
1
  export interface Item {
9
2
  baseId: string
10
- base: Base
3
+ base?: Base
11
4
  size?: number
12
5
  }
13
6
 
@@ -26,46 +19,3 @@ export interface Reference {
26
19
  export interface DataChunk extends Base {
27
20
  data?: Base[]
28
21
  }
29
-
30
- export function isBase(maybeBase?: unknown): maybeBase is Base {
31
- return (
32
- maybeBase !== null &&
33
- typeof maybeBase === 'object' &&
34
- 'id' in maybeBase &&
35
- typeof maybeBase.id === 'string'
36
- )
37
- }
38
-
39
- export function isReference(maybeRef?: unknown): maybeRef is Reference {
40
- return (
41
- maybeRef !== null &&
42
- typeof maybeRef === 'object' &&
43
- 'referencedId' in maybeRef &&
44
- typeof maybeRef.referencedId === 'string'
45
- )
46
- }
47
-
48
- export function isScalar(
49
- value: unknown
50
- ): value is string | number | boolean | bigint | symbol | undefined {
51
- const type = typeof value
52
- return (
53
- value === null ||
54
- type === 'string' ||
55
- type === 'number' ||
56
- type === 'boolean' ||
57
- type === 'bigint' ||
58
- type === 'symbol' ||
59
- type === 'undefined'
60
- )
61
- }
62
-
63
- export function take<T>(it: Iterator<T>, count: number): T[] {
64
- const result: T[] = []
65
- for (let i = 0; i < count; i++) {
66
- const itr = it.next()
67
- if (itr.done) break
68
- result.push(itr.value)
69
- }
70
- return result
71
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"aggregateQueue.d.ts","sourceRoot":"","sources":["../../../src/helpers/aggregateQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAA;AAE9B,MAAM,CAAC,OAAO,OAAO,cAAc,CAAC,CAAC,CAAE,YAAW,KAAK,CAAC,CAAC,CAAC;;gBAI5C,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAK9C,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAKnB,MAAM,IAAI,CAAC,EAAE;CAGd"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"aggregateQueue.js","sourceRoot":"","sources":["../../../src/helpers/aggregateQueue.ts"],"names":[],"mappings":";;AAEA,MAAqB,cAAc;IACjC,OAAO,CAAU;IACjB,OAAO,CAAU;IAEjB,YAAY,MAAgB,EAAE,MAAgB;QAC5C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,GAAG,CAAC,KAAQ;QACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACpC,CAAC;CACF;AAjBD,iCAiBC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"asyncGeneratorQueue.d.ts","sourceRoot":"","sources":["../../../src/helpers/asyncGeneratorQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAA;AAE9B,MAAM,CAAC,OAAO,OAAO,mBAAmB,CAAC,CAAC,CAAE,YAAW,KAAK,CAAC,CAAC,CAAC;;IAK7D,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAWZ,OAAO,IAAI,cAAc,CAAC,CAAC,CAAC;IAanC,OAAO,IAAI,IAAI;CAGhB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"asyncGeneratorQueue.js","sourceRoot":"","sources":["../../../src/helpers/asyncGeneratorQueue.ts"],"names":[],"mappings":";;AAEA,MAAqB,mBAAmB;IACtC,OAAO,GAAQ,EAAE,CAAA;IACjB,aAAa,GAA2B,EAAE,CAAA;IAC1C,SAAS,GAAG,KAAK,CAAA;IAEjB,GAAG,CAAC,KAAQ;QACV,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,qDAAqD;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAG,CAAA;YAC3C,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,+BAA+B;YAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,OAAO;QACZ,OACE,CAAC,IAAI,CAAC,SAAS;YACf,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EACvB,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAG,CAAA,CAAC,yBAAyB;YACvD,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACvB,CAAC;CACF;AAhCD,sCAgCC"}