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