topsyde-utils 1.0.19 → 1.0.22

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/dist/errors.d.ts CHANGED
@@ -18,20 +18,31 @@ export declare enum HTTP_ERROR_CODE {
18
18
  NOT_FOUND = 404,
19
19
  INTERNAL_SERVER_ERROR = 500
20
20
  }
21
+ /**
22
+ * WebSocket close event codes
23
+ *
24
+ * Standard codes (1000-1999):
25
+ * - 1000-1015: Reserved for the WebSocket protocol
26
+ *
27
+ * Application-specific codes:
28
+ * - 4000-4999: Reserved for application use
29
+ */
21
30
  export declare enum WS_ERROR_CODE {
22
- NORMAL_CLOSURE = 1000,
23
- GOING_AWAY = 1001,
24
- PROTOCOL_ERROR = 1002,
25
- UNSUPPORTED_DATA = 1003,
26
- NO_STATUS_RECEIVED = 1005,
27
- ABNORMAL_CLOSURE = 1006,
28
- INVALID_FRAME_PAYLOAD_DATA = 1007,
29
- POLICY_VIOLATION = 1008,
30
- MESSAGE_TOO_BIG = 1009,
31
- MISSING_EXTENSION = 1010,
32
- INTERNAL_ERROR = 1011,
33
- SERVICE_RESTART = 1012,
34
- TRY_AGAIN_LATER = 1013,
35
- BAD_GATEWAY = 1014,
36
- TLS_HANDSHAKE = 1015
31
+ NORMAL_CLOSURE = 1000,// Normal closure; the connection successfully completed whatever purpose for which it was created
32
+ GOING_AWAY = 1001,// The endpoint is going away (server shutdown or browser navigating away)
33
+ PROTOCOL_ERROR = 1002,// Protocol error
34
+ UNSUPPORTED_DATA = 1003,// Received data of a type it cannot accept (e.g., text-only endpoint received binary data)
35
+ NO_STATUS_RECEIVED = 1005,// No status code was provided even though one was expected
36
+ ABNORMAL_CLOSURE = 1006,// Connection was closed abnormally (e.g., without sending or receiving a Close control frame)
37
+ INVALID_FRAME_PAYLOAD_DATA = 1007,// Received data that was not consistent with the type of the message
38
+ POLICY_VIOLATION = 1008,// Policy violation
39
+ MESSAGE_TOO_BIG = 1009,// Message was too big and was rejected
40
+ MISSING_EXTENSION = 1010,// Client expected the server to negotiate one or more extension, but server didn't
41
+ INTERNAL_ERROR = 1011,// Server encountered an unexpected condition that prevented it from fulfilling the request
42
+ SERVICE_RESTART = 1012,// Server is restarting
43
+ TRY_AGAIN_LATER = 1013,// Server is too busy or the client is rate-limited
44
+ BAD_GATEWAY = 1014,// Gateway or proxy received an invalid response from the upstream server
45
+ TLS_HANDSHAKE = 1015,// TLS handshake failure
46
+ APP_AUTHENTICATION_FAILED = 4000,
47
+ APP_INVALID_MESSAGE_FORMAT = 4001
37
48
  }
package/dist/errors.js CHANGED
@@ -24,9 +24,18 @@ var HTTP_ERROR_CODE;
24
24
  HTTP_ERROR_CODE[HTTP_ERROR_CODE["NOT_FOUND"] = 404] = "NOT_FOUND";
25
25
  HTTP_ERROR_CODE[HTTP_ERROR_CODE["INTERNAL_SERVER_ERROR"] = 500] = "INTERNAL_SERVER_ERROR";
26
26
  })(HTTP_ERROR_CODE || (exports.HTTP_ERROR_CODE = HTTP_ERROR_CODE = {}));
27
+ /**
28
+ * WebSocket close event codes
29
+ *
30
+ * Standard codes (1000-1999):
31
+ * - 1000-1015: Reserved for the WebSocket protocol
32
+ *
33
+ * Application-specific codes:
34
+ * - 4000-4999: Reserved for application use
35
+ */
27
36
  var WS_ERROR_CODE;
28
37
  (function (WS_ERROR_CODE) {
29
- // WebSocket close event codes
38
+ // Standard WebSocket close codes (1000-1015)
30
39
  WS_ERROR_CODE[WS_ERROR_CODE["NORMAL_CLOSURE"] = 1000] = "NORMAL_CLOSURE";
31
40
  WS_ERROR_CODE[WS_ERROR_CODE["GOING_AWAY"] = 1001] = "GOING_AWAY";
32
41
  WS_ERROR_CODE[WS_ERROR_CODE["PROTOCOL_ERROR"] = 1002] = "PROTOCOL_ERROR";
@@ -42,5 +51,10 @@ var WS_ERROR_CODE;
42
51
  WS_ERROR_CODE[WS_ERROR_CODE["TRY_AGAIN_LATER"] = 1013] = "TRY_AGAIN_LATER";
43
52
  WS_ERROR_CODE[WS_ERROR_CODE["BAD_GATEWAY"] = 1014] = "BAD_GATEWAY";
44
53
  WS_ERROR_CODE[WS_ERROR_CODE["TLS_HANDSHAKE"] = 1015] = "TLS_HANDSHAKE";
54
+ // Application-specific codes (4000-4999)
55
+ // Add your application-specific codes here as needed
56
+ // Example:
57
+ WS_ERROR_CODE[WS_ERROR_CODE["APP_AUTHENTICATION_FAILED"] = 4000] = "APP_AUTHENTICATION_FAILED";
58
+ WS_ERROR_CODE[WS_ERROR_CODE["APP_INVALID_MESSAGE_FORMAT"] = 4001] = "APP_INVALID_MESSAGE_FORMAT";
45
59
  })(WS_ERROR_CODE || (exports.WS_ERROR_CODE = WS_ERROR_CODE = {}));
46
60
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,IAAY,UAWX;AAXD,WAAY,UAAU;IACrB,wDAAe,CAAA;IACf,6DAAiB,CAAA;IACjB,+DAAkB,CAAA;IAClB,iEAAmB,CAAA;IACnB,uEAAsB,CAAA;IACtB,+DAAkB,CAAA;IAClB,mEAAoB,CAAA;IACpB,qEAAqB,CAAA;IACrB,2EAAwB,CAAA;IACxB,+DAAkB,CAAA;AACnB,CAAC,EAXW,UAAU,0BAAV,UAAU,QAWrB;AAED,IAAY,eAOX;AAPD,WAAY,eAAe;IAC1B,mDAAQ,CAAA;IACR,qEAAiB,CAAA;IACjB,uEAAkB,CAAA;IAClB,iEAAe,CAAA;IACf,iEAAe,CAAA;IACf,yFAA2B,CAAA;AAC5B,CAAC,EAPW,eAAe,+BAAf,eAAe,QAO1B;AAED,IAAY,aAiBX;AAjBD,WAAY,aAAa;IACxB,8BAA8B;IAC9B,wEAAqB,CAAA;IACrB,gEAAiB,CAAA;IACjB,wEAAqB,CAAA;IACrB,4EAAuB,CAAA;IACvB,gFAAyB,CAAA;IACzB,4EAAuB,CAAA;IACvB,gGAAiC,CAAA;IACjC,4EAAuB,CAAA;IACvB,0EAAsB,CAAA;IACtB,8EAAwB,CAAA;IACxB,wEAAqB,CAAA;IACrB,0EAAsB,CAAA;IACtB,0EAAsB,CAAA;IACtB,kEAAkB,CAAA;IAClB,sEAAoB,CAAA;AACrB,CAAC,EAjBW,aAAa,6BAAb,aAAa,QAiBxB"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,IAAY,UAWX;AAXD,WAAY,UAAU;IACrB,wDAAe,CAAA;IACf,6DAAiB,CAAA;IACjB,+DAAkB,CAAA;IAClB,iEAAmB,CAAA;IACnB,uEAAsB,CAAA;IACtB,+DAAkB,CAAA;IAClB,mEAAoB,CAAA;IACpB,qEAAqB,CAAA;IACrB,2EAAwB,CAAA;IACxB,+DAAkB,CAAA;AACnB,CAAC,EAXW,UAAU,0BAAV,UAAU,QAWrB;AAED,IAAY,eAOX;AAPD,WAAY,eAAe;IAC1B,mDAAQ,CAAA;IACR,qEAAiB,CAAA;IACjB,uEAAkB,CAAA;IAClB,iEAAe,CAAA;IACf,iEAAe,CAAA;IACf,yFAA2B,CAAA;AAC5B,CAAC,EAPW,eAAe,+BAAf,eAAe,QAO1B;AAED;;;;;;;;GAQG;AACH,IAAY,aAuBX;AAvBD,WAAY,aAAa;IACxB,6CAA6C;IAC7C,wEAAqB,CAAA;IACrB,gEAAiB,CAAA;IACjB,wEAAqB,CAAA;IACrB,4EAAuB,CAAA;IACvB,gFAAyB,CAAA;IACzB,4EAAuB,CAAA;IACvB,gGAAiC,CAAA;IACjC,4EAAuB,CAAA;IACvB,0EAAsB,CAAA;IACtB,8EAAwB,CAAA;IACxB,wEAAqB,CAAA;IACrB,0EAAsB,CAAA;IACtB,0EAAsB,CAAA;IACtB,kEAAkB,CAAA;IAClB,sEAAoB,CAAA;IAEpB,yCAAyC;IACzC,qDAAqD;IACrD,WAAW;IACX,8FAAgC,CAAA;IAChC,gGAAiC,CAAA;AAClC,CAAC,EAvBW,aAAa,6BAAb,aAAa,QAuBxB"}
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export { default as Lib } from "./lib";
5
5
  export { default as Router_internal } from "./router/router.internal";
6
6
  export { default as Router } from "./router/router";
7
7
  export { default as Controller } from "./server/controller";
8
+ export { default as Websocket } from "./server/websocket";
8
9
  export { default as Singleton } from "./singleton";
9
10
  export { default as Throwable } from "./throwable";
10
11
  export { RESPONSE_INIT, RESPONSE_METHOD_OPTIONS } from "./application";
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  return (mod && mod.__esModule) ? mod : { "default": mod };
6
6
  };
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.WS_ERROR_CODE = exports.HTTP_ERROR_CODE = exports.ERROR_CODE = exports.E_ENVIRONMENTS = exports.E_IS = exports.LOG_COLORS = exports.DEFAULT_FALSE_RESPONSE = exports.RESPONSE_METHOD_OPTIONS = exports.RESPONSE_INIT = exports.Throwable = exports.Singleton = exports.Controller = exports.Router = exports.Router_internal = exports.Lib = exports.Initializable = exports.Guards = exports.Application = void 0;
8
+ exports.WS_ERROR_CODE = exports.HTTP_ERROR_CODE = exports.ERROR_CODE = exports.E_ENVIRONMENTS = exports.E_IS = exports.LOG_COLORS = exports.DEFAULT_FALSE_RESPONSE = exports.RESPONSE_METHOD_OPTIONS = exports.RESPONSE_INIT = exports.Throwable = exports.Singleton = exports.Websocket = exports.Controller = exports.Router = exports.Router_internal = exports.Lib = exports.Initializable = exports.Guards = exports.Application = void 0;
9
9
  // Export all modules
10
10
  // Export default classes
11
11
  var application_1 = require("./application");
@@ -22,6 +22,8 @@ var router_1 = require("./router/router");
22
22
  Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return __importDefault(router_1).default; } });
23
23
  var controller_1 = require("./server/controller");
24
24
  Object.defineProperty(exports, "Controller", { enumerable: true, get: function () { return __importDefault(controller_1).default; } });
25
+ var websocket_1 = require("./server/websocket");
26
+ Object.defineProperty(exports, "Websocket", { enumerable: true, get: function () { return __importDefault(websocket_1).default; } });
25
27
  var singleton_1 = require("./singleton");
26
28
  Object.defineProperty(exports, "Singleton", { enumerable: true, get: function () { return __importDefault(singleton_1).default; } });
27
29
  var throwable_1 = require("./throwable");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;AAEjC,qBAAqB;AAErB,yBAAyB;AACzB,6CAAuD;AAA9C,2HAAA,OAAO,OAAe;AAC/B,mCAA6C;AAApC,iHAAA,OAAO,OAAU;AAC1B,iDAA2D;AAAlD,+HAAA,OAAO,OAAiB;AACjC,6BAAuC;AAA9B,2GAAA,OAAO,OAAO;AACvB,4DAAsE;AAA7D,mIAAA,OAAO,OAAmB;AACnC,0CAAoD;AAA3C,iHAAA,OAAO,OAAU;AAC1B,kDAA4D;AAAnD,yHAAA,OAAO,OAAc;AAC9B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAE7B,sDAAsD;AACtD,6CAAuE;AAA9D,4GAAA,aAAa,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AAC/C,mCAA8D;AAArD,gHAAA,sBAAsB,OAAA;AAAE,oGAAA,UAAU,OAAA;AAC3C,iCAA+C;AAAtC,6FAAA,IAAI,OAAA;AAAE,uGAAA,cAAc,OAAA;AAC7B,mCAAsE;AAA7D,oGAAA,UAAU,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,uGAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;AAEjC,qBAAqB;AAErB,yBAAyB;AACzB,6CAAuD;AAA9C,2HAAA,OAAO,OAAe;AAC/B,mCAA6C;AAApC,iHAAA,OAAO,OAAU;AAC1B,iDAA2D;AAAlD,+HAAA,OAAO,OAAiB;AACjC,6BAAuC;AAA9B,2GAAA,OAAO,OAAO;AACvB,4DAAsE;AAA7D,mIAAA,OAAO,OAAmB;AACnC,0CAAoD;AAA3C,iHAAA,OAAO,OAAU;AAC1B,kDAA4D;AAAnD,yHAAA,OAAO,OAAc;AAC9B,gDAA0D;AAAjD,uHAAA,OAAO,OAAa;AAC7B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAE7B,sDAAsD;AACtD,6CAAuE;AAA9D,4GAAA,aAAa,OAAA;AAAE,sHAAA,uBAAuB,OAAA;AAC/C,mCAA8D;AAArD,gHAAA,sBAAsB,OAAA;AAAE,oGAAA,UAAU,OAAA;AAC3C,iCAA+C;AAAtC,6FAAA,IAAI,OAAA;AAAE,uGAAA,cAAc,OAAA;AAC7B,mCAAsE;AAA7D,oGAAA,UAAU,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,uGAAA,aAAa,OAAA"}
@@ -1,2 +1,4 @@
1
+ export * from './websocket';
2
+ export { default as Websocket } from './websocket';
1
3
  export * from './controller';
2
4
  export { default as Controller } from './controller';
@@ -19,7 +19,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
19
19
  return (mod && mod.__esModule) ? mod : { "default": mod };
20
20
  };
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.Controller = void 0;
22
+ exports.Controller = exports.Websocket = void 0;
23
+ __exportStar(require("./websocket"), exports);
24
+ var websocket_1 = require("./websocket");
25
+ Object.defineProperty(exports, "Websocket", { enumerable: true, get: function () { return __importDefault(websocket_1).default; } });
23
26
  __exportStar(require("./controller"), exports);
24
27
  var controller_1 = require("./controller");
25
28
  Object.defineProperty(exports, "Controller", { enumerable: true, get: function () { return __importDefault(controller_1).default; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,+CAA6B;AAC7B,2CAAqD;AAA5C,yHAAA,OAAO,OAAc"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,iCAAiC;;;;;;;;;;;;;;;;;;;;AAEjC,8CAA4B;AAC5B,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,+CAA6B;AAC7B,2CAAqD;AAA5C,yHAAA,OAAO,OAAc"}
@@ -0,0 +1,2 @@
1
+ export default class Websocket {
2
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class Websocket {
4
+ }
5
+ exports.default = Websocket;
6
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/server/websocket.ts"],"names":[],"mappings":";;AAAA,MAAqB,SAAS;CAAG;AAAjC,4BAAiC"}
@@ -1,21 +1,9 @@
1
1
  /**
2
2
  * Type representing a constructor function or class type
3
3
  */
4
- export type Constructor<T> = new (...args: any[]) => T;
5
- /**
6
- * Type for a singleton constructor with static methods
7
- */
8
- export type SingletonConstructor<T extends Singleton> = Constructor<T> & typeof Singleton;
9
- /**
10
- * Enhanced interface for singleton classes, providing type-safe instance management
11
- */
12
- export interface SingletonClass<T extends Singleton> {
13
- new (...args: any[]): T;
14
- GetInstance<U extends T>(...args: any[]): U;
15
- HasInstance(): boolean;
16
- ClearInstance(): boolean;
17
- CreateFactory<U extends T>(...args: any[]): () => U;
18
- }
4
+ export type Constructor<T> = (abstract new (...args: any[]) => T) | (new (...args: any[]) => T) | ({
5
+ prototype: T;
6
+ } & Function);
19
7
  /**
20
8
  * Base class for implementing the singleton pattern with type-safe instance management.
21
9
  * Supports constructors with any number of arguments.
@@ -24,8 +12,8 @@ export interface SingletonClass<T extends Singleton> {
24
12
  * // No constructor arguments
25
13
  * class DatabaseExample extends Singleton {
26
14
  * private constructor() { super(); }
27
- * public static connect() {
28
- * return this.getInstance();
15
+ * public static async Connection() {
16
+ * return this.GetInstance();
29
17
  * }
30
18
  * }
31
19
  *
@@ -33,65 +21,16 @@ export interface SingletonClass<T extends Singleton> {
33
21
  * // With constructor arguments
34
22
  * class EncryptionServiceExample extends Singleton {
35
23
  * private constructor(key: string, algorithm: string) { super(); }
36
- * public static create(key: string, algorithm: string) {
37
- * return this.getInstance(key, algorithm);
38
- * }
39
- * }
40
- *
41
- * @example
42
- * // Lazy initialization with factory function
43
- * class ConfigService extends Singleton {
44
- * private constructor(configPath: string) {
45
- * super();
46
- * // Heavy initialization work
47
- * }
48
- *
49
- * public static createLazy(configPath: string) {
50
- * return this.createFactory(configPath);
24
+ * public static Create(key: string, algorithm: string) {
25
+ * return this.GetInstance(key, algorithm);
51
26
  * }
52
27
  * }
53
28
  */
54
29
  declare abstract class Singleton {
55
30
  private static readonly instances;
56
- private static readonly initializationLocks;
57
- private static readonly activeInstances;
58
- /**
59
- * Protected constructor to prevent direct instantiation
60
- */
61
31
  protected constructor();
62
- /**
63
- * Gets the singleton instance of the class
64
- * Creates a new instance if one doesn't exist
65
- * @throws Error if concurrent initialization is detected
66
- */
67
- static GetInstance<T extends Singleton>(this: Constructor<T>, ...args: any[]): T;
68
- /**
69
- * Checks if an instance already exists
70
- */
71
- static HasInstance<T extends Singleton>(this: Constructor<T>): boolean;
72
- /**
73
- * Clears the instance (useful for testing or resource cleanup)
74
- * @returns true if an instance was cleared, false if no instance existed
75
- */
76
- static ClearInstance<T extends Singleton>(this: Constructor<T>): boolean;
77
- /**
78
- * Creates a factory function for lazy initialization
79
- */
80
- static CreateFactory<T extends Singleton>(this: SingletonConstructor<T>, ...args: any[]): () => T;
81
- /**
82
- * Clears all singleton instances
83
- * Primarily used for testing or application shutdown
84
- */
85
- static ClearAllInstances(): void;
86
- /**
87
- * Gets the count of active singleton instances
88
- * Useful for debugging and testing
89
- */
32
+ static GetInstance<T extends Singleton>(this: Constructor<T>): T;
33
+ static GetInstance<T extends Singleton, U extends ConstructorParameters<new (...args: any[]) => T>>(this: Constructor<T>, ...args: U): T;
90
34
  static GetInstanceCount(): number;
91
- /**
92
- * Gets the list of active singleton class names
93
- * Useful for debugging and testing
94
- */
95
- static GetActiveInstanceNames(): string[];
96
35
  }
97
36
  export default Singleton;
package/dist/singleton.js CHANGED
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  * // No constructor arguments
9
9
  * class DatabaseExample extends Singleton {
10
10
  * private constructor() { super(); }
11
- * public static connect() {
12
- * return this.getInstance();
11
+ * public static async Connection() {
12
+ * return this.GetInstance();
13
13
  * }
14
14
  * }
15
15
  *
@@ -17,123 +17,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  * // With constructor arguments
18
18
  * class EncryptionServiceExample extends Singleton {
19
19
  * private constructor(key: string, algorithm: string) { super(); }
20
- * public static create(key: string, algorithm: string) {
21
- * return this.getInstance(key, algorithm);
22
- * }
23
- * }
24
- *
25
- * @example
26
- * // Lazy initialization with factory function
27
- * class ConfigService extends Singleton {
28
- * private constructor(configPath: string) {
29
- * super();
30
- * // Heavy initialization work
31
- * }
32
- *
33
- * public static createLazy(configPath: string) {
34
- * return this.createFactory(configPath);
20
+ * public static Create(key: string, algorithm: string) {
21
+ * return this.GetInstance(key, algorithm);
35
22
  * }
36
23
  * }
37
24
  */
38
25
  class Singleton {
39
- /**
40
- * Protected constructor to prevent direct instantiation
41
- */
42
- constructor() {
43
- // Ensure the constructor is only called from getInstance
44
- const constructorName = this.constructor.name;
45
- const callerName = new Error().stack?.split("\n")[2]?.trim() || "";
46
- }
47
- /**
48
- * Gets the singleton instance of the class
49
- * Creates a new instance if one doesn't exist
50
- * @throws Error if concurrent initialization is detected
51
- */
26
+ constructor() { }
52
27
  static GetInstance(...args) {
53
28
  const classReference = this;
54
- // Fast path: return existing instance if available
55
- if (Singleton.instances.has(classReference)) {
56
- return Singleton.instances.get(classReference);
57
- }
58
- // Protection for worker thread environments
59
- if (Singleton.initializationLocks.get(classReference)) {
60
- throw new Error(`Concurrent initialization of ${classReference.name} singleton detected`);
61
- }
62
- try {
63
- Singleton.initializationLocks.set(classReference, true);
64
- // Double-check pattern to handle race conditions
65
- if (!Singleton.instances.has(classReference)) {
66
- const instance = new classReference(...args);
67
- Singleton.instances.set(classReference, instance);
68
- // Track the instance for debugging
69
- Singleton.activeInstances.set(classReference.name, classReference);
70
- }
71
- return Singleton.instances.get(classReference);
29
+ if (!Singleton.instances.has(classReference)) {
30
+ Singleton.instances.set(classReference, new classReference(...args));
72
31
  }
73
- catch (error) {
74
- throw new Error(`Failed to initialize ${classReference.name} singleton: ${error instanceof Error ? error.message : String(error)}`);
75
- }
76
- finally {
77
- Singleton.initializationLocks.delete(classReference);
78
- }
79
- }
80
- /**
81
- * Checks if an instance already exists
82
- */
83
- static HasInstance() {
84
- return Singleton.instances.has(this);
85
- }
86
- /**
87
- * Clears the instance (useful for testing or resource cleanup)
88
- * @returns true if an instance was cleared, false if no instance existed
89
- */
90
- static ClearInstance() {
91
- const hadInstance = Singleton.instances.has(this);
92
- Singleton.instances.delete(this);
93
- Singleton.activeInstances.delete(this.name);
94
- return hadInstance;
32
+ return Singleton.instances.get(classReference);
95
33
  }
96
- /**
97
- * Creates a factory function for lazy initialization
98
- */
99
- static CreateFactory(...args) {
100
- const classReference = this;
101
- return () => classReference.GetInstance(...args);
102
- }
103
- /**
104
- * Clears all singleton instances
105
- * Primarily used for testing or application shutdown
106
- */
107
- static ClearAllInstances() {
108
- const instanceCount = Singleton.GetInstanceCount();
109
- // Clear the WeakMap by removing all references
110
- Singleton.activeInstances.forEach((constructor) => {
111
- Singleton.instances.delete(constructor);
112
- });
113
- // Clear the tracking map
114
- Singleton.activeInstances.clear();
115
- console.log(`Cleared ${instanceCount} singleton instances`);
116
- }
117
- /**
118
- * Gets the count of active singleton instances
119
- * Useful for debugging and testing
120
- */
121
34
  static GetInstanceCount() {
122
- return Singleton.activeInstances.size;
123
- }
124
- /**
125
- * Gets the list of active singleton class names
126
- * Useful for debugging and testing
127
- */
128
- static GetActiveInstanceNames() {
129
- return Array.from(Singleton.activeInstances.keys());
35
+ return Singleton.instances.size;
130
36
  }
131
37
  }
132
- // Using WeakMap allows garbage collection when no references remain to the class
133
- Singleton.instances = new WeakMap();
134
- // Lock to prevent concurrent initialization in worker environments
135
- Singleton.initializationLocks = new WeakMap();
136
- // Track active instances for debugging and testing
137
- Singleton.activeInstances = new Map();
38
+ Singleton.instances = new Map();
138
39
  exports.default = Singleton;
139
40
  //# sourceMappingURL=singleton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"singleton.js","sourceRoot":"","sources":["../src/singleton.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"singleton.js","sourceRoot":"","sources":["../src/singleton.ts"],"names":[],"mappings":";;AAMA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAe,SAAS;IAGvB,gBAAyB,CAAC;IAInB,MAAM,CAAC,WAAW,CAA4C,GAAG,IAAW;QAClF,MAAM,cAAc,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9C,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,IAAK,cAAsB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAM,CAAC;IACrD,CAAC;IAEM,MAAM,CAAC,gBAAgB;QAC7B,OAAO,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;IACjC,CAAC;;AAhBuB,mBAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;AAmBpE,kBAAe,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "topsyde-utils",
3
- "version": "1.0.19",
3
+ "version": "1.0.22",
4
4
  "description": "A bundle of TypeScript utility classes and functions",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",