@synchronized-console/objectloader2 2.25.7 → 2.31.14

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 (423) hide show
  1. package/dist/commonjs/{operations → core}/interfaces.d.ts +5 -7
  2. package/dist/commonjs/core/interfaces.d.ts.map +1 -0
  3. package/dist/commonjs/core/interfaces.js.map +1 -0
  4. package/dist/commonjs/{operations → core}/objectLoader2.d.ts +1 -1
  5. package/dist/commonjs/core/objectLoader2.d.ts.map +1 -0
  6. package/dist/commonjs/core/objectLoader2.js +120 -0
  7. package/dist/commonjs/core/objectLoader2.js.map +1 -0
  8. package/dist/{esm/operations → commonjs/core}/objectLoader2Factory.d.ts +10 -2
  9. package/dist/commonjs/core/objectLoader2Factory.d.ts.map +1 -0
  10. package/dist/commonjs/core/objectLoader2Factory.js +86 -0
  11. package/dist/commonjs/core/objectLoader2Factory.js.map +1 -0
  12. package/dist/commonjs/core/objectLoader2Factory.test.d.ts +2 -0
  13. package/dist/commonjs/core/objectLoader2Factory.test.d.ts.map +1 -0
  14. package/dist/commonjs/core/objectLoader2Factory.test.js +106 -0
  15. package/dist/commonjs/core/objectLoader2Factory.test.js.map +1 -0
  16. package/dist/{esm/operations → commonjs/core}/options.d.ts +4 -1
  17. package/dist/commonjs/core/options.d.ts.map +1 -0
  18. package/dist/commonjs/{operations → core}/options.js.map +1 -1
  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/core/stages/indexedDatabase.d.ts +34 -0
  28. package/dist/commonjs/core/stages/indexedDatabase.d.ts.map +1 -0
  29. package/dist/commonjs/core/stages/indexedDatabase.js +150 -0
  30. package/dist/commonjs/core/stages/indexedDatabase.js.map +1 -0
  31. package/dist/commonjs/core/stages/memory/memoryDatabase.d.ts +11 -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 +6 -3
  34. package/dist/commonjs/core/stages/memory/memoryDatabase.js.map +1 -0
  35. package/dist/commonjs/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +4 -4
  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 +8 -6
  40. package/dist/commonjs/core/stages/serverDownloader.d.ts.map +1 -0
  41. package/dist/commonjs/{operations/downloaders → core/stages}/serverDownloader.js +99 -50
  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 +32 -0
  55. package/dist/commonjs/deferment/defermentManager.d.ts.map +1 -0
  56. package/dist/commonjs/deferment/defermentManager.js +85 -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 +193 -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 +4 -2
  67. package/dist/commonjs/index.d.ts.map +1 -1
  68. package/dist/commonjs/index.js +6 -3
  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/commonjs/{helpers → queues}/batchingQueue.d.ts +4 -1
  79. package/dist/commonjs/queues/batchingQueue.d.ts.map +1 -0
  80. package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts +2 -0
  81. package/dist/commonjs/queues/batchingQueue.dispose.test.d.ts.map +1 -0
  82. package/dist/commonjs/queues/batchingQueue.dispose.test.js +62 -0
  83. package/dist/commonjs/queues/batchingQueue.dispose.test.js.map +1 -0
  84. package/dist/commonjs/queues/batchingQueue.js +128 -0
  85. package/dist/commonjs/queues/batchingQueue.js.map +1 -0
  86. package/dist/commonjs/queues/batchingQueue.test.d.ts +2 -0
  87. package/dist/commonjs/queues/batchingQueue.test.d.ts.map +1 -0
  88. package/dist/commonjs/queues/batchingQueue.test.js +236 -0
  89. package/dist/commonjs/queues/batchingQueue.test.js.map +1 -0
  90. package/dist/{esm/helpers → commonjs/queues}/bufferQueue.d.ts +1 -0
  91. package/dist/commonjs/queues/bufferQueue.d.ts.map +1 -0
  92. package/dist/commonjs/{helpers → queues}/bufferQueue.js +3 -0
  93. package/dist/commonjs/queues/bufferQueue.js.map +1 -0
  94. package/dist/commonjs/{helpers → queues}/keyedQueue.d.ts +1 -0
  95. package/dist/commonjs/queues/keyedQueue.d.ts.map +1 -0
  96. package/dist/commonjs/{helpers → queues}/keyedQueue.js +11 -0
  97. package/dist/commonjs/queues/keyedQueue.js.map +1 -0
  98. package/dist/commonjs/queues/keyedQueue.test.d.ts +2 -0
  99. package/dist/commonjs/queues/keyedQueue.test.d.ts.map +1 -0
  100. package/dist/commonjs/queues/keyedQueue.test.js +118 -0
  101. package/dist/commonjs/queues/keyedQueue.test.js.map +1 -0
  102. package/dist/commonjs/queues/queue.d.ts +5 -0
  103. package/dist/commonjs/queues/queue.d.ts.map +1 -0
  104. package/dist/commonjs/{helpers → queues}/queue.js.map +1 -1
  105. package/dist/commonjs/types/functions.d.ts +21 -0
  106. package/dist/commonjs/types/functions.d.ts.map +1 -0
  107. package/dist/commonjs/types/functions.js +92 -0
  108. package/dist/commonjs/types/functions.js.map +1 -0
  109. package/dist/commonjs/types/types.d.ts +6 -7
  110. package/dist/commonjs/types/types.d.ts.map +1 -1
  111. package/dist/commonjs/types/types.js +0 -36
  112. package/dist/commonjs/types/types.js.map +1 -1
  113. package/dist/esm/{operations → core}/interfaces.d.ts +5 -7
  114. package/dist/esm/core/interfaces.d.ts.map +1 -0
  115. package/dist/esm/core/interfaces.js.map +1 -0
  116. package/dist/esm/{operations → core}/objectLoader2.d.ts +1 -1
  117. package/dist/esm/core/objectLoader2.d.ts.map +1 -0
  118. package/dist/esm/core/objectLoader2.js +113 -0
  119. package/dist/esm/core/objectLoader2.js.map +1 -0
  120. package/dist/{commonjs/operations → esm/core}/objectLoader2Factory.d.ts +10 -2
  121. package/dist/esm/core/objectLoader2Factory.d.ts.map +1 -0
  122. package/dist/esm/core/objectLoader2Factory.js +79 -0
  123. package/dist/esm/core/objectLoader2Factory.js.map +1 -0
  124. package/dist/esm/core/objectLoader2Factory.test.d.ts +2 -0
  125. package/dist/esm/core/objectLoader2Factory.test.d.ts.map +1 -0
  126. package/dist/esm/core/objectLoader2Factory.test.js +104 -0
  127. package/dist/esm/core/objectLoader2Factory.test.js.map +1 -0
  128. package/dist/{commonjs/operations → esm/core}/options.d.ts +4 -1
  129. package/dist/esm/core/options.d.ts.map +1 -0
  130. package/dist/esm/{operations → core}/options.js.map +1 -1
  131. package/dist/esm/core/stages/cacheReader.d.ts +18 -0
  132. package/dist/esm/core/stages/cacheReader.d.ts.map +1 -0
  133. package/dist/esm/core/stages/cacheReader.js +65 -0
  134. package/dist/esm/core/stages/cacheReader.js.map +1 -0
  135. package/dist/esm/core/stages/cacheWriter.d.ts +15 -0
  136. package/dist/esm/core/stages/cacheWriter.d.ts.map +1 -0
  137. package/dist/esm/core/stages/cacheWriter.js +43 -0
  138. package/dist/esm/core/stages/cacheWriter.js.map +1 -0
  139. package/dist/esm/core/stages/indexedDatabase.d.ts +34 -0
  140. package/dist/esm/core/stages/indexedDatabase.d.ts.map +1 -0
  141. package/dist/esm/core/stages/indexedDatabase.js +146 -0
  142. package/dist/esm/core/stages/indexedDatabase.js.map +1 -0
  143. package/dist/esm/core/stages/memory/memoryDatabase.d.ts +11 -0
  144. package/dist/esm/core/stages/memory/memoryDatabase.d.ts.map +1 -0
  145. package/dist/esm/{operations/databases → core/stages/memory}/memoryDatabase.js +6 -3
  146. package/dist/esm/core/stages/memory/memoryDatabase.js.map +1 -0
  147. package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.d.ts +4 -4
  148. package/dist/esm/core/stages/memory/memoryDownloader.d.ts.map +1 -0
  149. package/dist/esm/{operations/downloaders → core/stages/memory}/memoryDownloader.js +1 -1
  150. package/dist/esm/core/stages/memory/memoryDownloader.js.map +1 -0
  151. package/dist/{commonjs/operations/downloaders → esm/core/stages}/serverDownloader.d.ts +8 -6
  152. package/dist/esm/core/stages/serverDownloader.d.ts.map +1 -0
  153. package/dist/esm/{operations/downloaders → core/stages}/serverDownloader.js +98 -49
  154. package/dist/esm/core/stages/serverDownloader.js.map +1 -0
  155. package/dist/esm/core/traverser.d.ts.map +1 -0
  156. package/dist/esm/{operations → core}/traverser.js +1 -1
  157. package/dist/esm/core/traverser.js.map +1 -0
  158. package/dist/esm/deferment/MemoryCache.d.ts +35 -0
  159. package/dist/esm/deferment/MemoryCache.d.ts.map +1 -0
  160. package/dist/esm/deferment/MemoryCache.js +157 -0
  161. package/dist/esm/deferment/MemoryCache.js.map +1 -0
  162. package/dist/esm/deferment/MemoryCache.test.d.ts +2 -0
  163. package/dist/esm/deferment/MemoryCache.test.d.ts.map +1 -0
  164. package/dist/esm/deferment/MemoryCache.test.js +151 -0
  165. package/dist/esm/deferment/MemoryCache.test.js.map +1 -0
  166. package/dist/esm/deferment/defermentManager.d.ts +32 -0
  167. package/dist/esm/deferment/defermentManager.d.ts.map +1 -0
  168. package/dist/esm/deferment/defermentManager.js +80 -0
  169. package/dist/esm/deferment/defermentManager.js.map +1 -0
  170. package/dist/esm/deferment/defermentManager.test.d.ts +2 -0
  171. package/dist/esm/deferment/defermentManager.test.d.ts.map +1 -0
  172. package/dist/esm/deferment/defermentManager.test.js +191 -0
  173. package/dist/esm/deferment/defermentManager.test.js.map +1 -0
  174. package/dist/esm/deferment/deferredBase.d.ts +12 -0
  175. package/dist/esm/deferment/deferredBase.d.ts.map +1 -0
  176. package/dist/esm/deferment/deferredBase.js +23 -0
  177. package/dist/esm/deferment/deferredBase.js.map +1 -0
  178. package/dist/esm/index.d.ts +4 -2
  179. package/dist/esm/index.d.ts.map +1 -1
  180. package/dist/esm/index.js +3 -2
  181. package/dist/esm/index.js.map +1 -1
  182. package/dist/esm/{helpers → queues}/aggregateQueue.d.ts +2 -1
  183. package/dist/esm/queues/aggregateQueue.d.ts.map +1 -0
  184. package/dist/esm/{helpers → queues}/aggregateQueue.js +4 -0
  185. package/dist/esm/queues/aggregateQueue.js.map +1 -0
  186. package/dist/{commonjs/helpers → esm/queues}/asyncGeneratorQueue.d.ts +1 -1
  187. package/dist/esm/queues/asyncGeneratorQueue.d.ts.map +1 -0
  188. package/dist/esm/{helpers → queues}/asyncGeneratorQueue.js +2 -1
  189. package/dist/esm/queues/asyncGeneratorQueue.js.map +1 -0
  190. package/dist/esm/{helpers → queues}/batchingQueue.d.ts +4 -1
  191. package/dist/esm/queues/batchingQueue.d.ts.map +1 -0
  192. package/dist/esm/queues/batchingQueue.dispose.test.d.ts +2 -0
  193. package/dist/esm/queues/batchingQueue.dispose.test.d.ts.map +1 -0
  194. package/dist/esm/queues/batchingQueue.dispose.test.js +57 -0
  195. package/dist/esm/queues/batchingQueue.dispose.test.js.map +1 -0
  196. package/dist/esm/queues/batchingQueue.js +122 -0
  197. package/dist/esm/queues/batchingQueue.js.map +1 -0
  198. package/dist/esm/queues/batchingQueue.test.d.ts +2 -0
  199. package/dist/esm/queues/batchingQueue.test.d.ts.map +1 -0
  200. package/dist/esm/queues/batchingQueue.test.js +231 -0
  201. package/dist/esm/queues/batchingQueue.test.js.map +1 -0
  202. package/dist/{commonjs/helpers → esm/queues}/bufferQueue.d.ts +1 -0
  203. package/dist/esm/queues/bufferQueue.d.ts.map +1 -0
  204. package/dist/esm/{helpers → queues}/bufferQueue.js +3 -0
  205. package/dist/esm/queues/bufferQueue.js.map +1 -0
  206. package/dist/esm/{helpers → queues}/keyedQueue.d.ts +1 -0
  207. package/dist/esm/queues/keyedQueue.d.ts.map +1 -0
  208. package/dist/esm/{helpers → queues}/keyedQueue.js +11 -0
  209. package/dist/esm/queues/keyedQueue.js.map +1 -0
  210. package/dist/esm/queues/keyedQueue.test.d.ts +2 -0
  211. package/dist/esm/queues/keyedQueue.test.d.ts.map +1 -0
  212. package/dist/esm/queues/keyedQueue.test.js +113 -0
  213. package/dist/esm/queues/keyedQueue.test.js.map +1 -0
  214. package/dist/esm/queues/queue.d.ts +5 -0
  215. package/dist/esm/queues/queue.d.ts.map +1 -0
  216. package/dist/esm/{helpers → queues}/queue.js.map +1 -1
  217. package/dist/esm/types/functions.d.ts +21 -0
  218. package/dist/esm/types/functions.d.ts.map +1 -0
  219. package/dist/esm/types/functions.js +83 -0
  220. package/dist/esm/types/functions.js.map +1 -0
  221. package/dist/esm/types/types.d.ts +6 -7
  222. package/dist/esm/types/types.d.ts.map +1 -1
  223. package/dist/esm/types/types.js +1 -32
  224. package/dist/esm/types/types.js.map +1 -1
  225. package/package.json +5 -3
  226. package/src/{operations → core}/interfaces.ts +5 -5
  227. package/src/{operations → core}/objectLoader2.spec.ts +31 -11
  228. package/src/core/objectLoader2.ts +152 -0
  229. package/src/core/objectLoader2Factory.test.ts +135 -0
  230. package/src/core/objectLoader2Factory.ts +113 -0
  231. package/src/{operations → core}/options.ts +4 -1
  232. package/src/{operations/databases → core/stages}/__snapshots__/indexedDatabase.spec.ts.snap +4 -4
  233. package/src/{operations/downloaders → core/stages}/__snapshots__/serverDownloader.spec.ts.snap +25 -0
  234. package/src/{helpers → core/stages}/cacheReader.spec.ts +12 -7
  235. package/src/core/stages/cacheReader.ts +88 -0
  236. package/src/core/stages/cacheWriter.spec.ts +213 -0
  237. package/src/core/stages/cacheWriter.ts +64 -0
  238. package/src/{operations/databases → core/stages}/indexedDatabase.spec.ts +12 -8
  239. package/src/core/stages/indexedDatabase.ts +178 -0
  240. package/src/{operations/databases → core/stages/memory}/memoryDatabase.spec.ts +7 -7
  241. package/src/{operations/databases → core/stages/memory}/memoryDatabase.ts +9 -6
  242. package/src/{operations/downloaders → core/stages/memory}/memoryDownloader.spec.ts +5 -5
  243. package/src/{operations/downloaders → core/stages/memory}/memoryDownloader.ts +4 -4
  244. package/src/core/stages/serverDownloader.spec.ts +382 -0
  245. package/src/{operations/downloaders → core/stages}/serverDownloader.ts +115 -52
  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 +225 -0
  250. package/src/deferment/defermentManager.ts +95 -0
  251. package/src/deferment/deferredBase.ts +29 -0
  252. package/src/index.ts +4 -2
  253. package/src/{helpers → queues}/aggregateQueue.ts +5 -1
  254. package/src/{helpers → queues}/asyncGeneratorQueue.ts +2 -1
  255. package/src/queues/batchingQueue.dispose.test.ts +72 -0
  256. package/src/queues/batchingQueue.test.ts +270 -0
  257. package/src/queues/batchingQueue.ts +140 -0
  258. package/src/{helpers → queues}/bufferQueue.ts +3 -0
  259. package/src/queues/keyedQueue.test.ts +146 -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 +2 -2
  263. package/src/types/functions.spec.ts +155 -0
  264. package/src/types/functions.ts +116 -0
  265. package/src/types/types.ts +5 -50
  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 +0 -12
  271. package/dist/commonjs/helpers/batchedPool.d.ts.map +0 -1
  272. package/dist/commonjs/helpers/batchedPool.js +0 -45
  273. package/dist/commonjs/helpers/batchedPool.js.map +0 -1
  274. package/dist/commonjs/helpers/batchingQueue.d.ts.map +0 -1
  275. package/dist/commonjs/helpers/batchingQueue.js +0 -77
  276. package/dist/commonjs/helpers/batchingQueue.js.map +0 -1
  277. package/dist/commonjs/helpers/bufferQueue.d.ts.map +0 -1
  278. package/dist/commonjs/helpers/bufferQueue.js.map +0 -1
  279. package/dist/commonjs/helpers/cachePump.d.ts +0 -22
  280. package/dist/commonjs/helpers/cachePump.d.ts.map +0 -1
  281. package/dist/commonjs/helpers/cachePump.js +0 -86
  282. package/dist/commonjs/helpers/cachePump.js.map +0 -1
  283. package/dist/commonjs/helpers/cacheReader.d.ts +0 -14
  284. package/dist/commonjs/helpers/cacheReader.d.ts.map +0 -1
  285. package/dist/commonjs/helpers/cacheReader.js +0 -58
  286. package/dist/commonjs/helpers/cacheReader.js.map +0 -1
  287. package/dist/commonjs/helpers/defermentManager.d.ts +0 -28
  288. package/dist/commonjs/helpers/defermentManager.d.ts.map +0 -1
  289. package/dist/commonjs/helpers/defermentManager.js +0 -150
  290. package/dist/commonjs/helpers/defermentManager.js.map +0 -1
  291. package/dist/commonjs/helpers/deferredBase.d.ts +0 -19
  292. package/dist/commonjs/helpers/deferredBase.d.ts.map +0 -1
  293. package/dist/commonjs/helpers/deferredBase.js +0 -51
  294. package/dist/commonjs/helpers/deferredBase.js.map +0 -1
  295. package/dist/commonjs/helpers/keyedQueue.d.ts.map +0 -1
  296. package/dist/commonjs/helpers/keyedQueue.js.map +0 -1
  297. package/dist/commonjs/helpers/memoryPump.d.ts +0 -15
  298. package/dist/commonjs/helpers/memoryPump.d.ts.map +0 -1
  299. package/dist/commonjs/helpers/memoryPump.js +0 -34
  300. package/dist/commonjs/helpers/memoryPump.js.map +0 -1
  301. package/dist/commonjs/helpers/pump.d.ts +0 -8
  302. package/dist/commonjs/helpers/pump.d.ts.map +0 -1
  303. package/dist/commonjs/helpers/pump.js +0 -3
  304. package/dist/commonjs/helpers/pump.js.map +0 -1
  305. package/dist/commonjs/helpers/queue.d.ts +0 -4
  306. package/dist/commonjs/helpers/queue.d.ts.map +0 -1
  307. package/dist/commonjs/operations/databases/indexedDatabase.d.ts +0 -27
  308. package/dist/commonjs/operations/databases/indexedDatabase.d.ts.map +0 -1
  309. package/dist/commonjs/operations/databases/indexedDatabase.js +0 -98
  310. package/dist/commonjs/operations/databases/indexedDatabase.js.map +0 -1
  311. package/dist/commonjs/operations/databases/memoryDatabase.d.ts +0 -13
  312. package/dist/commonjs/operations/databases/memoryDatabase.d.ts.map +0 -1
  313. package/dist/commonjs/operations/databases/memoryDatabase.js.map +0 -1
  314. package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts.map +0 -1
  315. package/dist/commonjs/operations/downloaders/memoryDownloader.js.map +0 -1
  316. package/dist/commonjs/operations/downloaders/serverDownloader.d.ts.map +0 -1
  317. package/dist/commonjs/operations/downloaders/serverDownloader.js.map +0 -1
  318. package/dist/commonjs/operations/interfaces.d.ts.map +0 -1
  319. package/dist/commonjs/operations/interfaces.js.map +0 -1
  320. package/dist/commonjs/operations/objectLoader2.d.ts.map +0 -1
  321. package/dist/commonjs/operations/objectLoader2.js +0 -101
  322. package/dist/commonjs/operations/objectLoader2.js.map +0 -1
  323. package/dist/commonjs/operations/objectLoader2Factory.d.ts.map +0 -1
  324. package/dist/commonjs/operations/objectLoader2Factory.js +0 -68
  325. package/dist/commonjs/operations/objectLoader2Factory.js.map +0 -1
  326. package/dist/commonjs/operations/options.d.ts.map +0 -1
  327. package/dist/commonjs/operations/traverser.d.ts.map +0 -1
  328. package/dist/commonjs/operations/traverser.js.map +0 -1
  329. package/dist/esm/helpers/aggregateQueue.d.ts.map +0 -1
  330. package/dist/esm/helpers/aggregateQueue.js.map +0 -1
  331. package/dist/esm/helpers/asyncGeneratorQueue.d.ts.map +0 -1
  332. package/dist/esm/helpers/asyncGeneratorQueue.js.map +0 -1
  333. package/dist/esm/helpers/batchedPool.d.ts +0 -12
  334. package/dist/esm/helpers/batchedPool.d.ts.map +0 -1
  335. package/dist/esm/helpers/batchedPool.js +0 -42
  336. package/dist/esm/helpers/batchedPool.js.map +0 -1
  337. package/dist/esm/helpers/batchingQueue.d.ts.map +0 -1
  338. package/dist/esm/helpers/batchingQueue.js +0 -71
  339. package/dist/esm/helpers/batchingQueue.js.map +0 -1
  340. package/dist/esm/helpers/bufferQueue.d.ts.map +0 -1
  341. package/dist/esm/helpers/bufferQueue.js.map +0 -1
  342. package/dist/esm/helpers/cachePump.d.ts +0 -22
  343. package/dist/esm/helpers/cachePump.d.ts.map +0 -1
  344. package/dist/esm/helpers/cachePump.js +0 -79
  345. package/dist/esm/helpers/cachePump.js.map +0 -1
  346. package/dist/esm/helpers/cacheReader.d.ts +0 -14
  347. package/dist/esm/helpers/cacheReader.d.ts.map +0 -1
  348. package/dist/esm/helpers/cacheReader.js +0 -51
  349. package/dist/esm/helpers/cacheReader.js.map +0 -1
  350. package/dist/esm/helpers/defermentManager.d.ts +0 -28
  351. package/dist/esm/helpers/defermentManager.d.ts.map +0 -1
  352. package/dist/esm/helpers/defermentManager.js +0 -146
  353. package/dist/esm/helpers/defermentManager.js.map +0 -1
  354. package/dist/esm/helpers/deferredBase.d.ts +0 -19
  355. package/dist/esm/helpers/deferredBase.d.ts.map +0 -1
  356. package/dist/esm/helpers/deferredBase.js +0 -47
  357. package/dist/esm/helpers/deferredBase.js.map +0 -1
  358. package/dist/esm/helpers/keyedQueue.d.ts.map +0 -1
  359. package/dist/esm/helpers/keyedQueue.js.map +0 -1
  360. package/dist/esm/helpers/memoryPump.d.ts +0 -15
  361. package/dist/esm/helpers/memoryPump.d.ts.map +0 -1
  362. package/dist/esm/helpers/memoryPump.js +0 -30
  363. package/dist/esm/helpers/memoryPump.js.map +0 -1
  364. package/dist/esm/helpers/pump.d.ts +0 -8
  365. package/dist/esm/helpers/pump.d.ts.map +0 -1
  366. package/dist/esm/helpers/pump.js +0 -2
  367. package/dist/esm/helpers/pump.js.map +0 -1
  368. package/dist/esm/helpers/queue.d.ts +0 -4
  369. package/dist/esm/helpers/queue.d.ts.map +0 -1
  370. package/dist/esm/operations/databases/indexedDatabase.d.ts +0 -27
  371. package/dist/esm/operations/databases/indexedDatabase.d.ts.map +0 -1
  372. package/dist/esm/operations/databases/indexedDatabase.js +0 -93
  373. package/dist/esm/operations/databases/indexedDatabase.js.map +0 -1
  374. package/dist/esm/operations/databases/memoryDatabase.d.ts +0 -13
  375. package/dist/esm/operations/databases/memoryDatabase.d.ts.map +0 -1
  376. package/dist/esm/operations/databases/memoryDatabase.js.map +0 -1
  377. package/dist/esm/operations/downloaders/memoryDownloader.d.ts.map +0 -1
  378. package/dist/esm/operations/downloaders/memoryDownloader.js.map +0 -1
  379. package/dist/esm/operations/downloaders/serverDownloader.d.ts.map +0 -1
  380. package/dist/esm/operations/downloaders/serverDownloader.js.map +0 -1
  381. package/dist/esm/operations/interfaces.d.ts.map +0 -1
  382. package/dist/esm/operations/interfaces.js.map +0 -1
  383. package/dist/esm/operations/objectLoader2.d.ts.map +0 -1
  384. package/dist/esm/operations/objectLoader2.js +0 -94
  385. package/dist/esm/operations/objectLoader2.js.map +0 -1
  386. package/dist/esm/operations/objectLoader2Factory.d.ts.map +0 -1
  387. package/dist/esm/operations/objectLoader2Factory.js +0 -61
  388. package/dist/esm/operations/objectLoader2Factory.js.map +0 -1
  389. package/dist/esm/operations/options.d.ts.map +0 -1
  390. package/dist/esm/operations/traverser.d.ts.map +0 -1
  391. package/dist/esm/operations/traverser.js.map +0 -1
  392. package/src/helpers/__snapshots__/cachePump.spec.ts.snap +0 -31
  393. package/src/helpers/__snapshots__/defermentManager.spec.ts.snap +0 -8
  394. package/src/helpers/batchedPool.ts +0 -56
  395. package/src/helpers/batchingQueue.ts +0 -85
  396. package/src/helpers/cachePump.disposal.spec.ts +0 -51
  397. package/src/helpers/cachePump.spec.ts +0 -104
  398. package/src/helpers/cachePump.ts +0 -107
  399. package/src/helpers/cacheReader.ts +0 -64
  400. package/src/helpers/defermentManager.defermentTotals.spec.ts +0 -53
  401. package/src/helpers/defermentManager.disposal.spec.ts +0 -28
  402. package/src/helpers/defermentManager.spec.ts +0 -37
  403. package/src/helpers/defermentManager.ts +0 -160
  404. package/src/helpers/deferredBase.ts +0 -55
  405. package/src/helpers/memoryPump.ts +0 -40
  406. package/src/helpers/pump.ts +0 -8
  407. package/src/operations/databases/indexedDatabase.ts +0 -126
  408. package/src/operations/downloaders/serverDownloader.spec.ts +0 -161
  409. package/src/operations/objectLoader2.ts +0 -119
  410. package/src/operations/objectLoader2Factory.ts +0 -78
  411. package/dist/commonjs/{operations → core}/interfaces.js +0 -0
  412. package/dist/commonjs/{operations → core}/options.js +0 -0
  413. package/dist/commonjs/{operations → core}/traverser.d.ts +0 -0
  414. package/dist/commonjs/{helpers → queues}/queue.js +0 -0
  415. package/dist/esm/{operations → core}/interfaces.js +0 -0
  416. package/dist/esm/{operations → core}/options.js +0 -0
  417. package/dist/esm/{operations → core}/traverser.d.ts +0 -0
  418. package/dist/esm/{helpers → queues}/queue.js +0 -0
  419. package/src/{operations → core}/__snapshots__/objectLoader2.spec.ts.snap +0 -0
  420. package/src/{operations → core}/__snapshots__/traverser.spec.ts.snap +0 -0
  421. package/src/{helpers → core/stages}/__snapshots__/cacheReader.spec.ts.snap +0 -0
  422. package/src/{operations/downloaders → core/stages/memory}/__snapshots__/memoryDownloader.spec.ts.snap +0 -0
  423. package/src/{operations → core}/traverser.spec.ts +1 -1
@@ -0,0 +1,187 @@
1
+ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest'
2
+ import { MemoryCache, MemoryCacheItem, MemoryCacheOptions } from './MemoryCache.js'
3
+ import { Item, Base } from '../types/types.js'
4
+ import { CustomLogger } from '../types/functions.js'
5
+
6
+ const logger: CustomLogger = () => {
7
+ // console.log(message, ...optionalParams)
8
+ }
9
+
10
+ const defaultOptions: MemoryCacheOptions = {
11
+ maxSizeInMb: 10,
12
+ ttlms: 1000
13
+ }
14
+
15
+ const createItem = (id: string, size: number, referencedIds: string[] = []): Item => {
16
+ const base: Base & { data?: unknown } = {
17
+ id,
18
+ // eslint-disable-next-line camelcase
19
+ synchronized_type: 'Base'
20
+ }
21
+
22
+ if (referencedIds.length > 0) {
23
+ base.data = referencedIds.map((referencedId) => ({
24
+ // eslint-disable-next-line camelcase
25
+ synchronized_type: 'reference',
26
+ referencedId
27
+ }))
28
+ }
29
+
30
+ return {
31
+ baseId: id,
32
+ base,
33
+ size
34
+ }
35
+ }
36
+
37
+ describe('MemoryCacheItem', () => {
38
+ it('should correctly determine if it is expired', () => {
39
+ const item = createItem('1', 100)
40
+ const now = Date.now()
41
+ const cacheItem = new MemoryCacheItem(item, now + 1000)
42
+ expect(cacheItem.isExpired(now + 500)).toBe(false)
43
+ expect(cacheItem.isExpired(now + 1500)).toBe(true)
44
+ })
45
+
46
+ it('should update its access time', () => {
47
+ const item = createItem('1', 100)
48
+ const now = Date.now()
49
+ const cacheItem = new MemoryCacheItem(item, now + 1000)
50
+ cacheItem.setAccess(now + 500, 1000)
51
+ expect(cacheItem.isExpired(now + 1000)).toBe(false)
52
+ expect(cacheItem.isExpired(now + 1600)).toBe(true)
53
+ })
54
+
55
+ it('should return the correct item', () => {
56
+ const item = createItem('1', 100)
57
+ const cacheItem = new MemoryCacheItem(item, Date.now() + 1000)
58
+ expect(cacheItem.getItem()).toEqual(item)
59
+ })
60
+
61
+ it('should be done if expired', () => {
62
+ const item = createItem('1', 100)
63
+ const now = Date.now()
64
+ const cacheItem = new MemoryCacheItem(item, now + 1000)
65
+ expect(cacheItem.done(now + 1500)).toBe(true)
66
+ expect(cacheItem.done(now + 500)).toBe(false)
67
+ })
68
+ })
69
+
70
+ describe('MemoryCache', () => {
71
+ beforeEach(() => {
72
+ vi.useFakeTimers()
73
+ })
74
+
75
+ afterEach(() => {
76
+ vi.useRealTimers()
77
+ })
78
+
79
+ it('should add and get an item', () => {
80
+ const cache = new MemoryCache(defaultOptions, logger)
81
+ const item = createItem('1', 100)
82
+ const requestItem = vi.fn()
83
+
84
+ cache.add(item, requestItem)
85
+ const retrieved = cache.get('1')
86
+
87
+ expect(retrieved).toEqual(item)
88
+ expect(requestItem).not.toHaveBeenCalled()
89
+ })
90
+
91
+ it('should update expiry on get', () => {
92
+ const cache = new MemoryCache({ ...defaultOptions, ttlms: 100 }, logger)
93
+ const item = createItem('1', 100)
94
+ cache.add(item, vi.fn())
95
+
96
+ vi.advanceTimersByTime(50)
97
+ const retrieved = cache.get('1')
98
+ expect(retrieved).toBeDefined()
99
+
100
+ vi.advanceTimersByTime(80)
101
+ const retrievedAgain = cache.get('1')
102
+ expect(retrievedAgain).toBeDefined()
103
+ })
104
+
105
+ it('should return undefined for non-existent item', () => {
106
+ const cache = new MemoryCache(defaultOptions, logger)
107
+ expect(cache.get('non-existent')).toBeUndefined()
108
+ })
109
+
110
+ it('should scan for references and request missing ones', () => {
111
+ const cache = new MemoryCache(defaultOptions, logger)
112
+ const requestItem = vi.fn()
113
+ const item = createItem('1', 100, ['2', '3'])
114
+
115
+ cache.add(createItem('3', 50), vi.fn()) // pre-cache one of the references
116
+ cache.scanForReferences(item.base, requestItem)
117
+
118
+ expect(requestItem).toHaveBeenCalledTimes(1)
119
+ expect(requestItem).toHaveBeenCalledWith('2')
120
+ expect(requestItem).not.toHaveBeenCalledWith('3')
121
+ })
122
+
123
+ it('should clean up expired items when size exceeds max', () => {
124
+ const options = { maxSizeInMb: 0, ttlms: 100 } // 100 bytes
125
+ const cache = new MemoryCache(options, logger)
126
+ const requestItem = vi.fn()
127
+
128
+ const item1 = createItem('1', 60)
129
+ const item2 = createItem('2', 60)
130
+
131
+ const now = 1
132
+ cache.add(item1, requestItem, now - 200)
133
+ cache.cleanCache(now)
134
+ cache.add(item2, requestItem, now + 100)
135
+
136
+ expect(cache.get('1')).toBeUndefined()
137
+ expect(cache.get('2')).toBeDefined()
138
+ })
139
+
140
+ it('should not clean up expired items if they have references', () => {
141
+ const options = { maxSizeInMb: 0.0001, ttlms: 100 } // 100 bytes
142
+ const cache = new MemoryCache(options, logger)
143
+ const requestItem = vi.fn()
144
+
145
+ const item1 = createItem('1', 60)
146
+ const item2 = createItem('2', 60, ['1'])
147
+
148
+ cache.add(item1, requestItem)
149
+ vi.advanceTimersByTime(110) // item1 expires
150
+ cache.add(item2, requestItem) // item2 adds a reference to item1
151
+
152
+ vi.advanceTimersByTime(100)
153
+
154
+ expect(cache.get('1')).toBeDefined()
155
+ expect(cache.get('2')).toBeDefined()
156
+ })
157
+
158
+ it('compareMaybeBasesByReferences should sort correctly', () => {
159
+ const cache = new MemoryCache(defaultOptions, logger)
160
+ const requestItem = vi.fn()
161
+
162
+ const item1 = createItem('1', 10)
163
+ const item2 = createItem('2', 10)
164
+ const item3 = createItem('3', 10, ['1', '2'])
165
+ const item4 = createItem('4', 10, ['2'])
166
+
167
+ cache.add(item1, requestItem)
168
+ cache.add(item2, requestItem)
169
+ cache.add(item3, requestItem)
170
+ cache.add(item4, requestItem)
171
+
172
+ expect(cache.compareMaybeBasesByReferences('1', '2')).toBe(-1)
173
+ expect(cache.compareMaybeBasesByReferences('2', '1')).toBe(1)
174
+ expect(cache.compareMaybeBasesByReferences('1', '1')).toBe(0)
175
+ expect(cache.compareMaybeBasesByReferences('1', '5')).toBe(1)
176
+ expect(cache.compareMaybeBasesByReferences('5', '1')).toBe(-1)
177
+ expect(cache.compareMaybeBasesByReferences('5', '6')).toBe(0)
178
+ })
179
+
180
+ it('should throw when used after dispose', () => {
181
+ const cache = new MemoryCache(defaultOptions, logger)
182
+ cache.dispose()
183
+ const item = createItem('1', 100)
184
+ expect(() => cache.add(item, vi.fn())).toThrow('MemoryCache is disposed')
185
+ expect(() => cache.get('1')).toThrow('MemoryCache is disposed')
186
+ })
187
+ })
@@ -0,0 +1,189 @@
1
+ import { CustomLogger } from '../types/functions.js'
2
+ import { Item } from '../types/types.js'
3
+
4
+ export interface MemoryCacheOptions {
5
+ maxSizeInMb: number
6
+ ttlms: number
7
+ }
8
+
9
+ export class MemoryCacheItem {
10
+ private item: Item
11
+ private expiresAt: number // Timestamp in ms
12
+
13
+ constructor(item: Item, expiresAt: number) {
14
+ this.item = item
15
+ this.expiresAt = expiresAt
16
+ }
17
+
18
+ isExpired(now: number): boolean {
19
+ return now > this.expiresAt
20
+ }
21
+ setAccess(now: number, ttl: number): void {
22
+ this.expiresAt = now + ttl
23
+ }
24
+
25
+ getItem(): Item {
26
+ return this.item
27
+ }
28
+
29
+ done(now: number): boolean {
30
+ if (this.isExpired(now)) {
31
+ return true
32
+ }
33
+ return false
34
+ }
35
+ }
36
+
37
+ export class MemoryCache {
38
+ private isGathered: Map<string, boolean> = new Map()
39
+ private references: Map<string, number> = new Map()
40
+ private cache: Map<string, MemoryCacheItem> = new Map()
41
+
42
+ private options: MemoryCacheOptions
43
+ private logger: CustomLogger
44
+ private disposed = false
45
+ private currentSize = 0
46
+ private timer?: ReturnType<typeof setTimeout>
47
+
48
+ constructor(options: MemoryCacheOptions, logger: CustomLogger) {
49
+ this.options = options
50
+ this.logger = logger
51
+ this.resetGlobalTimer()
52
+ }
53
+
54
+ add(item: Item, requestItem: (id: string) => void, testNow?: number): void {
55
+ if (this.disposed) throw new Error('MemoryCache is disposed')
56
+ this.currentSize += item.size || 0
57
+ this.cache.set(
58
+ item.baseId,
59
+ new MemoryCacheItem(item, (testNow || this.now()) + this.options.ttlms)
60
+ )
61
+
62
+ if (!this.isGathered.has(item.baseId)) {
63
+ this.isGathered.set(item.baseId, true)
64
+ this.scanForReferences(item.base!, requestItem)
65
+ }
66
+ }
67
+
68
+ get(id: string): Item | undefined {
69
+ if (this.disposed) throw new Error('MemoryCache is disposed')
70
+ const item = this.cache.get(id)
71
+ if (item) {
72
+ item.setAccess(this.now(), this.options.ttlms)
73
+ return item.getItem()
74
+ }
75
+ return undefined
76
+ }
77
+
78
+ scanForReferences(data: unknown, requestItem: (id: string) => void): void {
79
+ const scan = (item: unknown): void => {
80
+ // Stop if the item is null or not an object (i.e., primitive)
81
+ if (item === null || typeof item !== 'object') {
82
+ return
83
+ }
84
+
85
+ // If it's an array, scan each element
86
+ if (Array.isArray(item)) {
87
+ for (const element of item) {
88
+ scan(element)
89
+ }
90
+ return
91
+ }
92
+
93
+ // If it's an object, scan its properties
94
+ for (const key in item) {
95
+ if (Object.prototype.hasOwnProperty.call(item, key)) {
96
+ // We found the target property!
97
+ if (key === 'referencedId') {
98
+ const value = (item as { referencedId: unknown }).referencedId
99
+ // Ensure the value is a string before adding it
100
+ if (typeof value === 'string') {
101
+ this.references.set(value, (this.references.get(value) || 0) + 1)
102
+ if (!this.cache.has(value)) {
103
+ requestItem(value)
104
+ }
105
+ }
106
+ }
107
+
108
+ // Continue scanning deeper into the object's properties
109
+ scan((item as Record<string, unknown>)[key])
110
+ }
111
+ }
112
+ }
113
+
114
+ scan(data)
115
+ }
116
+
117
+ private resetGlobalTimer(): void {
118
+ const run = (): void => {
119
+ this.cleanCache()
120
+ this.timer = setTimeout(run, this.options.ttlms)
121
+ }
122
+ this.timer = setTimeout(run, this.options.ttlms)
123
+ }
124
+
125
+ private now(): number {
126
+ return Date.now()
127
+ }
128
+
129
+ cleanCache(testNow?: number): void {
130
+ const maxSizeBytes = this.options.maxSizeInMb * 1024 * 1024
131
+ if (this.currentSize < maxSizeBytes) {
132
+ this.logger(
133
+ `cache size (${this.currentSize} < ${maxSizeBytes}) is ok, no need to clean`
134
+ )
135
+ return
136
+ }
137
+ const now = testNow || this.now()
138
+ let cleaned = 0
139
+ const start = performance.now()
140
+ for (const deferredBase of Array.from(this.cache.values())
141
+ .filter((x) => x.isExpired(now))
142
+ .sort((a, b) =>
143
+ this.compareMaybeBasesByReferences(a.getItem().baseId, b.getItem().baseId)
144
+ )) {
145
+ if (deferredBase.done(now)) {
146
+ const id = deferredBase.getItem().baseId
147
+ const referenceCount = this.references.get(id) || 0
148
+ if (referenceCount > 0) {
149
+ // Skip eviction for items with reference counts greater than 0,
150
+ // as they are still in use and should not be removed from the cache.
151
+ continue
152
+ }
153
+ this.currentSize -= deferredBase.getItem().size || 0
154
+ this.cache.delete(id)
155
+ cleaned++
156
+ if (this.currentSize < maxSizeBytes) {
157
+ break
158
+ }
159
+ }
160
+ }
161
+ this.logger(
162
+ `cleaned cache: cleaned ${cleaned}, cached ${this.cache.size}, time ${
163
+ performance.now() - start
164
+ }`
165
+ )
166
+ return
167
+ }
168
+
169
+ compareMaybeBasesByReferences(id1: string, id2: string): number {
170
+ const a = this.references.get(id1)
171
+ const b = this.references.get(id2)
172
+ if (a === undefined && b === undefined) return 0
173
+ if (a === undefined) return -1
174
+ if (b === undefined) return 1
175
+ return a - b
176
+ }
177
+
178
+ dispose(): void {
179
+ if (this.disposed) return
180
+ this.disposed = true
181
+ if (this.timer) {
182
+ clearTimeout(this.timer)
183
+ this.timer = undefined
184
+ }
185
+ this.cache.clear()
186
+ this.isGathered.clear()
187
+ this.references.clear()
188
+ }
189
+ }
@@ -0,0 +1,225 @@
1
+ import { vi, describe, it, expect } from 'vitest'
2
+ import { DefermentManager } from './defermentManager.js'
3
+ import { MemoryCache } from './MemoryCache.js'
4
+ import { CustomLogger } from '../types/functions.js'
5
+ import { Item } from '../types/types.js'
6
+
7
+ describe('DefermentManager', () => {
8
+ it('should be created', () => {
9
+ const mockLogger: CustomLogger = vi.fn()
10
+ const mockCache = {
11
+ get: vi.fn(),
12
+ add: vi.fn(),
13
+ dispose: vi.fn()
14
+ } as unknown as MemoryCache
15
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
16
+ expect(defermentManager).toBeDefined()
17
+ })
18
+
19
+ describe('defer', () => {
20
+ it('should return a resolved promise if item is in cache', async () => {
21
+ const mockLogger: CustomLogger = vi.fn()
22
+ const get = vi.fn()
23
+ const add = vi.fn()
24
+ const mockCache = {
25
+ get,
26
+ add
27
+ } as unknown as MemoryCache
28
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
29
+
30
+ const item: Item = {
31
+ // eslint-disable-next-line camelcase
32
+ base: { id: 'testId', synchronized_type: 'Base' },
33
+ baseId: 'testId'
34
+ }
35
+ get.mockReturnValue(item)
36
+
37
+ const [promise, wasInCache] = defermentManager.defer({ id: 'testId' })
38
+ const result = await promise
39
+
40
+ expect(wasInCache).toBe(true)
41
+ expect(result).toEqual(item.base)
42
+ expect(get).toHaveBeenCalledWith('testId')
43
+ })
44
+
45
+ it('should return the same promise if item is already outstanding', () => {
46
+ const mockLogger: CustomLogger = vi.fn()
47
+ const get = vi.fn()
48
+ const add = vi.fn()
49
+ const mockCache = {
50
+ get,
51
+ add
52
+ } as unknown as MemoryCache
53
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
54
+
55
+ const [promise1, wasInCache1] = defermentManager.defer({ id: 'testId' })
56
+ const [promise2, wasInCache2] = defermentManager.defer({ id: 'testId' })
57
+
58
+ expect(wasInCache1).toBe(false)
59
+ expect(wasInCache2).toBe(true)
60
+ expect(promise1).toBe(promise2)
61
+ })
62
+
63
+ it('should create a new deferred base if not in cache and not outstanding', () => {
64
+ const mockLogger: CustomLogger = vi.fn()
65
+ const get = vi.fn()
66
+ const add = vi.fn()
67
+ const mockCache = {
68
+ get,
69
+ add
70
+ } as unknown as MemoryCache
71
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
72
+
73
+ const [promise, wasInCache] = defermentManager.defer({ id: 'testId' })
74
+
75
+ expect(wasInCache).toBe(false)
76
+ expect(promise).toBeInstanceOf(Promise)
77
+ })
78
+
79
+ it('should throw if disposed', () => {
80
+ const mockLogger: CustomLogger = vi.fn()
81
+ const get = vi.fn()
82
+ const add = vi.fn()
83
+ const mockCache = {
84
+ get,
85
+ add,
86
+ dispose: vi.fn()
87
+ } as unknown as MemoryCache
88
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
89
+
90
+ defermentManager.dispose()
91
+ expect(() => defermentManager.defer({ id: 'testId' })).toThrow(
92
+ 'DefermentManager is disposed'
93
+ )
94
+ })
95
+ })
96
+
97
+ describe('undefer', () => {
98
+ it('should resolve the promise when an outstanding item is found', async () => {
99
+ const mockLogger: CustomLogger = vi.fn()
100
+ const get = vi.fn()
101
+ const add = vi.fn()
102
+ const mockCache = {
103
+ get,
104
+ add
105
+ } as unknown as MemoryCache
106
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
107
+ const requestItem = vi.fn()
108
+
109
+ const [promise] = defermentManager.defer({ id: 'testId' })
110
+
111
+ const item: Item = {
112
+ // eslint-disable-next-line camelcase
113
+ base: { id: 'testId', synchronized_type: 'Base' },
114
+ baseId: 'testId'
115
+ }
116
+ defermentManager.undefer(item, requestItem)
117
+
118
+ const result = await promise
119
+ expect(result).toEqual(item.base)
120
+ })
121
+
122
+ it('should log an error if item has no base', () => {
123
+ const mockLogger: CustomLogger = vi.fn()
124
+ const get = vi.fn()
125
+ const add = vi.fn()
126
+ const mockCache = {
127
+ get,
128
+ add
129
+ } as unknown as MemoryCache
130
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
131
+ const requestItem = vi.fn()
132
+
133
+ const item: Item = { baseId: 'testId' }
134
+ defermentManager.undefer(item, requestItem)
135
+ expect(mockLogger).toHaveBeenCalledWith('undefer called with no base', item)
136
+ })
137
+
138
+ it('should add to cache and request item if not outstanding', () => {
139
+ const mockLogger: CustomLogger = vi.fn()
140
+ const get = vi.fn()
141
+ const add = vi.fn()
142
+ const mockCache = {
143
+ get,
144
+ add
145
+ } as unknown as MemoryCache
146
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
147
+ const requestItem = vi.fn()
148
+
149
+ const item: Item = {
150
+ // eslint-disable-next-line camelcase
151
+ base: { id: 'testId', synchronized_type: 'Base' },
152
+ baseId: 'testId'
153
+ }
154
+ add.mockImplementation((_item: Item, getDependencies?: (id: string) => void) => {
155
+ if (getDependencies) getDependencies('testId')
156
+ })
157
+
158
+ defermentManager.undefer(item, requestItem)
159
+
160
+ expect(add).toHaveBeenCalledWith(item, expect.any(Function))
161
+ expect(requestItem).toHaveBeenCalledWith('testId')
162
+ })
163
+
164
+ it('should throw if disposed', () => {
165
+ const mockLogger: CustomLogger = vi.fn()
166
+ const get = vi.fn()
167
+ const add = vi.fn()
168
+ const mockCache = {
169
+ get,
170
+ add,
171
+ dispose: vi.fn()
172
+ } as unknown as MemoryCache
173
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
174
+ const requestItem = vi.fn()
175
+
176
+ defermentManager.dispose()
177
+ const item: Item = {
178
+ // eslint-disable-next-line camelcase
179
+ base: { id: 'testId', synchronized_type: 'Base' },
180
+ baseId: 'testId'
181
+ }
182
+ expect(() => defermentManager.undefer(item, requestItem)).toThrow(
183
+ 'DefermentManager is disposed'
184
+ )
185
+ })
186
+ })
187
+
188
+ describe('dispose', () => {
189
+ it('should clear all outstanding deferments', () => {
190
+ const mockLogger: CustomLogger = vi.fn()
191
+ const get = vi.fn()
192
+ const add = vi.fn()
193
+ const mockCache = {
194
+ get,
195
+ add,
196
+ dispose: vi.fn()
197
+ } as unknown as MemoryCache
198
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
199
+
200
+ void defermentManager.defer({ id: 'testId' })
201
+ defermentManager.dispose()
202
+ // @ts-expect-error - accessing private property for testing
203
+ expect(defermentManager.outstanding.size).toBe(0)
204
+ })
205
+
206
+ it('should not do anything if already disposed', () => {
207
+ const mockLogger: CustomLogger = vi.fn()
208
+ const get = vi.fn()
209
+ const add = vi.fn()
210
+ const mockCache = {
211
+ get,
212
+ add,
213
+ dispose: vi.fn()
214
+ } as unknown as MemoryCache
215
+ const defermentManager = new DefermentManager(mockLogger, mockCache)
216
+
217
+ defermentManager.dispose()
218
+ // @ts-expect-error - accessing private property for testing
219
+ const outstanding = defermentManager.outstanding
220
+ const clearSpy = vi.spyOn(outstanding, 'clear')
221
+ defermentManager.dispose()
222
+ expect(clearSpy).not.toHaveBeenCalled()
223
+ })
224
+ })
225
+ })
@@ -0,0 +1,95 @@
1
+ import { DeferredBase } from './deferredBase.js'
2
+ import { CustomLogger } from '../types/functions.js'
3
+ import { Item, Base } from '../types/types.js'
4
+ import { MemoryCache } from './MemoryCache.js'
5
+
6
+ export interface Deferment {
7
+ defer(params: { id: string }): [Promise<Base>, boolean]
8
+ undefer(item: Item, requestItem: (id: string) => void): void
9
+ dispose(): void
10
+ }
11
+
12
+ export class MemoryOnlyDeferment implements Deferment {
13
+ private items: Map<string, Base>
14
+
15
+ constructor(items: Map<string, Base>) {
16
+ this.items = items
17
+ }
18
+ defer(params: { id: string }): [Promise<Base>, boolean] {
19
+ const item = this.items.get(params.id)
20
+ if (item) {
21
+ return [Promise.resolve(item), true]
22
+ }
23
+ return [Promise.reject(new Error('Not found in cache: ' + params.id)), false]
24
+ }
25
+ undefer(): void {
26
+ //no-op
27
+ }
28
+ dispose(): void {
29
+ //no-op
30
+ }
31
+ }
32
+
33
+ export class DefermentManager implements Deferment {
34
+ private outstanding: Map<string, DeferredBase> = new Map()
35
+ private logger: CustomLogger
36
+ private disposed = false
37
+ private cache: MemoryCache
38
+
39
+ constructor(logger: CustomLogger, cache?: MemoryCache) {
40
+ this.logger = logger
41
+ this.cache =
42
+ cache ||
43
+ new MemoryCache(
44
+ {
45
+ maxSizeInMb: 500, // 500 MB
46
+ ttlms: 5_000 // 5 seconds
47
+ },
48
+ logger
49
+ )
50
+ }
51
+
52
+ defer(params: { id: string }): [Promise<Base>, boolean] {
53
+ if (this.disposed) throw new Error('DefermentManager is disposed')
54
+ const item = this.cache.get(params.id)
55
+ if (item) {
56
+ return [Promise.resolve(item.base!), true]
57
+ }
58
+ const deferredBase = this.outstanding.get(params.id)
59
+ if (deferredBase) {
60
+ return [deferredBase.getPromise(), true]
61
+ }
62
+ const notYetFound = new DeferredBase(params.id)
63
+ this.outstanding.set(params.id, notYetFound)
64
+ return [notYetFound.getPromise(), false]
65
+ }
66
+
67
+ undefer(item: Item, requestItem: (id: string) => void): void {
68
+ if (this.disposed) throw new Error('DefermentManager is disposed')
69
+ const base = item.base
70
+ if (!base) {
71
+ this.logger('undefer called with no base', item)
72
+ return
73
+ }
74
+ this.cache.add(item, (id) => {
75
+ if (!this.outstanding.has(id)) {
76
+ requestItem(id)
77
+ }
78
+ })
79
+
80
+ //order matters here with found before undefer
81
+ const deferredBase = this.outstanding.get(item.baseId)
82
+ if (deferredBase) {
83
+ deferredBase.found(base)
84
+ this.outstanding.delete(item.baseId)
85
+ }
86
+ }
87
+
88
+ dispose(): void {
89
+ if (this.disposed) return
90
+ this.disposed = true
91
+ this.logger('cleared deferments, left', this.outstanding.size)
92
+ this.outstanding.clear()
93
+ this.cache.dispose()
94
+ }
95
+ }