@kingsy/objectloader2 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 (256) hide show
  1. package/.tshy/build.json +8 -0
  2. package/.tshy/commonjs.json +17 -0
  3. package/.tshy/esm.json +16 -0
  4. package/dist/commonjs/helpers/aggregateQueue.d.ts +8 -0
  5. package/dist/commonjs/helpers/aggregateQueue.d.ts.map +1 -0
  6. package/dist/commonjs/helpers/aggregateQueue.js +19 -0
  7. package/dist/commonjs/helpers/aggregateQueue.js.map +1 -0
  8. package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts +8 -0
  9. package/dist/commonjs/helpers/asyncGeneratorQueue.d.ts.map +1 -0
  10. package/dist/commonjs/helpers/asyncGeneratorQueue.js +35 -0
  11. package/dist/commonjs/helpers/asyncGeneratorQueue.js.map +1 -0
  12. package/dist/commonjs/helpers/batchedPool.d.ts +12 -0
  13. package/dist/commonjs/helpers/batchedPool.d.ts.map +1 -0
  14. package/dist/commonjs/helpers/batchedPool.js +45 -0
  15. package/dist/commonjs/helpers/batchedPool.js.map +1 -0
  16. package/dist/commonjs/helpers/batchingQueue.d.ts +14 -0
  17. package/dist/commonjs/helpers/batchingQueue.d.ts.map +1 -0
  18. package/dist/commonjs/helpers/batchingQueue.js +77 -0
  19. package/dist/commonjs/helpers/batchingQueue.js.map +1 -0
  20. package/dist/commonjs/helpers/bufferQueue.d.ts +7 -0
  21. package/dist/commonjs/helpers/bufferQueue.d.ts.map +1 -0
  22. package/dist/commonjs/helpers/bufferQueue.js +13 -0
  23. package/dist/commonjs/helpers/bufferQueue.js.map +1 -0
  24. package/dist/commonjs/helpers/cachePump.d.ts +22 -0
  25. package/dist/commonjs/helpers/cachePump.d.ts.map +1 -0
  26. package/dist/commonjs/helpers/cachePump.js +86 -0
  27. package/dist/commonjs/helpers/cachePump.js.map +1 -0
  28. package/dist/commonjs/helpers/cacheReader.d.ts +14 -0
  29. package/dist/commonjs/helpers/cacheReader.d.ts.map +1 -0
  30. package/dist/commonjs/helpers/cacheReader.js +58 -0
  31. package/dist/commonjs/helpers/cacheReader.js.map +1 -0
  32. package/dist/commonjs/helpers/defermentManager.d.ts +28 -0
  33. package/dist/commonjs/helpers/defermentManager.d.ts.map +1 -0
  34. package/dist/commonjs/helpers/defermentManager.js +150 -0
  35. package/dist/commonjs/helpers/defermentManager.js.map +1 -0
  36. package/dist/commonjs/helpers/deferredBase.d.ts +19 -0
  37. package/dist/commonjs/helpers/deferredBase.d.ts.map +1 -0
  38. package/dist/commonjs/helpers/deferredBase.js +51 -0
  39. package/dist/commonjs/helpers/deferredBase.js.map +1 -0
  40. package/dist/commonjs/helpers/keyedQueue.d.ts +11 -0
  41. package/dist/commonjs/helpers/keyedQueue.d.ts.map +1 -0
  42. package/dist/commonjs/helpers/keyedQueue.js +41 -0
  43. package/dist/commonjs/helpers/keyedQueue.js.map +1 -0
  44. package/dist/commonjs/helpers/memoryPump.d.ts +15 -0
  45. package/dist/commonjs/helpers/memoryPump.d.ts.map +1 -0
  46. package/dist/commonjs/helpers/memoryPump.js +34 -0
  47. package/dist/commonjs/helpers/memoryPump.js.map +1 -0
  48. package/dist/commonjs/helpers/pump.d.ts +8 -0
  49. package/dist/commonjs/helpers/pump.d.ts.map +1 -0
  50. package/dist/commonjs/helpers/pump.js +3 -0
  51. package/dist/commonjs/helpers/pump.js.map +1 -0
  52. package/dist/commonjs/helpers/queue.d.ts +4 -0
  53. package/dist/commonjs/helpers/queue.d.ts.map +1 -0
  54. package/dist/commonjs/helpers/queue.js +3 -0
  55. package/dist/commonjs/helpers/queue.js.map +1 -0
  56. package/dist/commonjs/index.d.ts +3 -0
  57. package/dist/commonjs/index.d.ts.map +1 -0
  58. package/dist/commonjs/index.js +8 -0
  59. package/dist/commonjs/index.js.map +1 -0
  60. package/dist/commonjs/operations/databases/indexedDatabase.d.ts +27 -0
  61. package/dist/commonjs/operations/databases/indexedDatabase.d.ts.map +1 -0
  62. package/dist/commonjs/operations/databases/indexedDatabase.js +98 -0
  63. package/dist/commonjs/operations/databases/indexedDatabase.js.map +1 -0
  64. package/dist/commonjs/operations/databases/memoryDatabase.d.ts +13 -0
  65. package/dist/commonjs/operations/databases/memoryDatabase.d.ts.map +1 -0
  66. package/dist/commonjs/operations/databases/memoryDatabase.js +33 -0
  67. package/dist/commonjs/operations/databases/memoryDatabase.js.map +1 -0
  68. package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts +16 -0
  69. package/dist/commonjs/operations/downloaders/memoryDownloader.d.ts.map +1 -0
  70. package/dist/commonjs/operations/downloaders/memoryDownloader.js +35 -0
  71. package/dist/commonjs/operations/downloaders/memoryDownloader.js.map +1 -0
  72. package/dist/commonjs/operations/downloaders/serverDownloader.d.ts +32 -0
  73. package/dist/commonjs/operations/downloaders/serverDownloader.d.ts.map +1 -0
  74. package/dist/commonjs/operations/downloaders/serverDownloader.js +169 -0
  75. package/dist/commonjs/operations/downloaders/serverDownloader.js.map +1 -0
  76. package/dist/commonjs/operations/interfaces.d.ts +19 -0
  77. package/dist/commonjs/operations/interfaces.d.ts.map +1 -0
  78. package/dist/commonjs/operations/interfaces.js +3 -0
  79. package/dist/commonjs/operations/interfaces.js.map +1 -0
  80. package/dist/commonjs/operations/objectLoader2.d.ts +16 -0
  81. package/dist/commonjs/operations/objectLoader2.d.ts.map +1 -0
  82. package/dist/commonjs/operations/objectLoader2.js +101 -0
  83. package/dist/commonjs/operations/objectLoader2.js.map +1 -0
  84. package/dist/commonjs/operations/objectLoader2Factory.d.ts +25 -0
  85. package/dist/commonjs/operations/objectLoader2Factory.d.ts.map +1 -0
  86. package/dist/commonjs/operations/objectLoader2Factory.js +68 -0
  87. package/dist/commonjs/operations/objectLoader2Factory.js.map +1 -0
  88. package/dist/commonjs/operations/options.d.ts +26 -0
  89. package/dist/commonjs/operations/options.d.ts.map +1 -0
  90. package/dist/commonjs/operations/options.js +3 -0
  91. package/dist/commonjs/operations/options.js.map +1 -0
  92. package/dist/commonjs/operations/traverser.d.ts +19 -0
  93. package/dist/commonjs/operations/traverser.d.ts.map +1 -0
  94. package/dist/commonjs/operations/traverser.js +96 -0
  95. package/dist/commonjs/operations/traverser.js.map +1 -0
  96. package/dist/commonjs/package.json +3 -0
  97. package/dist/commonjs/types/errors.d.ts +21 -0
  98. package/dist/commonjs/types/errors.d.ts.map +1 -0
  99. package/dist/commonjs/types/errors.js +28 -0
  100. package/dist/commonjs/types/errors.js.map +1 -0
  101. package/dist/commonjs/types/types.d.ts +25 -0
  102. package/dist/commonjs/types/types.d.ts.map +1 -0
  103. package/dist/commonjs/types/types.js +39 -0
  104. package/dist/commonjs/types/types.js.map +1 -0
  105. package/dist/esm/helpers/aggregateQueue.d.ts +8 -0
  106. package/dist/esm/helpers/aggregateQueue.d.ts.map +1 -0
  107. package/dist/esm/helpers/aggregateQueue.js +16 -0
  108. package/dist/esm/helpers/aggregateQueue.js.map +1 -0
  109. package/dist/esm/helpers/asyncGeneratorQueue.d.ts +8 -0
  110. package/dist/esm/helpers/asyncGeneratorQueue.d.ts.map +1 -0
  111. package/dist/esm/helpers/asyncGeneratorQueue.js +32 -0
  112. package/dist/esm/helpers/asyncGeneratorQueue.js.map +1 -0
  113. package/dist/esm/helpers/batchedPool.d.ts +12 -0
  114. package/dist/esm/helpers/batchedPool.d.ts.map +1 -0
  115. package/dist/esm/helpers/batchedPool.js +42 -0
  116. package/dist/esm/helpers/batchedPool.js.map +1 -0
  117. package/dist/esm/helpers/batchingQueue.d.ts +14 -0
  118. package/dist/esm/helpers/batchingQueue.d.ts.map +1 -0
  119. package/dist/esm/helpers/batchingQueue.js +71 -0
  120. package/dist/esm/helpers/batchingQueue.js.map +1 -0
  121. package/dist/esm/helpers/bufferQueue.d.ts +7 -0
  122. package/dist/esm/helpers/bufferQueue.d.ts.map +1 -0
  123. package/dist/esm/helpers/bufferQueue.js +10 -0
  124. package/dist/esm/helpers/bufferQueue.js.map +1 -0
  125. package/dist/esm/helpers/cachePump.d.ts +22 -0
  126. package/dist/esm/helpers/cachePump.d.ts.map +1 -0
  127. package/dist/esm/helpers/cachePump.js +79 -0
  128. package/dist/esm/helpers/cachePump.js.map +1 -0
  129. package/dist/esm/helpers/cacheReader.d.ts +14 -0
  130. package/dist/esm/helpers/cacheReader.d.ts.map +1 -0
  131. package/dist/esm/helpers/cacheReader.js +51 -0
  132. package/dist/esm/helpers/cacheReader.js.map +1 -0
  133. package/dist/esm/helpers/defermentManager.d.ts +28 -0
  134. package/dist/esm/helpers/defermentManager.d.ts.map +1 -0
  135. package/dist/esm/helpers/defermentManager.js +146 -0
  136. package/dist/esm/helpers/defermentManager.js.map +1 -0
  137. package/dist/esm/helpers/deferredBase.d.ts +19 -0
  138. package/dist/esm/helpers/deferredBase.d.ts.map +1 -0
  139. package/dist/esm/helpers/deferredBase.js +47 -0
  140. package/dist/esm/helpers/deferredBase.js.map +1 -0
  141. package/dist/esm/helpers/keyedQueue.d.ts +11 -0
  142. package/dist/esm/helpers/keyedQueue.d.ts.map +1 -0
  143. package/dist/esm/helpers/keyedQueue.js +38 -0
  144. package/dist/esm/helpers/keyedQueue.js.map +1 -0
  145. package/dist/esm/helpers/memoryPump.d.ts +15 -0
  146. package/dist/esm/helpers/memoryPump.d.ts.map +1 -0
  147. package/dist/esm/helpers/memoryPump.js +30 -0
  148. package/dist/esm/helpers/memoryPump.js.map +1 -0
  149. package/dist/esm/helpers/pump.d.ts +8 -0
  150. package/dist/esm/helpers/pump.d.ts.map +1 -0
  151. package/dist/esm/helpers/pump.js +2 -0
  152. package/dist/esm/helpers/pump.js.map +1 -0
  153. package/dist/esm/helpers/queue.d.ts +4 -0
  154. package/dist/esm/helpers/queue.d.ts.map +1 -0
  155. package/dist/esm/helpers/queue.js +2 -0
  156. package/dist/esm/helpers/queue.js.map +1 -0
  157. package/dist/esm/index.d.ts +3 -0
  158. package/dist/esm/index.d.ts.map +1 -0
  159. package/dist/esm/index.js +3 -0
  160. package/dist/esm/index.js.map +1 -0
  161. package/dist/esm/operations/databases/indexedDatabase.d.ts +27 -0
  162. package/dist/esm/operations/databases/indexedDatabase.d.ts.map +1 -0
  163. package/dist/esm/operations/databases/indexedDatabase.js +93 -0
  164. package/dist/esm/operations/databases/indexedDatabase.js.map +1 -0
  165. package/dist/esm/operations/databases/memoryDatabase.d.ts +13 -0
  166. package/dist/esm/operations/databases/memoryDatabase.d.ts.map +1 -0
  167. package/dist/esm/operations/databases/memoryDatabase.js +29 -0
  168. package/dist/esm/operations/databases/memoryDatabase.js.map +1 -0
  169. package/dist/esm/operations/downloaders/memoryDownloader.d.ts +16 -0
  170. package/dist/esm/operations/downloaders/memoryDownloader.d.ts.map +1 -0
  171. package/dist/esm/operations/downloaders/memoryDownloader.js +31 -0
  172. package/dist/esm/operations/downloaders/memoryDownloader.js.map +1 -0
  173. package/dist/esm/operations/downloaders/serverDownloader.d.ts +32 -0
  174. package/dist/esm/operations/downloaders/serverDownloader.d.ts.map +1 -0
  175. package/dist/esm/operations/downloaders/serverDownloader.js +163 -0
  176. package/dist/esm/operations/downloaders/serverDownloader.js.map +1 -0
  177. package/dist/esm/operations/interfaces.d.ts +19 -0
  178. package/dist/esm/operations/interfaces.d.ts.map +1 -0
  179. package/dist/esm/operations/interfaces.js +2 -0
  180. package/dist/esm/operations/interfaces.js.map +1 -0
  181. package/dist/esm/operations/objectLoader2.d.ts +16 -0
  182. package/dist/esm/operations/objectLoader2.d.ts.map +1 -0
  183. package/dist/esm/operations/objectLoader2.js +94 -0
  184. package/dist/esm/operations/objectLoader2.js.map +1 -0
  185. package/dist/esm/operations/objectLoader2Factory.d.ts +25 -0
  186. package/dist/esm/operations/objectLoader2Factory.d.ts.map +1 -0
  187. package/dist/esm/operations/objectLoader2Factory.js +61 -0
  188. package/dist/esm/operations/objectLoader2Factory.js.map +1 -0
  189. package/dist/esm/operations/options.d.ts +26 -0
  190. package/dist/esm/operations/options.d.ts.map +1 -0
  191. package/dist/esm/operations/options.js +2 -0
  192. package/dist/esm/operations/options.js.map +1 -0
  193. package/dist/esm/operations/traverser.d.ts +19 -0
  194. package/dist/esm/operations/traverser.d.ts.map +1 -0
  195. package/dist/esm/operations/traverser.js +93 -0
  196. package/dist/esm/operations/traverser.js.map +1 -0
  197. package/dist/esm/package.json +3 -0
  198. package/dist/esm/types/errors.d.ts +21 -0
  199. package/dist/esm/types/errors.d.ts.map +1 -0
  200. package/dist/esm/types/errors.js +23 -0
  201. package/dist/esm/types/errors.js.map +1 -0
  202. package/dist/esm/types/types.d.ts +25 -0
  203. package/dist/esm/types/types.d.ts.map +1 -0
  204. package/dist/esm/types/types.js +33 -0
  205. package/dist/esm/types/types.js.map +1 -0
  206. package/eslint.config.mjs +60 -0
  207. package/package.json +76 -0
  208. package/readme.md +42 -0
  209. package/src/helpers/__snapshots__/cachePump.spec.ts.snap +31 -0
  210. package/src/helpers/__snapshots__/cacheReader.spec.ts.snap +8 -0
  211. package/src/helpers/__snapshots__/defermentManager.spec.ts.snap +8 -0
  212. package/src/helpers/aggregateQueue.ts +20 -0
  213. package/src/helpers/asyncGeneratorQueue.ts +35 -0
  214. package/src/helpers/batchedPool.ts +56 -0
  215. package/src/helpers/batchingQueue.ts +85 -0
  216. package/src/helpers/bufferQueue.ts +12 -0
  217. package/src/helpers/cachePump.disposal.spec.ts +51 -0
  218. package/src/helpers/cachePump.spec.ts +104 -0
  219. package/src/helpers/cachePump.ts +107 -0
  220. package/src/helpers/cacheReader.spec.ts +35 -0
  221. package/src/helpers/cacheReader.ts +64 -0
  222. package/src/helpers/defermentManager.defermentTotals.spec.ts +53 -0
  223. package/src/helpers/defermentManager.disposal.spec.ts +28 -0
  224. package/src/helpers/defermentManager.spec.ts +37 -0
  225. package/src/helpers/defermentManager.ts +160 -0
  226. package/src/helpers/deferredBase.ts +55 -0
  227. package/src/helpers/keyedQueue.ts +45 -0
  228. package/src/helpers/memoryPump.ts +40 -0
  229. package/src/helpers/pump.ts +8 -0
  230. package/src/helpers/queue.ts +3 -0
  231. package/src/index.ts +2 -0
  232. package/src/operations/__snapshots__/objectLoader2.spec.ts.snap +149 -0
  233. package/src/operations/__snapshots__/traverser.spec.ts.snap +45 -0
  234. package/src/operations/databases/__snapshots__/indexedDatabase.spec.ts.snap +18 -0
  235. package/src/operations/databases/indexedDatabase.spec.ts +33 -0
  236. package/src/operations/databases/indexedDatabase.ts +126 -0
  237. package/src/operations/databases/memoryDatabase.spec.ts +48 -0
  238. package/src/operations/databases/memoryDatabase.ts +35 -0
  239. package/src/operations/downloaders/__snapshots__/memoryDownloader.spec.ts.snap +12 -0
  240. package/src/operations/downloaders/__snapshots__/serverDownloader.spec.ts.snap +92 -0
  241. package/src/operations/downloaders/memoryDownloader.spec.ts +49 -0
  242. package/src/operations/downloaders/memoryDownloader.ts +39 -0
  243. package/src/operations/downloaders/serverDownloader.spec.ts +161 -0
  244. package/src/operations/downloaders/serverDownloader.ts +217 -0
  245. package/src/operations/interfaces.ts +18 -0
  246. package/src/operations/objectLoader2.spec.ts +229 -0
  247. package/src/operations/objectLoader2.ts +119 -0
  248. package/src/operations/objectLoader2Factory.ts +78 -0
  249. package/src/operations/options.ts +29 -0
  250. package/src/operations/traverser.spec.ts +58 -0
  251. package/src/operations/traverser.ts +112 -0
  252. package/src/test/e2e.spec.ts +43 -0
  253. package/src/types/errors.ts +25 -0
  254. package/src/types/types.ts +71 -0
  255. package/tsconfig.json +103 -0
  256. package/vitest.config.ts +3 -0
@@ -0,0 +1,19 @@
1
+ import { Base } from '../types/types.js';
2
+ import { ObjectLoader2 } from './objectLoader2.js';
3
+ export type ProgressStage = 'download' | 'construction';
4
+ export type OnProgress = (e: {
5
+ stage: ProgressStage;
6
+ current: number;
7
+ total: number;
8
+ }) => void;
9
+ export interface TraverserOptions {
10
+ excludeProps?: string[];
11
+ }
12
+ export default class Traverser {
13
+ #private;
14
+ constructor(loader: ObjectLoader2, options?: TraverserOptions);
15
+ traverse(onProgress?: OnProgress): Promise<Base>;
16
+ traverseArray(array: Array<unknown>, onProgress?: OnProgress): Promise<void>;
17
+ traverseBase(base: Base, onProgress?: OnProgress): Promise<Base>;
18
+ }
19
+ //# sourceMappingURL=traverser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverser.d.ts","sourceRoot":"","sources":["../../../src/operations/traverser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA4C,MAAM,mBAAmB,CAAA;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,cAAc,CAAA;AACvD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE;IAC3B,KAAK,EAAE,aAAa,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,KAAK,IAAI,CAAA;AAEV,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,CAAC,OAAO,OAAO,SAAS;;gBAOhB,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAKvD,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAehD,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5E,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAuDvE"}
@@ -0,0 +1,93 @@
1
+ import { isBase, isReference, isScalar } from '../types/types.js';
2
+ export default class Traverser {
3
+ #loader;
4
+ #options;
5
+ #totalChildrenCount = 0;
6
+ #traversedReferencesCount = 0;
7
+ constructor(loader, options) {
8
+ this.#options = options || {};
9
+ this.#loader = loader;
10
+ }
11
+ async traverse(onProgress) {
12
+ let firstObjectPromise = undefined;
13
+ for await (const obj of this.#loader.getObjectIterator()) {
14
+ if (!firstObjectPromise) {
15
+ firstObjectPromise = this.traverseBase(obj, onProgress);
16
+ }
17
+ }
18
+ if (firstObjectPromise) {
19
+ return await firstObjectPromise;
20
+ }
21
+ else {
22
+ throw new Error('No objects found');
23
+ }
24
+ }
25
+ async traverseArray(array, onProgress) {
26
+ for (let i = 0; i < 10; i++) {
27
+ const prop = array[i];
28
+ if (isScalar(prop))
29
+ continue;
30
+ if (isBase(prop)) {
31
+ array[i] = await this.traverseBase(prop, onProgress);
32
+ }
33
+ else if (isReference(prop)) {
34
+ array[i] = await this.traverseBase(await this.#loader.getObject({ id: prop.referencedId }), onProgress);
35
+ }
36
+ }
37
+ }
38
+ async traverseBase(base, onProgress) {
39
+ for (const ignoredProp of this.#options.excludeProps || []) {
40
+ delete base[ignoredProp];
41
+ }
42
+ if (base.__closure) {
43
+ const ids = Object.keys(base.__closure);
44
+ const promises = [];
45
+ for (const id of ids) {
46
+ promises.push(this.traverseBase(await this.#loader.getObject({ id }), onProgress));
47
+ }
48
+ await Promise.all(promises);
49
+ }
50
+ delete base['__closure'];
51
+ // De-chunk
52
+ if (base.kingsy_type?.includes('DataChunk')) {
53
+ const chunk = base;
54
+ if (chunk.data) {
55
+ await this.traverseArray(chunk.data, onProgress);
56
+ }
57
+ }
58
+ //other props
59
+ for (const prop in base) {
60
+ if (prop === '__closure')
61
+ continue;
62
+ if (prop === 'referenceId')
63
+ continue;
64
+ if (prop === 'kingsy_type')
65
+ continue;
66
+ if (prop === 'data')
67
+ continue;
68
+ const baseProp = base[prop];
69
+ if (isScalar(baseProp))
70
+ continue;
71
+ if (isBase(baseProp)) {
72
+ await this.traverseBase(baseProp, onProgress);
73
+ }
74
+ else if (isReference(baseProp)) {
75
+ await this.traverseBase(await this.#loader.getObject({ id: baseProp.referencedId }), onProgress);
76
+ }
77
+ else if (Array.isArray(baseProp)) {
78
+ await this.traverseArray(baseProp, onProgress);
79
+ }
80
+ }
81
+ if (onProgress) {
82
+ onProgress({
83
+ stage: 'construction',
84
+ current: ++this.#traversedReferencesCount > this.#totalChildrenCount
85
+ ? this.#totalChildrenCount
86
+ : this.#traversedReferencesCount,
87
+ total: this.#totalChildrenCount
88
+ });
89
+ }
90
+ return base;
91
+ }
92
+ }
93
+ //# sourceMappingURL=traverser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverser.js","sourceRoot":"","sources":["../../../src/operations/traverser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Base ObjectLoader error
3
+ */
4
+ declare class BaseError extends Error {
5
+ /**
6
+ * Default message if none is passed
7
+ */
8
+ static defaultMessage: string;
9
+ /**
10
+ * @param {string} [message]
11
+ */
12
+ constructor(message: string);
13
+ }
14
+ export declare class ObjectLoaderConfigurationError extends BaseError {
15
+ static defaultMessage: string;
16
+ }
17
+ export declare class ObjectLoaderRuntimeError extends BaseError {
18
+ static defaultMessage: string;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAM,SAAU,SAAQ,KAAK;IAC3B;;OAEG;IACH,MAAM,CAAC,cAAc,SAA8B;IAEnD;;OAEG;gBACS,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,8BAA+B,SAAQ,SAAS;IAC3D,MAAM,CAAC,cAAc,SAA0C;CAChE;AAED,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,cAAc,SAAiD;CACvE"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Base ObjectLoader error
3
+ */
4
+ class BaseError extends Error {
5
+ /**
6
+ * Default message if none is passed
7
+ */
8
+ static defaultMessage = 'Unexpected error occurred';
9
+ /**
10
+ * @param {string} [message]
11
+ */
12
+ constructor(message) {
13
+ message ||= new.target.defaultMessage;
14
+ super(message);
15
+ }
16
+ }
17
+ export class ObjectLoaderConfigurationError extends BaseError {
18
+ static defaultMessage = 'Object loader configured incorrectly!';
19
+ }
20
+ export class ObjectLoaderRuntimeError extends BaseError {
21
+ static defaultMessage = 'Object loader encountered a runtime problem!';
22
+ }
23
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,SAAU,SAAQ,KAAK;IAC3B;;OAEG;IACH,MAAM,CAAC,cAAc,GAAG,2BAA2B,CAAA;IAEnD;;OAEG;IACH,YAAY,OAAe;QACzB,OAAO,KAAK,GAAG,CAAC,MAAM,CAAC,cAAc,CAAA;QACrC,KAAK,CAAC,OAAO,CAAC,CAAA;IAChB,CAAC;;AAGH,MAAM,OAAO,8BAA+B,SAAQ,SAAS;IAC3D,MAAM,CAAC,cAAc,GAAG,uCAAuC,CAAA;;AAGjE,MAAM,OAAO,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,cAAc,GAAG,8CAA8C,CAAA"}
@@ -0,0 +1,25 @@
1
+ export type CustomLogger = (message?: string, ...optionalParams: unknown[]) => void;
2
+ export type Fetcher = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
3
+ export interface Item {
4
+ baseId: string;
5
+ base: Base;
6
+ size?: number;
7
+ }
8
+ export interface Base {
9
+ id: string;
10
+ kingsy_type: string;
11
+ __closure?: Record<string, number>;
12
+ }
13
+ export interface Reference {
14
+ kingsy_type: string;
15
+ referencedId: string;
16
+ __closure?: Record<string, number>;
17
+ }
18
+ export interface DataChunk extends Base {
19
+ data?: Base[];
20
+ }
21
+ export declare function isBase(maybeBase?: unknown): maybeBase is Base;
22
+ export declare function isReference(maybeRef?: unknown): maybeRef is Reference;
23
+ export declare function isScalar(value: unknown): value is string | number | boolean | bigint | symbol | undefined;
24
+ export declare function take<T>(it: Iterator<T>, count: number): T[];
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;AAEnF,MAAM,MAAM,OAAO,GAAG,CACpB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEtB,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,SAAU,SAAQ,IAAI;IACrC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;CACd;AAED,wBAAgB,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,IAAI,IAAI,CAO7D;AAED,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,IAAI,SAAS,CAOrE;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAWlE;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAQ3D"}
@@ -0,0 +1,33 @@
1
+ export function isBase(maybeBase) {
2
+ return (maybeBase !== null &&
3
+ typeof maybeBase === 'object' &&
4
+ 'id' in maybeBase &&
5
+ typeof maybeBase.id === 'string');
6
+ }
7
+ export function isReference(maybeRef) {
8
+ return (maybeRef !== null &&
9
+ typeof maybeRef === 'object' &&
10
+ 'referencedId' in maybeRef &&
11
+ typeof maybeRef.referencedId === 'string');
12
+ }
13
+ export function isScalar(value) {
14
+ const type = typeof value;
15
+ return (value === null ||
16
+ type === 'string' ||
17
+ type === 'number' ||
18
+ type === 'boolean' ||
19
+ type === 'bigint' ||
20
+ type === 'symbol' ||
21
+ type === 'undefined');
22
+ }
23
+ export function take(it, count) {
24
+ const result = [];
25
+ for (let i = 0; i < count; i++) {
26
+ const itr = it.next();
27
+ if (itr.done)
28
+ break;
29
+ result.push(itr.value);
30
+ }
31
+ return result;
32
+ }
33
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types/types.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,MAAM,CAAC,SAAmB;IACxC,OAAO,CACL,SAAS,KAAK,IAAI;QAClB,OAAO,SAAS,KAAK,QAAQ;QAC7B,IAAI,IAAI,SAAS;QACjB,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,CACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC5C,OAAO,CACL,QAAQ,KAAK,IAAI;QACjB,OAAO,QAAQ,KAAK,QAAQ;QAC5B,cAAc,IAAI,QAAQ;QAC1B,OAAO,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAC1C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,KAAc;IAEd,MAAM,IAAI,GAAG,OAAO,KAAK,CAAA;IACzB,OAAO,CACL,KAAK,KAAK,IAAI;QACd,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,SAAS;QAClB,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,WAAW,CACrB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAI,EAAe,EAAE,KAAa;IACpD,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAA;QACrB,IAAI,GAAG,CAAC,IAAI;YAAE,MAAK;QACnB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { baseConfigs, globals, getESMDirname } from '../../eslint.config.mjs'
2
+ import tseslint from 'typescript-eslint'
3
+
4
+ /**
5
+ * @type {Array<import('eslint').Linter.FlatConfig>}
6
+ */
7
+ const configs = [
8
+ ...baseConfigs,
9
+ {
10
+ files: ['examples/browser/**/*.{ts,js}'],
11
+ languageOptions: {
12
+ globals: {
13
+ ...globals.browser
14
+ }
15
+ }
16
+ },
17
+ ...tseslint.configs.recommendedTypeChecked.map((c) => ({
18
+ ...c,
19
+ files: [...(c.files || []), '**/*.ts', '**/*.d.ts']
20
+ })),
21
+ {
22
+ files: ['**/*.ts', '**/*.d.ts'],
23
+ languageOptions: {
24
+ parserOptions: {
25
+ tsconfigRootDir: getESMDirname(import.meta.url),
26
+ projectService: {
27
+ allowDefaultProject: ['*.ts']
28
+ }
29
+ }
30
+ },
31
+ rules: {
32
+ '@typescript-eslint/restrict-template-expressions': 'off',
33
+ '@typescript-eslint/await-thenable': 'error',
34
+ '@typescript-eslint/explicit-function-return-type': 'error'
35
+ }
36
+ },
37
+ {
38
+ files: ['**/*.d.ts'],
39
+ rules: {
40
+ '@typescript-eslint/no-explicit-any': 'off'
41
+ }
42
+ },
43
+ {
44
+ files: ['vite.config.ts'],
45
+ languageOptions: {
46
+ globals: {
47
+ ...globals.node
48
+ }
49
+ }
50
+ },
51
+ {
52
+ files: ['**/*.spec.ts'],
53
+ rules: {
54
+ camelcase: 'off',
55
+ '@typescript-eslint/no-unused-expressions': 'off'
56
+ }
57
+ }
58
+ ]
59
+
60
+ export default configs
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@kingsy/objectloader2",
3
+ "version": "2.25.7",
4
+ "description": "This is an updated objectloader for the KingSy viewer written in typescript",
5
+ "main": "./dist/commonjs/index.js",
6
+ "module": "./dist/esm/index.js",
7
+ "homepage": "https://kingsy.systems",
8
+ "types": "./dist/commonjs/index.d.ts",
9
+ "type": "module",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/kingsysystems/kingsy-server.git",
13
+ "directory": "packages/objectloader2"
14
+ },
15
+ "engines": {
16
+ "node": ">=18.0.0"
17
+ },
18
+ "scripts": {
19
+ "lint:eslint": "eslint .",
20
+ "lint:tsc": "tsc --noEmit",
21
+ "lint": "yarn lint:eslint && yarn lint:tsc",
22
+ "lint:ci": "yarn lint:tsc",
23
+ "build": "NODE_ENV=production tshy",
24
+ "dev": "tshy --watch",
25
+ "test": "vitest",
26
+ "test:single-run": "vitest run"
27
+ },
28
+ "keywords": [
29
+ "kingsy",
30
+ "aec",
31
+ "kingsy api"
32
+ ],
33
+ "author": "AEC Systems",
34
+ "license": "Apache-2.0",
35
+ "dependencies": {
36
+ "@kingsy/shared": "^2.25.7",
37
+ "dexie": "^4.0.11"
38
+ },
39
+ "devDependencies": {
40
+ "@types/lodash": "^4.17.5",
41
+ "@types/lodash-es": "^4.17.6",
42
+ "@typescript-eslint/eslint-plugin": "^7.12.0",
43
+ "@typescript-eslint/parser": "^7.12.0",
44
+ "@vitest/ui": "^3.0.9",
45
+ "eslint": "^9.4.0",
46
+ "eslint-config-prettier": "^9.1.0",
47
+ "fake-indexeddb": "^6.0.0",
48
+ "prettier": "^3.3.2",
49
+ "tshy": "^3.0.2",
50
+ "typescript": "^5.2.2",
51
+ "vitest": "^3.0.7",
52
+ "vitest-fetch-mock": "^0.4.5"
53
+ },
54
+ "exports": {
55
+ "./package.json": "./package.json",
56
+ ".": {
57
+ "import": {
58
+ "types": "./dist/esm/index.d.ts",
59
+ "default": "./dist/esm/index.js"
60
+ },
61
+ "require": {
62
+ "types": "./dist/commonjs/index.d.ts",
63
+ "default": "./dist/commonjs/index.js"
64
+ }
65
+ }
66
+ },
67
+ "tshy": {
68
+ "exclude": [
69
+ "**/*.spec.ts"
70
+ ],
71
+ "exports": {
72
+ "./package.json": "./package.json",
73
+ ".": "./src/index.ts"
74
+ }
75
+ }
76
+ }
package/readme.md ADDED
@@ -0,0 +1,42 @@
1
+ # objectloader2 for the KingSy viewer
2
+
3
+ This is an updated object loader for the KingSy viewer rewritten in Typescript.
4
+
5
+ The main aim for the objectloader is:
6
+
7
+ - download KingSy objects as JSON
8
+ - cache in IndexedDB so the same objects aren't downloaded twice
9
+ - give data to the viewer, as returned by the `getObjectIterator` generator, as soon as possible
10
+ - do the above as concurrently as a browser allows
11
+
12
+ ## Architecture
13
+
14
+ To achieve increased concurrency, the different phases of the objectloader are divided into pools of workers with queues to feed them.
15
+
16
+ ```mermaid
17
+ flowchart TD
18
+ start(Root Commit)
19
+ getIds(Parse Root to get all IDs)
20
+ cached{Cached?}
21
+ download(Download IDs)
22
+ save(Write to Cache)
23
+ load(Load from Cache)
24
+ generate(Generate to Viewer!)
25
+
26
+ start --> getIds
27
+ getIds --> cached
28
+ cached -->|Yes| load
29
+ cached -->|No| download
30
+ load --> generate
31
+ download --> generate
32
+ download --> save
33
+
34
+ ```
35
+
36
+ From the list of IDs, they are moved to a queue to be begin checking the cache from a pool of readers.
37
+
38
+ Results are then sent to the viewer, if found, else they're send to the download queue.
39
+
40
+ The download queue is a batching mechanism that gets what is available, up to a limit or a timeout. The results are parsed and given to the generator and written to another queue.
41
+
42
+ The write cache queue is processed with a single writer to the indexeddb.
@@ -0,0 +1,31 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`CachePump testing > write two items to queue use pumpItems that are NOT found 1`] = `[]`;
4
+
5
+ exports[`CachePump testing > write two items to queue use pumpItems that are NOT found 2`] = `
6
+ [
7
+ "id1",
8
+ "id2",
9
+ ]
10
+ `;
11
+
12
+ exports[`CachePump testing > write two items to queue use pumpItems that are found 1`] = `
13
+ [
14
+ {
15
+ "base": {
16
+ "id": "id",
17
+ "kingsy_type": "type",
18
+ },
19
+ "baseId": "id1",
20
+ },
21
+ {
22
+ "base": {
23
+ "id": "id",
24
+ "kingsy_type": "type",
25
+ },
26
+ "baseId": "id2",
27
+ },
28
+ ]
29
+ `;
30
+
31
+ exports[`CachePump testing > write two items to queue use pumpItems that are found 2`] = `[]`;
@@ -0,0 +1,8 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`CacheReader testing > deferred getObject 1`] = `
4
+ {
5
+ "id": "id",
6
+ "kingsy_type": "type",
7
+ }
8
+ `;
@@ -0,0 +1,8 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`deferments > defer one 1`] = `
4
+ {
5
+ "id": "id",
6
+ "kingsy_type": "type",
7
+ }
8
+ `;
@@ -0,0 +1,20 @@
1
+ import Queue from './queue.js'
2
+
3
+ export default class AggregateQueue<T> implements Queue<T> {
4
+ #queue1: Queue<T>
5
+ #queue2: Queue<T>
6
+
7
+ constructor(queue1: Queue<T>, queue2: Queue<T>) {
8
+ this.#queue1 = queue1
9
+ this.#queue2 = queue2
10
+ }
11
+
12
+ add(value: T): void {
13
+ this.#queue1.add(value)
14
+ this.#queue2.add(value)
15
+ }
16
+
17
+ values(): T[] {
18
+ throw new Error('Not implemented')
19
+ }
20
+ }
@@ -0,0 +1,35 @@
1
+ import Queue from './queue.js'
2
+
3
+ export default class AsyncGeneratorQueue<T> implements Queue<T> {
4
+ #buffer: T[] = []
5
+ #resolveQueue: ((value: T) => void)[] = []
6
+ #finished = false
7
+
8
+ add(value: T): void {
9
+ if (this.#resolveQueue.length > 0) {
10
+ // If there's a pending consumer, resolve immediately
11
+ const resolve = this.#resolveQueue.shift()!
12
+ resolve(value)
13
+ } else {
14
+ // Otherwise, add to the buffer
15
+ this.#buffer.push(value)
16
+ }
17
+ }
18
+
19
+ async *consume(): AsyncGenerator<T> {
20
+ while (
21
+ !this.#finished ||
22
+ this.#resolveQueue.length > 0 ||
23
+ this.#buffer.length > 0
24
+ ) {
25
+ if (this.#buffer.length > 0) {
26
+ yield this.#buffer.shift()! // Yield available values
27
+ } else {
28
+ yield await new Promise<T>((resolve) => this.#resolveQueue.push(resolve))
29
+ }
30
+ }
31
+ }
32
+ dispose(): void {
33
+ this.#finished = true
34
+ }
35
+ }
@@ -0,0 +1,56 @@
1
+ export default class BatchedPool<T> {
2
+ #queue: T[] = []
3
+ #concurrencyAndSizes: number[]
4
+ #processFunction: (batch: T[]) => Promise<void>
5
+
6
+ #baseInterval: number
7
+
8
+ #processingLoop: Promise<void>
9
+ #disposed = false
10
+
11
+ constructor(params: {
12
+ concurrencyAndSizes: number[]
13
+ maxWaitTime?: number
14
+ processFunction: (batch: T[]) => Promise<void>
15
+ }) {
16
+ this.#concurrencyAndSizes = params.concurrencyAndSizes
17
+ this.#baseInterval = Math.min(params.maxWaitTime ?? 200, 200) // Initial batch time (ms)
18
+ this.#processFunction = params.processFunction
19
+ this.#processingLoop = this.#loop()
20
+ }
21
+
22
+ add(item: T): void {
23
+ this.#queue.push(item)
24
+ }
25
+
26
+ getBatch(batchSize: number): T[] {
27
+ return this.#queue.splice(0, Math.min(batchSize, this.#queue.length))
28
+ }
29
+
30
+ async #runWorker(batchSize: number): Promise<void> {
31
+ while (!this.#disposed || this.#queue.length > 0) {
32
+ if (this.#queue.length > 0) {
33
+ const batch = this.getBatch(batchSize)
34
+ await this.#processFunction(batch)
35
+ }
36
+ await this.#delay(this.#baseInterval)
37
+ }
38
+ }
39
+
40
+ async disposeAsync(): Promise<void> {
41
+ this.#disposed = true
42
+ await this.#processingLoop
43
+ }
44
+
45
+ async #loop(): Promise<void> {
46
+ // Initialize workers
47
+ const workers = Array.from(this.#concurrencyAndSizes, (batchSize: number) =>
48
+ this.#runWorker(batchSize)
49
+ )
50
+ await Promise.all(workers)
51
+ }
52
+
53
+ #delay(ms: number): Promise<void> {
54
+ return new Promise((resolve) => setTimeout(resolve, ms))
55
+ }
56
+ }