@hkdigital/lib-sveltekit 0.1.62 → 0.1.65

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 (209) hide show
  1. package/README.md +135 -135
  2. package/dist/assets/autospuiten/car-paint-picker.js +41 -41
  3. package/dist/assets/autospuiten/labels.js +7 -7
  4. package/dist/classes/data/IterableTree.js +243 -243
  5. package/dist/classes/data/Selector.js +190 -190
  6. package/dist/classes/data/index.js +2 -2
  7. package/dist/classes/index.js +4 -4
  8. package/dist/classes/promise/HkPromise.js +377 -377
  9. package/dist/classes/promise/index.js +1 -1
  10. package/dist/classes/stores/SubscribersCount.js +107 -107
  11. package/dist/classes/stores/index.js +1 -1
  12. package/dist/classes/streams/LogTransformStream.js +19 -19
  13. package/dist/classes/streams/ServerEventsStore.js +110 -110
  14. package/dist/classes/streams/TimeStampSource.js +26 -26
  15. package/dist/classes/streams/index.js +3 -3
  16. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  17. package/dist/classes/svelte/audio/AudioScene.svelte.js +295 -295
  18. package/dist/classes/svelte/audio/mocks.js +35 -35
  19. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  20. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  21. package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
  22. package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
  23. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  24. package/dist/classes/svelte/image/index.js +4 -4
  25. package/dist/classes/svelte/image/mocks.js +35 -35
  26. package/dist/classes/svelte/image/typedef.js +8 -8
  27. package/dist/classes/svelte/index.js +14 -14
  28. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  29. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  30. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  31. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
  32. package/dist/classes/svelte/network-loader/constants.js +3 -3
  33. package/dist/classes/svelte/network-loader/index.js +3 -3
  34. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  35. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  36. package/dist/components/area/HkArea.svelte +49 -49
  37. package/dist/components/area/HkGridArea.svelte +77 -77
  38. package/dist/components/area/index.js +2 -2
  39. package/dist/components/buttons/button/Button.svelte +82 -82
  40. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  41. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  42. package/dist/components/buttons/index.js +3 -3
  43. package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  44. package/dist/components/debug/index.js +1 -1
  45. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  46. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  47. package/dist/components/icons/HkIcon.svelte +86 -86
  48. package/dist/components/icons/HkTabIcon.svelte +116 -116
  49. package/dist/components/icons/SteezeIcon.svelte +97 -97
  50. package/dist/components/icons/index.js +6 -6
  51. package/dist/components/icons/typedef.js +16 -16
  52. package/dist/components/index.js +2 -2
  53. package/dist/components/inputs/index.js +1 -1
  54. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  55. package/dist/components/inputs/text-input/TextInput.svelte +223 -223
  56. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  57. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  58. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  59. package/dist/components/layout/grid-layers/GridLayers.svelte +167 -167
  60. package/dist/components/layout/index.js +1 -1
  61. package/dist/components/panels/index.js +1 -1
  62. package/dist/components/panels/panel/Panel.svelte +43 -43
  63. package/dist/components/rows/index.js +3 -3
  64. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  65. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  66. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  67. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  68. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  69. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  70. package/dist/components/tab-bar/index.js +17 -17
  71. package/dist/components/tab-bar/typedef.js +8 -8
  72. package/dist/config/imagetools-config.js +189 -189
  73. package/dist/config/imagetools.d.ts +71 -71
  74. package/dist/config/typedef.js +8 -8
  75. package/dist/constants/bases.js +13 -13
  76. package/dist/constants/errors/api.js +9 -9
  77. package/dist/constants/errors/generic.js +5 -5
  78. package/dist/constants/errors/index.js +3 -3
  79. package/dist/constants/errors/jwt.js +5 -5
  80. package/dist/constants/http/headers.js +6 -6
  81. package/dist/constants/http/index.js +2 -2
  82. package/dist/constants/http/methods.js +2 -2
  83. package/dist/constants/index.js +3 -3
  84. package/dist/constants/mime/application.js +5 -5
  85. package/dist/constants/mime/audio.js +13 -13
  86. package/dist/constants/mime/image.js +3 -3
  87. package/dist/constants/mime/index.js +4 -4
  88. package/dist/constants/mime/text.js +2 -2
  89. package/dist/constants/regexp/index.js +31 -31
  90. package/dist/constants/regexp/inspiratie.js__ +95 -95
  91. package/dist/constants/regexp/text.js +49 -49
  92. package/dist/constants/regexp/user.js +32 -32
  93. package/dist/constants/regexp/web.js +3 -3
  94. package/dist/constants/state-labels/input-states.js +11 -11
  95. package/dist/constants/state-labels/submit-states.js +4 -4
  96. package/dist/constants/time.js +28 -28
  97. package/dist/css/utilities.css +43 -43
  98. package/dist/design/design-config.js +73 -73
  99. package/dist/design/tailwind-theme-extend.js +158 -158
  100. package/dist/schemas/index.js +1 -1
  101. package/dist/schemas/validate-url.js +180 -180
  102. package/dist/server/index.js +1 -1
  103. package/dist/server/logger.js +94 -94
  104. package/dist/states/index.js +1 -1
  105. package/dist/states/navigation.svelte.js +55 -55
  106. package/dist/stores/index.js +1 -1
  107. package/dist/stores/theme.js +80 -80
  108. package/dist/themes/hkdev/components/blocks/text-block.css +41 -41
  109. package/dist/themes/hkdev/components/boxes/game-box.css +12 -12
  110. package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  111. package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
  112. package/dist/themes/hkdev/components/buttons/button.css +142 -142
  113. package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
  114. package/dist/themes/hkdev/components/icons/icon-steeze.css +22 -22
  115. package/dist/themes/hkdev/components/inputs/text-input.css +104 -104
  116. package/dist/themes/hkdev/components/panels/panel.css +27 -27
  117. package/dist/themes/hkdev/components/rows/panel-grid-row.css +6 -6
  118. package/dist/themes/hkdev/components/rows/panel-row-2.css +7 -7
  119. package/dist/themes/hkdev/components.css +47 -47
  120. package/dist/themes/hkdev/debug.css +1 -1
  121. package/dist/themes/hkdev/global/layout.css +39 -39
  122. package/dist/themes/hkdev/global/on-colors.css +53 -53
  123. package/dist/themes/hkdev/globals.css +11 -11
  124. package/dist/themes/hkdev/responsive.css +12 -12
  125. package/dist/themes/hkdev/theme-ext.js +15 -15
  126. package/dist/themes/hkdev/theme.js +235 -235
  127. package/dist/themes/index.js +1 -1
  128. package/dist/util/array/index.js +455 -455
  129. package/dist/util/bases/base58.js +262 -262
  130. package/dist/util/bases/index.js +1 -1
  131. package/dist/util/compare/index.js +247 -247
  132. package/dist/util/css/css-vars.js +83 -83
  133. package/dist/util/css/index.js +1 -1
  134. package/dist/util/design-system/components/states.js +22 -22
  135. package/dist/util/design-system/css/clamp.js +66 -66
  136. package/dist/util/design-system/css/root-design-vars.js +100 -100
  137. package/dist/util/design-system/index.js +5 -5
  138. package/dist/util/design-system/layout/scaling.js +228 -228
  139. package/dist/util/design-system/skeleton.js +208 -208
  140. package/dist/util/design-system/tailwind.js +288 -288
  141. package/dist/util/expect/arrays.js +47 -47
  142. package/dist/util/expect/index.js +259 -259
  143. package/dist/util/expect/primitives.js +55 -55
  144. package/dist/util/expect/url.js +60 -60
  145. package/dist/util/function/index.js +218 -218
  146. package/dist/util/http/errors.js +97 -97
  147. package/dist/util/http/headers.js +45 -45
  148. package/dist/util/http/http-request.js +294 -294
  149. package/dist/util/http/index.js +22 -22
  150. package/dist/util/http/json-request.js +143 -143
  151. package/dist/util/http/mocks.js +65 -65
  152. package/dist/util/http/response.js +241 -241
  153. package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  154. package/dist/util/http/url.js +52 -52
  155. package/dist/util/image/index.js +86 -86
  156. package/dist/util/index.js +2 -2
  157. package/dist/util/is/index.js +140 -140
  158. package/dist/util/iterate/index.js +234 -234
  159. package/dist/util/object/index.js +1361 -1361
  160. package/dist/util/singleton/index.js +97 -97
  161. package/dist/util/string/array-path.js +75 -75
  162. package/dist/util/string/convert.js +54 -54
  163. package/dist/util/string/fs.js +226 -226
  164. package/dist/util/string/index.js +5 -5
  165. package/dist/util/string/interpolate.js +61 -61
  166. package/dist/util/string/pad.js +10 -10
  167. package/dist/util/svelte/index.js +4 -4
  168. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  169. package/dist/util/svelte/observe/index.js +49 -49
  170. package/dist/util/svelte/state-context/index.js +83 -83
  171. package/dist/util/svelte/wait/index.js +38 -38
  172. package/dist/util/sveltekit/index.js +1 -1
  173. package/dist/util/sveltekit/route-folders/index.js +101 -101
  174. package/dist/util/time/index.js +323 -323
  175. package/dist/util/unique/index.js +249 -249
  176. package/dist/valibot/date.js__ +10 -10
  177. package/dist/valibot/index.js +9 -9
  178. package/dist/valibot/url.js +95 -95
  179. package/dist/valibot/user.js +23 -23
  180. package/dist/widgets/button-group/ButtonGroup.svelte +82 -94
  181. package/dist/widgets/button-group/ButtonGroup.svelte.d.ts +0 -2
  182. package/dist/widgets/button-group/typedef.js +10 -10
  183. package/dist/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
  184. package/dist/widgets/compare-left-right/index.js +1 -1
  185. package/dist/widgets/game-box/GameBox.svelte +579 -186
  186. package/dist/widgets/game-box/GameBox.svelte.d.ts +64 -4
  187. package/dist/widgets/game-box/gamebox.util.js +83 -83
  188. package/dist/widgets/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  189. package/dist/widgets/hk-app-layout/HkAppLayout.svelte +251 -251
  190. package/dist/widgets/image-box/ImageBox.svelte +212 -212
  191. package/dist/widgets/image-box/index.js +5 -5
  192. package/dist/widgets/image-box/typedef.js +32 -32
  193. package/dist/widgets/index.js +23 -23
  194. package/dist/widgets/presenter/(broken) Presenter.state.svelte.js__ +613 -0
  195. package/dist/widgets/presenter/ImageSlide.svelte +64 -64
  196. package/dist/widgets/presenter/Presenter.state.svelte.js +636 -636
  197. package/dist/widgets/presenter/Presenter.svelte +140 -140
  198. package/dist/widgets/presenter/Presenter.svelte__ +125 -0
  199. package/dist/widgets/presenter/constants.js +7 -7
  200. package/dist/widgets/presenter/index.js +10 -10
  201. package/dist/widgets/presenter/typedef.js +106 -106
  202. package/dist/widgets/presenter/util.js +210 -210
  203. package/dist/widgets/virtual-viewport/VirtualViewport.svelte +196 -196
  204. package/dist/zod/all.js +33 -33
  205. package/dist/zod/generic.js +11 -11
  206. package/dist/zod/javascript.js +32 -32
  207. package/dist/zod/user.js +16 -16
  208. package/dist/zod/web.js +52 -52
  209. package/package.json +102 -102
@@ -1,331 +1,331 @@
1
- import { CONTENT_TYPE } from '../../../constants/http/index.js';
2
-
3
- import {
4
- LoadingStateMachine,
5
- STATE_INITIAL,
6
- STATE_LOADING,
7
- STATE_UNLOADING,
8
- STATE_LOADED,
9
- STATE_CANCELLED,
10
- STATE_ERROR,
11
- LOAD,
12
- // CANCEL,
13
- ERROR,
14
- LOADED,
15
- UNLOAD,
16
- INITIAL
17
- } from '../loading-state-machine/index.js';
18
-
19
- import * as expect from '../../../util/expect/index.js';
20
-
21
- import { httpGet, loadResponseBuffer } from '../../../util/http/index.js';
22
-
23
- import { ERROR_NOT_LOADED, ERROR_TRANSFERRED } from './constants.js';
24
-
25
- /**
26
- * NetworkLoader instance
27
- * - Loads network data from network into an ArrayBuffer
28
- * - Loaded data can be transferred to an AudioBufferSourceNode
29
- */
30
- export default class NetworkLoader {
31
- // _state = $state(new LoadingStateMachine());
32
- _state = new LoadingStateMachine();
33
-
34
- state = $derived.by(() => {
35
- return this._state.current;
36
- });
37
-
38
- initial = $derived.by(() => {
39
- return this._state.current === STATE_INITIAL;
40
- });
41
-
42
- loaded = $derived.by(() => {
43
- return this._state.current === STATE_LOADED;
44
- });
45
-
46
- /** @type {string|null} */
47
- _url = null;
48
-
49
- /** @type {number} */
50
- _bytesLoaded = $state(0);
51
-
52
- /** @type {number} */
53
- _size = $state(0);
54
-
55
- /**
56
- * Response headers
57
- * @type {Headers|null}
58
- */
59
- _headers = $state(null);
60
-
61
- /** @type {ArrayBuffer|null} */
62
- _buffer = null;
63
-
64
- // Export state property as readonly
65
-
66
- /** @type {import('./typedef.js').LoadingProgress} */
67
- progress = $derived.by(() => {
68
- return {
69
- bytesLoaded: this._bytesLoaded,
70
- size: this._size,
71
- loaded: this.loaded
72
- };
73
- });
74
-
75
- /** @type {null|(()=>void)} */
76
- _abortLoading = null;
77
-
78
- /**
79
- * Construct NetworkLoader
80
- *
81
- * @param {object} _
82
- * @param {string} _.url
83
- */
84
- constructor({ url }) {
85
- expect.absOrRelUrl(url);
86
-
87
- this._url = url;
88
-
89
- const state = this._state;
90
-
91
- //
92
- // ISSUE: $effect is not triggered by this._state changes,
93
- // using onenter instead
94
- //
95
- this._state.onenter = () => {
96
- switch (state.current) {
97
- case STATE_LOADING:
98
- {
99
- // console.log('**** NetworkLoader:loading');
100
- this.#load();
101
- }
102
- break;
103
-
104
- case STATE_UNLOADING:
105
- {
106
- // console.log('NetworkLoader:unloading');
107
- this.#unload();
108
- }
109
- break;
110
-
111
- case STATE_LOADED:
112
- {
113
- // console.error(
114
- // 'NetworkLoader:loaded',
115
- // $state.snapshot({ bytes: this.size })
116
- // );
117
-
118
- // Abort function is no longer needed
119
- this._abortLoading = null;
120
- }
121
- break;
122
-
123
- case STATE_CANCELLED:
124
- {
125
- // console.log('NetworkLoader:cancelled');
126
- // TODO
127
- }
128
- break;
129
-
130
- case STATE_ERROR:
131
- {
132
- console.log('NetworkLoader:error', state.error);
133
- }
134
- break;
135
- } // end switch
136
- };
137
- }
138
-
139
- /**
140
- * Start loading all network data
141
- */
142
- load() {
143
- // console.log('NetworkLoader: load() called');
144
- this._state.send(LOAD);
145
- }
146
-
147
- /**
148
- * Unoad all network data
149
- */
150
- unload() {
151
- this._state.send(UNLOAD);
152
- }
153
-
154
- /**
155
- * Get network data size in bytes
156
- * - Info comes from the content length response header
157
- *
158
- * @returns {number}
159
- */
160
- get size() {
161
- return this._size;
162
- }
163
-
164
- /**
165
- * Get content type from response header
166
- *
167
- * @returns {string|null}
168
- */
169
- getContentType() {
170
- if (!this._headers) {
171
- throw new Error(ERROR_NOT_LOADED);
172
- }
173
-
174
- return this._headers.get(CONTENT_TYPE);
175
- }
176
-
177
- /**
178
- * Get data as array buffer
179
- *
180
- * @note If the data has been transferred, the data is
181
- * no longer available as ArrayBuffer
182
- *
183
- * @returns {ArrayBuffer}
184
- */
185
- getArrayBuffer() {
186
- if (!this._buffer) {
187
- throw new Error(ERROR_NOT_LOADED);
188
- }
189
-
190
- if (this._buffer.detached) {
191
- throw new Error(ERROR_TRANSFERRED);
192
- }
193
-
194
- return this._buffer;
195
- }
196
-
197
- /**
198
- * Get data as Uint8Array
199
- *
200
- * @returns {Uint8Array}
201
- */
202
- getUint8Array() {
203
- return new Uint8Array(this.getArrayBuffer());
204
- }
205
-
206
- /**
207
- * Get data as Blob
208
- * - The Blob type is set using the response header
209
- * content type
210
- *
211
- * @returns {Blob}
212
- */
213
- getBlob() {
214
- const type = this.getContentType();
215
-
216
- const options = {};
217
-
218
- if (type) {
219
- options.type = type;
220
- }
221
-
222
- return new Blob([this.getArrayBuffer()], options);
223
- }
224
-
225
- /**
226
- * Get object URL
227
- *
228
- * @note the objectURL should be revoked when no longer used
229
- *
230
- * @returns {string}
231
- */
232
- getObjectURL() {
233
- //
234
- // Example usage:
235
- //
236
- // $effect(() => {
237
- // if (loader.loaded) {
238
- // // @ts-ignore
239
- // objectUrl = loader.getObjectURL();
240
- // }
241
- //
242
- // return () => {
243
- // if (objectUrl) {
244
- // URL.revokeObjectURL(objectUrl);
245
- // objectUrl = null;
246
- // }
247
- // };
248
- // });
249
-
250
- return URL.createObjectURL(this.getBlob());
251
- }
252
-
253
- /**
254
- * Internal method that initializes the loading process
255
- * and transitions to state LOADED when done
256
- */
257
- async #load() {
258
- try {
259
- // console.log('>>>> NetworkLoader:#load', this._url);
260
-
261
- if (this._abortLoading) {
262
- // console.log('Abort loading');
263
- this._abortLoading();
264
- this._abortLoading = null;
265
- }
266
-
267
- /** @type {()=>void} */
268
- let abortRequest;
269
-
270
- /**
271
- * @param {object} _
272
- * @param {()=>void} _.abort
273
- */
274
- const requestHandler = ({ abort }) => {
275
- abortRequest = abort;
276
- };
277
-
278
- this._bytesLoaded = 0;
279
- this._size = 0;
280
-
281
- // @ts-ignore
282
- const response = await httpGet({ url: this._url, requestHandler });
283
-
284
- this._headers = response.headers;
285
-
286
- // console.log('headers', this._headers);
287
- // console.log('response', response);
288
-
289
- const { bufferPromise, abort: abortLoadBody } = loadResponseBuffer(
290
- response,
291
- ({ bytesLoaded, size }) => {
292
- this._bytesLoaded = bytesLoaded;
293
- this._size = size;
294
- }
295
- );
296
-
297
- this._abortLoading = () => {
298
- abortRequest();
299
- abortLoadBody();
300
- };
301
-
302
- this._buffer = await bufferPromise;
303
-
304
- this._state.send(LOADED);
305
- } catch (e) {
306
- this._state.send(ERROR, e);
307
- }
308
- }
309
-
310
- /**
311
- * Internal method that initializes the unloading process
312
- * and transitions to state INITIAL when done
313
- */
314
- async #unload() {
315
- try {
316
- if (this._abortLoading) {
317
- this._abortLoading();
318
- this._abortLoading = null;
319
- }
320
-
321
- this._bytesLoaded = 0;
322
- this._size = 0;
323
- this._headers = null;
324
- this._buffer = null;
325
-
326
- this._state.send(INITIAL);
327
- } catch (e) {
328
- this._state.send(ERROR, e);
329
- }
330
- }
331
- } // end class
1
+ import { CONTENT_TYPE } from '../../../constants/http/index.js';
2
+
3
+ import {
4
+ LoadingStateMachine,
5
+ STATE_INITIAL,
6
+ STATE_LOADING,
7
+ STATE_UNLOADING,
8
+ STATE_LOADED,
9
+ STATE_CANCELLED,
10
+ STATE_ERROR,
11
+ LOAD,
12
+ // CANCEL,
13
+ ERROR,
14
+ LOADED,
15
+ UNLOAD,
16
+ INITIAL
17
+ } from '../loading-state-machine/index.js';
18
+
19
+ import * as expect from '../../../util/expect/index.js';
20
+
21
+ import { httpGet, loadResponseBuffer } from '../../../util/http/index.js';
22
+
23
+ import { ERROR_NOT_LOADED, ERROR_TRANSFERRED } from './constants.js';
24
+
25
+ /**
26
+ * NetworkLoader instance
27
+ * - Loads network data from network into an ArrayBuffer
28
+ * - Loaded data can be transferred to an AudioBufferSourceNode
29
+ */
30
+ export default class NetworkLoader {
31
+ // _state = $state(new LoadingStateMachine());
32
+ _state = new LoadingStateMachine();
33
+
34
+ state = $derived.by(() => {
35
+ return this._state.current;
36
+ });
37
+
38
+ initial = $derived.by(() => {
39
+ return this._state.current === STATE_INITIAL;
40
+ });
41
+
42
+ loaded = $derived.by(() => {
43
+ return this._state.current === STATE_LOADED;
44
+ });
45
+
46
+ /** @type {string|null} */
47
+ _url = null;
48
+
49
+ /** @type {number} */
50
+ _bytesLoaded = $state(0);
51
+
52
+ /** @type {number} */
53
+ _size = $state(0);
54
+
55
+ /**
56
+ * Response headers
57
+ * @type {Headers|null}
58
+ */
59
+ _headers = $state(null);
60
+
61
+ /** @type {ArrayBuffer|null} */
62
+ _buffer = null;
63
+
64
+ // Export state property as readonly
65
+
66
+ /** @type {import('./typedef.js').LoadingProgress} */
67
+ progress = $derived.by(() => {
68
+ return {
69
+ bytesLoaded: this._bytesLoaded,
70
+ size: this._size,
71
+ loaded: this.loaded
72
+ };
73
+ });
74
+
75
+ /** @type {null|(()=>void)} */
76
+ _abortLoading = null;
77
+
78
+ /**
79
+ * Construct NetworkLoader
80
+ *
81
+ * @param {object} _
82
+ * @param {string} _.url
83
+ */
84
+ constructor({ url }) {
85
+ expect.absOrRelUrl(url);
86
+
87
+ this._url = url;
88
+
89
+ const state = this._state;
90
+
91
+ //
92
+ // ISSUE: $effect is not triggered by this._state changes,
93
+ // using onenter instead
94
+ //
95
+ this._state.onenter = () => {
96
+ switch (state.current) {
97
+ case STATE_LOADING:
98
+ {
99
+ // console.log('**** NetworkLoader:loading');
100
+ this.#load();
101
+ }
102
+ break;
103
+
104
+ case STATE_UNLOADING:
105
+ {
106
+ // console.log('NetworkLoader:unloading');
107
+ this.#unload();
108
+ }
109
+ break;
110
+
111
+ case STATE_LOADED:
112
+ {
113
+ // console.error(
114
+ // 'NetworkLoader:loaded',
115
+ // $state.snapshot({ bytes: this.size })
116
+ // );
117
+
118
+ // Abort function is no longer needed
119
+ this._abortLoading = null;
120
+ }
121
+ break;
122
+
123
+ case STATE_CANCELLED:
124
+ {
125
+ // console.log('NetworkLoader:cancelled');
126
+ // TODO
127
+ }
128
+ break;
129
+
130
+ case STATE_ERROR:
131
+ {
132
+ console.log('NetworkLoader:error', state.error);
133
+ }
134
+ break;
135
+ } // end switch
136
+ };
137
+ }
138
+
139
+ /**
140
+ * Start loading all network data
141
+ */
142
+ load() {
143
+ // console.log('NetworkLoader: load() called');
144
+ this._state.send(LOAD);
145
+ }
146
+
147
+ /**
148
+ * Unoad all network data
149
+ */
150
+ unload() {
151
+ this._state.send(UNLOAD);
152
+ }
153
+
154
+ /**
155
+ * Get network data size in bytes
156
+ * - Info comes from the content length response header
157
+ *
158
+ * @returns {number}
159
+ */
160
+ get size() {
161
+ return this._size;
162
+ }
163
+
164
+ /**
165
+ * Get content type from response header
166
+ *
167
+ * @returns {string|null}
168
+ */
169
+ getContentType() {
170
+ if (!this._headers) {
171
+ throw new Error(ERROR_NOT_LOADED);
172
+ }
173
+
174
+ return this._headers.get(CONTENT_TYPE);
175
+ }
176
+
177
+ /**
178
+ * Get data as array buffer
179
+ *
180
+ * @note If the data has been transferred, the data is
181
+ * no longer available as ArrayBuffer
182
+ *
183
+ * @returns {ArrayBuffer}
184
+ */
185
+ getArrayBuffer() {
186
+ if (!this._buffer) {
187
+ throw new Error(ERROR_NOT_LOADED);
188
+ }
189
+
190
+ if (this._buffer.detached) {
191
+ throw new Error(ERROR_TRANSFERRED);
192
+ }
193
+
194
+ return this._buffer;
195
+ }
196
+
197
+ /**
198
+ * Get data as Uint8Array
199
+ *
200
+ * @returns {Uint8Array}
201
+ */
202
+ getUint8Array() {
203
+ return new Uint8Array(this.getArrayBuffer());
204
+ }
205
+
206
+ /**
207
+ * Get data as Blob
208
+ * - The Blob type is set using the response header
209
+ * content type
210
+ *
211
+ * @returns {Blob}
212
+ */
213
+ getBlob() {
214
+ const type = this.getContentType();
215
+
216
+ const options = {};
217
+
218
+ if (type) {
219
+ options.type = type;
220
+ }
221
+
222
+ return new Blob([this.getArrayBuffer()], options);
223
+ }
224
+
225
+ /**
226
+ * Get object URL
227
+ *
228
+ * @note the objectURL should be revoked when no longer used
229
+ *
230
+ * @returns {string}
231
+ */
232
+ getObjectURL() {
233
+ //
234
+ // Example usage:
235
+ //
236
+ // $effect(() => {
237
+ // if (loader.loaded) {
238
+ // // @ts-ignore
239
+ // objectUrl = loader.getObjectURL();
240
+ // }
241
+ //
242
+ // return () => {
243
+ // if (objectUrl) {
244
+ // URL.revokeObjectURL(objectUrl);
245
+ // objectUrl = null;
246
+ // }
247
+ // };
248
+ // });
249
+
250
+ return URL.createObjectURL(this.getBlob());
251
+ }
252
+
253
+ /**
254
+ * Internal method that initializes the loading process
255
+ * and transitions to state LOADED when done
256
+ */
257
+ async #load() {
258
+ try {
259
+ // console.log('>>>> NetworkLoader:#load', this._url);
260
+
261
+ if (this._abortLoading) {
262
+ // console.log('Abort loading');
263
+ this._abortLoading();
264
+ this._abortLoading = null;
265
+ }
266
+
267
+ /** @type {()=>void} */
268
+ let abortRequest;
269
+
270
+ /**
271
+ * @param {object} _
272
+ * @param {()=>void} _.abort
273
+ */
274
+ const requestHandler = ({ abort }) => {
275
+ abortRequest = abort;
276
+ };
277
+
278
+ this._bytesLoaded = 0;
279
+ this._size = 0;
280
+
281
+ // @ts-ignore
282
+ const response = await httpGet({ url: this._url, requestHandler });
283
+
284
+ this._headers = response.headers;
285
+
286
+ // console.log('headers', this._headers);
287
+ // console.log('response', response);
288
+
289
+ const { bufferPromise, abort: abortLoadBody } = loadResponseBuffer(
290
+ response,
291
+ ({ bytesLoaded, size }) => {
292
+ this._bytesLoaded = bytesLoaded;
293
+ this._size = size;
294
+ }
295
+ );
296
+
297
+ this._abortLoading = () => {
298
+ abortRequest();
299
+ abortLoadBody();
300
+ };
301
+
302
+ this._buffer = await bufferPromise;
303
+
304
+ this._state.send(LOADED);
305
+ } catch (e) {
306
+ this._state.send(ERROR, e);
307
+ }
308
+ }
309
+
310
+ /**
311
+ * Internal method that initializes the unloading process
312
+ * and transitions to state INITIAL when done
313
+ */
314
+ async #unload() {
315
+ try {
316
+ if (this._abortLoading) {
317
+ this._abortLoading();
318
+ this._abortLoading = null;
319
+ }
320
+
321
+ this._bytesLoaded = 0;
322
+ this._size = 0;
323
+ this._headers = null;
324
+ this._buffer = null;
325
+
326
+ this._state.send(INITIAL);
327
+ } catch (e) {
328
+ this._state.send(ERROR, e);
329
+ }
330
+ }
331
+ } // end class
@@ -1,3 +1,3 @@
1
- export const ERROR_NOT_LOADED = 'No data loaded yet';
2
- export const ERROR_TRANSFERRED =
3
- 'Buffer data has been transferred and is no longer available';
1
+ export const ERROR_NOT_LOADED = 'No data loaded yet';
2
+ export const ERROR_TRANSFERRED =
3
+ 'Buffer data has been transferred and is no longer available';
@@ -1,3 +1,3 @@
1
- export { default as NetworkLoader } from './NetworkLoader.svelte.js';
2
-
3
- export * from './constants.js';
1
+ export { default as NetworkLoader } from './NetworkLoader.svelte.js';
2
+
3
+ export * from './constants.js';