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 +26 -15
- package/dist/errors.js +15 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +4 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/websocket.d.ts +2 -0
- package/dist/server/websocket.js +6 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/singleton.d.ts +9 -70
- package/dist/singleton.js +10 -109
- package/dist/singleton.js.map +1 -1
- package/package.json +1 -1
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
|
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
|
package/dist/errors.js.map
CHANGED
@@ -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,
|
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"}
|
package/dist/server/index.d.ts
CHANGED
package/dist/server/index.js
CHANGED
@@ -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; } });
|
package/dist/server/index.js.map
CHANGED
@@ -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 @@
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/server/websocket.ts"],"names":[],"mappings":";;AAAA,MAAqB,SAAS;CAAG;AAAjC,4BAAiC"}
|
package/dist/singleton.d.ts
CHANGED
@@ -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
|
-
|
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
|
28
|
-
* return this.
|
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
|
37
|
-
* return this.
|
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
|
-
|
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
|
12
|
-
* return this.
|
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
|
21
|
-
* return this.
|
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
|
-
|
55
|
-
|
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
|
-
|
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.
|
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
|
-
|
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
|
package/dist/singleton.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../src/singleton.ts"],"names":[],"mappings":";;
|
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"}
|