@futdevpro/nts-dynamo 1.9.15 → 1.9.17

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 (132) hide show
  1. package/.copilot/patterns.json +7 -7
  2. package/.github/workflows/main.yml +221 -0
  3. package/HOWTO.md +15 -15
  4. package/README.md +140 -140
  5. package/build/_constants/mocks/auth-service.mock.d.ts.map +1 -1
  6. package/build/_models/control-models/app-params.control-model.d.ts +1 -0
  7. package/build/_models/control-models/app-params.control-model.d.ts.map +1 -1
  8. package/build/_models/control-models/app-params.control-model.js.map +1 -1
  9. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  10. package/build/_models/control-models/endpoint-params.control-model.js +2 -0
  11. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  12. package/build/_models/control-models/socket-event.control-model.js +1 -1
  13. package/build/_models/interfaces/certification-settings.interface.d.ts +0 -1
  14. package/build/_models/interfaces/certification-settings.interface.d.ts.map +1 -1
  15. package/build/_models/interfaces/global-service-settings.interface.d.ts +1 -1
  16. package/build/_models/interfaces/global-service-settings.interface.d.ts.map +1 -1
  17. package/build/_modules/custom-data/get-custom-data-routing-module.util.js +1 -2
  18. package/build/_modules/custom-data/get-custom-data-routing-module.util.js.map +1 -1
  19. package/build/_modules/test/get-test-routing-module.util.js +1 -2
  20. package/build/_modules/test/get-test-routing-module.util.js.map +1 -1
  21. package/build/_modules/usage/get-usage-routing-module.util.js +1 -2
  22. package/build/_modules/usage/get-usage-routing-module.util.js.map +1 -1
  23. package/build/_services/core/global.service.d.ts.map +1 -1
  24. package/build/_services/core/global.service.js +14 -6
  25. package/build/_services/core/global.service.js.map +1 -1
  26. package/build/_services/route/routing-module.service.d.ts +1 -1
  27. package/build/_services/route/routing-module.service.d.ts.map +1 -1
  28. package/build/_services/route/routing-module.service.js +19 -25
  29. package/build/_services/route/routing-module.service.js.map +1 -1
  30. package/build/_services/server/app.server.d.ts +0 -2
  31. package/build/_services/server/app.server.d.ts.map +1 -1
  32. package/build/_services/server/app.server.js +4 -1
  33. package/build/_services/server/app.server.js.map +1 -1
  34. package/build/_services/socket/socket-client.service.d.ts.map +1 -1
  35. package/build/_services/socket/socket-client.service.js +1 -0
  36. package/build/_services/socket/socket-client.service.js.map +1 -1
  37. package/nodemon.json +17 -15
  38. package/package.json +5 -5
  39. package/src/_constants/global-settings.const.ts +27 -27
  40. package/src/_constants/index.ts +2 -2
  41. package/src/_constants/mocks/app-extended-server.mock.ts +198 -198
  42. package/src/_constants/mocks/app-params.mock.ts +9 -9
  43. package/src/_constants/mocks/app-server.mock.ts +185 -185
  44. package/src/_constants/mocks/auth-service.mock.ts +28 -28
  45. package/src/_constants/mocks/controller.mock.ts +16 -16
  46. package/src/_constants/mocks/data-model.mock.ts +83 -83
  47. package/src/_constants/mocks/email-service-collection.mock.ts +13 -13
  48. package/src/_constants/mocks/email-service.mock.ts +19 -19
  49. package/src/_constants/mocks/email-template.mock.html +14 -14
  50. package/src/_constants/mocks/endpoint.mock.ts +90 -90
  51. package/src/_constants/mocks/socket-client.mock.ts +43 -43
  52. package/src/_constants/mocks/socket-server.mock.ts +43 -43
  53. package/src/_enums/data-model-type.enum.ts +14 -14
  54. package/src/_enums/data-service-function.enum.ts +15 -15
  55. package/src/_enums/http/http-call-type.enum.ts +12 -12
  56. package/src/_enums/http/http-response-type.enum.ts +7 -7
  57. package/src/_enums/http/socket-event-type.enum.ts +18 -18
  58. package/src/_enums/index.ts +13 -13
  59. package/src/_enums/predefined-data-types.enum.ts +27 -27
  60. package/src/_enums/route-security.enum.ts +12 -12
  61. package/src/_enums/socket-security.enum.ts +11 -11
  62. package/src/_models/control-models/api-call-params.control-model.ts +126 -126
  63. package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
  64. package/src/_models/control-models/app-params.control-model.ts +46 -45
  65. package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
  66. package/src/_models/control-models/endpoint-params.control-model.ts +309 -307
  67. package/src/_models/control-models/http-settings.control-model.ts +29 -29
  68. package/src/_models/control-models/index.ts +13 -13
  69. package/src/_models/control-models/socket-client-service-params.control-model.ts +28 -28
  70. package/src/_models/control-models/socket-event.control-model.ts +150 -150
  71. package/src/_models/control-models/socket-presence.control-model.ts +207 -207
  72. package/src/_models/control-models/socket-server-service-params.control-model.ts +20 -20
  73. package/src/_models/control-models/system-control.control-model.ts +12 -12
  74. package/src/_models/index.ts +9 -9
  75. package/src/_models/interfaces/certification-settings.interface.ts +7 -7
  76. package/src/_models/interfaces/global-service-settings.interface.ts +45 -45
  77. package/src/_models/interfaces/global-settings.interface.ts +83 -83
  78. package/src/_models/interfaces/index.ts +7 -7
  79. package/src/_models/interfaces/routing-module-settings.interface.ts +20 -20
  80. package/src/_models/types/db-filter.type.ts +108 -108
  81. package/src/_models/types/db-update.type.ts +100 -100
  82. package/src/_models/types/index.ts +5 -5
  83. package/src/_modules/api-service.index.ts +12 -12
  84. package/src/_modules/app-extended.index.ts +28 -28
  85. package/src/_modules/app.index.ts +24 -24
  86. package/src/_modules/auth.index.ts +7 -7
  87. package/src/_modules/constants.index.ts +2 -2
  88. package/src/_modules/controller.index.ts +10 -10
  89. package/src/_modules/custom-data/custom-data.controller.ts +69 -69
  90. package/src/_modules/custom-data/custom-data.data-service.ts +20 -20
  91. package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +23 -23
  92. package/src/_modules/custom-data/index.ts +6 -6
  93. package/src/_modules/custom-data-module.index.ts +2 -2
  94. package/src/_modules/data-service.index.ts +9 -9
  95. package/src/_modules/email.index.ts +8 -8
  96. package/src/_modules/enums.index.ts +2 -2
  97. package/src/_modules/extended.index.ts +8 -8
  98. package/src/_modules/models.index.ts +2 -2
  99. package/src/_modules/services.index.ts +2 -2
  100. package/src/_modules/test/get-test-routing-module.util.ts +23 -23
  101. package/src/_modules/test/index.ts +5 -5
  102. package/src/_modules/test/test.controller.ts +115 -115
  103. package/src/_modules/test-module.index.ts +2 -2
  104. package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
  105. package/src/_modules/usage/index.ts +7 -7
  106. package/src/_modules/usage/usage.controller.ts +120 -120
  107. package/src/_modules/usage/usage.data-service.ts +172 -172
  108. package/src/_modules/usage-module.index.ts +2 -2
  109. package/src/_services/base/data.service.ts +921 -921
  110. package/src/_services/base/db.service.spec.ts +32 -32
  111. package/src/_services/base/db.service.ts +1063 -1063
  112. package/src/_services/base/singleton.service.ts +21 -21
  113. package/src/_services/core/api.service.ts +453 -453
  114. package/src/_services/core/auth.service.ts +172 -172
  115. package/src/_services/core/email.service.ts +678 -678
  116. package/src/_services/core/global.service.ts +275 -269
  117. package/src/_services/core/service-collection.service.ts +5 -5
  118. package/src/_services/index.ts +23 -23
  119. package/src/_services/route/controller.service.ts +129 -129
  120. package/src/_services/route/routing-module.service.ts +293 -273
  121. package/src/_services/server/app-extended.server.spec.ts +76 -76
  122. package/src/_services/server/app-extended.server.ts +520 -520
  123. package/src/_services/server/app.server.spec.ts +67 -67
  124. package/src/_services/server/app.server.ts +1181 -1179
  125. package/src/_services/shared.service.spec.ts +19 -19
  126. package/src/_services/shared.static-service.ts +73 -73
  127. package/src/_services/socket/socket-client.service.ts +236 -235
  128. package/src/_services/socket/socket-server.service.spec.ts +11 -11
  129. package/src/_services/socket/socket-server.service.ts +761 -761
  130. package/src/index.ts +18 -18
  131. package/tsconfig.json +41 -41
  132. 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
+ }