@futdevpro/nts-dynamo 1.9.15 → 1.9.16

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 (117) hide show
  1. package/.copilot/patterns.json +7 -7
  2. package/.github/workflows/main.yml +206 -0
  3. package/HOWTO.md +15 -15
  4. package/README.md +140 -140
  5. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  6. package/build/_models/control-models/endpoint-params.control-model.js +2 -0
  7. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  8. package/build/_models/control-models/socket-event.control-model.js +1 -1
  9. package/build/_services/core/global.service.d.ts.map +1 -1
  10. package/build/_services/core/global.service.js +1 -0
  11. package/build/_services/core/global.service.js.map +1 -1
  12. package/build/_services/route/routing-module.service.d.ts +1 -0
  13. package/build/_services/route/routing-module.service.d.ts.map +1 -1
  14. package/build/_services/route/routing-module.service.js +17 -23
  15. package/build/_services/route/routing-module.service.js.map +1 -1
  16. package/build/_services/server/app.server.d.ts.map +1 -1
  17. package/build/_services/server/app.server.js +4 -1
  18. package/build/_services/server/app.server.js.map +1 -1
  19. package/build/_services/socket/socket-client.service.d.ts.map +1 -1
  20. package/build/_services/socket/socket-client.service.js +1 -0
  21. package/build/_services/socket/socket-client.service.js.map +1 -1
  22. package/nodemon.json +17 -15
  23. package/package.json +5 -5
  24. package/src/_constants/global-settings.const.ts +27 -27
  25. package/src/_constants/index.ts +2 -2
  26. package/src/_constants/mocks/app-extended-server.mock.ts +198 -198
  27. package/src/_constants/mocks/app-params.mock.ts +9 -9
  28. package/src/_constants/mocks/app-server.mock.ts +185 -185
  29. package/src/_constants/mocks/auth-service.mock.ts +28 -28
  30. package/src/_constants/mocks/controller.mock.ts +16 -16
  31. package/src/_constants/mocks/data-model.mock.ts +83 -83
  32. package/src/_constants/mocks/email-service-collection.mock.ts +13 -13
  33. package/src/_constants/mocks/email-service.mock.ts +19 -19
  34. package/src/_constants/mocks/email-template.mock.html +14 -14
  35. package/src/_constants/mocks/endpoint.mock.ts +90 -90
  36. package/src/_constants/mocks/socket-client.mock.ts +43 -43
  37. package/src/_constants/mocks/socket-server.mock.ts +43 -43
  38. package/src/_enums/data-model-type.enum.ts +14 -14
  39. package/src/_enums/data-service-function.enum.ts +15 -15
  40. package/src/_enums/http/http-call-type.enum.ts +12 -12
  41. package/src/_enums/http/http-response-type.enum.ts +7 -7
  42. package/src/_enums/http/socket-event-type.enum.ts +18 -18
  43. package/src/_enums/index.ts +13 -13
  44. package/src/_enums/predefined-data-types.enum.ts +27 -27
  45. package/src/_enums/route-security.enum.ts +12 -12
  46. package/src/_enums/socket-security.enum.ts +11 -11
  47. package/src/_models/control-models/api-call-params.control-model.ts +126 -126
  48. package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
  49. package/src/_models/control-models/app-params.control-model.ts +45 -45
  50. package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
  51. package/src/_models/control-models/endpoint-params.control-model.ts +309 -307
  52. package/src/_models/control-models/http-settings.control-model.ts +29 -29
  53. package/src/_models/control-models/index.ts +13 -13
  54. package/src/_models/control-models/socket-client-service-params.control-model.ts +28 -28
  55. package/src/_models/control-models/socket-event.control-model.ts +150 -150
  56. package/src/_models/control-models/socket-presence.control-model.ts +207 -207
  57. package/src/_models/control-models/socket-server-service-params.control-model.ts +20 -20
  58. package/src/_models/control-models/system-control.control-model.ts +12 -12
  59. package/src/_models/index.ts +9 -9
  60. package/src/_models/interfaces/certification-settings.interface.ts +7 -7
  61. package/src/_models/interfaces/global-service-settings.interface.ts +45 -45
  62. package/src/_models/interfaces/global-settings.interface.ts +83 -83
  63. package/src/_models/interfaces/index.ts +7 -7
  64. package/src/_models/interfaces/routing-module-settings.interface.ts +20 -20
  65. package/src/_models/types/db-filter.type.ts +108 -108
  66. package/src/_models/types/db-update.type.ts +100 -100
  67. package/src/_models/types/index.ts +5 -5
  68. package/src/_modules/api-service.index.ts +12 -12
  69. package/src/_modules/app-extended.index.ts +28 -28
  70. package/src/_modules/app.index.ts +24 -24
  71. package/src/_modules/auth.index.ts +7 -7
  72. package/src/_modules/constants.index.ts +2 -2
  73. package/src/_modules/controller.index.ts +10 -10
  74. package/src/_modules/custom-data/custom-data.controller.ts +69 -69
  75. package/src/_modules/custom-data/custom-data.data-service.ts +20 -20
  76. package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +23 -23
  77. package/src/_modules/custom-data/index.ts +6 -6
  78. package/src/_modules/custom-data-module.index.ts +2 -2
  79. package/src/_modules/data-service.index.ts +9 -9
  80. package/src/_modules/email.index.ts +8 -8
  81. package/src/_modules/enums.index.ts +2 -2
  82. package/src/_modules/extended.index.ts +8 -8
  83. package/src/_modules/models.index.ts +2 -2
  84. package/src/_modules/services.index.ts +2 -2
  85. package/src/_modules/test/get-test-routing-module.util.ts +23 -23
  86. package/src/_modules/test/index.ts +5 -5
  87. package/src/_modules/test/test.controller.ts +115 -115
  88. package/src/_modules/test-module.index.ts +2 -2
  89. package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
  90. package/src/_modules/usage/index.ts +7 -7
  91. package/src/_modules/usage/usage.controller.ts +120 -120
  92. package/src/_modules/usage/usage.data-service.ts +172 -172
  93. package/src/_modules/usage-module.index.ts +2 -2
  94. package/src/_services/base/data.service.ts +921 -921
  95. package/src/_services/base/db.service.spec.ts +32 -32
  96. package/src/_services/base/db.service.ts +1063 -1063
  97. package/src/_services/base/singleton.service.ts +21 -21
  98. package/src/_services/core/api.service.ts +453 -453
  99. package/src/_services/core/auth.service.ts +172 -172
  100. package/src/_services/core/email.service.ts +678 -678
  101. package/src/_services/core/global.service.ts +270 -269
  102. package/src/_services/core/service-collection.service.ts +5 -5
  103. package/src/_services/index.ts +23 -23
  104. package/src/_services/route/controller.service.ts +129 -129
  105. package/src/_services/route/routing-module.service.ts +293 -273
  106. package/src/_services/server/app-extended.server.spec.ts +76 -76
  107. package/src/_services/server/app-extended.server.ts +520 -520
  108. package/src/_services/server/app.server.spec.ts +67 -67
  109. package/src/_services/server/app.server.ts +1181 -1179
  110. package/src/_services/shared.service.spec.ts +19 -19
  111. package/src/_services/shared.static-service.ts +73 -73
  112. package/src/_services/socket/socket-client.service.ts +236 -235
  113. package/src/_services/socket/socket-server.service.spec.ts +11 -11
  114. package/src/_services/socket/socket-server.service.ts +761 -761
  115. package/src/index.ts +18 -18
  116. package/tsconfig.json +41 -41
  117. package/build/tsconfig.tsbuildinfo +0 -1
@@ -1,19 +1,19 @@
1
- import { DynamoNTS_Shared } from './shared.static-service';
2
-
3
- describe('DynamoNTS_Shared', () => {
4
- it('getIpFromRequest should be accessible', () => {
5
- expect(DynamoNTS_Shared.getIpFromRequest).toBeTruthy();
6
- });
7
-
8
- it('getIpFromRequest should be accessible', () => {
9
- expect(DynamoNTS_Shared.getLocationDataByRequest).toBeTruthy();
10
- });
11
-
12
- it('getIpFromRequest should be accessible', () => {
13
- expect(DynamoNTS_Shared.getLocationByIp).toBeTruthy();
14
- });
15
-
16
- it('getIpFromRequest should be accessible', () => {
17
- expect(DynamoNTS_Shared.prompt).toBeTruthy();
18
- });
19
- });
1
+ import { DynamoNTS_Shared } from './shared.static-service';
2
+
3
+ describe('DynamoNTS_Shared', () => {
4
+ it('getIpFromRequest should be accessible', () => {
5
+ expect(DynamoNTS_Shared.getIpFromRequest).toBeTruthy();
6
+ });
7
+
8
+ it('getIpFromRequest should be accessible', () => {
9
+ expect(DynamoNTS_Shared.getLocationDataByRequest).toBeTruthy();
10
+ });
11
+
12
+ it('getIpFromRequest should be accessible', () => {
13
+ expect(DynamoNTS_Shared.getLocationByIp).toBeTruthy();
14
+ });
15
+
16
+ it('getIpFromRequest should be accessible', () => {
17
+ expect(DynamoNTS_Shared.prompt).toBeTruthy();
18
+ });
19
+ });
@@ -1,73 +1,73 @@
1
-
2
- import * as ReadLine from 'readline';
3
- import * as GeoIp from 'geoip-lite';
4
- import { Request } from 'express';
5
-
6
- import { DynamoFM_GeoIpLocation, DynamoFM_Shared } from '@futdevpro/fsm-dynamo/shared-service';
7
-
8
- /**
9
- *
10
- */
11
- export class DynamoNTS_Shared extends DynamoFM_Shared {
12
-
13
- /**
14
- *
15
- * @param request
16
- * @returns
17
- */
18
- static getIpFromRequest(request: Request): string {
19
- let ip: string;
20
-
21
- if (request?.headers?.['x-forwarded-for']) {
22
- const route: string[] = (request.headers['x-forwarded-for'] as string).split(', ');
23
-
24
- console.log('TESTTTT route:', route);
25
- ip = route[route.length - 1];
26
- } else {
27
- ip = request.socket.remoteAddress;
28
- }
29
-
30
- return ip;
31
- }
32
-
33
- /**
34
- *
35
- * @param request
36
- * @returns
37
- */
38
- static getLocationDataByRequest(request: Request): DynamoFM_GeoIpLocation {
39
- return GeoIp.lookup(this.getIpFromRequest(request));
40
- }
41
-
42
- /**
43
- *
44
- * @param request
45
- * @returns
46
- */
47
- static getLocationByIp(ip: string): DynamoFM_GeoIpLocation {
48
- return GeoIp.lookup(ip);
49
- }
50
-
51
- /**
52
- *
53
- * @param question
54
- * @returns
55
- */
56
- static async prompt(question: string): Promise<string> {
57
- const readLine = ReadLine.createInterface({
58
- input: process.stdin,
59
- output: process.stdout,
60
- });
61
-
62
- return new Promise((resolve, reject) => {
63
- try {
64
- readLine.question(question, (result: string) => {
65
- resolve(result);
66
- readLine.close();
67
- });
68
- } catch (error) {
69
- reject(error);
70
- }
71
- });
72
- }
73
- }
1
+
2
+ import * as ReadLine from 'readline';
3
+ import * as GeoIp from 'geoip-lite';
4
+ import { Request } from 'express';
5
+
6
+ import { DynamoFM_GeoIpLocation, DynamoFM_Shared } from '@futdevpro/fsm-dynamo/shared-service';
7
+
8
+ /**
9
+ *
10
+ */
11
+ export class DynamoNTS_Shared extends DynamoFM_Shared {
12
+
13
+ /**
14
+ *
15
+ * @param request
16
+ * @returns
17
+ */
18
+ static getIpFromRequest(request: Request): string {
19
+ let ip: string;
20
+
21
+ if (request?.headers?.['x-forwarded-for']) {
22
+ const route: string[] = (request.headers['x-forwarded-for'] as string).split(', ');
23
+
24
+ console.log('TESTTTT route:', route);
25
+ ip = route[route.length - 1];
26
+ } else {
27
+ ip = request.socket.remoteAddress;
28
+ }
29
+
30
+ return ip;
31
+ }
32
+
33
+ /**
34
+ *
35
+ * @param request
36
+ * @returns
37
+ */
38
+ static getLocationDataByRequest(request: Request): DynamoFM_GeoIpLocation {
39
+ return GeoIp.lookup(this.getIpFromRequest(request));
40
+ }
41
+
42
+ /**
43
+ *
44
+ * @param request
45
+ * @returns
46
+ */
47
+ static getLocationByIp(ip: string): DynamoFM_GeoIpLocation {
48
+ return GeoIp.lookup(ip);
49
+ }
50
+
51
+ /**
52
+ *
53
+ * @param question
54
+ * @returns
55
+ */
56
+ static async prompt(question: string): Promise<string> {
57
+ const readLine = ReadLine.createInterface({
58
+ input: process.stdin,
59
+ output: process.stdout,
60
+ });
61
+
62
+ return new Promise((resolve, reject) => {
63
+ try {
64
+ readLine.question(question, (result: string) => {
65
+ resolve(result);
66
+ readLine.close();
67
+ });
68
+ } catch (error) {
69
+ reject(error);
70
+ }
71
+ });
72
+ }
73
+ }
@@ -1,235 +1,236 @@
1
-
2
-
3
-
4
- import * as SocketIO from 'socket.io-client';
5
-
6
- import { DynamoNTS_SingletonService } from '../base/singleton.service';
7
- import { DynamoFM_Error, DynamoFM_Log } from '@futdevpro/fsm-dynamo';
8
- import { DynamoFM_delay, DynamoFM_Array } from '@futdevpro/fsm-dynamo/utils';
9
- import {
10
- DynamoNTS_SocketClientService_Params
11
- } from '../../_models/control-models/socket-client-service-params.control-model';
12
- import { DynamoNTS_globalSettings } from '../../_constants/global-settings.const';
13
- import { DynamoNTS_SocketEvent } from '../../_models/control-models/socket-event.control-model';
14
- import { DynamoNTS_SocketEventKey } from '../../_enums/http/socket-event-type.enum';
15
-
16
- export abstract class DynamoNTS_SocketClientService extends DynamoNTS_SingletonService {
17
-
18
- private _params: DynamoNTS_SocketClientService_Params;
19
- protected get params(): DynamoNTS_SocketClientService_Params { return this._params; }
20
- get name(): string { return this.params.name; }
21
-
22
- protected socket: SocketIO.Socket;
23
-
24
- protected incomingEvents: DynamoNTS_SocketEvent<any>[];
25
-
26
- protected _connected: boolean = false;
27
- get connected(): boolean { return this._connected; }
28
-
29
- protected debugLog: boolean = DynamoNTS_globalSettings.logSetup;
30
- protected logFn: boolean;
31
-
32
- private defaultEvents: DynamoNTS_SocketEvent<any>[] = [
33
- new DynamoNTS_SocketEvent<any>({
34
- eventKey: DynamoNTS_SocketEventKey.connect,
35
- tasks: [
36
- async () => {
37
- this._connected = true;
38
- DynamoFM_Log.success(`< > socket-client(${this.params.name}) connected!`);
39
- },
40
- ],
41
- }),
42
-
43
- new DynamoNTS_SocketEvent<any>({
44
- eventKey: DynamoNTS_SocketEventKey.disconnect,
45
- tasks: [
46
- async () => {
47
- this._connected = false;
48
- DynamoFM_Log.warn(`<x > socket-client(${this.params.name}) disconnected!`);
49
-
50
- if (this._params.reconnect) {
51
- await DynamoFM_delay(this._params.reconnectDelay);
52
- this.connectSocket();
53
- }
54
- },
55
- ],
56
- }),
57
-
58
- new DynamoNTS_SocketEvent<any>({
59
- eventKey: DynamoNTS_SocketEventKey.subscriptionSuccessful,
60
- tasks: [
61
- async () => {
62
- DynamoFM_Log.success(`<=--> socket-client(${this.params.name}) subscription successful!`);
63
- },
64
- ],
65
- }),
66
-
67
- new DynamoNTS_SocketEvent<any>({
68
- eventKey: DynamoNTS_SocketEventKey.error,
69
- tasks: [
70
- async (content: any) => {
71
- DynamoFM_Log.error(`=--> socket-client(${this.params.name}) ERROR!:`, content);
72
- },
73
- ],
74
- }),
75
- ];
76
-
77
- protected constructor() {
78
- super();
79
-
80
- this.asyncConstructor().catch((error: any) => {
81
- DynamoFM_Log.error(`socket-client(${this.params?.name}) Service setup failed! ERROR:`, error);
82
-
83
- if (error?.flag?.includes?.('DYNAMO-ERROR-OBJECT')) {
84
- DynamoFM_Log.error(`\nErrorMessage: ${(error as DynamoFM_Error)._message}`);
85
- DynamoFM_Log.error(`ErrorCode: ${(error as DynamoFM_Error)._errorCode}`);
86
- }
87
- });
88
- }
89
-
90
- private async asyncConstructor(): Promise<void> {
91
- try {
92
- this._params = this.getParams();
93
- this.incomingEvents = this.getIncomingEvents() ?? [];
94
- this.socket = SocketIO.io(`${this.params.address}:${this.params.port}`);
95
-
96
- await this.setupDefaultEvents();
97
-
98
- await this.setupSocketEvents();
99
-
100
- DynamoFM_Log.success(`\nsocket-client(${this.params?.name}) Service setup finished`);
101
-
102
- await this.connectSocket();
103
- } catch (error) {
104
- DynamoFM_Log.error(`socket-client(${this.params?.name}) Service setup failed!`, error);
105
-
106
- throw new DynamoFM_Error({
107
- errorCode: 'NTS-SCS-001',
108
- error: error,
109
- });
110
- }
111
- }
112
-
113
- private async setupDefaultEvents(): Promise<void> {
114
- try {
115
- if (this.logFn) console.log('\nFn:. setupDefaultEvents');
116
-
117
- this.defaultEvents.forEach((defaultEvent: DynamoNTS_SocketEvent<any>) => {
118
- defaultEvent.serviceName = this.params.name;
119
- const eventDeclared = this.incomingEvents.find(
120
- (event: DynamoNTS_SocketEvent<any>) => event.eventKey === defaultEvent.eventKey
121
- );
122
-
123
- if (!eventDeclared) {
124
- this.incomingEvents.push(defaultEvent);
125
- } else {
126
- eventDeclared.tasks.unshift(...defaultEvent.tasks);
127
- }
128
- });
129
- } catch (error) {
130
- DynamoFM_Log.error(
131
- `socket-client(${this.params.name}) Service Setup Default Events failed, ` +
132
- `ERROR:`, error
133
- );
134
-
135
- throw error;
136
- }
137
- }
138
-
139
- private async setupSocketEvents(): Promise<void> {
140
- try {
141
- if (this.debugLog) console.log(`Setup socket-client(${this.params.name}) Events...`);
142
-
143
- await DynamoFM_Array.asyncForEach(
144
- this.incomingEvents,
145
- async (event: DynamoNTS_SocketEvent<any>) => {
146
- event.serviceName = this.params.name;
147
- this.socket.on(event.eventKey, async (content: any) => {
148
- try {
149
- await event.executeEventTasks(content, this.params.service);
150
- } catch (error) {
151
- DynamoFM_Log.error(`socket-client(${this.params.name}) Event failed, ERROR:`, error);
152
- await this.emitEvent(DynamoNTS_SocketEventKey.error, error);
153
- }
154
- });
155
- }
156
- );
157
- } catch (error) {
158
- DynamoFM_Log.error(
159
- `socket-client(${this.params.name}) Service Setup Socket Events failed, ` +
160
- `ERROR:`, error
161
- );
162
-
163
- throw error;
164
- }
165
- }
166
-
167
- private async connectSocket(): Promise<void> {
168
- try {
169
- DynamoFM_Log.info(
170
- `< .. > socket-client(${this.params.name}) ` +
171
- `connecting to ${this.params.address}:${this.params.port} ...`
172
- );
173
-
174
- this.socket.connect();
175
-
176
- if (this.params.reconnect) {
177
- await this.tryReconnectIfNeeded();
178
- }
179
- } catch (error) {
180
- DynamoFM_Log.error(
181
- `socket-client(${this.params.name}) Service Connect Socket failed, ` +
182
- `ERROR:`, error
183
- );
184
-
185
- throw error;
186
- }
187
- }
188
-
189
- private async tryReconnectIfNeeded(): Promise<void> {
190
- try {
191
- if (this.logFn) console.log(`\nFn:. tryReconnectIfNeeded`);
192
- await DynamoFM_delay(this._params.reconnectDelay);
193
-
194
- if (!this._connected) {
195
- await this.connectSocket();
196
- }
197
- } catch (error) {
198
- DynamoFM_Log.error(
199
- `socket-client(${this.params.name}) Service Try Reconnect failed, ` +
200
- `ERROR:`, error
201
- );
202
-
203
- throw error;
204
- }
205
- }
206
-
207
- /**
208
- * Emit event to the socket
209
- * @param eventType event name
210
- * @param content event content
211
- */
212
- protected async emitEvent(eventType: string, content: any): Promise<void> {
213
- try {
214
- DynamoFM_Log.log(`<=-- outgoing socket-client(${this.params.name}) event: ${eventType}`);
215
- this.socket.emit(eventType, content);
216
- } catch (error) {
217
- DynamoFM_Log.error(
218
- `socket-client(${this.params.name}) ` +
219
- `Service Emit Event failed: ${this.params?.name} (${this.params?.port})`, error
220
- );
221
-
222
- throw error;
223
- }
224
- }
225
-
226
- /**
227
- * You must setup params for the service in this function
228
- */
229
- abstract getParams(): DynamoNTS_SocketClientService_Params;
230
-
231
- /**
232
- * You must setup events and required services in this function
233
- */
234
- abstract getIncomingEvents(): DynamoNTS_SocketEvent<any>[];
235
- }
1
+
2
+
3
+
4
+ import * as SocketIO from 'socket.io-client';
5
+
6
+ import { DynamoNTS_SingletonService } from '../base/singleton.service';
7
+ import { DynamoFM_Error, DynamoFM_Log } from '@futdevpro/fsm-dynamo';
8
+ import { DynamoFM_delay, DynamoFM_Array } from '@futdevpro/fsm-dynamo/utils';
9
+ import {
10
+ DynamoNTS_SocketClientService_Params
11
+ } from '../../_models/control-models/socket-client-service-params.control-model';
12
+ import { DynamoNTS_globalSettings } from '../../_constants/global-settings.const';
13
+ import { DynamoNTS_SocketEvent } from '../../_models/control-models/socket-event.control-model';
14
+ import { DynamoNTS_SocketEventKey } from '../../_enums/http/socket-event-type.enum';
15
+
16
+ export abstract class DynamoNTS_SocketClientService extends DynamoNTS_SingletonService {
17
+
18
+ private _params: DynamoNTS_SocketClientService_Params;
19
+ protected get params(): DynamoNTS_SocketClientService_Params { return this._params; }
20
+ get name(): string { return this.params.name; }
21
+
22
+ protected socket: SocketIO.Socket;
23
+
24
+ protected incomingEvents: DynamoNTS_SocketEvent<any>[];
25
+
26
+ protected _connected: boolean = false;
27
+ get connected(): boolean { return this._connected; }
28
+
29
+ protected debugLog: boolean = DynamoNTS_globalSettings.logSetup;
30
+ protected logFn: boolean;
31
+
32
+ private defaultEvents: DynamoNTS_SocketEvent<any>[] = [
33
+ new DynamoNTS_SocketEvent<any>({
34
+ eventKey: DynamoNTS_SocketEventKey.connect,
35
+ tasks: [
36
+ async () => {
37
+ this._connected = true;
38
+ DynamoFM_Log.success(`< > socket-client(${this.params.name}) connected!`);
39
+ },
40
+ ],
41
+ }),
42
+
43
+ new DynamoNTS_SocketEvent<any>({
44
+ eventKey: DynamoNTS_SocketEventKey.disconnect,
45
+ tasks: [
46
+ async () => {
47
+ this._connected = false;
48
+ DynamoFM_Log.warn(`<x > socket-client(${this.params.name}) disconnected!`);
49
+
50
+ if (this._params.reconnect) {
51
+ await DynamoFM_delay(this._params.reconnectDelay);
52
+ this.connectSocket();
53
+ }
54
+ },
55
+ ],
56
+ }),
57
+
58
+ new DynamoNTS_SocketEvent<any>({
59
+ eventKey: DynamoNTS_SocketEventKey.subscriptionSuccessful,
60
+ tasks: [
61
+ async () => {
62
+ DynamoFM_Log.success(`<=--> socket-client(${this.params.name}) subscription successful!`);
63
+ },
64
+ ],
65
+ }),
66
+
67
+ new DynamoNTS_SocketEvent<any>({
68
+ eventKey: DynamoNTS_SocketEventKey.error,
69
+ tasks: [
70
+ async (content: any) => {
71
+ DynamoFM_Log.error(`=--> socket-client(${this.params.name}) ERROR!:`, content);
72
+ },
73
+ ],
74
+ }),
75
+ ];
76
+
77
+ protected constructor() {
78
+ super();
79
+
80
+ this.asyncConstructor().catch((error: any) => {
81
+ DynamoFM_Log.error(`socket-client(${this.params?.name}) Service setup failed! ERROR:`, error);
82
+
83
+ if (error?.flag?.includes?.('DYNAMO-ERROR-OBJECT')) {
84
+ DynamoFM_Log.error(`\nErrorMessage: ${(error as DynamoFM_Error)._message}`);
85
+ DynamoFM_Log.error(`ErrorCode: ${(error as DynamoFM_Error)._errorCode}`);
86
+ DynamoFM_Log.error(`UserMessage: ${(error as DynamoFM_Error).__userMessage}`);
87
+ }
88
+ });
89
+ }
90
+
91
+ private async asyncConstructor(): Promise<void> {
92
+ try {
93
+ this._params = this.getParams();
94
+ this.incomingEvents = this.getIncomingEvents() ?? [];
95
+ this.socket = SocketIO.io(`${this.params.address}:${this.params.port}`);
96
+
97
+ await this.setupDefaultEvents();
98
+
99
+ await this.setupSocketEvents();
100
+
101
+ DynamoFM_Log.success(`\nsocket-client(${this.params?.name}) Service setup finished`);
102
+
103
+ await this.connectSocket();
104
+ } catch (error) {
105
+ DynamoFM_Log.error(`socket-client(${this.params?.name}) Service setup failed!`, error);
106
+
107
+ throw new DynamoFM_Error({
108
+ errorCode: 'NTS-SCS-001',
109
+ error: error,
110
+ });
111
+ }
112
+ }
113
+
114
+ private async setupDefaultEvents(): Promise<void> {
115
+ try {
116
+ if (this.logFn) console.log('\nFn:. setupDefaultEvents');
117
+
118
+ this.defaultEvents.forEach((defaultEvent: DynamoNTS_SocketEvent<any>) => {
119
+ defaultEvent.serviceName = this.params.name;
120
+ const eventDeclared = this.incomingEvents.find(
121
+ (event: DynamoNTS_SocketEvent<any>) => event.eventKey === defaultEvent.eventKey
122
+ );
123
+
124
+ if (!eventDeclared) {
125
+ this.incomingEvents.push(defaultEvent);
126
+ } else {
127
+ eventDeclared.tasks.unshift(...defaultEvent.tasks);
128
+ }
129
+ });
130
+ } catch (error) {
131
+ DynamoFM_Log.error(
132
+ `socket-client(${this.params.name}) Service Setup Default Events failed, ` +
133
+ `ERROR:`, error
134
+ );
135
+
136
+ throw error;
137
+ }
138
+ }
139
+
140
+ private async setupSocketEvents(): Promise<void> {
141
+ try {
142
+ if (this.debugLog) console.log(`Setup socket-client(${this.params.name}) Events...`);
143
+
144
+ await DynamoFM_Array.asyncForEach(
145
+ this.incomingEvents,
146
+ async (event: DynamoNTS_SocketEvent<any>) => {
147
+ event.serviceName = this.params.name;
148
+ this.socket.on(event.eventKey, async (content: any) => {
149
+ try {
150
+ await event.executeEventTasks(content, this.params.service);
151
+ } catch (error) {
152
+ DynamoFM_Log.error(`socket-client(${this.params.name}) Event failed, ERROR:`, error);
153
+ await this.emitEvent(DynamoNTS_SocketEventKey.error, error);
154
+ }
155
+ });
156
+ }
157
+ );
158
+ } catch (error) {
159
+ DynamoFM_Log.error(
160
+ `socket-client(${this.params.name}) Service Setup Socket Events failed, ` +
161
+ `ERROR:`, error
162
+ );
163
+
164
+ throw error;
165
+ }
166
+ }
167
+
168
+ private async connectSocket(): Promise<void> {
169
+ try {
170
+ DynamoFM_Log.info(
171
+ `< .. > socket-client(${this.params.name}) ` +
172
+ `connecting to ${this.params.address}:${this.params.port} ...`
173
+ );
174
+
175
+ this.socket.connect();
176
+
177
+ if (this.params.reconnect) {
178
+ await this.tryReconnectIfNeeded();
179
+ }
180
+ } catch (error) {
181
+ DynamoFM_Log.error(
182
+ `socket-client(${this.params.name}) Service Connect Socket failed, ` +
183
+ `ERROR:`, error
184
+ );
185
+
186
+ throw error;
187
+ }
188
+ }
189
+
190
+ private async tryReconnectIfNeeded(): Promise<void> {
191
+ try {
192
+ if (this.logFn) console.log(`\nFn:. tryReconnectIfNeeded`);
193
+ await DynamoFM_delay(this._params.reconnectDelay);
194
+
195
+ if (!this._connected) {
196
+ await this.connectSocket();
197
+ }
198
+ } catch (error) {
199
+ DynamoFM_Log.error(
200
+ `socket-client(${this.params.name}) Service Try Reconnect failed, ` +
201
+ `ERROR:`, error
202
+ );
203
+
204
+ throw error;
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Emit event to the socket
210
+ * @param eventType event name
211
+ * @param content event content
212
+ */
213
+ protected async emitEvent(eventType: string, content: any): Promise<void> {
214
+ try {
215
+ DynamoFM_Log.log(`<=-- outgoing socket-client(${this.params.name}) event: ${eventType}`);
216
+ this.socket.emit(eventType, content);
217
+ } catch (error) {
218
+ DynamoFM_Log.error(
219
+ `socket-client(${this.params.name}) ` +
220
+ `Service Emit Event failed: ${this.params?.name} (${this.params?.port})`, error
221
+ );
222
+
223
+ throw error;
224
+ }
225
+ }
226
+
227
+ /**
228
+ * You must setup params for the service in this function
229
+ */
230
+ abstract getParams(): DynamoNTS_SocketClientService_Params;
231
+
232
+ /**
233
+ * You must setup events and required services in this function
234
+ */
235
+ abstract getIncomingEvents(): DynamoNTS_SocketEvent<any>[];
236
+ }