@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.
- package/.copilot/patterns.json +7 -7
- package/.github/workflows/main.yml +206 -0
- package/HOWTO.md +15 -15
- package/README.md +140 -140
- package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
- package/build/_models/control-models/endpoint-params.control-model.js +2 -0
- package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
- package/build/_models/control-models/socket-event.control-model.js +1 -1
- package/build/_services/core/global.service.d.ts.map +1 -1
- package/build/_services/core/global.service.js +1 -0
- package/build/_services/core/global.service.js.map +1 -1
- package/build/_services/route/routing-module.service.d.ts +1 -0
- package/build/_services/route/routing-module.service.d.ts.map +1 -1
- package/build/_services/route/routing-module.service.js +17 -23
- package/build/_services/route/routing-module.service.js.map +1 -1
- package/build/_services/server/app.server.d.ts.map +1 -1
- package/build/_services/server/app.server.js +4 -1
- package/build/_services/server/app.server.js.map +1 -1
- package/build/_services/socket/socket-client.service.d.ts.map +1 -1
- package/build/_services/socket/socket-client.service.js +1 -0
- package/build/_services/socket/socket-client.service.js.map +1 -1
- package/nodemon.json +17 -15
- package/package.json +5 -5
- package/src/_constants/global-settings.const.ts +27 -27
- package/src/_constants/index.ts +2 -2
- package/src/_constants/mocks/app-extended-server.mock.ts +198 -198
- package/src/_constants/mocks/app-params.mock.ts +9 -9
- package/src/_constants/mocks/app-server.mock.ts +185 -185
- package/src/_constants/mocks/auth-service.mock.ts +28 -28
- package/src/_constants/mocks/controller.mock.ts +16 -16
- package/src/_constants/mocks/data-model.mock.ts +83 -83
- package/src/_constants/mocks/email-service-collection.mock.ts +13 -13
- package/src/_constants/mocks/email-service.mock.ts +19 -19
- package/src/_constants/mocks/email-template.mock.html +14 -14
- package/src/_constants/mocks/endpoint.mock.ts +90 -90
- package/src/_constants/mocks/socket-client.mock.ts +43 -43
- package/src/_constants/mocks/socket-server.mock.ts +43 -43
- package/src/_enums/data-model-type.enum.ts +14 -14
- package/src/_enums/data-service-function.enum.ts +15 -15
- package/src/_enums/http/http-call-type.enum.ts +12 -12
- package/src/_enums/http/http-response-type.enum.ts +7 -7
- package/src/_enums/http/socket-event-type.enum.ts +18 -18
- package/src/_enums/index.ts +13 -13
- package/src/_enums/predefined-data-types.enum.ts +27 -27
- package/src/_enums/route-security.enum.ts +12 -12
- package/src/_enums/socket-security.enum.ts +11 -11
- package/src/_models/control-models/api-call-params.control-model.ts +126 -126
- package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/app-params.control-model.ts +45 -45
- package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/endpoint-params.control-model.ts +309 -307
- package/src/_models/control-models/http-settings.control-model.ts +29 -29
- package/src/_models/control-models/index.ts +13 -13
- package/src/_models/control-models/socket-client-service-params.control-model.ts +28 -28
- package/src/_models/control-models/socket-event.control-model.ts +150 -150
- package/src/_models/control-models/socket-presence.control-model.ts +207 -207
- package/src/_models/control-models/socket-server-service-params.control-model.ts +20 -20
- package/src/_models/control-models/system-control.control-model.ts +12 -12
- package/src/_models/index.ts +9 -9
- package/src/_models/interfaces/certification-settings.interface.ts +7 -7
- package/src/_models/interfaces/global-service-settings.interface.ts +45 -45
- package/src/_models/interfaces/global-settings.interface.ts +83 -83
- package/src/_models/interfaces/index.ts +7 -7
- package/src/_models/interfaces/routing-module-settings.interface.ts +20 -20
- package/src/_models/types/db-filter.type.ts +108 -108
- package/src/_models/types/db-update.type.ts +100 -100
- package/src/_models/types/index.ts +5 -5
- package/src/_modules/api-service.index.ts +12 -12
- package/src/_modules/app-extended.index.ts +28 -28
- package/src/_modules/app.index.ts +24 -24
- package/src/_modules/auth.index.ts +7 -7
- package/src/_modules/constants.index.ts +2 -2
- package/src/_modules/controller.index.ts +10 -10
- package/src/_modules/custom-data/custom-data.controller.ts +69 -69
- package/src/_modules/custom-data/custom-data.data-service.ts +20 -20
- package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +23 -23
- package/src/_modules/custom-data/index.ts +6 -6
- package/src/_modules/custom-data-module.index.ts +2 -2
- package/src/_modules/data-service.index.ts +9 -9
- package/src/_modules/email.index.ts +8 -8
- package/src/_modules/enums.index.ts +2 -2
- package/src/_modules/extended.index.ts +8 -8
- package/src/_modules/models.index.ts +2 -2
- package/src/_modules/services.index.ts +2 -2
- package/src/_modules/test/get-test-routing-module.util.ts +23 -23
- package/src/_modules/test/index.ts +5 -5
- package/src/_modules/test/test.controller.ts +115 -115
- package/src/_modules/test-module.index.ts +2 -2
- package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
- package/src/_modules/usage/index.ts +7 -7
- package/src/_modules/usage/usage.controller.ts +120 -120
- package/src/_modules/usage/usage.data-service.ts +172 -172
- package/src/_modules/usage-module.index.ts +2 -2
- package/src/_services/base/data.service.ts +921 -921
- package/src/_services/base/db.service.spec.ts +32 -32
- package/src/_services/base/db.service.ts +1063 -1063
- package/src/_services/base/singleton.service.ts +21 -21
- package/src/_services/core/api.service.ts +453 -453
- package/src/_services/core/auth.service.ts +172 -172
- package/src/_services/core/email.service.ts +678 -678
- package/src/_services/core/global.service.ts +270 -269
- package/src/_services/core/service-collection.service.ts +5 -5
- package/src/_services/index.ts +23 -23
- package/src/_services/route/controller.service.ts +129 -129
- package/src/_services/route/routing-module.service.ts +293 -273
- package/src/_services/server/app-extended.server.spec.ts +76 -76
- package/src/_services/server/app-extended.server.ts +520 -520
- package/src/_services/server/app.server.spec.ts +67 -67
- package/src/_services/server/app.server.ts +1181 -1179
- package/src/_services/shared.service.spec.ts +19 -19
- package/src/_services/shared.static-service.ts +73 -73
- package/src/_services/socket/socket-client.service.ts +236 -235
- package/src/_services/socket/socket-server.service.spec.ts +11 -11
- package/src/_services/socket/socket-server.service.ts +761 -761
- package/src/index.ts +18 -18
- package/tsconfig.json +41 -41
- 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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
this.
|
|
94
|
-
this.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
`
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
`
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
`
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
`
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
*
|
|
210
|
-
* @param
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
`
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
+
}
|