@hkdigital/lib-sveltekit 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -127
- package/dist/classes/data/IterableTree.js +243 -243
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/index.js +3 -3
- package/dist/classes/promise/HkPromise.js +377 -377
- package/dist/classes/promise/index.js +1 -1
- package/dist/classes/stores/SubscribersCount.js +107 -107
- package/dist/classes/stores/index.js +1 -1
- package/dist/classes/streams/LogTransformStream.js +19 -19
- package/dist/classes/streams/ServerEventsStore.js +110 -110
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
- package/dist/classes/svelte/audio/AudioScene.svelte.js +282 -282
- package/dist/classes/svelte/audio/mocks.js +35 -35
- package/dist/classes/svelte/final-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/final-state-machine/index.js +1 -1
- package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
- package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
- package/dist/classes/svelte/image/index.js +4 -4
- package/dist/classes/svelte/image/mocks.js +35 -35
- package/dist/classes/svelte/image/typedef.js +8 -8
- package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
- package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
- package/dist/classes/svelte/loading-state-machine/index.js +3 -3
- package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
- package/dist/classes/svelte/network-loader/constants.js +3 -3
- package/dist/classes/svelte/network-loader/index.js +3 -3
- package/dist/classes/svelte/network-loader/mocks.js +30 -30
- package/dist/classes/svelte/network-loader/typedef.js +8 -8
- package/dist/components/area/HkArea.svelte +49 -49
- package/dist/components/area/HkArea.svelte.d.ts +14 -0
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/HkGridArea.svelte.d.ts +22 -0
- package/dist/components/area/index.js +2 -2
- package/dist/components/boxes/game-box/GameBox.svelte +112 -112
- package/dist/components/boxes/game-box/GameBox.svelte.d.ts +15 -0
- package/dist/components/boxes/game-box/gamebox.util.js +83 -83
- package/dist/components/boxes/index.js +2 -2
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -199
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +22 -0
- package/dist/components/buttons/button/Button.svelte +76 -75
- package/dist/components/buttons/button/Button.svelte.d.ts +21 -0
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -0
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +16 -0
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/button-text/TextButton.svelte.d.ts +7 -0
- package/dist/components/buttons/index.d.ts +1 -0
- package/dist/components/buttons/index.js +3 -2
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +13 -0
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +18 -0
- package/dist/components/{icon → icons}/HkIcon.svelte +86 -86
- package/dist/components/icons/HkIcon.svelte.d.ts +22 -0
- package/dist/components/{icon → icons}/HkTabIcon.svelte +116 -116
- package/dist/components/icons/HkTabIcon.svelte.d.ts +40 -0
- package/dist/components/icons/SteezeIcon.svelte +96 -0
- package/dist/components/icons/SteezeIcon.svelte.d.ts +22 -0
- package/dist/components/{icon → icons}/index.d.ts +1 -0
- package/dist/components/{icon → icons}/index.js +6 -4
- package/dist/components/{icon → icons}/typedef.js +16 -16
- package/dist/components/image/ImageBox.svelte +208 -208
- package/dist/components/image/ImageBox.svelte.d.ts +19 -0
- package/dist/components/image/index.js +5 -5
- package/dist/components/image/typedef.js +32 -32
- package/dist/components/index.js +2 -2
- package/dist/components/inputs/index.js +1 -1
- package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
- package/dist/components/inputs/text-input/TextInput.svelte +226 -226
- package/dist/components/inputs/text-input/TextInput.svelte.d.ts +28 -0
- package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
- package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/components/layout/HkAppLayout.svelte +251 -251
- package/dist/components/layout/HkAppLayout.svelte.d.ts +11 -0
- package/dist/components/layout/HkGridLayers.svelte +82 -82
- package/dist/components/layout/HkGridLayers.svelte.d.ts +23 -0
- package/dist/components/layout/index.js +9 -9
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
- package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +12 -0
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +14 -0
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +14 -0
- package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/components/tab-bar/HkTabBar.svelte +74 -74
- package/dist/components/tab-bar/HkTabBar.svelte.d.ts +18 -0
- package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +19 -0
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.d.ts +1 -1
- package/dist/components/tab-bar/typedef.js +8 -8
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +10 -0
- package/dist/components/widgets/compare-left-right/index.js +1 -1
- package/dist/components/widgets/scale-control/index.js +1 -1
- package/dist/config/imagetools-config.js +189 -189
- package/dist/config/imagetools.d.ts +71 -71
- package/dist/config/typedef.js +8 -8
- package/dist/constants/errors/api.js +9 -9
- package/dist/constants/errors/generic.js +5 -5
- package/dist/constants/errors/index.js +3 -3
- package/dist/constants/errors/jwt.js +5 -5
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +2 -2
- package/dist/constants/index.js +3 -3
- package/dist/constants/mime/application.js +5 -5
- package/dist/constants/mime/audio.js +13 -13
- package/dist/constants/mime/image.js +3 -3
- package/dist/constants/mime/index.js +4 -4
- package/dist/constants/mime/text.js +2 -2
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/user.js +32 -32
- package/dist/constants/regexp/web.js +3 -3
- package/dist/constants/state-labels/input-states.js +11 -11
- package/dist/constants/state-labels/submit-states.js +4 -4
- package/dist/constants/time.js +28 -28
- package/dist/css/tw-prose.postcss__ +259 -259
- package/dist/css/utilities.postcss +43 -43
- package/dist/design/design-config.js +73 -73
- package/dist/design/tailwind-theme-extend.d.ts +4 -4
- package/dist/design/tailwind-theme-extend.js +160 -151
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/validate-url.js +180 -180
- package/dist/server/index.js +1 -1
- package/dist/server/logger.js +94 -94
- package/dist/states/index.js +1 -1
- package/dist/states/navigation.svelte.js +55 -55
- package/dist/stores/index.js +1 -1
- package/dist/stores/theme.js +80 -80
- package/dist/themes/hkdev/components/blocks/text-block.postcss +40 -40
- package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
- package/dist/themes/hkdev/components/buttons/button-icon-steeze.postcss +22 -0
- package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
- package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
- package/dist/themes/hkdev/components/buttons/button.postcss__ +40 -0
- package/dist/themes/hkdev/components/buttons/button.postcss___ +91 -0
- package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
- package/dist/themes/hkdev/components/icons/icon-steeze.postcss +22 -0
- package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
- package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
- package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
- package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
- package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
- package/dist/themes/hkdev/components.postcss +61 -55
- package/dist/themes/hkdev/debug.postcss +1 -1
- package/dist/themes/hkdev/global/layout.postcss +39 -39
- package/dist/themes/hkdev/global/on-colors.postcss +53 -53
- package/dist/themes/hkdev/global/text.postcss__ +34 -34
- package/dist/themes/hkdev/global/vars.postcss__ +7 -7
- package/dist/themes/hkdev/globals.postcss +11 -11
- package/dist/themes/hkdev/responsive.postcss +12 -12
- package/dist/themes/hkdev/theme-ext.js +15 -15
- package/dist/themes/hkdev/theme.js +227 -227
- package/dist/themes/index.js +1 -1
- package/dist/util/array/index.js +455 -455
- package/dist/util/compare/index.js +247 -247
- package/dist/util/css/css-vars.js +83 -83
- package/dist/util/css/index.js +1 -1
- package/dist/util/design-system/components/states.js +22 -22
- package/dist/util/design-system/css/clamp.js +66 -66
- package/dist/util/design-system/css/root-design-vars.js +100 -100
- package/dist/util/design-system/index.js +5 -5
- package/dist/util/design-system/layout/scaling.js +97 -97
- package/dist/util/design-system/tailwind.js +289 -289
- package/dist/util/expect/arrays.js +47 -47
- package/dist/util/expect/index.js +259 -259
- package/dist/util/expect/primitives.js +55 -55
- package/dist/util/expect/url.js +60 -60
- package/dist/util/function/index.js +218 -218
- package/dist/util/http/errors.js +97 -97
- package/dist/util/http/headers.js +45 -45
- package/dist/util/http/http-request.js +273 -273
- package/dist/util/http/index.js +22 -22
- package/dist/util/http/json-request.js +143 -143
- package/dist/util/http/mocks.js +65 -65
- package/dist/util/http/response.js +228 -228
- package/dist/util/http/url.js +52 -52
- package/dist/util/image/index.js +86 -86
- package/dist/util/index.js +2 -2
- package/dist/util/is/index.js +140 -140
- package/dist/util/iterate/index.js +234 -234
- package/dist/util/object/index.js +1361 -1361
- package/dist/util/singleton/index.js +97 -97
- package/dist/util/string/index.js +184 -184
- package/dist/util/svelte/index.js +2 -2
- package/dist/util/svelte/observe/index.js +49 -49
- package/dist/util/svelte/state-context/index.js +83 -83
- package/dist/util/svelte/wait/index.js +38 -38
- package/dist/util/sveltekit/index.js +1 -1
- package/dist/util/sveltekit/route-folders/index.js +82 -82
- package/dist/util/time/index.js +339 -339
- package/dist/valibot/date.js__ +10 -10
- package/dist/valibot/index.js +9 -9
- package/dist/valibot/url.js +95 -95
- package/dist/valibot/user.js +23 -23
- package/dist/zod/all.js +33 -33
- package/dist/zod/generic.js +11 -11
- package/dist/zod/javascript.js +32 -32
- package/dist/zod/user.js +16 -16
- package/dist/zod/web.js +52 -52
- package/package.json +99 -99
- package/dist/components/icon/HkIcon.svelte.d.ts +0 -10
- package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -19
- /package/dist/components/{icon → icons}/typedef.d.ts +0 -0
@@ -1,273 +1,273 @@
|
|
1
|
-
import { METHOD_GET, METHOD_POST } from '../../constants/http/methods.js';
|
2
|
-
|
3
|
-
import { APPLICATION_JSON } from '../../constants/mime/application.js';
|
4
|
-
import { CONTENT_TYPE } from '../../constants/http/headers.js';
|
5
|
-
|
6
|
-
import { AbortError, TimeoutError } from '../../constants/errors/api.js';
|
7
|
-
|
8
|
-
import * as expect from '../expect/index.js';
|
9
|
-
|
10
|
-
import { toURL } from './url.js';
|
11
|
-
import { setRequestHeaders } from './headers.js';
|
12
|
-
import { waitForAndCheckResponse } from './response.js';
|
13
|
-
|
14
|
-
/**
|
15
|
-
* @callback requestHandler
|
16
|
-
* @param {AbortController} controller
|
17
|
-
* @param {( reason?: Error ) => void} abort
|
18
|
-
* @param {( delayMs: number) => void} timeout
|
19
|
-
*/
|
20
|
-
|
21
|
-
/**
|
22
|
-
* Make GET request
|
23
|
-
*
|
24
|
-
* @param {object} _
|
25
|
-
*
|
26
|
-
* @param {string|URL} _.url - Url string or URL object
|
27
|
-
*
|
28
|
-
* @param {object} [_.urlSearchParams]
|
29
|
-
* Parameters that should be added to the request url
|
30
|
-
*
|
31
|
-
* @param {object} [_.headers]
|
32
|
-
* Object that contains custom headers. A header is a name, value pair.
|
33
|
-
*
|
34
|
-
* e.g. options.headers = { "content-type": "application/json" }
|
35
|
-
*
|
36
|
-
* @param {requestHandler} [_.requestHandler]
|
37
|
-
*
|
38
|
-
* @param {number} [_.timeoutMs]
|
39
|
-
* If defined, this request will abort after the specified number of
|
40
|
-
* milliseconds. Values above the the built-in request timeout won't work.
|
41
|
-
*
|
42
|
-
* @returns {Promise<Response>} responsePromise
|
43
|
-
*/
|
44
|
-
export async function httpGet({ url, urlSearchParams, headers, requestHandler, timeoutMs }) {
|
45
|
-
const responsePromise = httpRequest({
|
46
|
-
method: METHOD_GET,
|
47
|
-
url,
|
48
|
-
urlSearchParams,
|
49
|
-
headers,
|
50
|
-
requestHandler,
|
51
|
-
timeoutMs
|
52
|
-
});
|
53
|
-
|
54
|
-
return await waitForAndCheckResponse(responsePromise, url);
|
55
|
-
}
|
56
|
-
|
57
|
-
/**
|
58
|
-
* Make POST request
|
59
|
-
*
|
60
|
-
* @param {object} _
|
61
|
-
*
|
62
|
-
* @param {string|URL} _.url - Url string or URL object
|
63
|
-
*
|
64
|
-
* @param {any} [_.body] - POST data
|
65
|
-
*
|
66
|
-
* @param {object} [_.headers]
|
67
|
-
* Object that contains custom headers. A header is a name, value pair.
|
68
|
-
*
|
69
|
-
* e.g. options.headers = { "content-type": "application/json" }
|
70
|
-
*
|
71
|
-
* @param {requestHandler} [_.requestHandler]
|
72
|
-
*
|
73
|
-
* @param {number} [_.timeoutMs]
|
74
|
-
* If defined, this request will abort after the specified number of
|
75
|
-
* milliseconds. Values above the the built-in request timeout won't work.
|
76
|
-
*
|
77
|
-
* @returns {Promise<Response>} responsePromise
|
78
|
-
*/
|
79
|
-
export async function httpPost({ url, body = null, headers, requestHandler, timeoutMs }) {
|
80
|
-
const responsePromise = httpRequest({
|
81
|
-
method: METHOD_POST,
|
82
|
-
url,
|
83
|
-
body,
|
84
|
-
headers,
|
85
|
-
requestHandler,
|
86
|
-
timeoutMs
|
87
|
-
});
|
88
|
-
|
89
|
-
return await waitForAndCheckResponse(responsePromise, url);
|
90
|
-
}
|
91
|
-
|
92
|
-
// -----------------------------------------------------------------------------
|
93
|
-
|
94
|
-
/**
|
95
|
-
* Make an HTTP request
|
96
|
-
* - This is a low level function, consider using
|
97
|
-
* httpGet, httpPost, jsonGet or jsonPost instead
|
98
|
-
*
|
99
|
-
* @param {object} _
|
100
|
-
*
|
101
|
-
* @param {string|URL} _.url - Url string or URL object
|
102
|
-
*
|
103
|
-
* @param {string} _.method - Request method: METHOD_GET | METHOD_POST
|
104
|
-
*
|
105
|
-
* @param {object} [_.urlSearchParams] - URL search parameters as key-value pairs
|
106
|
-
*
|
107
|
-
* @param {any} [_.body] - POST data
|
108
|
-
*
|
109
|
-
* @param {object} [_.headers]
|
110
|
-
* Object that contains custom headers. A header is a name, value pair.
|
111
|
-
*
|
112
|
-
* e.g. options.headers = { "content-type": "application/json" }
|
113
|
-
*
|
114
|
-
* @param {requestHandler} [_.requestHandler]
|
115
|
-
*
|
116
|
-
* @param {number} [_.timeoutMs]
|
117
|
-
* If defined, this request will abort after the specified number of
|
118
|
-
* milliseconds. Values above the the built-in request timeout won't work.
|
119
|
-
*
|
120
|
-
* @throws TypeError - If a network error occurred
|
121
|
-
*
|
122
|
-
* @note Check the `ok` property of the resolved response to check if the
|
123
|
-
* response was successfull (e.g. in case of a 404, ok is false)
|
124
|
-
*
|
125
|
-
* @returns {Promise<Response>} responsePromise
|
126
|
-
*/
|
127
|
-
export async function httpRequest({
|
128
|
-
method,
|
129
|
-
url,
|
130
|
-
urlSearchParams = null,
|
131
|
-
body = null,
|
132
|
-
headers,
|
133
|
-
requestHandler,
|
134
|
-
timeoutMs
|
135
|
-
}) {
|
136
|
-
url = toURL(url);
|
137
|
-
|
138
|
-
// @see https://developer.mozilla.org/en-US/docs/Web/API/Headers
|
139
|
-
|
140
|
-
const requestHeaders = new Headers();
|
141
|
-
|
142
|
-
if (headers) {
|
143
|
-
setRequestHeaders(requestHeaders, headers);
|
144
|
-
|
145
|
-
if (headers[CONTENT_TYPE] === APPLICATION_JSON && typeof body !== 'string') {
|
146
|
-
throw new Error(
|
147
|
-
`Trying to send request with [content-type:${APPLICATION_JSON}], ` +
|
148
|
-
'but body is not a (JSON encoded) string.'
|
149
|
-
);
|
150
|
-
}
|
151
|
-
// IDEA: try to decode the body to catch errors on client side
|
152
|
-
}
|
153
|
-
|
154
|
-
const init = {
|
155
|
-
mode: 'cors',
|
156
|
-
cache: 'no-cache',
|
157
|
-
credentials: 'omit',
|
158
|
-
redirect: 'follow',
|
159
|
-
referrerPolicy: 'no-referrer',
|
160
|
-
headers: requestHeaders
|
161
|
-
};
|
162
|
-
|
163
|
-
// Allow search params also for other request types than GET
|
164
|
-
|
165
|
-
if (urlSearchParams) {
|
166
|
-
if (!(urlSearchParams instanceof URLSearchParams)) {
|
167
|
-
throw new Error(
|
168
|
-
'Invalid parameter [urlSearchParams] ' + '(expected instanceof URLSearchParams)'
|
169
|
-
);
|
170
|
-
}
|
171
|
-
|
172
|
-
const existingParams = url.searchParams;
|
173
|
-
|
174
|
-
for (const [name, value] of urlSearchParams.entries()) {
|
175
|
-
if (existingParams.has(name)) {
|
176
|
-
throw new Error(
|
177
|
-
`Cannot set URL search parameter [${name}] ` + `in url [${url.href}] (already set)`
|
178
|
-
);
|
179
|
-
}
|
180
|
-
|
181
|
-
existingParams.set(name, value);
|
182
|
-
} // end for
|
183
|
-
}
|
184
|
-
|
185
|
-
//
|
186
|
-
// Sort search params to make the url nicer
|
187
|
-
//
|
188
|
-
url.searchParams.sort();
|
189
|
-
|
190
|
-
// console.log( "url", url );
|
191
|
-
|
192
|
-
init.method = method;
|
193
|
-
|
194
|
-
if (METHOD_POST === method) {
|
195
|
-
init.body = body || null; /* : JSON.stringify( body ) */
|
196
|
-
}
|
197
|
-
|
198
|
-
// @see https://developer.mozilla.org/en-US/docs/Web/API/Request/Request
|
199
|
-
|
200
|
-
// console.log( "init", init );
|
201
|
-
// console.log( "headers", init.headers );
|
202
|
-
|
203
|
-
const request = new Request(url, init);
|
204
|
-
|
205
|
-
// @see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort
|
206
|
-
|
207
|
-
const controller = new AbortController();
|
208
|
-
const signal = controller.signal;
|
209
|
-
|
210
|
-
//
|
211
|
-
// A fetch() promise will reject with a TypeError when a network error
|
212
|
-
// is encountered or CORS is misconfigured on the server-side,
|
213
|
-
// although this usually means permission issues or similar
|
214
|
-
// — a 404 does not constitute a network error, for example.
|
215
|
-
// An accurate check for a successful fetch() would include checking
|
216
|
-
// that the promise resolved, then checking that the Response.ok property
|
217
|
-
// has a value of true. The code would look something like this:
|
218
|
-
//
|
219
|
-
// fetch()
|
220
|
-
// .then( () => {
|
221
|
-
// if( !response.ok ) {
|
222
|
-
// throw new Error('Network response was not OK');
|
223
|
-
// }
|
224
|
-
// ...
|
225
|
-
// }
|
226
|
-
// .catch((error) => { .. }
|
227
|
-
//
|
228
|
-
|
229
|
-
const promise = fetch(request, { signal });
|
230
|
-
|
231
|
-
if (requestHandler || timeoutMs) {
|
232
|
-
/**
|
233
|
-
* @type {(reason?: any) => void}
|
234
|
-
*/
|
235
|
-
const abort = (reason) => {
|
236
|
-
if (!reason) {
|
237
|
-
reason = new AbortError(`Request [${url.href}] aborted`);
|
238
|
-
}
|
239
|
-
|
240
|
-
controller.abort(reason);
|
241
|
-
};
|
242
|
-
|
243
|
-
/**
|
244
|
-
* Function that can be used to set a timeout on a request
|
245
|
-
*
|
246
|
-
* @param {number} delayMs
|
247
|
-
*/
|
248
|
-
const timeout = (delayMs = 10000) => {
|
249
|
-
expect.positiveNumber(delayMs, 'Invalid value for [delayMs]');
|
250
|
-
|
251
|
-
const timerId = setTimeout(() => {
|
252
|
-
controller.abort(new TimeoutError(`Request [${url.href}] timed out [${delayMs}]`));
|
253
|
-
}, delayMs);
|
254
|
-
|
255
|
-
promise.finally(() => {
|
256
|
-
clearTimeout(timerId);
|
257
|
-
});
|
258
|
-
};
|
259
|
-
|
260
|
-
if (timeoutMs) {
|
261
|
-
timeout(timeoutMs);
|
262
|
-
}
|
263
|
-
|
264
|
-
if (requestHandler) {
|
265
|
-
expect.function(requestHandler, 'Invalid parameter [requestHandler]');
|
266
|
-
|
267
|
-
requestHandler({ controller, abort, timeout });
|
268
|
-
}
|
269
|
-
}
|
270
|
-
|
271
|
-
// response promise
|
272
|
-
return promise;
|
273
|
-
}
|
1
|
+
import { METHOD_GET, METHOD_POST } from '../../constants/http/methods.js';
|
2
|
+
|
3
|
+
import { APPLICATION_JSON } from '../../constants/mime/application.js';
|
4
|
+
import { CONTENT_TYPE } from '../../constants/http/headers.js';
|
5
|
+
|
6
|
+
import { AbortError, TimeoutError } from '../../constants/errors/api.js';
|
7
|
+
|
8
|
+
import * as expect from '../expect/index.js';
|
9
|
+
|
10
|
+
import { toURL } from './url.js';
|
11
|
+
import { setRequestHeaders } from './headers.js';
|
12
|
+
import { waitForAndCheckResponse } from './response.js';
|
13
|
+
|
14
|
+
/**
|
15
|
+
* @callback requestHandler
|
16
|
+
* @param {AbortController} controller
|
17
|
+
* @param {( reason?: Error ) => void} abort
|
18
|
+
* @param {( delayMs: number) => void} timeout
|
19
|
+
*/
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Make GET request
|
23
|
+
*
|
24
|
+
* @param {object} _
|
25
|
+
*
|
26
|
+
* @param {string|URL} _.url - Url string or URL object
|
27
|
+
*
|
28
|
+
* @param {object} [_.urlSearchParams]
|
29
|
+
* Parameters that should be added to the request url
|
30
|
+
*
|
31
|
+
* @param {object} [_.headers]
|
32
|
+
* Object that contains custom headers. A header is a name, value pair.
|
33
|
+
*
|
34
|
+
* e.g. options.headers = { "content-type": "application/json" }
|
35
|
+
*
|
36
|
+
* @param {requestHandler} [_.requestHandler]
|
37
|
+
*
|
38
|
+
* @param {number} [_.timeoutMs]
|
39
|
+
* If defined, this request will abort after the specified number of
|
40
|
+
* milliseconds. Values above the the built-in request timeout won't work.
|
41
|
+
*
|
42
|
+
* @returns {Promise<Response>} responsePromise
|
43
|
+
*/
|
44
|
+
export async function httpGet({ url, urlSearchParams, headers, requestHandler, timeoutMs }) {
|
45
|
+
const responsePromise = httpRequest({
|
46
|
+
method: METHOD_GET,
|
47
|
+
url,
|
48
|
+
urlSearchParams,
|
49
|
+
headers,
|
50
|
+
requestHandler,
|
51
|
+
timeoutMs
|
52
|
+
});
|
53
|
+
|
54
|
+
return await waitForAndCheckResponse(responsePromise, url);
|
55
|
+
}
|
56
|
+
|
57
|
+
/**
|
58
|
+
* Make POST request
|
59
|
+
*
|
60
|
+
* @param {object} _
|
61
|
+
*
|
62
|
+
* @param {string|URL} _.url - Url string or URL object
|
63
|
+
*
|
64
|
+
* @param {any} [_.body] - POST data
|
65
|
+
*
|
66
|
+
* @param {object} [_.headers]
|
67
|
+
* Object that contains custom headers. A header is a name, value pair.
|
68
|
+
*
|
69
|
+
* e.g. options.headers = { "content-type": "application/json" }
|
70
|
+
*
|
71
|
+
* @param {requestHandler} [_.requestHandler]
|
72
|
+
*
|
73
|
+
* @param {number} [_.timeoutMs]
|
74
|
+
* If defined, this request will abort after the specified number of
|
75
|
+
* milliseconds. Values above the the built-in request timeout won't work.
|
76
|
+
*
|
77
|
+
* @returns {Promise<Response>} responsePromise
|
78
|
+
*/
|
79
|
+
export async function httpPost({ url, body = null, headers, requestHandler, timeoutMs }) {
|
80
|
+
const responsePromise = httpRequest({
|
81
|
+
method: METHOD_POST,
|
82
|
+
url,
|
83
|
+
body,
|
84
|
+
headers,
|
85
|
+
requestHandler,
|
86
|
+
timeoutMs
|
87
|
+
});
|
88
|
+
|
89
|
+
return await waitForAndCheckResponse(responsePromise, url);
|
90
|
+
}
|
91
|
+
|
92
|
+
// -----------------------------------------------------------------------------
|
93
|
+
|
94
|
+
/**
|
95
|
+
* Make an HTTP request
|
96
|
+
* - This is a low level function, consider using
|
97
|
+
* httpGet, httpPost, jsonGet or jsonPost instead
|
98
|
+
*
|
99
|
+
* @param {object} _
|
100
|
+
*
|
101
|
+
* @param {string|URL} _.url - Url string or URL object
|
102
|
+
*
|
103
|
+
* @param {string} _.method - Request method: METHOD_GET | METHOD_POST
|
104
|
+
*
|
105
|
+
* @param {object} [_.urlSearchParams] - URL search parameters as key-value pairs
|
106
|
+
*
|
107
|
+
* @param {any} [_.body] - POST data
|
108
|
+
*
|
109
|
+
* @param {object} [_.headers]
|
110
|
+
* Object that contains custom headers. A header is a name, value pair.
|
111
|
+
*
|
112
|
+
* e.g. options.headers = { "content-type": "application/json" }
|
113
|
+
*
|
114
|
+
* @param {requestHandler} [_.requestHandler]
|
115
|
+
*
|
116
|
+
* @param {number} [_.timeoutMs]
|
117
|
+
* If defined, this request will abort after the specified number of
|
118
|
+
* milliseconds. Values above the the built-in request timeout won't work.
|
119
|
+
*
|
120
|
+
* @throws TypeError - If a network error occurred
|
121
|
+
*
|
122
|
+
* @note Check the `ok` property of the resolved response to check if the
|
123
|
+
* response was successfull (e.g. in case of a 404, ok is false)
|
124
|
+
*
|
125
|
+
* @returns {Promise<Response>} responsePromise
|
126
|
+
*/
|
127
|
+
export async function httpRequest({
|
128
|
+
method,
|
129
|
+
url,
|
130
|
+
urlSearchParams = null,
|
131
|
+
body = null,
|
132
|
+
headers,
|
133
|
+
requestHandler,
|
134
|
+
timeoutMs
|
135
|
+
}) {
|
136
|
+
url = toURL(url);
|
137
|
+
|
138
|
+
// @see https://developer.mozilla.org/en-US/docs/Web/API/Headers
|
139
|
+
|
140
|
+
const requestHeaders = new Headers();
|
141
|
+
|
142
|
+
if (headers) {
|
143
|
+
setRequestHeaders(requestHeaders, headers);
|
144
|
+
|
145
|
+
if (headers[CONTENT_TYPE] === APPLICATION_JSON && typeof body !== 'string') {
|
146
|
+
throw new Error(
|
147
|
+
`Trying to send request with [content-type:${APPLICATION_JSON}], ` +
|
148
|
+
'but body is not a (JSON encoded) string.'
|
149
|
+
);
|
150
|
+
}
|
151
|
+
// IDEA: try to decode the body to catch errors on client side
|
152
|
+
}
|
153
|
+
|
154
|
+
const init = {
|
155
|
+
mode: 'cors',
|
156
|
+
cache: 'no-cache',
|
157
|
+
credentials: 'omit',
|
158
|
+
redirect: 'follow',
|
159
|
+
referrerPolicy: 'no-referrer',
|
160
|
+
headers: requestHeaders
|
161
|
+
};
|
162
|
+
|
163
|
+
// Allow search params also for other request types than GET
|
164
|
+
|
165
|
+
if (urlSearchParams) {
|
166
|
+
if (!(urlSearchParams instanceof URLSearchParams)) {
|
167
|
+
throw new Error(
|
168
|
+
'Invalid parameter [urlSearchParams] ' + '(expected instanceof URLSearchParams)'
|
169
|
+
);
|
170
|
+
}
|
171
|
+
|
172
|
+
const existingParams = url.searchParams;
|
173
|
+
|
174
|
+
for (const [name, value] of urlSearchParams.entries()) {
|
175
|
+
if (existingParams.has(name)) {
|
176
|
+
throw new Error(
|
177
|
+
`Cannot set URL search parameter [${name}] ` + `in url [${url.href}] (already set)`
|
178
|
+
);
|
179
|
+
}
|
180
|
+
|
181
|
+
existingParams.set(name, value);
|
182
|
+
} // end for
|
183
|
+
}
|
184
|
+
|
185
|
+
//
|
186
|
+
// Sort search params to make the url nicer
|
187
|
+
//
|
188
|
+
url.searchParams.sort();
|
189
|
+
|
190
|
+
// console.log( "url", url );
|
191
|
+
|
192
|
+
init.method = method;
|
193
|
+
|
194
|
+
if (METHOD_POST === method) {
|
195
|
+
init.body = body || null; /* : JSON.stringify( body ) */
|
196
|
+
}
|
197
|
+
|
198
|
+
// @see https://developer.mozilla.org/en-US/docs/Web/API/Request/Request
|
199
|
+
|
200
|
+
// console.log( "init", init );
|
201
|
+
// console.log( "headers", init.headers );
|
202
|
+
|
203
|
+
const request = new Request(url, init);
|
204
|
+
|
205
|
+
// @see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort
|
206
|
+
|
207
|
+
const controller = new AbortController();
|
208
|
+
const signal = controller.signal;
|
209
|
+
|
210
|
+
//
|
211
|
+
// A fetch() promise will reject with a TypeError when a network error
|
212
|
+
// is encountered or CORS is misconfigured on the server-side,
|
213
|
+
// although this usually means permission issues or similar
|
214
|
+
// — a 404 does not constitute a network error, for example.
|
215
|
+
// An accurate check for a successful fetch() would include checking
|
216
|
+
// that the promise resolved, then checking that the Response.ok property
|
217
|
+
// has a value of true. The code would look something like this:
|
218
|
+
//
|
219
|
+
// fetch()
|
220
|
+
// .then( () => {
|
221
|
+
// if( !response.ok ) {
|
222
|
+
// throw new Error('Network response was not OK');
|
223
|
+
// }
|
224
|
+
// ...
|
225
|
+
// }
|
226
|
+
// .catch((error) => { .. }
|
227
|
+
//
|
228
|
+
|
229
|
+
const promise = fetch(request, { signal });
|
230
|
+
|
231
|
+
if (requestHandler || timeoutMs) {
|
232
|
+
/**
|
233
|
+
* @type {(reason?: any) => void}
|
234
|
+
*/
|
235
|
+
const abort = (reason) => {
|
236
|
+
if (!reason) {
|
237
|
+
reason = new AbortError(`Request [${url.href}] aborted`);
|
238
|
+
}
|
239
|
+
|
240
|
+
controller.abort(reason);
|
241
|
+
};
|
242
|
+
|
243
|
+
/**
|
244
|
+
* Function that can be used to set a timeout on a request
|
245
|
+
*
|
246
|
+
* @param {number} delayMs
|
247
|
+
*/
|
248
|
+
const timeout = (delayMs = 10000) => {
|
249
|
+
expect.positiveNumber(delayMs, 'Invalid value for [delayMs]');
|
250
|
+
|
251
|
+
const timerId = setTimeout(() => {
|
252
|
+
controller.abort(new TimeoutError(`Request [${url.href}] timed out [${delayMs}]`));
|
253
|
+
}, delayMs);
|
254
|
+
|
255
|
+
promise.finally(() => {
|
256
|
+
clearTimeout(timerId);
|
257
|
+
});
|
258
|
+
};
|
259
|
+
|
260
|
+
if (timeoutMs) {
|
261
|
+
timeout(timeoutMs);
|
262
|
+
}
|
263
|
+
|
264
|
+
if (requestHandler) {
|
265
|
+
expect.function(requestHandler, 'Invalid parameter [requestHandler]');
|
266
|
+
|
267
|
+
requestHandler({ controller, abort, timeout });
|
268
|
+
}
|
269
|
+
}
|
270
|
+
|
271
|
+
// response promise
|
272
|
+
return promise;
|
273
|
+
}
|
package/dist/util/http/index.js
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
// import * as expect from '../expect/index.js';
|
2
|
-
|
3
|
-
// import {
|
4
|
-
// ResponseError,
|
5
|
-
// AbortError,
|
6
|
-
// TimeoutError,
|
7
|
-
// TypeOrValueError
|
8
|
-
// } from '../../constants/errors/index.js';
|
9
|
-
|
10
|
-
// import { setRequestHeaders } from './headers.js';
|
11
|
-
// import { getErrorFromResponse } from './errors.js';
|
12
|
-
|
13
|
-
export * from './headers.js';
|
14
|
-
export * from './errors.js';
|
15
|
-
export * from './url.js';
|
16
|
-
export * from './response.js';
|
17
|
-
export * from './http-request.js';
|
18
|
-
export * from './json-request.js';
|
19
|
-
|
20
|
-
// import { CONTENT_TYPE, METHOD_GET, METHOD_POST } from '../../constants/http/index.js';
|
21
|
-
|
22
|
-
// import { APPLICATION_JSON } from '../../constants/mime/index.js';
|
1
|
+
// import * as expect from '../expect/index.js';
|
2
|
+
|
3
|
+
// import {
|
4
|
+
// ResponseError,
|
5
|
+
// AbortError,
|
6
|
+
// TimeoutError,
|
7
|
+
// TypeOrValueError
|
8
|
+
// } from '../../constants/errors/index.js';
|
9
|
+
|
10
|
+
// import { setRequestHeaders } from './headers.js';
|
11
|
+
// import { getErrorFromResponse } from './errors.js';
|
12
|
+
|
13
|
+
export * from './headers.js';
|
14
|
+
export * from './errors.js';
|
15
|
+
export * from './url.js';
|
16
|
+
export * from './response.js';
|
17
|
+
export * from './http-request.js';
|
18
|
+
export * from './json-request.js';
|
19
|
+
|
20
|
+
// import { CONTENT_TYPE, METHOD_GET, METHOD_POST } from '../../constants/http/index.js';
|
21
|
+
|
22
|
+
// import { APPLICATION_JSON } from '../../constants/mime/index.js';
|