@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,241 +1,241 @@
1
- import { ResponseError } from '../../constants/errors/index.js';
2
- import * as expect from '../expect/index.js';
3
- import { toURL } from './url.js';
4
-
5
- import {
6
- WWW_AUTHENTICATE,
7
- CONTENT_LENGTH
8
- } from '../../constants/http/headers.js';
9
-
10
- import { href } from './url.js';
11
-
12
- import { getErrorFromResponse } from './errors.js';
13
-
14
- // > Types
15
-
16
- /**
17
- * @callback progressCallback
18
- * @param {object} _
19
- * @param {number} _.bytesLoaded
20
- * @param {number} _.size
21
- */
22
-
23
- // > Exports
24
-
25
- /**
26
- * Check if the response status is ok
27
- *
28
- * @param {object} response
29
- * @param {string} url - used to produce useful error messages
30
- *
31
- * @throws {Error} not found
32
- * @throws {Error} internal server error
33
- */
34
- export async function expectResponseOk(response, url) {
35
- expect.object(response);
36
-
37
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
38
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
39
-
40
- if (200 === response.status || 201 === response.status) {
41
- if (!response.ok) {
42
- throw new ResponseError(
43
- `Server returned - ${response.status} ${response.statusText} ` +
44
- `[response.ok=false] [url=${href(url)}]`
45
- );
46
- }
47
-
48
- // All ok
49
- return;
50
- }
51
-
52
- // > Handle 401 Unauthorized
53
-
54
- if (401 === response.status) {
55
- let errorMessage = 'Server returned [401] Unauthorized';
56
-
57
- const authValue = response.headers.get(WWW_AUTHENTICATE);
58
-
59
- if (authValue) {
60
- // Add WWW_AUTHENTICATE response to error message
61
-
62
- errorMessage += ` (${authValue})`;
63
- }
64
-
65
- errorMessage += ` [url=${href(url)}]`;
66
-
67
- throw new Error(errorMessage);
68
- }
69
-
70
- // > Handle all other error responses
71
-
72
- const error = await getErrorFromResponse(response);
73
-
74
- throw new ResponseError(
75
- `Server returned - ${response.status} ${response.statusText} ` +
76
- `[url=${href(url)}]`,
77
- { cause: error }
78
- );
79
- }
80
-
81
- /**
82
- * Get the response size from the content-length response header
83
- *
84
- * @param {Response} response
85
- *
86
- * @returns {number} response size or 0 if unknown
87
- */
88
- export function getResponseSize(response) {
89
- const sizeStr = response.headers.get(CONTENT_LENGTH);
90
-
91
- if (!sizeStr) {
92
- return 0;
93
- }
94
-
95
- return parseInt(sizeStr, 10);
96
- }
97
-
98
- /**
99
- * Wait for a response and check if the response is ok
100
- *
101
- * @example
102
- * const response = await waitForAndCheckResponse( responsePromise );
103
- *
104
- * @param {Promise<Response>} responsePromise
105
- * @param {string|URL} url - An url that is used for error messages
106
- *
107
- * @throws ResponseError - A response error if something went wrong
108
- *
109
- * @returns {Promise<Response>} response
110
- */
111
- export async function waitForAndCheckResponse(responsePromise, url) {
112
- expect.promise(responsePromise);
113
-
114
- url = toURL(url);
115
-
116
- let response;
117
-
118
- try {
119
- response = await responsePromise;
120
-
121
- if (response && false === response.ok) {
122
- // if response.ok is false, it also indicates a network error
123
- throw new Error(`Response failed [response.ok=false]`);
124
- }
125
- } catch (e) {
126
- if (e instanceof TypeError || response?.ok === false) {
127
- throw new ResponseError(
128
- `A network error occurred for request [${href(url)}]`,
129
- {
130
- cause: e
131
- }
132
- );
133
- } else {
134
- throw e;
135
- }
136
- }
137
-
138
- return response;
139
- }
140
-
141
- /**
142
- * Load response body as ArrayBuffer
143
- * - Progress can be monitored by suppying an onProgress callback
144
- * - Loading can be aborted by calling the returned abort function
145
- *
146
- * @param {Response} response - Fetch response
147
- * @param {progressCallback} onProgress
148
- *
149
- * @returns {{ bufferPromise: Promise<ArrayBuffer>, abort: () => void }}
150
- */
151
- export function loadResponseBuffer(response, onProgress) {
152
- // @note size might be 0
153
- // @note might not be send by server in dev mode
154
- const size = getResponseSize(response);
155
-
156
- let bytesLoaded = 0;
157
-
158
- if (onProgress /*&& size*/) {
159
- onProgress({ bytesLoaded, size });
160
- }
161
-
162
- if (!response.body) {
163
- throw new Error('Missing [response.body]');
164
- }
165
-
166
- const reader = response.body.getReader();
167
-
168
- let aborted = false;
169
-
170
- /**
171
- * Read chunks from response body using reader
172
- *
173
- * @returns {Promise<ArrayBuffer>}
174
- */
175
- async function read() {
176
- let chunks = [];
177
-
178
- // - Use flag 'loading'
179
- // - Check if #abortLoading still exists
180
- for (;;) {
181
- const { done, value } = await reader.read();
182
-
183
- if (value) {
184
- // @note value is an ArrayBuffer
185
- bytesLoaded += value.byteLength;
186
-
187
- // console.log({ done, value, byteLength: value.byteLength, bytesLoaded });
188
-
189
- // console.log({ size, bytesLoaded, value });
190
-
191
- // if (size && bytesLoaded > size) {
192
- // console.error();
193
- // throw new Error(
194
- // `Received more bytes [${bytesLoaded}] than specified by header content-length [${size}]`
195
- // );
196
- // }
197
-
198
- chunks.push(value);
199
-
200
- if (onProgress /*&& size*/) {
201
- onProgress({ bytesLoaded, size });
202
- }
203
- }
204
-
205
- if (done || aborted) {
206
- // Loading complete or aborted by user
207
- break;
208
- }
209
- } // end while
210
-
211
- if (size && bytesLoaded !== size) {
212
- console.error(`Received [${bytesLoaded}], but expected [${size}] bytes`);
213
- // throw new Error(
214
- // `Received [${bytesLoaded}], but expected [${size}] bytes`
215
- // );
216
- }
217
-
218
- // Concat the chinks into a single array
219
- let buffer = new ArrayBuffer(bytesLoaded);
220
- let body = new Uint8Array(buffer);
221
-
222
- let offset = 0;
223
-
224
- // Place the chunks in the buffer
225
- for (let chunk of chunks) {
226
- body.set(chunk, offset);
227
- offset += chunk.byteLength;
228
- } // end for
229
-
230
- return buffer;
231
- }
232
-
233
- const bufferPromise = read();
234
-
235
- return {
236
- bufferPromise,
237
- abort: () => {
238
- aborted = true;
239
- }
240
- };
241
- } // end fn
1
+ import { ResponseError } from '../../constants/errors/index.js';
2
+ import * as expect from '../expect/index.js';
3
+ import { toURL } from './url.js';
4
+
5
+ import {
6
+ WWW_AUTHENTICATE,
7
+ CONTENT_LENGTH
8
+ } from '../../constants/http/headers.js';
9
+
10
+ import { href } from './url.js';
11
+
12
+ import { getErrorFromResponse } from './errors.js';
13
+
14
+ // > Types
15
+
16
+ /**
17
+ * @callback progressCallback
18
+ * @param {object} _
19
+ * @param {number} _.bytesLoaded
20
+ * @param {number} _.size
21
+ */
22
+
23
+ // > Exports
24
+
25
+ /**
26
+ * Check if the response status is ok
27
+ *
28
+ * @param {object} response
29
+ * @param {string} url - used to produce useful error messages
30
+ *
31
+ * @throws {Error} not found
32
+ * @throws {Error} internal server error
33
+ */
34
+ export async function expectResponseOk(response, url) {
35
+ expect.object(response);
36
+
37
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200
38
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201
39
+
40
+ if (200 === response.status || 201 === response.status) {
41
+ if (!response.ok) {
42
+ throw new ResponseError(
43
+ `Server returned - ${response.status} ${response.statusText} ` +
44
+ `[response.ok=false] [url=${href(url)}]`
45
+ );
46
+ }
47
+
48
+ // All ok
49
+ return;
50
+ }
51
+
52
+ // > Handle 401 Unauthorized
53
+
54
+ if (401 === response.status) {
55
+ let errorMessage = 'Server returned [401] Unauthorized';
56
+
57
+ const authValue = response.headers.get(WWW_AUTHENTICATE);
58
+
59
+ if (authValue) {
60
+ // Add WWW_AUTHENTICATE response to error message
61
+
62
+ errorMessage += ` (${authValue})`;
63
+ }
64
+
65
+ errorMessage += ` [url=${href(url)}]`;
66
+
67
+ throw new Error(errorMessage);
68
+ }
69
+
70
+ // > Handle all other error responses
71
+
72
+ const error = await getErrorFromResponse(response);
73
+
74
+ throw new ResponseError(
75
+ `Server returned - ${response.status} ${response.statusText} ` +
76
+ `[url=${href(url)}]`,
77
+ { cause: error }
78
+ );
79
+ }
80
+
81
+ /**
82
+ * Get the response size from the content-length response header
83
+ *
84
+ * @param {Response} response
85
+ *
86
+ * @returns {number} response size or 0 if unknown
87
+ */
88
+ export function getResponseSize(response) {
89
+ const sizeStr = response.headers.get(CONTENT_LENGTH);
90
+
91
+ if (!sizeStr) {
92
+ return 0;
93
+ }
94
+
95
+ return parseInt(sizeStr, 10);
96
+ }
97
+
98
+ /**
99
+ * Wait for a response and check if the response is ok
100
+ *
101
+ * @example
102
+ * const response = await waitForAndCheckResponse( responsePromise );
103
+ *
104
+ * @param {Promise<Response>} responsePromise
105
+ * @param {string|URL} url - An url that is used for error messages
106
+ *
107
+ * @throws ResponseError - A response error if something went wrong
108
+ *
109
+ * @returns {Promise<Response>} response
110
+ */
111
+ export async function waitForAndCheckResponse(responsePromise, url) {
112
+ expect.promise(responsePromise);
113
+
114
+ url = toURL(url);
115
+
116
+ let response;
117
+
118
+ try {
119
+ response = await responsePromise;
120
+
121
+ if (response && false === response.ok) {
122
+ // if response.ok is false, it also indicates a network error
123
+ throw new Error(`Response failed [response.ok=false]`);
124
+ }
125
+ } catch (e) {
126
+ if (e instanceof TypeError || response?.ok === false) {
127
+ throw new ResponseError(
128
+ `A network error occurred for request [${href(url)}]`,
129
+ {
130
+ cause: e
131
+ }
132
+ );
133
+ } else {
134
+ throw e;
135
+ }
136
+ }
137
+
138
+ return response;
139
+ }
140
+
141
+ /**
142
+ * Load response body as ArrayBuffer
143
+ * - Progress can be monitored by suppying an onProgress callback
144
+ * - Loading can be aborted by calling the returned abort function
145
+ *
146
+ * @param {Response} response - Fetch response
147
+ * @param {progressCallback} onProgress
148
+ *
149
+ * @returns {{ bufferPromise: Promise<ArrayBuffer>, abort: () => void }}
150
+ */
151
+ export function loadResponseBuffer(response, onProgress) {
152
+ // @note size might be 0
153
+ // @note might not be send by server in dev mode
154
+ const size = getResponseSize(response);
155
+
156
+ let bytesLoaded = 0;
157
+
158
+ if (onProgress /*&& size*/) {
159
+ onProgress({ bytesLoaded, size });
160
+ }
161
+
162
+ if (!response.body) {
163
+ throw new Error('Missing [response.body]');
164
+ }
165
+
166
+ const reader = response.body.getReader();
167
+
168
+ let aborted = false;
169
+
170
+ /**
171
+ * Read chunks from response body using reader
172
+ *
173
+ * @returns {Promise<ArrayBuffer>}
174
+ */
175
+ async function read() {
176
+ let chunks = [];
177
+
178
+ // - Use flag 'loading'
179
+ // - Check if #abortLoading still exists
180
+ for (;;) {
181
+ const { done, value } = await reader.read();
182
+
183
+ if (value) {
184
+ // @note value is an ArrayBuffer
185
+ bytesLoaded += value.byteLength;
186
+
187
+ // console.log({ done, value, byteLength: value.byteLength, bytesLoaded });
188
+
189
+ // console.log({ size, bytesLoaded, value });
190
+
191
+ // if (size && bytesLoaded > size) {
192
+ // console.error();
193
+ // throw new Error(
194
+ // `Received more bytes [${bytesLoaded}] than specified by header content-length [${size}]`
195
+ // );
196
+ // }
197
+
198
+ chunks.push(value);
199
+
200
+ if (onProgress /*&& size*/) {
201
+ onProgress({ bytesLoaded, size });
202
+ }
203
+ }
204
+
205
+ if (done || aborted) {
206
+ // Loading complete or aborted by user
207
+ break;
208
+ }
209
+ } // end while
210
+
211
+ if (size && bytesLoaded !== size) {
212
+ console.error(`Received [${bytesLoaded}], but expected [${size}] bytes`);
213
+ // throw new Error(
214
+ // `Received [${bytesLoaded}], but expected [${size}] bytes`
215
+ // );
216
+ }
217
+
218
+ // Concat the chinks into a single array
219
+ let buffer = new ArrayBuffer(bytesLoaded);
220
+ let body = new Uint8Array(buffer);
221
+
222
+ let offset = 0;
223
+
224
+ // Place the chunks in the buffer
225
+ for (let chunk of chunks) {
226
+ body.set(chunk, offset);
227
+ offset += chunk.byteLength;
228
+ } // end for
229
+
230
+ return buffer;
231
+ }
232
+
233
+ const bufferPromise = read();
234
+
235
+ return {
236
+ bufferPromise,
237
+ abort: () => {
238
+ aborted = true;
239
+ }
240
+ };
241
+ } // end fn
@@ -1,52 +1,52 @@
1
- import { TypeOrValueError } from '../../constants/errors/index.js';
2
-
3
- /**
4
- * Returns an URL instance
5
- * - Prefixes the URL with the current orign if the url is relative
6
- *
7
- * @param {string|URL} url
8
- *
9
- * @returns {URL} url instance
10
- */
11
- export function toURL(url) {
12
- if (typeof url === 'string') {
13
- if (hasProtocol(url)) {
14
- return new URL(url);
15
- } else {
16
- // Use location.origin aas baseUrl
17
- return new URL(url, location.origin);
18
- }
19
- } else if (!(url instanceof URL)) {
20
- throw new TypeOrValueError('Missing or invalid parameter [url]');
21
- }
22
-
23
- // already an URL instance
24
- return url;
25
- }
26
-
27
- /**
28
- * Checks if the url starts with a protocol specification such
29
- * as https://
30
- *
31
- * @param {string} url
32
- *
33
- * @return {boolean} true if the value looks like an array
34
- */
35
- export function hasProtocol(url) {
36
- if (/^([a-zA-Z]{2,})s?:\/\//.test(url)) {
37
- return true;
38
- }
39
-
40
- return false;
41
- }
42
-
43
- /**
44
- * Convert an url to an absolute url and apply decodeURI to
45
- * convert URI encoded characters to normal characters
46
- *
47
- * @param {string|URL} url
48
- */
49
- export function href(url) {
50
- const urlObj = toURL(url);
51
- return decodeURI(urlObj.href);
52
- }
1
+ import { TypeOrValueError } from '../../constants/errors/index.js';
2
+
3
+ /**
4
+ * Returns an URL instance
5
+ * - Prefixes the URL with the current orign if the url is relative
6
+ *
7
+ * @param {string|URL} url
8
+ *
9
+ * @returns {URL} url instance
10
+ */
11
+ export function toURL(url) {
12
+ if (typeof url === 'string') {
13
+ if (hasProtocol(url)) {
14
+ return new URL(url);
15
+ } else {
16
+ // Use location.origin aas baseUrl
17
+ return new URL(url, location.origin);
18
+ }
19
+ } else if (!(url instanceof URL)) {
20
+ throw new TypeOrValueError('Missing or invalid parameter [url]');
21
+ }
22
+
23
+ // already an URL instance
24
+ return url;
25
+ }
26
+
27
+ /**
28
+ * Checks if the url starts with a protocol specification such
29
+ * as https://
30
+ *
31
+ * @param {string} url
32
+ *
33
+ * @return {boolean} true if the value looks like an array
34
+ */
35
+ export function hasProtocol(url) {
36
+ if (/^([a-zA-Z]{2,})s?:\/\//.test(url)) {
37
+ return true;
38
+ }
39
+
40
+ return false;
41
+ }
42
+
43
+ /**
44
+ * Convert an url to an absolute url and apply decodeURI to
45
+ * convert URI encoded characters to normal characters
46
+ *
47
+ * @param {string|URL} url
48
+ */
49
+ export function href(url) {
50
+ const urlObj = toURL(url);
51
+ return decodeURI(urlObj.href);
52
+ }