@nsshunt/stsappframework 3.0.106 → 3.0.108
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/dist/influxdb/influxDBManager.js +17 -16
- package/dist/influxdb/influxDBManager.js.map +1 -1
- package/dist/influxdb/influxDBManagerAgent.js +13 -9
- package/dist/influxdb/influxDBManagerAgent.js.map +1 -1
- package/dist/influxdb/influxDBManagerBase.js +6 -2
- package/dist/influxdb/influxDBManagerBase.js.map +1 -1
- package/dist/influxdb/influxDBManagerService.js +14 -10
- package/dist/influxdb/influxDBManagerService.js.map +1 -1
- package/dist/instrumentationsubscriber.js +16 -12
- package/dist/instrumentationsubscriber.js.map +1 -1
- package/dist/processbase.js +10 -8
- package/dist/processbase.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tcpclient/app2.js +2 -2
- package/dist/tcpserver/appmaster.js +16 -39
- package/dist/tcpserver/appmaster.js.map +1 -1
- package/package.json +1 -1
- package/src/influxdb/influxDBManager.ts +18 -16
- package/src/influxdb/influxDBManagerAgent.ts +11 -9
- package/src/influxdb/influxDBManagerBase.ts +4 -2
- package/src/influxdb/influxDBManagerService.ts +12 -10
- package/src/instrumentationsubscriber.ts +15 -12
- package/src/processbase.ts +11 -7
- package/src/server.ts +1 -1
- package/src/tcpclient/app2.ts +2 -2
- package/src/tcpserver/appmaster.ts +17 -39
- package/types/influxdb/influxDBManager.d.ts.map +1 -1
- package/types/influxdb/influxDBManagerAgent.d.ts.map +1 -1
- package/types/influxdb/influxDBManagerBase.d.ts.map +1 -1
- package/types/influxdb/influxDBManagerService.d.ts.map +1 -1
- package/types/instrumentationsubscriber.d.ts.map +1 -1
- package/types/processbase.d.ts +2 -2
- package/types/processbase.d.ts.map +1 -1
- package/types/tcpserver/appmaster.d.ts.map +1 -1
|
@@ -117,6 +117,8 @@ import { InfluxDBManagerBase } from './influxDBManagerBase'
|
|
|
117
117
|
import { IInfluxDBManagerOptions, InstrumentPayload } from './../commonTypes'
|
|
118
118
|
import { ISubscriptionPayload, ISubscriptionKey } from '@nsshunt/stssocketio-client'
|
|
119
119
|
|
|
120
|
+
import chalk from 'chalk';
|
|
121
|
+
|
|
120
122
|
const _logPrefix = 'InfluxDBManagerService:'
|
|
121
123
|
|
|
122
124
|
/*
|
|
@@ -179,7 +181,7 @@ data
|
|
|
179
181
|
|
|
180
182
|
return this.queryApi.collectRows(query)
|
|
181
183
|
} catch (error) {
|
|
182
|
-
console.error(`${_logPrefix}#GetSTSCountGeneric: Error: [${error}]
|
|
184
|
+
console.error(chalk.red(`${_logPrefix}#GetSTSCountGeneric: Error: [${error}]`));
|
|
183
185
|
}
|
|
184
186
|
}
|
|
185
187
|
|
|
@@ -195,7 +197,7 @@ data
|
|
|
195
197
|
|> difference()`;
|
|
196
198
|
return this.queryApi.collectRows(query)
|
|
197
199
|
} catch (error) {
|
|
198
|
-
console.error(`${_logPrefix}#GetSTSHistoGeneric: Error: [${error}]
|
|
200
|
+
console.error(chalk.red(`${_logPrefix}#GetSTSHistoGeneric: Error: [${error}]`));
|
|
199
201
|
}
|
|
200
202
|
}
|
|
201
203
|
|
|
@@ -226,7 +228,7 @@ data
|
|
|
226
228
|
|
|
227
229
|
return this.queryApi.collectRows(query)
|
|
228
230
|
} catch (error) {
|
|
229
|
-
console.error(`${_logPrefix}#GetSTSQuantileGeneric: Error: [${error}]
|
|
231
|
+
console.error(chalk.red(`${_logPrefix}#GetSTSQuantileGeneric: Error: [${error}]`));
|
|
230
232
|
}
|
|
231
233
|
}
|
|
232
234
|
|
|
@@ -241,7 +243,7 @@ data
|
|
|
241
243
|
this.#GetSTSHistoGenericService(SERVICE_STATS_GLOBAL, '')],
|
|
242
244
|
[ ])
|
|
243
245
|
} catch (error) {
|
|
244
|
-
console.error(`${_logPrefix}GetInfluxDBResultsRoot: Error: [${error}]
|
|
246
|
+
console.error(chalk.red(`${_logPrefix}GetInfluxDBResultsRoot: Error: [${error}]`));
|
|
245
247
|
}
|
|
246
248
|
return {
|
|
247
249
|
subscriptionKey,
|
|
@@ -259,7 +261,7 @@ data
|
|
|
259
261
|
this.#GetSTSHistoGenericService(SERVICE_STATS_BY_SERVICE, '')],
|
|
260
262
|
['serviceId'])
|
|
261
263
|
} catch (error) {
|
|
262
|
-
console.error(`${_logPrefix}GetInfluxDBResultsService: Error: [${error}]
|
|
264
|
+
console.error(chalk.red(`${_logPrefix}GetInfluxDBResultsService: Error: [${error}]`));
|
|
263
265
|
}
|
|
264
266
|
return {
|
|
265
267
|
subscriptionKey,
|
|
@@ -279,7 +281,7 @@ data
|
|
|
279
281
|
this.#GetSTSHistoGenericService(SERVICE_STATS_BY_SERVICE_INSTANCE, `and r["serviceId"] == "${serviceId}"`)],
|
|
280
282
|
['serviceId', 'serviceInstanceId'])
|
|
281
283
|
} catch (error) {
|
|
282
|
-
console.error(`${_logPrefix}GetInfluxDBResultsServiceInstances: Error: [${error}]
|
|
284
|
+
console.error(chalk.red(`${_logPrefix}GetInfluxDBResultsServiceInstances: Error: [${error}]`));
|
|
283
285
|
}
|
|
284
286
|
return {
|
|
285
287
|
subscriptionKey,
|
|
@@ -298,7 +300,7 @@ data
|
|
|
298
300
|
this.#GetSTSHistoGenericService(SERVICE_STATS_BY_SERVICE_INSTANCE_PROCESS, `and r["serviceInstanceId"] == "${serviceInstanceId}"`)],
|
|
299
301
|
['serviceId', 'serviceInstanceId', 'serviceInstanceProcessId'])
|
|
300
302
|
} catch (error) {
|
|
301
|
-
console.error(`${_logPrefix}GetInfluxDBResultsServiceInstance: Error: [${error}]
|
|
303
|
+
console.error(chalk.red(`${_logPrefix}GetInfluxDBResultsServiceInstance: Error: [${error}]`));
|
|
302
304
|
}
|
|
303
305
|
return {
|
|
304
306
|
subscriptionKey,
|
|
@@ -361,12 +363,12 @@ data
|
|
|
361
363
|
writeApi.writePoint(point);
|
|
362
364
|
return true;
|
|
363
365
|
} catch (error: any) {
|
|
364
|
-
console.error(`${_logPrefix}OutputInfluxDB: Could not write data point: [${error}]
|
|
365
|
-
console.error(`${JSON.stringify(instrumentPayload.context)}
|
|
366
|
+
console.error(chalk.red(`${_logPrefix}OutputInfluxDB: Could not write data point: [${error}]`));
|
|
367
|
+
console.error(chalk.red(`${JSON.stringify(instrumentPayload.context)}`));
|
|
366
368
|
return false;
|
|
367
369
|
}
|
|
368
370
|
} else {
|
|
369
|
-
console.error(`${_logPrefix}OutputInfluxDBService: Could not write data point as writeClient is null
|
|
371
|
+
console.error(chalk.red(`${_logPrefix}OutputInfluxDBService: Could not write data point as writeClient is null`));
|
|
370
372
|
return false;
|
|
371
373
|
}
|
|
372
374
|
}
|
|
@@ -7,6 +7,9 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
7
7
|
|
|
8
8
|
import { $Options } from '@nsshunt/stsconfig'
|
|
9
9
|
import { STSOptionsBase } from '@nsshunt/stsutils';
|
|
10
|
+
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
|
|
10
13
|
const goptions = $Options()
|
|
11
14
|
|
|
12
15
|
declare interface IKafkaSubscription {
|
|
@@ -80,12 +83,12 @@ export class InstrumentationSubscriber extends STSOptionsBase {
|
|
|
80
83
|
const kafka = subscription.kafka;
|
|
81
84
|
if (kafka) {
|
|
82
85
|
// Un-Subscribe from this kafka topic
|
|
83
|
-
this.#Log(`InstrumentationSubscriber:#UnSubscribeKafka(): Unsubscribe from Kafka topc: [${kafka.kafkaTopic}] Starting
|
|
86
|
+
this.#Log(chalk.yellow(`InstrumentationSubscriber:#UnSubscribeKafka(): Unsubscribe from Kafka topc: [${kafka.kafkaTopic}] Starting`));
|
|
84
87
|
await kafka.kafkaConsumer?.Stop();
|
|
85
88
|
await kafka.kafkaConsumer?.Disconnect();
|
|
86
|
-
this.#Log(`InstrumentationSubscriber:#UnSubscribeKafka(): Unsubscribe from Kafka topc: [${kafka.kafkaTopic}] Completed
|
|
89
|
+
this.#Log(chalk.yellow(`InstrumentationSubscriber:#UnSubscribeKafka(): Unsubscribe from Kafka topc: [${kafka.kafkaTopic}] Completed.`));
|
|
87
90
|
} else {
|
|
88
|
-
this.#Log(`InstrumentationSubscriber:#UnSubscribeKafka(): Kafka details do not exist for this topc: [${JSON.stringify(subscription.subscriptionKey)}]
|
|
91
|
+
this.#Log(chalk.magenta(`InstrumentationSubscriber:#UnSubscribeKafka(): Kafka details do not exist for this topc: [${JSON.stringify(subscription.subscriptionKey)}].`));
|
|
89
92
|
}
|
|
90
93
|
};
|
|
91
94
|
return unsubscribeKafka();
|
|
@@ -126,18 +129,18 @@ export class InstrumentationSubscriber extends STSOptionsBase {
|
|
|
126
129
|
} as IKafkaData
|
|
127
130
|
});
|
|
128
131
|
} else {
|
|
129
|
-
this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Invalid message format from Kafka data, topic: [${topic}] and key: [${key}] do not match
|
|
132
|
+
this.#Log(chalk.red(`InstrumentationSubscriber:#SubscribeKafka(): Invalid message format from Kafka data, topic: [${topic}] and key: [${key}] do not match`));
|
|
130
133
|
}
|
|
131
134
|
} else {
|
|
132
|
-
this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Invalid message format from Kafka data, topic: [${topic}], key: [${key}], value: [${value}]
|
|
135
|
+
this.#Log(chalk.red(`InstrumentationSubscriber:#SubscribeKafka(): Invalid message format from Kafka data, topic: [${topic}], key: [${key}], value: [${value}]`));
|
|
133
136
|
}
|
|
134
137
|
} catch (error) {
|
|
135
|
-
this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Error: [${error}]
|
|
138
|
+
this.#Log(chalk.red(`InstrumentationSubscriber:#SubscribeKafka(): Error: [${error}]`));
|
|
136
139
|
}
|
|
137
140
|
});
|
|
138
|
-
this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Subscribe to Kafka topc: [${kafka.kafkaTopic}] Completed
|
|
141
|
+
this.#Log(chalk.yellow(`InstrumentationSubscriber:#SubscribeKafka(): Subscribe to Kafka topc: [${kafka.kafkaTopic}] Completed`));
|
|
139
142
|
} else {
|
|
140
|
-
this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Could not subscribe to Kafka topc, missing combinedKey for topic: [${JSON.stringify(subscription.subscriptionKey)}]
|
|
143
|
+
this.#Log(chalk.magenta(`InstrumentationSubscriber:#SubscribeKafka(): Could not subscribe to Kafka topc, missing combinedKey for topic: [${JSON.stringify(subscription.subscriptionKey)}]`));
|
|
141
144
|
}
|
|
142
145
|
}
|
|
143
146
|
return kafkaSubscribe();
|
|
@@ -212,7 +215,7 @@ export class InstrumentationSubscriber extends STSOptionsBase {
|
|
|
212
215
|
}
|
|
213
216
|
}
|
|
214
217
|
} catch (error) {
|
|
215
|
-
this.#Log(`InstrumentationSubscriber:#ExecuteSubscriptions(): Error: [${error}], [${JSON.stringify(retVal)}]
|
|
218
|
+
this.#Log(chalk.red(`InstrumentationSubscriber:#ExecuteSubscriptions(): Error: [${error}], [${JSON.stringify(retVal)}]`));
|
|
216
219
|
}
|
|
217
220
|
}
|
|
218
221
|
|
|
@@ -223,7 +226,7 @@ export class InstrumentationSubscriber extends STSOptionsBase {
|
|
|
223
226
|
}
|
|
224
227
|
if (this.#subscriptions[subscriptionKey.id]) {
|
|
225
228
|
// Subscription already exists - ignoring
|
|
226
|
-
this.#Log(`InstrumentationSubscriber.Subscribe(): Subscription already exists: [${subscriptionKey.id}] - ignoring
|
|
229
|
+
this.#Log(chalk.magenta(`InstrumentationSubscriber.Subscribe(): Subscription already exists: [${subscriptionKey.id}] - ignoring.`));
|
|
227
230
|
} else {
|
|
228
231
|
this.#subscriptions[subscriptionKey.id] = {
|
|
229
232
|
subscriptionKey,
|
|
@@ -232,7 +235,7 @@ export class InstrumentationSubscriber extends STSOptionsBase {
|
|
|
232
235
|
if (subscriptionKey.topic.localeCompare(SubscriptionTopic.LogProcessing) === 0) {
|
|
233
236
|
this.#SubscribeKafka(this.#subscriptions[subscriptionKey.id]);
|
|
234
237
|
}
|
|
235
|
-
this.#Log(`InstrumentationSubscriber.Subscribe(): subscriptionKey.id: [${subscriptionKey.id}] successfully subscribed
|
|
238
|
+
this.#Log(chalk.grey(`InstrumentationSubscriber.Subscribe(): subscriptionKey.id: [${subscriptionKey.id}] successfully subscribed.`));
|
|
236
239
|
|
|
237
240
|
if (!this.#interval) {
|
|
238
241
|
// Output subscription immediately and then iterate ...
|
|
@@ -250,7 +253,7 @@ export class InstrumentationSubscriber extends STSOptionsBase {
|
|
|
250
253
|
|
|
251
254
|
UnSubscribe(subscriptionKey: ISubscriptionKey) {
|
|
252
255
|
if (!this.#subscriptions[subscriptionKey.id]) {
|
|
253
|
-
this.#Log(`UnSubscribe(): Warning, subscriptionKey.id: [${subscriptionKey.id}] does not exist within subscription records
|
|
256
|
+
this.#Log(chalk.magenta(`UnSubscribe(): Warning, subscriptionKey.id: [${subscriptionKey.id}] does not exist within subscription records`));
|
|
254
257
|
} else {
|
|
255
258
|
if (subscriptionKey.topic.localeCompare(SubscriptionTopic.LogProcessing) === 0) {
|
|
256
259
|
this.#UnSubscribeKafka(this.#subscriptions[subscriptionKey.id]);
|
package/src/processbase.ts
CHANGED
|
@@ -7,6 +7,8 @@ import colors from 'colors'
|
|
|
7
7
|
import si from 'systeminformation' // https://systeminformation.io/
|
|
8
8
|
import { GetFirstNetworkInterface } from './network'
|
|
9
9
|
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
|
|
10
12
|
import debugModule from 'debug'
|
|
11
13
|
const debug = debugModule(`proc:${process.pid}:processBase`);
|
|
12
14
|
|
|
@@ -76,10 +78,12 @@ export abstract class ProcessBase extends STSOptionsBase implements IProcessBase
|
|
|
76
78
|
if (cluster.isPrimary)
|
|
77
79
|
{
|
|
78
80
|
prefix = 'M';
|
|
79
|
-
col = colors.bold.cyan;
|
|
81
|
+
//col = colors.bold.cyan; // chalk.bold.cyan;
|
|
82
|
+
col = chalk.bold.cyan;
|
|
80
83
|
} else {
|
|
81
84
|
prefix = 'W';
|
|
82
|
-
col = colors.green;
|
|
85
|
+
//col = colors.green; // chalk.green;
|
|
86
|
+
col = chalk.green;
|
|
83
87
|
}
|
|
84
88
|
const msgEx = col(`${prefix}(${process.pid}) [${appName}]: ${msg}`);
|
|
85
89
|
debug(msgEx);
|
|
@@ -334,13 +338,13 @@ export abstract class ProcessBase extends STSOptionsBase implements IProcessBase
|
|
|
334
338
|
try {
|
|
335
339
|
const retVal = await (this.accessLayer as PGAccessLayer).getResourceCount();
|
|
336
340
|
if (retVal.status !== StatusCodes.OK) {
|
|
337
|
-
this.LogEx(`Unable to get resources from the database. Is the database running? [${JSON.stringify(retVal)}]
|
|
341
|
+
this.LogEx(chalk.red(`Unable to get resources from the database. Is the database running? [${JSON.stringify(retVal)}]`));
|
|
338
342
|
exit(1);
|
|
339
343
|
} else {
|
|
340
|
-
this.LogEx(`Database connection successful. Resources: [${retVal.detail.count}]
|
|
344
|
+
this.LogEx(chalk.green(`Database connection successful. Resources: [${retVal.detail.count}]`));
|
|
341
345
|
}
|
|
342
346
|
} catch (error) {
|
|
343
|
-
this.LogEx(`Unable to get resources from the database. Is the database running? Error: [${error}]
|
|
347
|
+
this.LogEx(chalk.red(`Unable to get resources from the database. Is the database running? Error: [${error}]`));
|
|
344
348
|
exit(1);
|
|
345
349
|
}
|
|
346
350
|
})();
|
|
@@ -402,9 +406,9 @@ export abstract class ProcessBase extends STSOptionsBase implements IProcessBase
|
|
|
402
406
|
GetSignalColour = (signal: any) => {
|
|
403
407
|
let msgcolor = null;
|
|
404
408
|
if (signal === 'SIGINT') {
|
|
405
|
-
msgcolor =
|
|
409
|
+
msgcolor = chalk.yellow;
|
|
406
410
|
} else {
|
|
407
|
-
msgcolor =
|
|
411
|
+
msgcolor = chalk.red;
|
|
408
412
|
}
|
|
409
413
|
return msgcolor;
|
|
410
414
|
};
|
package/src/server.ts
CHANGED
|
@@ -33,7 +33,7 @@ export class STSExpressServer
|
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
serverNetworkMiddleware.on(ServerNetworkMiddlewareEventName.UpdateInstrument_SERVER_NET_VAL, (data: ISocketRecord) => {
|
|
36
|
-
//console.log(`serverNetworkMiddleware: [${JSON.stringify(data)}]
|
|
36
|
+
//console.log(chalk.magenta(`serverNetworkMiddleware: [${JSON.stringify(data)}]`));
|
|
37
37
|
stsApp.UpdateInstrument(Gauge.NETWORK_RX_GAUGE, {
|
|
38
38
|
Inc: data.requestBytesRead
|
|
39
39
|
} as InstrumentGaugeTelemetry);
|
package/src/tcpclient/app2.ts
CHANGED
|
@@ -48,9 +48,9 @@ socket2.on('secureConnect', () => {
|
|
|
48
48
|
dosomework(socket2);
|
|
49
49
|
});
|
|
50
50
|
socket2.on('close', function(data: any) {
|
|
51
|
-
console.log(`CLOSED: ${socket2.remoteAddress} ${socket2.remotePort}
|
|
51
|
+
console.log(chalk.green(`CLOSED: ${socket2.remoteAddress} ${socket2.remotePort}`));
|
|
52
52
|
});
|
|
53
53
|
socket2.on('data', function(data: any) {
|
|
54
|
-
console.log(`DATA ${socket2.remoteAddress} ${socket2.remotePort} ${data}
|
|
54
|
+
console.log(chalk.green(`DATA ${socket2.remoteAddress} ${socket2.remotePort} ${data}`));
|
|
55
55
|
});
|
|
56
56
|
*/
|
|
@@ -9,6 +9,8 @@ import { JSONObject } from '@nsshunt/stsutils';
|
|
|
9
9
|
import { MasterProcessBase } from './../masterprocessbase'
|
|
10
10
|
import { ProcessOptions } from './../processoptions'
|
|
11
11
|
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
|
|
12
14
|
// Colour codes
|
|
13
15
|
// ---------------------------------
|
|
14
16
|
// Red - Error
|
|
@@ -122,7 +124,7 @@ export class AppMaster extends MasterProcessBase
|
|
|
122
124
|
// Update my currentTerm
|
|
123
125
|
this.#currentTerm = term;
|
|
124
126
|
// Return my yes vote
|
|
125
|
-
console.log(`${message} - Vote Yes
|
|
127
|
+
console.log(chalk.green(`${message} - Vote Yes`));
|
|
126
128
|
callback(null, true); // YES vote
|
|
127
129
|
}
|
|
128
130
|
|
|
@@ -130,7 +132,7 @@ export class AppMaster extends MasterProcessBase
|
|
|
130
132
|
// Log the fact that I have now voted for this currentTerm
|
|
131
133
|
this.#votedLog[term] = true;
|
|
132
134
|
// Return my yes vote
|
|
133
|
-
console.log(`${message} - Vote No
|
|
135
|
+
console.log(chalk.yellow(`${message} - Vote No`));
|
|
134
136
|
callback(null, false); // NO vote
|
|
135
137
|
}
|
|
136
138
|
|
|
@@ -229,19 +231,19 @@ export class AppMaster extends MasterProcessBase
|
|
|
229
231
|
const retVal = this.#CheckMoreRecentTerm(term, lastLogItemTerm, lastLogItemIndex);
|
|
230
232
|
if (retVal.retVal === true) {
|
|
231
233
|
console.log(`${retVal.msg}`);
|
|
232
|
-
console.log(`${this.#GetLogPrefix()}: New leader detected, Host: [${host}], Port: [${port}], while in CANDIDATE mode, reverting to FOLLOWER
|
|
234
|
+
console.log(chalk.magenta(`${this.#GetLogPrefix()}: New leader detected, Host: [${host}], Port: [${port}], while in CANDIDATE mode, reverting to FOLLOWER.`));
|
|
233
235
|
// This sending node is the leader so revert to follower
|
|
234
236
|
this.#currentTerm = term;
|
|
235
237
|
this.#ChangeState(AppMasterRAFTState.FOLLOWER);
|
|
236
238
|
} else {
|
|
237
239
|
console.log(`${retVal.msg}`);
|
|
238
|
-
console.log(`${this.#GetLogPrefix()}: appendEntry called but log is older than my current state, Host: [${host}], Port: [${port}]
|
|
240
|
+
console.log(chalk.magenta(`${this.#GetLogPrefix()}: appendEntry called but log is older than my current state, Host: [${host}], Port: [${port}].`));
|
|
239
241
|
// Reject this RPC and continue in the CANDIDATE state
|
|
240
242
|
callback(null, false);
|
|
241
243
|
return;
|
|
242
244
|
}
|
|
243
245
|
} else if (this.#RAFTState.localeCompare(AppMasterRAFTState.LEADER) === 0) {
|
|
244
|
-
console.log(`${this.#GetLogPrefix()}: appendEntry called while I am the current leader, rejecting RPC call
|
|
246
|
+
console.log(chalk.red(`${this.#GetLogPrefix()}: appendEntry called while I am the current leader, rejecting RPC call.`));
|
|
245
247
|
// Reject this RPC and continue in the LEADER state
|
|
246
248
|
callback(null, false);
|
|
247
249
|
return;
|
|
@@ -258,7 +260,7 @@ export class AppMaster extends MasterProcessBase
|
|
|
258
260
|
}
|
|
259
261
|
} else {
|
|
260
262
|
console.log(`${retVal.msg}`);
|
|
261
|
-
console.log(`${this.#GetLogPrefix()}: appendEntry called but log is older than my current state, Host: [${host}], Port: [${port}]
|
|
263
|
+
console.log(chalk.magenta(`${this.#GetLogPrefix()}: appendEntry called but log is older than my current state, Host: [${host}], Port: [${port}].`));
|
|
262
264
|
// Reject this RPC and continue in the CANDIDATE state
|
|
263
265
|
callback(null, false);
|
|
264
266
|
return;
|
|
@@ -270,13 +272,13 @@ export class AppMaster extends MasterProcessBase
|
|
|
270
272
|
if (sentLeaderService) {
|
|
271
273
|
if (sentLeaderService.host.localeCompare(this.#leaderNode.host) !== 0 || sentLeaderService.port !== this.#leaderNode.port) {
|
|
272
274
|
this.#leaderNode = sentLeaderService;
|
|
273
|
-
console.log(`${this.#GetLogPrefix()}: Leader Service: Host:[${this.#leaderNode.host}] Port: [${this.#leaderNode.port}]
|
|
275
|
+
console.log(chalk.white(`${this.#GetLogPrefix()}: Leader Service: Host:[${this.#leaderNode.host}] Port: [${this.#leaderNode.port}]`));
|
|
274
276
|
}
|
|
275
277
|
}
|
|
276
278
|
} else {
|
|
277
279
|
this.#leaderNode = this.#FindService(host, port);
|
|
278
280
|
if (this.#leaderNode) {
|
|
279
|
-
console.log(`${this.#GetLogPrefix()}: Leader Service: Host:[${this.#leaderNode.host}] Port: [${this.#leaderNode.port}]
|
|
281
|
+
console.log(chalk.white(`${this.#GetLogPrefix()}: Leader Service: Host:[${this.#leaderNode.host}] Port: [${this.#leaderNode.port}]`));
|
|
280
282
|
}
|
|
281
283
|
}
|
|
282
284
|
|
|
@@ -309,18 +311,6 @@ export class AppMaster extends MasterProcessBase
|
|
|
309
311
|
};
|
|
310
312
|
|
|
311
313
|
const client = jayson.client.tls(options);
|
|
312
|
-
/*
|
|
313
|
-
client.on('tcp socket', (socket: tls.TLSSocket) => {
|
|
314
|
-
socket.setTimeout(200); //@@ config
|
|
315
|
-
socket.on('timeout', () => {
|
|
316
|
-
console.log('socket timeout');
|
|
317
|
-
socket.end();
|
|
318
|
-
});
|
|
319
|
-
});
|
|
320
|
-
client.on('tcp error', (error: any) => {
|
|
321
|
-
console.log(`ERROR: [${error}]`.red);
|
|
322
|
-
});
|
|
323
|
-
*/
|
|
324
314
|
|
|
325
315
|
let lastLogItem: ILogItem;
|
|
326
316
|
if (this.#log.length > 0) {
|
|
@@ -335,7 +325,7 @@ export class AppMaster extends MasterProcessBase
|
|
|
335
325
|
|
|
336
326
|
client.request('vote', [ this.#currentTerm, lastLogItem.term, lastLogItem.index ], (error: any, response: any) => {
|
|
337
327
|
if (error) {
|
|
338
|
-
//console.log(`vote attempt fail: [${JSON.stringify(options)}: ${error}]
|
|
328
|
+
//console.log(chalk.red(`vote attempt fail: [${JSON.stringify(options)}: ${error}]`));
|
|
339
329
|
} else {
|
|
340
330
|
// Log the result
|
|
341
331
|
if (response.result === true) {
|
|
@@ -353,18 +343,6 @@ export class AppMaster extends MasterProcessBase
|
|
|
353
343
|
};
|
|
354
344
|
|
|
355
345
|
const client = jayson.client.tls(options);
|
|
356
|
-
/*
|
|
357
|
-
client.on('tcp socket', (socket: tls.TLSSocket) => {
|
|
358
|
-
socket.setTimeout(200); //@@ config
|
|
359
|
-
socket.on('timeout', () => {
|
|
360
|
-
console.log('socket timeout');
|
|
361
|
-
socket.end();
|
|
362
|
-
});
|
|
363
|
-
});
|
|
364
|
-
client.on('tcp error', (error: any) => {
|
|
365
|
-
console.log(`ERROR: [${error}]`.red);
|
|
366
|
-
});
|
|
367
|
-
*/
|
|
368
346
|
|
|
369
347
|
let lastLogItem: ILogItem;
|
|
370
348
|
if (this.#log.length > 0) {
|
|
@@ -379,7 +357,7 @@ export class AppMaster extends MasterProcessBase
|
|
|
379
357
|
|
|
380
358
|
client.request('appendEntry', [ this.#thisService.host, this.#thisService.port, this.#currentTerm, lastLogItem.term, lastLogItem.index ], (error: any, response: any) => {
|
|
381
359
|
if (error) {
|
|
382
|
-
//console.log(`appendEntry attempt fail: [${JSON.stringify(options)}: ${error}]
|
|
360
|
+
//console.log(chalk.red(`appendEntry attempt fail: [${JSON.stringify(options)}: ${error}]`));
|
|
383
361
|
} else {
|
|
384
362
|
this.#appendedEntries[this.#GetServiceKey(service)] = 1;
|
|
385
363
|
// Log the result
|
|
@@ -431,14 +409,14 @@ export class AppMaster extends MasterProcessBase
|
|
|
431
409
|
if (majority) {
|
|
432
410
|
this.#StartAppendEntries();
|
|
433
411
|
} else {
|
|
434
|
-
console.log(`${this.#GetLogPrefix()}: Not enough response for valid cluster state
|
|
412
|
+
console.log(chalk.red(`${this.#GetLogPrefix()}: Not enough response for valid cluster state.`));
|
|
435
413
|
}
|
|
436
414
|
}, this.#heartBeatTimeout);
|
|
437
415
|
}
|
|
438
416
|
|
|
439
417
|
#Promote = () => {
|
|
440
418
|
this.#ChangeState(AppMasterRAFTState.LEADER);
|
|
441
|
-
console.log(`${this.#GetLogPrefix()}: New LEADER is elected: [${this.#GetSelfServiceKey()}]
|
|
419
|
+
console.log(chalk.green(`${this.#GetLogPrefix()}: New LEADER is elected: [${this.#GetSelfServiceKey()}]`));
|
|
442
420
|
// As leader, now start the regular pings
|
|
443
421
|
this.#StartAppendEntries();
|
|
444
422
|
}
|
|
@@ -492,7 +470,7 @@ export class AppMaster extends MasterProcessBase
|
|
|
492
470
|
// Log the result - Vote for myself
|
|
493
471
|
this.#votes[this.#GetSelfServiceKey()] = 1;
|
|
494
472
|
// Return my yes vote
|
|
495
|
-
console.log(`${this.#GetLogPrefix()}: SELF VOTE: canidate currentTerm: [${this.#currentTerm}], vote YES
|
|
473
|
+
console.log(chalk.green(`${this.#GetLogPrefix()}: SELF VOTE: canidate currentTerm: [${this.#currentTerm}], vote YES`));
|
|
496
474
|
this.#CheckMajority();
|
|
497
475
|
} else {
|
|
498
476
|
// Send vote request
|
|
@@ -526,13 +504,13 @@ export class AppMaster extends MasterProcessBase
|
|
|
526
504
|
}
|
|
527
505
|
|
|
528
506
|
#StartRAFTService = async () => {
|
|
529
|
-
this.LogEx(`---[ RAFT Protocol Starting ]
|
|
507
|
+
this.LogEx(chalk.green(`---[ RAFT Protocol Starting ]---`));
|
|
530
508
|
this.#server = await this.#SetupJSONRPCServer();
|
|
531
509
|
this.#StartElectionTimeout();
|
|
532
510
|
}
|
|
533
511
|
|
|
534
512
|
#ChangeState(newState: AppMasterRAFTState) {
|
|
535
|
-
this.LogEx(`${this.#GetLogPrefix()}: State Change, From: [${this.#RAFTState.toString()}] --> To: [${newState.toString()}]
|
|
513
|
+
this.LogEx(chalk.magenta(`${this.#GetLogPrefix()}: State Change, From: [${this.#RAFTState.toString()}] --> To: [${newState.toString()}]`));
|
|
536
514
|
this.#RAFTState = newState;
|
|
537
515
|
}
|
|
538
516
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"influxDBManager.d.ts","sourceRoot":"","sources":["../../src/influxdb/influxDBManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,QAAQ,EAAgD,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"influxDBManager.d.ts","sourceRoot":"","sources":["../../src/influxdb/influxDBManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,QAAQ,EAAgD,MAAM,6BAA6B,CAAA;AAQ9G,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAI9C,OAAO,EAAE,sBAAsB,EAAC,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAA2B,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AA0L7E,qBAAa,eAAe;;;IAyFxB,2BAA2B,CAAC,SAAS,EAAE,MAAM;IAa7C,IAAI,cAAc,IAAI,sBAAsB,CAE3C;IAED,IAAI,YAAY,IAAI,oBAAoB,CAEvC;IAED,KAAK,sBAEJ;IAED,SAAS,sBA2BR;IAQD,sBAAsB,aAAc,GAAG,EAAE,SAUxC;IAGD,kBAAkB,CAAC,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU;IAW9E,IAAI,WAAW,IAAI,QAAQ,CAsG1B;IAIK,cAAc,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAe/E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"influxDBManagerAgent.d.ts","sourceRoot":"","sources":["../../src/influxdb/influxDBManagerAgent.ts"],"names":[],"mappings":";AAkGA,OAAO,EAAS,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAC7E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"influxDBManagerAgent.d.ts","sourceRoot":"","sources":["../../src/influxdb/influxDBManagerAgent.ts"],"names":[],"mappings":";AAkGA,OAAO,EAAS,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAC7E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAWpF,qBAAa,oBAAqB,SAAQ,mBAAmB;;gBAE7C,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ;IAIhE,IAAa,SAAS,IAAI,MAAM,CAE/B;IAqEK,2BAA2B,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkB7F,uBAAuB,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkBzF,8BAA8B,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmBhG,6BAA6B,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsB/F,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CA6CnG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"influxDBManagerBase.d.ts","sourceRoot":"","sources":["../../src/influxdb/influxDBManagerBase.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAEhE,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"influxDBManagerBase.d.ts","sourceRoot":"","sources":["../../src/influxdb/influxDBManagerBase.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAEhE,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAM9C,qBAAa,mBAAmB;;gBAMhB,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ;IAKhE,IAAI,OAAO,4BAEV;IACD,IAAI,QAAQ,aAEX;IAED,IAAI,YAAY,IAGM,OAAO,CAD5B;IACD,IAAI,YAAY,CAAC,GAAG,EAAE,OAAO,EAE5B;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAGK,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAuCxE,sBAAsB,aAAc,GAAG,EAAE,SAUxC;IAED,kBAAkB,CAAC,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU;IAaxE,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAGnG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"influxDBManagerService.d.ts","sourceRoot":"","sources":["../../src/influxdb/influxDBManagerService.ts"],"names":[],"mappings":";AA8GA,OAAO,EAAS,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAC7E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"influxDBManagerService.d.ts","sourceRoot":"","sources":["../../src/influxdb/influxDBManagerService.ts"],"names":[],"mappings":";AA8GA,OAAO,EAAS,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAIvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAC7E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAkBpF,qBAAa,sBAAuB,SAAQ,mBAAmB;;gBAE/C,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ;IAIhE,IAAa,SAAS,IAAI,MAAM,CAE/B;IA6FK,6BAA6B,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkB/F,yBAAyB,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmB3F,kCAAkC,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmBpG,iCAAiC,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAqBnG,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CA6DnG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentationsubscriber.d.ts","sourceRoot":"","sources":["../src/instrumentationsubscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAiC,MAAM,6BAA6B,CAAA;AAOnH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"instrumentationsubscriber.d.ts","sourceRoot":"","sources":["../src/instrumentationsubscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAiC,MAAM,6BAA6B,CAAA;AAOnH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAqBnD,MAAM,WAAW,iCAAiC;IAC9C,oBAAoB,EAAE,MAAM,CAAA;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAA;CACvB;AAED,qBAAa,yBAA0B,SAAQ,cAAc;;gBAO7C,OAAO,EAAE,iCAAiC;IAoLtD,SAAS,CAAC,eAAe,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI;IAgCxF,WAAW,CAAC,eAAe,EAAE,gBAAgB;IAwBvC,KAAK;IAIL,IAAI;CAIb"}
|
package/types/processbase.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import chalk from 'chalk';
|
|
2
2
|
import { Gauge, InstrumentBaseTelemetry } from '@nsshunt/stsinstrumentation';
|
|
3
3
|
import { PGAccessLayer } from '@nsshunt/stsdatamanagement';
|
|
4
4
|
import { ProcessOptions } from './processoptions';
|
|
@@ -31,6 +31,6 @@ export declare abstract class ProcessBase extends STSOptionsBase implements IPro
|
|
|
31
31
|
get accessLayer(): PGAccessLayer | null;
|
|
32
32
|
GetNumCPUs: () => Promise<number>;
|
|
33
33
|
LogSystemTelemetry: () => Promise<void>;
|
|
34
|
-
GetSignalColour: (signal: any) =>
|
|
34
|
+
GetSignalColour: (signal: any) => chalk.Chalk;
|
|
35
35
|
}
|
|
36
36
|
//# sourceMappingURL=processbase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processbase.d.ts","sourceRoot":"","sources":["../src/processbase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"processbase.d.ts","sourceRoot":"","sources":["../src/processbase.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAA+E,MAAM,6BAA6B,CAAA;AAEzJ,OAAO,EAAE,aAAa,EAAyC,MAAM,4BAA4B,CAAA;AAKjG,OAAO,EAAE,cAAc,EAAiB,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAA;AAG9D,OAAO,EAAE,6BAA6B,EAAyC,qBAAqB,EAEhB,MAAM,6BAA6B,CAAA;AAQvH,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAe,MAAM,eAAe,CAAA;AAGhF,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAA;AAM5G,8BAAsB,WAAY,SAAQ,cAAe,YAAW,YAAY;;gBAShE,OAAO,EAAE,cAAc;IAUnC,IAAa,OAAO,IAAI,cAAc,CAErC;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IA6FD,oBAAoB;IA2CpB,wBAAwB,IAAI,qBAAqB;IAIjD,0BAA0B,IAAI,IAAI;IAIlC,cAAc,aAuCb;IAED,gBAAgB,mBAAoB,KAAK,aAAa,uBAAuB,UAI5E;IAED,IAAI,oBAAoB,IAAI,6BAA6B,GAAG,IAAI,CAE/D;IAED,KAAK,YAAa,GAAG,UASpB;IAED,gBAAgB,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO;IAQhD,gBAAgB,sBAMf;IAED;;;OAGA;IACA,eAAe,IAAI,GAAG;IAItB,IAAI,oBAAoB,IAAI,qBAAqB,CAAC,8BAA8B,EAAE,8BAA8B,CAAC,GAAG,IAAI,CAGvH;IAED,IAAI,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,CAAC,8BAA8B,EAAE,8BAA8B,CAAC,GAAG,IAAI,EAG3H;IAgBK,iBAAiB;IAOvB,IAAI,WAAW,IAAI,aAAa,GAAG,IAAI,CAyBtC;IAED,UAAU,QAAa,QAAQ,MAAM,CAAC,CAkBrC;IAED,kBAAkB,sBA0BjB;IAED,eAAe,WAAY,GAAG,iBAQ5B;CACL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appmaster.d.ts","sourceRoot":"","sources":["../../src/tcpserver/appmaster.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"appmaster.d.ts","sourceRoot":"","sources":["../../src/tcpserver/appmaster.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAapD,oBAAY,kBAAkB;IAC1B,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,MAAM,WAAW;CACpB;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CAC1B;AAED,qBAAa,SAAU,SAAQ,iBAAiB;;gBA0BhC,aAAa,EAAE,cAAc;IAkczC,aAAa,IAAI,IAAI;CAKxB"}
|