@smplkit/sdk 3.0.48 → 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 +486 -206
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +136 -17
- package/dist/index.d.ts +136 -17
- package/dist/index.js +486 -206
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
}
|
|
@@ -17742,18 +17745,43 @@ var ConfigClient = class {
|
|
|
17742
17745
|
* (set via `_resolveManagement`) so runtime + management share one HTTP
|
|
17743
17746
|
* client; falls back to a direct GET when running without `SmplClient`
|
|
17744
17747
|
* bootstrap (e.g. unit tests that construct `ConfigClient` directly).
|
|
17748
|
+
*
|
|
17749
|
+
* Pages through the server until a short page (less than the requested
|
|
17750
|
+
* size) is returned — accounts with more than 1000 configs would
|
|
17751
|
+
* otherwise silently lose everything past page one.
|
|
17745
17752
|
*/
|
|
17746
17753
|
async _listConfigs() {
|
|
17747
|
-
|
|
17748
|
-
|
|
17749
|
-
|
|
17750
|
-
|
|
17751
|
-
|
|
17752
|
-
|
|
17754
|
+
const PAGE_SIZE = 1e3;
|
|
17755
|
+
const all = [];
|
|
17756
|
+
let page = 1;
|
|
17757
|
+
let lastPageWasFull = true;
|
|
17758
|
+
while (lastPageWasFull) {
|
|
17759
|
+
let rows;
|
|
17760
|
+
if (this._resolveManagement) {
|
|
17761
|
+
rows = await this._resolveManagement().config.list({
|
|
17762
|
+
pageNumber: page,
|
|
17763
|
+
pageSize: PAGE_SIZE
|
|
17764
|
+
});
|
|
17765
|
+
} else {
|
|
17766
|
+
const result = await this._http.GET("/api/v1/configs", {
|
|
17767
|
+
params: {
|
|
17768
|
+
query: {
|
|
17769
|
+
"page[number]": page,
|
|
17770
|
+
"page[size]": PAGE_SIZE
|
|
17771
|
+
}
|
|
17772
|
+
}
|
|
17773
|
+
});
|
|
17774
|
+
if (!result.response.ok) {
|
|
17775
|
+
throw new SmplError(`Failed to list configs: ${result.response.status}`);
|
|
17776
|
+
}
|
|
17777
|
+
const data = result.data;
|
|
17778
|
+
rows = data ? data.data.map((r) => resourceToConfig(r)) : [];
|
|
17779
|
+
}
|
|
17780
|
+
all.push(...rows);
|
|
17781
|
+
lastPageWasFull = rows.length === PAGE_SIZE;
|
|
17782
|
+
page++;
|
|
17753
17783
|
}
|
|
17754
|
-
|
|
17755
|
-
if (!data) return [];
|
|
17756
|
-
return data.data.map((r) => resourceToConfig(r));
|
|
17784
|
+
return all;
|
|
17757
17785
|
}
|
|
17758
17786
|
// ------------------------------------------------------------------
|
|
17759
17787
|
// Runtime: lazy initialization
|
|
@@ -18747,11 +18775,23 @@ var ManagementConfigClient = class {
|
|
|
18747
18775
|
updatedAt: null
|
|
18748
18776
|
});
|
|
18749
18777
|
}
|
|
18750
|
-
/**
|
|
18751
|
-
|
|
18778
|
+
/**
|
|
18779
|
+
* List configs.
|
|
18780
|
+
*
|
|
18781
|
+
* Server defaults are `pageNumber=1`, `pageSize=1000` (capped at 1000).
|
|
18782
|
+
* Omit both to fetch the first page; pass them through to walk further
|
|
18783
|
+
* pages. The wrapper does not loop on the customer's behalf — the
|
|
18784
|
+
* customer chooses how to paginate.
|
|
18785
|
+
*/
|
|
18786
|
+
async list(params = {}) {
|
|
18787
|
+
const query = {};
|
|
18788
|
+
if (params.pageNumber !== void 0) query["page[number]"] = params.pageNumber;
|
|
18789
|
+
if (params.pageSize !== void 0) query["page[size]"] = params.pageSize;
|
|
18752
18790
|
let data;
|
|
18753
18791
|
try {
|
|
18754
|
-
const result = await this._http.GET("/api/v1/configs", {
|
|
18792
|
+
const result = await this._http.GET("/api/v1/configs", {
|
|
18793
|
+
params: { query }
|
|
18794
|
+
});
|
|
18755
18795
|
if (!result.response.ok) await checkError(result.response);
|
|
18756
18796
|
data = result.data;
|
|
18757
18797
|
} catch (err) {
|
|
@@ -19045,11 +19085,23 @@ var ManagementFlagsClient = class {
|
|
|
19045
19085
|
}
|
|
19046
19086
|
return resourceToFlag(data.data, this);
|
|
19047
19087
|
}
|
|
19048
|
-
/**
|
|
19049
|
-
|
|
19088
|
+
/**
|
|
19089
|
+
* List flags.
|
|
19090
|
+
*
|
|
19091
|
+
* Server defaults are `pageNumber=1`, `pageSize=1000` (capped at 1000).
|
|
19092
|
+
* Omit both to fetch the first page; pass them through to walk further
|
|
19093
|
+
* pages. The wrapper does not loop on the customer's behalf — the
|
|
19094
|
+
* customer chooses how to paginate.
|
|
19095
|
+
*/
|
|
19096
|
+
async list(params = {}) {
|
|
19097
|
+
const query = {};
|
|
19098
|
+
if (params.pageNumber !== void 0) query["page[number]"] = params.pageNumber;
|
|
19099
|
+
if (params.pageSize !== void 0) query["page[size]"] = params.pageSize;
|
|
19050
19100
|
let data;
|
|
19051
19101
|
try {
|
|
19052
|
-
const result = await this._http.GET("/api/v1/flags", {
|
|
19102
|
+
const result = await this._http.GET("/api/v1/flags", {
|
|
19103
|
+
params: { query }
|
|
19104
|
+
});
|
|
19053
19105
|
if (!result.response.ok) await checkError2(result.response);
|
|
19054
19106
|
data = result.data;
|
|
19055
19107
|
} catch (err) {
|
|
@@ -19574,10 +19626,23 @@ var LoggersClient = class {
|
|
|
19574
19626
|
updatedAt: null
|
|
19575
19627
|
});
|
|
19576
19628
|
}
|
|
19577
|
-
|
|
19629
|
+
/**
|
|
19630
|
+
* List loggers.
|
|
19631
|
+
*
|
|
19632
|
+
* Server defaults are `pageNumber=1`, `pageSize=1000` (capped at 1000).
|
|
19633
|
+
* Omit both to fetch the first page; pass them through to walk further
|
|
19634
|
+
* pages. The wrapper does not loop on the customer's behalf — the
|
|
19635
|
+
* customer chooses how to paginate.
|
|
19636
|
+
*/
|
|
19637
|
+
async list(params = {}) {
|
|
19638
|
+
const query = {};
|
|
19639
|
+
if (params.pageNumber !== void 0) query["page[number]"] = params.pageNumber;
|
|
19640
|
+
if (params.pageSize !== void 0) query["page[size]"] = params.pageSize;
|
|
19578
19641
|
let data;
|
|
19579
19642
|
try {
|
|
19580
|
-
const result = await this._http.GET("/api/v1/loggers", {
|
|
19643
|
+
const result = await this._http.GET("/api/v1/loggers", {
|
|
19644
|
+
params: { query }
|
|
19645
|
+
});
|
|
19581
19646
|
if (!result.response.ok) await checkError3(result.response);
|
|
19582
19647
|
data = result.data;
|
|
19583
19648
|
} catch (err) {
|
|
@@ -19679,10 +19744,23 @@ var LogGroupsClient = class {
|
|
|
19679
19744
|
updatedAt: null
|
|
19680
19745
|
});
|
|
19681
19746
|
}
|
|
19682
|
-
|
|
19747
|
+
/**
|
|
19748
|
+
* List log groups.
|
|
19749
|
+
*
|
|
19750
|
+
* Server defaults are `pageNumber=1`, `pageSize=1000` (capped at 1000).
|
|
19751
|
+
* Omit both to fetch the first page; pass them through to walk further
|
|
19752
|
+
* pages. The wrapper does not loop on the customer's behalf — the
|
|
19753
|
+
* customer chooses how to paginate.
|
|
19754
|
+
*/
|
|
19755
|
+
async list(params = {}) {
|
|
19756
|
+
const query = {};
|
|
19757
|
+
if (params.pageNumber !== void 0) query["page[number]"] = params.pageNumber;
|
|
19758
|
+
if (params.pageSize !== void 0) query["page[size]"] = params.pageSize;
|
|
19683
19759
|
let data;
|
|
19684
19760
|
try {
|
|
19685
|
-
const result = await this._http.GET("/api/v1/log_groups", {
|
|
19761
|
+
const result = await this._http.GET("/api/v1/log_groups", {
|
|
19762
|
+
params: { query }
|
|
19763
|
+
});
|
|
19686
19764
|
if (!result.response.ok) await checkError3(result.response);
|
|
19687
19765
|
data = result.data;
|
|
19688
19766
|
} catch (err) {
|
|
@@ -20167,10 +20245,23 @@ var EnvironmentsClient = class {
|
|
|
20167
20245
|
updatedAt: null
|
|
20168
20246
|
});
|
|
20169
20247
|
}
|
|
20170
|
-
|
|
20248
|
+
/**
|
|
20249
|
+
* List environments.
|
|
20250
|
+
*
|
|
20251
|
+
* Server defaults are `pageNumber=1`, `pageSize=1000` (capped at 1000).
|
|
20252
|
+
* Omit both to fetch the first page; pass them through to walk further
|
|
20253
|
+
* pages. The wrapper does not loop on the customer's behalf — the
|
|
20254
|
+
* customer chooses how to paginate.
|
|
20255
|
+
*/
|
|
20256
|
+
async list(params = {}) {
|
|
20257
|
+
const query = {};
|
|
20258
|
+
if (params.pageNumber !== void 0) query["page[number]"] = params.pageNumber;
|
|
20259
|
+
if (params.pageSize !== void 0) query["page[size]"] = params.pageSize;
|
|
20171
20260
|
let data;
|
|
20172
20261
|
try {
|
|
20173
|
-
const result = await this._http.GET("/api/v1/environments", {
|
|
20262
|
+
const result = await this._http.GET("/api/v1/environments", {
|
|
20263
|
+
params: { query }
|
|
20264
|
+
});
|
|
20174
20265
|
if (!result.response.ok) await checkError5(result.response);
|
|
20175
20266
|
data = result.data;
|
|
20176
20267
|
} catch (err) {
|
|
@@ -20278,10 +20369,23 @@ var ContextTypesClient = class {
|
|
|
20278
20369
|
updatedAt: null
|
|
20279
20370
|
});
|
|
20280
20371
|
}
|
|
20281
|
-
|
|
20372
|
+
/**
|
|
20373
|
+
* List context types.
|
|
20374
|
+
*
|
|
20375
|
+
* Server defaults are `pageNumber=1`, `pageSize=1000` (capped at 1000).
|
|
20376
|
+
* Omit both to fetch the first page; pass them through to walk further
|
|
20377
|
+
* pages. The wrapper does not loop on the customer's behalf — the
|
|
20378
|
+
* customer chooses how to paginate.
|
|
20379
|
+
*/
|
|
20380
|
+
async list(params = {}) {
|
|
20381
|
+
const query = {};
|
|
20382
|
+
if (params.pageNumber !== void 0) query["page[number]"] = params.pageNumber;
|
|
20383
|
+
if (params.pageSize !== void 0) query["page[size]"] = params.pageSize;
|
|
20282
20384
|
let data;
|
|
20283
20385
|
try {
|
|
20284
|
-
const result = await this._http.GET("/api/v1/context_types", {
|
|
20386
|
+
const result = await this._http.GET("/api/v1/context_types", {
|
|
20387
|
+
params: { query }
|
|
20388
|
+
});
|
|
20285
20389
|
if (!result.response.ok) await checkError5(result.response);
|
|
20286
20390
|
data = result.data;
|
|
20287
20391
|
} catch (err) {
|
|
@@ -20447,12 +20551,22 @@ var ContextsClient = class {
|
|
|
20447
20551
|
get pendingCount() {
|
|
20448
20552
|
return this._buffer.pendingCount;
|
|
20449
20553
|
}
|
|
20450
|
-
/**
|
|
20451
|
-
|
|
20554
|
+
/**
|
|
20555
|
+
* List contexts of a given type.
|
|
20556
|
+
*
|
|
20557
|
+
* Server defaults are `pageNumber=1`, `pageSize=1000` (capped at 1000).
|
|
20558
|
+
* Omit both to fetch the first page; pass them through to walk further
|
|
20559
|
+
* pages. The wrapper does not loop on the customer's behalf — the
|
|
20560
|
+
* customer chooses how to paginate.
|
|
20561
|
+
*/
|
|
20562
|
+
async list(type, params = {}) {
|
|
20563
|
+
const query = { "filter[context_type]": type };
|
|
20564
|
+
if (params.pageNumber !== void 0) query["page[number]"] = params.pageNumber;
|
|
20565
|
+
if (params.pageSize !== void 0) query["page[size]"] = params.pageSize;
|
|
20452
20566
|
let data;
|
|
20453
20567
|
try {
|
|
20454
20568
|
const result = await this._http.GET("/api/v1/contexts", {
|
|
20455
|
-
params: { query
|
|
20569
|
+
params: { query }
|
|
20456
20570
|
});
|
|
20457
20571
|
if (!result.response.ok) await checkError5(result.response);
|
|
20458
20572
|
data = result.data;
|
|
@@ -21483,19 +21597,34 @@ var FlagsClient = class {
|
|
|
21483
21597
|
}
|
|
21484
21598
|
}
|
|
21485
21599
|
async _fetchFlagsList() {
|
|
21486
|
-
|
|
21487
|
-
|
|
21488
|
-
|
|
21489
|
-
|
|
21490
|
-
|
|
21491
|
-
|
|
21492
|
-
|
|
21493
|
-
|
|
21600
|
+
const PAGE_SIZE = 1e3;
|
|
21601
|
+
const all = [];
|
|
21602
|
+
let page = 1;
|
|
21603
|
+
let lastPageWasFull = true;
|
|
21604
|
+
while (lastPageWasFull) {
|
|
21605
|
+
debug("api", `GET /api/v1/flags?page[number]=${page}&page[size]=${PAGE_SIZE}`);
|
|
21606
|
+
let data;
|
|
21607
|
+
try {
|
|
21608
|
+
const result = await this._http.GET("/api/v1/flags", {
|
|
21609
|
+
params: {
|
|
21610
|
+
query: {
|
|
21611
|
+
"page[number]": page,
|
|
21612
|
+
"page[size]": PAGE_SIZE
|
|
21613
|
+
}
|
|
21614
|
+
}
|
|
21615
|
+
});
|
|
21616
|
+
if (!result.response.ok) await checkError6(result.response, "Failed to list flags");
|
|
21617
|
+
data = result.data;
|
|
21618
|
+
} catch (err) {
|
|
21619
|
+
wrapFetchError6(err);
|
|
21620
|
+
}
|
|
21621
|
+
const rows = data?.data ?? [];
|
|
21622
|
+
for (const r of rows) all.push(this._resourceToPlainDict(r));
|
|
21623
|
+
lastPageWasFull = rows.length === PAGE_SIZE;
|
|
21624
|
+
page++;
|
|
21494
21625
|
}
|
|
21495
|
-
|
|
21496
|
-
|
|
21497
|
-
debug("api", `GET /api/v1/flags -> ${flags.length} flag(s)`);
|
|
21498
|
-
return flags;
|
|
21626
|
+
debug("api", `GET /api/v1/flags -> ${all.length} flag(s)`);
|
|
21627
|
+
return all;
|
|
21499
21628
|
}
|
|
21500
21629
|
// ------------------------------------------------------------------
|
|
21501
21630
|
// Internal: change listeners
|
|
@@ -21578,6 +21707,72 @@ var FlagsClient = class {
|
|
|
21578
21707
|
|
|
21579
21708
|
// src/logging/client.ts
|
|
21580
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
|
|
21581
21776
|
var LOGGING_BASE_URL = "https://logging.smplkit.com";
|
|
21582
21777
|
var LoggerRegistrationBuffer2 = class {
|
|
21583
21778
|
_seen = /* @__PURE__ */ new Set();
|
|
@@ -21619,11 +21814,20 @@ var LoggingClient = class {
|
|
|
21619
21814
|
_explicitAdapters = false;
|
|
21620
21815
|
_loggerBuffer = new LoggerRegistrationBuffer2();
|
|
21621
21816
|
_loggerFlushTimer = null;
|
|
21622
|
-
//
|
|
21623
|
-
|
|
21624
|
-
//
|
|
21625
|
-
|
|
21626
|
-
|
|
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();
|
|
21627
21831
|
/** @internal */
|
|
21628
21832
|
constructor(apiKey, ensureWs, timeout, baseUrl, extraHeaders) {
|
|
21629
21833
|
this._apiKey = apiKey;
|
|
@@ -21678,29 +21882,75 @@ var LoggingClient = class {
|
|
|
21678
21882
|
* (set via `_resolveManagement`); falls back to a direct GET when running
|
|
21679
21883
|
* without `SmplClient` bootstrap (e.g. unit tests that construct
|
|
21680
21884
|
* `LoggingClient` directly).
|
|
21885
|
+
*
|
|
21886
|
+
* Pages through the server until a short page (less than the requested
|
|
21887
|
+
* size) is returned — accounts with more than 1000 loggers would
|
|
21888
|
+
* otherwise silently lose everything past page one.
|
|
21681
21889
|
*/
|
|
21682
21890
|
async _listLoggers() {
|
|
21683
|
-
|
|
21684
|
-
|
|
21685
|
-
|
|
21686
|
-
|
|
21687
|
-
|
|
21688
|
-
|
|
21891
|
+
const PAGE_SIZE = 1e3;
|
|
21892
|
+
const all = [];
|
|
21893
|
+
let page = 1;
|
|
21894
|
+
let lastPageWasFull = true;
|
|
21895
|
+
while (lastPageWasFull) {
|
|
21896
|
+
let rows;
|
|
21897
|
+
if (this._resolveManagement) {
|
|
21898
|
+
rows = await this._resolveManagement().loggers.list({
|
|
21899
|
+
pageNumber: page,
|
|
21900
|
+
pageSize: PAGE_SIZE
|
|
21901
|
+
});
|
|
21902
|
+
} else {
|
|
21903
|
+
const result = await this._http.GET("/api/v1/loggers", {
|
|
21904
|
+
params: {
|
|
21905
|
+
query: {
|
|
21906
|
+
"page[number]": page,
|
|
21907
|
+
"page[size]": PAGE_SIZE
|
|
21908
|
+
}
|
|
21909
|
+
}
|
|
21910
|
+
});
|
|
21911
|
+
if (result.error !== void 0) {
|
|
21912
|
+
throw new SmplError(`Failed to list loggers: ${result.response.status}`);
|
|
21913
|
+
}
|
|
21914
|
+
rows = result.data ? result.data.data.map((r) => this._loggerToModel(r)) : [];
|
|
21915
|
+
}
|
|
21916
|
+
all.push(...rows);
|
|
21917
|
+
lastPageWasFull = rows.length === PAGE_SIZE;
|
|
21918
|
+
page++;
|
|
21689
21919
|
}
|
|
21690
|
-
|
|
21691
|
-
return result.data.data.map((r) => this._loggerToModel(r));
|
|
21920
|
+
return all;
|
|
21692
21921
|
}
|
|
21693
21922
|
/** @internal — see {@link _listLoggers}. */
|
|
21694
21923
|
async _listLogGroups() {
|
|
21695
|
-
|
|
21696
|
-
|
|
21697
|
-
|
|
21698
|
-
|
|
21699
|
-
|
|
21700
|
-
|
|
21924
|
+
const PAGE_SIZE = 1e3;
|
|
21925
|
+
const all = [];
|
|
21926
|
+
let page = 1;
|
|
21927
|
+
let lastPageWasFull = true;
|
|
21928
|
+
while (lastPageWasFull) {
|
|
21929
|
+
let rows;
|
|
21930
|
+
if (this._resolveManagement) {
|
|
21931
|
+
rows = await this._resolveManagement().logGroups.list({
|
|
21932
|
+
pageNumber: page,
|
|
21933
|
+
pageSize: PAGE_SIZE
|
|
21934
|
+
});
|
|
21935
|
+
} else {
|
|
21936
|
+
const result = await this._http.GET("/api/v1/log_groups", {
|
|
21937
|
+
params: {
|
|
21938
|
+
query: {
|
|
21939
|
+
"page[number]": page,
|
|
21940
|
+
"page[size]": PAGE_SIZE
|
|
21941
|
+
}
|
|
21942
|
+
}
|
|
21943
|
+
});
|
|
21944
|
+
if (result.error !== void 0) {
|
|
21945
|
+
throw new SmplError(`Failed to list log groups: ${result.response.status}`);
|
|
21946
|
+
}
|
|
21947
|
+
rows = result.data ? result.data.data.map((r) => this._groupToModel(r)) : [];
|
|
21948
|
+
}
|
|
21949
|
+
all.push(...rows);
|
|
21950
|
+
lastPageWasFull = rows.length === PAGE_SIZE;
|
|
21951
|
+
page++;
|
|
21701
21952
|
}
|
|
21702
|
-
|
|
21703
|
-
return result.data.data.map((r) => this._groupToModel(r));
|
|
21953
|
+
return all;
|
|
21704
21954
|
}
|
|
21705
21955
|
// ------------------------------------------------------------------
|
|
21706
21956
|
// Runtime: install
|
|
@@ -21770,6 +22020,7 @@ var LoggingClient = class {
|
|
|
21770
22020
|
const loggers = adapter.discover();
|
|
21771
22021
|
for (const { name, level } of loggers) {
|
|
21772
22022
|
this._loggerBuffer.add(name, level, level, service, environment);
|
|
22023
|
+
this._knownLoggerNames.add(name);
|
|
21773
22024
|
discoveredCount++;
|
|
21774
22025
|
}
|
|
21775
22026
|
} catch {
|
|
@@ -21802,13 +22053,9 @@ var LoggingClient = class {
|
|
|
21802
22053
|
"api",
|
|
21803
22054
|
`fetched ${serverLoggers.length} logger(s) and ${serverGroups.length} group(s) from server`
|
|
21804
22055
|
);
|
|
21805
|
-
this.
|
|
21806
|
-
|
|
21807
|
-
|
|
21808
|
-
}
|
|
21809
|
-
for (const g of serverGroups) {
|
|
21810
|
-
this._groupStore[g.id] = g.level;
|
|
21811
|
-
}
|
|
22056
|
+
this._loggersCache = this._buildLoggersCache(serverLoggers);
|
|
22057
|
+
this._groupsCache = this._buildGroupsCache(serverGroups);
|
|
22058
|
+
this._applyLevels();
|
|
21812
22059
|
} catch {
|
|
21813
22060
|
}
|
|
21814
22061
|
this._wsManager = this._ensureWs();
|
|
@@ -21900,41 +22147,107 @@ var LoggingClient = class {
|
|
|
21900
22147
|
}
|
|
21901
22148
|
return adapters;
|
|
21902
22149
|
}
|
|
21903
|
-
/**
|
|
21904
|
-
|
|
21905
|
-
|
|
21906
|
-
|
|
21907
|
-
|
|
21908
|
-
|
|
21909
|
-
|
|
21910
|
-
|
|
21911
|
-
|
|
21912
|
-
|
|
21913
|
-
|
|
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);
|
|
21914
22173
|
}
|
|
21915
|
-
|
|
22174
|
+
}
|
|
22175
|
+
this._resolvedLevelStore = newResolved;
|
|
22176
|
+
for (const name of this._knownLoggerNames) {
|
|
22177
|
+
const resolved = newResolved[name];
|
|
21916
22178
|
const metrics = this._parent?._metrics;
|
|
21917
22179
|
if (metrics) {
|
|
21918
|
-
metrics.record("logging.level_changes", 1, "changes", { logger:
|
|
22180
|
+
metrics.record("logging.level_changes", 1, "changes", { logger: name });
|
|
21919
22181
|
}
|
|
21920
22182
|
for (const adapter of this._adapters) {
|
|
21921
22183
|
try {
|
|
21922
|
-
debug("adapter", `setLevel(${
|
|
21923
|
-
adapter.applyLevel(
|
|
22184
|
+
debug("adapter", `setLevel(${name}, ${resolved})`);
|
|
22185
|
+
adapter.applyLevel(name, resolved);
|
|
21924
22186
|
} catch {
|
|
21925
22187
|
}
|
|
21926
22188
|
}
|
|
21927
22189
|
}
|
|
21928
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
|
+
}
|
|
21929
22226
|
/** Called by adapter hooks when a new logger is created in the framework. */
|
|
21930
22227
|
_onAdapterNewLogger(name, level) {
|
|
21931
22228
|
debug("discovery", `new logger intercepted at runtime: ${name}`);
|
|
21932
22229
|
const service = this._parent?._service ?? null;
|
|
21933
22230
|
const environment = this._parent?._environment ?? null;
|
|
21934
22231
|
this._loggerBuffer.add(name, level, level, service, environment);
|
|
22232
|
+
this._knownLoggerNames.add(name);
|
|
21935
22233
|
if (this._loggerBuffer.pendingCount >= 50) {
|
|
21936
22234
|
void this._flushLoggerBuffer();
|
|
21937
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
|
+
}
|
|
21938
22251
|
}
|
|
21939
22252
|
/** Flush buffered loggers to the bulk-register endpoint. */
|
|
21940
22253
|
async _flushLoggerBuffer() {
|
|
@@ -21968,33 +22281,14 @@ var LoggingClient = class {
|
|
|
21968
22281
|
const id = data.id;
|
|
21969
22282
|
if (!id) return;
|
|
21970
22283
|
void this._fetchSingleLogger(id).then((logger) => {
|
|
21971
|
-
const
|
|
21972
|
-
|
|
21973
|
-
|
|
21974
|
-
|
|
21975
|
-
|
|
21976
|
-
this._applyLevels([logger]);
|
|
21977
|
-
}
|
|
21978
|
-
const event = new LoggerChangeEvent({
|
|
21979
|
-
id,
|
|
21980
|
-
level: newLevel,
|
|
21981
|
-
source: "websocket"
|
|
21982
|
-
});
|
|
21983
|
-
for (const cb of this._globalListeners) {
|
|
21984
|
-
try {
|
|
21985
|
-
cb(event);
|
|
21986
|
-
} catch {
|
|
21987
|
-
}
|
|
21988
|
-
}
|
|
21989
|
-
const idCallbacks = this._keyListeners.get(id);
|
|
21990
|
-
if (idCallbacks) {
|
|
21991
|
-
for (const cb of idCallbacks) {
|
|
21992
|
-
try {
|
|
21993
|
-
cb(event);
|
|
21994
|
-
} catch {
|
|
21995
|
-
}
|
|
21996
|
-
}
|
|
22284
|
+
const preResolved = { ...this._resolvedLevelStore };
|
|
22285
|
+
if (logger !== null) {
|
|
22286
|
+
this._loggersCache[id] = this._loggerToCacheEntry(logger);
|
|
22287
|
+
} else {
|
|
22288
|
+
delete this._loggersCache[id];
|
|
21997
22289
|
}
|
|
22290
|
+
this._applyLevels();
|
|
22291
|
+
this._fireDeltas(preResolved, this._resolvedLevelStore, "websocket");
|
|
21998
22292
|
}).catch((err) => {
|
|
21999
22293
|
debug(
|
|
22000
22294
|
"websocket",
|
|
@@ -22006,50 +22300,25 @@ var LoggingClient = class {
|
|
|
22006
22300
|
debug("websocket", `logger_deleted event received: ${JSON.stringify(data)}`);
|
|
22007
22301
|
const id = data.id;
|
|
22008
22302
|
if (!id) return;
|
|
22009
|
-
delete this.
|
|
22010
|
-
const
|
|
22011
|
-
|
|
22012
|
-
|
|
22013
|
-
|
|
22014
|
-
deleted: true
|
|
22015
|
-
});
|
|
22016
|
-
for (const cb of this._globalListeners) {
|
|
22017
|
-
try {
|
|
22018
|
-
cb(event);
|
|
22019
|
-
} catch (err) {
|
|
22020
|
-
debug(
|
|
22021
|
-
"websocket",
|
|
22022
|
-
`logger_deleted listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
22023
|
-
);
|
|
22024
|
-
}
|
|
22025
|
-
}
|
|
22026
|
-
const idCallbacks = this._keyListeners.get(id);
|
|
22027
|
-
if (idCallbacks) {
|
|
22028
|
-
for (const cb of idCallbacks) {
|
|
22029
|
-
try {
|
|
22030
|
-
cb(event);
|
|
22031
|
-
} catch (err) {
|
|
22032
|
-
debug(
|
|
22033
|
-
"websocket",
|
|
22034
|
-
`logger_deleted key listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
22035
|
-
);
|
|
22036
|
-
}
|
|
22037
|
-
}
|
|
22038
|
-
}
|
|
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]));
|
|
22039
22308
|
};
|
|
22040
22309
|
_handleGroupChanged = (data) => {
|
|
22041
22310
|
debug("websocket", `group_changed event received: ${JSON.stringify(data)}`);
|
|
22042
22311
|
const id = data.id;
|
|
22043
22312
|
if (!id) return;
|
|
22044
22313
|
void this._fetchSingleGroup(id).then((group) => {
|
|
22045
|
-
const
|
|
22046
|
-
|
|
22047
|
-
|
|
22048
|
-
|
|
22049
|
-
|
|
22050
|
-
|
|
22051
|
-
|
|
22052
|
-
|
|
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");
|
|
22053
22322
|
}).catch((err) => {
|
|
22054
22323
|
debug(
|
|
22055
22324
|
"websocket",
|
|
@@ -22061,11 +22330,68 @@ var LoggingClient = class {
|
|
|
22061
22330
|
debug("websocket", `group_deleted event received: ${JSON.stringify(data)}`);
|
|
22062
22331
|
const id = data.id;
|
|
22063
22332
|
if (!id) return;
|
|
22064
|
-
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) {
|
|
22065
22391
|
const event = new LoggerChangeEvent({
|
|
22066
22392
|
id,
|
|
22067
22393
|
level: null,
|
|
22068
|
-
source
|
|
22394
|
+
source,
|
|
22069
22395
|
deleted: true
|
|
22070
22396
|
});
|
|
22071
22397
|
for (const cb of this._globalListeners) {
|
|
@@ -22074,7 +22400,7 @@ var LoggingClient = class {
|
|
|
22074
22400
|
} catch (err) {
|
|
22075
22401
|
debug(
|
|
22076
22402
|
"websocket",
|
|
22077
|
-
`
|
|
22403
|
+
`deleted listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
22078
22404
|
);
|
|
22079
22405
|
}
|
|
22080
22406
|
}
|
|
@@ -22086,22 +22412,22 @@ var LoggingClient = class {
|
|
|
22086
22412
|
} catch (err) {
|
|
22087
22413
|
debug(
|
|
22088
22414
|
"websocket",
|
|
22089
|
-
`
|
|
22415
|
+
`deleted key listener error: ${err instanceof Error ? err.message : String(err)}`
|
|
22090
22416
|
);
|
|
22091
22417
|
}
|
|
22092
22418
|
}
|
|
22093
22419
|
}
|
|
22094
|
-
}
|
|
22420
|
+
}
|
|
22095
22421
|
_handleLoggersChanged = (_data) => {
|
|
22096
22422
|
debug("websocket", `loggers_changed event received`);
|
|
22097
22423
|
void this._resolveAndFire("websocket").catch(() => {
|
|
22098
22424
|
});
|
|
22099
22425
|
};
|
|
22100
22426
|
/**
|
|
22101
|
-
* Full refetch of loggers + log_groups,
|
|
22102
|
-
*
|
|
22103
|
-
*
|
|
22104
|
-
*
|
|
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.
|
|
22105
22431
|
* @internal
|
|
22106
22432
|
*/
|
|
22107
22433
|
async _resolveAndFire(source) {
|
|
@@ -22110,58 +22436,12 @@ var LoggingClient = class {
|
|
|
22110
22436
|
this._listLogGroups()
|
|
22111
22437
|
]);
|
|
22112
22438
|
debug("resolution", `resolution pass (trigger: ${source})`);
|
|
22113
|
-
const
|
|
22114
|
-
|
|
22115
|
-
|
|
22116
|
-
|
|
22117
|
-
|
|
22118
|
-
|
|
22119
|
-
if (oldLevel !== newLevel || !(key in this._loggerStore)) {
|
|
22120
|
-
changedLoggerIds.add(key);
|
|
22121
|
-
this._loggerStore[key] = newLevel;
|
|
22122
|
-
}
|
|
22123
|
-
}
|
|
22124
|
-
for (const key of Object.keys(this._loggerStore)) {
|
|
22125
|
-
if (!newLoggerKeys.has(key)) {
|
|
22126
|
-
changedLoggerIds.add(key);
|
|
22127
|
-
delete this._loggerStore[key];
|
|
22128
|
-
}
|
|
22129
|
-
}
|
|
22130
|
-
for (const group of serverGroups) {
|
|
22131
|
-
this._groupStore[group.id] = group.level ?? null;
|
|
22132
|
-
}
|
|
22133
|
-
this._applyLevels(serverLoggers);
|
|
22134
|
-
if (changedLoggerIds.size === 0) return;
|
|
22135
|
-
const [firstKey] = changedLoggerIds;
|
|
22136
|
-
const firstLogger = serverLoggers.find((l) => l.id === firstKey);
|
|
22137
|
-
const globalEvent = new LoggerChangeEvent({
|
|
22138
|
-
id: firstKey,
|
|
22139
|
-
level: firstLogger?.level ?? null,
|
|
22140
|
-
source
|
|
22141
|
-
});
|
|
22142
|
-
for (const cb of this._globalListeners) {
|
|
22143
|
-
try {
|
|
22144
|
-
cb(globalEvent);
|
|
22145
|
-
} catch {
|
|
22146
|
-
}
|
|
22147
|
-
}
|
|
22148
|
-
for (const key of changedLoggerIds) {
|
|
22149
|
-
const keyCallbacks = this._keyListeners.get(key);
|
|
22150
|
-
if (keyCallbacks) {
|
|
22151
|
-
const l = serverLoggers.find((x) => x.id === key);
|
|
22152
|
-
const keyEvent = new LoggerChangeEvent({
|
|
22153
|
-
id: key,
|
|
22154
|
-
level: l?.level ?? null,
|
|
22155
|
-
source
|
|
22156
|
-
});
|
|
22157
|
-
for (const cb of keyCallbacks) {
|
|
22158
|
-
try {
|
|
22159
|
-
cb(keyEvent);
|
|
22160
|
-
} catch {
|
|
22161
|
-
}
|
|
22162
|
-
}
|
|
22163
|
-
}
|
|
22164
|
-
}
|
|
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);
|
|
22165
22445
|
}
|
|
22166
22446
|
// ------------------------------------------------------------------
|
|
22167
22447
|
// Internal: single-resource fetchers
|