@hkdigital/lib-sveltekit 0.1.4 → 0.1.6

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