@futdevpro/fsm-dynamo 1.9.28 → 1.9.30

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 (54) hide show
  1. package/build/_collections/constants/global-settings.const.d.ts +3 -0
  2. package/build/_collections/constants/global-settings.const.d.ts.map +1 -0
  3. package/build/_collections/constants/global-settings.const.js +8 -0
  4. package/build/_collections/constants/global-settings.const.js.map +1 -0
  5. package/build/_collections/utils/log.util.d.ts +9 -4
  6. package/build/_collections/utils/log.util.d.ts.map +1 -1
  7. package/build/_collections/utils/log.util.js +31 -18
  8. package/build/_collections/utils/log.util.js.map +1 -1
  9. package/build/_models/interfaces/environment/global-log-settings.interface.d.ts +62 -0
  10. package/build/_models/interfaces/environment/global-log-settings.interface.d.ts.map +1 -0
  11. package/build/_models/interfaces/environment/global-log-settings.interface.js +3 -0
  12. package/build/_models/interfaces/environment/global-log-settings.interface.js.map +1 -0
  13. package/build/_models/interfaces/environment/global-settings.interface.d.ts +20 -0
  14. package/build/_models/interfaces/environment/global-settings.interface.d.ts.map +1 -0
  15. package/build/_models/interfaces/environment/global-settings.interface.js +3 -0
  16. package/build/_models/interfaces/environment/global-settings.interface.js.map +1 -0
  17. package/build/_modules/socket/_enums/sck-event-key.enum.d.ts +15 -0
  18. package/build/_modules/socket/_enums/sck-event-key.enum.d.ts.map +1 -0
  19. package/build/_modules/socket/_enums/sck-event-key.enum.js +19 -0
  20. package/build/_modules/socket/_enums/sck-event-key.enum.js.map +1 -0
  21. package/build/_modules/socket/_models/sck-client-params.control-model.d.ts +3 -2
  22. package/build/_modules/socket/_models/sck-client-params.control-model.d.ts.map +1 -1
  23. package/build/_modules/socket/_models/sck-client-params.control-model.js +1 -0
  24. package/build/_modules/socket/_models/sck-client-params.control-model.js.map +1 -1
  25. package/build/_modules/socket/_models/sck-socket-event.control-model.d.ts +61 -0
  26. package/build/_modules/socket/_models/sck-socket-event.control-model.d.ts.map +1 -0
  27. package/build/_modules/socket/_models/sck-socket-event.control-model.js +91 -0
  28. package/build/_modules/socket/_models/sck-socket-event.control-model.js.map +1 -0
  29. package/build/_modules/socket/_services/sck-client.service-base.d.ts +36 -0
  30. package/build/_modules/socket/_services/sck-client.service-base.d.ts.map +1 -0
  31. package/build/_modules/socket/_services/sck-client.service-base.js +190 -0
  32. package/build/_modules/socket/_services/sck-client.service-base.js.map +1 -0
  33. package/build/_modules/socket/index.d.ts +3 -0
  34. package/build/_modules/socket/index.d.ts.map +1 -1
  35. package/build/_modules/socket/index.js +5 -0
  36. package/build/_modules/socket/index.js.map +1 -1
  37. package/build/index.d.ts +3 -0
  38. package/build/index.d.ts.map +1 -1
  39. package/build/index.js +4 -0
  40. package/build/index.js.map +1 -1
  41. package/futdevpro-fsm-dynamo-01.09.30.tgz +0 -0
  42. package/nodemon.json +3 -1
  43. package/package.json +1 -1
  44. package/src/_collections/constants/global-settings.const.ts +14 -0
  45. package/src/_collections/utils/log.util.ts +27 -18
  46. package/src/_models/interfaces/environment/global-log-settings.interface.ts +81 -0
  47. package/src/_models/interfaces/environment/global-settings.interface.ts +22 -0
  48. package/src/_modules/socket/_enums/sck-event-key.enum.ts +18 -0
  49. package/src/_modules/socket/_models/sck-client-params.control-model.ts +6 -3
  50. package/src/_modules/socket/_models/sck-socket-event.control-model.ts +151 -0
  51. package/src/_modules/socket/_services/sck-client.service-base.ts +251 -0
  52. package/src/_modules/socket/index.ts +8 -0
  53. package/src/index.ts +5 -0
  54. package/futdevpro-fsm-dynamo-01.09.28.tgz +0 -0
@@ -0,0 +1,151 @@
1
+
2
+ import { DyFM_global_settings } from '../../../_collections/constants/global-settings.const';
3
+ import { DyFM_Array } from '../../../_collections/utils/array.util';
4
+ import { DyFM_Log } from '../../../_collections/utils/log.util';
5
+
6
+ import { DyFM_SocketEvent_Key } from '../_enums/sck-event-key.enum';
7
+
8
+ export type DyFM_SocketEventPreprocessTask<T = any, R = any> =
9
+ (content?: T, issuer?: string) => Promise<R>;
10
+ export type DyFM_SocketEventTask<T> = (content?: T, issuer?: string) => Promise<void>;
11
+
12
+ /**
13
+ * socket handling and clarification is under development
14
+ */
15
+ export class DyFM_SocketEvent<T>{
16
+ socketName?: string;
17
+ eventKey: DyFM_SocketEvent_Key | string;
18
+ serviceName?: string;
19
+
20
+ preProcesses?: DyFM_SocketEventPreprocessTask<any, any>[];
21
+ tasks?: DyFM_SocketEventTask<T>[];
22
+
23
+ logEvent?: boolean;
24
+ logEventContent?: boolean;
25
+
26
+ constructor(
27
+ set: {
28
+ /**
29
+ * naming the socket will help to follow eveFM on service,
30
+ * if not set, the eventKey will be used
31
+ */
32
+ name?: string,
33
+ /**
34
+ * define socket event type such as;
35
+ * connection, connect, disconnect, message, error, or anything else
36
+ */
37
+ eventKey: DyFM_SocketEvent_Key | string,
38
+ /**
39
+ * serviceName is the name of the service that will be used for logging
40
+ */
41
+ serviceName?: string,
42
+ /**
43
+ * preProcesses are the functions the service needs to run before the actual function,
44
+ * these can be used for authentications, or translating data
45
+ *
46
+ * the last function in the array should return the content in the type(T) of the socket<T>
47
+ */
48
+ preProcesses?: DyFM_SocketEventPreprocessTask<any, any>[],
49
+ /**
50
+ * tasks are the functions the service needs to run
51
+ */
52
+ tasks?: DyFM_SocketEventTask<T>[],
53
+ /**
54
+ * logEvent will create a log for the event triggered
55
+ */
56
+ logEvent?: boolean,
57
+ /**
58
+ * logEventContent will create a log for the event triggered with the content
59
+ */
60
+ logEventContent?: boolean,
61
+ }
62
+ ) {
63
+ try {
64
+ this.socketName = set.name ?? set.eventKey;
65
+ this.eventKey = set.eventKey;
66
+ this.serviceName = set.serviceName ?? 'UnknownSocketService';
67
+
68
+ this.preProcesses = set.preProcesses ?? [];
69
+ this.tasks = set.tasks ?? [];
70
+
71
+ if (set.logEvent !== undefined) {
72
+ this.logEvent = set.logEvent;
73
+ } else if (this.eventKey === DyFM_SocketEvent_Key.subscribe) {
74
+ this.logEvent = false;
75
+ } else if (
76
+ ([
77
+ DyFM_SocketEvent_Key.connection,
78
+ DyFM_SocketEvent_Key.connect,
79
+ DyFM_SocketEvent_Key.disconnect,
80
+ ] as string[]).includes(this.eventKey)
81
+ ) {
82
+ this.logEvent = DyFM_global_settings.log_settings.socket_allEvents ||
83
+ DyFM_global_settings.log_settings.socket_mainEvents;
84
+ } else {
85
+ this.logEvent = DyFM_global_settings.log_settings.socket_allEvents;
86
+ }
87
+ this.logEventContent = set.logEventContent ??
88
+ DyFM_global_settings.log_settings.socket_eventContent;
89
+ } catch (error) {
90
+ DyFM_Log.error(
91
+ `\nSocket Event params setup failed (${this.serviceName}): ${set.eventKey}`,
92
+ error
93
+ );
94
+
95
+ throw error;
96
+ }
97
+ }
98
+
99
+ /**
100
+ *
101
+ * @returns
102
+ */
103
+ private async getPreLog(content: T): Promise<void> {
104
+ try {
105
+ if (this.logEventContent && this.eventKey !== DyFM_SocketEvent_Key.connection) {
106
+ DyFM_Log.log(
107
+ `---> incoming socket(${this.serviceName}) event: ${this.eventKey};
108
+ \ncontent:`, content
109
+ );
110
+ } else {
111
+ DyFM_Log.log(`---> incoming socket(${this.serviceName}) event: ${this.eventKey}...`);
112
+ }
113
+ } catch (error) {
114
+ DyFM_Log.error(`PreLog failed... (socket: ${this.serviceName})`, error);
115
+ }
116
+ }
117
+
118
+ /**
119
+ *
120
+ * @returns
121
+ */
122
+ async executeEventTasks(content?: T, issuer?: string): Promise<void> {
123
+ try {
124
+ if (this.logEvent || this.logEventContent) {
125
+ await this.getPreLog(content);
126
+ }
127
+
128
+ await DyFM_Array.asyncForEach(
129
+ this.preProcesses,
130
+ async (preProcess: DyFM_SocketEventPreprocessTask<any, any>) => {
131
+ content = await preProcess(content);
132
+ }
133
+ );
134
+
135
+ await DyFM_Array.asyncForEach(this.tasks, async (task: DyFM_SocketEventTask<T>) => {
136
+ await task(content, issuer);
137
+ });
138
+ } catch (error) {
139
+ DyFM_Log.error(
140
+ `Socket Event tasks failed to execute on ${this.serviceName}.... (${this.eventKey})`,
141
+ error,
142
+ 'content:',
143
+ content
144
+ );
145
+ }
146
+ }
147
+ }
148
+
149
+
150
+
151
+
@@ -0,0 +1,251 @@
1
+
2
+ import * as SocketIOClient from 'socket.io-client';
3
+
4
+ import {
5
+ DyFM_global_settings
6
+ } from '../../../_collections/constants/global-settings.const';
7
+ import { DyFM_Error } from '../../../_models/control-models/error.control-model';
8
+ import { DyFM_Log } from '../../../_collections/utils/log.util';
9
+ import { DyFM_Array } from '../../../_collections/utils/array.util';
10
+ import { DyFM_delay } from '../../../_collections/utils/utilities.util';
11
+
12
+ import { DyFM_SocketEvent_Key } from '../_enums/sck-event-key.enum';
13
+ import { DyFM_SocketClient_Params } from '../_models/sck-client-params.control-model';
14
+ import { DyFM_SocketEvent } from '../_models/sck-socket-event.control-model';
15
+
16
+ export abstract class DyFM_SocketClient_ServiceBase {
17
+
18
+ private _params: DyFM_SocketClient_Params;
19
+ protected get params(): DyFM_SocketClient_Params { return this._params; }
20
+ get name(): string { return this.params.name; }
21
+
22
+ protected socket: SocketIOClient.Socket;
23
+
24
+ protected incomingEvents: DyFM_SocketEvent<any>[];
25
+
26
+ protected _connected: boolean = false;
27
+ get connected(): boolean { return this._connected; }
28
+
29
+ protected debugLog: boolean = DyFM_global_settings.log_settings.setup;
30
+ protected logFn: boolean = DyFM_global_settings.log_settings.functions;
31
+
32
+ private defaultEvents: DyFM_SocketEvent<any>[] = [
33
+ new DyFM_SocketEvent<any>({
34
+ eventKey: DyFM_SocketEvent_Key.connect,
35
+ tasks: [
36
+ async () => {
37
+ this._connected = true;
38
+ DyFM_Log.success(`< > socket-client(${this.params.name}) connected!`);
39
+ },
40
+ ],
41
+ }),
42
+
43
+ new DyFM_SocketEvent<any>({
44
+ eventKey: DyFM_SocketEvent_Key.disconnect,
45
+ tasks: [
46
+ async () => {
47
+ this._connected = false;
48
+ DyFM_Log.warn(`<x > socket-client(${this.params.name}) disconnected!`);
49
+
50
+ if (this._params.reconnect) {
51
+ await DyFM_delay(this._params.reconnectDelay);
52
+ this.connectSocket();
53
+ }
54
+ },
55
+ ],
56
+ }),
57
+
58
+ new DyFM_SocketEvent<any>({
59
+ eventKey: DyFM_SocketEvent_Key.subscriptionSuccessful,
60
+ tasks: [
61
+ async () => {
62
+ DyFM_Log.success(`<=--> socket-client(${this.params.name}) subscription successful!`);
63
+ },
64
+ ],
65
+ }),
66
+
67
+ new DyFM_SocketEvent<any>({
68
+ eventKey: DyFM_SocketEvent_Key.error,
69
+ tasks: [
70
+ async (content: any) => {
71
+ DyFM_Log.error(`=--> socket-client(${this.params.name}) ERROR!:`, content);
72
+ },
73
+ ],
74
+ }),
75
+ ];
76
+
77
+ protected constructor() {
78
+ this.asyncConstructor().catch((error: any) => {
79
+ if (
80
+ DyFM_global_settings.log_settings.highDetailedLogs ||
81
+ !(error instanceof DyFM_Error)
82
+ ) {
83
+ DyFM_Log.H_error(
84
+ `socket-client "${this.params?.name}" Service setup failed! ` +
85
+ `(DyFM_SocketClientService constructor catch)`,
86
+ `\n ERROR:`, error
87
+ );
88
+ } else {
89
+ error.logSimple(
90
+ `socket-client "${this.params?.name}" Service setup failed! ` +
91
+ `(DyFM_SocketClientService constructor catch)`
92
+ );
93
+ }
94
+ });
95
+ }
96
+
97
+ private async asyncConstructor(): Promise<void> {
98
+ try {
99
+ this._params = this.getParams();
100
+ this.incomingEvents = this.getIncomingEvents() ?? [];
101
+ this.socket = SocketIOClient.io(
102
+ `${this.params.address}:${this.params.port}`,
103
+ {
104
+ reconnection: this.params.reconnect,
105
+ reconnectionDelay: this.params.reconnectDelay,
106
+ ...this.params.socketOptions,
107
+ }
108
+ );
109
+
110
+ await this.setupDefaultEvents();
111
+
112
+ await this.setupSocketEvents();
113
+
114
+ DyFM_Log.success(`\nsocket-client(${this.params?.name}) Service setup finished`);
115
+
116
+ await this.connectSocket();
117
+ } catch (error) {
118
+ DyFM_Log.error(`socket-client(${this.params?.name}) Service setup failed!`, error);
119
+
120
+ throw new DyFM_Error({
121
+ errorCode: 'FM-SCS-001',
122
+ error: error,
123
+ });
124
+ }
125
+ }
126
+
127
+ private async setupDefaultEvents(): Promise<void> {
128
+ try {
129
+ if (this.logFn) console.log('\nFn:. setupDefaultEvents');
130
+
131
+ this.defaultEvents.forEach((defaultEvent: DyFM_SocketEvent<any>) => {
132
+ defaultEvent.serviceName = this.params.name;
133
+ const eventDeclared = this.incomingEvents.find(
134
+ (event: DyFM_SocketEvent<any>) => event.eventKey === defaultEvent.eventKey
135
+ );
136
+
137
+ if (!eventDeclared) {
138
+ this.incomingEvents.push(defaultEvent);
139
+ } else {
140
+ eventDeclared.tasks.unshift(...defaultEvent.tasks);
141
+ }
142
+ });
143
+ } catch (error) {
144
+ DyFM_Log.error(
145
+ `socket-client(${this.params.name}) Service Setup Default Events failed, ` +
146
+ `ERROR:`, error
147
+ );
148
+
149
+ throw error;
150
+ }
151
+ }
152
+
153
+ private async setupSocketEvents(): Promise<void> {
154
+ try {
155
+ if (this.debugLog) console.log(`Setup socket-client(${this.params.name}) Events...`);
156
+
157
+ await DyFM_Array.asyncForEach(
158
+ this.incomingEvents,
159
+ async (event: DyFM_SocketEvent<any>) => {
160
+ event.serviceName = this.params.name;
161
+ this.socket.on(event.eventKey, async (content: any) => {
162
+ try {
163
+ await event.executeEventTasks(content, this.params.service);
164
+ } catch (error) {
165
+ DyFM_Log.error(`socket-client(${this.params.name}) Event failed, ERROR:`, error);
166
+ await this.emitEvent(DyFM_SocketEvent_Key.error, error);
167
+ }
168
+ });
169
+ }
170
+ );
171
+ } catch (error) {
172
+ DyFM_Log.error(
173
+ `socket-client(${this.params.name}) Service Setup Socket Events failed, ` +
174
+ `ERROR:`, error
175
+ );
176
+
177
+ throw error;
178
+ }
179
+ }
180
+
181
+ private async connectSocket(): Promise<void> {
182
+ try {
183
+ DyFM_Log.info(
184
+ `< .. > socket-client(${this.params.name}) ` +
185
+ `connecting to ${this.params.address}:${this.params.port} ...`
186
+ );
187
+
188
+ this.socket.connect();
189
+
190
+ if (this.params.reconnect) {
191
+ await this.tryReconnectIfNeeded();
192
+ }
193
+ } catch (error) {
194
+ DyFM_Log.error(
195
+ `socket-client(${this.params.name}) Service Connect Socket failed, ` +
196
+ `ERROR:`, error
197
+ );
198
+
199
+ throw error;
200
+ }
201
+ }
202
+
203
+ private async tryReconnectIfNeeded(): Promise<void> {
204
+ try {
205
+ if (this.logFn) console.log(`\nFn:. tryReconnectIfNeeded`);
206
+ await DyFM_delay(this._params.reconnectDelay);
207
+
208
+ if (!this._connected) {
209
+ await this.connectSocket();
210
+ }
211
+ } catch (error) {
212
+ DyFM_Log.error(
213
+ `socket-client(${this.params.name}) Service Try Reconnect failed, ` +
214
+ `ERROR:`, error
215
+ );
216
+
217
+ throw error;
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Emit event to the socket
223
+ * @param eventType event name
224
+ * @param content event content
225
+ */
226
+ protected async emitEvent(eventType: string, content: any): Promise<void> {
227
+ try {
228
+ DyFM_Log.log(`<=-- outgoing socket-client(${this.params.name}) event: ${eventType}`);
229
+ this.socket.emit(eventType, content);
230
+ } catch (error) {
231
+ DyFM_Log.error(
232
+ `socket-client(${this.params.name}) ` +
233
+ `Service Emit Event failed: ${this.params?.name} (${this.params?.port})`, error
234
+ );
235
+
236
+ throw error;
237
+ }
238
+ }
239
+
240
+ /**
241
+ * You must setup params for the service in this function
242
+ */
243
+ abstract getParams(): DyFM_SocketClient_Params;
244
+
245
+ /**
246
+ * You must setup events and required services in this function
247
+ */
248
+ abstract getIncomingEvents(): DyFM_SocketEvent<any>[];
249
+ }
250
+
251
+
@@ -1,6 +1,14 @@
1
1
 
2
2
 
3
+
4
+ // ENUMS
5
+ export * from './_enums/sck-event-key.enum';
6
+
7
+
3
8
  // MODELS
4
9
  export * from './_models/sck-client-params.control-model';
10
+ export * from './_models/sck-socket-event.control-model';
5
11
 
6
12
 
13
+ // SERVICES
14
+ export * from './_services/sck-client.service-base';
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  // COLLECTIONS
3
3
  // collections/CONSTANTS
4
4
  export * from './_collections/constants/error-defaults.const';
5
+ export * from './_collections/constants/global-settings.const';
5
6
  export * from './_collections/constants/times.const';
6
7
 
7
8
  // collections/UTILS
@@ -57,3 +58,7 @@ export * from './_models/interfaces/random-weight.interface';
57
58
  export * from './_models/interfaces/route-settings.interface';
58
59
  export * from './_models/interfaces/vector2.interface';
59
60
 
61
+ // models/interfaces/ENVIRONMENT
62
+ export * from './_models/interfaces/environment/global-settings.interface';
63
+ export * from './_models/interfaces/environment/global-log-settings.interface';
64
+
Binary file