@speckle/objectloader2 2.25.1 → 2.25.7

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 (222) hide show
  1. package/dist/commonjs/helpers/aggregateQueue.d.ts +8 -0
  2. package/dist/commonjs/helpers/aggregateQueue.d.ts.map +1 -0
  3. package/dist/commonjs/helpers/aggregateQueue.js +19 -0
  4. package/dist/commonjs/helpers/aggregateQueue.js.map +1 -0
  5. package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts +8 -0
  6. package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts.map +1 -0
  7. package/dist/commonjs/helpers/asyncGeneratorQueue.js +35 -0
  8. package/dist/commonjs/helpers/asyncGeneratorQueue.js.map +1 -0
  9. package/dist/commonjs/helpers/batchedPool.d.ts +12 -0
  10. package/dist/commonjs/helpers/batchedPool.d.ts.map +1 -0
  11. package/dist/commonjs/helpers/batchedPool.js +45 -0
  12. package/dist/commonjs/helpers/batchedPool.js.map +1 -0
  13. package/dist/commonjs/helpers/batchingQueue.d.ts +14 -0
  14. package/dist/commonjs/helpers/batchingQueue.d.ts.map +1 -0
  15. package/dist/commonjs/helpers/batchingQueue.js +77 -0
  16. package/dist/commonjs/helpers/batchingQueue.js.map +1 -0
  17. package/dist/commonjs/helpers/bufferQueue.d.ts +7 -0
  18. package/dist/commonjs/helpers/bufferQueue.d.ts.map +1 -0
  19. package/dist/commonjs/helpers/bufferQueue.js +13 -0
  20. package/dist/commonjs/helpers/bufferQueue.js.map +1 -0
  21. package/dist/commonjs/helpers/cachePump.d.ts +22 -0
  22. package/dist/commonjs/helpers/cachePump.d.ts.map +1 -0
  23. package/dist/commonjs/helpers/cachePump.js +86 -0
  24. package/dist/commonjs/helpers/cachePump.js.map +1 -0
  25. package/dist/commonjs/helpers/cacheReader.d.ts +14 -0
  26. package/dist/commonjs/helpers/cacheReader.d.ts.map +1 -0
  27. package/dist/commonjs/helpers/cacheReader.js +58 -0
  28. package/dist/commonjs/helpers/cacheReader.js.map +1 -0
  29. package/dist/commonjs/helpers/defermentManager.d.ts +28 -0
  30. package/dist/commonjs/helpers/defermentManager.d.ts.map +1 -0
  31. package/dist/commonjs/helpers/defermentManager.js +150 -0
  32. package/dist/commonjs/helpers/defermentManager.js.map +1 -0
  33. package/dist/commonjs/helpers/deferredBase.d.ts +19 -0
  34. package/dist/commonjs/helpers/deferredBase.d.ts.map +1 -0
  35. package/dist/commonjs/helpers/deferredBase.js +51 -0
  36. package/dist/commonjs/helpers/deferredBase.js.map +1 -0
  37. package/dist/commonjs/helpers/keyedQueue.d.ts +11 -0
  38. package/dist/commonjs/helpers/keyedQueue.d.ts.map +1 -0
  39. package/dist/commonjs/helpers/keyedQueue.js +41 -0
  40. package/dist/commonjs/helpers/keyedQueue.js.map +1 -0
  41. package/dist/commonjs/helpers/memoryPump.d.ts +15 -0
  42. package/dist/commonjs/helpers/memoryPump.d.ts.map +1 -0
  43. package/dist/commonjs/helpers/memoryPump.js +34 -0
  44. package/dist/commonjs/helpers/memoryPump.js.map +1 -0
  45. package/dist/commonjs/helpers/pump.d.ts +8 -0
  46. package/dist/commonjs/helpers/pump.d.ts.map +1 -0
  47. package/dist/commonjs/helpers/pump.js +3 -0
  48. package/dist/commonjs/helpers/pump.js.map +1 -0
  49. package/dist/commonjs/helpers/queue.d.ts +4 -0
  50. package/dist/commonjs/helpers/queue.d.ts.map +1 -0
  51. package/dist/commonjs/helpers/queue.js +3 -0
  52. package/dist/commonjs/helpers/queue.js.map +1 -0
  53. package/dist/commonjs/index.d.ts +3 -0
  54. package/dist/commonjs/index.d.ts.map +1 -0
  55. package/dist/commonjs/index.js +1 -3
  56. package/dist/commonjs/index.js.map +1 -0
  57. package/dist/commonjs/operations/databases/indexedDatabase.d.ts +27 -0
  58. package/dist/commonjs/operations/databases/indexedDatabase.d.ts.map +1 -0
  59. package/dist/commonjs/operations/databases/indexedDatabase.js +98 -0
  60. package/dist/commonjs/operations/databases/indexedDatabase.js.map +1 -0
  61. package/dist/commonjs/operations/databases/memoryDatabase.d.ts +13 -0
  62. package/dist/commonjs/operations/databases/memoryDatabase.d.ts.map +1 -0
  63. package/dist/commonjs/operations/databases/memoryDatabase.js +33 -0
  64. package/dist/commonjs/operations/databases/memoryDatabase.js.map +1 -0
  65. package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts +16 -0
  66. package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts.map +1 -0
  67. package/dist/commonjs/operations/downloaders/memoryDownloader.js +35 -0
  68. package/dist/commonjs/operations/downloaders/memoryDownloader.js.map +1 -0
  69. package/dist/commonjs/operations/downloaders/serverDownloader.d.ts +32 -0
  70. package/dist/commonjs/operations/downloaders/serverDownloader.d.ts.map +1 -0
  71. package/dist/commonjs/operations/downloaders/serverDownloader.js +169 -0
  72. package/dist/commonjs/operations/downloaders/serverDownloader.js.map +1 -0
  73. package/dist/commonjs/operations/interfaces.d.ts +19 -0
  74. package/dist/commonjs/operations/interfaces.d.ts.map +1 -0
  75. package/dist/commonjs/operations/interfaces.js +3 -0
  76. package/dist/commonjs/operations/interfaces.js.map +1 -0
  77. package/dist/commonjs/operations/objectLoader2.d.ts +16 -0
  78. package/dist/commonjs/operations/objectLoader2.d.ts.map +1 -0
  79. package/dist/commonjs/operations/objectLoader2.js +101 -0
  80. package/dist/commonjs/operations/objectLoader2.js.map +1 -0
  81. package/dist/commonjs/operations/objectLoader2Factory.d.ts +25 -0
  82. package/dist/commonjs/operations/objectLoader2Factory.d.ts.map +1 -0
  83. package/dist/commonjs/operations/objectLoader2Factory.js +68 -0
  84. package/dist/commonjs/operations/objectLoader2Factory.js.map +1 -0
  85. package/dist/commonjs/operations/options.d.ts +26 -0
  86. package/dist/commonjs/operations/options.d.ts.map +1 -0
  87. package/dist/commonjs/operations/options.js +3 -0
  88. package/dist/commonjs/operations/options.js.map +1 -0
  89. package/dist/commonjs/operations/traverser.d.ts +19 -0
  90. package/dist/commonjs/operations/traverser.d.ts.map +1 -0
  91. package/dist/commonjs/operations/traverser.js +96 -0
  92. package/dist/commonjs/operations/traverser.js.map +1 -0
  93. package/dist/commonjs/package.json +3 -0
  94. package/dist/commonjs/types/errors.d.ts +21 -0
  95. package/dist/commonjs/types/errors.d.ts.map +1 -0
  96. package/dist/commonjs/types/errors.js +28 -0
  97. package/dist/commonjs/types/errors.js.map +1 -0
  98. package/dist/commonjs/types/types.d.ts +25 -0
  99. package/dist/commonjs/types/types.d.ts.map +1 -0
  100. package/dist/commonjs/types/types.js +39 -0
  101. package/dist/commonjs/types/types.js.map +1 -0
  102. package/dist/esm/helpers/aggregateQueue.d.ts +8 -0
  103. package/dist/esm/helpers/aggregateQueue.d.ts.map +1 -0
  104. package/dist/esm/helpers/aggregateQueue.js +16 -0
  105. package/dist/esm/helpers/aggregateQueue.js.map +1 -0
  106. package/dist/esm/helpers/asyncGeneratorQueue.d.ts +8 -0
  107. package/dist/esm/helpers/asyncGeneratorQueue.d.ts.map +1 -0
  108. package/dist/esm/helpers/asyncGeneratorQueue.js +32 -0
  109. package/dist/esm/helpers/asyncGeneratorQueue.js.map +1 -0
  110. package/dist/esm/helpers/batchedPool.d.ts +12 -0
  111. package/dist/esm/helpers/batchedPool.d.ts.map +1 -0
  112. package/dist/esm/helpers/batchedPool.js +42 -0
  113. package/dist/esm/helpers/batchedPool.js.map +1 -0
  114. package/dist/esm/helpers/batchingQueue.d.ts +14 -0
  115. package/dist/esm/helpers/batchingQueue.d.ts.map +1 -0
  116. package/dist/esm/helpers/batchingQueue.js +71 -0
  117. package/dist/esm/helpers/batchingQueue.js.map +1 -0
  118. package/dist/esm/helpers/bufferQueue.d.ts +7 -0
  119. package/dist/esm/helpers/bufferQueue.d.ts.map +1 -0
  120. package/dist/esm/helpers/bufferQueue.js +10 -0
  121. package/dist/esm/helpers/bufferQueue.js.map +1 -0
  122. package/dist/esm/helpers/cachePump.d.ts +22 -0
  123. package/dist/esm/helpers/cachePump.d.ts.map +1 -0
  124. package/dist/esm/helpers/cachePump.js +79 -0
  125. package/dist/esm/helpers/cachePump.js.map +1 -0
  126. package/dist/esm/helpers/cacheReader.d.ts +14 -0
  127. package/dist/esm/helpers/cacheReader.d.ts.map +1 -0
  128. package/dist/esm/helpers/cacheReader.js +51 -0
  129. package/dist/esm/helpers/cacheReader.js.map +1 -0
  130. package/dist/esm/helpers/defermentManager.d.ts +28 -0
  131. package/dist/esm/helpers/defermentManager.d.ts.map +1 -0
  132. package/dist/esm/helpers/defermentManager.js +146 -0
  133. package/dist/esm/helpers/defermentManager.js.map +1 -0
  134. package/dist/esm/helpers/deferredBase.d.ts +19 -0
  135. package/dist/esm/helpers/deferredBase.d.ts.map +1 -0
  136. package/dist/esm/helpers/deferredBase.js +47 -0
  137. package/dist/esm/helpers/deferredBase.js.map +1 -0
  138. package/dist/esm/helpers/keyedQueue.d.ts +11 -0
  139. package/dist/esm/helpers/keyedQueue.d.ts.map +1 -0
  140. package/dist/esm/helpers/keyedQueue.js +38 -0
  141. package/dist/esm/helpers/keyedQueue.js.map +1 -0
  142. package/dist/esm/helpers/memoryPump.d.ts +15 -0
  143. package/dist/esm/helpers/memoryPump.d.ts.map +1 -0
  144. package/dist/esm/helpers/memoryPump.js +30 -0
  145. package/dist/esm/helpers/memoryPump.js.map +1 -0
  146. package/dist/esm/helpers/pump.d.ts +8 -0
  147. package/dist/esm/helpers/pump.d.ts.map +1 -0
  148. package/dist/esm/helpers/pump.js +2 -0
  149. package/dist/esm/helpers/pump.js.map +1 -0
  150. package/dist/esm/helpers/queue.d.ts +4 -0
  151. package/dist/esm/helpers/queue.d.ts.map +1 -0
  152. package/dist/esm/helpers/queue.js +2 -0
  153. package/dist/esm/helpers/queue.js.map +1 -0
  154. package/dist/esm/index.d.ts +3 -0
  155. package/dist/esm/index.d.ts.map +1 -0
  156. package/dist/esm/index.js +0 -1
  157. package/dist/esm/index.js.map +1 -0
  158. package/dist/esm/operations/databases/indexedDatabase.d.ts +27 -0
  159. package/dist/esm/operations/databases/indexedDatabase.d.ts.map +1 -0
  160. package/dist/esm/operations/databases/indexedDatabase.js +93 -0
  161. package/dist/esm/operations/databases/indexedDatabase.js.map +1 -0
  162. package/dist/esm/operations/databases/memoryDatabase.d.ts +13 -0
  163. package/dist/esm/operations/databases/memoryDatabase.d.ts.map +1 -0
  164. package/dist/esm/operations/databases/memoryDatabase.js +29 -0
  165. package/dist/esm/operations/databases/memoryDatabase.js.map +1 -0
  166. package/dist/esm/operations/downloaders/memoryDownloader.d.ts +16 -0
  167. package/dist/esm/operations/downloaders/memoryDownloader.d.ts.map +1 -0
  168. package/dist/esm/operations/downloaders/memoryDownloader.js +31 -0
  169. package/dist/esm/operations/downloaders/memoryDownloader.js.map +1 -0
  170. package/dist/esm/operations/downloaders/serverDownloader.d.ts +32 -0
  171. package/dist/esm/operations/downloaders/serverDownloader.d.ts.map +1 -0
  172. package/dist/esm/operations/downloaders/serverDownloader.js +163 -0
  173. package/dist/esm/operations/downloaders/serverDownloader.js.map +1 -0
  174. package/dist/esm/operations/interfaces.d.ts +19 -0
  175. package/dist/esm/operations/interfaces.d.ts.map +1 -0
  176. package/dist/esm/operations/interfaces.js +2 -0
  177. package/dist/esm/operations/interfaces.js.map +1 -0
  178. package/dist/esm/operations/objectLoader2.d.ts +16 -0
  179. package/dist/esm/operations/objectLoader2.d.ts.map +1 -0
  180. package/dist/esm/operations/objectLoader2.js +94 -0
  181. package/dist/esm/operations/objectLoader2.js.map +1 -0
  182. package/dist/esm/operations/objectLoader2Factory.d.ts +25 -0
  183. package/dist/esm/operations/objectLoader2Factory.d.ts.map +1 -0
  184. package/dist/esm/operations/objectLoader2Factory.js +61 -0
  185. package/dist/esm/operations/objectLoader2Factory.js.map +1 -0
  186. package/dist/esm/operations/options.d.ts +26 -0
  187. package/dist/esm/operations/options.d.ts.map +1 -0
  188. package/dist/esm/operations/options.js +2 -0
  189. package/dist/esm/operations/options.js.map +1 -0
  190. package/dist/esm/operations/traverser.d.ts +19 -0
  191. package/dist/esm/operations/traverser.d.ts.map +1 -0
  192. package/dist/esm/operations/traverser.js +93 -0
  193. package/dist/esm/operations/traverser.js.map +1 -0
  194. package/dist/esm/package.json +3 -0
  195. package/dist/esm/types/errors.d.ts +21 -0
  196. package/dist/esm/types/errors.d.ts.map +1 -0
  197. package/dist/esm/types/errors.js +23 -0
  198. package/dist/esm/types/errors.js.map +1 -0
  199. package/dist/esm/types/types.d.ts +25 -0
  200. package/dist/esm/types/types.d.ts.map +1 -0
  201. package/dist/esm/types/types.js +33 -0
  202. package/dist/esm/types/types.js.map +1 -0
  203. package/package.json +2 -2
  204. package/src/helpers/cachePump.disposal.spec.ts +3 -1
  205. package/src/helpers/cachePump.spec.ts +2 -1
  206. package/src/helpers/cachePump.ts +9 -1
  207. package/src/helpers/defermentManager.defermentTotals.spec.ts +53 -0
  208. package/src/helpers/defermentManager.ts +20 -1
  209. package/src/index.ts +0 -1
  210. package/src/operations/databases/__snapshots__/indexedDatabase.spec.ts.snap +13 -26
  211. package/src/operations/databases/indexedDatabase.spec.ts +23 -27
  212. package/src/operations/databases/indexedDatabase.ts +1 -25
  213. package/src/operations/databases/memoryDatabase.spec.ts +48 -0
  214. package/src/operations/databases/memoryDatabase.ts +0 -8
  215. package/src/operations/downloaders/__snapshots__/memoryDownloader.spec.ts.snap +12 -0
  216. package/src/operations/downloaders/memoryDownloader.spec.ts +49 -0
  217. package/src/operations/downloaders/memoryDownloader.ts +1 -1
  218. package/src/operations/downloaders/serverDownloader.ts +1 -1
  219. package/src/operations/interfaces.ts +0 -1
  220. package/src/operations/objectLoader2.ts +12 -4
  221. package/src/operations/objectLoader2Factory.ts +40 -18
  222. package/src/test/e2e.spec.ts +4 -2
@@ -0,0 +1,14 @@
1
+ import { Database } from '../operations/interfaces.js';
2
+ import { CacheOptions } from '../operations/options.js';
3
+ import { Base, Item } from '../types/types.js';
4
+ import { DefermentManager } from './defermentManager.js';
5
+ export declare class CacheReader {
6
+ #private;
7
+ constructor(database: Database, defermentManager: DefermentManager, options: CacheOptions);
8
+ getObject(params: {
9
+ id: string;
10
+ }): Promise<Base>;
11
+ getAll(keys: string[]): Promise<(Item | undefined)[]>;
12
+ disposeAsync(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=cacheReader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheReader.d.ts","sourceRoot":"","sources":["../../../src/helpers/cacheReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,IAAI,EAAgB,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,qBAAa,WAAW;;gBAQpB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,YAAY;IAQjB,SAAS,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC;IAgBrD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
@@ -0,0 +1,51 @@
1
+ import BatchingQueue from './batchingQueue.js';
2
+ export class CacheReader {
3
+ #database;
4
+ #defermentManager;
5
+ #logger;
6
+ #options;
7
+ #readQueue;
8
+ constructor(database, defermentManager, options) {
9
+ this.#database = database;
10
+ this.#defermentManager = defermentManager;
11
+ this.#options = options;
12
+ this.#logger = options.logger || (() => { });
13
+ }
14
+ async getObject(params) {
15
+ if (!this.#defermentManager.isDeferred(params.id)) {
16
+ this.#getItem(params.id);
17
+ }
18
+ return await this.#defermentManager.defer({ id: params.id });
19
+ }
20
+ #getItem(id) {
21
+ if (!this.#readQueue) {
22
+ this.#readQueue = new BatchingQueue({
23
+ batchSize: this.#options.maxCacheReadSize,
24
+ maxWaitTime: this.#options.maxCacheBatchReadWait,
25
+ processFunction: this.#processBatch
26
+ });
27
+ }
28
+ if (!this.#readQueue.get(id)) {
29
+ this.#readQueue.add(id, id);
30
+ }
31
+ }
32
+ async getAll(keys) {
33
+ return this.#database.getAll(keys);
34
+ }
35
+ #processBatch = async (batch) => {
36
+ const items = await this.#database.getAll(batch);
37
+ for (let i = 0; i < items.length; i++) {
38
+ if (items[i]) {
39
+ this.#defermentManager.undefer(items[i]);
40
+ }
41
+ else {
42
+ //this is okay!
43
+ //this.#logger(`Item ${batch[i]} not found in cache`)
44
+ }
45
+ }
46
+ };
47
+ async disposeAsync() {
48
+ await this.#readQueue?.disposeAsync();
49
+ }
50
+ }
51
+ //# sourceMappingURL=cacheReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheReader.js","sourceRoot":"","sources":["../../../src/helpers/cacheReader.ts"],"names":[],"mappings":"AAGA,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAG9C,MAAM,OAAO,WAAW;IACtB,SAAS,CAAU;IACnB,iBAAiB,CAAkB;IACnC,OAAO,CAAc;IACrB,QAAQ,CAAc;IACtB,UAAU,CAAmC;IAE7C,YACE,QAAkB,EAClB,gBAAkC,EAClC,OAAqB;QAErB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAA;QACzC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAAS,EAAE,GAAE,CAAC,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAsB;QACpC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC1B,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,aAAa,CAAC;gBAClC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB;gBACzC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,qBAAqB;gBAChD,eAAe,EAAE,IAAI,CAAC,aAAa;aACpC,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAc;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;IAED,aAAa,GAAG,KAAK,EAAE,KAAe,EAAiB,EAAE;QACvD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACb,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;YAC3C,CAAC;iBAAM,CAAC;gBACN,eAAe;gBACf,qDAAqD;YACvD,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,CAAA;IACvC,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import { DeferredBase } from './deferredBase.js';
2
+ import { Base, Item } from '../types/types.js';
3
+ import { DefermentManagerOptions } from '../operations/options.js';
4
+ export declare class DefermentManager {
5
+ private options;
6
+ private deferments;
7
+ private timer?;
8
+ private logger;
9
+ private currentSize;
10
+ private disposed;
11
+ private totalDefermentRequests;
12
+ constructor(options: DefermentManagerOptions);
13
+ private now;
14
+ isDeferred(id: string): boolean;
15
+ get(id: string): DeferredBase | undefined;
16
+ defer(params: {
17
+ id: string;
18
+ }): Promise<Base>;
19
+ private trackDefermentRequest;
20
+ undefer(item: Item): void;
21
+ private resetGlobalTimer;
22
+ dispose(): void;
23
+ private clearDeferments;
24
+ private cleanDeferments;
25
+ compareMaybeBasesBySize(a: Item | undefined, b: Item | undefined): number;
26
+ compareMaybe(a: number | undefined, b: number | undefined): number;
27
+ }
28
+ //# sourceMappingURL=defermentManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defermentManager.d.ts","sourceRoot":"","sources":["../../../src/helpers/defermentManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,IAAI,EAAgB,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,qBAAa,gBAAgB;IAUf,OAAO,CAAC,OAAO;IAT3B,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,KAAK,CAAC,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,QAAQ,CAAQ;IAGxB,OAAO,CAAC,sBAAsB,CAAiC;gBAE3C,OAAO,EAAE,uBAAuB;IAKpD,OAAO,CAAC,GAAG;IAIX,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAKnC,KAAK,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBlD,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAgBzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,IAAI,IAAI;IAUf,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;IAwCvB,uBAAuB,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM;IAOzE,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;CAMnE"}
@@ -0,0 +1,146 @@
1
+ import { DeferredBase } from './deferredBase.js';
2
+ export class DefermentManager {
3
+ options;
4
+ deferments = new Map();
5
+ timer;
6
+ logger;
7
+ currentSize = 0;
8
+ disposed = false;
9
+ //tracks total deferment requests for each id
10
+ //this is used to prevent cleaning up deferments that are still being requested
11
+ totalDefermentRequests = new Map();
12
+ constructor(options) {
13
+ this.options = options;
14
+ this.resetGlobalTimer();
15
+ this.logger = options.logger || (() => { });
16
+ }
17
+ now() {
18
+ return Date.now();
19
+ }
20
+ isDeferred(id) {
21
+ return this.deferments.has(id);
22
+ }
23
+ get(id) {
24
+ if (this.disposed)
25
+ throw new Error('DefermentManager is disposed');
26
+ return this.deferments.get(id);
27
+ }
28
+ async defer(params) {
29
+ if (this.disposed)
30
+ throw new Error('DefermentManager is disposed');
31
+ this.trackDefermentRequest(params.id);
32
+ const now = this.now();
33
+ const deferredBase = this.deferments.get(params.id);
34
+ if (deferredBase) {
35
+ deferredBase.setAccess(now);
36
+ return deferredBase.getPromise();
37
+ }
38
+ const notYetFound = new DeferredBase(this.options.ttlms, params.id, now + this.options.ttlms);
39
+ this.deferments.set(params.id, notYetFound);
40
+ return notYetFound.getPromise();
41
+ }
42
+ trackDefermentRequest(id) {
43
+ const request = this.totalDefermentRequests.get(id);
44
+ if (request) {
45
+ this.totalDefermentRequests.set(id, request + 1);
46
+ }
47
+ else {
48
+ this.totalDefermentRequests.set(id, 1);
49
+ }
50
+ }
51
+ undefer(item) {
52
+ if (this.disposed)
53
+ throw new Error('DefermentManager is disposed');
54
+ const now = this.now();
55
+ this.currentSize += item.size || 0;
56
+ //order matters here with found before undefer
57
+ const deferredBase = this.deferments.get(item.baseId);
58
+ if (deferredBase) {
59
+ deferredBase.found(item);
60
+ deferredBase.setAccess(now);
61
+ }
62
+ else {
63
+ const existing = new DeferredBase(this.options.ttlms, item.baseId, now);
64
+ existing.found(item);
65
+ this.deferments.set(item.baseId, existing);
66
+ }
67
+ }
68
+ resetGlobalTimer() {
69
+ const run = () => {
70
+ this.cleanDeferments();
71
+ this.timer = setTimeout(run, this.options.ttlms);
72
+ };
73
+ this.timer = setTimeout(run, this.options.ttlms);
74
+ }
75
+ dispose() {
76
+ if (this.disposed)
77
+ return;
78
+ this.disposed = true;
79
+ if (this.timer) {
80
+ clearTimeout(this.timer);
81
+ this.timer = undefined;
82
+ }
83
+ this.clearDeferments();
84
+ }
85
+ clearDeferments() {
86
+ let waiting = 0;
87
+ for (const deferredBase of this.deferments.values()) {
88
+ deferredBase.done(0);
89
+ if (deferredBase.getItem() === undefined) {
90
+ waiting++;
91
+ }
92
+ }
93
+ this.currentSize = 0;
94
+ this.deferments.clear();
95
+ this.logger('cleared deferments, left', waiting);
96
+ }
97
+ cleanDeferments() {
98
+ const maxSizeBytes = this.options.maxSizeInMb * 1024 * 1024;
99
+ if (this.currentSize < maxSizeBytes) {
100
+ this.logger('deferments size is ok, no need to clean', this.currentSize, maxSizeBytes);
101
+ return;
102
+ }
103
+ const now = this.now();
104
+ let cleaned = 0;
105
+ const start = performance.now();
106
+ for (const deferredBase of Array.from(this.deferments.values())
107
+ .filter((x) => x.isExpired(now))
108
+ .sort((a, b) => this.compareMaybeBasesBySize(a.getItem(), b.getItem()))) {
109
+ if (deferredBase.done(now)) {
110
+ //if the deferment is done but has been requested multiple times,
111
+ //we do not clean it up to allow the requests to resolve
112
+ const requestCount = this.totalDefermentRequests.get(deferredBase.getId());
113
+ if (requestCount && requestCount > 1) {
114
+ return;
115
+ }
116
+ this.currentSize -= deferredBase.getItem()?.size || 0;
117
+ this.deferments.delete(deferredBase.getId());
118
+ cleaned++;
119
+ if (this.currentSize < maxSizeBytes) {
120
+ break;
121
+ }
122
+ }
123
+ }
124
+ this.logger('cleaned deferments: cleaned, left, time', cleaned, this.deferments.size, performance.now() - start);
125
+ return;
126
+ }
127
+ compareMaybeBasesBySize(a, b) {
128
+ if (a === undefined && b === undefined)
129
+ return 0;
130
+ if (a === undefined)
131
+ return -1;
132
+ if (b === undefined)
133
+ return 1;
134
+ return this.compareMaybe(a.size, b.size);
135
+ }
136
+ compareMaybe(a, b) {
137
+ if (a === undefined && b === undefined)
138
+ return 0;
139
+ if (a === undefined)
140
+ return -1;
141
+ if (b === undefined)
142
+ return 1;
143
+ return a - b;
144
+ }
145
+ }
146
+ //# sourceMappingURL=defermentManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defermentManager.js","sourceRoot":"","sources":["../../../src/helpers/defermentManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Base, Item } from '../types/types.js';
2
+ export declare class DeferredBase {
3
+ private promise;
4
+ private resolve;
5
+ private reject;
6
+ private item?;
7
+ private readonly id;
8
+ private expiresAt;
9
+ private ttl;
10
+ constructor(ttl: number, id: string, expiresAt: number);
11
+ getId(): string;
12
+ getItem(): Item | undefined;
13
+ getPromise(): Promise<Base>;
14
+ isExpired(now: number): boolean;
15
+ setAccess(now: number): void;
16
+ found(value: Item): void;
17
+ done(now: number): boolean;
18
+ }
19
+ //# sourceMappingURL=deferredBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferredBase.d.ts","sourceRoot":"","sources":["../../../src/helpers/deferredBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE9C,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,IAAI,CAAC,CAAM;IAEnB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,GAAG,CAAQ;gBAEP,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAUtD,KAAK,IAAI,MAAM;IAIf,OAAO,IAAI,IAAI,GAAG,SAAS;IAI3B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAG/B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI5B,KAAK,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI;IAIxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAS3B"}
@@ -0,0 +1,47 @@
1
+ export class DeferredBase {
2
+ promise;
3
+ resolve;
4
+ reject;
5
+ item;
6
+ id;
7
+ expiresAt; // Timestamp in ms
8
+ ttl; // ttl in ms
9
+ constructor(ttl, id, expiresAt) {
10
+ this.expiresAt = expiresAt;
11
+ this.ttl = ttl;
12
+ this.id = id;
13
+ this.promise = new Promise((resolve, reject) => {
14
+ this.resolve = resolve;
15
+ this.reject = reject;
16
+ });
17
+ }
18
+ getId() {
19
+ return this.id;
20
+ }
21
+ getItem() {
22
+ return this.item;
23
+ }
24
+ getPromise() {
25
+ return this.promise;
26
+ }
27
+ isExpired(now) {
28
+ return this.item !== undefined && now > this.expiresAt;
29
+ }
30
+ setAccess(now) {
31
+ this.expiresAt = now + this.ttl;
32
+ }
33
+ found(value) {
34
+ this.item = value;
35
+ this.resolve(value.base);
36
+ }
37
+ done(now) {
38
+ if (this.item) {
39
+ this.resolve(this.item.base);
40
+ }
41
+ if (this.isExpired(now)) {
42
+ return true;
43
+ }
44
+ return false;
45
+ }
46
+ }
47
+ //# sourceMappingURL=deferredBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferredBase.js","sourceRoot":"","sources":["../../../src/helpers/deferredBase.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IACf,OAAO,CAAe;IACtB,OAAO,CAAwB;IAC/B,MAAM,CAA2B;IACjC,IAAI,CAAO;IAEF,EAAE,CAAQ;IACnB,SAAS,CAAQ,CAAC,kBAAkB;IACpC,GAAG,CAAQ,CAAC,YAAY;IAEhC,YAAY,GAAW,EAAE,EAAU,EAAE,SAAiB;QACpD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;YACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACtB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAA;IACxD,CAAC;IACD,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,KAAW;QACf,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;QACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IACD,IAAI,CAAC,GAAW;QACd,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export default class KeyedQueue<K, V> {
2
+ private _map;
3
+ private _order;
4
+ constructor();
5
+ enqueue(key: K, value: V): boolean;
6
+ get(key: K): V | undefined;
7
+ has(key: K): boolean;
8
+ get size(): number;
9
+ spliceValues(start: number, deleteCount: number): V[];
10
+ }
11
+ //# sourceMappingURL=keyedQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyedQueue.d.ts","sourceRoot":"","sources":["../../../src/helpers/keyedQueue.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC;IAClC,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,MAAM,CAAK;;IAOnB,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO;IASlC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAI1B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE;CActD"}
@@ -0,0 +1,38 @@
1
+ export default class KeyedQueue {
2
+ _map;
3
+ _order;
4
+ constructor() {
5
+ this._map = new Map();
6
+ this._order = [];
7
+ }
8
+ enqueue(key, value) {
9
+ if (this._map.has(key)) {
10
+ return false; // Key already exists
11
+ }
12
+ this._map.set(key, value);
13
+ this._order.push(key);
14
+ return true;
15
+ }
16
+ get(key) {
17
+ return this._map.get(key);
18
+ }
19
+ has(key) {
20
+ return this._map.has(key);
21
+ }
22
+ get size() {
23
+ return this._order.length;
24
+ }
25
+ spliceValues(start, deleteCount) {
26
+ const splicedKeys = this._order.splice(start, deleteCount);
27
+ const result = [];
28
+ for (const key of splicedKeys) {
29
+ const value = this._map.get(key);
30
+ if (value !== undefined) {
31
+ result.push(value);
32
+ this._map.delete(key);
33
+ }
34
+ }
35
+ return result;
36
+ }
37
+ }
38
+ //# sourceMappingURL=keyedQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyedQueue.js","sourceRoot":"","sources":["../../../src/helpers/keyedQueue.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,UAAU;IACrB,IAAI,CAAW;IACf,MAAM,CAAK;IAEnB;QACE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,EAAQ,CAAA;QAC3B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;IAClB,CAAC;IAED,OAAO,CAAC,GAAM,EAAE,KAAQ;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAA,CAAC,qBAAqB;QACpC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;IAC3B,CAAC;IAED,YAAY,CAAC,KAAa,EAAE,WAAmB;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAQ,EAAE,CAAA;QAEtB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import { Item } from '../types/types.js';
2
+ import { Pump } from './pump.js';
3
+ import Queue from './queue.js';
4
+ export declare class MemoryPump implements Pump {
5
+ #private;
6
+ add(item: Item): void;
7
+ pumpItems(params: {
8
+ ids: string[];
9
+ foundItems: Queue<Item>;
10
+ notFoundItems: Queue<string>;
11
+ }): Promise<void>;
12
+ gather(ids: string[]): AsyncGenerator<Item>;
13
+ disposeAsync(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=memoryPump.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryPump.d.ts","sourceRoot":"","sources":["../../../src/helpers/memoryPump.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,MAAM,YAAY,CAAA;AAE9B,qBAAa,UAAW,YAAW,IAAI;;IAGrC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIf,SAAS,CAAC,MAAM,EAAE;QACtB,GAAG,EAAE,MAAM,EAAE,CAAA;QACb,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACvB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAC7B,GAAG,OAAO,CAAC,IAAI,CAAC;IAaV,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC;IAU5C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CACpC"}
@@ -0,0 +1,30 @@
1
+ export class MemoryPump {
2
+ #items = new Map();
3
+ add(item) {
4
+ this.#items.set(item.baseId, item);
5
+ }
6
+ async pumpItems(params) {
7
+ const { ids, foundItems, notFoundItems } = params;
8
+ for (const id of ids) {
9
+ const item = this.#items.get(id);
10
+ if (item) {
11
+ foundItems.add(item);
12
+ }
13
+ else {
14
+ notFoundItems.add(id);
15
+ }
16
+ }
17
+ return Promise.resolve();
18
+ }
19
+ async *gather(ids) {
20
+ for (const id of ids) {
21
+ const item = this.#items.get(id);
22
+ if (item) {
23
+ yield item;
24
+ }
25
+ }
26
+ return Promise.resolve();
27
+ }
28
+ async disposeAsync() { }
29
+ }
30
+ //# sourceMappingURL=memoryPump.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryPump.js","sourceRoot":"","sources":["../../../src/helpers/memoryPump.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,UAAU;IACrB,MAAM,GAAsB,IAAI,GAAG,EAAE,CAAA;IAErC,GAAG,CAAC,IAAU;QACZ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAIf;QACC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAAA;QACjD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAChC,IAAI,IAAI,EAAE,CAAC;gBACT,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACtB,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,GAAa;QACzB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAChC,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,CAAA;YACZ,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,YAAY,KAAmB,CAAC;CACvC"}
@@ -0,0 +1,8 @@
1
+ import { Downloader } from '../operations/interfaces.js';
2
+ import { Item } from '../types/types.js';
3
+ import Queue from './queue.js';
4
+ export interface Pump extends Queue<Item> {
5
+ gather(ids: string[], downloader: Downloader): AsyncGenerator<Item>;
6
+ disposeAsync(): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=pump.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pump.d.ts","sourceRoot":"","sources":["../../../src/helpers/pump.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,KAAK,MAAM,YAAY,CAAA;AAE9B,MAAM,WAAW,IAAK,SAAQ,KAAK,CAAC,IAAI,CAAC;IACvC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IACnE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pump.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pump.js","sourceRoot":"","sources":["../../../src/helpers/pump.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export default interface Queue<T> {
2
+ add(value: T): void;
3
+ }
4
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/helpers/queue.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC,CAAC;IAC9B,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/helpers/queue.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { ObjectLoader2 } from './operations/objectLoader2.js';
2
+ export { ObjectLoader2Factory } from './operations/objectLoader2Factory.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA"}
package/dist/esm/index.js CHANGED
@@ -1,4 +1,3 @@
1
- export { MemoryDatabase } from './operations/databases/memoryDatabase.js';
2
1
  export { ObjectLoader2 } from './operations/objectLoader2.js';
3
2
  export { ObjectLoader2Factory } from './operations/objectLoader2Factory.js';
4
3
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { CustomLogger, Item } from '../../types/types.js';
2
+ import { Dexie, DexieOptions, Table } from 'dexie';
3
+ import { Database } from '../interfaces.js';
4
+ export declare class ObjectStore extends Dexie {
5
+ #private;
6
+ objects: Table<Item, string>;
7
+ constructor(options: DexieOptions);
8
+ }
9
+ export interface IndexedDatabaseOptions {
10
+ logger?: CustomLogger;
11
+ indexedDB?: IDBFactory;
12
+ keyRange?: {
13
+ bound: Function;
14
+ lowerBound: Function;
15
+ upperBound: Function;
16
+ };
17
+ }
18
+ export default class IndexedDatabase implements Database {
19
+ #private;
20
+ constructor(options: IndexedDatabaseOptions);
21
+ getAll(keys: string[]): Promise<(Item | undefined)[]>;
22
+ cacheSaveBatch(params: {
23
+ batch: Item[];
24
+ }): Promise<void>;
25
+ disposeAsync(): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=indexedDatabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexedDatabase.d.ts","sourceRoot":"","sources":["../../../../src/operations/databases/indexedDatabase.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,qBAAa,WAAY,SAAQ,KAAK;;IAEpC,OAAO,EAAG,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;gBAEjB,OAAO,EAAE,YAAY;CAOlC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,QAAQ,CAAA;QACf,UAAU,EAAE,QAAQ,CAAA;QACpB,UAAU,EAAE,QAAQ,CAAA;KACrB,CAAA;CACF;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,QAAQ;;gBAU1C,OAAO,EAAE,sBAAsB;IAKrC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC;IAwCrD,cAAc,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,IAAI,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCxD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAMpC"}
@@ -0,0 +1,93 @@
1
+ import { isSafari } from '@speckle/shared';
2
+ import { Dexie } from 'dexie';
3
+ export class ObjectStore extends Dexie {
4
+ static #databaseName = 'speckle-cache';
5
+ objects; // Table type: <entity, primaryKey>
6
+ constructor(options) {
7
+ super(ObjectStore.#databaseName, options);
8
+ this.version(1).stores({
9
+ objects: 'baseId, item' // baseId is primary key
10
+ });
11
+ }
12
+ }
13
+ export default class IndexedDatabase {
14
+ #options;
15
+ #logger;
16
+ #cacheDB;
17
+ #writeQueue;
18
+ // #count: number = 0
19
+ constructor(options) {
20
+ this.#options = options;
21
+ this.#logger = options.logger || (() => { });
22
+ }
23
+ async getAll(keys) {
24
+ await this.#setupCacheDb();
25
+ let items = [];
26
+ // this.#count++
27
+ // const startTime = performance.now()
28
+ // this.#logger('Start read ' + x + ' ' + batch.length)
29
+ //faster than BulkGet with dexie
30
+ await this.#cacheDB.transaction('r', this.#cacheDB.objects, async () => {
31
+ const gets = keys.map((key) => this.#cacheDB.objects.get(key));
32
+ const cachedData = await Promise.all(gets);
33
+ items = cachedData;
34
+ });
35
+ // const endTime = performance.now()
36
+ // const duration = endTime - startTime
37
+ //this.#logger('Saved batch ' + x + ' ' + batch.length + ' ' + duration / TIME_MS.second)
38
+ return items;
39
+ }
40
+ async #openDatabase() {
41
+ const db = new ObjectStore({
42
+ indexedDB: this.#options.indexedDB ?? globalThis.indexedDB,
43
+ IDBKeyRange: this.#options.keyRange ?? IDBKeyRange,
44
+ chromeTransactionDurability: 'relaxed'
45
+ });
46
+ await db.open();
47
+ return db;
48
+ }
49
+ async #setupCacheDb() {
50
+ if (this.#cacheDB !== undefined) {
51
+ return;
52
+ }
53
+ // Initialize
54
+ await this.#safariFix();
55
+ this.#cacheDB = await this.#openDatabase();
56
+ }
57
+ async cacheSaveBatch(params) {
58
+ await this.#setupCacheDb();
59
+ const { batch } = params;
60
+ //const x = this.#count
61
+ //this.#count++
62
+ // const startTime = performance.now()
63
+ // this.#logger('Start save ' + x + ' ' + batch.length)
64
+ await this.#cacheDB.objects.bulkPut(batch);
65
+ // const endTime = performance.now()
66
+ // const duration = endTime - startTime
67
+ //this.#logger('Saved batch ' + x + ' ' + batch.length + ' ' + duration / TIME_MS.second)
68
+ }
69
+ /**
70
+ * Fixes a Safari bug where IndexedDB requests get lost and never resolve - invoke before you use IndexedDB
71
+ * @link Credits and more info: https://github.com/jakearchibald/safari-14-idb-fix
72
+ */
73
+ async #safariFix() {
74
+ // No point putting other browsers or older versions of Safari through this mess.
75
+ if (!isSafari() || !this.#options.indexedDB?.databases)
76
+ return Promise.resolve();
77
+ let intervalId;
78
+ return new Promise((resolve) => {
79
+ const tryIdb = () => this.#options.indexedDB?.databases().finally(resolve);
80
+ intervalId = setInterval(() => {
81
+ void tryIdb();
82
+ }, 100);
83
+ void tryIdb();
84
+ }).finally(() => clearInterval(intervalId));
85
+ }
86
+ async disposeAsync() {
87
+ this.#cacheDB?.close();
88
+ this.#cacheDB = undefined;
89
+ await this.#writeQueue?.disposeAsync();
90
+ this.#writeQueue = undefined;
91
+ }
92
+ }
93
+ //# sourceMappingURL=indexedDatabase.js.map