@hkdigital/lib-core 0.3.11 → 0.3.13
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 +173 -149
- package/dist/assets/autospuiten/car-paint-picker.js +41 -41
- package/dist/assets/autospuiten/labels.js +7 -7
- package/dist/classes/data/IterableTree.js +242 -242
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/data/typedef.js +9 -9
- package/dist/classes/event-emitter/EventEmitter.js +273 -273
- package/dist/classes/event-emitter/index.js +2 -2
- package/dist/classes/index.js +4 -4
- package/dist/classes/promise/HkPromise.js +384 -384
- 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 +111 -111
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/finite-state-machine/index.js +1 -1
- package/dist/classes/svelte/index.js +1 -11
- 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/config/README.md +197 -196
- package/dist/config/generators/imagetools.js +189 -189
- package/dist/config/generators/vite.js +148 -142
- package/dist/config/imagetools.d.ts +72 -72
- package/dist/config/vite.js +4 -4
- package/dist/constants/bases/index.js +13 -13
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +14 -14
- package/dist/constants/index.js +6 -6
- 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/README.md +96 -95
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.d.ts +4 -4
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/url.js +3 -3
- package/dist/constants/regexp/user.js +29 -29
- package/dist/constants/states/drag.js +6 -6
- package/dist/constants/states/drop.js +6 -6
- package/dist/constants/states/index.js +4 -4
- package/dist/constants/states/input.js +11 -11
- package/dist/constants/states/submit.js +4 -4
- package/dist/constants/time/index.js +28 -28
- package/dist/css/utilities.css +43 -43
- package/dist/design/README.md +405 -405
- package/dist/design/config/design-config.js +73 -73
- package/dist/design/generators/index.js +288 -288
- package/dist/design/index.js +96 -96
- package/dist/design/plugins/skeleton.js +208 -208
- package/dist/design/tailwind-theme-extend.js +158 -158
- package/dist/design/themes/README.md +102 -102
- package/dist/design/themes/hkdev/components/blocks/text-block.css +34 -34
- package/dist/design/themes/hkdev/components/boxes/game-box.css +11 -11
- package/dist/design/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
- package/dist/design/themes/hkdev/components/buttons/button-text.css +32 -32
- package/dist/design/themes/hkdev/components/buttons/button.css +146 -146
- package/dist/design/themes/hkdev/components/buttons/skip-button.css +5 -5
- package/dist/design/themes/hkdev/components/drag-drop/draggable.css +73 -73
- package/dist/design/themes/hkdev/components/drag-drop/drop-zone.css +58 -58
- package/dist/design/themes/hkdev/components/icons/icon-steeze.css +15 -15
- package/dist/design/themes/hkdev/components/inputs/text-input.css +102 -102
- package/dist/design/themes/hkdev/components/panels/panel.css +25 -25
- package/dist/design/themes/hkdev/components/rows/panel-grid-row.css +4 -4
- package/dist/design/themes/hkdev/components/rows/panel-row-2.css +5 -5
- package/dist/design/themes/hkdev/components.css +29 -29
- package/dist/design/themes/hkdev/debug.css +1 -1
- package/dist/design/themes/hkdev/global/layout.css +32 -32
- package/dist/design/themes/hkdev/global/on-colors.css +32 -32
- package/dist/design/themes/hkdev/globals.css +3 -3
- package/dist/design/themes/hkdev/responsive.css +12 -12
- package/dist/design/themes/hkdev/theme-ext.js +12 -12
- package/dist/design/themes/hkdev/theme.css +218 -218
- package/dist/design/utils/clamp.js +66 -66
- package/dist/design/utils/root-vars.js +102 -102
- package/dist/design/utils/scaling.js +228 -228
- package/dist/design/utils/states.js +22 -22
- package/dist/errors/api.js +9 -9
- package/dist/errors/generic.js +20 -20
- package/dist/errors/http.js +16 -16
- package/dist/errors/index.js +5 -5
- package/dist/errors/jwt.js +5 -5
- package/dist/errors/promise.js +25 -25
- package/dist/logging/README.md +158 -0
- package/dist/logging/index.d.ts +3 -1
- package/dist/logging/index.js +11 -7
- package/dist/logging/internal/adapters/console.js +114 -114
- package/dist/logging/internal/adapters/index.js +2 -2
- package/dist/logging/internal/adapters/pino.js +160 -142
- package/dist/logging/internal/adapters/typedef.js +10 -10
- package/dist/logging/internal/{unified-logger/constants.js → constants.js} +22 -22
- package/dist/logging/internal/factories/client.d.ts +1 -1
- package/dist/logging/internal/factories/client.js +21 -21
- package/dist/logging/internal/factories/server.d.ts +1 -1
- package/dist/logging/internal/factories/server.js +22 -22
- package/dist/logging/internal/factories/universal.d.ts +2 -2
- package/dist/logging/internal/factories/universal.js +22 -22
- package/dist/logging/internal/{unified-logger → logger}/Logger.d.ts +2 -2
- package/dist/logging/internal/{unified-logger → logger}/Logger.js +217 -217
- package/dist/logging/internal/logger/index.d.ts +1 -0
- package/dist/logging/internal/logger/index.js +1 -0
- package/dist/logging/internal/{unified-logger/typedef.d.ts → typedef.d.ts} +2 -1
- package/dist/logging/internal/{unified-logger/typedef.js → typedef.js} +21 -17
- package/dist/network/README.md +172 -172
- package/dist/network/cache/IndexedDbCache.js +1407 -1407
- package/dist/network/cache/MemoryResponseCache.js +138 -138
- package/dist/network/cache/index.js +5 -5
- package/dist/network/cache/typedef.js +41 -41
- package/dist/network/cache.js +3 -3
- package/dist/network/http/caching.js +261 -261
- package/dist/network/http/errors.js +97 -97
- package/dist/network/http/headers.js +75 -75
- package/dist/network/http/http-request.js +578 -578
- package/dist/network/http/index.js +22 -22
- package/dist/network/http/json-request.js +224 -224
- package/dist/network/http/mocks.js +65 -65
- package/dist/network/http/response.js +318 -318
- package/dist/network/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
- package/dist/network/http/typedef.js +93 -93
- package/dist/network/http/url.js +52 -52
- package/dist/network/http.js +5 -5
- package/dist/network/loaders/README.md +254 -254
- package/dist/network/loaders/audio/AudioLoader.svelte.js +58 -58
- package/dist/network/loaders/audio/AudioScene.svelte.js +324 -324
- package/dist/network/loaders/audio/mocks.js +35 -35
- package/dist/network/loaders/audio.js +1 -1
- package/dist/network/loaders/image/ImageLoader.svelte.js +44 -44
- package/dist/network/loaders/image/ImageScene.svelte.js +248 -248
- package/dist/network/loaders/image/ImageVariantsLoader.svelte.js +150 -150
- package/dist/network/loaders/image/index.js +4 -4
- package/dist/network/loaders/image/mocks.js +35 -35
- package/dist/network/loaders/image/typedef.js +8 -8
- package/dist/network/loaders/image/utils/index.js +86 -86
- package/dist/network/loaders/image.js +7 -7
- package/dist/network/loaders/typedef.js +38 -38
- package/dist/network/loaders.js +2 -2
- package/dist/network/states/NetworkLoader.svelte.js +338 -338
- package/dist/network/states/constants.js +3 -3
- package/dist/network/states/index.js +3 -3
- package/dist/network/states/mocks.js +30 -30
- package/dist/network/states/typedef.js +8 -8
- package/dist/network/typedef.js +9 -9
- package/dist/services/README.md +200 -0
- package/dist/services/index.d.ts +6 -1
- package/dist/services/index.js +8 -1
- package/dist/services/{internal/service-base → service-base}/ServiceBase.d.ts +2 -2
- package/dist/services/{internal/service-base → service-base}/ServiceBase.js +462 -462
- package/dist/services/{internal/service-base → service-base}/constants.d.ts +0 -12
- package/dist/services/{internal/service-base → service-base}/constants.js +98 -110
- package/dist/services/{internal/service-base → service-base}/index.js +3 -3
- package/dist/services/{internal/service-base → service-base}/typedef.d.ts +1 -1
- package/dist/services/{internal/service-base → service-base}/typedef.js +101 -101
- package/dist/services/{internal/service-manager → service-manager}/ServiceManager.d.ts +2 -2
- package/dist/services/{internal/service-manager → service-manager}/ServiceManager.js +608 -608
- package/dist/services/{internal/service-manager → service-manager}/constants.js +6 -6
- package/dist/services/{internal/service-manager → service-manager}/typedef.js +90 -90
- 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/typedef/context.js +6 -6
- package/dist/typedef/drag.js +25 -25
- package/dist/typedef/drop.js +12 -12
- package/dist/typedef/index.d.ts +1 -0
- package/dist/typedef/index.js +4 -4
- package/dist/ui/components/button-group/ButtonGroup.svelte +82 -82
- package/dist/ui/components/button-group/typedef.js +10 -10
- package/dist/ui/components/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/ui/components/compare-left-right/index.js +1 -1
- package/dist/ui/components/game-box/GameBox.svelte +577 -577
- package/dist/ui/components/game-box/gamebox.util.js +83 -83
- package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/ui/components/hk-app-layout/HkAppLayout.svelte +251 -251
- package/dist/ui/components/image-box/ImageBox.svelte +210 -210
- package/dist/ui/components/image-box/index.js +5 -5
- package/dist/ui/components/image-box/typedef.js +32 -32
- package/dist/ui/components/index.js +23 -23
- package/dist/ui/components/presenter/ImageSlide.svelte +64 -64
- package/dist/ui/components/presenter/Presenter.state.svelte.js +638 -638
- package/dist/ui/components/presenter/Presenter.svelte +142 -142
- package/dist/ui/components/presenter/constants.js +7 -7
- package/dist/ui/components/presenter/index.js +10 -10
- package/dist/ui/components/presenter/typedef.js +106 -106
- package/dist/ui/components/presenter/util.js +210 -210
- package/dist/ui/components/virtual-viewport/VirtualViewport.svelte +196 -196
- package/dist/ui/primitives/area/HkArea.svelte +49 -49
- package/dist/ui/primitives/area/HkGridArea.svelte +77 -77
- package/dist/ui/primitives/area/index.js +2 -2
- package/dist/ui/primitives/buttons/button/Button.svelte +82 -82
- package/dist/ui/primitives/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
- package/dist/ui/primitives/buttons/button-text/TextButton.svelte +21 -21
- package/dist/ui/primitives/buttons/index.js +3 -3
- package/dist/ui/primitives/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
- package/dist/ui/primitives/debug/index.js +1 -1
- package/dist/ui/primitives/drag-drop/DragController.js +44 -44
- package/dist/ui/primitives/drag-drop/DragDropContext.svelte +111 -111
- package/dist/ui/primitives/drag-drop/Draggable.svelte +519 -519
- package/dist/ui/primitives/drag-drop/DropZone.svelte +258 -258
- package/dist/ui/primitives/drag-drop/DropZoneArea.svelte +119 -119
- package/dist/ui/primitives/drag-drop/DropZoneList.svelte +125 -125
- package/dist/ui/primitives/drag-drop/actions.js +26 -26
- package/dist/ui/primitives/drag-drop/drag-state.svelte.js +322 -322
- package/dist/ui/primitives/drag-drop/index.js +7 -7
- package/dist/ui/primitives/drag-drop/util.js +85 -85
- package/dist/ui/primitives/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/ui/primitives/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/ui/primitives/icons/HkIcon.svelte +86 -86
- package/dist/ui/primitives/icons/HkTabIcon.svelte +116 -116
- package/dist/ui/primitives/icons/SteezeIcon.svelte +97 -97
- package/dist/ui/primitives/icons/index.js +6 -6
- package/dist/ui/primitives/icons/typedef.js +16 -16
- package/dist/ui/primitives/index.js +2 -2
- package/dist/ui/primitives/inputs/index.js +1 -1
- package/dist/ui/primitives/inputs/text-input/TestTextInput.svelte__ +102 -0
- package/dist/ui/primitives/inputs/text-input/TextInput.svelte +223 -223
- package/dist/ui/primitives/inputs/text-input/TextInput.svelte___ +83 -0
- package/dist/ui/primitives/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/ui/primitives/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte +63 -63
- package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
- package/dist/ui/primitives/layout/grid-layers/util.js +74 -74
- package/dist/ui/primitives/layout/index.js +1 -1
- package/dist/ui/primitives/panels/index.js +1 -1
- package/dist/ui/primitives/panels/panel/Panel.svelte +43 -43
- package/dist/ui/primitives/rows/index.js +3 -3
- package/dist/ui/primitives/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/ui/primitives/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/ui/primitives/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/ui/primitives/tab-bar/HkTabBar.svelte +74 -74
- package/dist/ui/primitives/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/ui/primitives/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/ui/primitives/tab-bar/index.js +17 -17
- package/dist/ui/primitives/tab-bar/typedef.js +11 -11
- package/dist/util/array/index.js +436 -436
- package/dist/util/bases/base58.js +262 -262
- package/dist/util/bases/index.js +1 -1
- 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/env/index.js +9 -9
- package/dist/util/exceptions/index.d.ts +4 -3
- package/dist/util/exceptions/index.js +26 -23
- 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/geo/index.js +26 -26
- package/dist/util/index.js +7 -7
- package/dist/util/is/index.js +147 -147
- package/dist/util/iterate/index.js +204 -204
- package/dist/util/object/index.js +1345 -1345
- package/dist/util/singleton/index.js +97 -97
- package/dist/util/string/array-path.js +75 -75
- package/dist/util/string/convert.js +54 -54
- package/dist/util/string/fs.js +226 -226
- package/dist/util/string/index.js +5 -5
- package/dist/util/string/interpolate.js +61 -61
- package/dist/util/string/pad.js +10 -10
- package/dist/util/svelte/index.js +4 -4
- package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
- package/dist/util/svelte/observe/index.js +49 -49
- package/dist/util/svelte/state-context/index.js +117 -117
- 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 +101 -101
- package/dist/util/time/index.js +328 -328
- package/dist/util/unique/index.js +231 -231
- package/dist/valibot/README.md +61 -50
- package/dist/valibot/index.js +8 -8
- package/dist/valibot/parsers/date.js__ +10 -0
- package/dist/valibot/parsers/email.d.ts +12 -0
- package/dist/valibot/parsers/email.js +34 -0
- package/dist/valibot/parsers/url.js +110 -110
- package/dist/valibot/parsers/user.js +23 -23
- package/dist/valibot/parsers.js +3 -3
- package/package.json +131 -131
- package/dist/logging/internal/unified-logger/index.d.ts +0 -3
- package/dist/logging/internal/unified-logger/index.js +0 -6
- package/dist/services/internal/index.d.ts +0 -6
- package/dist/services/internal/index.js +0 -8
- /package/dist/logging/internal/{unified-logger/constants.d.ts → constants.d.ts} +0 -0
- /package/dist/services/{internal/service-base → service-base}/index.d.ts +0 -0
- /package/dist/services/{internal/service-manager → service-manager}/constants.d.ts +0 -0
- /package/dist/services/{internal/service-manager → service-manager}/typedef.d.ts +0 -0
|
@@ -1,384 +1,384 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HkPromise.js
|
|
3
|
-
*
|
|
4
|
-
* @description
|
|
5
|
-
* HkPromise extends the default Promise class with external control methods
|
|
6
|
-
* and timeout/cancellation support. Perfect for scenarios where you need to
|
|
7
|
-
* resolve/reject a promise from outside its constructor.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* // Basic external control
|
|
11
|
-
* const promise = new HkPromise();
|
|
12
|
-
* setTimeout(() => promise.resolve('done'), 1000);
|
|
13
|
-
* const result = await promise; // 'done'
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* // Timeout support
|
|
17
|
-
* const promise = new HkPromise()
|
|
18
|
-
* .setTimeout(5000, 'Operation timed out');
|
|
19
|
-
* // Promise auto-rejects after 5 seconds
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* // Cancellation with details
|
|
23
|
-
* const promise = new HkPromise();
|
|
24
|
-
* promise.cancel({ reason: 'user_cancelled', userId: 123 });
|
|
25
|
-
* // Creates PromiseError with details property
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* // State inspection
|
|
29
|
-
* const promise = new HkPromise();
|
|
30
|
-
* console.log(promise.pending); // true
|
|
31
|
-
* promise.resolve('success');
|
|
32
|
-
* console.log(promise.resolved); // true
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
/* ------------------------------------------------------------------ Imports */
|
|
36
|
-
|
|
37
|
-
import * as expect from '../../util/expect/index.js';
|
|
38
|
-
|
|
39
|
-
import { noop } from '../../util/function/index.js';
|
|
40
|
-
|
|
41
|
-
import { PromiseError } from '../../errors/promise.js';
|
|
42
|
-
|
|
43
|
-
/* ---------------------------------------------------------------- Internals */
|
|
44
|
-
|
|
45
|
-
/* ------------------------------------------------------------------- Export */
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* HkPromise extends the default javascript Promise class
|
|
49
|
-
* - Exposes methods to interact with the state of the
|
|
50
|
-
* promise, such as 'resolve' and 'reject'
|
|
51
|
-
*/
|
|
52
|
-
export default class HkPromise extends Promise {
|
|
53
|
-
// Private fields using modern JavaScript syntax
|
|
54
|
-
#resolveFn;
|
|
55
|
-
#rejectFn;
|
|
56
|
-
#pending = true;
|
|
57
|
-
#resolved = false;
|
|
58
|
-
#rejected = false;
|
|
59
|
-
#cancelled = false;
|
|
60
|
-
#timeout = false;
|
|
61
|
-
#timeoutTimer;
|
|
62
|
-
#hasThen = false;
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* @param {(resolveFn?:function, rejectFn?:function)=>void} [initFn]
|
|
66
|
-
*/
|
|
67
|
-
constructor(initFn) {
|
|
68
|
-
let _resolveFn;
|
|
69
|
-
let _rejectFn;
|
|
70
|
-
|
|
71
|
-
super((resolveFn, rejectFn) => {
|
|
72
|
-
//
|
|
73
|
-
// @note if initFn cannot be called an exception will be thrown:
|
|
74
|
-
// TypeError: Promise resolve or reject function is not callable
|
|
75
|
-
//
|
|
76
|
-
if (initFn) {
|
|
77
|
-
initFn(resolveFn, rejectFn);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
_resolveFn = resolveFn;
|
|
81
|
-
_rejectFn = rejectFn;
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// Store resolve and reject functions
|
|
85
|
-
this.#resolveFn = _resolveFn;
|
|
86
|
-
this.#rejectFn = _rejectFn;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Get value of property [resolved]
|
|
91
|
-
*
|
|
92
|
-
* @returns {boolean} true if the promise has been resolved
|
|
93
|
-
*/
|
|
94
|
-
get resolved() {
|
|
95
|
-
return this.#resolved;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Get value of property [rejected]
|
|
100
|
-
*
|
|
101
|
-
* @returns {boolean} true if the promise was rejected
|
|
102
|
-
*/
|
|
103
|
-
get rejected() {
|
|
104
|
-
return this.#rejected;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Get value of property [pending]
|
|
109
|
-
*
|
|
110
|
-
* @returns {boolean} true if the promise is still pending
|
|
111
|
-
*/
|
|
112
|
-
get pending() {
|
|
113
|
-
return this.#pending;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Get value of property [cancelled]
|
|
118
|
-
*
|
|
119
|
-
* @returns {boolean} true if the promise was cancelled
|
|
120
|
-
*/
|
|
121
|
-
get cancelled() {
|
|
122
|
-
return this.#cancelled;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Get value of property [timeout]
|
|
127
|
-
*
|
|
128
|
-
* @returns {boolean} true if the promise was cancelled due to a timeout
|
|
129
|
-
*/
|
|
130
|
-
get timeout() {
|
|
131
|
-
return this.#timeout;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Resolve the promise
|
|
136
|
-
*
|
|
137
|
-
* @param {...any} args - Values to pass to the "then" callbacks
|
|
138
|
-
*
|
|
139
|
-
* @returns {object} this
|
|
140
|
-
*/
|
|
141
|
-
resolve(...args) {
|
|
142
|
-
// -- Check current Promise state
|
|
143
|
-
|
|
144
|
-
if (!this.#pending) {
|
|
145
|
-
if (this.#resolved) {
|
|
146
|
-
throw new Error('Cannot resolve Promise. Promise has already resolved');
|
|
147
|
-
} else {
|
|
148
|
-
throw new Error(
|
|
149
|
-
'Cannot resolve Promise. Promise has already been rejected'
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// -- Clear timeout timer (if any)
|
|
155
|
-
|
|
156
|
-
if (undefined !== this.#timeoutTimer) {
|
|
157
|
-
clearTimeout(this.#timeoutTimer);
|
|
158
|
-
|
|
159
|
-
this.#timeoutTimer = undefined;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// -- Set flags and call resolve function
|
|
163
|
-
|
|
164
|
-
this.#resolved = true;
|
|
165
|
-
this.#pending = false;
|
|
166
|
-
|
|
167
|
-
this.#resolveFn(...args);
|
|
168
|
-
|
|
169
|
-
return this;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// -------------------------------------------------------------------- Method
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Resolve the promise if the promise is still pending
|
|
176
|
-
*
|
|
177
|
-
* @param {...any} args - Values to pass to the "then" callbacks
|
|
178
|
-
*
|
|
179
|
-
* @returns {object} this
|
|
180
|
-
*/
|
|
181
|
-
tryResolve(...args) {
|
|
182
|
-
if (this.#pending) {
|
|
183
|
-
this.resolve(...args);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return this;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Reject the promise
|
|
191
|
-
*
|
|
192
|
-
* @param {...any} args
|
|
193
|
-
* Objects to pass to the "catch" callbacks, usually an Error object or details
|
|
194
|
-
*
|
|
195
|
-
* @returns {object} this
|
|
196
|
-
*/
|
|
197
|
-
reject(...args) {
|
|
198
|
-
if (!this.#hasThen) {
|
|
199
|
-
//
|
|
200
|
-
// No then (or await) has been used
|
|
201
|
-
// add catch to prevent useless unhandled promise rejection
|
|
202
|
-
//
|
|
203
|
-
this.catch(noop);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// -- Check current Promise state
|
|
207
|
-
|
|
208
|
-
if (!this.#pending) {
|
|
209
|
-
if (this.#resolved) {
|
|
210
|
-
throw new Error('Cannot reject Promise. Promise has already resolved');
|
|
211
|
-
} else {
|
|
212
|
-
throw new Error(
|
|
213
|
-
'Cannot reject Promise. Promise has already been rejected'
|
|
214
|
-
);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// -- Clear timeout timer (if any)
|
|
219
|
-
|
|
220
|
-
if (undefined !== this.#timeoutTimer) {
|
|
221
|
-
clearTimeout(this.#timeoutTimer);
|
|
222
|
-
|
|
223
|
-
this.#timeoutTimer = undefined;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// -- Set flags and call reject function
|
|
227
|
-
|
|
228
|
-
this.#rejected = true;
|
|
229
|
-
this.#pending = false;
|
|
230
|
-
|
|
231
|
-
this.#rejectFn(...args);
|
|
232
|
-
|
|
233
|
-
return this;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Reject the promise if the promise is still pending
|
|
238
|
-
*
|
|
239
|
-
* @param {...any} args
|
|
240
|
-
* Objects to pass to the "catch" callbacks, usually an Error object or details
|
|
241
|
-
*
|
|
242
|
-
* @returns {object} this
|
|
243
|
-
*/
|
|
244
|
-
tryReject(...args) {
|
|
245
|
-
if (this.#pending) {
|
|
246
|
-
this.reject(...args);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return this;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Reject the promise and set this.cancelled=true
|
|
254
|
-
*
|
|
255
|
-
* @param {Error|*} [errorOrDetails]
|
|
256
|
-
* Error object or details to pass to the "catch" callbacks
|
|
257
|
-
*
|
|
258
|
-
* @returns {object} this
|
|
259
|
-
*/
|
|
260
|
-
cancel(errorOrDetails) {
|
|
261
|
-
let promiseError;
|
|
262
|
-
|
|
263
|
-
if (errorOrDetails instanceof Error) {
|
|
264
|
-
// If it's an Error, create error chain
|
|
265
|
-
promiseError = new PromiseError(
|
|
266
|
-
errorOrDetails.message,
|
|
267
|
-
{
|
|
268
|
-
cancelled: true,
|
|
269
|
-
cause: errorOrDetails
|
|
270
|
-
}
|
|
271
|
-
);
|
|
272
|
-
} else {
|
|
273
|
-
// If it's details or undefined, use as details
|
|
274
|
-
promiseError = new PromiseError(
|
|
275
|
-
'Cancelled',
|
|
276
|
-
{
|
|
277
|
-
cancelled: true,
|
|
278
|
-
details: errorOrDetails
|
|
279
|
-
}
|
|
280
|
-
);
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
this.#cancelled = true;
|
|
284
|
-
this.reject(promiseError);
|
|
285
|
-
|
|
286
|
-
return this;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* Reject the promise and set this.cancelled=true if still pending
|
|
291
|
-
*
|
|
292
|
-
* @param {Error|*} [errorOrDetails]
|
|
293
|
-
* Error object or details to pass to the "catch" callbacks
|
|
294
|
-
*
|
|
295
|
-
* @returns {object} this
|
|
296
|
-
*/
|
|
297
|
-
tryCancel(errorOrDetails) {
|
|
298
|
-
if (this.#pending) {
|
|
299
|
-
this.cancel(errorOrDetails);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
return this;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Specify the number of milliseconds until the promise should time out.
|
|
307
|
-
* - When a timeout occurs: the promise is cancelled and the following
|
|
308
|
-
* properties are both set
|
|
309
|
-
*
|
|
310
|
-
* this.timeout=true
|
|
311
|
-
* this.cancelled=true
|
|
312
|
-
*
|
|
313
|
-
* @param {number} ms
|
|
314
|
-
* Number of milliseconds after which the promise should time out
|
|
315
|
-
*
|
|
316
|
-
* @param {string} [message="Timeout"]
|
|
317
|
-
* Message of the error that will be thrown when the timeout occurs
|
|
318
|
-
*/
|
|
319
|
-
setTimeout(ms, message = 'Timeout') {
|
|
320
|
-
expect.number(ms);
|
|
321
|
-
expect.string(message);
|
|
322
|
-
|
|
323
|
-
// -- Check current Promise state
|
|
324
|
-
|
|
325
|
-
if (!this.#pending) {
|
|
326
|
-
if (this.#resolved) {
|
|
327
|
-
throw new Error('Cannot set timeout. Promise has already resolved');
|
|
328
|
-
} else {
|
|
329
|
-
throw new Error(
|
|
330
|
-
'Cannot set timeout. Promise has already been rejected'
|
|
331
|
-
);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// -- Clear existing timeout (if any)
|
|
336
|
-
|
|
337
|
-
if (undefined !== this.#timeoutTimer) {
|
|
338
|
-
clearTimeout(this.#timeoutTimer);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// -- Set timeout
|
|
342
|
-
|
|
343
|
-
this.#timeoutTimer = setTimeout(() => {
|
|
344
|
-
if (!this.#pending) {
|
|
345
|
-
// Promise has already been resolved (should not happen)
|
|
346
|
-
return;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
this.#timeout = true;
|
|
350
|
-
this.#cancelled = true;
|
|
351
|
-
|
|
352
|
-
const timeoutError = new PromiseError(message, {
|
|
353
|
-
timeout: true,
|
|
354
|
-
cancelled: true
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
this.reject(timeoutError);
|
|
358
|
-
}, ms);
|
|
359
|
-
|
|
360
|
-
// return this -> chainable method
|
|
361
|
-
return this;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Register a callback that is called when the promise resolves
|
|
366
|
-
*
|
|
367
|
-
* @param {...any} args - Callback functions and options
|
|
368
|
-
*/
|
|
369
|
-
then(...args) {
|
|
370
|
-
this.#hasThen = true;
|
|
371
|
-
|
|
372
|
-
return super.then(...args);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* Register a callback that is called when the promise rejects, is
|
|
377
|
-
* cancelled or times out
|
|
378
|
-
*
|
|
379
|
-
* @param {...any} args - Callback functions and options
|
|
380
|
-
*/
|
|
381
|
-
catch(...args) {
|
|
382
|
-
return super.catch(...args);
|
|
383
|
-
}
|
|
384
|
-
} // end class
|
|
1
|
+
/**
|
|
2
|
+
* HkPromise.js
|
|
3
|
+
*
|
|
4
|
+
* @description
|
|
5
|
+
* HkPromise extends the default Promise class with external control methods
|
|
6
|
+
* and timeout/cancellation support. Perfect for scenarios where you need to
|
|
7
|
+
* resolve/reject a promise from outside its constructor.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Basic external control
|
|
11
|
+
* const promise = new HkPromise();
|
|
12
|
+
* setTimeout(() => promise.resolve('done'), 1000);
|
|
13
|
+
* const result = await promise; // 'done'
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* // Timeout support
|
|
17
|
+
* const promise = new HkPromise()
|
|
18
|
+
* .setTimeout(5000, 'Operation timed out');
|
|
19
|
+
* // Promise auto-rejects after 5 seconds
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // Cancellation with details
|
|
23
|
+
* const promise = new HkPromise();
|
|
24
|
+
* promise.cancel({ reason: 'user_cancelled', userId: 123 });
|
|
25
|
+
* // Creates PromiseError with details property
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* // State inspection
|
|
29
|
+
* const promise = new HkPromise();
|
|
30
|
+
* console.log(promise.pending); // true
|
|
31
|
+
* promise.resolve('success');
|
|
32
|
+
* console.log(promise.resolved); // true
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/* ------------------------------------------------------------------ Imports */
|
|
36
|
+
|
|
37
|
+
import * as expect from '../../util/expect/index.js';
|
|
38
|
+
|
|
39
|
+
import { noop } from '../../util/function/index.js';
|
|
40
|
+
|
|
41
|
+
import { PromiseError } from '../../errors/promise.js';
|
|
42
|
+
|
|
43
|
+
/* ---------------------------------------------------------------- Internals */
|
|
44
|
+
|
|
45
|
+
/* ------------------------------------------------------------------- Export */
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* HkPromise extends the default javascript Promise class
|
|
49
|
+
* - Exposes methods to interact with the state of the
|
|
50
|
+
* promise, such as 'resolve' and 'reject'
|
|
51
|
+
*/
|
|
52
|
+
export default class HkPromise extends Promise {
|
|
53
|
+
// Private fields using modern JavaScript syntax
|
|
54
|
+
#resolveFn;
|
|
55
|
+
#rejectFn;
|
|
56
|
+
#pending = true;
|
|
57
|
+
#resolved = false;
|
|
58
|
+
#rejected = false;
|
|
59
|
+
#cancelled = false;
|
|
60
|
+
#timeout = false;
|
|
61
|
+
#timeoutTimer;
|
|
62
|
+
#hasThen = false;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @param {(resolveFn?:function, rejectFn?:function)=>void} [initFn]
|
|
66
|
+
*/
|
|
67
|
+
constructor(initFn) {
|
|
68
|
+
let _resolveFn;
|
|
69
|
+
let _rejectFn;
|
|
70
|
+
|
|
71
|
+
super((resolveFn, rejectFn) => {
|
|
72
|
+
//
|
|
73
|
+
// @note if initFn cannot be called an exception will be thrown:
|
|
74
|
+
// TypeError: Promise resolve or reject function is not callable
|
|
75
|
+
//
|
|
76
|
+
if (initFn) {
|
|
77
|
+
initFn(resolveFn, rejectFn);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
_resolveFn = resolveFn;
|
|
81
|
+
_rejectFn = rejectFn;
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Store resolve and reject functions
|
|
85
|
+
this.#resolveFn = _resolveFn;
|
|
86
|
+
this.#rejectFn = _rejectFn;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get value of property [resolved]
|
|
91
|
+
*
|
|
92
|
+
* @returns {boolean} true if the promise has been resolved
|
|
93
|
+
*/
|
|
94
|
+
get resolved() {
|
|
95
|
+
return this.#resolved;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Get value of property [rejected]
|
|
100
|
+
*
|
|
101
|
+
* @returns {boolean} true if the promise was rejected
|
|
102
|
+
*/
|
|
103
|
+
get rejected() {
|
|
104
|
+
return this.#rejected;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Get value of property [pending]
|
|
109
|
+
*
|
|
110
|
+
* @returns {boolean} true if the promise is still pending
|
|
111
|
+
*/
|
|
112
|
+
get pending() {
|
|
113
|
+
return this.#pending;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Get value of property [cancelled]
|
|
118
|
+
*
|
|
119
|
+
* @returns {boolean} true if the promise was cancelled
|
|
120
|
+
*/
|
|
121
|
+
get cancelled() {
|
|
122
|
+
return this.#cancelled;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get value of property [timeout]
|
|
127
|
+
*
|
|
128
|
+
* @returns {boolean} true if the promise was cancelled due to a timeout
|
|
129
|
+
*/
|
|
130
|
+
get timeout() {
|
|
131
|
+
return this.#timeout;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Resolve the promise
|
|
136
|
+
*
|
|
137
|
+
* @param {...any} args - Values to pass to the "then" callbacks
|
|
138
|
+
*
|
|
139
|
+
* @returns {object} this
|
|
140
|
+
*/
|
|
141
|
+
resolve(...args) {
|
|
142
|
+
// -- Check current Promise state
|
|
143
|
+
|
|
144
|
+
if (!this.#pending) {
|
|
145
|
+
if (this.#resolved) {
|
|
146
|
+
throw new Error('Cannot resolve Promise. Promise has already resolved');
|
|
147
|
+
} else {
|
|
148
|
+
throw new Error(
|
|
149
|
+
'Cannot resolve Promise. Promise has already been rejected'
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// -- Clear timeout timer (if any)
|
|
155
|
+
|
|
156
|
+
if (undefined !== this.#timeoutTimer) {
|
|
157
|
+
clearTimeout(this.#timeoutTimer);
|
|
158
|
+
|
|
159
|
+
this.#timeoutTimer = undefined;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// -- Set flags and call resolve function
|
|
163
|
+
|
|
164
|
+
this.#resolved = true;
|
|
165
|
+
this.#pending = false;
|
|
166
|
+
|
|
167
|
+
this.#resolveFn(...args);
|
|
168
|
+
|
|
169
|
+
return this;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// -------------------------------------------------------------------- Method
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Resolve the promise if the promise is still pending
|
|
176
|
+
*
|
|
177
|
+
* @param {...any} args - Values to pass to the "then" callbacks
|
|
178
|
+
*
|
|
179
|
+
* @returns {object} this
|
|
180
|
+
*/
|
|
181
|
+
tryResolve(...args) {
|
|
182
|
+
if (this.#pending) {
|
|
183
|
+
this.resolve(...args);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return this;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Reject the promise
|
|
191
|
+
*
|
|
192
|
+
* @param {...any} args
|
|
193
|
+
* Objects to pass to the "catch" callbacks, usually an Error object or details
|
|
194
|
+
*
|
|
195
|
+
* @returns {object} this
|
|
196
|
+
*/
|
|
197
|
+
reject(...args) {
|
|
198
|
+
if (!this.#hasThen) {
|
|
199
|
+
//
|
|
200
|
+
// No then (or await) has been used
|
|
201
|
+
// add catch to prevent useless unhandled promise rejection
|
|
202
|
+
//
|
|
203
|
+
this.catch(noop);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// -- Check current Promise state
|
|
207
|
+
|
|
208
|
+
if (!this.#pending) {
|
|
209
|
+
if (this.#resolved) {
|
|
210
|
+
throw new Error('Cannot reject Promise. Promise has already resolved');
|
|
211
|
+
} else {
|
|
212
|
+
throw new Error(
|
|
213
|
+
'Cannot reject Promise. Promise has already been rejected'
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// -- Clear timeout timer (if any)
|
|
219
|
+
|
|
220
|
+
if (undefined !== this.#timeoutTimer) {
|
|
221
|
+
clearTimeout(this.#timeoutTimer);
|
|
222
|
+
|
|
223
|
+
this.#timeoutTimer = undefined;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// -- Set flags and call reject function
|
|
227
|
+
|
|
228
|
+
this.#rejected = true;
|
|
229
|
+
this.#pending = false;
|
|
230
|
+
|
|
231
|
+
this.#rejectFn(...args);
|
|
232
|
+
|
|
233
|
+
return this;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Reject the promise if the promise is still pending
|
|
238
|
+
*
|
|
239
|
+
* @param {...any} args
|
|
240
|
+
* Objects to pass to the "catch" callbacks, usually an Error object or details
|
|
241
|
+
*
|
|
242
|
+
* @returns {object} this
|
|
243
|
+
*/
|
|
244
|
+
tryReject(...args) {
|
|
245
|
+
if (this.#pending) {
|
|
246
|
+
this.reject(...args);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return this;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Reject the promise and set this.cancelled=true
|
|
254
|
+
*
|
|
255
|
+
* @param {Error|*} [errorOrDetails]
|
|
256
|
+
* Error object or details to pass to the "catch" callbacks
|
|
257
|
+
*
|
|
258
|
+
* @returns {object} this
|
|
259
|
+
*/
|
|
260
|
+
cancel(errorOrDetails) {
|
|
261
|
+
let promiseError;
|
|
262
|
+
|
|
263
|
+
if (errorOrDetails instanceof Error) {
|
|
264
|
+
// If it's an Error, create error chain
|
|
265
|
+
promiseError = new PromiseError(
|
|
266
|
+
errorOrDetails.message,
|
|
267
|
+
{
|
|
268
|
+
cancelled: true,
|
|
269
|
+
cause: errorOrDetails
|
|
270
|
+
}
|
|
271
|
+
);
|
|
272
|
+
} else {
|
|
273
|
+
// If it's details or undefined, use as details
|
|
274
|
+
promiseError = new PromiseError(
|
|
275
|
+
'Cancelled',
|
|
276
|
+
{
|
|
277
|
+
cancelled: true,
|
|
278
|
+
details: errorOrDetails
|
|
279
|
+
}
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
this.#cancelled = true;
|
|
284
|
+
this.reject(promiseError);
|
|
285
|
+
|
|
286
|
+
return this;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Reject the promise and set this.cancelled=true if still pending
|
|
291
|
+
*
|
|
292
|
+
* @param {Error|*} [errorOrDetails]
|
|
293
|
+
* Error object or details to pass to the "catch" callbacks
|
|
294
|
+
*
|
|
295
|
+
* @returns {object} this
|
|
296
|
+
*/
|
|
297
|
+
tryCancel(errorOrDetails) {
|
|
298
|
+
if (this.#pending) {
|
|
299
|
+
this.cancel(errorOrDetails);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return this;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Specify the number of milliseconds until the promise should time out.
|
|
307
|
+
* - When a timeout occurs: the promise is cancelled and the following
|
|
308
|
+
* properties are both set
|
|
309
|
+
*
|
|
310
|
+
* this.timeout=true
|
|
311
|
+
* this.cancelled=true
|
|
312
|
+
*
|
|
313
|
+
* @param {number} ms
|
|
314
|
+
* Number of milliseconds after which the promise should time out
|
|
315
|
+
*
|
|
316
|
+
* @param {string} [message="Timeout"]
|
|
317
|
+
* Message of the error that will be thrown when the timeout occurs
|
|
318
|
+
*/
|
|
319
|
+
setTimeout(ms, message = 'Timeout') {
|
|
320
|
+
expect.number(ms);
|
|
321
|
+
expect.string(message);
|
|
322
|
+
|
|
323
|
+
// -- Check current Promise state
|
|
324
|
+
|
|
325
|
+
if (!this.#pending) {
|
|
326
|
+
if (this.#resolved) {
|
|
327
|
+
throw new Error('Cannot set timeout. Promise has already resolved');
|
|
328
|
+
} else {
|
|
329
|
+
throw new Error(
|
|
330
|
+
'Cannot set timeout. Promise has already been rejected'
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// -- Clear existing timeout (if any)
|
|
336
|
+
|
|
337
|
+
if (undefined !== this.#timeoutTimer) {
|
|
338
|
+
clearTimeout(this.#timeoutTimer);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// -- Set timeout
|
|
342
|
+
|
|
343
|
+
this.#timeoutTimer = setTimeout(() => {
|
|
344
|
+
if (!this.#pending) {
|
|
345
|
+
// Promise has already been resolved (should not happen)
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
this.#timeout = true;
|
|
350
|
+
this.#cancelled = true;
|
|
351
|
+
|
|
352
|
+
const timeoutError = new PromiseError(message, {
|
|
353
|
+
timeout: true,
|
|
354
|
+
cancelled: true
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
this.reject(timeoutError);
|
|
358
|
+
}, ms);
|
|
359
|
+
|
|
360
|
+
// return this -> chainable method
|
|
361
|
+
return this;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Register a callback that is called when the promise resolves
|
|
366
|
+
*
|
|
367
|
+
* @param {...any} args - Callback functions and options
|
|
368
|
+
*/
|
|
369
|
+
then(...args) {
|
|
370
|
+
this.#hasThen = true;
|
|
371
|
+
|
|
372
|
+
return super.then(...args);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Register a callback that is called when the promise rejects, is
|
|
377
|
+
* cancelled or times out
|
|
378
|
+
*
|
|
379
|
+
* @param {...any} args - Callback functions and options
|
|
380
|
+
*/
|
|
381
|
+
catch(...args) {
|
|
382
|
+
return super.catch(...args);
|
|
383
|
+
}
|
|
384
|
+
} // end class
|