@hkdigital/lib-core 0.4.29 → 0.4.31
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 +10 -4
- package/dist/auth/jwt/constants.d.ts +1 -1
- package/dist/auth/jwt/errors.d.ts +5 -5
- package/dist/auth/jwt/typedef.d.ts +30 -30
- package/dist/config/generators/imagetools.d.ts +3 -3
- package/dist/config/generators/vite.d.ts +11 -11
- package/dist/config/generators/vite.js +1 -1
- package/dist/design/generators/index.d.ts +9 -9
- package/dist/design/utils/clamp.d.ts +1 -1
- package/dist/design/utils/root-vars.d.ts +1 -1
- package/dist/design/utils/scaling.d.ts +2 -2
- package/dist/generic/data/classes/IterableTree.d.ts +2 -2
- package/dist/generic/data/classes/IterableTree.js +1 -0
- package/dist/generic/data/classes/Selector.d.ts +5 -5
- package/dist/generic/data/classes/Selector.js +53 -60
- package/dist/generic/data/classes/typedef.d.ts +5 -5
- package/dist/generic/errors/generic.d.ts +3 -1
- package/dist/generic/errors/promise.d.ts +2 -2
- package/dist/generic/events/classes/EventEmitter.js +1 -0
- package/dist/generic/promises/classes/HkPromise.js +9 -15
- package/dist/logging/internal/adapters/console.d.ts +5 -5
- package/dist/logging/internal/adapters/pino.d.ts +3 -3
- package/dist/logging/internal/adapters/typedef.d.ts +7 -7
- package/dist/logging/internal/factories/client.d.ts +1 -1
- package/dist/logging/internal/factories/server.d.ts +1 -1
- package/dist/logging/internal/logger/Logger.d.ts +3 -3
- package/dist/logging/internal/transports/pretty-transport.d.ts +3 -3
- package/dist/logging/internal/transports/test-transport.d.ts +5 -5
- package/dist/logging/typedef.d.ts +1 -1
- package/dist/network/cache/IndexedDbCache.d.ts +10 -10
- package/dist/network/cache/MemoryResponseCache.d.ts +3 -3
- package/dist/network/cache/typedef.d.ts +3 -3
- package/dist/network/errors/http.d.ts +2 -2
- package/dist/network/http/caching.d.ts +2 -2
- package/dist/network/http/http-request.d.ts +1 -1
- package/dist/network/http/typedef.d.ts +31 -31
- package/dist/network/loaders/audio/AudioScene.svelte.d.ts +2 -2
- package/dist/network/loaders/base/SceneBase.svelte.d.ts +4 -4
- package/dist/network/loaders/base/SceneBase.svelte.js +1 -1
- package/dist/network/loaders/image/ImageLoader.svelte.d.ts +1 -1
- package/dist/network/loaders/image/ImageVariantsLoader.svelte.d.ts +5 -5
- package/dist/network/loaders/image/utils/index.d.ts +3 -3
- package/dist/services/README.md +36 -2
- package/dist/services/manager-plugins/ConfigPlugin.d.ts +1 -1
- package/dist/services/service-base/ServiceBase.d.ts +13 -3
- package/dist/services/service-base/ServiceBase.js +27 -9
- package/dist/services/service-base/typedef.d.ts +8 -8
- package/dist/services/service-manager/ServiceManager.d.ts +10 -2
- package/dist/services/service-manager/ServiceManager.js +64 -50
- package/dist/services/service-manager/typedef.d.ts +12 -11
- package/dist/services/service-manager/typedef.js +2 -1
- package/dist/state/machines/finite-state-machine/FiniteStateMachine.svelte.d.ts +1 -1
- package/dist/state/machines/finite-state-machine/constants.js +2 -2
- package/dist/state/machines/loading-state-machine/LoadingStateMachine.svelte.d.ts +1 -1
- package/dist/state/stores/theme.d.ts +1 -1
- package/dist/ui/components/button-group/ButtonGroup.svelte.d.ts +7 -7
- package/dist/ui/components/button-group/typedef.d.ts +1 -1
- package/dist/ui/components/compare-left-right/CompareLeftRight.svelte.d.ts +5 -5
- package/dist/ui/components/drag-drop/DragController.d.ts +1 -1
- package/dist/ui/components/drag-drop/DragDropContext.svelte.d.ts +3 -3
- package/dist/ui/components/drag-drop/Draggable.svelte.d.ts +20 -20
- package/dist/ui/components/drag-drop/DropZone.svelte.d.ts +27 -27
- package/dist/ui/components/drag-drop/DropZoneArea.svelte.d.ts +26 -26
- package/dist/ui/components/drag-drop/DropZoneList.svelte.d.ts +27 -27
- package/dist/ui/components/drag-drop/drag-state.svelte.d.ts +4 -4
- package/dist/ui/components/drag-drop/typedef/drag.d.ts +1 -1
- package/dist/ui/components/game-box/GameBox.svelte.d.ts +19 -19
- package/dist/ui/components/game-box/gamebox.util.d.ts +2 -2
- package/dist/ui/components/grid-layers/GridLayers.svelte.d.ts +7 -7
- package/dist/ui/components/image-box/ImageBox.svelte.d.ts +14 -14
- package/dist/ui/components/presenter/ImageSlide.svelte.d.ts +8 -8
- package/dist/ui/components/presenter/Presenter.state.svelte.d.ts +1 -1
- package/dist/ui/components/presenter/Presenter.svelte.d.ts +5 -5
- package/dist/ui/components/presenter/typedef.d.ts +13 -13
- package/dist/ui/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +7 -7
- package/dist/ui/components/rows/panel-row-2/PanelRow2.svelte.d.ts +7 -7
- package/dist/ui/components/tab-bar/HkTabBar.svelte.d.ts +10 -10
- package/dist/ui/components/tab-bar/HkTabBarSelector.state.svelte.d.ts +1 -1
- package/dist/ui/components/tab-bar/HkTabBarSelector.svelte.d.ts +10 -10
- package/dist/ui/components/tab-bar/typedef.d.ts +3 -3
- package/dist/ui/components/virtual-viewport/VirtualViewport.svelte.d.ts +17 -17
- package/dist/ui/dev/blocks/TextBlock.svelte.d.ts +6 -6
- package/dist/ui/dev/buttons/CheckButton.svelte.d.ts +11 -11
- package/dist/ui/primitives/area/HkArea.svelte.d.ts +6 -6
- package/dist/ui/primitives/area/HkGridArea.svelte.d.ts +12 -12
- package/dist/ui/primitives/buttons/button/Button.svelte.d.ts +16 -16
- package/dist/ui/primitives/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +2 -2
- package/dist/ui/primitives/buttons/button-submit/SubmitButton.svelte +21 -0
- package/dist/ui/primitives/buttons/button-submit/SubmitButton.svelte.d.ts +12 -0
- package/dist/ui/primitives/buttons/index.d.ts +2 -1
- package/dist/ui/primitives/buttons/index.js +2 -1
- package/dist/ui/primitives/icons/HkIcon.svelte.d.ts +4 -4
- package/dist/ui/primitives/icons/HkTabIcon.svelte.d.ts +13 -13
- package/dist/ui/primitives/icons/SteezeIcon.svelte.d.ts +4 -4
- package/dist/ui/primitives/inputs/text-input/TextInput.svelte.d.ts +22 -22
- package/dist/ui/primitives/inputs/text-input/assets/IconInvalid.svelte.d.ts +1 -1
- package/dist/ui/primitives/inputs/text-input/assets/IconValid.svelte.d.ts +1 -1
- package/dist/ui/primitives/panels/panel/Panel.svelte.d.ts +6 -6
- package/dist/util/array/index.d.ts +17 -17
- package/dist/util/array/index.js +5 -5
- package/dist/util/compare/index.d.ts +2 -1
- package/dist/util/compare/index.js +1 -0
- package/dist/util/exceptions/index.d.ts +3 -2
- package/dist/util/exceptions/index.js +13 -9
- package/dist/util/expect/arrays.d.ts +1 -0
- package/dist/util/expect/arrays.js +1 -0
- package/dist/util/expect/primitives.d.ts +18 -0
- package/dist/util/expect/primitives.js +18 -0
- package/dist/util/function/index.d.ts +14 -1
- package/dist/util/geometry/index.d.ts +2 -2
- package/dist/util/geometry/index.js +1 -1
- package/dist/util/iterate/index.d.ts +7 -7
- package/dist/util/object/index.d.ts +13 -13
- package/dist/util/singleton/index.d.ts +3 -3
- package/dist/util/svelte/loading/loading-tracker.svelte.d.ts +1 -1
- package/dist/util/sveltekit/env/all.d.ts +5 -5
- package/dist/util/sveltekit/env/all.js +2 -2
- package/dist/util/sveltekit/env/parsers.d.ts +12 -12
- package/dist/util/sveltekit/env/private.d.ts +5 -5
- package/dist/util/sveltekit/env/public.d.ts +5 -5
- package/dist/util/sveltekit/route-folders/index.d.ts +2 -2
- package/dist/util/sveltekit/route-folders.d.ts +1 -0
- package/dist/util/{sveltekit.js → sveltekit/route-folders.js} +1 -1
- package/dist/util/time/index.d.ts +4 -4
- package/dist/valibot/parsers/url.d.ts +3 -3
- package/dist/valibot/parsers/url.js +6 -2
- package/package.json +1 -1
- package/dist/util/sveltekit.d.ts +0 -1
|
@@ -34,11 +34,21 @@ export class ServiceBase extends EventEmitter {
|
|
|
34
34
|
/**
|
|
35
35
|
* Configure the service with configuration
|
|
36
36
|
*
|
|
37
|
-
* @param {
|
|
37
|
+
* @param {Object<string,any>|null} [config={}]
|
|
38
38
|
*
|
|
39
39
|
* @returns {Promise<boolean>} True if configuration succeeded
|
|
40
40
|
*/
|
|
41
|
-
configure(config?:
|
|
41
|
+
configure(config?: {
|
|
42
|
+
[x: string]: any;
|
|
43
|
+
} | null): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Get the last applied config
|
|
46
|
+
*
|
|
47
|
+
* @returns {Object<string,any>} config
|
|
48
|
+
*/
|
|
49
|
+
get lastConfig(): {
|
|
50
|
+
[x: string]: any;
|
|
51
|
+
};
|
|
42
52
|
/**
|
|
43
53
|
* Start the service
|
|
44
54
|
*
|
|
@@ -152,7 +162,7 @@ export class ServiceBase extends EventEmitter {
|
|
|
152
162
|
*
|
|
153
163
|
* @returns {Promise<Object>} Additional health information
|
|
154
164
|
*/
|
|
155
|
-
protected _healthCheck(): Promise<
|
|
165
|
+
protected _healthCheck(): Promise<Object>;
|
|
156
166
|
/**
|
|
157
167
|
* Set the service state and emit event
|
|
158
168
|
*
|
|
@@ -85,7 +85,8 @@ import {
|
|
|
85
85
|
* @extends EventEmitter
|
|
86
86
|
*/
|
|
87
87
|
export class ServiceBase extends EventEmitter {
|
|
88
|
-
|
|
88
|
+
|
|
89
|
+
/** @type {Object<string,any>|null} */
|
|
89
90
|
#lastConfig = null;
|
|
90
91
|
|
|
91
92
|
/**
|
|
@@ -97,6 +98,11 @@ export class ServiceBase extends EventEmitter {
|
|
|
97
98
|
constructor(name, options = {}) {
|
|
98
99
|
super();
|
|
99
100
|
|
|
101
|
+
if( typeof name !== 'string' )
|
|
102
|
+
{
|
|
103
|
+
throw new Error(`Service misses constructor parameter [name]`);
|
|
104
|
+
}
|
|
105
|
+
|
|
100
106
|
/** @type {string} */
|
|
101
107
|
this.name = name;
|
|
102
108
|
|
|
@@ -122,7 +128,7 @@ export class ServiceBase extends EventEmitter {
|
|
|
122
128
|
/**
|
|
123
129
|
* Configure the service with configuration
|
|
124
130
|
*
|
|
125
|
-
* @param {
|
|
131
|
+
* @param {Object<string,any>|null} [config={}]
|
|
126
132
|
*
|
|
127
133
|
* @returns {Promise<boolean>} True if configuration succeeded
|
|
128
134
|
*/
|
|
@@ -152,11 +158,20 @@ export class ServiceBase extends EventEmitter {
|
|
|
152
158
|
this.logger.info('Service configured');
|
|
153
159
|
return true;
|
|
154
160
|
} catch (error) {
|
|
155
|
-
this._setError('configuration', error);
|
|
161
|
+
this._setError('configuration', /** @type {Error} */ (error));
|
|
156
162
|
return false;
|
|
157
163
|
}
|
|
158
164
|
}
|
|
159
165
|
|
|
166
|
+
/**
|
|
167
|
+
* Get the last applied config
|
|
168
|
+
*
|
|
169
|
+
* @returns {Object<string,any>} config
|
|
170
|
+
*/
|
|
171
|
+
get lastConfig() {
|
|
172
|
+
return { ...this.#lastConfig };
|
|
173
|
+
}
|
|
174
|
+
|
|
160
175
|
/**
|
|
161
176
|
* Start the service
|
|
162
177
|
*
|
|
@@ -180,7 +195,7 @@ export class ServiceBase extends EventEmitter {
|
|
|
180
195
|
this.logger.info('Service started');
|
|
181
196
|
return true;
|
|
182
197
|
} catch (error) {
|
|
183
|
-
this._setError('startup', error);
|
|
198
|
+
this._setError('startup', /** @type {Error} */ (error));
|
|
184
199
|
return false;
|
|
185
200
|
}
|
|
186
201
|
}
|
|
@@ -224,12 +239,15 @@ export class ServiceBase extends EventEmitter {
|
|
|
224
239
|
this.logger.info('Service stopped');
|
|
225
240
|
return true;
|
|
226
241
|
} catch (error) {
|
|
227
|
-
if (
|
|
242
|
+
if (
|
|
243
|
+
/** @type {Error} */ (error).message === 'Shutdown timeout' &&
|
|
244
|
+
options.force
|
|
245
|
+
) {
|
|
228
246
|
this.logger.warn('Forced shutdown after timeout');
|
|
229
247
|
this._setState(STATE_STOPPED);
|
|
230
248
|
return true;
|
|
231
249
|
}
|
|
232
|
-
this._setError('shutdown', error);
|
|
250
|
+
this._setError('shutdown', /** @type {Error} */ (error));
|
|
233
251
|
return false;
|
|
234
252
|
}
|
|
235
253
|
}
|
|
@@ -267,7 +285,7 @@ export class ServiceBase extends EventEmitter {
|
|
|
267
285
|
this.logger.info('Recovery successful');
|
|
268
286
|
return true;
|
|
269
287
|
} catch (error) {
|
|
270
|
-
this._setError('recovery', error);
|
|
288
|
+
this._setError('recovery', /** @type {Error} */ (error));
|
|
271
289
|
return false;
|
|
272
290
|
}
|
|
273
291
|
}
|
|
@@ -305,7 +323,7 @@ export class ServiceBase extends EventEmitter {
|
|
|
305
323
|
|
|
306
324
|
return true;
|
|
307
325
|
} catch (error) {
|
|
308
|
-
this._setError('destruction', error);
|
|
326
|
+
this._setError('destruction', /** @type {Error} */ (error));
|
|
309
327
|
return false;
|
|
310
328
|
}
|
|
311
329
|
}
|
|
@@ -332,7 +350,7 @@ export class ServiceBase extends EventEmitter {
|
|
|
332
350
|
return {
|
|
333
351
|
...baseHealth,
|
|
334
352
|
healthy: false,
|
|
335
|
-
checkError: error.message
|
|
353
|
+
checkError: /** @type {Error} */ (error).message
|
|
336
354
|
};
|
|
337
355
|
}
|
|
338
356
|
}
|
|
@@ -9,11 +9,11 @@ export type ServiceOptions = {
|
|
|
9
9
|
/**
|
|
10
10
|
* - Initial log level for the service
|
|
11
11
|
*/
|
|
12
|
-
logLevel?: string;
|
|
12
|
+
logLevel?: string | undefined;
|
|
13
13
|
/**
|
|
14
14
|
* - Timeout for graceful shutdown
|
|
15
15
|
*/
|
|
16
|
-
shutdownTimeout?: number;
|
|
16
|
+
shutdownTimeout?: number | undefined;
|
|
17
17
|
};
|
|
18
18
|
/**
|
|
19
19
|
* Options for stopping a service
|
|
@@ -22,11 +22,11 @@ export type StopOptions = {
|
|
|
22
22
|
/**
|
|
23
23
|
* - Override shutdown timeout
|
|
24
24
|
*/
|
|
25
|
-
timeout?: number;
|
|
25
|
+
timeout?: number | undefined;
|
|
26
26
|
/**
|
|
27
27
|
* - Force stop even if timeout exceeded
|
|
28
28
|
*/
|
|
29
|
-
force?: boolean;
|
|
29
|
+
force?: boolean | undefined;
|
|
30
30
|
};
|
|
31
31
|
/**
|
|
32
32
|
* Health status returned by service health checks
|
|
@@ -47,11 +47,11 @@ export type HealthStatus = {
|
|
|
47
47
|
/**
|
|
48
48
|
* - Error message if unhealthy
|
|
49
49
|
*/
|
|
50
|
-
error?: string;
|
|
50
|
+
error?: string | undefined;
|
|
51
51
|
/**
|
|
52
52
|
* - Error from health check itself
|
|
53
53
|
*/
|
|
54
|
-
checkError?: string;
|
|
54
|
+
checkError?: string | undefined;
|
|
55
55
|
/**
|
|
56
56
|
* - Additional health check properties
|
|
57
57
|
*/
|
|
@@ -61,7 +61,7 @@ export type HealthStatus = {
|
|
|
61
61
|
* Base class interface that services must implement
|
|
62
62
|
* Allows additional custom properties and methods via Record<string, any>
|
|
63
63
|
*/
|
|
64
|
-
export type ServiceInstance =
|
|
64
|
+
export type ServiceInstance = Object & Record<string, any>;
|
|
65
65
|
export type StateChangeEvent = {
|
|
66
66
|
/**
|
|
67
67
|
* - Service name (added by ServiceManager)
|
|
@@ -94,7 +94,7 @@ export type HealthChangeEvent = {
|
|
|
94
94
|
/**
|
|
95
95
|
* - Previous health status
|
|
96
96
|
*/
|
|
97
|
-
wasHealthy?: boolean;
|
|
97
|
+
wasHealthy?: boolean | undefined;
|
|
98
98
|
};
|
|
99
99
|
/**
|
|
100
100
|
* Event emitted when service encounters an error
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
* @typedef {import('./typedef.js').HealthCheckResult} HealthCheckResult
|
|
8
8
|
*
|
|
9
9
|
* @typedef {import('../service-base/typedef.js').StopOptions} StopOptions
|
|
10
|
+
* @typedef {import('../service-base/typedef.js').StateChangeEvent} StateChangeEvent
|
|
11
|
+
* @typedef {import('../service-base/typedef.js').HealthChangeEvent} HealthChangeEvent
|
|
12
|
+
* @typedef {import('../service-base/typedef.js').ServiceErrorEvent} ServiceErrorEvent
|
|
13
|
+
* @typedef {import('../../logging/typedef.js').LogEvent} LogEvent
|
|
10
14
|
*/
|
|
11
15
|
/**
|
|
12
16
|
* Service Manager for lifecycle and dependency management
|
|
@@ -131,11 +135,11 @@ export class ServiceManager extends EventEmitter {
|
|
|
131
135
|
/**
|
|
132
136
|
* Listen to log messages emitted by individual services
|
|
133
137
|
*
|
|
134
|
-
* @param {
|
|
138
|
+
* @param {(logEvent: LogEvent) => void} listener - Log event handler
|
|
135
139
|
*
|
|
136
140
|
* @returns {Function} Unsubscribe function
|
|
137
141
|
*/
|
|
138
|
-
onServiceLogEvent(listener:
|
|
142
|
+
onServiceLogEvent(listener: (logEvent: LogEvent) => void): Function;
|
|
139
143
|
/**
|
|
140
144
|
* Set log level for the ServiceManager itself
|
|
141
145
|
*
|
|
@@ -181,5 +185,9 @@ export type ServiceEntry = import("./typedef.js").ServiceEntry;
|
|
|
181
185
|
export type ServiceConfigOrLabel = import("./typedef.js").ServiceConfigOrLabel;
|
|
182
186
|
export type HealthCheckResult = import("./typedef.js").HealthCheckResult;
|
|
183
187
|
export type StopOptions = import("../service-base/typedef.js").StopOptions;
|
|
188
|
+
export type StateChangeEvent = import("../service-base/typedef.js").StateChangeEvent;
|
|
189
|
+
export type HealthChangeEvent = import("../service-base/typedef.js").HealthChangeEvent;
|
|
190
|
+
export type ServiceErrorEvent = import("../service-base/typedef.js").ServiceErrorEvent;
|
|
191
|
+
export type LogEvent = import("../../logging/typedef.js").LogEvent;
|
|
184
192
|
import { EventEmitter } from '../../generic/events.js';
|
|
185
193
|
import { Logger } from '../../logging/index.js';
|
|
@@ -85,6 +85,10 @@ import {
|
|
|
85
85
|
* @typedef {import('./typedef.js').HealthCheckResult} HealthCheckResult
|
|
86
86
|
*
|
|
87
87
|
* @typedef {import('../service-base/typedef.js').StopOptions} StopOptions
|
|
88
|
+
* @typedef {import('../service-base/typedef.js').StateChangeEvent} StateChangeEvent
|
|
89
|
+
* @typedef {import('../service-base/typedef.js').HealthChangeEvent} HealthChangeEvent
|
|
90
|
+
* @typedef {import('../service-base/typedef.js').ServiceErrorEvent} ServiceErrorEvent
|
|
91
|
+
* @typedef {import('../../logging/typedef.js').LogEvent} LogEvent
|
|
88
92
|
*/
|
|
89
93
|
|
|
90
94
|
/**
|
|
@@ -106,7 +110,8 @@ export class ServiceManager extends EventEmitter {
|
|
|
106
110
|
/** @type {Map<string, ServiceEntry>} */
|
|
107
111
|
this.services = new Map();
|
|
108
112
|
|
|
109
|
-
const defaultLogLevel =
|
|
113
|
+
const defaultLogLevel =
|
|
114
|
+
config.defaultLogLevel || (config.debug ? DEBUG : INFO);
|
|
110
115
|
const managerLogLevel = config.managerLogLevel || defaultLogLevel;
|
|
111
116
|
const serviceLogLevels = config.serviceLogLevels;
|
|
112
117
|
|
|
@@ -118,16 +123,16 @@ export class ServiceManager extends EventEmitter {
|
|
|
118
123
|
debug: config.debug ?? false,
|
|
119
124
|
autoStart: config.autoStart ?? false,
|
|
120
125
|
stopTimeout: config.stopTimeout || 10000,
|
|
121
|
-
defaultLogLevel
|
|
122
|
-
managerLogLevel
|
|
126
|
+
defaultLogLevel
|
|
127
|
+
// managerLogLevel will be set bysetManagerLogLevel()
|
|
123
128
|
// serviceLogLevels will be set by setServiceLogLevel()
|
|
124
129
|
};
|
|
125
130
|
|
|
131
|
+
this.setManagerLogLevel(managerLogLevel);
|
|
132
|
+
|
|
126
133
|
if (serviceLogLevels) {
|
|
127
134
|
this.setServiceLogLevel(serviceLogLevels);
|
|
128
135
|
}
|
|
129
|
-
|
|
130
|
-
this.#setupLogging();
|
|
131
136
|
}
|
|
132
137
|
|
|
133
138
|
/**
|
|
@@ -196,10 +201,8 @@ export class ServiceManager extends EventEmitter {
|
|
|
196
201
|
|
|
197
202
|
// Track dependents
|
|
198
203
|
entry.dependencies.forEach((dep) => {
|
|
199
|
-
const depEntry = this
|
|
200
|
-
|
|
201
|
-
depEntry.dependents.add(name);
|
|
202
|
-
}
|
|
204
|
+
const depEntry = this.#getServiceEntry(dep);
|
|
205
|
+
depEntry.dependents.add(name);
|
|
203
206
|
});
|
|
204
207
|
|
|
205
208
|
this.services.set(name, entry);
|
|
@@ -219,11 +222,8 @@ export class ServiceManager extends EventEmitter {
|
|
|
219
222
|
* Service instance or null if not found
|
|
220
223
|
*/
|
|
221
224
|
get(name) {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
this.logger.warn(`Service '${name}' not found`);
|
|
225
|
-
return null;
|
|
226
|
-
}
|
|
225
|
+
// @throws service not found
|
|
226
|
+
const entry = this.#getServiceEntry(name);
|
|
227
227
|
|
|
228
228
|
if (!entry.instance) {
|
|
229
229
|
try {
|
|
@@ -240,7 +240,10 @@ export class ServiceManager extends EventEmitter {
|
|
|
240
240
|
|
|
241
241
|
this.logger.debug(`Created instance for '${name}'`);
|
|
242
242
|
} catch (error) {
|
|
243
|
-
this.logger.error(
|
|
243
|
+
this.logger.error(
|
|
244
|
+
`Failed to create instance for '${name}'`,
|
|
245
|
+
/** @type {Error} */ (error)
|
|
246
|
+
);
|
|
244
247
|
return null;
|
|
245
248
|
}
|
|
246
249
|
}
|
|
@@ -259,7 +262,8 @@ export class ServiceManager extends EventEmitter {
|
|
|
259
262
|
const instance = this.get(name);
|
|
260
263
|
if (!instance) return false;
|
|
261
264
|
|
|
262
|
-
const entry = this
|
|
265
|
+
const entry = this.#getServiceEntry(name);
|
|
266
|
+
|
|
263
267
|
const config = await this.#resolveServiceConfig(name, entry);
|
|
264
268
|
|
|
265
269
|
return await instance.configure(config);
|
|
@@ -273,7 +277,7 @@ export class ServiceManager extends EventEmitter {
|
|
|
273
277
|
* @returns {Promise<boolean>} True if service started successfully
|
|
274
278
|
*/
|
|
275
279
|
async startService(name) {
|
|
276
|
-
const entry = this
|
|
280
|
+
const entry = this.#getServiceEntry(name);
|
|
277
281
|
if (!entry) {
|
|
278
282
|
this.logger.warn(`Cannot start unregistered service '${name}'`);
|
|
279
283
|
return false;
|
|
@@ -324,13 +328,15 @@ export class ServiceManager extends EventEmitter {
|
|
|
324
328
|
*/
|
|
325
329
|
async stopService(name, options = {}) {
|
|
326
330
|
const instance = this.get(name);
|
|
331
|
+
|
|
327
332
|
if (!instance) {
|
|
328
333
|
this.logger.warn(`Cannot stop unregistered service '${name}'`);
|
|
329
334
|
return true; // Already stopped
|
|
330
335
|
}
|
|
331
336
|
|
|
332
337
|
// Check dependents
|
|
333
|
-
const entry = this
|
|
338
|
+
const entry = this.#getServiceEntry(name);
|
|
339
|
+
|
|
334
340
|
if (!options.force && entry && entry.dependents.size > 0) {
|
|
335
341
|
const runningDependents = [];
|
|
336
342
|
for (const dep of entry.dependents) {
|
|
@@ -489,7 +495,7 @@ export class ServiceManager extends EventEmitter {
|
|
|
489
495
|
/**
|
|
490
496
|
* Listen to log messages emitted by individual services
|
|
491
497
|
*
|
|
492
|
-
* @param {
|
|
498
|
+
* @param {(logEvent: LogEvent) => void} listener - Log event handler
|
|
493
499
|
*
|
|
494
500
|
* @returns {Function} Unsubscribe function
|
|
495
501
|
*/
|
|
@@ -528,7 +534,9 @@ export class ServiceManager extends EventEmitter {
|
|
|
528
534
|
} else {
|
|
529
535
|
// Single service name
|
|
530
536
|
if (!level) {
|
|
531
|
-
throw new Error(
|
|
537
|
+
throw new Error(
|
|
538
|
+
`Level parameter required for service '${nameOrConfig}'`
|
|
539
|
+
);
|
|
532
540
|
}
|
|
533
541
|
serviceLevels[nameOrConfig] = level;
|
|
534
542
|
}
|
|
@@ -579,27 +587,45 @@ export class ServiceManager extends EventEmitter {
|
|
|
579
587
|
*/
|
|
580
588
|
_attachServiceEvents(name, instance) {
|
|
581
589
|
// Forward service events
|
|
582
|
-
instance.on('stateChanged', (data) => {
|
|
590
|
+
instance.on('stateChanged', (/** @type {StateChangeEvent} */ data) => {
|
|
583
591
|
this.emit('service:stateChanged', { service: name, data });
|
|
584
592
|
});
|
|
585
593
|
|
|
586
|
-
instance.on('healthChanged', (data) => {
|
|
594
|
+
instance.on('healthChanged', (/** @type {HealthChangeEvent} */ data) => {
|
|
587
595
|
this.emit('service:healthChanged', { service: name, data });
|
|
588
596
|
});
|
|
589
597
|
|
|
590
|
-
instance.on('error', (data) => {
|
|
598
|
+
instance.on('error', (/** @type {ServiceErrorEvent} */ data) => {
|
|
591
599
|
this.emit('service:error', { service: name, data });
|
|
592
600
|
});
|
|
593
601
|
|
|
594
602
|
// Forward log events
|
|
595
|
-
|
|
596
|
-
instance.logger.on('log', (logEvent) => {
|
|
603
|
+
instance.logger.on('log', (/** @type {LogEvent} */ logEvent) => {
|
|
597
604
|
this.emit('service:log', logEvent);
|
|
598
605
|
});
|
|
599
606
|
}
|
|
600
607
|
|
|
601
608
|
// Internal methods
|
|
602
609
|
|
|
610
|
+
/**
|
|
611
|
+
* Get internal service registration entry by name
|
|
612
|
+
*
|
|
613
|
+
* @param {string} name
|
|
614
|
+
*
|
|
615
|
+
* @throws {Error} service not registered
|
|
616
|
+
*
|
|
617
|
+
* @returns {ServiceEntry}
|
|
618
|
+
*/
|
|
619
|
+
#getServiceEntry(name) {
|
|
620
|
+
const entry = this.services.get(name);
|
|
621
|
+
|
|
622
|
+
if (!entry) {
|
|
623
|
+
throw new Error(`Service [${name}] has not been registered`);
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
return entry;
|
|
627
|
+
}
|
|
628
|
+
|
|
603
629
|
/**
|
|
604
630
|
* Resolve service configuration using plugins
|
|
605
631
|
*
|
|
@@ -633,23 +659,6 @@ export class ServiceManager extends EventEmitter {
|
|
|
633
659
|
}
|
|
634
660
|
}
|
|
635
661
|
|
|
636
|
-
/**
|
|
637
|
-
* Setup logging configuration based on config.debug
|
|
638
|
-
*/
|
|
639
|
-
#setupLogging() {
|
|
640
|
-
// Set default level for services based on debug flag if not explicitly set
|
|
641
|
-
if (!this.config.defaultLogLevel) {
|
|
642
|
-
this.config.defaultLogLevel = this.config.debug ? DEBUG : INFO;
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
// Set manager log level (use defaultLogLevel as fallback)
|
|
646
|
-
const managerLevel = this.config.managerLogLevel ||
|
|
647
|
-
this.config.defaultLogLevel;
|
|
648
|
-
if (managerLevel) {
|
|
649
|
-
this.logger.setLevel(managerLevel);
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
|
|
653
662
|
/**
|
|
654
663
|
* Get the appropriate log level for a service
|
|
655
664
|
*
|
|
@@ -688,7 +697,10 @@ export class ServiceManager extends EventEmitter {
|
|
|
688
697
|
const success = await this.stopService(name, options);
|
|
689
698
|
results.set(name, success);
|
|
690
699
|
} catch (error) {
|
|
691
|
-
this.logger.error(
|
|
700
|
+
this.logger.error(
|
|
701
|
+
`Error stopping '${name}'`,
|
|
702
|
+
/** @type {Error} */ (error)
|
|
703
|
+
);
|
|
692
704
|
results.set(name, false);
|
|
693
705
|
}
|
|
694
706
|
}
|
|
@@ -697,15 +709,18 @@ export class ServiceManager extends EventEmitter {
|
|
|
697
709
|
/**
|
|
698
710
|
* Sort services by dependencies using topological sort
|
|
699
711
|
*
|
|
700
|
-
* @returns {string[]} Service names in dependency order
|
|
701
712
|
* @throws {Error} If circular dependencies are detected
|
|
713
|
+
*
|
|
714
|
+
* @returns {string[]} Service names in dependency order
|
|
702
715
|
*/
|
|
703
716
|
#topologicalSort() {
|
|
717
|
+
/** @type {string[]}*/
|
|
704
718
|
const sorted = [];
|
|
719
|
+
|
|
705
720
|
const visited = new Set();
|
|
706
721
|
const visiting = new Set();
|
|
707
722
|
|
|
708
|
-
const visit = (name) => {
|
|
723
|
+
const visit = (/** @type {string} */ name) => {
|
|
709
724
|
if (visited.has(name)) return;
|
|
710
725
|
if (visiting.has(name)) {
|
|
711
726
|
throw new Error(`Circular dependency detected involving '${name}'`);
|
|
@@ -713,11 +728,10 @@ export class ServiceManager extends EventEmitter {
|
|
|
713
728
|
|
|
714
729
|
visiting.add(name);
|
|
715
730
|
|
|
716
|
-
const entry = this
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
}
|
|
731
|
+
const entry = this.#getServiceEntry(name);
|
|
732
|
+
|
|
733
|
+
for (const dep of entry.dependencies) {
|
|
734
|
+
visit(dep);
|
|
721
735
|
}
|
|
722
736
|
|
|
723
737
|
visiting.delete(name);
|
|
@@ -11,15 +11,15 @@ export type ServiceRegistrationOptions = {
|
|
|
11
11
|
/**
|
|
12
12
|
* - Services this service depends on
|
|
13
13
|
*/
|
|
14
|
-
dependencies?: string[];
|
|
14
|
+
dependencies?: string[] | undefined;
|
|
15
15
|
/**
|
|
16
16
|
* - Tags for grouping services
|
|
17
17
|
*/
|
|
18
|
-
tags?: string[];
|
|
18
|
+
tags?: string[] | undefined;
|
|
19
19
|
/**
|
|
20
20
|
* - Higher starts first
|
|
21
21
|
*/
|
|
22
|
-
startupPriority?: number;
|
|
22
|
+
startupPriority?: number | undefined;
|
|
23
23
|
};
|
|
24
24
|
/**
|
|
25
25
|
* Configuration for ServiceManager
|
|
@@ -28,23 +28,23 @@ export type ServiceManagerConfig = {
|
|
|
28
28
|
/**
|
|
29
29
|
* - Debug mode switch
|
|
30
30
|
*/
|
|
31
|
-
debug?: boolean;
|
|
31
|
+
debug?: boolean | undefined;
|
|
32
32
|
/**
|
|
33
33
|
* - Auto-start services on registration
|
|
34
34
|
*/
|
|
35
|
-
autoStart?: boolean;
|
|
35
|
+
autoStart?: boolean | undefined;
|
|
36
36
|
/**
|
|
37
37
|
* - Default timeout for stopping services
|
|
38
38
|
*/
|
|
39
|
-
stopTimeout?: number;
|
|
39
|
+
stopTimeout?: number | undefined;
|
|
40
40
|
/**
|
|
41
41
|
* - Default log level for new services
|
|
42
42
|
*/
|
|
43
|
-
defaultLogLevel?: string;
|
|
43
|
+
defaultLogLevel?: string | undefined;
|
|
44
44
|
/**
|
|
45
45
|
* - Initial log level for ServiceManager
|
|
46
46
|
*/
|
|
47
|
-
managerLogLevel?: string;
|
|
47
|
+
managerLogLevel?: string | undefined;
|
|
48
48
|
/**
|
|
49
49
|
* Per-service log levels:
|
|
50
50
|
* - String: "auth:debug,database:info"
|
|
@@ -52,7 +52,7 @@ export type ServiceManagerConfig = {
|
|
|
52
52
|
*/
|
|
53
53
|
serviceLogLevels?: string | {
|
|
54
54
|
[x: string]: string;
|
|
55
|
-
};
|
|
55
|
+
} | undefined;
|
|
56
56
|
};
|
|
57
57
|
/**
|
|
58
58
|
* Result of health check for all services
|
|
@@ -87,10 +87,11 @@ export type ServiceManagerPlugin = {
|
|
|
87
87
|
/**
|
|
88
88
|
* - Optional config resolution method
|
|
89
89
|
*/
|
|
90
|
-
resolveServiceConfig?: (arg0: string, arg1: ServiceEntry, arg2: any) => Promise<any | undefined
|
|
90
|
+
resolveServiceConfig?: ((arg0: string, arg1: ServiceEntry, arg2: any) => Promise<any | undefined>) | undefined;
|
|
91
91
|
};
|
|
92
92
|
/**
|
|
93
|
-
* Internal service registry entry
|
|
93
|
+
* Internal service registry entry, an internal registry entry that the
|
|
94
|
+
* ServiceManager uses to track each registered service.
|
|
94
95
|
*/
|
|
95
96
|
export type ServiceEntry = {
|
|
96
97
|
/**
|
|
@@ -87,7 +87,8 @@
|
|
|
87
87
|
// ============================================================================
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
|
-
* Internal service registry entry
|
|
90
|
+
* Internal service registry entry, an internal registry entry that the
|
|
91
|
+
* ServiceManager uses to track each registered service.
|
|
91
92
|
*
|
|
92
93
|
* @typedef {Object} ServiceEntry
|
|
93
94
|
* @property {ServiceConstructor} ServiceClass - Service class constructor
|
|
@@ -45,7 +45,7 @@ export default class FiniteStateMachine extends EventEmitter {
|
|
|
45
45
|
* @param {string} event
|
|
46
46
|
* @param {any[]} args
|
|
47
47
|
*/
|
|
48
|
-
debounce(wait: number, event: string, ...args: any[]): Promise<any>;
|
|
48
|
+
debounce(wait: number | undefined, event: string, ...args: any[]): Promise<any>;
|
|
49
49
|
/** The current state. */
|
|
50
50
|
get current(): any;
|
|
51
51
|
#private;
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
* Event emitted when entering a state
|
|
7
7
|
* @type {string}
|
|
8
8
|
*/
|
|
9
|
-
export const ENTER = '
|
|
9
|
+
export const ENTER = '_enter';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Event emitted when exiting a state
|
|
13
13
|
* @type {string}
|
|
14
14
|
*/
|
|
15
|
-
export const EXIT = '
|
|
15
|
+
export const EXIT = '_exit';
|
|
@@ -21,7 +21,7 @@ export namespace metaThemeColorBase {
|
|
|
21
21
|
function get(): void;
|
|
22
22
|
}
|
|
23
23
|
export namespace metaThemeColorDark {
|
|
24
|
-
let subscribe_1: (this: void, run: import("svelte/store").Subscriber<string>, invalidate?: () => void) => import("svelte/store").Unsubscriber;
|
|
24
|
+
let subscribe_1: (this: void, run: import("svelte/store").Subscriber<string | null>, invalidate?: () => void) => import("svelte/store").Unsubscriber;
|
|
25
25
|
export { subscribe_1 as subscribe };
|
|
26
26
|
export function get_1(): void;
|
|
27
27
|
export { get_1 as get };
|
|
@@ -3,17 +3,17 @@ type ButtonGroup = {
|
|
|
3
3
|
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
4
|
$set?(props: Partial<{
|
|
5
5
|
[attr: string]: any;
|
|
6
|
-
base?: string;
|
|
7
|
-
bg?: string;
|
|
8
|
-
classes?: string;
|
|
6
|
+
base?: string | undefined;
|
|
7
|
+
bg?: string | undefined;
|
|
8
|
+
classes?: string | undefined;
|
|
9
9
|
buttons: ButtonDef[];
|
|
10
|
-
selected?: ButtonDef;
|
|
11
|
-
select?: (label: string) => void;
|
|
10
|
+
selected?: ButtonDef | null | undefined;
|
|
11
|
+
select?: ((label: string) => void) | undefined;
|
|
12
12
|
buttonSnippet: Snippet<[{
|
|
13
13
|
text: string;
|
|
14
14
|
value: string;
|
|
15
15
|
label: string;
|
|
16
|
-
props:
|
|
16
|
+
props: Object;
|
|
17
17
|
}]>;
|
|
18
18
|
}>): void;
|
|
19
19
|
};
|
|
@@ -29,6 +29,6 @@ declare const ButtonGroup: import("svelte").Component<{
|
|
|
29
29
|
text: string;
|
|
30
30
|
value: string;
|
|
31
31
|
label: string;
|
|
32
|
-
props:
|
|
32
|
+
props: Object;
|
|
33
33
|
}]>;
|
|
34
34
|
}, {}, "select" | "selected">;
|
|
@@ -2,11 +2,11 @@ export default CompareLeftRight;
|
|
|
2
2
|
type CompareLeftRight = {
|
|
3
3
|
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
4
|
$set?(props: Partial<{
|
|
5
|
-
leftContent?: Snippet<[]
|
|
6
|
-
rightContent?: Snippet<[]
|
|
7
|
-
classes?: string;
|
|
8
|
-
dividerColor?: string;
|
|
9
|
-
handleColor?: string;
|
|
5
|
+
leftContent?: Snippet<[]> | undefined;
|
|
6
|
+
rightContent?: Snippet<[]> | undefined;
|
|
7
|
+
classes?: string | undefined;
|
|
8
|
+
dividerColor?: string | undefined;
|
|
9
|
+
handleColor?: string | undefined;
|
|
10
10
|
} & Record<string, any>>): void;
|
|
11
11
|
};
|
|
12
12
|
declare const CompareLeftRight: import("svelte").Component<{
|