@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,377 +1,377 @@
|
|
1
|
-
/**
|
2
|
-
* Hkpromise.js
|
3
|
-
*
|
4
|
-
* @description
|
5
|
-
* HkPromise extends the default Promise class. A HkPromise offers some
|
6
|
-
* additional methods, e.g. resolve, reject and setTimeout, which makes it
|
7
|
-
* easier to use than the build in Promise class in some code constructions.
|
8
|
-
*
|
9
|
-
* @example
|
10
|
-
*
|
11
|
-
* import HkPromise from "./HkPromise.js";
|
12
|
-
*
|
13
|
-
* function() {
|
14
|
-
* const promise = new HkPromise();
|
15
|
-
*
|
16
|
-
* setTimeout( promise.resolve, 1000 );
|
17
|
-
*
|
18
|
-
* return promise;
|
19
|
-
* }
|
20
|
-
*/
|
21
|
-
|
22
|
-
/* ------------------------------------------------------------------ Imports */
|
23
|
-
|
24
|
-
import * as expect from '../../util/expect/index.js';
|
25
|
-
|
26
|
-
import { noop } from '../../util/function/index.js';
|
27
|
-
|
28
|
-
/* ---------------------------------------------------------------- Internals */
|
29
|
-
|
30
|
-
const resolved$ = Symbol('resolved');
|
31
|
-
const rejected$ = Symbol('rejected');
|
32
|
-
const pending$ = Symbol('pending');
|
33
|
-
|
34
|
-
const timeout$ = Symbol('timeout');
|
35
|
-
const cancelled$ = Symbol('cancelled');
|
36
|
-
|
37
|
-
const resolveFn$ = Symbol('resolveFn');
|
38
|
-
const rejectFn$ = Symbol('rejectFn');
|
39
|
-
|
40
|
-
const timeoutTimer$ = Symbol('timeoutTimer');
|
41
|
-
|
42
|
-
const hasThen$ = Symbol('hasThen');
|
43
|
-
|
44
|
-
/* ------------------------------------------------------------------- Export */
|
45
|
-
|
46
|
-
/**
|
47
|
-
* HkPromise extends the default javascript Promise class
|
48
|
-
* - Exposes methods to interact with the state of the
|
49
|
-
* promise, such as 'resolve' and 'reject'
|
50
|
-
*/
|
51
|
-
export default class HkPromise extends Promise {
|
52
|
-
// > TODO: convert to JS private properties
|
53
|
-
// #resolveFn
|
54
|
-
// #rejectFn
|
55
|
-
// #pending
|
56
|
-
// #resolved
|
57
|
-
// #rejected
|
58
|
-
// #cancelled
|
59
|
-
// #timeout
|
60
|
-
// #timeoutTimer
|
61
|
-
// #hasThen
|
62
|
-
|
63
|
-
/**
|
64
|
-
* @param {()=>void} [initFn]
|
65
|
-
*/
|
66
|
-
constructor(initFn) {
|
67
|
-
let _resolveFn;
|
68
|
-
let _rejectFn;
|
69
|
-
|
70
|
-
super((resolveFn, rejectFn) => {
|
71
|
-
//
|
72
|
-
// @note if initFn cannot be called an exception will be thrown:
|
73
|
-
// TypeError: Promise resolve or reject function is not callable
|
74
|
-
//
|
75
|
-
if (initFn) {
|
76
|
-
initFn(resolveFn, rejectFn);
|
77
|
-
}
|
78
|
-
|
79
|
-
_resolveFn = resolveFn;
|
80
|
-
_rejectFn = rejectFn;
|
81
|
-
});
|
82
|
-
|
83
|
-
// @note some values are not initialized on purpose,
|
84
|
-
// to save time during promise creation
|
85
|
-
|
86
|
-
this[resolveFn$] = _resolveFn;
|
87
|
-
this[rejectFn$] = _rejectFn;
|
88
|
-
|
89
|
-
// this[ resolved$ ] = false;
|
90
|
-
// this[ rejected$ ] = false;
|
91
|
-
|
92
|
-
this[pending$] = true;
|
93
|
-
|
94
|
-
// this[ cancelled$ ] = false;
|
95
|
-
// this[ timeout$ ] = false;
|
96
|
-
|
97
|
-
// this[ timeoutTimer$ ] = undefined;
|
98
|
-
}
|
99
|
-
|
100
|
-
/**
|
101
|
-
* Get value of property [resolved]
|
102
|
-
*
|
103
|
-
* @returns {boolean} true if the promise has been resolved
|
104
|
-
*/
|
105
|
-
get resolved() {
|
106
|
-
return this[resolved$] ? true : false;
|
107
|
-
}
|
108
|
-
|
109
|
-
/**
|
110
|
-
* Get value of property [rejected]
|
111
|
-
*
|
112
|
-
* @returns {boolean} true if the promise was rejected
|
113
|
-
*/
|
114
|
-
get rejected() {
|
115
|
-
return this[rejected$] ? true : false;
|
116
|
-
}
|
117
|
-
|
118
|
-
/**
|
119
|
-
* Get value of property [pending]
|
120
|
-
*
|
121
|
-
* @returns {boolean} true if the promise is still pending
|
122
|
-
*/
|
123
|
-
get pending() {
|
124
|
-
return this[pending$];
|
125
|
-
}
|
126
|
-
|
127
|
-
/**
|
128
|
-
* Get value of property [cancelled]
|
129
|
-
*
|
130
|
-
* @returns {boolean} true if the promise was cancelled
|
131
|
-
*/
|
132
|
-
get cancelled() {
|
133
|
-
return this[cancelled$] ? true : false;
|
134
|
-
}
|
135
|
-
|
136
|
-
/**
|
137
|
-
* Get value of property [timeout]
|
138
|
-
*
|
139
|
-
* @returns {boolean} true if the promise was cancelled due to a timeout
|
140
|
-
*/
|
141
|
-
get timeout() {
|
142
|
-
return this[timeout$] ? true : false;
|
143
|
-
}
|
144
|
-
|
145
|
-
/**
|
146
|
-
* Resolve the promise
|
147
|
-
*
|
148
|
-
* @param {any} [value] - Value to pass to the "then" callbacks
|
149
|
-
*
|
150
|
-
* @returns {object} this
|
151
|
-
*/
|
152
|
-
resolve(/* value */) {
|
153
|
-
// -- Check current Promise state
|
154
|
-
|
155
|
-
if (!this[pending$]) {
|
156
|
-
if (this[resolved$]) {
|
157
|
-
throw new Error('Cannot resolve Promise. Promise has already resolved');
|
158
|
-
} else {
|
159
|
-
throw new Error('Cannot resolve Promise. Promise has already been rejected');
|
160
|
-
}
|
161
|
-
}
|
162
|
-
|
163
|
-
// -- Clear timeout timer (if any)
|
164
|
-
|
165
|
-
if (undefined !== this[timeoutTimer$]) {
|
166
|
-
clearTimeout(this[timeoutTimer$]);
|
167
|
-
|
168
|
-
this[timeoutTimer$] = undefined;
|
169
|
-
}
|
170
|
-
|
171
|
-
// -- Set flags and call resolve function
|
172
|
-
|
173
|
-
this[resolved$] = true;
|
174
|
-
this[pending$] = false;
|
175
|
-
|
176
|
-
this[resolveFn$](...arguments);
|
177
|
-
|
178
|
-
return this;
|
179
|
-
}
|
180
|
-
|
181
|
-
// -------------------------------------------------------------------- Method
|
182
|
-
|
183
|
-
/**
|
184
|
-
* Resolve the promise if the promise is still pending
|
185
|
-
*
|
186
|
-
* @param {any} [value] - Value to pass to the "catch" callbacks
|
187
|
-
*
|
188
|
-
* @returns {object} this
|
189
|
-
*/
|
190
|
-
tryResolve(/* value */) {
|
191
|
-
if (this[pending$]) {
|
192
|
-
this.resolve(...arguments);
|
193
|
-
}
|
194
|
-
|
195
|
-
return this;
|
196
|
-
}
|
197
|
-
|
198
|
-
/**
|
199
|
-
* Reject the promise
|
200
|
-
*
|
201
|
-
* @param {Object} [errorOrInfo]
|
202
|
-
* Object to pass to the "catch" callbacks, usually an Error object
|
203
|
-
*
|
204
|
-
* @returns {object} this
|
205
|
-
*/
|
206
|
-
reject(/* errorOrInfo */) {
|
207
|
-
if (!this[hasThen$]) {
|
208
|
-
//
|
209
|
-
// No then (or await) has been used
|
210
|
-
// add catch to prevent useless unhandled promise rejection
|
211
|
-
//
|
212
|
-
this.catch(noop);
|
213
|
-
}
|
214
|
-
|
215
|
-
// -- Check current Promise state
|
216
|
-
|
217
|
-
if (!this[pending$]) {
|
218
|
-
if (this[resolved$]) {
|
219
|
-
throw new Error('Cannot reject Promise. Promise has already resolved');
|
220
|
-
} else {
|
221
|
-
throw new Error('Cannot reject Promise. Promise has already been rejected');
|
222
|
-
}
|
223
|
-
}
|
224
|
-
|
225
|
-
// -- Clear timeout timer (if any)
|
226
|
-
|
227
|
-
if (undefined !== this[timeoutTimer$]) {
|
228
|
-
clearTimeout(this[timeoutTimer$]);
|
229
|
-
|
230
|
-
this[timeoutTimer$] = undefined;
|
231
|
-
}
|
232
|
-
|
233
|
-
// -- Set flags and call reject function
|
234
|
-
|
235
|
-
this[rejected$] = true;
|
236
|
-
this[pending$] = false;
|
237
|
-
|
238
|
-
this[rejectFn$](...arguments);
|
239
|
-
|
240
|
-
return this;
|
241
|
-
}
|
242
|
-
|
243
|
-
/**
|
244
|
-
* Reject the promise if the promise is still pending
|
245
|
-
*
|
246
|
-
* @param {Object} [errorOrInfo]
|
247
|
-
* Object to pass to the "catch" callbacks, usually an Error object
|
248
|
-
*
|
249
|
-
* @returns {object} this
|
250
|
-
*/
|
251
|
-
tryReject(/* errorOrInfo */) {
|
252
|
-
if (this[pending$]) {
|
253
|
-
this.reject(...arguments);
|
254
|
-
}
|
255
|
-
|
256
|
-
return this;
|
257
|
-
}
|
258
|
-
|
259
|
-
/**
|
260
|
-
* Reject the promise and set this.cancelled=true
|
261
|
-
*
|
262
|
-
* @param {Object} [errorOrInfo]
|
263
|
-
* Object to pass to the "catch" callbacks, usually an Error object
|
264
|
-
*
|
265
|
-
* @returns {object} this
|
266
|
-
*/
|
267
|
-
cancel(errorOrInfo) {
|
268
|
-
if (errorOrInfo) {
|
269
|
-
if (!(errorOrInfo instanceof Object)) {
|
270
|
-
throw new Error('Invalid parameter [errorOrInfo] (expected (error) object');
|
271
|
-
}
|
272
|
-
} else {
|
273
|
-
errorOrInfo = new Error('Cancelled');
|
274
|
-
}
|
275
|
-
|
276
|
-
errorOrInfo.cancelled = true;
|
277
|
-
|
278
|
-
this[cancelled$] = true;
|
279
|
-
this.reject(...arguments);
|
280
|
-
|
281
|
-
return this;
|
282
|
-
}
|
283
|
-
|
284
|
-
/**
|
285
|
-
* Reject the promise and set this.cancelled=true
|
286
|
-
*
|
287
|
-
* @param {Object} [errorOrInfo]
|
288
|
-
* Object to pass to the "catch" callbacks, usually an Error object
|
289
|
-
*
|
290
|
-
* @returns {object} this
|
291
|
-
*/
|
292
|
-
tryCancel(/*errorOrInfo*/) {
|
293
|
-
if (this[pending$]) {
|
294
|
-
this.cancel(...arguments);
|
295
|
-
}
|
296
|
-
|
297
|
-
return this;
|
298
|
-
}
|
299
|
-
|
300
|
-
/**
|
301
|
-
* Specify the number of milliseconds until the promise should time out.
|
302
|
-
* - When a timeout occurs: the promise is cancelled and the following
|
303
|
-
* properties are both set
|
304
|
-
*
|
305
|
-
* this.timeout=true
|
306
|
-
* this.cancelled=true
|
307
|
-
*
|
308
|
-
* @param {number} ms
|
309
|
-
* Number of milliseconds after which the promise should time out
|
310
|
-
*
|
311
|
-
* @param {string} [message="Timeout"]
|
312
|
-
* Message of the error that will be thrown when the timeout occurs
|
313
|
-
*/
|
314
|
-
setTimeout(ms, message = 'Timeout') {
|
315
|
-
expect.number(ms);
|
316
|
-
expect.string(message);
|
317
|
-
|
318
|
-
// -- Check current Promise state
|
319
|
-
|
320
|
-
if (!this[pending$]) {
|
321
|
-
if (this[resolved$]) {
|
322
|
-
throw new Error('Cannot set timeout. Promise has already resolved');
|
323
|
-
} else {
|
324
|
-
throw new Error('Cannot set timeout. Promise has already been rejected');
|
325
|
-
}
|
326
|
-
}
|
327
|
-
|
328
|
-
// -- Clear existing timeout (if any)
|
329
|
-
|
330
|
-
if (undefined !== this[timeoutTimer$]) {
|
331
|
-
clearTimeout(this[timeoutTimer$]);
|
332
|
-
}
|
333
|
-
|
334
|
-
// -- Set timeout
|
335
|
-
|
336
|
-
const err = new Error(message);
|
337
|
-
|
338
|
-
this[timeoutTimer$] = setTimeout(() => {
|
339
|
-
if (!this[pending$]) {
|
340
|
-
// Promise has already been resolved (should not happen)
|
341
|
-
return;
|
342
|
-
}
|
343
|
-
|
344
|
-
this[timeout$] = true;
|
345
|
-
this[cancelled$] = true;
|
346
|
-
|
347
|
-
err.timeout = true;
|
348
|
-
err.cancelled = true;
|
349
|
-
|
350
|
-
this.reject(err);
|
351
|
-
}, ms);
|
352
|
-
|
353
|
-
// return this -> chainable method
|
354
|
-
return this;
|
355
|
-
}
|
356
|
-
|
357
|
-
/**
|
358
|
-
* Register a callback that is called when the promise resolves
|
359
|
-
*
|
360
|
-
* @param {function} callback
|
361
|
-
*/
|
362
|
-
then(/* callback */) {
|
363
|
-
this[hasThen$] = true;
|
364
|
-
|
365
|
-
return super.then(...arguments);
|
366
|
-
}
|
367
|
-
|
368
|
-
/**
|
369
|
-
* Register a callback that is called when the promise rejects, is
|
370
|
-
* cancelled or times out
|
371
|
-
*
|
372
|
-
* @param {function} callback
|
373
|
-
*/
|
374
|
-
catch(/* callback */) {
|
375
|
-
return super.catch(...arguments);
|
376
|
-
}
|
377
|
-
} // end class
|
1
|
+
/**
|
2
|
+
* Hkpromise.js
|
3
|
+
*
|
4
|
+
* @description
|
5
|
+
* HkPromise extends the default Promise class. A HkPromise offers some
|
6
|
+
* additional methods, e.g. resolve, reject and setTimeout, which makes it
|
7
|
+
* easier to use than the build in Promise class in some code constructions.
|
8
|
+
*
|
9
|
+
* @example
|
10
|
+
*
|
11
|
+
* import HkPromise from "./HkPromise.js";
|
12
|
+
*
|
13
|
+
* function() {
|
14
|
+
* const promise = new HkPromise();
|
15
|
+
*
|
16
|
+
* setTimeout( promise.resolve, 1000 );
|
17
|
+
*
|
18
|
+
* return promise;
|
19
|
+
* }
|
20
|
+
*/
|
21
|
+
|
22
|
+
/* ------------------------------------------------------------------ Imports */
|
23
|
+
|
24
|
+
import * as expect from '../../util/expect/index.js';
|
25
|
+
|
26
|
+
import { noop } from '../../util/function/index.js';
|
27
|
+
|
28
|
+
/* ---------------------------------------------------------------- Internals */
|
29
|
+
|
30
|
+
const resolved$ = Symbol('resolved');
|
31
|
+
const rejected$ = Symbol('rejected');
|
32
|
+
const pending$ = Symbol('pending');
|
33
|
+
|
34
|
+
const timeout$ = Symbol('timeout');
|
35
|
+
const cancelled$ = Symbol('cancelled');
|
36
|
+
|
37
|
+
const resolveFn$ = Symbol('resolveFn');
|
38
|
+
const rejectFn$ = Symbol('rejectFn');
|
39
|
+
|
40
|
+
const timeoutTimer$ = Symbol('timeoutTimer');
|
41
|
+
|
42
|
+
const hasThen$ = Symbol('hasThen');
|
43
|
+
|
44
|
+
/* ------------------------------------------------------------------- Export */
|
45
|
+
|
46
|
+
/**
|
47
|
+
* HkPromise extends the default javascript Promise class
|
48
|
+
* - Exposes methods to interact with the state of the
|
49
|
+
* promise, such as 'resolve' and 'reject'
|
50
|
+
*/
|
51
|
+
export default class HkPromise extends Promise {
|
52
|
+
// > TODO: convert to JS private properties
|
53
|
+
// #resolveFn
|
54
|
+
// #rejectFn
|
55
|
+
// #pending
|
56
|
+
// #resolved
|
57
|
+
// #rejected
|
58
|
+
// #cancelled
|
59
|
+
// #timeout
|
60
|
+
// #timeoutTimer
|
61
|
+
// #hasThen
|
62
|
+
|
63
|
+
/**
|
64
|
+
* @param {()=>void} [initFn]
|
65
|
+
*/
|
66
|
+
constructor(initFn) {
|
67
|
+
let _resolveFn;
|
68
|
+
let _rejectFn;
|
69
|
+
|
70
|
+
super((resolveFn, rejectFn) => {
|
71
|
+
//
|
72
|
+
// @note if initFn cannot be called an exception will be thrown:
|
73
|
+
// TypeError: Promise resolve or reject function is not callable
|
74
|
+
//
|
75
|
+
if (initFn) {
|
76
|
+
initFn(resolveFn, rejectFn);
|
77
|
+
}
|
78
|
+
|
79
|
+
_resolveFn = resolveFn;
|
80
|
+
_rejectFn = rejectFn;
|
81
|
+
});
|
82
|
+
|
83
|
+
// @note some values are not initialized on purpose,
|
84
|
+
// to save time during promise creation
|
85
|
+
|
86
|
+
this[resolveFn$] = _resolveFn;
|
87
|
+
this[rejectFn$] = _rejectFn;
|
88
|
+
|
89
|
+
// this[ resolved$ ] = false;
|
90
|
+
// this[ rejected$ ] = false;
|
91
|
+
|
92
|
+
this[pending$] = true;
|
93
|
+
|
94
|
+
// this[ cancelled$ ] = false;
|
95
|
+
// this[ timeout$ ] = false;
|
96
|
+
|
97
|
+
// this[ timeoutTimer$ ] = undefined;
|
98
|
+
}
|
99
|
+
|
100
|
+
/**
|
101
|
+
* Get value of property [resolved]
|
102
|
+
*
|
103
|
+
* @returns {boolean} true if the promise has been resolved
|
104
|
+
*/
|
105
|
+
get resolved() {
|
106
|
+
return this[resolved$] ? true : false;
|
107
|
+
}
|
108
|
+
|
109
|
+
/**
|
110
|
+
* Get value of property [rejected]
|
111
|
+
*
|
112
|
+
* @returns {boolean} true if the promise was rejected
|
113
|
+
*/
|
114
|
+
get rejected() {
|
115
|
+
return this[rejected$] ? true : false;
|
116
|
+
}
|
117
|
+
|
118
|
+
/**
|
119
|
+
* Get value of property [pending]
|
120
|
+
*
|
121
|
+
* @returns {boolean} true if the promise is still pending
|
122
|
+
*/
|
123
|
+
get pending() {
|
124
|
+
return this[pending$];
|
125
|
+
}
|
126
|
+
|
127
|
+
/**
|
128
|
+
* Get value of property [cancelled]
|
129
|
+
*
|
130
|
+
* @returns {boolean} true if the promise was cancelled
|
131
|
+
*/
|
132
|
+
get cancelled() {
|
133
|
+
return this[cancelled$] ? true : false;
|
134
|
+
}
|
135
|
+
|
136
|
+
/**
|
137
|
+
* Get value of property [timeout]
|
138
|
+
*
|
139
|
+
* @returns {boolean} true if the promise was cancelled due to a timeout
|
140
|
+
*/
|
141
|
+
get timeout() {
|
142
|
+
return this[timeout$] ? true : false;
|
143
|
+
}
|
144
|
+
|
145
|
+
/**
|
146
|
+
* Resolve the promise
|
147
|
+
*
|
148
|
+
* @param {any} [value] - Value to pass to the "then" callbacks
|
149
|
+
*
|
150
|
+
* @returns {object} this
|
151
|
+
*/
|
152
|
+
resolve(/* value */) {
|
153
|
+
// -- Check current Promise state
|
154
|
+
|
155
|
+
if (!this[pending$]) {
|
156
|
+
if (this[resolved$]) {
|
157
|
+
throw new Error('Cannot resolve Promise. Promise has already resolved');
|
158
|
+
} else {
|
159
|
+
throw new Error('Cannot resolve Promise. Promise has already been rejected');
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
// -- Clear timeout timer (if any)
|
164
|
+
|
165
|
+
if (undefined !== this[timeoutTimer$]) {
|
166
|
+
clearTimeout(this[timeoutTimer$]);
|
167
|
+
|
168
|
+
this[timeoutTimer$] = undefined;
|
169
|
+
}
|
170
|
+
|
171
|
+
// -- Set flags and call resolve function
|
172
|
+
|
173
|
+
this[resolved$] = true;
|
174
|
+
this[pending$] = false;
|
175
|
+
|
176
|
+
this[resolveFn$](...arguments);
|
177
|
+
|
178
|
+
return this;
|
179
|
+
}
|
180
|
+
|
181
|
+
// -------------------------------------------------------------------- Method
|
182
|
+
|
183
|
+
/**
|
184
|
+
* Resolve the promise if the promise is still pending
|
185
|
+
*
|
186
|
+
* @param {any} [value] - Value to pass to the "catch" callbacks
|
187
|
+
*
|
188
|
+
* @returns {object} this
|
189
|
+
*/
|
190
|
+
tryResolve(/* value */) {
|
191
|
+
if (this[pending$]) {
|
192
|
+
this.resolve(...arguments);
|
193
|
+
}
|
194
|
+
|
195
|
+
return this;
|
196
|
+
}
|
197
|
+
|
198
|
+
/**
|
199
|
+
* Reject the promise
|
200
|
+
*
|
201
|
+
* @param {Object} [errorOrInfo]
|
202
|
+
* Object to pass to the "catch" callbacks, usually an Error object
|
203
|
+
*
|
204
|
+
* @returns {object} this
|
205
|
+
*/
|
206
|
+
reject(/* errorOrInfo */) {
|
207
|
+
if (!this[hasThen$]) {
|
208
|
+
//
|
209
|
+
// No then (or await) has been used
|
210
|
+
// add catch to prevent useless unhandled promise rejection
|
211
|
+
//
|
212
|
+
this.catch(noop);
|
213
|
+
}
|
214
|
+
|
215
|
+
// -- Check current Promise state
|
216
|
+
|
217
|
+
if (!this[pending$]) {
|
218
|
+
if (this[resolved$]) {
|
219
|
+
throw new Error('Cannot reject Promise. Promise has already resolved');
|
220
|
+
} else {
|
221
|
+
throw new Error('Cannot reject Promise. Promise has already been rejected');
|
222
|
+
}
|
223
|
+
}
|
224
|
+
|
225
|
+
// -- Clear timeout timer (if any)
|
226
|
+
|
227
|
+
if (undefined !== this[timeoutTimer$]) {
|
228
|
+
clearTimeout(this[timeoutTimer$]);
|
229
|
+
|
230
|
+
this[timeoutTimer$] = undefined;
|
231
|
+
}
|
232
|
+
|
233
|
+
// -- Set flags and call reject function
|
234
|
+
|
235
|
+
this[rejected$] = true;
|
236
|
+
this[pending$] = false;
|
237
|
+
|
238
|
+
this[rejectFn$](...arguments);
|
239
|
+
|
240
|
+
return this;
|
241
|
+
}
|
242
|
+
|
243
|
+
/**
|
244
|
+
* Reject the promise if the promise is still pending
|
245
|
+
*
|
246
|
+
* @param {Object} [errorOrInfo]
|
247
|
+
* Object to pass to the "catch" callbacks, usually an Error object
|
248
|
+
*
|
249
|
+
* @returns {object} this
|
250
|
+
*/
|
251
|
+
tryReject(/* errorOrInfo */) {
|
252
|
+
if (this[pending$]) {
|
253
|
+
this.reject(...arguments);
|
254
|
+
}
|
255
|
+
|
256
|
+
return this;
|
257
|
+
}
|
258
|
+
|
259
|
+
/**
|
260
|
+
* Reject the promise and set this.cancelled=true
|
261
|
+
*
|
262
|
+
* @param {Object} [errorOrInfo]
|
263
|
+
* Object to pass to the "catch" callbacks, usually an Error object
|
264
|
+
*
|
265
|
+
* @returns {object} this
|
266
|
+
*/
|
267
|
+
cancel(errorOrInfo) {
|
268
|
+
if (errorOrInfo) {
|
269
|
+
if (!(errorOrInfo instanceof Object)) {
|
270
|
+
throw new Error('Invalid parameter [errorOrInfo] (expected (error) object');
|
271
|
+
}
|
272
|
+
} else {
|
273
|
+
errorOrInfo = new Error('Cancelled');
|
274
|
+
}
|
275
|
+
|
276
|
+
errorOrInfo.cancelled = true;
|
277
|
+
|
278
|
+
this[cancelled$] = true;
|
279
|
+
this.reject(...arguments);
|
280
|
+
|
281
|
+
return this;
|
282
|
+
}
|
283
|
+
|
284
|
+
/**
|
285
|
+
* Reject the promise and set this.cancelled=true
|
286
|
+
*
|
287
|
+
* @param {Object} [errorOrInfo]
|
288
|
+
* Object to pass to the "catch" callbacks, usually an Error object
|
289
|
+
*
|
290
|
+
* @returns {object} this
|
291
|
+
*/
|
292
|
+
tryCancel(/*errorOrInfo*/) {
|
293
|
+
if (this[pending$]) {
|
294
|
+
this.cancel(...arguments);
|
295
|
+
}
|
296
|
+
|
297
|
+
return this;
|
298
|
+
}
|
299
|
+
|
300
|
+
/**
|
301
|
+
* Specify the number of milliseconds until the promise should time out.
|
302
|
+
* - When a timeout occurs: the promise is cancelled and the following
|
303
|
+
* properties are both set
|
304
|
+
*
|
305
|
+
* this.timeout=true
|
306
|
+
* this.cancelled=true
|
307
|
+
*
|
308
|
+
* @param {number} ms
|
309
|
+
* Number of milliseconds after which the promise should time out
|
310
|
+
*
|
311
|
+
* @param {string} [message="Timeout"]
|
312
|
+
* Message of the error that will be thrown when the timeout occurs
|
313
|
+
*/
|
314
|
+
setTimeout(ms, message = 'Timeout') {
|
315
|
+
expect.number(ms);
|
316
|
+
expect.string(message);
|
317
|
+
|
318
|
+
// -- Check current Promise state
|
319
|
+
|
320
|
+
if (!this[pending$]) {
|
321
|
+
if (this[resolved$]) {
|
322
|
+
throw new Error('Cannot set timeout. Promise has already resolved');
|
323
|
+
} else {
|
324
|
+
throw new Error('Cannot set timeout. Promise has already been rejected');
|
325
|
+
}
|
326
|
+
}
|
327
|
+
|
328
|
+
// -- Clear existing timeout (if any)
|
329
|
+
|
330
|
+
if (undefined !== this[timeoutTimer$]) {
|
331
|
+
clearTimeout(this[timeoutTimer$]);
|
332
|
+
}
|
333
|
+
|
334
|
+
// -- Set timeout
|
335
|
+
|
336
|
+
const err = new Error(message);
|
337
|
+
|
338
|
+
this[timeoutTimer$] = setTimeout(() => {
|
339
|
+
if (!this[pending$]) {
|
340
|
+
// Promise has already been resolved (should not happen)
|
341
|
+
return;
|
342
|
+
}
|
343
|
+
|
344
|
+
this[timeout$] = true;
|
345
|
+
this[cancelled$] = true;
|
346
|
+
|
347
|
+
err.timeout = true;
|
348
|
+
err.cancelled = true;
|
349
|
+
|
350
|
+
this.reject(err);
|
351
|
+
}, ms);
|
352
|
+
|
353
|
+
// return this -> chainable method
|
354
|
+
return this;
|
355
|
+
}
|
356
|
+
|
357
|
+
/**
|
358
|
+
* Register a callback that is called when the promise resolves
|
359
|
+
*
|
360
|
+
* @param {function} callback
|
361
|
+
*/
|
362
|
+
then(/* callback */) {
|
363
|
+
this[hasThen$] = true;
|
364
|
+
|
365
|
+
return super.then(...arguments);
|
366
|
+
}
|
367
|
+
|
368
|
+
/**
|
369
|
+
* Register a callback that is called when the promise rejects, is
|
370
|
+
* cancelled or times out
|
371
|
+
*
|
372
|
+
* @param {function} callback
|
373
|
+
*/
|
374
|
+
catch(/* callback */) {
|
375
|
+
return super.catch(...arguments);
|
376
|
+
}
|
377
|
+
} // end class
|