@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.cjs CHANGED
@@ -18651,6 +18651,26 @@ var LogGroup = class {
18651
18651
 
18652
18652
  // src/logging/client.ts
18653
18653
  var LOGGING_BASE_URL = "https://logging.smplkit.com";
18654
+ var LoggerRegistrationBuffer = class {
18655
+ _seen = /* @__PURE__ */ new Set();
18656
+ _pending = [];
18657
+ add(id, level, resolvedLevel, service, environment) {
18658
+ if (this._seen.has(id)) return;
18659
+ this._seen.add(id);
18660
+ const item = { id, level, resolved_level: resolvedLevel };
18661
+ if (service) item.service = service;
18662
+ if (environment) item.environment = environment;
18663
+ this._pending.push(item);
18664
+ }
18665
+ drain() {
18666
+ const batch = this._pending;
18667
+ this._pending = [];
18668
+ return batch;
18669
+ }
18670
+ get pendingCount() {
18671
+ return this._pending.length;
18672
+ }
18673
+ };
18654
18674
  async function checkError3(response, _context) {
18655
18675
  const body = await response.text().catch(() => "");
18656
18676
  throwForStatus(response.status, body);
@@ -18721,6 +18741,8 @@ var LoggingClient = class {
18721
18741
  _keyListeners = /* @__PURE__ */ new Map();
18722
18742
  _adapters = [];
18723
18743
  _explicitAdapters = false;
18744
+ _loggerBuffer = new LoggerRegistrationBuffer();
18745
+ _loggerFlushTimer = null;
18724
18746
  /** @internal */
18725
18747
  constructor(apiKey, ensureWs, timeout) {
18726
18748
  this._apiKey = apiKey;
@@ -18966,15 +18988,20 @@ var LoggingClient = class {
18966
18988
  if (!this._explicitAdapters) {
18967
18989
  this._adapters = this._autoLoadAdapters();
18968
18990
  }
18969
- const discovered = [];
18991
+ const service = this._parent?._service ?? null;
18992
+ const environment = this._parent?._environment ?? null;
18993
+ let discoveredCount = 0;
18970
18994
  for (const adapter of this._adapters) {
18971
18995
  try {
18972
18996
  const loggers = adapter.discover();
18973
- discovered.push(...loggers);
18997
+ for (const { name, level } of loggers) {
18998
+ this._loggerBuffer.add(name, level, level, service, environment);
18999
+ discoveredCount++;
19000
+ }
18974
19001
  } catch {
18975
19002
  }
18976
19003
  }
18977
- debug("discovery", `discovered ${discovered.length} logger(s) from adapters`);
19004
+ debug("discovery", `discovered ${discoveredCount} logger(s) from adapters`);
18978
19005
  for (const adapter of this._adapters) {
18979
19006
  try {
18980
19007
  adapter.installHook((name, level) => {
@@ -18984,39 +19011,13 @@ var LoggingClient = class {
18984
19011
  } catch {
18985
19012
  }
18986
19013
  }
18987
- if (discovered.length > 0) {
19014
+ if (discoveredCount > 0) {
18988
19015
  const metrics = this._parent?._metrics;
18989
19016
  if (metrics) {
18990
- metrics.record("logging.loggers_discovered", discovered.length, "loggers");
18991
- }
18992
- }
18993
- if (discovered.length > 0) {
18994
- const service = this._parent?._service ?? null;
18995
- const environment = this._parent?._environment ?? null;
18996
- const loggers = discovered.map(
18997
- ({ name, level }) => ({
18998
- id: name,
18999
- // For Winston/Pino there is no inherited-null distinction — both fields carry the same value.
19000
- level,
19001
- resolved_level: level,
19002
- service: service ?? void 0,
19003
- environment: environment ?? void 0
19004
- })
19005
- );
19006
- debug("registration", `flushing ${loggers.length} logger(s) to bulk-register endpoint`);
19007
- try {
19008
- const result = await this._http.POST("/api/v1/loggers/bulk", {
19009
- body: { loggers }
19010
- });
19011
- if (result.error !== void 0)
19012
- await checkError3(result.response, "Failed to bulk-register loggers");
19013
- debug("registration", `bulk-register complete (${loggers.length} logger(s))`);
19014
- } catch (err) {
19015
- console.warn(
19016
- `[smplkit] Failed to bulk-register loggers: ${err instanceof Error ? err.message : String(err)}`
19017
- );
19017
+ metrics.record("logging.loggers_discovered", discoveredCount, "loggers");
19018
19018
  }
19019
19019
  }
19020
+ await this._flushLoggerBuffer();
19020
19021
  debug("resolution", `starting resolution pass (trigger: start())`);
19021
19022
  try {
19022
19023
  const [serverLoggers, serverGroups] = await Promise.all([
@@ -19035,6 +19036,9 @@ var LoggingClient = class {
19035
19036
  this._wsManager.on("logger_deleted", this._handleLoggerChanged);
19036
19037
  this._wsManager.on("group_changed", this._handleGroupChanged);
19037
19038
  this._wsManager.on("group_deleted", this._handleGroupChanged);
19039
+ this._loggerFlushTimer = setInterval(() => {
19040
+ void this._flushLoggerBuffer();
19041
+ }, 3e4);
19038
19042
  this._started = true;
19039
19043
  }
19040
19044
  // ------------------------------------------------------------------
@@ -19066,6 +19070,10 @@ var LoggingClient = class {
19066
19070
  /** @internal */
19067
19071
  _close() {
19068
19072
  debug("lifecycle", "LoggingClient._close() called");
19073
+ if (this._loggerFlushTimer !== null) {
19074
+ clearInterval(this._loggerFlushTimer);
19075
+ this._loggerFlushTimer = null;
19076
+ }
19069
19077
  for (const adapter of this._adapters) {
19070
19078
  try {
19071
19079
  adapter.uninstallHook();
@@ -19134,12 +19142,34 @@ var LoggingClient = class {
19134
19142
  }
19135
19143
  }
19136
19144
  /** Called by adapter hooks when a new logger is created in the framework. */
19137
- _onAdapterNewLogger(_name, _level) {
19138
- debug("discovery", `new logger intercepted at runtime: ${_name}`);
19139
- const logger = this.management.new(_name, { managed: true });
19140
- logger.setLevel(_level);
19141
- logger.save().catch(() => {
19142
- });
19145
+ _onAdapterNewLogger(name, level) {
19146
+ debug("discovery", `new logger intercepted at runtime: ${name}`);
19147
+ const service = this._parent?._service ?? null;
19148
+ const environment = this._parent?._environment ?? null;
19149
+ this._loggerBuffer.add(name, level, level, service, environment);
19150
+ if (this._loggerBuffer.pendingCount >= 50) {
19151
+ void this._flushLoggerBuffer();
19152
+ }
19153
+ }
19154
+ /** Flush buffered loggers to the bulk-register endpoint. */
19155
+ async _flushLoggerBuffer() {
19156
+ const batch = this._loggerBuffer.drain();
19157
+ if (batch.length === 0) return;
19158
+ debug("registration", `flushing ${batch.length} logger(s) to bulk-register endpoint`);
19159
+ try {
19160
+ const result = await this._http.POST("/api/v1/loggers/bulk", {
19161
+ body: { loggers: batch }
19162
+ });
19163
+ if (result.error !== void 0) {
19164
+ console.warn("[smplkit] Logger bulk registration failed");
19165
+ } else {
19166
+ debug("registration", `bulk-register complete (${batch.length} logger(s))`);
19167
+ }
19168
+ } catch (err) {
19169
+ console.warn(
19170
+ `[smplkit] Logger bulk registration failed: ${err instanceof Error ? err.message : String(err)}`
19171
+ );
19172
+ }
19143
19173
  }
19144
19174
  // ------------------------------------------------------------------
19145
19175
  // Internal: WebSocket handler