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