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