@smplkit/sdk 3.0.49 → 3.0.50
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 +260 -152
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +44 -7
- package/dist/index.d.ts +44 -7
- package/dist/index.js +260 -152
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -3363,8 +3363,10 @@ declare class LoggingClient {
|
|
|
3363
3363
|
private _explicitAdapters;
|
|
3364
3364
|
private _loggerBuffer;
|
|
3365
3365
|
private _loggerFlushTimer;
|
|
3366
|
-
private
|
|
3367
|
-
private
|
|
3366
|
+
private _loggersCache;
|
|
3367
|
+
private _groupsCache;
|
|
3368
|
+
private _resolvedLevelStore;
|
|
3369
|
+
private _knownLoggerNames;
|
|
3368
3370
|
/** @internal */
|
|
3369
3371
|
constructor(apiKey: string, ensureWs: () => SharedWebSocket, timeout?: number, baseUrl?: string, extraHeaders?: Record<string, string>);
|
|
3370
3372
|
/**
|
|
@@ -3441,8 +3443,29 @@ declare class LoggingClient {
|
|
|
3441
3443
|
_close(): void;
|
|
3442
3444
|
/** Auto-load built-in adapters by attempting to require each framework. */
|
|
3443
3445
|
private _autoLoadAdapters;
|
|
3444
|
-
/**
|
|
3446
|
+
/**
|
|
3447
|
+
* Refresh resolved levels and apply them to adapter-known loggers.
|
|
3448
|
+
*
|
|
3449
|
+
* Computes a resolved level (via {@link resolveLevel}) for every entry
|
|
3450
|
+
* currently in `_loggersCache` *and* every adapter-known logger name —
|
|
3451
|
+
* even loggers whose own `level` is `null`, because they may inherit
|
|
3452
|
+
* via group chain or dot-notation ancestry.
|
|
3453
|
+
*
|
|
3454
|
+
* The full resolved-level snapshot is stored in `_resolvedLevelStore`
|
|
3455
|
+
* so callers can diff pre-vs-post and fire change listeners on actual
|
|
3456
|
+
* effective-level deltas (group-driven changes included). Adapter pushes
|
|
3457
|
+
* only happen for adapter-known names where `managed !== false`.
|
|
3458
|
+
* @internal
|
|
3459
|
+
*/
|
|
3445
3460
|
private _applyLevels;
|
|
3461
|
+
/** @internal Convert a server Logger list into the resolution cache. */
|
|
3462
|
+
private _buildLoggersCache;
|
|
3463
|
+
/** @internal Convert a server LogGroup list into the resolution cache. */
|
|
3464
|
+
private _buildGroupsCache;
|
|
3465
|
+
/** @internal */
|
|
3466
|
+
private _loggerToCacheEntry;
|
|
3467
|
+
/** @internal */
|
|
3468
|
+
private _groupToCacheEntry;
|
|
3446
3469
|
/** Called by adapter hooks when a new logger is created in the framework. */
|
|
3447
3470
|
private _onAdapterNewLogger;
|
|
3448
3471
|
/** Flush buffered loggers to the bulk-register endpoint. */
|
|
@@ -3451,12 +3474,26 @@ declare class LoggingClient {
|
|
|
3451
3474
|
private _handleLoggerDeleted;
|
|
3452
3475
|
private _handleGroupChanged;
|
|
3453
3476
|
private _handleGroupDeleted;
|
|
3477
|
+
/**
|
|
3478
|
+
* @internal Fire change listeners for every logger whose resolved level
|
|
3479
|
+
* changed between `pre` and `post`. Stores resolved levels, not raw
|
|
3480
|
+
* `logger.level`, so a group-driven change actually fires. Keys that
|
|
3481
|
+
* disappeared from `post` are emitted with `deleted: true`.
|
|
3482
|
+
*/
|
|
3483
|
+
private _fireDeltas;
|
|
3484
|
+
/**
|
|
3485
|
+
* @internal Always emit a deleted event for `id` on global and per-key
|
|
3486
|
+
* listeners. Used by `logger_deleted` / `group_deleted` handlers to
|
|
3487
|
+
* preserve the explicit notification contract even when nothing in the
|
|
3488
|
+
* resolved-level store changed (e.g. server removed an unknown logger).
|
|
3489
|
+
*/
|
|
3490
|
+
private _emitDeletedEvent;
|
|
3454
3491
|
private _handleLoggersChanged;
|
|
3455
3492
|
/**
|
|
3456
|
-
* Full refetch of loggers + log_groups,
|
|
3457
|
-
*
|
|
3458
|
-
*
|
|
3459
|
-
*
|
|
3493
|
+
* Full refetch of loggers + log_groups, rebuild the caches, re-resolve
|
|
3494
|
+
* every adapter-known logger, and fire change listeners on resolved-level
|
|
3495
|
+
* deltas. Shared between the `loggers_changed` WS handler and the
|
|
3496
|
+
* public `refresh()` method.
|
|
3460
3497
|
* @internal
|
|
3461
3498
|
*/
|
|
3462
3499
|
private _resolveAndFire;
|
package/dist/index.d.ts
CHANGED
|
@@ -3363,8 +3363,10 @@ declare class LoggingClient {
|
|
|
3363
3363
|
private _explicitAdapters;
|
|
3364
3364
|
private _loggerBuffer;
|
|
3365
3365
|
private _loggerFlushTimer;
|
|
3366
|
-
private
|
|
3367
|
-
private
|
|
3366
|
+
private _loggersCache;
|
|
3367
|
+
private _groupsCache;
|
|
3368
|
+
private _resolvedLevelStore;
|
|
3369
|
+
private _knownLoggerNames;
|
|
3368
3370
|
/** @internal */
|
|
3369
3371
|
constructor(apiKey: string, ensureWs: () => SharedWebSocket, timeout?: number, baseUrl?: string, extraHeaders?: Record<string, string>);
|
|
3370
3372
|
/**
|
|
@@ -3441,8 +3443,29 @@ declare class LoggingClient {
|
|
|
3441
3443
|
_close(): void;
|
|
3442
3444
|
/** Auto-load built-in adapters by attempting to require each framework. */
|
|
3443
3445
|
private _autoLoadAdapters;
|
|
3444
|
-
/**
|
|
3446
|
+
/**
|
|
3447
|
+
* Refresh resolved levels and apply them to adapter-known loggers.
|
|
3448
|
+
*
|
|
3449
|
+
* Computes a resolved level (via {@link resolveLevel}) for every entry
|
|
3450
|
+
* currently in `_loggersCache` *and* every adapter-known logger name —
|
|
3451
|
+
* even loggers whose own `level` is `null`, because they may inherit
|
|
3452
|
+
* via group chain or dot-notation ancestry.
|
|
3453
|
+
*
|
|
3454
|
+
* The full resolved-level snapshot is stored in `_resolvedLevelStore`
|
|
3455
|
+
* so callers can diff pre-vs-post and fire change listeners on actual
|
|
3456
|
+
* effective-level deltas (group-driven changes included). Adapter pushes
|
|
3457
|
+
* only happen for adapter-known names where `managed !== false`.
|
|
3458
|
+
* @internal
|
|
3459
|
+
*/
|
|
3445
3460
|
private _applyLevels;
|
|
3461
|
+
/** @internal Convert a server Logger list into the resolution cache. */
|
|
3462
|
+
private _buildLoggersCache;
|
|
3463
|
+
/** @internal Convert a server LogGroup list into the resolution cache. */
|
|
3464
|
+
private _buildGroupsCache;
|
|
3465
|
+
/** @internal */
|
|
3466
|
+
private _loggerToCacheEntry;
|
|
3467
|
+
/** @internal */
|
|
3468
|
+
private _groupToCacheEntry;
|
|
3446
3469
|
/** Called by adapter hooks when a new logger is created in the framework. */
|
|
3447
3470
|
private _onAdapterNewLogger;
|
|
3448
3471
|
/** Flush buffered loggers to the bulk-register endpoint. */
|
|
@@ -3451,12 +3474,26 @@ declare class LoggingClient {
|
|
|
3451
3474
|
private _handleLoggerDeleted;
|
|
3452
3475
|
private _handleGroupChanged;
|
|
3453
3476
|
private _handleGroupDeleted;
|
|
3477
|
+
/**
|
|
3478
|
+
* @internal Fire change listeners for every logger whose resolved level
|
|
3479
|
+
* changed between `pre` and `post`. Stores resolved levels, not raw
|
|
3480
|
+
* `logger.level`, so a group-driven change actually fires. Keys that
|
|
3481
|
+
* disappeared from `post` are emitted with `deleted: true`.
|
|
3482
|
+
*/
|
|
3483
|
+
private _fireDeltas;
|
|
3484
|
+
/**
|
|
3485
|
+
* @internal Always emit a deleted event for `id` on global and per-key
|
|
3486
|
+
* listeners. Used by `logger_deleted` / `group_deleted` handlers to
|
|
3487
|
+
* preserve the explicit notification contract even when nothing in the
|
|
3488
|
+
* resolved-level store changed (e.g. server removed an unknown logger).
|
|
3489
|
+
*/
|
|
3490
|
+
private _emitDeletedEvent;
|
|
3454
3491
|
private _handleLoggersChanged;
|
|
3455
3492
|
/**
|
|
3456
|
-
* Full refetch of loggers + log_groups,
|
|
3457
|
-
*
|
|
3458
|
-
*
|
|
3459
|
-
*
|
|
3493
|
+
* Full refetch of loggers + log_groups, rebuild the caches, re-resolve
|
|
3494
|
+
* every adapter-known logger, and fire change listeners on resolved-level
|
|
3495
|
+
* deltas. Shared between the `loggers_changed` WS handler and the
|
|
3496
|
+
* public `refresh()` method.
|
|
3460
3497
|
* @internal
|
|
3461
3498
|
*/
|
|
3462
3499
|
private _resolveAndFire;
|
package/dist/index.js
CHANGED
|
@@ -17527,6 +17527,9 @@ function _parseDebugEnv(value) {
|
|
|
17527
17527
|
return v === "1" || v === "true" || v === "yes";
|
|
17528
17528
|
}
|
|
17529
17529
|
var _DEBUG_ENABLED = _parseDebugEnv(process.env.SMPLKIT_DEBUG ?? "");
|
|
17530
|
+
function isDebugEnabled() {
|
|
17531
|
+
return _DEBUG_ENABLED;
|
|
17532
|
+
}
|
|
17530
17533
|
function enableDebug() {
|
|
17531
17534
|
_DEBUG_ENABLED = true;
|
|
17532
17535
|
}
|
|
@@ -21704,6 +21707,72 @@ var FlagsClient = class {
|
|
|
21704
21707
|
|
|
21705
21708
|
// src/logging/client.ts
|
|
21706
21709
|
import createClient5 from "openapi-fetch";
|
|
21710
|
+
|
|
21711
|
+
// src/logging/_resolution.ts
|
|
21712
|
+
var FALLBACK_LEVEL = "INFO";
|
|
21713
|
+
function resolveLevel(loggerId, environment, loggers, groups) {
|
|
21714
|
+
const direct = _resolveForEntry(loggerId, environment, loggers, groups);
|
|
21715
|
+
if (direct !== null) {
|
|
21716
|
+
if (isDebugEnabled()) {
|
|
21717
|
+
const source = _findResolutionSource(loggerId, environment, loggers, groups);
|
|
21718
|
+
debug("resolution", `${loggerId} -> ${direct} (source: ${source})`);
|
|
21719
|
+
}
|
|
21720
|
+
return direct;
|
|
21721
|
+
}
|
|
21722
|
+
const parts = loggerId.split(".");
|
|
21723
|
+
for (let i = parts.length - 1; i > 0; i--) {
|
|
21724
|
+
const ancestorId = parts.slice(0, i).join(".");
|
|
21725
|
+
const result = _resolveForEntry(ancestorId, environment, loggers, groups);
|
|
21726
|
+
if (result !== null) {
|
|
21727
|
+
debug("resolution", `${loggerId} -> ${result} (source: ancestor "${ancestorId}")`);
|
|
21728
|
+
return result;
|
|
21729
|
+
}
|
|
21730
|
+
}
|
|
21731
|
+
debug("resolution", `${loggerId} -> ${FALLBACK_LEVEL} (source: system default)`);
|
|
21732
|
+
return FALLBACK_LEVEL;
|
|
21733
|
+
}
|
|
21734
|
+
function _resolveForEntry(loggerId, environment, loggers, groups) {
|
|
21735
|
+
const entry = loggers[loggerId];
|
|
21736
|
+
if (entry === void 0) return null;
|
|
21737
|
+
const envLevel = _envLevel(entry.environments, environment);
|
|
21738
|
+
if (envLevel !== null) return envLevel;
|
|
21739
|
+
if (entry.level !== null && entry.level !== void 0) return entry.level;
|
|
21740
|
+
return _resolveGroupChain(entry.group, environment, groups);
|
|
21741
|
+
}
|
|
21742
|
+
function _findResolutionSource(loggerId, environment, loggers, groups) {
|
|
21743
|
+
const entry = loggers[loggerId];
|
|
21744
|
+
if (entry === void 0) return "not found";
|
|
21745
|
+
const envLevel = _envLevel(entry.environments, environment);
|
|
21746
|
+
if (envLevel !== null) return `env override "${environment}"`;
|
|
21747
|
+
if (entry.level !== null && entry.level !== void 0) return "base level";
|
|
21748
|
+
const groupResult = _resolveGroupChain(entry.group, environment, groups);
|
|
21749
|
+
if (groupResult !== null) return `group "${entry.group}"`;
|
|
21750
|
+
return "unknown";
|
|
21751
|
+
}
|
|
21752
|
+
function _resolveGroupChain(groupId, environment, groups) {
|
|
21753
|
+
const visited = /* @__PURE__ */ new Set();
|
|
21754
|
+
let currentId = groupId;
|
|
21755
|
+
while (currentId !== null && currentId !== void 0 && !visited.has(currentId)) {
|
|
21756
|
+
visited.add(currentId);
|
|
21757
|
+
const group = groups[currentId];
|
|
21758
|
+
if (group === void 0) break;
|
|
21759
|
+
const envLevel = _envLevel(group.environments, environment);
|
|
21760
|
+
if (envLevel !== null) return envLevel;
|
|
21761
|
+
if (group.level !== null && group.level !== void 0) return group.level;
|
|
21762
|
+
currentId = group.group;
|
|
21763
|
+
}
|
|
21764
|
+
return null;
|
|
21765
|
+
}
|
|
21766
|
+
function _envLevel(envs, environment) {
|
|
21767
|
+
if (!envs || typeof envs !== "object") return null;
|
|
21768
|
+
const envData = envs[environment];
|
|
21769
|
+
if (!envData || typeof envData !== "object") return null;
|
|
21770
|
+
const level = envData.level;
|
|
21771
|
+
if (level === null || level === void 0) return null;
|
|
21772
|
+
return level;
|
|
21773
|
+
}
|
|
21774
|
+
|
|
21775
|
+
// src/logging/client.ts
|
|
21707
21776
|
var LOGGING_BASE_URL = "https://logging.smplkit.com";
|
|
21708
21777
|
var LoggerRegistrationBuffer2 = class {
|
|
21709
21778
|
_seen = /* @__PURE__ */ new Set();
|
|
@@ -21745,11 +21814,20 @@ var LoggingClient = class {
|
|
|
21745
21814
|
_explicitAdapters = false;
|
|
21746
21815
|
_loggerBuffer = new LoggerRegistrationBuffer2();
|
|
21747
21816
|
_loggerFlushTimer = null;
|
|
21748
|
-
//
|
|
21749
|
-
|
|
21750
|
-
//
|
|
21751
|
-
|
|
21752
|
-
|
|
21817
|
+
// Caches consulted by the resolution algorithm. The runtime client mutates
|
|
21818
|
+
// these from install(), refresh(), and the WebSocket handlers; resolveLevel
|
|
21819
|
+
// reads them on every apply.
|
|
21820
|
+
_loggersCache = {};
|
|
21821
|
+
_groupsCache = {};
|
|
21822
|
+
// Resolved-level snapshot, used to decide whether to fire change listeners.
|
|
21823
|
+
// Keyed by logger id; storing the *resolved* level (not raw `logger.level`)
|
|
21824
|
+
// means a group-driven level shift fires listeners even when the logger's
|
|
21825
|
+
// own level is untouched.
|
|
21826
|
+
_resolvedLevelStore = {};
|
|
21827
|
+
// Adapter-known logger names. The adapter knows loggers by their original
|
|
21828
|
+
// name (e.g. `com.acme.payments`); the cache is keyed by the same string
|
|
21829
|
+
// since the TypeScript SDK does not normalize.
|
|
21830
|
+
_knownLoggerNames = /* @__PURE__ */ new Set();
|
|
21753
21831
|
/** @internal */
|
|
21754
21832
|
constructor(apiKey, ensureWs, timeout, baseUrl, extraHeaders) {
|
|
21755
21833
|
this._apiKey = apiKey;
|
|
@@ -21942,6 +22020,7 @@ var LoggingClient = class {
|
|
|
21942
22020
|
const loggers = adapter.discover();
|
|
21943
22021
|
for (const { name, level } of loggers) {
|
|
21944
22022
|
this._loggerBuffer.add(name, level, level, service, environment);
|
|
22023
|
+
this._knownLoggerNames.add(name);
|
|
21945
22024
|
discoveredCount++;
|
|
21946
22025
|
}
|
|
21947
22026
|
} catch {
|
|
@@ -21974,13 +22053,9 @@ var LoggingClient = class {
|
|
|
21974
22053
|
"api",
|
|
21975
22054
|
`fetched ${serverLoggers.length} logger(s) and ${serverGroups.length} group(s) from server`
|
|
21976
22055
|
);
|
|
21977
|
-
this.
|
|
21978
|
-
|
|
21979
|
-
|
|
21980
|
-
}
|
|
21981
|
-
for (const g of serverGroups) {
|
|
21982
|
-
this._groupStore[g.id] = g.level;
|
|
21983
|
-
}
|
|
22056
|
+
this._loggersCache = this._buildLoggersCache(serverLoggers);
|
|
22057
|
+
this._groupsCache = this._buildGroupsCache(serverGroups);
|
|
22058
|
+
this._applyLevels();
|
|
21984
22059
|
} catch {
|
|
21985
22060
|
}
|
|
21986
22061
|
this._wsManager = this._ensureWs();
|
|
@@ -22072,41 +22147,107 @@ var LoggingClient = class {
|
|
|
22072
22147
|
}
|
|
22073
22148
|
return adapters;
|
|
22074
22149
|
}
|
|
22075
|
-
/**
|
|
22076
|
-
|
|
22077
|
-
|
|
22078
|
-
|
|
22079
|
-
|
|
22080
|
-
|
|
22081
|
-
|
|
22082
|
-
|
|
22083
|
-
|
|
22084
|
-
|
|
22085
|
-
|
|
22150
|
+
/**
|
|
22151
|
+
* Refresh resolved levels and apply them to adapter-known loggers.
|
|
22152
|
+
*
|
|
22153
|
+
* Computes a resolved level (via {@link resolveLevel}) for every entry
|
|
22154
|
+
* currently in `_loggersCache` *and* every adapter-known logger name —
|
|
22155
|
+
* even loggers whose own `level` is `null`, because they may inherit
|
|
22156
|
+
* via group chain or dot-notation ancestry.
|
|
22157
|
+
*
|
|
22158
|
+
* The full resolved-level snapshot is stored in `_resolvedLevelStore`
|
|
22159
|
+
* so callers can diff pre-vs-post and fire change listeners on actual
|
|
22160
|
+
* effective-level deltas (group-driven changes included). Adapter pushes
|
|
22161
|
+
* only happen for adapter-known names where `managed !== false`.
|
|
22162
|
+
* @internal
|
|
22163
|
+
*/
|
|
22164
|
+
_applyLevels() {
|
|
22165
|
+
const environment = this._parent?._environment ?? "";
|
|
22166
|
+
const newResolved = {};
|
|
22167
|
+
for (const id of Object.keys(this._loggersCache)) {
|
|
22168
|
+
newResolved[id] = resolveLevel(id, environment, this._loggersCache, this._groupsCache);
|
|
22169
|
+
}
|
|
22170
|
+
for (const name of this._knownLoggerNames) {
|
|
22171
|
+
if (!(name in newResolved)) {
|
|
22172
|
+
newResolved[name] = resolveLevel(name, environment, this._loggersCache, this._groupsCache);
|
|
22086
22173
|
}
|
|
22087
|
-
|
|
22174
|
+
}
|
|
22175
|
+
this._resolvedLevelStore = newResolved;
|
|
22176
|
+
for (const name of this._knownLoggerNames) {
|
|
22177
|
+
const resolved = newResolved[name];
|
|
22088
22178
|
const metrics = this._parent?._metrics;
|
|
22089
22179
|
if (metrics) {
|
|
22090
|
-
metrics.record("logging.level_changes", 1, "changes", { logger:
|
|
22180
|
+
metrics.record("logging.level_changes", 1, "changes", { logger: name });
|
|
22091
22181
|
}
|
|
22092
22182
|
for (const adapter of this._adapters) {
|
|
22093
22183
|
try {
|
|
22094
|
-
debug("adapter", `setLevel(${
|
|
22095
|
-
adapter.applyLevel(
|
|
22184
|
+
debug("adapter", `setLevel(${name}, ${resolved})`);
|
|
22185
|
+
adapter.applyLevel(name, resolved);
|
|
22096
22186
|
} catch {
|
|
22097
22187
|
}
|
|
22098
22188
|
}
|
|
22099
22189
|
}
|
|
22100
22190
|
}
|
|
22191
|
+
/** @internal Convert a server Logger list into the resolution cache. */
|
|
22192
|
+
_buildLoggersCache(loggers) {
|
|
22193
|
+
const out = {};
|
|
22194
|
+
for (const l of loggers) {
|
|
22195
|
+
if (l.id === null) continue;
|
|
22196
|
+
out[l.id] = this._loggerToCacheEntry(l);
|
|
22197
|
+
}
|
|
22198
|
+
return out;
|
|
22199
|
+
}
|
|
22200
|
+
/** @internal Convert a server LogGroup list into the resolution cache. */
|
|
22201
|
+
_buildGroupsCache(groups) {
|
|
22202
|
+
const out = {};
|
|
22203
|
+
for (const g of groups) {
|
|
22204
|
+
if (g.id === null) continue;
|
|
22205
|
+
out[g.id] = this._groupToCacheEntry(g);
|
|
22206
|
+
}
|
|
22207
|
+
return out;
|
|
22208
|
+
}
|
|
22209
|
+
/** @internal */
|
|
22210
|
+
_loggerToCacheEntry(l) {
|
|
22211
|
+
return {
|
|
22212
|
+
level: l.level ?? null,
|
|
22213
|
+
group: l.group ?? null,
|
|
22214
|
+
managed: l.managed ?? null,
|
|
22215
|
+
environments: l.environments ?? null
|
|
22216
|
+
};
|
|
22217
|
+
}
|
|
22218
|
+
/** @internal */
|
|
22219
|
+
_groupToCacheEntry(g) {
|
|
22220
|
+
return {
|
|
22221
|
+
level: g.level ?? null,
|
|
22222
|
+
group: g.group ?? null,
|
|
22223
|
+
environments: g.environments ?? null
|
|
22224
|
+
};
|
|
22225
|
+
}
|
|
22101
22226
|
/** Called by adapter hooks when a new logger is created in the framework. */
|
|
22102
22227
|
_onAdapterNewLogger(name, level) {
|
|
22103
22228
|
debug("discovery", `new logger intercepted at runtime: ${name}`);
|
|
22104
22229
|
const service = this._parent?._service ?? null;
|
|
22105
22230
|
const environment = this._parent?._environment ?? null;
|
|
22106
22231
|
this._loggerBuffer.add(name, level, level, service, environment);
|
|
22232
|
+
this._knownLoggerNames.add(name);
|
|
22107
22233
|
if (this._loggerBuffer.pendingCount >= 50) {
|
|
22108
22234
|
void this._flushLoggerBuffer();
|
|
22109
22235
|
}
|
|
22236
|
+
if (this._started) {
|
|
22237
|
+
const resolved = resolveLevel(
|
|
22238
|
+
name,
|
|
22239
|
+
this._parent?._environment ?? "",
|
|
22240
|
+
this._loggersCache,
|
|
22241
|
+
this._groupsCache
|
|
22242
|
+
);
|
|
22243
|
+
this._resolvedLevelStore[name] = resolved;
|
|
22244
|
+
for (const adapter of this._adapters) {
|
|
22245
|
+
try {
|
|
22246
|
+
adapter.applyLevel(name, resolved);
|
|
22247
|
+
} catch {
|
|
22248
|
+
}
|
|
22249
|
+
}
|
|
22250
|
+
}
|
|
22110
22251
|
}
|
|
22111
22252
|
/** Flush buffered loggers to the bulk-register endpoint. */
|
|
22112
22253
|
async _flushLoggerBuffer() {
|
|
@@ -22140,33 +22281,14 @@ var LoggingClient = class {
|
|
|
22140
22281
|
const id = data.id;
|
|
22141
22282
|
if (!id) return;
|
|
22142
22283
|
void this._fetchSingleLogger(id).then((logger) => {
|
|
22143
|
-
const
|
|
22144
|
-
|
|
22145
|
-
|
|
22146
|
-
|
|
22147
|
-
|
|
22148
|
-
this._applyLevels([logger]);
|
|
22149
|
-
}
|
|
22150
|
-
const event = new LoggerChangeEvent({
|
|
22151
|
-
id,
|
|
22152
|
-
level: newLevel,
|
|
22153
|
-
source: "websocket"
|
|
22154
|
-
});
|
|
22155
|
-
for (const cb of this._globalListeners) {
|
|
22156
|
-
try {
|
|
22157
|
-
cb(event);
|
|
22158
|
-
} catch {
|
|
22159
|
-
}
|
|
22160
|
-
}
|
|
22161
|
-
const idCallbacks = this._keyListeners.get(id);
|
|
22162
|
-
if (idCallbacks) {
|
|
22163
|
-
for (const cb of idCallbacks) {
|
|
22164
|
-
try {
|
|
22165
|
-
cb(event);
|
|
22166
|
-
} catch {
|
|
22167
|
-
}
|
|
22168
|
-
}
|
|
22284
|
+
const preResolved = { ...this._resolvedLevelStore };
|
|
22285
|
+
if (logger !== null) {
|
|
22286
|
+
this._loggersCache[id] = this._loggerToCacheEntry(logger);
|
|
22287
|
+
} else {
|
|
22288
|
+
delete this._loggersCache[id];
|
|
22169
22289
|
}
|
|
22290
|
+
this._applyLevels();
|
|
22291
|
+
this._fireDeltas(preResolved, this._resolvedLevelStore, "websocket");
|
|
22170
22292
|
}).catch((err) => {
|
|
22171
22293
|
debug(
|
|
22172
22294
|
"websocket",
|
|
@@ -22178,50 +22300,25 @@ var LoggingClient = class {
|
|
|
22178
22300
|
debug("websocket", `logger_deleted event received: ${JSON.stringify(data)}`);
|
|
22179
22301
|
const id = data.id;
|
|
22180
22302
|
if (!id) return;
|
|
22181
|
-
delete this.
|
|
22182
|
-
const
|
|
22183
|
-
|
|
22184
|
-
|
|
22185
|
-
|
|
22186
|
-
deleted: true
|
|
22187
|
-
});
|
|
22188
|
-
for (const cb of this._globalListeners) {
|
|
22189
|
-
try {
|
|
22190
|
-
cb(event);
|
|
22191
|
-
} catch (err) {
|
|
22192
|
-
debug(
|
|
22193
|
-
"websocket",
|
|
22194
|
-
`logger_deleted listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
22195
|
-
);
|
|
22196
|
-
}
|
|
22197
|
-
}
|
|
22198
|
-
const idCallbacks = this._keyListeners.get(id);
|
|
22199
|
-
if (idCallbacks) {
|
|
22200
|
-
for (const cb of idCallbacks) {
|
|
22201
|
-
try {
|
|
22202
|
-
cb(event);
|
|
22203
|
-
} catch (err) {
|
|
22204
|
-
debug(
|
|
22205
|
-
"websocket",
|
|
22206
|
-
`logger_deleted key listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
22207
|
-
);
|
|
22208
|
-
}
|
|
22209
|
-
}
|
|
22210
|
-
}
|
|
22303
|
+
delete this._loggersCache[id];
|
|
22304
|
+
const preResolved = { ...this._resolvedLevelStore };
|
|
22305
|
+
this._applyLevels();
|
|
22306
|
+
this._emitDeletedEvent(id, "websocket");
|
|
22307
|
+
this._fireDeltas(preResolved, this._resolvedLevelStore, "websocket", /* @__PURE__ */ new Set([id]));
|
|
22211
22308
|
};
|
|
22212
22309
|
_handleGroupChanged = (data) => {
|
|
22213
22310
|
debug("websocket", `group_changed event received: ${JSON.stringify(data)}`);
|
|
22214
22311
|
const id = data.id;
|
|
22215
22312
|
if (!id) return;
|
|
22216
22313
|
void this._fetchSingleGroup(id).then((group) => {
|
|
22217
|
-
const
|
|
22218
|
-
|
|
22219
|
-
|
|
22220
|
-
|
|
22221
|
-
|
|
22222
|
-
|
|
22223
|
-
|
|
22224
|
-
|
|
22314
|
+
const preResolved = { ...this._resolvedLevelStore };
|
|
22315
|
+
if (group !== null) {
|
|
22316
|
+
this._groupsCache[id] = this._groupToCacheEntry(group);
|
|
22317
|
+
} else {
|
|
22318
|
+
delete this._groupsCache[id];
|
|
22319
|
+
}
|
|
22320
|
+
this._applyLevels();
|
|
22321
|
+
this._fireDeltas(preResolved, this._resolvedLevelStore, "websocket");
|
|
22225
22322
|
}).catch((err) => {
|
|
22226
22323
|
debug(
|
|
22227
22324
|
"websocket",
|
|
@@ -22233,11 +22330,68 @@ var LoggingClient = class {
|
|
|
22233
22330
|
debug("websocket", `group_deleted event received: ${JSON.stringify(data)}`);
|
|
22234
22331
|
const id = data.id;
|
|
22235
22332
|
if (!id) return;
|
|
22236
|
-
delete this.
|
|
22333
|
+
delete this._groupsCache[id];
|
|
22334
|
+
const preResolved = { ...this._resolvedLevelStore };
|
|
22335
|
+
this._applyLevels();
|
|
22336
|
+
this._emitDeletedEvent(id, "websocket");
|
|
22337
|
+
this._fireDeltas(preResolved, this._resolvedLevelStore, "websocket", /* @__PURE__ */ new Set([id]));
|
|
22338
|
+
};
|
|
22339
|
+
/**
|
|
22340
|
+
* @internal Fire change listeners for every logger whose resolved level
|
|
22341
|
+
* changed between `pre` and `post`. Stores resolved levels, not raw
|
|
22342
|
+
* `logger.level`, so a group-driven change actually fires. Keys that
|
|
22343
|
+
* disappeared from `post` are emitted with `deleted: true`.
|
|
22344
|
+
*/
|
|
22345
|
+
_fireDeltas(pre, post, source, excludeIds) {
|
|
22346
|
+
const changed = [];
|
|
22347
|
+
const allKeys = /* @__PURE__ */ new Set([...Object.keys(pre), ...Object.keys(post)]);
|
|
22348
|
+
for (const k of allKeys) {
|
|
22349
|
+
if (excludeIds?.has(k)) continue;
|
|
22350
|
+
if (pre[k] !== post[k]) changed.push(k);
|
|
22351
|
+
}
|
|
22352
|
+
if (changed.length === 0) return;
|
|
22353
|
+
const buildEvent = (id) => {
|
|
22354
|
+
const isDeletion = id in pre && !(id in post);
|
|
22355
|
+
const fields = {
|
|
22356
|
+
id,
|
|
22357
|
+
source,
|
|
22358
|
+
level: post[id] ?? null
|
|
22359
|
+
};
|
|
22360
|
+
if (isDeletion) fields.deleted = true;
|
|
22361
|
+
return new LoggerChangeEvent(fields);
|
|
22362
|
+
};
|
|
22363
|
+
const firstKey = changed[0];
|
|
22364
|
+
const globalEvent = buildEvent(firstKey);
|
|
22365
|
+
for (const cb of this._globalListeners) {
|
|
22366
|
+
try {
|
|
22367
|
+
cb(globalEvent);
|
|
22368
|
+
} catch {
|
|
22369
|
+
}
|
|
22370
|
+
}
|
|
22371
|
+
for (const k of changed) {
|
|
22372
|
+
const keyCallbacks = this._keyListeners.get(k);
|
|
22373
|
+
if (keyCallbacks) {
|
|
22374
|
+
const event = buildEvent(k);
|
|
22375
|
+
for (const cb of keyCallbacks) {
|
|
22376
|
+
try {
|
|
22377
|
+
cb(event);
|
|
22378
|
+
} catch {
|
|
22379
|
+
}
|
|
22380
|
+
}
|
|
22381
|
+
}
|
|
22382
|
+
}
|
|
22383
|
+
}
|
|
22384
|
+
/**
|
|
22385
|
+
* @internal Always emit a deleted event for `id` on global and per-key
|
|
22386
|
+
* listeners. Used by `logger_deleted` / `group_deleted` handlers to
|
|
22387
|
+
* preserve the explicit notification contract even when nothing in the
|
|
22388
|
+
* resolved-level store changed (e.g. server removed an unknown logger).
|
|
22389
|
+
*/
|
|
22390
|
+
_emitDeletedEvent(id, source) {
|
|
22237
22391
|
const event = new LoggerChangeEvent({
|
|
22238
22392
|
id,
|
|
22239
22393
|
level: null,
|
|
22240
|
-
source
|
|
22394
|
+
source,
|
|
22241
22395
|
deleted: true
|
|
22242
22396
|
});
|
|
22243
22397
|
for (const cb of this._globalListeners) {
|
|
@@ -22246,7 +22400,7 @@ var LoggingClient = class {
|
|
|
22246
22400
|
} catch (err) {
|
|
22247
22401
|
debug(
|
|
22248
22402
|
"websocket",
|
|
22249
|
-
`
|
|
22403
|
+
`deleted listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
22250
22404
|
);
|
|
22251
22405
|
}
|
|
22252
22406
|
}
|
|
@@ -22258,22 +22412,22 @@ var LoggingClient = class {
|
|
|
22258
22412
|
} catch (err) {
|
|
22259
22413
|
debug(
|
|
22260
22414
|
"websocket",
|
|
22261
|
-
`
|
|
22415
|
+
`deleted key listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
22262
22416
|
);
|
|
22263
22417
|
}
|
|
22264
22418
|
}
|
|
22265
22419
|
}
|
|
22266
|
-
}
|
|
22420
|
+
}
|
|
22267
22421
|
_handleLoggersChanged = (_data) => {
|
|
22268
22422
|
debug("websocket", `loggers_changed event received`);
|
|
22269
22423
|
void this._resolveAndFire("websocket").catch(() => {
|
|
22270
22424
|
});
|
|
22271
22425
|
};
|
|
22272
22426
|
/**
|
|
22273
|
-
* Full refetch of loggers + log_groups,
|
|
22274
|
-
*
|
|
22275
|
-
*
|
|
22276
|
-
*
|
|
22427
|
+
* Full refetch of loggers + log_groups, rebuild the caches, re-resolve
|
|
22428
|
+
* every adapter-known logger, and fire change listeners on resolved-level
|
|
22429
|
+
* deltas. Shared between the `loggers_changed` WS handler and the
|
|
22430
|
+
* public `refresh()` method.
|
|
22277
22431
|
* @internal
|
|
22278
22432
|
*/
|
|
22279
22433
|
async _resolveAndFire(source) {
|
|
@@ -22282,58 +22436,12 @@ var LoggingClient = class {
|
|
|
22282
22436
|
this._listLogGroups()
|
|
22283
22437
|
]);
|
|
22284
22438
|
debug("resolution", `resolution pass (trigger: ${source})`);
|
|
22285
|
-
const
|
|
22286
|
-
|
|
22287
|
-
|
|
22288
|
-
|
|
22289
|
-
|
|
22290
|
-
|
|
22291
|
-
if (oldLevel !== newLevel || !(key in this._loggerStore)) {
|
|
22292
|
-
changedLoggerIds.add(key);
|
|
22293
|
-
this._loggerStore[key] = newLevel;
|
|
22294
|
-
}
|
|
22295
|
-
}
|
|
22296
|
-
for (const key of Object.keys(this._loggerStore)) {
|
|
22297
|
-
if (!newLoggerKeys.has(key)) {
|
|
22298
|
-
changedLoggerIds.add(key);
|
|
22299
|
-
delete this._loggerStore[key];
|
|
22300
|
-
}
|
|
22301
|
-
}
|
|
22302
|
-
for (const group of serverGroups) {
|
|
22303
|
-
this._groupStore[group.id] = group.level ?? null;
|
|
22304
|
-
}
|
|
22305
|
-
this._applyLevels(serverLoggers);
|
|
22306
|
-
if (changedLoggerIds.size === 0) return;
|
|
22307
|
-
const [firstKey] = changedLoggerIds;
|
|
22308
|
-
const firstLogger = serverLoggers.find((l) => l.id === firstKey);
|
|
22309
|
-
const globalEvent = new LoggerChangeEvent({
|
|
22310
|
-
id: firstKey,
|
|
22311
|
-
level: firstLogger?.level ?? null,
|
|
22312
|
-
source
|
|
22313
|
-
});
|
|
22314
|
-
for (const cb of this._globalListeners) {
|
|
22315
|
-
try {
|
|
22316
|
-
cb(globalEvent);
|
|
22317
|
-
} catch {
|
|
22318
|
-
}
|
|
22319
|
-
}
|
|
22320
|
-
for (const key of changedLoggerIds) {
|
|
22321
|
-
const keyCallbacks = this._keyListeners.get(key);
|
|
22322
|
-
if (keyCallbacks) {
|
|
22323
|
-
const l = serverLoggers.find((x) => x.id === key);
|
|
22324
|
-
const keyEvent = new LoggerChangeEvent({
|
|
22325
|
-
id: key,
|
|
22326
|
-
level: l?.level ?? null,
|
|
22327
|
-
source
|
|
22328
|
-
});
|
|
22329
|
-
for (const cb of keyCallbacks) {
|
|
22330
|
-
try {
|
|
22331
|
-
cb(keyEvent);
|
|
22332
|
-
} catch {
|
|
22333
|
-
}
|
|
22334
|
-
}
|
|
22335
|
-
}
|
|
22336
|
-
}
|
|
22439
|
+
const preResolved = { ...this._resolvedLevelStore };
|
|
22440
|
+
this._loggersCache = this._buildLoggersCache(serverLoggers);
|
|
22441
|
+
this._groupsCache = this._buildGroupsCache(serverGroups);
|
|
22442
|
+
this._resolvedLevelStore = {};
|
|
22443
|
+
this._applyLevels();
|
|
22444
|
+
this._fireDeltas(preResolved, this._resolvedLevelStore, source);
|
|
22337
22445
|
}
|
|
22338
22446
|
// ------------------------------------------------------------------
|
|
22339
22447
|
// Internal: single-resource fetchers
|