@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 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._handleConfigChanged);
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", `config event received: ${JSON.stringify(data)}`);
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
- constructor(id, source) {
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", `flag event received: ${JSON.stringify(data)}`);
18353
- const flagId = data.id;
18354
- void this._fetchAllFlags().then(() => {
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(flagId ?? null, "websocket");
18435
+ this._fireChangeListeners(flagKey, "websocket");
18357
18436
  });
18358
18437
  };
18359
18438
  _handleFlagDeleted = (data) => {
18360
- debug("websocket", `flag deleted event received: ${JSON.stringify(data)}`);
18361
- const flagId = data.id;
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
- this._fireChangeListeners(flagId ?? null, "websocket");
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
- const groups = await this.management.listGroups();
18878
- const match = groups.find((g) => g.id === id);
18879
- if (!match) {
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 match;
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._handleLoggerChanged);
19217
+ this._wsManager.on("logger_deleted", this._handleLoggerDeleted);
19050
19218
  this._wsManager.on("group_changed", this._handleGroupChanged);
19051
- this._wsManager.on("group_deleted", this._handleGroupChanged);
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._handleLoggerChanged);
19268
+ this._wsManager.off("logger_deleted", this._handleLoggerDeleted);
19100
19269
  this._wsManager.off("group_changed", this._handleGroupChanged);
19101
- this._wsManager.off("group_deleted", this._handleGroupChanged);
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", `logger event received: ${JSON.stringify(data)}`);
19365
+ debug("websocket", `logger_changed event received: ${JSON.stringify(data)}`);
19196
19366
  const id = data.id;
19197
- if (id) {
19198
- void Promise.all([this.management.list(), this.management.listGroups()]).then(([serverLoggers]) => {
19199
- debug("resolution", `resolution pass (trigger: websocket event for logger ${id})`);
19200
- this._applyLevels(serverLoggers);
19201
- const logger = serverLoggers.find((l) => l.id === id);
19202
- const level = logger?.level ?? null;
19203
- const event = {
19204
- id,
19205
- level,
19206
- source: "websocket"
19207
- };
19208
- for (const cb of this._globalListeners) {
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
- const idCallbacks = this._keyListeners.get(id);
19215
- if (idCallbacks) {
19216
- for (const cb of idCallbacks) {
19217
- try {
19218
- cb(event);
19219
- } catch {
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
- _handleGroupChanged = (data) => {
19228
- debug("websocket", `group event received: ${JSON.stringify(data)}`);
19229
- void Promise.all([this.management.list(), this.management.listGroups()]).then(([serverLoggers]) => {
19230
- debug("resolution", `resolution pass (trigger: group websocket event)`);
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) {