topsyde-utils 1.0.3 → 1.0.5

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.
Files changed (42) hide show
  1. package/README.md +12 -3
  2. package/dist/application.d.ts +1 -1
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.js +1035 -74
  5. package/dist/index.js.map +22 -1
  6. package/dist/initializable.d.ts +2 -2
  7. package/dist/router/index.d.ts +3 -3
  8. package/dist/router/router.d.ts +2 -5
  9. package/dist/router/router.internal.d.ts +2 -1
  10. package/dist/router/routes.d.ts +4 -4
  11. package/dist/server/controller.d.ts +60 -0
  12. package/dist/server/index.d.ts +2 -0
  13. package/dist/types.d.ts +5 -0
  14. package/package.json +5 -3
  15. package/dist/application.js +0 -32
  16. package/dist/application.js.map +0 -1
  17. package/dist/consts.js +0 -34
  18. package/dist/consts.js.map +0 -1
  19. package/dist/enums.js +0 -19
  20. package/dist/enums.js.map +0 -1
  21. package/dist/errors.js +0 -46
  22. package/dist/errors.js.map +0 -1
  23. package/dist/guards.js +0 -42
  24. package/dist/guards.js.map +0 -1
  25. package/dist/initializable.js +0 -309
  26. package/dist/initializable.js.map +0 -1
  27. package/dist/lib.js +0 -460
  28. package/dist/lib.js.map +0 -1
  29. package/dist/router/index.js +0 -30
  30. package/dist/router/index.js.map +0 -1
  31. package/dist/router/router.internal.js +0 -47
  32. package/dist/router/router.internal.js.map +0 -1
  33. package/dist/router/router.js +0 -43
  34. package/dist/router/router.js.map +0 -1
  35. package/dist/router/routes.js +0 -10
  36. package/dist/router/routes.js.map +0 -1
  37. package/dist/singleton.js +0 -142
  38. package/dist/singleton.js.map +0 -1
  39. package/dist/throwable.js +0 -70
  40. package/dist/throwable.js.map +0 -1
  41. package/dist/types.js +0 -3
  42. package/dist/types.js.map +0 -1
@@ -1,309 +0,0 @@
1
- "use strict";
2
- /* class Initializable {
3
- retries: number;
4
- initialized: boolean;
5
- constructor(retries: number = 25) {
6
- this.retries = retries;
7
- this.initialized = false;
8
- this.initialize();
9
- }
10
-
11
- protected initialize() {
12
- this.initialized = true;
13
- }
14
-
15
- protected async isInitialized(): Promise<boolean> {
16
- let retries = this.retries; // 5 seconds / 200ms = 25 retries
17
-
18
- while (!this.initialized && retries > 0) {
19
- await new Promise((resolve) => setTimeout(resolve, 200));
20
- retries--;
21
- }
22
-
23
- if (!this.initialized) {
24
- throw new Error("Initialization failed after 5 seconds");
25
- }
26
-
27
- return true;
28
- }
29
- }
30
-
31
- export default Initializable;
32
- */
33
- Object.defineProperty(exports, "__esModule", { value: true });
34
- /**
35
- * Base class for objects that require asynchronous initialization
36
- *
37
- * @example
38
- * class Database extends Initializable {
39
- * private connection: any;
40
- *
41
- * constructor() {
42
- * super({ retries: 10, retryInterval: 500 });
43
- * }
44
- *
45
- * protected async doInitialize(): Promise<void> {
46
- * this.connection = await connectToDatabase();
47
- * }
48
- * }
49
- *
50
- * // Usage
51
- * const db = new Database();
52
- * await db.initialize();
53
- * // or check status
54
- * if (await db.isInitialized()) {
55
- * // use the database
56
- * }
57
- */
58
- class Initializable {
59
- /**
60
- * Creates a new Initializable instance
61
- * @param options Configuration options
62
- */
63
- constructor(options = {}) {
64
- /** Whether initialization has completed successfully */
65
- this._initialized = false;
66
- /** Whether initialization is in progress */
67
- this.initializing = false;
68
- /** Whether initialization has failed */
69
- this.failed = false;
70
- /** Event listeners */
71
- this.listeners = new Map();
72
- /** Abort controller for cancellation */
73
- this.abortController = null;
74
- this.retries = options.retries ?? 25;
75
- this.retryInterval = options.retryInterval ?? 200;
76
- this.timeout = options.timeout;
77
- if (options.autoInitialize) {
78
- // Schedule initialization on next tick to allow subclass construction to complete
79
- setTimeout(() => this.initialize(), 0);
80
- }
81
- }
82
- /**
83
- * Initialize the object
84
- * @returns Promise that resolves when initialization is complete
85
- * @throws Error if initialization fails
86
- */
87
- async initialize() {
88
- // If already initialized, return immediately
89
- if (this._initialized) {
90
- return;
91
- }
92
- // If already initializing, wait for it to complete
93
- if (this.initializing) {
94
- return this.waitForInitialization();
95
- }
96
- // Start initialization
97
- this.initializing = true;
98
- this.failed = false;
99
- this.abortController = new AbortController();
100
- try {
101
- // Emit initializing event
102
- this.emit("initializing");
103
- // Call the implementation-specific initialization
104
- await this.doInitialize();
105
- // Mark as initialized
106
- this._initialized = true;
107
- this.initializing = false;
108
- // Emit initialized event
109
- this.emit("initialized");
110
- }
111
- catch (error) {
112
- // Mark as failed
113
- this.failed = true;
114
- this.initializing = false;
115
- // Emit failed event
116
- this.emit("failed", error);
117
- // Re-throw the error
118
- throw error instanceof Error ? error : new Error(`Initialization failed: ${String(error)}`);
119
- }
120
- finally {
121
- this.abortController = null;
122
- }
123
- }
124
- /**
125
- * Implementation-specific initialization logic
126
- * Override this method in subclasses to provide custom initialization
127
- */
128
- async doInitialize() {
129
- // Default implementation does nothing
130
- // Subclasses should override this method
131
- this._initialized = true;
132
- }
133
- /**
134
- * Check if the object is initialized
135
- * @param waitForIt Whether to wait for initialization to complete
136
- * @returns Promise that resolves to true if initialized, false otherwise
137
- */
138
- async isInitialized(waitForIt = false) {
139
- // If already initialized, return immediately
140
- if (this._initialized) {
141
- return true;
142
- }
143
- // If not waiting or already failed, return current status
144
- if (!waitForIt || this.failed) {
145
- return this._initialized;
146
- }
147
- // Wait for initialization to complete
148
- try {
149
- await this.waitForInitialization();
150
- return true;
151
- }
152
- catch (error) {
153
- return false;
154
- }
155
- }
156
- /**
157
- * Wait for initialization to complete
158
- * @returns Promise that resolves when initialization is complete
159
- * @throws Error if initialization fails or times out
160
- */
161
- async waitForInitialization() {
162
- // If already initialized, return immediately
163
- if (this._initialized) {
164
- return;
165
- }
166
- // If not initializing, start initialization
167
- if (!this.initializing) {
168
- return this.initialize();
169
- }
170
- const className = this.constructor.name;
171
- const maxTime = this.timeout ?? this.retries * this.retryInterval;
172
- let retries = this.retries;
173
- // Create a promise that resolves when initialization completes
174
- return new Promise((resolve, reject) => {
175
- // One-time event listeners for completion
176
- const onInitialized = () => {
177
- this.off("initialized", onInitialized);
178
- this.off("failed", onFailed);
179
- this.off("timeout", onTimeout);
180
- resolve();
181
- };
182
- const onFailed = (error) => {
183
- this.off("initialized", onInitialized);
184
- this.off("failed", onFailed);
185
- this.off("timeout", onTimeout);
186
- reject(error);
187
- };
188
- const onTimeout = () => {
189
- this.off("initialized", onInitialized);
190
- this.off("failed", onFailed);
191
- this.off("timeout", onTimeout);
192
- reject(new Error(`Initialization of ${className} timed out after ${maxTime}ms`));
193
- };
194
- // Register event listeners
195
- this.on("initialized", onInitialized);
196
- this.on("failed", onFailed);
197
- this.on("timeout", onTimeout);
198
- // Set up polling to check for timeout
199
- const checkInterval = setInterval(() => {
200
- retries--;
201
- if (this._initialized) {
202
- clearInterval(checkInterval);
203
- // Will be handled by event
204
- }
205
- else if (retries <= 0) {
206
- clearInterval(checkInterval);
207
- this.emit("timeout");
208
- }
209
- }, this.retryInterval);
210
- });
211
- }
212
- /**
213
- * Cancel initialization if in progress
214
- */
215
- cancel() {
216
- if (this.initializing && this.abortController) {
217
- this.abortController.abort();
218
- this.initializing = false;
219
- this.failed = true;
220
- this.emit("failed", new Error("Initialization cancelled"));
221
- }
222
- }
223
- /**
224
- * Reset initialization state
225
- * Allows re-initialization after failure
226
- */
227
- reset() {
228
- if (this.initializing) {
229
- this.cancel();
230
- }
231
- this._initialized = false;
232
- this.initializing = false;
233
- this.failed = false;
234
- }
235
- /**
236
- * Register an event listener
237
- * @param event Event name
238
- * @param callback Function to call when event is emitted
239
- * @returns this for chaining
240
- */
241
- on(event, callback) {
242
- if (!this.listeners.has(event)) {
243
- this.listeners.set(event, []);
244
- }
245
- this.listeners.get(event).push(callback);
246
- return this;
247
- }
248
- /**
249
- * Remove an event listener
250
- * @param event Event name
251
- * @param callback Function to remove
252
- * @returns this for chaining
253
- */
254
- off(event, callback) {
255
- if (this.listeners.has(event)) {
256
- const callbacks = this.listeners.get(event);
257
- const index = callbacks.indexOf(callback);
258
- if (index !== -1) {
259
- callbacks.splice(index, 1);
260
- }
261
- }
262
- return this;
263
- }
264
- /**
265
- * Emit an event
266
- * @param event Event name
267
- * @param args Arguments to pass to listeners
268
- */
269
- emit(event, ...args) {
270
- if (this.listeners.has(event)) {
271
- const callbacks = [...this.listeners.get(event)];
272
- callbacks.forEach((callback) => {
273
- try {
274
- callback(...args);
275
- }
276
- catch (error) {
277
- console.error(`Error in ${event} event listener:`, error);
278
- }
279
- });
280
- }
281
- }
282
- /**
283
- * Get the abort signal for cancellation
284
- * Can be passed to fetch or other cancellable operations
285
- */
286
- get abortSignal() {
287
- return this.abortController?.signal;
288
- }
289
- /**
290
- * Check if initialization has been completed
291
- */
292
- get initialized() {
293
- return this._initialized;
294
- }
295
- /**
296
- * Check if initialization is in progress
297
- */
298
- get isInitializing() {
299
- return this.initializing;
300
- }
301
- /**
302
- * Check if initialization has failed
303
- */
304
- get hasFailed() {
305
- return this.failed;
306
- }
307
- }
308
- exports.default = Initializable;
309
- //# sourceMappingURL=initializable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"initializable.js","sourceRoot":"","sources":["../src/initializable.ts"],"names":[],"mappings":"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"}