@smplkit/sdk 1.5.7 → 1.5.8

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.d.cts CHANGED
@@ -1270,6 +1270,8 @@ declare class LoggingClient {
1270
1270
  private _keyListeners;
1271
1271
  private _adapters;
1272
1272
  private _explicitAdapters;
1273
+ private _loggerBuffer;
1274
+ private _loggerFlushTimer;
1273
1275
  /** @internal */
1274
1276
  constructor(apiKey: string, ensureWs: () => SharedWebSocket, timeout?: number);
1275
1277
  /**
@@ -1328,6 +1330,8 @@ declare class LoggingClient {
1328
1330
  private _applyLevels;
1329
1331
  /** Called by adapter hooks when a new logger is created in the framework. */
1330
1332
  private _onAdapterNewLogger;
1333
+ /** Flush buffered loggers to the bulk-register endpoint. */
1334
+ private _flushLoggerBuffer;
1331
1335
  private _handleLoggerChanged;
1332
1336
  private _handleGroupChanged;
1333
1337
  private _loggerToModel;
package/dist/index.d.ts CHANGED
@@ -1270,6 +1270,8 @@ declare class LoggingClient {
1270
1270
  private _keyListeners;
1271
1271
  private _adapters;
1272
1272
  private _explicitAdapters;
1273
+ private _loggerBuffer;
1274
+ private _loggerFlushTimer;
1273
1275
  /** @internal */
1274
1276
  constructor(apiKey: string, ensureWs: () => SharedWebSocket, timeout?: number);
1275
1277
  /**
@@ -1328,6 +1330,8 @@ declare class LoggingClient {
1328
1330
  private _applyLevels;
1329
1331
  /** Called by adapter hooks when a new logger is created in the framework. */
1330
1332
  private _onAdapterNewLogger;
1333
+ /** Flush buffered loggers to the bulk-register endpoint. */
1334
+ private _flushLoggerBuffer;
1331
1335
  private _handleLoggerChanged;
1332
1336
  private _handleGroupChanged;
1333
1337
  private _loggerToModel;
package/dist/index.js CHANGED
@@ -18610,6 +18610,26 @@ var LogGroup = class {
18610
18610
 
18611
18611
  // src/logging/client.ts
18612
18612
  var LOGGING_BASE_URL = "https://logging.smplkit.com";
18613
+ var LoggerRegistrationBuffer = class {
18614
+ _seen = /* @__PURE__ */ new Set();
18615
+ _pending = [];
18616
+ add(id, level, resolvedLevel, service, environment) {
18617
+ if (this._seen.has(id)) return;
18618
+ this._seen.add(id);
18619
+ const item = { id, level, resolved_level: resolvedLevel };
18620
+ if (service) item.service = service;
18621
+ if (environment) item.environment = environment;
18622
+ this._pending.push(item);
18623
+ }
18624
+ drain() {
18625
+ const batch = this._pending;
18626
+ this._pending = [];
18627
+ return batch;
18628
+ }
18629
+ get pendingCount() {
18630
+ return this._pending.length;
18631
+ }
18632
+ };
18613
18633
  async function checkError3(response, _context) {
18614
18634
  const body = await response.text().catch(() => "");
18615
18635
  throwForStatus(response.status, body);
@@ -18680,6 +18700,8 @@ var LoggingClient = class {
18680
18700
  _keyListeners = /* @__PURE__ */ new Map();
18681
18701
  _adapters = [];
18682
18702
  _explicitAdapters = false;
18703
+ _loggerBuffer = new LoggerRegistrationBuffer();
18704
+ _loggerFlushTimer = null;
18683
18705
  /** @internal */
18684
18706
  constructor(apiKey, ensureWs, timeout) {
18685
18707
  this._apiKey = apiKey;
@@ -18925,15 +18947,20 @@ var LoggingClient = class {
18925
18947
  if (!this._explicitAdapters) {
18926
18948
  this._adapters = this._autoLoadAdapters();
18927
18949
  }
18928
- const discovered = [];
18950
+ const service = this._parent?._service ?? null;
18951
+ const environment = this._parent?._environment ?? null;
18952
+ let discoveredCount = 0;
18929
18953
  for (const adapter of this._adapters) {
18930
18954
  try {
18931
18955
  const loggers = adapter.discover();
18932
- discovered.push(...loggers);
18956
+ for (const { name, level } of loggers) {
18957
+ this._loggerBuffer.add(name, level, level, service, environment);
18958
+ discoveredCount++;
18959
+ }
18933
18960
  } catch {
18934
18961
  }
18935
18962
  }
18936
- debug("discovery", `discovered ${discovered.length} logger(s) from adapters`);
18963
+ debug("discovery", `discovered ${discoveredCount} logger(s) from adapters`);
18937
18964
  for (const adapter of this._adapters) {
18938
18965
  try {
18939
18966
  adapter.installHook((name, level) => {
@@ -18943,39 +18970,13 @@ var LoggingClient = class {
18943
18970
  } catch {
18944
18971
  }
18945
18972
  }
18946
- if (discovered.length > 0) {
18973
+ if (discoveredCount > 0) {
18947
18974
  const metrics = this._parent?._metrics;
18948
18975
  if (metrics) {
18949
- metrics.record("logging.loggers_discovered", discovered.length, "loggers");
18950
- }
18951
- }
18952
- if (discovered.length > 0) {
18953
- const service = this._parent?._service ?? null;
18954
- const environment = this._parent?._environment ?? null;
18955
- const loggers = discovered.map(
18956
- ({ name, level }) => ({
18957
- id: name,
18958
- // For Winston/Pino there is no inherited-null distinction — both fields carry the same value.
18959
- level,
18960
- resolved_level: level,
18961
- service: service ?? void 0,
18962
- environment: environment ?? void 0
18963
- })
18964
- );
18965
- debug("registration", `flushing ${loggers.length} logger(s) to bulk-register endpoint`);
18966
- try {
18967
- const result = await this._http.POST("/api/v1/loggers/bulk", {
18968
- body: { loggers }
18969
- });
18970
- if (result.error !== void 0)
18971
- await checkError3(result.response, "Failed to bulk-register loggers");
18972
- debug("registration", `bulk-register complete (${loggers.length} logger(s))`);
18973
- } catch (err) {
18974
- console.warn(
18975
- `[smplkit] Failed to bulk-register loggers: ${err instanceof Error ? err.message : String(err)}`
18976
- );
18976
+ metrics.record("logging.loggers_discovered", discoveredCount, "loggers");
18977
18977
  }
18978
18978
  }
18979
+ await this._flushLoggerBuffer();
18979
18980
  debug("resolution", `starting resolution pass (trigger: start())`);
18980
18981
  try {
18981
18982
  const [serverLoggers, serverGroups] = await Promise.all([
@@ -18994,6 +18995,9 @@ var LoggingClient = class {
18994
18995
  this._wsManager.on("logger_deleted", this._handleLoggerChanged);
18995
18996
  this._wsManager.on("group_changed", this._handleGroupChanged);
18996
18997
  this._wsManager.on("group_deleted", this._handleGroupChanged);
18998
+ this._loggerFlushTimer = setInterval(() => {
18999
+ void this._flushLoggerBuffer();
19000
+ }, 3e4);
18997
19001
  this._started = true;
18998
19002
  }
18999
19003
  // ------------------------------------------------------------------
@@ -19025,6 +19029,10 @@ var LoggingClient = class {
19025
19029
  /** @internal */
19026
19030
  _close() {
19027
19031
  debug("lifecycle", "LoggingClient._close() called");
19032
+ if (this._loggerFlushTimer !== null) {
19033
+ clearInterval(this._loggerFlushTimer);
19034
+ this._loggerFlushTimer = null;
19035
+ }
19028
19036
  for (const adapter of this._adapters) {
19029
19037
  try {
19030
19038
  adapter.uninstallHook();
@@ -19093,12 +19101,34 @@ var LoggingClient = class {
19093
19101
  }
19094
19102
  }
19095
19103
  /** Called by adapter hooks when a new logger is created in the framework. */
19096
- _onAdapterNewLogger(_name, _level) {
19097
- debug("discovery", `new logger intercepted at runtime: ${_name}`);
19098
- const logger = this.management.new(_name, { managed: true });
19099
- logger.setLevel(_level);
19100
- logger.save().catch(() => {
19101
- });
19104
+ _onAdapterNewLogger(name, level) {
19105
+ debug("discovery", `new logger intercepted at runtime: ${name}`);
19106
+ const service = this._parent?._service ?? null;
19107
+ const environment = this._parent?._environment ?? null;
19108
+ this._loggerBuffer.add(name, level, level, service, environment);
19109
+ if (this._loggerBuffer.pendingCount >= 50) {
19110
+ void this._flushLoggerBuffer();
19111
+ }
19112
+ }
19113
+ /** Flush buffered loggers to the bulk-register endpoint. */
19114
+ async _flushLoggerBuffer() {
19115
+ const batch = this._loggerBuffer.drain();
19116
+ if (batch.length === 0) return;
19117
+ debug("registration", `flushing ${batch.length} logger(s) to bulk-register endpoint`);
19118
+ try {
19119
+ const result = await this._http.POST("/api/v1/loggers/bulk", {
19120
+ body: { loggers: batch }
19121
+ });
19122
+ if (result.error !== void 0) {
19123
+ console.warn("[smplkit] Logger bulk registration failed");
19124
+ } else {
19125
+ debug("registration", `bulk-register complete (${batch.length} logger(s))`);
19126
+ }
19127
+ } catch (err) {
19128
+ console.warn(
19129
+ `[smplkit] Logger bulk registration failed: ${err instanceof Error ? err.message : String(err)}`
19130
+ );
19131
+ }
19102
19132
  }
19103
19133
  // ------------------------------------------------------------------
19104
19134
  // Internal: WebSocket handler