@hkdigital/lib-sveltekit 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/README.md +127 -127
  2. package/dist/classes/data/IterableTree.js +243 -243
  3. package/dist/classes/data/Selector.js +190 -190
  4. package/dist/classes/data/index.js +2 -2
  5. package/dist/classes/index.js +3 -3
  6. package/dist/classes/promise/HkPromise.js +377 -377
  7. package/dist/classes/promise/index.js +1 -1
  8. package/dist/classes/stores/SubscribersCount.js +107 -107
  9. package/dist/classes/stores/index.js +1 -1
  10. package/dist/classes/streams/LogTransformStream.js +19 -19
  11. package/dist/classes/streams/ServerEventsStore.js +110 -110
  12. package/dist/classes/streams/TimeStampSource.js +26 -26
  13. package/dist/classes/streams/index.js +3 -3
  14. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  15. package/dist/classes/svelte/audio/AudioScene.svelte.js +282 -282
  16. package/dist/classes/svelte/audio/mocks.js +35 -35
  17. package/dist/classes/svelte/final-state-machine/FiniteStateMachine.svelte.js +133 -133
  18. package/dist/classes/svelte/final-state-machine/index.js +1 -1
  19. package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
  20. package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
  21. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  22. package/dist/classes/svelte/image/index.js +4 -4
  23. package/dist/classes/svelte/image/mocks.js +35 -35
  24. package/dist/classes/svelte/image/typedef.js +8 -8
  25. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  26. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  27. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  28. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
  29. package/dist/classes/svelte/network-loader/constants.js +3 -3
  30. package/dist/classes/svelte/network-loader/index.js +3 -3
  31. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  32. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  33. package/dist/components/area/HkArea.svelte +49 -49
  34. package/dist/components/area/HkArea.svelte.d.ts +14 -0
  35. package/dist/components/area/HkGridArea.svelte +77 -77
  36. package/dist/components/area/HkGridArea.svelte.d.ts +22 -0
  37. package/dist/components/area/index.js +2 -2
  38. package/dist/components/boxes/game-box/GameBox.svelte +112 -112
  39. package/dist/components/boxes/game-box/GameBox.svelte.d.ts +15 -0
  40. package/dist/components/boxes/game-box/gamebox.util.js +83 -83
  41. package/dist/components/boxes/index.js +2 -2
  42. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +196 -199
  43. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +24 -2
  44. package/dist/components/buttons/button/Button.svelte +76 -75
  45. package/dist/components/buttons/button/Button.svelte.d.ts +21 -0
  46. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -0
  47. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +16 -0
  48. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  49. package/dist/components/buttons/button-text/TextButton.svelte.d.ts +7 -0
  50. package/dist/components/buttons/index.d.ts +1 -0
  51. package/dist/components/buttons/index.js +3 -2
  52. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  53. package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +13 -0
  54. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  55. package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +18 -0
  56. package/dist/components/{icon → icons}/HkIcon.svelte +86 -86
  57. package/dist/components/icons/HkIcon.svelte.d.ts +22 -0
  58. package/dist/components/{icon → icons}/HkTabIcon.svelte +116 -116
  59. package/dist/components/icons/HkTabIcon.svelte.d.ts +40 -0
  60. package/dist/components/icons/SteezeIcon.svelte +96 -0
  61. package/dist/components/icons/SteezeIcon.svelte.d.ts +22 -0
  62. package/dist/components/{icon → icons}/index.d.ts +1 -0
  63. package/dist/components/{icon → icons}/index.js +6 -4
  64. package/dist/components/{icon → icons}/typedef.js +16 -16
  65. package/dist/components/image/ImageBox.svelte +208 -208
  66. package/dist/components/image/ImageBox.svelte.d.ts +19 -0
  67. package/dist/components/image/index.js +5 -5
  68. package/dist/components/image/typedef.js +32 -32
  69. package/dist/components/index.js +2 -2
  70. package/dist/components/inputs/index.js +1 -1
  71. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  72. package/dist/components/inputs/text-input/TextInput.svelte +226 -226
  73. package/dist/components/inputs/text-input/TextInput.svelte.d.ts +28 -0
  74. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  75. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  76. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  77. package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
  78. package/dist/components/layout/HkAppLayout.svelte +251 -251
  79. package/dist/components/layout/HkAppLayout.svelte.d.ts +11 -0
  80. package/dist/components/layout/HkGridLayers.svelte +82 -82
  81. package/dist/components/layout/HkGridLayers.svelte.d.ts +23 -0
  82. package/dist/components/layout/index.js +9 -9
  83. package/dist/components/panels/index.js +1 -1
  84. package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
  85. package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +12 -0
  86. package/dist/components/rows/index.js +3 -3
  87. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  88. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +14 -0
  89. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  90. package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +14 -0
  91. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  92. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  93. package/dist/components/tab-bar/HkTabBar.svelte.d.ts +18 -0
  94. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  95. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  96. package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +19 -0
  97. package/dist/components/tab-bar/index.js +17 -17
  98. package/dist/components/tab-bar/typedef.d.ts +1 -1
  99. package/dist/components/tab-bar/typedef.js +8 -8
  100. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
  101. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +10 -0
  102. package/dist/components/widgets/compare-left-right/index.js +1 -1
  103. package/dist/components/widgets/scale-control/index.js +1 -1
  104. package/dist/config/imagetools-config.js +189 -189
  105. package/dist/config/imagetools.d.ts +71 -71
  106. package/dist/config/typedef.js +8 -8
  107. package/dist/constants/errors/api.js +9 -9
  108. package/dist/constants/errors/generic.js +5 -5
  109. package/dist/constants/errors/index.js +3 -3
  110. package/dist/constants/errors/jwt.js +5 -5
  111. package/dist/constants/http/headers.js +6 -6
  112. package/dist/constants/http/index.js +2 -2
  113. package/dist/constants/http/methods.js +2 -2
  114. package/dist/constants/index.js +3 -3
  115. package/dist/constants/mime/application.js +5 -5
  116. package/dist/constants/mime/audio.js +13 -13
  117. package/dist/constants/mime/image.js +3 -3
  118. package/dist/constants/mime/index.js +4 -4
  119. package/dist/constants/mime/text.js +2 -2
  120. package/dist/constants/regexp/index.js +31 -31
  121. package/dist/constants/regexp/inspiratie.js__ +95 -95
  122. package/dist/constants/regexp/text.js +49 -49
  123. package/dist/constants/regexp/user.js +32 -32
  124. package/dist/constants/regexp/web.js +3 -3
  125. package/dist/constants/state-labels/input-states.js +11 -11
  126. package/dist/constants/state-labels/submit-states.js +4 -4
  127. package/dist/constants/time.js +28 -28
  128. package/dist/css/tw-prose.postcss__ +259 -259
  129. package/dist/css/utilities.postcss +43 -43
  130. package/dist/design/design-config.d.ts +7 -6
  131. package/dist/design/design-config.js +73 -73
  132. package/dist/design/tailwind-theme-extend.d.ts +4 -4
  133. package/dist/design/tailwind-theme-extend.js +158 -151
  134. package/dist/schemas/index.js +1 -1
  135. package/dist/schemas/validate-url.js +180 -180
  136. package/dist/server/index.js +1 -1
  137. package/dist/server/logger.js +94 -94
  138. package/dist/states/index.js +1 -1
  139. package/dist/states/navigation.svelte.js +55 -55
  140. package/dist/stores/index.js +1 -1
  141. package/dist/stores/theme.js +80 -80
  142. package/dist/themes/hkdev/components/blocks/text-block.postcss +41 -41
  143. package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
  144. package/dist/themes/hkdev/components/buttons/button-icon-steeze.postcss +22 -0
  145. package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
  146. package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
  147. package/dist/themes/hkdev/components/buttons/button.postcss__ +40 -0
  148. package/dist/themes/hkdev/components/buttons/button.postcss___ +91 -0
  149. package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
  150. package/dist/themes/hkdev/components/icons/icon-steeze.postcss +22 -0
  151. package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
  152. package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
  153. package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
  154. package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
  155. package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
  156. package/dist/themes/hkdev/components.postcss +61 -55
  157. package/dist/themes/hkdev/debug.postcss +1 -1
  158. package/dist/themes/hkdev/global/layout.postcss +39 -39
  159. package/dist/themes/hkdev/global/on-colors.postcss +53 -53
  160. package/dist/themes/hkdev/global/text.postcss__ +34 -34
  161. package/dist/themes/hkdev/global/vars.postcss__ +7 -7
  162. package/dist/themes/hkdev/globals.postcss +11 -11
  163. package/dist/themes/hkdev/responsive.postcss +12 -12
  164. package/dist/themes/hkdev/theme-ext.js +15 -15
  165. package/dist/themes/hkdev/theme.js +227 -227
  166. package/dist/themes/index.js +1 -1
  167. package/dist/util/array/index.js +455 -455
  168. package/dist/util/compare/index.js +247 -247
  169. package/dist/util/css/css-vars.js +83 -83
  170. package/dist/util/css/index.js +1 -1
  171. package/dist/util/design-system/components/states.js +22 -22
  172. package/dist/util/design-system/css/clamp.d.ts +2 -2
  173. package/dist/util/design-system/css/clamp.js +66 -66
  174. package/dist/util/design-system/css/root-design-vars.d.ts +4 -4
  175. package/dist/util/design-system/css/root-design-vars.js +100 -100
  176. package/dist/util/design-system/index.js +5 -5
  177. package/dist/util/design-system/layout/scaling.d.ts +4 -4
  178. package/dist/util/design-system/layout/scaling.js +97 -97
  179. package/dist/util/design-system/tailwind.d.ts +20 -20
  180. package/dist/util/design-system/tailwind.js +289 -289
  181. package/dist/util/expect/arrays.js +47 -47
  182. package/dist/util/expect/index.js +259 -259
  183. package/dist/util/expect/primitives.js +55 -55
  184. package/dist/util/expect/url.js +60 -60
  185. package/dist/util/function/index.js +218 -218
  186. package/dist/util/http/errors.js +97 -97
  187. package/dist/util/http/headers.js +45 -45
  188. package/dist/util/http/http-request.js +273 -273
  189. package/dist/util/http/index.js +22 -22
  190. package/dist/util/http/json-request.js +143 -143
  191. package/dist/util/http/mocks.js +65 -65
  192. package/dist/util/http/response.js +228 -228
  193. package/dist/util/http/url.js +52 -52
  194. package/dist/util/image/index.js +86 -86
  195. package/dist/util/index.js +2 -2
  196. package/dist/util/is/index.js +140 -140
  197. package/dist/util/iterate/index.js +234 -234
  198. package/dist/util/object/index.js +1361 -1361
  199. package/dist/util/singleton/index.js +97 -97
  200. package/dist/util/string/index.js +184 -184
  201. package/dist/util/svelte/index.js +2 -2
  202. package/dist/util/svelte/observe/index.js +49 -49
  203. package/dist/util/svelte/state-context/index.js +83 -83
  204. package/dist/util/svelte/wait/index.js +38 -38
  205. package/dist/util/sveltekit/index.js +1 -1
  206. package/dist/util/sveltekit/route-folders/index.js +82 -82
  207. package/dist/util/time/index.js +339 -339
  208. package/dist/valibot/date.js__ +10 -10
  209. package/dist/valibot/index.js +9 -9
  210. package/dist/valibot/url.js +95 -95
  211. package/dist/valibot/user.js +23 -23
  212. package/dist/zod/all.js +33 -33
  213. package/dist/zod/generic.js +11 -11
  214. package/dist/zod/javascript.js +32 -32
  215. package/dist/zod/user.js +16 -16
  216. package/dist/zod/web.js +52 -52
  217. package/package.json +99 -99
  218. package/dist/components/icon/HkIcon.svelte.d.ts +0 -10
  219. package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -19
  220. /package/dist/components/{icon → icons}/typedef.d.ts +0 -0
@@ -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';
2
-
3
- export * from './constants.js';
1
+ export { default as NetworkLoader } from './NetworkLoader.svelte';
2
+
3
+ export * from './constants.js';