@hkdigital/lib-sveltekit 0.1.6 → 0.1.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.
- package/README.md +127 -127
- package/dist/classes/data/IterableTree.js +243 -243
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/index.js +3 -3
- package/dist/classes/promise/HkPromise.js +377 -377
- package/dist/classes/promise/index.js +1 -1
- package/dist/classes/stores/SubscribersCount.js +107 -107
- package/dist/classes/stores/index.js +1 -1
- package/dist/classes/streams/LogTransformStream.js +19 -19
- package/dist/classes/streams/ServerEventsStore.js +110 -110
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
- package/dist/classes/svelte/audio/AudioScene.svelte.js +282 -282
- package/dist/classes/svelte/audio/mocks.js +35 -35
- package/dist/classes/svelte/final-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/final-state-machine/index.js +1 -1
- package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
- package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
- package/dist/classes/svelte/image/index.js +4 -4
- package/dist/classes/svelte/image/mocks.js +35 -35
- package/dist/classes/svelte/image/typedef.js +8 -8
- package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
- package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
- package/dist/classes/svelte/loading-state-machine/index.js +3 -3
- package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
- package/dist/classes/svelte/network-loader/constants.js +3 -3
- package/dist/classes/svelte/network-loader/index.js +3 -3
- package/dist/classes/svelte/network-loader/mocks.js +30 -30
- package/dist/classes/svelte/network-loader/typedef.js +8 -8
- package/dist/components/area/HkArea.svelte +49 -49
- package/dist/components/area/HkArea.svelte.d.ts +14 -0
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/HkGridArea.svelte.d.ts +22 -0
- package/dist/components/area/index.js +2 -2
- package/dist/components/boxes/game-box/GameBox.svelte +112 -112
- package/dist/components/boxes/game-box/GameBox.svelte.d.ts +15 -0
- package/dist/components/boxes/game-box/gamebox.util.js +83 -83
- package/dist/components/boxes/index.js +2 -2
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -199
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +22 -0
- package/dist/components/buttons/button/Button.svelte +76 -75
- package/dist/components/buttons/button/Button.svelte.d.ts +21 -0
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -0
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +16 -0
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/button-text/TextButton.svelte.d.ts +7 -0
- package/dist/components/buttons/index.d.ts +1 -0
- package/dist/components/buttons/index.js +3 -2
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +13 -0
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +18 -0
- package/dist/components/{icon → icons}/HkIcon.svelte +86 -86
- package/dist/components/icons/HkIcon.svelte.d.ts +22 -0
- package/dist/components/{icon → icons}/HkTabIcon.svelte +116 -116
- package/dist/components/icons/HkTabIcon.svelte.d.ts +40 -0
- package/dist/components/icons/SteezeIcon.svelte +96 -0
- package/dist/components/icons/SteezeIcon.svelte.d.ts +22 -0
- package/dist/components/{icon → icons}/index.d.ts +1 -0
- package/dist/components/{icon → icons}/index.js +6 -4
- package/dist/components/{icon → icons}/typedef.js +16 -16
- package/dist/components/image/ImageBox.svelte +208 -208
- package/dist/components/image/ImageBox.svelte.d.ts +19 -0
- package/dist/components/image/index.js +5 -5
- package/dist/components/image/typedef.js +32 -32
- package/dist/components/index.js +2 -2
- package/dist/components/inputs/index.js +1 -1
- package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
- package/dist/components/inputs/text-input/TextInput.svelte +226 -226
- package/dist/components/inputs/text-input/TextInput.svelte.d.ts +28 -0
- package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
- package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/components/layout/HkAppLayout.svelte +251 -251
- package/dist/components/layout/HkAppLayout.svelte.d.ts +11 -0
- package/dist/components/layout/HkGridLayers.svelte +82 -82
- package/dist/components/layout/HkGridLayers.svelte.d.ts +23 -0
- package/dist/components/layout/index.js +9 -9
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
- package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +12 -0
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +14 -0
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +14 -0
- package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/components/tab-bar/HkTabBar.svelte +74 -74
- package/dist/components/tab-bar/HkTabBar.svelte.d.ts +18 -0
- package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +19 -0
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.d.ts +1 -1
- package/dist/components/tab-bar/typedef.js +8 -8
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +10 -0
- package/dist/components/widgets/compare-left-right/index.js +1 -1
- package/dist/components/widgets/scale-control/index.js +1 -1
- package/dist/config/imagetools-config.js +189 -189
- package/dist/config/imagetools.d.ts +71 -71
- package/dist/config/typedef.js +8 -8
- package/dist/constants/errors/api.js +9 -9
- package/dist/constants/errors/generic.js +5 -5
- package/dist/constants/errors/index.js +3 -3
- package/dist/constants/errors/jwt.js +5 -5
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +2 -2
- package/dist/constants/index.js +3 -3
- package/dist/constants/mime/application.js +5 -5
- package/dist/constants/mime/audio.js +13 -13
- package/dist/constants/mime/image.js +3 -3
- package/dist/constants/mime/index.js +4 -4
- package/dist/constants/mime/text.js +2 -2
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/user.js +32 -32
- package/dist/constants/regexp/web.js +3 -3
- package/dist/constants/state-labels/input-states.js +11 -11
- package/dist/constants/state-labels/submit-states.js +4 -4
- package/dist/constants/time.js +28 -28
- package/dist/css/tw-prose.postcss__ +259 -259
- package/dist/css/utilities.postcss +43 -43
- package/dist/design/design-config.js +73 -73
- package/dist/design/tailwind-theme-extend.d.ts +4 -4
- package/dist/design/tailwind-theme-extend.js +160 -151
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/validate-url.js +180 -180
- package/dist/server/index.js +1 -1
- package/dist/server/logger.js +94 -94
- package/dist/states/index.js +1 -1
- package/dist/states/navigation.svelte.js +55 -55
- package/dist/stores/index.js +1 -1
- package/dist/stores/theme.js +80 -80
- package/dist/themes/hkdev/components/blocks/text-block.postcss +40 -40
- package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
- package/dist/themes/hkdev/components/buttons/button-icon-steeze.postcss +22 -0
- package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
- package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
- package/dist/themes/hkdev/components/buttons/button.postcss__ +40 -0
- package/dist/themes/hkdev/components/buttons/button.postcss___ +91 -0
- package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
- package/dist/themes/hkdev/components/icons/icon-steeze.postcss +22 -0
- package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
- package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
- package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
- package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
- package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
- package/dist/themes/hkdev/components.postcss +61 -55
- package/dist/themes/hkdev/debug.postcss +1 -1
- package/dist/themes/hkdev/global/layout.postcss +39 -39
- package/dist/themes/hkdev/global/on-colors.postcss +53 -53
- package/dist/themes/hkdev/global/text.postcss__ +34 -34
- package/dist/themes/hkdev/global/vars.postcss__ +7 -7
- package/dist/themes/hkdev/globals.postcss +11 -11
- package/dist/themes/hkdev/responsive.postcss +12 -12
- package/dist/themes/hkdev/theme-ext.js +15 -15
- package/dist/themes/hkdev/theme.js +227 -227
- package/dist/themes/index.js +1 -1
- package/dist/util/array/index.js +455 -455
- package/dist/util/compare/index.js +247 -247
- package/dist/util/css/css-vars.js +83 -83
- package/dist/util/css/index.js +1 -1
- package/dist/util/design-system/components/states.js +22 -22
- package/dist/util/design-system/css/clamp.js +66 -66
- package/dist/util/design-system/css/root-design-vars.js +100 -100
- package/dist/util/design-system/index.js +5 -5
- package/dist/util/design-system/layout/scaling.js +97 -97
- package/dist/util/design-system/tailwind.js +289 -289
- package/dist/util/expect/arrays.js +47 -47
- package/dist/util/expect/index.js +259 -259
- package/dist/util/expect/primitives.js +55 -55
- package/dist/util/expect/url.js +60 -60
- package/dist/util/function/index.js +218 -218
- package/dist/util/http/errors.js +97 -97
- package/dist/util/http/headers.js +45 -45
- package/dist/util/http/http-request.js +273 -273
- package/dist/util/http/index.js +22 -22
- package/dist/util/http/json-request.js +143 -143
- package/dist/util/http/mocks.js +65 -65
- package/dist/util/http/response.js +228 -228
- package/dist/util/http/url.js +52 -52
- package/dist/util/image/index.js +86 -86
- package/dist/util/index.js +2 -2
- package/dist/util/is/index.js +140 -140
- package/dist/util/iterate/index.js +234 -234
- package/dist/util/object/index.js +1361 -1361
- package/dist/util/singleton/index.js +97 -97
- package/dist/util/string/index.js +184 -184
- package/dist/util/svelte/index.js +2 -2
- package/dist/util/svelte/observe/index.js +49 -49
- package/dist/util/svelte/state-context/index.js +83 -83
- package/dist/util/svelte/wait/index.js +38 -38
- package/dist/util/sveltekit/index.js +1 -1
- package/dist/util/sveltekit/route-folders/index.js +82 -82
- package/dist/util/time/index.js +339 -339
- package/dist/valibot/date.js__ +10 -10
- package/dist/valibot/index.js +9 -9
- package/dist/valibot/url.js +95 -95
- package/dist/valibot/user.js +23 -23
- package/dist/zod/all.js +33 -33
- package/dist/zod/generic.js +11 -11
- package/dist/zod/javascript.js +32 -32
- package/dist/zod/user.js +16 -16
- package/dist/zod/web.js +52 -52
- package/package.json +99 -99
- package/dist/components/icon/HkIcon.svelte.d.ts +0 -10
- package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -19
- /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';
|