@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.
- 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 +0 -14
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/HkGridArea.svelte.d.ts +0 -22
- 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 +0 -15
- 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 +0 -22
- package/dist/components/buttons/button/Button.svelte +75 -75
- package/dist/components/buttons/button/Button.svelte.d.ts +0 -21
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/button-text/TextButton.svelte.d.ts +0 -7
- package/dist/components/buttons/index.js +2 -2
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +0 -13
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +0 -18
- package/dist/components/icon/HkIcon.svelte +86 -86
- package/dist/components/icon/HkIcon.svelte.d.ts +0 -12
- package/dist/components/icon/HkTabIcon.svelte +116 -116
- package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -21
- package/dist/components/icon/index.js +4 -4
- package/dist/components/icon/typedef.js +16 -16
- package/dist/components/image/ImageBox.svelte +208 -208
- package/dist/components/image/ImageBox.svelte.d.ts +0 -19
- 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 +0 -28
- 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 +0 -11
- package/dist/components/layout/HkGridLayers.svelte +82 -82
- package/dist/components/layout/HkGridLayers.svelte.d.ts +0 -23
- 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 +0 -12
- 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 +0 -14
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +0 -14
- 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 +0 -18
- 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 +0 -19
- package/dist/components/tab-bar/index.js +17 -17
- 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 +0 -10
- 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 +151 -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-text.postcss +34 -34
- package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
- package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
- 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 +55 -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.d.ts +2 -2
- 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/themes/hkdev/components/buttons/button.postcss__ +0 -40
- 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
|
package/dist/util/http/url.js
CHANGED
@@ -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
|
+
}
|