@smplkit/sdk 1.6.17 → 1.7.0
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/index.cjs +391 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.js +391 -43
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -17347,7 +17347,8 @@ var ConfigClient = class {
|
|
|
17347
17347
|
if (this._getSharedWs) {
|
|
17348
17348
|
const ws = this._getSharedWs();
|
|
17349
17349
|
ws.on("config_changed", this._handleConfigChanged);
|
|
17350
|
-
ws.on("config_deleted", this.
|
|
17350
|
+
ws.on("config_deleted", this._handleConfigDeleted);
|
|
17351
|
+
ws.on("configs_changed", this._handleConfigsChanged);
|
|
17351
17352
|
}
|
|
17352
17353
|
}
|
|
17353
17354
|
/** @internal — called by SmplClient for backward compat. */
|
|
@@ -17370,13 +17371,75 @@ var ConfigClient = class {
|
|
|
17370
17371
|
// Internal: WebSocket handler
|
|
17371
17372
|
// ------------------------------------------------------------------
|
|
17372
17373
|
_handleConfigChanged = (data) => {
|
|
17373
|
-
debug("websocket", `
|
|
17374
|
+
debug("websocket", `config_changed event received: ${JSON.stringify(data)}`);
|
|
17375
|
+
const configKey = data.id;
|
|
17376
|
+
if (!configKey) return;
|
|
17377
|
+
void this._fetchSingleConfig(configKey).then((newConfig) => {
|
|
17378
|
+
const environment = this._parent?._environment;
|
|
17379
|
+
if (!environment) return;
|
|
17380
|
+
const oldValues = this._configCache[configKey];
|
|
17381
|
+
let newValues;
|
|
17382
|
+
if (newConfig !== null) {
|
|
17383
|
+
newValues = this._resolveConfigValues(newConfig, environment);
|
|
17384
|
+
} else {
|
|
17385
|
+
newValues = {};
|
|
17386
|
+
}
|
|
17387
|
+
const oldJson = JSON.stringify(oldValues ?? {});
|
|
17388
|
+
const newJson = JSON.stringify(newValues);
|
|
17389
|
+
if (oldJson === newJson) return;
|
|
17390
|
+
const oldCache = { ...this._configCache };
|
|
17391
|
+
if (newConfig !== null) {
|
|
17392
|
+
this._configCache[configKey] = newValues;
|
|
17393
|
+
} else {
|
|
17394
|
+
delete this._configCache[configKey];
|
|
17395
|
+
}
|
|
17396
|
+
this._diffAndFire(oldCache, this._configCache, "websocket");
|
|
17397
|
+
}).catch((err) => {
|
|
17398
|
+
debug(
|
|
17399
|
+
"websocket",
|
|
17400
|
+
`config_changed handler error: ${err instanceof Error ? err.message : String(err)}`
|
|
17401
|
+
);
|
|
17402
|
+
});
|
|
17403
|
+
};
|
|
17404
|
+
_handleConfigDeleted = (data) => {
|
|
17405
|
+
debug("websocket", `config_deleted event received: ${JSON.stringify(data)}`);
|
|
17406
|
+
const configKey = data.id;
|
|
17407
|
+
if (!configKey) return;
|
|
17408
|
+
if (configKey in this._configCache) {
|
|
17409
|
+
const oldCache = { ...this._configCache };
|
|
17410
|
+
delete this._configCache[configKey];
|
|
17411
|
+
this._diffAndFire(oldCache, this._configCache, "websocket");
|
|
17412
|
+
}
|
|
17413
|
+
};
|
|
17414
|
+
_handleConfigsChanged = (_data) => {
|
|
17415
|
+
debug("websocket", `configs_changed event received`);
|
|
17374
17416
|
void this.refresh().catch(() => {
|
|
17375
17417
|
});
|
|
17376
17418
|
};
|
|
17377
17419
|
// ------------------------------------------------------------------
|
|
17378
17420
|
// Internal: change detection
|
|
17379
17421
|
// ------------------------------------------------------------------
|
|
17422
|
+
/** Fetch a single config by key. Returns null if not found. @internal */
|
|
17423
|
+
async _fetchSingleConfig(key) {
|
|
17424
|
+
debug("api", `GET /api/v1/configs/${key}`);
|
|
17425
|
+
try {
|
|
17426
|
+
const result = await this._http.GET("/api/v1/configs/{id}", {
|
|
17427
|
+
params: { path: { id: key } }
|
|
17428
|
+
});
|
|
17429
|
+
if (!result.response.ok) return null;
|
|
17430
|
+
if (!result.data?.data) return null;
|
|
17431
|
+
return resourceToConfig(result.data.data, this);
|
|
17432
|
+
} catch {
|
|
17433
|
+
return null;
|
|
17434
|
+
}
|
|
17435
|
+
}
|
|
17436
|
+
/** Resolve a config's values for an environment (no parent chain). @internal */
|
|
17437
|
+
_resolveConfigValues(config, environment) {
|
|
17438
|
+
const base = config.items ?? {};
|
|
17439
|
+
const envEntry = config.environments?.[environment];
|
|
17440
|
+
if (!envEntry?.values) return { ...base };
|
|
17441
|
+
return { ...base, ...envEntry.values };
|
|
17442
|
+
}
|
|
17380
17443
|
/** @internal */
|
|
17381
17444
|
_diffAndFire(oldCache, newCache, source) {
|
|
17382
17445
|
const allConfigKeys = /* @__PURE__ */ new Set([...Object.keys(oldCache), ...Object.keys(newCache)]);
|
|
@@ -17656,9 +17719,12 @@ function evaluateFlag(flagDef, environment, evalDict) {
|
|
|
17656
17719
|
var FlagChangeEvent = class {
|
|
17657
17720
|
id;
|
|
17658
17721
|
source;
|
|
17659
|
-
|
|
17722
|
+
/** True when the flag was deleted. */
|
|
17723
|
+
deleted;
|
|
17724
|
+
constructor(id, source, deleted) {
|
|
17660
17725
|
this.id = id;
|
|
17661
17726
|
this.source = source;
|
|
17727
|
+
if (deleted) this.deleted = deleted;
|
|
17662
17728
|
}
|
|
17663
17729
|
};
|
|
17664
17730
|
var ResolutionCache = class {
|
|
@@ -18168,6 +18234,7 @@ var FlagsClient = class {
|
|
|
18168
18234
|
this._wsManager = this._ensureWs();
|
|
18169
18235
|
this._wsManager.on("flag_changed", this._handleFlagChanged);
|
|
18170
18236
|
this._wsManager.on("flag_deleted", this._handleFlagDeleted);
|
|
18237
|
+
this._wsManager.on("flags_changed", this._handleFlagsChanged);
|
|
18171
18238
|
this._flagFlushTimer = setInterval(() => {
|
|
18172
18239
|
void this._flushFlags();
|
|
18173
18240
|
}, FLAG_REGISTRATION_FLUSH_INTERVAL_MS);
|
|
@@ -18177,6 +18244,7 @@ var FlagsClient = class {
|
|
|
18177
18244
|
if (this._wsManager !== null) {
|
|
18178
18245
|
this._wsManager.off("flag_changed", this._handleFlagChanged);
|
|
18179
18246
|
this._wsManager.off("flag_deleted", this._handleFlagDeleted);
|
|
18247
|
+
this._wsManager.off("flags_changed", this._handleFlagsChanged);
|
|
18180
18248
|
this._wsManager = null;
|
|
18181
18249
|
}
|
|
18182
18250
|
if (this._flagFlushTimer !== null) {
|
|
@@ -18341,6 +18409,7 @@ var FlagsClient = class {
|
|
|
18341
18409
|
this._wsManager = this._ensureWs();
|
|
18342
18410
|
this._wsManager.on("flag_changed", this._handleFlagChanged);
|
|
18343
18411
|
this._wsManager.on("flag_deleted", this._handleFlagDeleted);
|
|
18412
|
+
this._wsManager.on("flags_changed", this._handleFlagsChanged);
|
|
18344
18413
|
this._flagFlushTimer = setInterval(() => {
|
|
18345
18414
|
void this._flushFlags();
|
|
18346
18415
|
}, FLAG_REGISTRATION_FLUSH_INTERVAL_MS);
|
|
@@ -18349,19 +18418,84 @@ var FlagsClient = class {
|
|
|
18349
18418
|
// Internal: event handlers (called by SharedWebSocket)
|
|
18350
18419
|
// ------------------------------------------------------------------
|
|
18351
18420
|
_handleFlagChanged = (data) => {
|
|
18352
|
-
debug("websocket", `
|
|
18353
|
-
const
|
|
18354
|
-
|
|
18421
|
+
debug("websocket", `flag_changed event received: ${JSON.stringify(data)}`);
|
|
18422
|
+
const flagKey = data.id;
|
|
18423
|
+
if (!flagKey) return;
|
|
18424
|
+
void this._fetchSingleFlag(flagKey).then((newDef) => {
|
|
18425
|
+
const oldDef = this._flagStore[flagKey];
|
|
18426
|
+
const oldJson = oldDef !== void 0 ? JSON.stringify(oldDef) : null;
|
|
18427
|
+
const newJson = newDef !== void 0 ? JSON.stringify(newDef) : null;
|
|
18428
|
+
if (oldJson === newJson) return;
|
|
18429
|
+
if (newDef !== void 0) {
|
|
18430
|
+
this._flagStore[flagKey] = newDef;
|
|
18431
|
+
} else {
|
|
18432
|
+
delete this._flagStore[flagKey];
|
|
18433
|
+
}
|
|
18355
18434
|
this._cache.clear();
|
|
18356
|
-
this._fireChangeListeners(
|
|
18435
|
+
this._fireChangeListeners(flagKey, "websocket");
|
|
18357
18436
|
});
|
|
18358
18437
|
};
|
|
18359
18438
|
_handleFlagDeleted = (data) => {
|
|
18360
|
-
debug("websocket", `
|
|
18361
|
-
const
|
|
18439
|
+
debug("websocket", `flag_deleted event received: ${JSON.stringify(data)}`);
|
|
18440
|
+
const flagKey = data.id;
|
|
18441
|
+
if (!flagKey) return;
|
|
18442
|
+
if (flagKey in this._flagStore) {
|
|
18443
|
+
delete this._flagStore[flagKey];
|
|
18444
|
+
}
|
|
18445
|
+
this._cache.clear();
|
|
18446
|
+
const deletedEvent = new FlagChangeEvent(flagKey, "websocket", true);
|
|
18447
|
+
for (const cb of this._globalListeners) {
|
|
18448
|
+
try {
|
|
18449
|
+
cb(deletedEvent);
|
|
18450
|
+
} catch {
|
|
18451
|
+
}
|
|
18452
|
+
}
|
|
18453
|
+
const keyCallbacks = this._keyListeners.get(flagKey);
|
|
18454
|
+
if (keyCallbacks) {
|
|
18455
|
+
for (const cb of keyCallbacks) {
|
|
18456
|
+
try {
|
|
18457
|
+
cb(deletedEvent);
|
|
18458
|
+
} catch {
|
|
18459
|
+
}
|
|
18460
|
+
}
|
|
18461
|
+
}
|
|
18462
|
+
};
|
|
18463
|
+
_handleFlagsChanged = (_data) => {
|
|
18464
|
+
debug("websocket", `flags_changed event received`);
|
|
18465
|
+
const preStore = { ...this._flagStore };
|
|
18362
18466
|
void this._fetchAllFlags().then(() => {
|
|
18363
18467
|
this._cache.clear();
|
|
18364
|
-
|
|
18468
|
+
const postStore = this._flagStore;
|
|
18469
|
+
const changedKeys = /* @__PURE__ */ new Set();
|
|
18470
|
+
const allKeys = /* @__PURE__ */ new Set([...Object.keys(preStore), ...Object.keys(postStore)]);
|
|
18471
|
+
for (const key of allKeys) {
|
|
18472
|
+
const preJson = preStore[key] !== void 0 ? JSON.stringify(preStore[key]) : null;
|
|
18473
|
+
const postJson = postStore[key] !== void 0 ? JSON.stringify(postStore[key]) : null;
|
|
18474
|
+
if (preJson !== postJson) {
|
|
18475
|
+
changedKeys.add(key);
|
|
18476
|
+
}
|
|
18477
|
+
}
|
|
18478
|
+
if (changedKeys.size === 0) return;
|
|
18479
|
+
const [firstKey] = changedKeys;
|
|
18480
|
+
const globalEvent = new FlagChangeEvent(firstKey, "websocket");
|
|
18481
|
+
for (const cb of this._globalListeners) {
|
|
18482
|
+
try {
|
|
18483
|
+
cb(globalEvent);
|
|
18484
|
+
} catch {
|
|
18485
|
+
}
|
|
18486
|
+
}
|
|
18487
|
+
for (const key of changedKeys) {
|
|
18488
|
+
const keyCallbacks = this._keyListeners.get(key);
|
|
18489
|
+
if (keyCallbacks) {
|
|
18490
|
+
const keyEvent = new FlagChangeEvent(key, "websocket");
|
|
18491
|
+
for (const cb of keyCallbacks) {
|
|
18492
|
+
try {
|
|
18493
|
+
cb(keyEvent);
|
|
18494
|
+
} catch {
|
|
18495
|
+
}
|
|
18496
|
+
}
|
|
18497
|
+
}
|
|
18498
|
+
}
|
|
18365
18499
|
});
|
|
18366
18500
|
};
|
|
18367
18501
|
// ------------------------------------------------------------------
|
|
@@ -18375,6 +18509,20 @@ var FlagsClient = class {
|
|
|
18375
18509
|
}
|
|
18376
18510
|
this._flagStore = store;
|
|
18377
18511
|
}
|
|
18512
|
+
/** Fetch a single flag by key. Returns undefined if not found. @internal */
|
|
18513
|
+
async _fetchSingleFlag(key) {
|
|
18514
|
+
debug("api", `GET /api/v1/flags/${key}`);
|
|
18515
|
+
try {
|
|
18516
|
+
const result = await this._http.GET("/api/v1/flags/{id}", {
|
|
18517
|
+
params: { path: { id: key } }
|
|
18518
|
+
});
|
|
18519
|
+
if (!result.response.ok) return void 0;
|
|
18520
|
+
if (!result.data?.data) return void 0;
|
|
18521
|
+
return this._resourceToPlainDict(result.data.data);
|
|
18522
|
+
} catch {
|
|
18523
|
+
return void 0;
|
|
18524
|
+
}
|
|
18525
|
+
}
|
|
18378
18526
|
async _fetchFlagsList() {
|
|
18379
18527
|
debug("api", "GET /api/v1/flags");
|
|
18380
18528
|
let data;
|
|
@@ -18754,6 +18902,11 @@ var LoggingClient = class {
|
|
|
18754
18902
|
_explicitAdapters = false;
|
|
18755
18903
|
_loggerBuffer = new LoggerRegistrationBuffer();
|
|
18756
18904
|
_loggerFlushTimer = null;
|
|
18905
|
+
// Local stores for diff-based listener firing
|
|
18906
|
+
_loggerStore = {};
|
|
18907
|
+
// key -> level
|
|
18908
|
+
_groupStore = {};
|
|
18909
|
+
// key -> level
|
|
18757
18910
|
/** @internal */
|
|
18758
18911
|
constructor(apiKey, ensureWs, timeout, baseUrl) {
|
|
18759
18912
|
this._apiKey = apiKey;
|
|
@@ -18874,12 +19027,21 @@ var LoggingClient = class {
|
|
|
18874
19027
|
}
|
|
18875
19028
|
/** @internal */
|
|
18876
19029
|
async _mgGetGroup(id) {
|
|
18877
|
-
|
|
18878
|
-
|
|
18879
|
-
|
|
19030
|
+
let data;
|
|
19031
|
+
try {
|
|
19032
|
+
const result = await this._http.GET("/api/v1/log_groups/{id}", {
|
|
19033
|
+
params: { path: { id } }
|
|
19034
|
+
});
|
|
19035
|
+
if (result.error !== void 0)
|
|
19036
|
+
await checkError3(result.response, `LogGroup with id '${id}' not found`);
|
|
19037
|
+
data = result.data;
|
|
19038
|
+
} catch (err) {
|
|
19039
|
+
wrapFetchError3(err);
|
|
19040
|
+
}
|
|
19041
|
+
if (!data || !data.data) {
|
|
18880
19042
|
throw new SmplNotFoundError(`LogGroup with id '${id}' not found`);
|
|
18881
19043
|
}
|
|
18882
|
-
return
|
|
19044
|
+
return this._groupToModel(data.data);
|
|
18883
19045
|
}
|
|
18884
19046
|
/** @internal */
|
|
18885
19047
|
async _mgListGroups() {
|
|
@@ -19042,13 +19204,20 @@ var LoggingClient = class {
|
|
|
19042
19204
|
`fetched ${serverLoggers.length} logger(s) and ${serverGroups.length} group(s) from server`
|
|
19043
19205
|
);
|
|
19044
19206
|
this._applyLevels(serverLoggers);
|
|
19207
|
+
for (const l of serverLoggers) {
|
|
19208
|
+
this._loggerStore[l.id] = l.level;
|
|
19209
|
+
}
|
|
19210
|
+
for (const g of serverGroups) {
|
|
19211
|
+
this._groupStore[g.id] = g.level;
|
|
19212
|
+
}
|
|
19045
19213
|
} catch {
|
|
19046
19214
|
}
|
|
19047
19215
|
this._wsManager = this._ensureWs();
|
|
19048
19216
|
this._wsManager.on("logger_changed", this._handleLoggerChanged);
|
|
19049
|
-
this._wsManager.on("logger_deleted", this.
|
|
19217
|
+
this._wsManager.on("logger_deleted", this._handleLoggerDeleted);
|
|
19050
19218
|
this._wsManager.on("group_changed", this._handleGroupChanged);
|
|
19051
|
-
this._wsManager.on("group_deleted", this.
|
|
19219
|
+
this._wsManager.on("group_deleted", this._handleGroupDeleted);
|
|
19220
|
+
this._wsManager.on("loggers_changed", this._handleLoggersChanged);
|
|
19052
19221
|
this._loggerFlushTimer = setInterval(() => {
|
|
19053
19222
|
void this._flushLoggerBuffer();
|
|
19054
19223
|
}, 3e4);
|
|
@@ -19096,9 +19265,10 @@ var LoggingClient = class {
|
|
|
19096
19265
|
}
|
|
19097
19266
|
if (this._wsManager !== null) {
|
|
19098
19267
|
this._wsManager.off("logger_changed", this._handleLoggerChanged);
|
|
19099
|
-
this._wsManager.off("logger_deleted", this.
|
|
19268
|
+
this._wsManager.off("logger_deleted", this._handleLoggerDeleted);
|
|
19100
19269
|
this._wsManager.off("group_changed", this._handleGroupChanged);
|
|
19101
|
-
this._wsManager.off("group_deleted", this.
|
|
19270
|
+
this._wsManager.off("group_deleted", this._handleGroupDeleted);
|
|
19271
|
+
this._wsManager.off("loggers_changed", this._handleLoggersChanged);
|
|
19102
19272
|
this._wsManager = null;
|
|
19103
19273
|
}
|
|
19104
19274
|
this._started = false;
|
|
@@ -19192,47 +19362,225 @@ var LoggingClient = class {
|
|
|
19192
19362
|
// Internal: WebSocket handler
|
|
19193
19363
|
// ------------------------------------------------------------------
|
|
19194
19364
|
_handleLoggerChanged = (data) => {
|
|
19195
|
-
debug("websocket", `
|
|
19365
|
+
debug("websocket", `logger_changed event received: ${JSON.stringify(data)}`);
|
|
19196
19366
|
const id = data.id;
|
|
19197
|
-
if (id)
|
|
19198
|
-
|
|
19199
|
-
|
|
19200
|
-
|
|
19201
|
-
|
|
19202
|
-
|
|
19203
|
-
|
|
19204
|
-
|
|
19205
|
-
|
|
19206
|
-
|
|
19207
|
-
|
|
19208
|
-
|
|
19367
|
+
if (!id) return;
|
|
19368
|
+
void this._fetchSingleLogger(id).then((logger) => {
|
|
19369
|
+
const oldLevel = this._loggerStore[id] ?? null;
|
|
19370
|
+
const newLevel = logger?.level ?? null;
|
|
19371
|
+
if (oldLevel === newLevel) return;
|
|
19372
|
+
this._loggerStore[id] = newLevel;
|
|
19373
|
+
if (logger) {
|
|
19374
|
+
this._applyLevels([logger]);
|
|
19375
|
+
}
|
|
19376
|
+
const event = {
|
|
19377
|
+
id,
|
|
19378
|
+
level: newLevel,
|
|
19379
|
+
source: "websocket"
|
|
19380
|
+
};
|
|
19381
|
+
for (const cb of this._globalListeners) {
|
|
19382
|
+
try {
|
|
19383
|
+
cb(event);
|
|
19384
|
+
} catch {
|
|
19385
|
+
}
|
|
19386
|
+
}
|
|
19387
|
+
const idCallbacks = this._keyListeners.get(id);
|
|
19388
|
+
if (idCallbacks) {
|
|
19389
|
+
for (const cb of idCallbacks) {
|
|
19209
19390
|
try {
|
|
19210
19391
|
cb(event);
|
|
19211
19392
|
} catch {
|
|
19212
19393
|
}
|
|
19213
19394
|
}
|
|
19214
|
-
|
|
19215
|
-
|
|
19216
|
-
|
|
19217
|
-
|
|
19218
|
-
|
|
19219
|
-
|
|
19220
|
-
|
|
19221
|
-
|
|
19395
|
+
}
|
|
19396
|
+
}).catch((err) => {
|
|
19397
|
+
debug(
|
|
19398
|
+
"websocket",
|
|
19399
|
+
`logger_changed handler error: ${err instanceof Error ? err.message : String(err)}`
|
|
19400
|
+
);
|
|
19401
|
+
});
|
|
19402
|
+
};
|
|
19403
|
+
_handleLoggerDeleted = (data) => {
|
|
19404
|
+
debug("websocket", `logger_deleted event received: ${JSON.stringify(data)}`);
|
|
19405
|
+
const id = data.id;
|
|
19406
|
+
if (!id) return;
|
|
19407
|
+
delete this._loggerStore[id];
|
|
19408
|
+
const event = {
|
|
19409
|
+
id,
|
|
19410
|
+
level: null,
|
|
19411
|
+
source: "websocket",
|
|
19412
|
+
deleted: true
|
|
19413
|
+
};
|
|
19414
|
+
for (const cb of this._globalListeners) {
|
|
19415
|
+
try {
|
|
19416
|
+
cb(event);
|
|
19417
|
+
} catch (err) {
|
|
19418
|
+
debug(
|
|
19419
|
+
"websocket",
|
|
19420
|
+
`logger_deleted listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
19421
|
+
);
|
|
19422
|
+
}
|
|
19423
|
+
}
|
|
19424
|
+
const idCallbacks = this._keyListeners.get(id);
|
|
19425
|
+
if (idCallbacks) {
|
|
19426
|
+
for (const cb of idCallbacks) {
|
|
19427
|
+
try {
|
|
19428
|
+
cb(event);
|
|
19429
|
+
} catch (err) {
|
|
19430
|
+
debug(
|
|
19431
|
+
"websocket",
|
|
19432
|
+
`logger_deleted key listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
19433
|
+
);
|
|
19222
19434
|
}
|
|
19435
|
+
}
|
|
19436
|
+
}
|
|
19437
|
+
};
|
|
19438
|
+
_handleGroupChanged = (data) => {
|
|
19439
|
+
debug("websocket", `group_changed event received: ${JSON.stringify(data)}`);
|
|
19440
|
+
const id = data.id;
|
|
19441
|
+
if (!id) return;
|
|
19442
|
+
void this._fetchSingleGroup(id).then((group) => {
|
|
19443
|
+
const oldLevel = this._groupStore[id] ?? null;
|
|
19444
|
+
const newLevel = group?.level ?? null;
|
|
19445
|
+
if (oldLevel === newLevel) return;
|
|
19446
|
+
this._groupStore[id] = newLevel;
|
|
19447
|
+
void this.management.list().then((loggers) => {
|
|
19448
|
+
this._applyLevels(loggers);
|
|
19223
19449
|
}).catch(() => {
|
|
19224
19450
|
});
|
|
19451
|
+
}).catch((err) => {
|
|
19452
|
+
debug(
|
|
19453
|
+
"websocket",
|
|
19454
|
+
`group_changed handler error: ${err instanceof Error ? err.message : String(err)}`
|
|
19455
|
+
);
|
|
19456
|
+
});
|
|
19457
|
+
};
|
|
19458
|
+
_handleGroupDeleted = (data) => {
|
|
19459
|
+
debug("websocket", `group_deleted event received: ${JSON.stringify(data)}`);
|
|
19460
|
+
const id = data.id;
|
|
19461
|
+
if (!id) return;
|
|
19462
|
+
delete this._groupStore[id];
|
|
19463
|
+
const event = {
|
|
19464
|
+
id,
|
|
19465
|
+
level: null,
|
|
19466
|
+
source: "websocket",
|
|
19467
|
+
deleted: true
|
|
19468
|
+
};
|
|
19469
|
+
for (const cb of this._globalListeners) {
|
|
19470
|
+
try {
|
|
19471
|
+
cb(event);
|
|
19472
|
+
} catch (err) {
|
|
19473
|
+
debug(
|
|
19474
|
+
"websocket",
|
|
19475
|
+
`group_deleted listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
19476
|
+
);
|
|
19477
|
+
}
|
|
19478
|
+
}
|
|
19479
|
+
const idCallbacks = this._keyListeners.get(id);
|
|
19480
|
+
if (idCallbacks) {
|
|
19481
|
+
for (const cb of idCallbacks) {
|
|
19482
|
+
try {
|
|
19483
|
+
cb(event);
|
|
19484
|
+
} catch (err) {
|
|
19485
|
+
debug(
|
|
19486
|
+
"websocket",
|
|
19487
|
+
`group_deleted key listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
19488
|
+
);
|
|
19489
|
+
}
|
|
19490
|
+
}
|
|
19225
19491
|
}
|
|
19226
19492
|
};
|
|
19227
|
-
|
|
19228
|
-
debug("websocket", `
|
|
19229
|
-
void Promise.all([this.management.list(), this.management.listGroups()]).then(([serverLoggers]) => {
|
|
19230
|
-
debug("resolution", `resolution pass (trigger:
|
|
19493
|
+
_handleLoggersChanged = (_data) => {
|
|
19494
|
+
debug("websocket", `loggers_changed event received`);
|
|
19495
|
+
void Promise.all([this.management.list(), this.management.listGroups()]).then(([serverLoggers, serverGroups]) => {
|
|
19496
|
+
debug("resolution", `resolution pass (trigger: loggers_changed event)`);
|
|
19497
|
+
const changedLoggerIds = /* @__PURE__ */ new Set();
|
|
19498
|
+
const newLoggerKeys = new Set(serverLoggers.map((l) => l.id));
|
|
19499
|
+
for (const logger of serverLoggers) {
|
|
19500
|
+
const key = logger.id;
|
|
19501
|
+
const oldLevel = this._loggerStore[key] ?? null;
|
|
19502
|
+
const newLevel = logger.level ?? null;
|
|
19503
|
+
if (oldLevel !== newLevel || !(key in this._loggerStore)) {
|
|
19504
|
+
changedLoggerIds.add(key);
|
|
19505
|
+
this._loggerStore[key] = newLevel;
|
|
19506
|
+
}
|
|
19507
|
+
}
|
|
19508
|
+
for (const key of Object.keys(this._loggerStore)) {
|
|
19509
|
+
if (!newLoggerKeys.has(key)) {
|
|
19510
|
+
changedLoggerIds.add(key);
|
|
19511
|
+
delete this._loggerStore[key];
|
|
19512
|
+
}
|
|
19513
|
+
}
|
|
19514
|
+
for (const group of serverGroups) {
|
|
19515
|
+
this._groupStore[group.id] = group.level ?? null;
|
|
19516
|
+
}
|
|
19231
19517
|
this._applyLevels(serverLoggers);
|
|
19518
|
+
if (changedLoggerIds.size === 0) return;
|
|
19519
|
+
const [firstKey] = changedLoggerIds;
|
|
19520
|
+
const firstLogger = serverLoggers.find((l) => l.id === firstKey);
|
|
19521
|
+
const globalEvent = {
|
|
19522
|
+
id: firstKey,
|
|
19523
|
+
level: firstLogger?.level ?? null,
|
|
19524
|
+
source: "websocket"
|
|
19525
|
+
};
|
|
19526
|
+
for (const cb of this._globalListeners) {
|
|
19527
|
+
try {
|
|
19528
|
+
cb(globalEvent);
|
|
19529
|
+
} catch {
|
|
19530
|
+
}
|
|
19531
|
+
}
|
|
19532
|
+
for (const key of changedLoggerIds) {
|
|
19533
|
+
const keyCallbacks = this._keyListeners.get(key);
|
|
19534
|
+
if (keyCallbacks) {
|
|
19535
|
+
const l = serverLoggers.find((x) => x.id === key);
|
|
19536
|
+
const keyEvent = {
|
|
19537
|
+
id: key,
|
|
19538
|
+
level: l?.level ?? null,
|
|
19539
|
+
source: "websocket"
|
|
19540
|
+
};
|
|
19541
|
+
for (const cb of keyCallbacks) {
|
|
19542
|
+
try {
|
|
19543
|
+
cb(keyEvent);
|
|
19544
|
+
} catch {
|
|
19545
|
+
}
|
|
19546
|
+
}
|
|
19547
|
+
}
|
|
19548
|
+
}
|
|
19232
19549
|
}).catch(() => {
|
|
19233
19550
|
});
|
|
19234
19551
|
};
|
|
19235
19552
|
// ------------------------------------------------------------------
|
|
19553
|
+
// Internal: single-resource fetchers
|
|
19554
|
+
// ------------------------------------------------------------------
|
|
19555
|
+
/** Fetch a single logger by key. Returns null if not found. @internal */
|
|
19556
|
+
async _fetchSingleLogger(key) {
|
|
19557
|
+
debug("api", `GET /api/v1/loggers/${key}`);
|
|
19558
|
+
try {
|
|
19559
|
+
const result = await this._http.GET("/api/v1/loggers/{id}", {
|
|
19560
|
+
params: { path: { id: key } }
|
|
19561
|
+
});
|
|
19562
|
+
if (result.error !== void 0) return null;
|
|
19563
|
+
if (!result.data?.data) return null;
|
|
19564
|
+
return this._loggerToModel(result.data.data);
|
|
19565
|
+
} catch {
|
|
19566
|
+
return null;
|
|
19567
|
+
}
|
|
19568
|
+
}
|
|
19569
|
+
/** Fetch a single log group by key. Returns null if not found. @internal */
|
|
19570
|
+
async _fetchSingleGroup(key) {
|
|
19571
|
+
debug("api", `GET /api/v1/log_groups/${key}`);
|
|
19572
|
+
try {
|
|
19573
|
+
const result = await this._http.GET("/api/v1/log_groups/{id}", {
|
|
19574
|
+
params: { path: { id: key } }
|
|
19575
|
+
});
|
|
19576
|
+
if (result.error !== void 0) return null;
|
|
19577
|
+
if (!result.data?.data) return null;
|
|
19578
|
+
return this._groupToModel(result.data.data);
|
|
19579
|
+
} catch {
|
|
19580
|
+
return null;
|
|
19581
|
+
}
|
|
19582
|
+
}
|
|
19583
|
+
// ------------------------------------------------------------------
|
|
19236
19584
|
// Internal: model conversion
|
|
19237
19585
|
// ------------------------------------------------------------------
|
|
19238
19586
|
_loggerToModel(resource) {
|