@nsshunt/stsuxvue 1.0.74 → 1.0.75
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/stsuxvue.cjs +165 -349
- package/dist/stsuxvue.cjs.map +1 -1
- package/dist/stsuxvue.mjs +166 -350
- package/dist/stsuxvue.mjs.map +1 -1
- package/package.json +7 -7
- package/types/Views/LandingView.vue.d.ts.map +1 -1
- package/types/components/UXModelNavigator.vue.d.ts.map +1 -1
- package/types/components/socketClientSubscriber.d.ts +20 -0
- package/types/components/socketClientSubscriber.d.ts.map +1 -0
- package/types/plugins/observabilitySubscriberManager.d.ts +1 -17
- package/types/plugins/observabilitySubscriberManager.d.ts.map +1 -1
- package/types/stores/modelStore.d.ts +0 -3
- package/types/stores/modelStore.d.ts.map +1 -1
package/dist/stsuxvue.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineStore } from "pinia";
|
|
2
2
|
import _cloneDeep from "lodash.clonedeep";
|
|
3
3
|
import { defineComponent, defineAsyncComponent, ref, createElementBlock, openBlock, createVNode, unref, reactive, computed, watch, resolveComponent, createBlock, withCtx, createTextVNode, toDisplayString, createElementVNode, createCommentVNode, Fragment, renderList, onMounted, onBeforeUnmount, resolveDynamicComponent, isRef } from "vue";
|
|
4
|
-
import { Gauge,
|
|
4
|
+
import { Gauge, ObservabilitySubscriptionManager, SubscriptionTopic } from "@nsshunt/stsobservability";
|
|
5
5
|
import { defaultLogger } from "@nsshunt/stsutils";
|
|
6
6
|
import { io } from "socket.io-client";
|
|
7
7
|
var _estate = /* @__PURE__ */ ((_estate2) => {
|
|
@@ -18,8 +18,8 @@ const ModelStore = defineStore("__sts__ModelStore", {
|
|
|
18
18
|
state: () => {
|
|
19
19
|
return {
|
|
20
20
|
_models: {},
|
|
21
|
-
_state: {}
|
|
22
|
-
_observabilitySubscriberManager: {}
|
|
21
|
+
_state: {}
|
|
22
|
+
//_observabilitySubscriberManager: { }
|
|
23
23
|
};
|
|
24
24
|
},
|
|
25
25
|
// Getters
|
|
@@ -91,13 +91,15 @@ const ModelStore = defineStore("__sts__ModelStore", {
|
|
|
91
91
|
UpdateSate(modelId, newSate) {
|
|
92
92
|
this._state[modelId] = newSate;
|
|
93
93
|
},
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
94
|
+
/*
|
|
95
|
+
UpdateObservabilitySubscriberManager(modelId: string, observabilitySubscriberManager: ObservabilitySubscriberManager | null): void {
|
|
96
|
+
if (observabilitySubscriberManager === null) {
|
|
97
|
+
delete this._observabilitySubscriberManager[modelId];
|
|
98
|
+
} else {
|
|
99
|
+
this._observabilitySubscriberManager[modelId] = observabilitySubscriberManager;
|
|
100
|
+
}
|
|
100
101
|
},
|
|
102
|
+
*/
|
|
101
103
|
SetupNewModelId(modelId) {
|
|
102
104
|
this._models[modelId] = {
|
|
103
105
|
serviceModel: {},
|
|
@@ -9990,11 +9992,11 @@ function v4(options, buf, offset) {
|
|
|
9990
9992
|
}
|
|
9991
9993
|
return _v4(options);
|
|
9992
9994
|
}
|
|
9993
|
-
var tinyEmitter
|
|
9994
|
-
var hasRequiredTinyEmitter
|
|
9995
|
-
function requireTinyEmitter
|
|
9996
|
-
if (hasRequiredTinyEmitter
|
|
9997
|
-
hasRequiredTinyEmitter
|
|
9995
|
+
var tinyEmitter = { exports: {} };
|
|
9996
|
+
var hasRequiredTinyEmitter;
|
|
9997
|
+
function requireTinyEmitter() {
|
|
9998
|
+
if (hasRequiredTinyEmitter) return tinyEmitter.exports;
|
|
9999
|
+
hasRequiredTinyEmitter = 1;
|
|
9998
10000
|
function E() {
|
|
9999
10001
|
}
|
|
10000
10002
|
E.prototype = {
|
|
@@ -10039,13 +10041,13 @@ function requireTinyEmitter$1() {
|
|
|
10039
10041
|
return this;
|
|
10040
10042
|
}
|
|
10041
10043
|
};
|
|
10042
|
-
tinyEmitter
|
|
10043
|
-
tinyEmitter
|
|
10044
|
-
return tinyEmitter
|
|
10044
|
+
tinyEmitter.exports = E;
|
|
10045
|
+
tinyEmitter.exports.TinyEmitter = E;
|
|
10046
|
+
return tinyEmitter.exports;
|
|
10045
10047
|
}
|
|
10046
|
-
var tinyEmitterExports
|
|
10048
|
+
var tinyEmitterExports = requireTinyEmitter();
|
|
10047
10049
|
const isNode = Object.prototype.toString.call(typeof process !== "undefined" ? process : 0) === "[object process]";
|
|
10048
|
-
class SocketIoClient extends tinyEmitterExports
|
|
10050
|
+
class SocketIoClient extends tinyEmitterExports.TinyEmitter {
|
|
10049
10051
|
#agentManager;
|
|
10050
10052
|
#logger;
|
|
10051
10053
|
#name;
|
|
@@ -10129,14 +10131,18 @@ class SocketIoClient extends tinyEmitterExports$1.TinyEmitter {
|
|
|
10129
10131
|
this.#EstablishSocketConnect();
|
|
10130
10132
|
return this;
|
|
10131
10133
|
}
|
|
10134
|
+
// Engine Errors / Events
|
|
10135
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
10136
|
+
EngineError(error) {
|
|
10137
|
+
}
|
|
10132
10138
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
10133
|
-
|
|
10139
|
+
EngineReconnectError(error) {
|
|
10134
10140
|
}
|
|
10135
10141
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
10136
|
-
|
|
10142
|
+
EngineConnectError(error) {
|
|
10137
10143
|
}
|
|
10138
10144
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
10139
|
-
|
|
10145
|
+
EngineReconnect(attempt) {
|
|
10140
10146
|
}
|
|
10141
10147
|
/*
|
|
10142
10148
|
emit<Ev extends EventNames<ClientToServerEvents>>(ev: Ev, ...args: EventParams<ClientToServerEvents, Ev>): Socket<ServerToClientEvents, ClientToServerEvents> {
|
|
@@ -10189,31 +10195,36 @@ class SocketIoClient extends tinyEmitterExports$1.TinyEmitter {
|
|
|
10189
10195
|
this.#socket = io(this.#address, socketOptions);
|
|
10190
10196
|
this.#socket.io.on("error", (err) => {
|
|
10191
10197
|
this.LogErrorMessage(`socketDetail.socket.io.on('error'): [${err}] Address: [${this.#address}]`);
|
|
10198
|
+
this.EngineError(err);
|
|
10192
10199
|
});
|
|
10193
10200
|
this.#socket.io.on("reconnect_error", (err) => {
|
|
10194
10201
|
this.LogErrorMessage(`socketDetail.socket.io.on('reconnect_error'): [${err}] Address: [${this.#address}]`);
|
|
10202
|
+
this.EngineReconnectError(err);
|
|
10195
10203
|
});
|
|
10196
10204
|
this.#socket.on("connect_error", (err) => {
|
|
10197
10205
|
this.LogErrorMessage(`socketDetail.socket.on('connect_error'): [${err}] Address: [${this.#address}]`);
|
|
10206
|
+
this.EngineConnectError(err);
|
|
10198
10207
|
});
|
|
10199
10208
|
this.#socket.io.on("reconnect", (attempt) => {
|
|
10200
10209
|
this.LogErrorMessage(`socketDetail.socket.io.on('reconnect'): Number: [${attempt}] Address: [${this.#address}]`);
|
|
10210
|
+
this.EngineReconnect(attempt);
|
|
10201
10211
|
});
|
|
10202
10212
|
this.#socket.on("connect", () => {
|
|
10203
10213
|
if (this.#socket) {
|
|
10204
10214
|
this.LogDebugMessage(`Socket: [${this.#socket.id}]: connected, Address: [${this.#address}]`);
|
|
10205
10215
|
setTimeout(() => {
|
|
10206
|
-
this.
|
|
10216
|
+
this.SocketConnect(this.#socket);
|
|
10207
10217
|
}, 0);
|
|
10208
|
-
this.
|
|
10218
|
+
this.SetupSocketEvents(this.#socket);
|
|
10209
10219
|
} else {
|
|
10210
10220
|
const errorMessage = "Could not get socket object from socket.io, Address: [${socketDetail.address}]";
|
|
10211
10221
|
this.LogErrorMessage(errorMessage);
|
|
10212
|
-
this.
|
|
10222
|
+
this.SocketConnectError(new Error(errorMessage));
|
|
10213
10223
|
}
|
|
10214
10224
|
});
|
|
10215
10225
|
this.#socket.on("disconnect", (reason) => {
|
|
10216
10226
|
this.LogDebugMessage("socket disconnect: " + reason);
|
|
10227
|
+
this.SocketDisconnect(reason);
|
|
10217
10228
|
switch (reason) {
|
|
10218
10229
|
case "io server disconnect":
|
|
10219
10230
|
{
|
|
@@ -10258,81 +10269,20 @@ class SocketIoClient extends tinyEmitterExports$1.TinyEmitter {
|
|
|
10258
10269
|
});
|
|
10259
10270
|
}
|
|
10260
10271
|
}
|
|
10261
|
-
var tinyEmitter = { exports: {} };
|
|
10262
|
-
var hasRequiredTinyEmitter;
|
|
10263
|
-
function requireTinyEmitter() {
|
|
10264
|
-
if (hasRequiredTinyEmitter) return tinyEmitter.exports;
|
|
10265
|
-
hasRequiredTinyEmitter = 1;
|
|
10266
|
-
function E() {
|
|
10267
|
-
}
|
|
10268
|
-
E.prototype = {
|
|
10269
|
-
on: function(name, callback, ctx) {
|
|
10270
|
-
var e = this.e || (this.e = {});
|
|
10271
|
-
(e[name] || (e[name] = [])).push({
|
|
10272
|
-
fn: callback,
|
|
10273
|
-
ctx
|
|
10274
|
-
});
|
|
10275
|
-
return this;
|
|
10276
|
-
},
|
|
10277
|
-
once: function(name, callback, ctx) {
|
|
10278
|
-
var self = this;
|
|
10279
|
-
function listener() {
|
|
10280
|
-
self.off(name, listener);
|
|
10281
|
-
callback.apply(ctx, arguments);
|
|
10282
|
-
}
|
|
10283
|
-
listener._ = callback;
|
|
10284
|
-
return this.on(name, listener, ctx);
|
|
10285
|
-
},
|
|
10286
|
-
emit: function(name) {
|
|
10287
|
-
var data = [].slice.call(arguments, 1);
|
|
10288
|
-
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
|
|
10289
|
-
var i = 0;
|
|
10290
|
-
var len = evtArr.length;
|
|
10291
|
-
for (i; i < len; i++) {
|
|
10292
|
-
evtArr[i].fn.apply(evtArr[i].ctx, data);
|
|
10293
|
-
}
|
|
10294
|
-
return this;
|
|
10295
|
-
},
|
|
10296
|
-
off: function(name, callback) {
|
|
10297
|
-
var e = this.e || (this.e = {});
|
|
10298
|
-
var evts = e[name];
|
|
10299
|
-
var liveEvents = [];
|
|
10300
|
-
if (evts && callback) {
|
|
10301
|
-
for (var i = 0, len = evts.length; i < len; i++) {
|
|
10302
|
-
if (evts[i].fn !== callback && evts[i].fn._ !== callback)
|
|
10303
|
-
liveEvents.push(evts[i]);
|
|
10304
|
-
}
|
|
10305
|
-
}
|
|
10306
|
-
liveEvents.length ? e[name] = liveEvents : delete e[name];
|
|
10307
|
-
return this;
|
|
10308
|
-
}
|
|
10309
|
-
};
|
|
10310
|
-
tinyEmitter.exports = E;
|
|
10311
|
-
tinyEmitter.exports.TinyEmitter = E;
|
|
10312
|
-
return tinyEmitter.exports;
|
|
10313
|
-
}
|
|
10314
|
-
var tinyEmitterExports = requireTinyEmitter();
|
|
10315
10272
|
const SOCKET_NAMESPACE = "stsinstrumentmanager/stsmonitor";
|
|
10316
|
-
class
|
|
10317
|
-
#socket = null;
|
|
10318
|
-
#observabilitySocketIOSubscriber = null;
|
|
10319
|
-
#observabilitySubscriptionManager = null;
|
|
10320
|
-
#store;
|
|
10321
|
-
#state = "init";
|
|
10322
|
-
#modelId;
|
|
10273
|
+
class SocketClientSubscriber extends SocketIoClient {
|
|
10323
10274
|
#options;
|
|
10324
|
-
#tinyEmitter;
|
|
10325
10275
|
#id;
|
|
10276
|
+
#currentSubscriptions = [];
|
|
10277
|
+
subscriptions = {};
|
|
10326
10278
|
constructor(options) {
|
|
10327
10279
|
super("STSVueTilsTester");
|
|
10328
10280
|
this.#id = v4();
|
|
10329
10281
|
this.#options = options;
|
|
10330
|
-
this
|
|
10331
|
-
|
|
10332
|
-
this
|
|
10333
|
-
|
|
10334
|
-
this.#options.consumeInstrumentationMode = "PROXY";
|
|
10335
|
-
}
|
|
10282
|
+
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}Start()`));
|
|
10283
|
+
const url = `${this.#options.instrumentManagerEndpoint}:${this.#options.instrumentManagerPort}/${SOCKET_NAMESPACE}/`;
|
|
10284
|
+
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SetupSocket() url: [${url}]`));
|
|
10285
|
+
this.WithAddress(url).WithLogger(this.logger ?? defaultLogger).SetupSocket();
|
|
10336
10286
|
}
|
|
10337
10287
|
get id() {
|
|
10338
10288
|
return this.#id;
|
|
@@ -10344,242 +10294,75 @@ class ObservabilitySubscriberManager extends SocketIoClient {
|
|
|
10344
10294
|
return `stsuxvue:ObservabilitySubscriberManager:`;
|
|
10345
10295
|
}
|
|
10346
10296
|
}
|
|
10347
|
-
|
|
10348
|
-
|
|
10349
|
-
|
|
10350
|
-
|
|
10351
|
-
|
|
10352
|
-
|
|
10353
|
-
|
|
10354
|
-
|
|
10355
|
-
|
|
10356
|
-
|
|
10357
|
-
|
|
10358
|
-
|
|
10359
|
-
|
|
10360
|
-
}
|
|
10361
|
-
}
|
|
10362
|
-
} else {
|
|
10363
|
-
(this.logger ?? defaultLogger).warn(chalk.rgb(255, 165, 0)(`${this.logPrefix}SocketIOConnect(): observabilitySocketIOSubscriber.socket does not exist`));
|
|
10364
|
-
(this.logger ?? defaultLogger).warn(chalk.rgb(255, 165, 0)(`${this.logPrefix}SocketIOConnect(): this should have been set when the initial subscription manager was created`));
|
|
10365
|
-
}
|
|
10366
|
-
}
|
|
10367
|
-
if (this.#state.localeCompare("init") === 0) {
|
|
10368
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): state = init`));
|
|
10369
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): state = started`));
|
|
10370
|
-
this.#state = "started";
|
|
10371
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): tinyEmitter.emit('connected')`));
|
|
10372
|
-
this.#tinyEmitter.emit("connected");
|
|
10373
|
-
} else {
|
|
10374
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): Socket ids are different - update with new socket`));
|
|
10375
|
-
if (observabilitySocketIOSubscriber.socket) {
|
|
10376
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): -> Current Socket ID: [${observabilitySocketIOSubscriber.socket.id}]`));
|
|
10377
|
-
} else {
|
|
10378
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): -> Current Socket ID: [NONE - No current socket exists]`));
|
|
10379
|
-
}
|
|
10380
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): -> New (updated) Socket ID: [${socket.id}]`));
|
|
10381
|
-
if (this.#observabilitySubscriptionManager) {
|
|
10382
|
-
if (this.#observabilitySubscriptionManager.runState !== runStates.stopped) {
|
|
10383
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): observabilitySubscriptionManager.Stop()`));
|
|
10384
|
-
this.#observabilitySubscriptionManager?.Stop();
|
|
10297
|
+
UpdateModelCursor = (subscriptions) => {
|
|
10298
|
+
this.UnSubscribe(this.#currentSubscriptions);
|
|
10299
|
+
this.#currentSubscriptions = subscriptions;
|
|
10300
|
+
this.Subscribe(this.#currentSubscriptions);
|
|
10301
|
+
};
|
|
10302
|
+
Subscribe(subscriptions) {
|
|
10303
|
+
subscriptions.map(async (subId) => {
|
|
10304
|
+
try {
|
|
10305
|
+
if (this.socket) {
|
|
10306
|
+
this.LogDebugMessage(chalk.yellow(`ObservabilitySocketIOSubscriber:Subscribe(): Sending subscribe: subscriptionKey: [${subId.subscriptionKey.id}]`));
|
|
10307
|
+
this.socket.timeout(1e3).emit("subscribe", subId.subscriptionKey, (error, data) => {
|
|
10308
|
+
if (error) {
|
|
10309
|
+
this.LogErrorMessage(chalk.red(`ObservabilitySocketIOSubscriber:Subscribe(): Error: [${error}], data: [${data}]`));
|
|
10385
10310
|
} else {
|
|
10386
|
-
this.LogDebugMessage(chalk.
|
|
10311
|
+
this.LogDebugMessage(chalk.green(`ObservabilitySocketIOSubscriber:Subscribe(): Response: [${JSON.stringify(data)}]`));
|
|
10312
|
+
this.subscriptions[subId.subscriptionKey.id] = subId;
|
|
10387
10313
|
}
|
|
10388
|
-
} else {
|
|
10389
|
-
this.LogErrorMessage(chalk.red(`${this.logPrefix}SocketIOConnect(): observabilitySubscriptionManager does not exist`));
|
|
10390
|
-
}
|
|
10391
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): Setting new socket into observabilitySocketIOSubscriber, Socket ID: [${socket.id}]`));
|
|
10392
|
-
observabilitySocketIOSubscriber.socket = socket;
|
|
10393
|
-
if (this.#state.localeCompare("started") === 0) {
|
|
10394
|
-
setTimeout(() => {
|
|
10395
|
-
if (this.#observabilitySubscriptionManager?.runState !== runStates.started) {
|
|
10396
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): observabilitySubscriptionManager Start`));
|
|
10397
|
-
this.#observabilitySubscriptionManager?.Start();
|
|
10398
|
-
} else {
|
|
10399
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): observabilitySubscriptionManager runState: [${this.#observabilitySubscriptionManager?.runState}] already started.`));
|
|
10400
|
-
}
|
|
10401
|
-
this.#tinyEmitter.emit("connected");
|
|
10402
|
-
}, 2500);
|
|
10403
|
-
} else {
|
|
10404
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): state not in the started state, current state: [${this.#state}]`));
|
|
10405
|
-
this.#tinyEmitter.emit("connected");
|
|
10406
|
-
}
|
|
10407
|
-
}
|
|
10408
|
-
} else {
|
|
10409
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): this.#observabilitySocketIOSubscriber not instance of ObservabilitySocketIOSubscriber`));
|
|
10410
|
-
this.LogDebugMessage(chalk.cyan(this.#observabilitySocketIOSubscriber));
|
|
10411
|
-
this.#tinyEmitter.emit("connected");
|
|
10412
|
-
}
|
|
10413
|
-
} catch (error) {
|
|
10414
|
-
this.LogErrorMessage(chalk.red(`${this.logPrefix}SocketIOConnect(): Error: [${error}]`));
|
|
10415
|
-
this.#tinyEmitter.emit("connected");
|
|
10416
|
-
} finally {
|
|
10417
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SocketIOConnect(): Ended`));
|
|
10418
|
-
}
|
|
10419
|
-
};
|
|
10420
|
-
#SetupObservabilitySubscriber = (socket) => {
|
|
10421
|
-
this.LogDebugMessage(`${this.logPrefix}SetupObservabilitySubscriber(): consumeInstrumentationMode: [${this.#options.consumeInstrumentationMode}]`);
|
|
10422
|
-
switch (this.#options.consumeInstrumentationMode) {
|
|
10423
|
-
case "PROXY":
|
|
10424
|
-
{
|
|
10425
|
-
if (socket) {
|
|
10426
|
-
const keepAlive = 2500;
|
|
10427
|
-
this.LogDebugMessage(`${this.logPrefix}SetupObservabilitySubscriber(): Creating ObservabilitySocketIOSubscriber(): Socket ID: [${socket.id}], keepAlive: [${keepAlive}]`);
|
|
10428
|
-
this.#observabilitySocketIOSubscriber = new ObservabilitySocketIOSubscriber({
|
|
10429
|
-
socket,
|
|
10430
|
-
keepAlive,
|
|
10431
|
-
logger: this.logger ?? defaultLogger
|
|
10432
|
-
});
|
|
10433
|
-
} else {
|
|
10434
|
-
this.LogErrorMessage(chalk.red(`${this.logPrefix}SetupObservabilitySubscriber(): Socket not defined. Cannot create ObservabilitySocketIOSubscriber() without socket defined.`));
|
|
10435
|
-
}
|
|
10436
|
-
}
|
|
10437
|
-
break;
|
|
10438
|
-
case "REST":
|
|
10439
|
-
{
|
|
10440
|
-
const urlBase = `${this.#options.instrumentManagerEndpoint}:${this.#options.instrumentManagerPort}${this.#options.instrumentManagerAPIRoot}`;
|
|
10441
|
-
const keepAlive = 1e3;
|
|
10442
|
-
this.LogDebugMessage(`${this.logPrefix}SetupObservabilitySubscriber(): Creating ObservabilityRESTAPISubscriber(): Url Base: [${urlBase}], keepAlive: [${keepAlive}]`);
|
|
10443
|
-
this.#observabilitySocketIOSubscriber = new ObservabilityRESTAPISubscriber({
|
|
10444
|
-
keepAlive,
|
|
10445
|
-
urlBase,
|
|
10446
|
-
logger: this.logger ?? defaultLogger
|
|
10447
10314
|
});
|
|
10448
10315
|
}
|
|
10449
|
-
|
|
10450
|
-
|
|
10451
|
-
this.LogErrorMessage(chalk.red(`${this.logPrefix}SetupObservabilitySubscriber(): Unsupported consumeInstrumentationMode mode: [${this.#options.consumeInstrumentationMode}]`));
|
|
10452
|
-
return;
|
|
10453
|
-
}
|
|
10454
|
-
this.#observabilitySubscriptionManager = new ObservabilitySubscriptionManager({
|
|
10455
|
-
logger: this.logger ?? defaultLogger,
|
|
10456
|
-
maxLogLength: 100
|
|
10457
|
-
});
|
|
10458
|
-
this.#observabilitySubscriptionManager.observabilitySocketIOSubscriber = this.#observabilitySocketIOSubscriber;
|
|
10459
|
-
};
|
|
10460
|
-
UpdateModelCursor(subscriptions) {
|
|
10461
|
-
if (this.#observabilitySubscriptionManager?.runState !== runStates.stopped) {
|
|
10462
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}UpdateModelCursor(): observabilitySubscriptionManager.Stop()`));
|
|
10463
|
-
this.#observabilitySubscriptionManager?.Stop();
|
|
10464
|
-
} else {
|
|
10465
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}UpdateModelCursor(): observabilitySubscriptionManager runState: [${this.#observabilitySubscriptionManager?.runState}] already stopped.`));
|
|
10466
|
-
}
|
|
10467
|
-
this.#state = "stopped";
|
|
10468
|
-
setTimeout(() => {
|
|
10469
|
-
if (this.#observabilitySubscriptionManager) {
|
|
10470
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}UpdateModelCursor(): observabilitySubscriptionManager.subscriptions: [${JSON.stringify(subscriptions)}]`));
|
|
10471
|
-
this.#observabilitySubscriptionManager.subscriptions = subscriptions;
|
|
10472
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}UpdateModelCursor(): observabilitySubscriptionManager.Start()`));
|
|
10473
|
-
this.#observabilitySubscriptionManager.Start();
|
|
10474
|
-
} else {
|
|
10475
|
-
this.LogDebugMessage(chalk.yellow(`${this.logPrefix}UpdateModelCursor(): Could not update subscriptions, this.#observabilitySubscriptionManager not set`));
|
|
10316
|
+
} catch (error) {
|
|
10317
|
+
this.LogErrorMessage(chalk.red(`ObservabilitySocketIOSubscriber:Subscribe(): Error: response: [${JSON.stringify(error)}]`));
|
|
10476
10318
|
}
|
|
10477
|
-
|
|
10478
|
-
}, 0);
|
|
10319
|
+
});
|
|
10479
10320
|
}
|
|
10480
|
-
|
|
10481
|
-
|
|
10482
|
-
|
|
10483
|
-
this
|
|
10484
|
-
|
|
10485
|
-
|
|
10486
|
-
|
|
10487
|
-
|
|
10488
|
-
|
|
10489
|
-
|
|
10490
|
-
|
|
10491
|
-
|
|
10492
|
-
|
|
10493
|
-
const serviceModel = this.#observabilitySubscriptionManager.serviceModel;
|
|
10494
|
-
this.#store.UpdateServiceModel(this.#modelId, serviceModel, subscriptionPayload.subscriptionKey);
|
|
10495
|
-
}
|
|
10496
|
-
if (subscriptionPayload.subscriptionKey.topic.localeCompare(SubscriptionTopic.ServiceInstances) === 0) {
|
|
10497
|
-
const serviceModel = this.#observabilitySubscriptionManager.serviceModel;
|
|
10498
|
-
this.#store.UpdateServiceModel(this.#modelId, serviceModel, subscriptionPayload.subscriptionKey);
|
|
10499
|
-
}
|
|
10500
|
-
if (subscriptionPayload.subscriptionKey.topic.localeCompare(SubscriptionTopic.ServiceInstance) === 0) {
|
|
10501
|
-
const serviceModel = this.#observabilitySubscriptionManager.serviceModel;
|
|
10502
|
-
this.#store.UpdateServiceModel(this.#modelId, serviceModel, subscriptionPayload.subscriptionKey);
|
|
10321
|
+
UnSubscribe(subscriptions) {
|
|
10322
|
+
subscriptions.map(async (subId) => {
|
|
10323
|
+
try {
|
|
10324
|
+
if (this.socket) {
|
|
10325
|
+
this.LogDebugMessage(chalk.yellow(`ObservabilitySocketIOSubscriber:UnSubscribe(): Sending unsubscribe: subscriptionKey: [${subId.subscriptionKey.id}]`));
|
|
10326
|
+
this.socket.timeout(1e3).emit("unsubscribe", subId.subscriptionKey, (error, data) => {
|
|
10327
|
+
if (error) {
|
|
10328
|
+
this.LogErrorMessage(chalk.red(`ObservabilitySocketIOSubscriber:UnSubscribe(): Error: [${error}], data: [${data}]`));
|
|
10329
|
+
} else {
|
|
10330
|
+
this.LogDebugMessage(chalk.green(`ObservabilitySocketIOSubscriber:UnSubscribe(): Response: [${JSON.stringify(data)}]`));
|
|
10331
|
+
delete this.subscriptions[subId.subscriptionKey.id];
|
|
10332
|
+
}
|
|
10333
|
+
});
|
|
10503
10334
|
}
|
|
10504
|
-
}
|
|
10505
|
-
this.LogErrorMessage(
|
|
10335
|
+
} catch (error) {
|
|
10336
|
+
this.LogErrorMessage(chalk.red(`ObservabilitySocketIOSubscriber:UnSubscribe(): Error response: [${JSON.stringify(error)}]`));
|
|
10506
10337
|
}
|
|
10507
|
-
}
|
|
10508
|
-
this.LogErrorMessage(`${this.logPrefix}TransformSubscriptionPayloadCallback(): #modelId: [${this.#modelId}], Error: [${error}]`);
|
|
10509
|
-
}
|
|
10338
|
+
});
|
|
10510
10339
|
}
|
|
10511
|
-
|
|
10512
|
-
this
|
|
10513
|
-
this.
|
|
10514
|
-
this.#observabilitySubscriptionManager?.Stop();
|
|
10515
|
-
if (this.#options.consumeInstrumentationMode.localeCompare("PROXY") === 0) {
|
|
10516
|
-
setTimeout(() => {
|
|
10517
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}Unsubscribe() socket.disconnect`));
|
|
10518
|
-
this.#socket?.disconnect();
|
|
10519
|
-
this.#socket = null;
|
|
10520
|
-
}, 1e3);
|
|
10521
|
-
}
|
|
10340
|
+
SocketConnect(socket) {
|
|
10341
|
+
this.LogDebugMessage(chalk.magenta(`${this.logPrefix}SocketConnect(): Socket ID: [${socket.id}]`));
|
|
10342
|
+
this.UpdateModelCursor(this.#currentSubscriptions);
|
|
10522
10343
|
}
|
|
10523
|
-
|
|
10524
|
-
this.
|
|
10525
|
-
|
|
10526
|
-
|
|
10527
|
-
|
|
10528
|
-
|
|
10529
|
-
|
|
10530
|
-
|
|
10531
|
-
|
|
10532
|
-
this
|
|
10533
|
-
|
|
10534
|
-
this.LogDebugMessage(chalk.cyan(`${this.logPrefix}SetupSocket() url: [${url}]`));
|
|
10535
|
-
this.WithAddress(url).WithLogger(this.logger ?? defaultLogger).SetupSocket();
|
|
10344
|
+
SocketError(error) {
|
|
10345
|
+
this.LogErrorMessage(chalk.red(`${this.logPrefix}SocketError(): Error: [${error}]`));
|
|
10346
|
+
}
|
|
10347
|
+
SetupSocketEvents(socket) {
|
|
10348
|
+
this.LogDebugMessage(chalk.magenta(`${this.logPrefix}SetupSocketEvents(): Socket ID: [${socket.id}]`));
|
|
10349
|
+
this.socket?.on("subscriptionData", (data, cb) => {
|
|
10350
|
+
this.LogDebugMessage(chalk.magenta(`${this.logPrefix}SetupSocketEvents(): on subscriptionData(): Socket ID: [${socket.id}]`));
|
|
10351
|
+
const subId = data.subscriptionKey.id;
|
|
10352
|
+
if (this.subscriptions[subId]) {
|
|
10353
|
+
this.subscriptions[subId].cb(data);
|
|
10354
|
+
cb(`subscriptionData Response: [${data}]`);
|
|
10536
10355
|
} else {
|
|
10537
|
-
|
|
10538
|
-
resolve(true);
|
|
10356
|
+
cb(`subscriptionData Response: Not subscription found in subscriptions: [${data}]`);
|
|
10539
10357
|
}
|
|
10540
10358
|
});
|
|
10541
|
-
};
|
|
10542
|
-
ConnectCallBack(socket) {
|
|
10543
|
-
this.LogDebugMessage(chalk.magenta(`${this.logPrefix}ConnectCallBack(): Socket ID: [${socket.id}]`));
|
|
10544
|
-
if (this.#observabilitySubscriptionManager === null) {
|
|
10545
|
-
this.#SetupObservabilitySubscriber(socket);
|
|
10546
|
-
}
|
|
10547
|
-
this.#SocketIOConnect(socket);
|
|
10548
10359
|
}
|
|
10549
|
-
|
|
10550
|
-
this.LogErrorMessage(chalk.red(`${this.logPrefix}
|
|
10360
|
+
SocketConnectError(error) {
|
|
10361
|
+
this.LogErrorMessage(chalk.red(`${this.logPrefix}SocketConnectError(): Error: [${error}]`));
|
|
10551
10362
|
}
|
|
10552
|
-
|
|
10363
|
+
SocketDisconnect(reason) {
|
|
10364
|
+
this.LogErrorMessage(chalk.red(`${this.logPrefix}SocketDisconnect(): reason: [${reason}]`));
|
|
10553
10365
|
}
|
|
10554
|
-
/*
|
|
10555
|
-
#SetupSocketIO = () => {
|
|
10556
|
-
const socketUtils = new SocketIoClientHelper({});
|
|
10557
|
-
|
|
10558
|
-
this.#socket = socketUtils.SetupClientSideSocket('STSVueTilsTester',
|
|
10559
|
-
`${this.#options.instrumentManagerEndpoint}:${this.#options.instrumentManagerPort}/${SOCKET_NAMESPACE}/`,
|
|
10560
|
-
'', // use default /socket.io/ path
|
|
10561
|
-
this.#SocketConnect as any, // Connected call back
|
|
10562
|
-
this.#ProcessSocketEvents as any, // Custom Events
|
|
10563
|
-
this.#ProcessSocketError // Handle socket errors
|
|
10564
|
-
) as any;
|
|
10565
|
-
}
|
|
10566
|
-
|
|
10567
|
-
#SocketConnect = (socket: Socket) => {
|
|
10568
|
-
defaultLogger.debug(chalk.magenta(`SocketIOConnect(): Socket ID: [${socket.id}]`));
|
|
10569
|
-
if (this.#observabilitySubscriptionManager === null) {
|
|
10570
|
-
this.#SetupObservabilitySubscriber();
|
|
10571
|
-
}
|
|
10572
|
-
this.#SocketIOConnect(socket);
|
|
10573
|
-
}
|
|
10574
|
-
|
|
10575
|
-
#ProcessSocketError = (error: any) => {
|
|
10576
|
-
defaultLogger.error(chalk.red(`SetupClientSideSocket error callback: [${error}]`))
|
|
10577
|
-
}
|
|
10578
|
-
|
|
10579
|
-
#ProcessSocketEvents = (socket: Socket) => {
|
|
10580
|
-
|
|
10581
|
-
}
|
|
10582
|
-
*/
|
|
10583
10366
|
}
|
|
10584
10367
|
const _hoisted_1$1 = { class: "d-flex flex-wrap justify-space-between" };
|
|
10585
10368
|
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
@@ -10591,16 +10374,47 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
10591
10374
|
chalk.level = 3;
|
|
10592
10375
|
const props = __props;
|
|
10593
10376
|
const store = ModelStore();
|
|
10594
|
-
let
|
|
10377
|
+
let observabilitySubscriptionManager = new ObservabilitySubscriptionManager({
|
|
10378
|
+
logger: defaultLogger,
|
|
10379
|
+
maxLogLength: 200
|
|
10380
|
+
});
|
|
10381
|
+
let socketClientSubscriber;
|
|
10595
10382
|
const baseColour = chalk.hex("#57A1A8");
|
|
10596
10383
|
const LogDebug = (message) => {
|
|
10597
10384
|
defaultLogger.debug(baseColour(`stsuxvue:UXModelNavigator:${message}`));
|
|
10598
10385
|
};
|
|
10386
|
+
const LogError = (message) => {
|
|
10387
|
+
defaultLogger.error(baseColour(`stsuxvue:UXModelNavigator:${message}`));
|
|
10388
|
+
};
|
|
10599
10389
|
const LogWarning = (message) => {
|
|
10600
10390
|
defaultLogger.warn(baseColour(`stsuxvue:UXModelNavigator:${message}`));
|
|
10601
10391
|
};
|
|
10602
10392
|
const TransformSubscriptionPayloadCallback = (subscriptionPayload) => {
|
|
10603
|
-
|
|
10393
|
+
try {
|
|
10394
|
+
observabilitySubscriptionManager.TransformSubscriptionPayloadCallback(subscriptionPayload);
|
|
10395
|
+
if (subscriptionPayload.subscriptionKey.topic.localeCompare(SubscriptionTopic.AllAgentsCombined) === 0) {
|
|
10396
|
+
const agentModel = observabilitySubscriptionManager.agentModel;
|
|
10397
|
+
store.UpdateAgentModel(props.modelId, agentModel, subscriptionPayload.subscriptionKey);
|
|
10398
|
+
}
|
|
10399
|
+
if (subscriptionPayload.subscriptionKey.topic.localeCompare(SubscriptionTopic.AllServicesCombined) === 0) {
|
|
10400
|
+
const serviceModel = observabilitySubscriptionManager.serviceModel;
|
|
10401
|
+
store.UpdateServiceModel(props.modelId, serviceModel, subscriptionPayload.subscriptionKey);
|
|
10402
|
+
}
|
|
10403
|
+
if (subscriptionPayload.subscriptionKey.topic.localeCompare(SubscriptionTopic.Services) === 0) {
|
|
10404
|
+
const serviceModel = observabilitySubscriptionManager.serviceModel;
|
|
10405
|
+
store.UpdateServiceModel(props.modelId, serviceModel, subscriptionPayload.subscriptionKey);
|
|
10406
|
+
}
|
|
10407
|
+
if (subscriptionPayload.subscriptionKey.topic.localeCompare(SubscriptionTopic.ServiceInstances) === 0) {
|
|
10408
|
+
const serviceModel = observabilitySubscriptionManager.serviceModel;
|
|
10409
|
+
store.UpdateServiceModel(props.modelId, serviceModel, subscriptionPayload.subscriptionKey);
|
|
10410
|
+
}
|
|
10411
|
+
if (subscriptionPayload.subscriptionKey.topic.localeCompare(SubscriptionTopic.ServiceInstance) === 0) {
|
|
10412
|
+
const serviceModel = observabilitySubscriptionManager.serviceModel;
|
|
10413
|
+
store.UpdateServiceModel(props.modelId, serviceModel, subscriptionPayload.subscriptionKey);
|
|
10414
|
+
}
|
|
10415
|
+
} catch (error) {
|
|
10416
|
+
LogError(`TransformSubscriptionPayloadCallback(): #modelId: [${props.modelId}], Error: [${error}]`);
|
|
10417
|
+
}
|
|
10604
10418
|
};
|
|
10605
10419
|
const GetRootLevelSubscriptions = () => [{
|
|
10606
10420
|
subscriptionKey: {
|
|
@@ -10644,10 +10458,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
10644
10458
|
}];
|
|
10645
10459
|
};
|
|
10646
10460
|
let navigationSubscriptions = {
|
|
10647
|
-
|
|
10461
|
+
subscriptionHistoryStack: [],
|
|
10648
10462
|
currentSubscriptions: null
|
|
10649
10463
|
};
|
|
10650
|
-
let
|
|
10464
|
+
let reactiveNavigationSubscriptions = reactive(navigationSubscriptions);
|
|
10651
10465
|
const getPathString = (sub2) => {
|
|
10652
10466
|
if (sub2.subscriptionKey.key && sub2.subscriptionKey.subkey) {
|
|
10653
10467
|
return `${sub2.subscriptionKey.topic}[${sub2.subscriptionKey.key}/${sub2.subscriptionKey.subkey}]`;
|
|
@@ -10660,17 +10474,17 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
10660
10474
|
const navigationPath = computed(() => {
|
|
10661
10475
|
let pathString = "";
|
|
10662
10476
|
let sep = "";
|
|
10663
|
-
|
|
10477
|
+
reactiveNavigationSubscriptions.subscriptionHistoryStack.forEach((s) => {
|
|
10664
10478
|
pathString += sep + getPathString(s[0]);
|
|
10665
10479
|
sep = "/";
|
|
10666
10480
|
});
|
|
10667
|
-
if (
|
|
10668
|
-
return pathString + sep + getPathString(
|
|
10481
|
+
if (reactiveNavigationSubscriptions.currentSubscriptions) {
|
|
10482
|
+
return pathString + sep + getPathString(reactiveNavigationSubscriptions.currentSubscriptions[0]);
|
|
10669
10483
|
}
|
|
10670
10484
|
return pathString;
|
|
10671
10485
|
});
|
|
10672
10486
|
const BackDisabled = computed(() => {
|
|
10673
|
-
return
|
|
10487
|
+
return reactiveNavigationSubscriptions.subscriptionHistoryStack.length < 1;
|
|
10674
10488
|
});
|
|
10675
10489
|
const modelNode = reactive({
|
|
10676
10490
|
node: {}
|
|
@@ -10698,23 +10512,29 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
10698
10512
|
}
|
|
10699
10513
|
}
|
|
10700
10514
|
};
|
|
10701
|
-
const
|
|
10702
|
-
|
|
10703
|
-
|
|
10515
|
+
const UpdateModelCursor = () => {
|
|
10516
|
+
const subscriptions2 = reactiveNavigationSubscriptions.currentSubscriptions;
|
|
10517
|
+
if (subscriptions2) {
|
|
10518
|
+
socketClientSubscriber.UpdateModelCursor(subscriptions2);
|
|
10519
|
+
}
|
|
10520
|
+
};
|
|
10521
|
+
const navigate = function(subscriptions2) {
|
|
10522
|
+
if (reactiveNavigationSubscriptions.currentSubscriptions) {
|
|
10523
|
+
reactiveNavigationSubscriptions.subscriptionHistoryStack.push(reactiveNavigationSubscriptions.currentSubscriptions);
|
|
10704
10524
|
} else {
|
|
10705
10525
|
LogWarning(`navigate: obj.currentSubscriptions not defined`);
|
|
10706
10526
|
}
|
|
10707
|
-
|
|
10708
|
-
LogDebug(`navigate: observabilitySubscriberManager().UpdateModelCursor(${JSON.stringify(
|
|
10709
|
-
|
|
10527
|
+
reactiveNavigationSubscriptions.currentSubscriptions = subscriptions2;
|
|
10528
|
+
LogDebug(`navigate: observabilitySubscriberManager().UpdateModelCursor(${JSON.stringify(subscriptions2)})`);
|
|
10529
|
+
UpdateModelCursor();
|
|
10710
10530
|
};
|
|
10711
10531
|
const GoBack = function() {
|
|
10712
|
-
if (
|
|
10713
|
-
let key =
|
|
10532
|
+
if (reactiveNavigationSubscriptions.subscriptionHistoryStack.length > 0) {
|
|
10533
|
+
let key = reactiveNavigationSubscriptions.subscriptionHistoryStack.pop();
|
|
10714
10534
|
if (key) {
|
|
10715
|
-
|
|
10716
|
-
LogDebug(`GoBack: observabilitySubscriberManager().UpdateModelCursor(${JSON.stringify(
|
|
10717
|
-
|
|
10535
|
+
reactiveNavigationSubscriptions.currentSubscriptions = key;
|
|
10536
|
+
LogDebug(`GoBack: observabilitySubscriberManager().UpdateModelCursor(${JSON.stringify(reactiveNavigationSubscriptions.currentSubscriptions)})`);
|
|
10537
|
+
UpdateModelCursor();
|
|
10718
10538
|
} else {
|
|
10719
10539
|
LogDebug(`GoBack: subscriptions key not defined`);
|
|
10720
10540
|
}
|
|
@@ -10723,10 +10543,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
10723
10543
|
}
|
|
10724
10544
|
};
|
|
10725
10545
|
const TopLevel = function() {
|
|
10726
|
-
|
|
10727
|
-
|
|
10728
|
-
LogDebug(`TopLevel: observabilitySubscriberManager().UpdateModelCursor(${JSON.stringify(
|
|
10729
|
-
|
|
10546
|
+
reactiveNavigationSubscriptions.subscriptionHistoryStack = [];
|
|
10547
|
+
reactiveNavigationSubscriptions.currentSubscriptions = GetRootLevelSubscriptions();
|
|
10548
|
+
LogDebug(`TopLevel: observabilitySubscriberManager().UpdateModelCursor(${JSON.stringify(reactiveNavigationSubscriptions.currentSubscriptions)})`);
|
|
10549
|
+
UpdateModelCursor();
|
|
10730
10550
|
};
|
|
10731
10551
|
onMounted(() => {
|
|
10732
10552
|
LogDebug(`onMounted()`);
|
|
@@ -10739,25 +10559,21 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
10739
10559
|
const Stop = () => {
|
|
10740
10560
|
LogDebug(`Stop()`);
|
|
10741
10561
|
store.UpdateSate(props.modelId, _estate.STOPPING);
|
|
10742
|
-
if (observabilitySubscriberManager) {
|
|
10743
|
-
LogDebug(`Stop(): Unsubscribe()`);
|
|
10744
|
-
observabilitySubscriberManager.Unsubscribe();
|
|
10745
|
-
store.UpdateObservabilitySubscriberManager(observabilitySubscriberManager.id, null);
|
|
10746
|
-
}
|
|
10747
|
-
observabilitySubscriberManager = null;
|
|
10748
10562
|
store.UpdateSate(props.modelId, _estate.IDLE);
|
|
10749
10563
|
};
|
|
10750
10564
|
const Start = async (options) => {
|
|
10751
10565
|
LogDebug(`Start()`);
|
|
10752
10566
|
store.UpdateSate(props.modelId, _estate.STARTING);
|
|
10753
|
-
|
|
10754
|
-
|
|
10755
|
-
|
|
10756
|
-
|
|
10757
|
-
|
|
10758
|
-
|
|
10759
|
-
|
|
10760
|
-
|
|
10567
|
+
socketClientSubscriber = new SocketClientSubscriber({
|
|
10568
|
+
instrumentManagerEndpoint: options.instrumentManagerEndpoint,
|
|
10569
|
+
instrumentManagerPort: options.instrumentManagerPort,
|
|
10570
|
+
consumeInstrumentationMode: options.consumeInstrumentationMode,
|
|
10571
|
+
instrumentManagerAPIRoot: options.instrumentManagerAPIRoot,
|
|
10572
|
+
modelId: options.modelId
|
|
10573
|
+
});
|
|
10574
|
+
reactiveNavigationSubscriptions.currentSubscriptions = GetRootLevelSubscriptions();
|
|
10575
|
+
LogDebug(`Start(): observabilitySubscriberManager().UpdateModelCursor(): Mode: [${options.consumeInstrumentationMode}] rootLevelSubscriptions: [(${JSON.stringify(reactiveNavigationSubscriptions.currentSubscriptions)}]`);
|
|
10576
|
+
UpdateModelCursor();
|
|
10761
10577
|
store.UpdateSate(props.modelId, _estate.STARTED);
|
|
10762
10578
|
};
|
|
10763
10579
|
__expose({
|