@naylence/runtime 0.3.5-test.929 → 0.3.5-test.930

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.
@@ -96,12 +96,12 @@ installProcessEnvShim();
96
96
  // --- END ENV SHIM ---
97
97
 
98
98
  // This file is auto-generated during build - do not edit manually
99
- // Generated from package.json version: 0.3.5-test.929
99
+ // Generated from package.json version: 0.3.5-test.930
100
100
  /**
101
101
  * The package version, injected at build time.
102
102
  * @internal
103
103
  */
104
- const VERSION = '0.3.5-test.929';
104
+ const VERSION = '0.3.5-test.930';
105
105
 
106
106
  /**
107
107
  * Fame protocol specific error classes with WebSocket close codes and proper inheritance.
@@ -30093,239 +30093,10 @@ var noopTraceEmitterFactory = /*#__PURE__*/Object.freeze({
30093
30093
  default: NoopTraceEmitterFactory
30094
30094
  });
30095
30095
 
30096
- const logger$n = getLogger('naylence.fame.telemetry.otel_setup');
30097
- const stringFrom = (...codes) => String.fromCharCode(...codes);
30098
- const OTEL_PREFIX = `${stringFrom(64, 111, 112, 101, 110, 116, 101, 108, 101, 109, 101, 116, 114, 121)}${stringFrom(47)}`;
30099
- const OTEL_API_SPEC = `${OTEL_PREFIX}${stringFrom(97, 112, 105)}`;
30100
- const OTEL_RESOURCES_SPEC = `${OTEL_PREFIX}${stringFrom(114, 101, 115, 111, 117, 114, 99, 101, 115)}`;
30101
- const OTEL_TRACE_NODE_SPEC = `${OTEL_PREFIX}${stringFrom(115, 100, 107, 45, 116, 114, 97, 99, 101, 45, 110, 111, 100, 101)}`;
30102
- const OTEL_TRACE_BASE_SPEC = `${OTEL_PREFIX}${stringFrom(115, 100, 107, 45, 116, 114, 97, 99, 101, 45, 98, 97, 115, 101)}`;
30103
- const OTEL_EXPORTER_HTTP_SPEC = `${OTEL_PREFIX}${stringFrom(101, 120, 112, 111, 114, 116, 101, 114, 45, 116, 114, 97, 99, 101, 45, 111, 116, 108, 112, 45, 104, 116, 116, 112)}`;
30104
- let registeredOtel = null;
30105
- async function setupOtel(options) {
30106
- const normalized = normalizeSetupOtelOptions(options);
30107
- try {
30108
- if (registeredOtel) {
30109
- logger$n.debug('open_telemetry_reusing_provider', {
30110
- service_name: normalized.serviceName,
30111
- });
30112
- return registeredOtel.control;
30113
- }
30114
- const [apiModule, resourcesModule, nodeModule, traceBaseModule] = await Promise.all([
30115
- import(OTEL_API_SPEC),
30116
- import(OTEL_RESOURCES_SPEC),
30117
- import(OTEL_TRACE_NODE_SPEC),
30118
- import(OTEL_TRACE_BASE_SPEC),
30119
- ]);
30120
- const { trace } = apiModule;
30121
- const { defaultResource, resourceFromAttributes } = resourcesModule;
30122
- const { NodeTracerProvider } = nodeModule;
30123
- const { BatchSpanProcessor, ConsoleSpanExporter, ParentBasedSampler, AlwaysOnSampler, AlwaysOffSampler, TraceIdRatioBasedSampler, } = traceBaseModule;
30124
- const currentProvider = trace.getTracerProvider();
30125
- if (currentProvider && currentProvider instanceof NodeTracerProvider) {
30126
- return null;
30127
- }
30128
- if (currentProvider &&
30129
- currentProvider.constructor?.name === 'NodeTracerProvider') {
30130
- logger$n.debug('open_telemetry_existing_node_provider', {
30131
- service_name: normalized.serviceName,
30132
- });
30133
- return null;
30134
- }
30135
- logger$n.debug('open_telemetry_initializing', {
30136
- service_name: normalized.serviceName,
30137
- endpoint: normalized.endpoint ?? null,
30138
- environment: normalized.environment ?? null,
30139
- sampler: normalized.sampler ?? null,
30140
- headers_present: Boolean(normalized.headers && Object.keys(normalized.headers).length),
30141
- });
30142
- const sampler = resolveSampler(normalized.sampler, {
30143
- ParentBasedSampler,
30144
- AlwaysOnSampler,
30145
- AlwaysOffSampler,
30146
- TraceIdRatioBasedSampler,
30147
- });
30148
- const baseResource = defaultResource();
30149
- const mergedResource = resourceFromAttributes({
30150
- 'service.name': normalized.serviceName,
30151
- 'service.instance.id': generateInstanceId(),
30152
- 'deployment.environment': normalized.environment ?? 'dev',
30153
- });
30154
- const resource = baseResource.merge(mergedResource);
30155
- const exporter = await resolveExporter(normalized.endpoint ?? undefined, normalized.headers, ConsoleSpanExporter);
30156
- const spanProcessor = new BatchSpanProcessor(exporter);
30157
- const provider = new NodeTracerProvider({
30158
- resource,
30159
- sampler,
30160
- spanProcessors: [spanProcessor],
30161
- });
30162
- provider.register();
30163
- logger$n.debug('open_telemetry_initialized', {
30164
- service_name: normalized.serviceName,
30165
- exporter: exporter.constructor?.name ?? 'unknown_exporter',
30166
- });
30167
- const control = {
30168
- forceFlush: async () => {
30169
- try {
30170
- await provider.forceFlush();
30171
- }
30172
- catch (flushError) {
30173
- logger$n.warning('open_telemetry_force_flush_failed', {
30174
- error: flushError instanceof Error
30175
- ? flushError.message
30176
- : String(flushError),
30177
- });
30178
- }
30179
- },
30180
- shutdown: async () => {
30181
- try {
30182
- await provider.shutdown();
30183
- }
30184
- catch (shutdownError) {
30185
- logger$n.warning('open_telemetry_shutdown_failed', {
30186
- error: shutdownError instanceof Error
30187
- ? shutdownError.message
30188
- : String(shutdownError),
30189
- });
30190
- }
30191
- finally {
30192
- registeredOtel = null;
30193
- }
30194
- },
30195
- };
30196
- registeredOtel = {
30197
- provider,
30198
- control,
30199
- };
30200
- return control;
30201
- }
30202
- catch (error) {
30203
- logger$n.error('open_telemetry_not_available', {
30204
- error: error instanceof Error ? error.message : String(error),
30205
- stack: error instanceof Error && error.stack ? error.stack : undefined,
30206
- });
30207
- return null;
30208
- }
30209
- }
30210
- function normalizeSetupOtelOptions(options) {
30211
- const source = (options ?? {});
30212
- const serviceName = extractNonEmptyString$1(pickFirst$2(source, ['serviceName', 'service_name'])) ??
30213
- 'naylence-service';
30214
- const endpoint = extractNonEmptyString$1(pickFirst$2(source, ['endpoint', 'otlpEndpoint', 'otlp_endpoint'])) ?? null;
30215
- const environment = extractNonEmptyString$1(pickFirst$2(source, [
30216
- 'environment',
30217
- 'deploymentEnvironment',
30218
- 'deployment_environment',
30219
- ])) ?? null;
30220
- const sampler = extractNonEmptyString$1(pickFirst$2(source, ['sampler', 'samplingStrategy', 'sampling_strategy'])) ?? null;
30221
- const headers = extractHeaders$1(pickFirst$2(source, ['headers', 'otlpHeaders', 'otlp_headers']));
30222
- return {
30223
- serviceName,
30224
- endpoint,
30225
- environment,
30226
- sampler,
30227
- headers: headers ?? undefined,
30228
- };
30229
- }
30230
- function pickFirst$2(source, keys) {
30231
- for (const key of keys) {
30232
- if (Object.prototype.hasOwnProperty.call(source, key)) {
30233
- const value = source[key];
30234
- if (value !== undefined) {
30235
- return value;
30236
- }
30237
- }
30238
- }
30239
- return undefined;
30240
- }
30241
- function extractNonEmptyString$1(value) {
30242
- if (typeof value === 'string') {
30243
- const trimmed = value.trim();
30244
- if (trimmed.length > 0) {
30245
- return trimmed;
30246
- }
30247
- }
30248
- return undefined;
30249
- }
30250
- function extractHeaders$1(value) {
30251
- if (!value || typeof value !== 'object') {
30252
- return null;
30253
- }
30254
- const headers = {};
30255
- for (const [key, raw] of Object.entries(value)) {
30256
- if (typeof raw === 'string') {
30257
- headers[key] = raw;
30258
- }
30259
- }
30260
- return Object.keys(headers).length > 0 ? headers : null;
30261
- }
30262
- function generateInstanceId() {
30263
- try {
30264
- if (typeof crypto !== 'undefined' &&
30265
- typeof crypto.randomUUID === 'function') {
30266
- return crypto.randomUUID().replace(/-/g, '');
30267
- }
30268
- }
30269
- catch {
30270
- // Ignore crypto availability errors
30271
- }
30272
- const random = Math.random().toString(16).slice(2);
30273
- return random.padEnd(32, '0').slice(0, 32);
30274
- }
30275
- function resolveSampler(samplerSetting, samplers) {
30276
- const normalized = (samplerSetting ?? 'parentbased_always_on').toLowerCase();
30277
- let base;
30278
- if (normalized === 'always_off') {
30279
- base = new samplers.AlwaysOffSampler();
30280
- }
30281
- else if (normalized === 'always_on' ||
30282
- normalized === 'parentbased_always_on') {
30283
- base = new samplers.AlwaysOnSampler();
30284
- }
30285
- else if (normalized.startsWith('ratio:')) {
30286
- const ratioValue = Number.parseFloat(normalized.slice('ratio:'.length));
30287
- const ratio = Number.isFinite(ratioValue)
30288
- ? Math.min(Math.max(ratioValue, 0), 1)
30289
- : 1;
30290
- base = new samplers.TraceIdRatioBasedSampler(ratio);
30291
- }
30292
- else {
30293
- base = new samplers.AlwaysOnSampler();
30294
- }
30295
- return new samplers.ParentBasedSampler({ root: base });
30296
- }
30297
- async function resolveExporter(endpoint, headers, ConsoleSpanExporter) {
30298
- if (endpoint) {
30299
- try {
30300
- const exporterModule = await import(OTEL_EXPORTER_HTTP_SPEC);
30301
- if ('OTLPTraceExporter' in exporterModule) {
30302
- const { OTLPTraceExporter } = exporterModule;
30303
- const exporterOptions = {
30304
- url: endpoint,
30305
- };
30306
- if (headers && Object.keys(headers).length > 0) {
30307
- exporterOptions.headers = headers;
30308
- }
30309
- logger$n.debug('open_telemetry_using_otlp_http_exporter', {
30310
- endpoint,
30311
- headers_present: Boolean(headers && Object.keys(headers).length),
30312
- });
30313
- return new OTLPTraceExporter(exporterOptions);
30314
- }
30315
- }
30316
- catch (error) {
30317
- logger$n.error('open_telemetry_exporter_not_available', {
30318
- error: error instanceof Error ? error.message : String(error),
30319
- });
30320
- }
30321
- }
30322
- logger$n.warning('open_telemetry_falling_back_to_console_exporter');
30323
- return new ConsoleSpanExporter();
30324
- }
30325
-
30326
30096
  let openTelemetryTraceEmitterModulePromise = null;
30327
30097
  let otelApiModulePromise = null;
30328
- const logger$m = getLogger('naylence.fame.telemetry.open_telemetry_trace_emitter_factory');
30098
+ let otelSetupModulePromise = null;
30099
+ const logger$n = getLogger('naylence.fame.telemetry.open_telemetry_trace_emitter_factory');
30329
30100
  const MISSING_OTEL_HELP_MESSAGE = 'Missing optional OpenTelemetry dependency. Install @opentelemetry/api (and related packages) to enable trace emission.';
30330
30101
  function getOpenTelemetryTraceEmitterModule() {
30331
30102
  if (!openTelemetryTraceEmitterModulePromise) {
@@ -30343,6 +30114,14 @@ function getOtelApiModule() {
30343
30114
  }
30344
30115
  return otelApiModulePromise;
30345
30116
  }
30117
+ function getOtelSetupModule() {
30118
+ if (!otelSetupModulePromise) {
30119
+ otelSetupModulePromise = safeImport(() => Promise.resolve().then(function () { return otelSetup; }), '@opentelemetry/api', {
30120
+ helpMessage: MISSING_OTEL_HELP_MESSAGE,
30121
+ });
30122
+ }
30123
+ return otelSetupModulePromise;
30124
+ }
30346
30125
  const FACTORY_META$V = {
30347
30126
  base: TRACE_EMITTER_FACTORY_BASE_TYPE,
30348
30127
  key: 'OpenTelemetryTraceEmitter',
@@ -30366,7 +30145,7 @@ class OpenTelemetryTraceEmitterFactory extends TraceEmitterFactory {
30366
30145
  await AuthInjectionStrategyFactory.createAuthInjectionStrategy(normalized.auth);
30367
30146
  try {
30368
30147
  await authStrategy.apply(mergedHeaders);
30369
- logger$m.info('trace_emitter_auth_applied', {
30148
+ logger$n.info('trace_emitter_auth_applied', {
30370
30149
  service_name: normalized.serviceName,
30371
30150
  });
30372
30151
  }
@@ -30382,6 +30161,7 @@ class OpenTelemetryTraceEmitterFactory extends TraceEmitterFactory {
30382
30161
  }
30383
30162
  let lifecycle = null;
30384
30163
  try {
30164
+ const { setupOtel } = await getOtelSetupModule();
30385
30165
  lifecycle = await setupOtel({
30386
30166
  serviceName: normalized.serviceName,
30387
30167
  endpoint: normalized.endpoint,
@@ -30389,7 +30169,7 @@ class OpenTelemetryTraceEmitterFactory extends TraceEmitterFactory {
30389
30169
  sampler: normalized.sampler,
30390
30170
  headers: Object.keys(mergedHeaders).length > 0 ? mergedHeaders : undefined,
30391
30171
  });
30392
- logger$m.debug('trace_emitter_lifecycle_acquired', {
30172
+ logger$n.debug('trace_emitter_lifecycle_acquired', {
30393
30173
  service_name: normalized.serviceName,
30394
30174
  lifecycle_available: Boolean(lifecycle),
30395
30175
  });
@@ -30427,7 +30207,7 @@ class OpenTelemetryTraceEmitterFactory extends TraceEmitterFactory {
30427
30207
  }
30428
30208
  try {
30429
30209
  const emitter = new OpenTelemetryTraceEmitter(emitterOptions);
30430
- logger$m.debug('trace_emitter_created', {
30210
+ logger$n.debug('trace_emitter_created', {
30431
30211
  service_name: normalized.serviceName,
30432
30212
  has_lifecycle: Boolean(lifecycle),
30433
30213
  has_auth_strategy: Boolean(authStrategy),
@@ -30459,17 +30239,17 @@ function normalizeConfig$p(config) {
30459
30239
  };
30460
30240
  }
30461
30241
  const candidate = config;
30462
- const serviceName = extractString(pickFirst$1(candidate, ['serviceName', 'service_name'])) ??
30242
+ const serviceName = extractString(pickFirst$2(candidate, ['serviceName', 'service_name'])) ??
30463
30243
  'naylence-service';
30464
- const endpoint = extractString(pickFirst$1(candidate, ['endpoint', 'otlpEndpoint', 'otlp_endpoint'])) ?? null;
30465
- const environment = extractString(pickFirst$1(candidate, [
30244
+ const endpoint = extractString(pickFirst$2(candidate, ['endpoint', 'otlpEndpoint', 'otlp_endpoint'])) ?? null;
30245
+ const environment = extractString(pickFirst$2(candidate, [
30466
30246
  'environment',
30467
30247
  'deploymentEnvironment',
30468
30248
  'deployment_environment',
30469
30249
  ])) ?? null;
30470
- const sampler = extractString(pickFirst$1(candidate, ['sampler', 'samplingStrategy', 'sampling_strategy'])) ?? null;
30471
- const headersFromConfig = extractHeaders(pickFirst$1(candidate, ['headers', 'otlpHeaders', 'otlp_headers']));
30472
- const authConfig = pickFirst$1(candidate, [
30250
+ const sampler = extractString(pickFirst$2(candidate, ['sampler', 'samplingStrategy', 'sampling_strategy'])) ?? null;
30251
+ const headersFromConfig = extractHeaders$1(pickFirst$2(candidate, ['headers', 'otlpHeaders', 'otlp_headers']));
30252
+ const authConfig = pickFirst$2(candidate, [
30473
30253
  'auth',
30474
30254
  ]);
30475
30255
  return {
@@ -30487,7 +30267,7 @@ function extractString(value) {
30487
30267
  }
30488
30268
  return undefined;
30489
30269
  }
30490
- function pickFirst$1(source, keys) {
30270
+ function pickFirst$2(source, keys) {
30491
30271
  for (const key of keys) {
30492
30272
  if (Object.prototype.hasOwnProperty.call(source, key)) {
30493
30273
  const value = source[key];
@@ -30498,7 +30278,7 @@ function pickFirst$1(source, keys) {
30498
30278
  }
30499
30279
  return undefined;
30500
30280
  }
30501
- function extractHeaders(value) {
30281
+ function extractHeaders$1(value) {
30502
30282
  if (!value || typeof value !== 'object') {
30503
30283
  return null;
30504
30284
  }
@@ -30518,7 +30298,7 @@ var openTelemetryTraceEmitterFactory = /*#__PURE__*/Object.freeze({
30518
30298
  default: OpenTelemetryTraceEmitterFactory
30519
30299
  });
30520
30300
 
30521
- const logger$l = getLogger('naylence.fame.telemetry.trace_emitter_profile_factory');
30301
+ const logger$m = getLogger('naylence.fame.telemetry.trace_emitter_profile_factory');
30522
30302
  const PROFILE_NAME_NOOP$1 = 'noop';
30523
30303
  const PROFILE_NAME_OPEN_TELEMETRY = 'open-telemetry';
30524
30304
  const ENV_VAR_TELEMETRY_SERVICE_NAME = 'FAME_TELEMETRY_SERVICE_NAME';
@@ -30546,7 +30326,7 @@ class TraceEmitterProfileFactory extends TraceEmitterFactory {
30546
30326
  async create(config, ...factoryArgs) {
30547
30327
  const normalized = normalizeTraceEmitterProfileConfig(config);
30548
30328
  const profileConfig = resolveProfileConfig$2(normalized.profile);
30549
- logger$l.debug('enabling_trace_emitter_profile', {
30329
+ logger$m.debug('enabling_trace_emitter_profile', {
30550
30330
  profile: normalized.profile,
30551
30331
  });
30552
30332
  const traceEmitter = await TraceEmitterFactory.createTraceEmitter(profileConfig, {
@@ -30734,7 +30514,7 @@ var httpListenerFactory = /*#__PURE__*/Object.freeze({
30734
30514
  default: HttpListenerFactory
30735
30515
  });
30736
30516
 
30737
- const logger$k = getLogger('naylence.fame.connector.http_stateless_connector');
30517
+ const logger$l = getLogger('naylence.fame.connector.http_stateless_connector');
30738
30518
  class HttpStatelessConnector extends BaseAsyncConnector {
30739
30519
  constructor(config, dependencies = {}) {
30740
30520
  super(config);
@@ -30780,7 +30560,7 @@ class HttpStatelessConnector extends BaseAsyncConnector {
30780
30560
  }
30781
30561
  catch (error) {
30782
30562
  if (error instanceof QueueFullError) {
30783
- logger$k.warning('receive_queue_full', {
30563
+ logger$l.warning('receive_queue_full', {
30784
30564
  url: this.url,
30785
30565
  });
30786
30566
  }
@@ -30802,7 +30582,7 @@ class HttpStatelessConnector extends BaseAsyncConnector {
30802
30582
  });
30803
30583
  if (!response.ok) {
30804
30584
  const statusText = response.statusText || 'HTTP error';
30805
- logger$k.error('http_request_failed', {
30585
+ logger$l.error('http_request_failed', {
30806
30586
  url: this.url,
30807
30587
  status: response.status,
30808
30588
  statusText,
@@ -30814,7 +30594,7 @@ class HttpStatelessConnector extends BaseAsyncConnector {
30814
30594
  if (error instanceof FameTransportClose) {
30815
30595
  throw error;
30816
30596
  }
30817
- logger$k.error('http_request_error', {
30597
+ logger$l.error('http_request_error', {
30818
30598
  url: this.url,
30819
30599
  error: error instanceof Error ? error.message : String(error),
30820
30600
  });
@@ -31028,7 +30808,7 @@ var httpStatelessConnectorFactory = /*#__PURE__*/Object.freeze({
31028
30808
  default: HttpStatelessConnectorFactory
31029
30809
  });
31030
30810
 
31031
- const logger$j = getLogger('naylence.fame.connector.websocket_connector_factory');
30811
+ const logger$k = getLogger('naylence.fame.connector.websocket_connector_factory');
31032
30812
  let sslLoader = null;
31033
30813
  function setWebSocketConnectorSslLoader(loader) {
31034
30814
  sslLoader = loader;
@@ -31312,7 +31092,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
31312
31092
  }
31313
31093
  async _defaultWebSocketClient(url, subprotocols, headers) {
31314
31094
  try {
31315
- logger$j.debug('websocket_connector_connecting', { url, subprotocols });
31095
+ logger$k.debug('websocket_connector_connecting', { url, subprotocols });
31316
31096
  if (typeof window !== 'undefined' &&
31317
31097
  typeof window.WebSocket !== 'undefined') {
31318
31098
  return await this._createBrowserWebSocket(url, subprotocols);
@@ -31395,7 +31175,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
31395
31175
  await Promise.resolve().then(function () { return websocketConnectorNodeSsl; });
31396
31176
  }
31397
31177
  catch (error) {
31398
- logger$j.debug('ssl_certificate_loader_import_failed', {
31178
+ logger$k.debug('ssl_certificate_loader_import_failed', {
31399
31179
  error: error instanceof Error ? error.message : String(error),
31400
31180
  });
31401
31181
  }
@@ -31404,7 +31184,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
31404
31184
  if (!loader) {
31405
31185
  return undefined;
31406
31186
  }
31407
- return await loader(logger$j);
31187
+ return await loader(logger$k);
31408
31188
  }
31409
31189
  }
31410
31190
 
@@ -31739,7 +31519,7 @@ var atMostOnceDeliveryPolicyFactory = /*#__PURE__*/Object.freeze({
31739
31519
  default: AtMostOnceDeliveryPolicyFactory
31740
31520
  });
31741
31521
 
31742
- const logger$i = getLogger('naylence.fame.delivery.delivery_profile_factory');
31522
+ const logger$j = getLogger('naylence.fame.delivery.delivery_profile_factory');
31743
31523
  const PROFILE_NAME_AT_LEAST_ONCE = 'at-least-once';
31744
31524
  const PROFILE_NAME_AT_MOST_ONCE = 'at-most-once';
31745
31525
  const ENV_VAR_FAME_DELIVERY_MAX_RETRIES = 'FAME_DELIVERY_MAX_RETRIES';
@@ -31779,7 +31559,7 @@ class DeliveryProfileFactory extends DeliveryPolicyFactory {
31779
31559
  async create(config) {
31780
31560
  const normalized = normalizeDeliveryProfileConfig(config);
31781
31561
  const profileConfig = resolveProfileConfig$1(normalized.profile);
31782
- logger$i.debug('enabling_delivery_profile', { profile: normalized.profile });
31562
+ logger$j.debug('enabling_delivery_profile', { profile: normalized.profile });
31783
31563
  const policy = await DeliveryPolicyFactory.createDeliveryPolicy(profileConfig);
31784
31564
  if (!policy) {
31785
31565
  throw new Error(`Failed to create delivery policy for profile: ${normalized.profile}`);
@@ -31862,7 +31642,7 @@ function isSinkService(service) {
31862
31642
  service.capabilities.includes(SINK_CAPABILITY));
31863
31643
  }
31864
31644
 
31865
- const logger$h = getLogger('naylence.fame.fabric.in_process');
31645
+ const logger$i = getLogger('naylence.fame.fabric.in_process');
31866
31646
  function normalizeNodeConfig(config) {
31867
31647
  if (config && typeof config === 'object' && !Array.isArray(config)) {
31868
31648
  return config;
@@ -31886,13 +31666,13 @@ class InProcessFameFabric extends FameFabric {
31886
31666
  this._versionLogged = true;
31887
31667
  const version = await resolveRuntimeVersion();
31888
31668
  if (version) {
31889
- logger$h.info('naylence_runtime_startup', {
31669
+ logger$i.info('naylence_runtime_startup', {
31890
31670
  version,
31891
31671
  fabric_type: 'in_process',
31892
31672
  });
31893
31673
  }
31894
31674
  else {
31895
- logger$h.warning('naylence_runtime_version_not_found', {
31675
+ logger$i.warning('naylence_runtime_version_not_found', {
31896
31676
  message: 'Could not determine package version',
31897
31677
  fabric_type: 'in_process',
31898
31678
  });
@@ -31917,7 +31697,7 @@ class InProcessFameFabric extends FameFabric {
31917
31697
  return;
31918
31698
  }
31919
31699
  await this.logStartupVersion();
31920
- logger$h.debug('starting_fabric', { type: 'in_process' });
31700
+ logger$i.debug('starting_fabric', { type: 'in_process' });
31921
31701
  if (!this._currentNode) {
31922
31702
  const nodeConfig = normalizeNodeConfig(this._config?.node ?? null);
31923
31703
  this._currentNode = await NodeLikeFactory.createNode(nodeConfig);
@@ -32052,7 +31832,7 @@ var inProcessFameFabricFactory = /*#__PURE__*/Object.freeze({
32052
31832
  default: InProcessFameFabricFactory
32053
31833
  });
32054
31834
 
32055
- const logger$g = getLogger('naylence.fame.node.admission.admission_profile_factory');
31835
+ const logger$h = getLogger('naylence.fame.node.admission.admission_profile_factory');
32056
31836
  const ENV_VAR_IS_ROOT = 'FAME_ROOT';
32057
31837
  const ENV_VAR_JWT_AUDIENCE = 'FAME_JWT_AUDIENCE';
32058
31838
  const ENV_VAR_ADMISSION_TOKEN_URL = 'FAME_ADMISSION_TOKEN_URL';
@@ -32287,7 +32067,7 @@ class AdmissionProfileFactory extends AdmissionClientFactory {
32287
32067
  async create(config) {
32288
32068
  const normalized = normalizeConfig$m(config);
32289
32069
  const profileConfig = resolveProfileConfig(normalized.profile);
32290
- logger$g.debug('enabling_admission_profile', { profile: normalized.profile });
32070
+ logger$h.debug('enabling_admission_profile', { profile: normalized.profile });
32291
32071
  return AdmissionClientFactory.createAdmissionClient(profileConfig);
32292
32072
  }
32293
32073
  }
@@ -32326,7 +32106,7 @@ var admissionProfileFactory = /*#__PURE__*/Object.freeze({
32326
32106
  default: AdmissionProfileFactory
32327
32107
  });
32328
32108
 
32329
- const logger$f = getLogger('naylence.fame.node.admission.direct_admission_client');
32109
+ const logger$g = getLogger('naylence.fame.node.admission.direct_admission_client');
32330
32110
  class DirectAdmissionClient {
32331
32111
  constructor(options) {
32332
32112
  this.hasUpstream = true;
@@ -32351,7 +32131,7 @@ class DirectAdmissionClient {
32351
32131
  }
32352
32132
  }
32353
32133
  async hello(systemId, instanceId, requestedLogicals) {
32354
- logger$f.debug('direct_admission_hello_start', {
32134
+ logger$g.debug('direct_admission_hello_start', {
32355
32135
  providedSystemId: systemId,
32356
32136
  instanceId,
32357
32137
  requestedLogicals,
@@ -32359,7 +32139,7 @@ class DirectAdmissionClient {
32359
32139
  const effectiveSystemId = systemId && systemId.trim().length > 0
32360
32140
  ? systemId
32361
32141
  : await generateIdAsync({ mode: 'fingerprint' }).catch(async () => {
32362
- logger$f.debug('direct_admission_fingerprint_generation_failed', {
32142
+ logger$g.debug('direct_admission_fingerprint_generation_failed', {
32363
32143
  reason: 'falling back to random id',
32364
32144
  });
32365
32145
  return generateIdAsync({ mode: 'random' });
@@ -32381,7 +32161,7 @@ class DirectAdmissionClient {
32381
32161
  const envelope = createFameEnvelope({
32382
32162
  frame: welcomeFrame,
32383
32163
  });
32384
- logger$f.debug('direct_admission_hello_success', {
32164
+ logger$g.debug('direct_admission_hello_success', {
32385
32165
  systemId: welcomeFrame.systemId,
32386
32166
  instanceId: welcomeFrame.instanceId,
32387
32167
  acceptedLogicals: welcomeFrame.acceptedLogicals,
@@ -32558,7 +32338,7 @@ var noAuthInjectionStrategyFactory = /*#__PURE__*/Object.freeze({
32558
32338
  default: NoAuthInjectionStrategyFactory
32559
32339
  });
32560
32340
 
32561
- const logger$e = getLogger('naylence.fame.node.admission.welcome_service_client');
32341
+ const logger$f = getLogger('naylence.fame.node.admission.welcome_service_client');
32562
32342
  class WelcomeServiceClient {
32563
32343
  constructor(options) {
32564
32344
  this.hasUpstream = options.hasUpstream ?? options.has_upstream ?? false;
@@ -32607,7 +32387,7 @@ class WelcomeServiceClient {
32607
32387
  'Content-Type': 'application/json',
32608
32388
  ...authHeaders,
32609
32389
  };
32610
- logger$e.debug('welcome_service_hello_request', {
32390
+ logger$f.debug('welcome_service_hello_request', {
32611
32391
  url: this.url,
32612
32392
  systemId,
32613
32393
  instanceId,
@@ -32643,7 +32423,7 @@ class WelcomeServiceClient {
32643
32423
  parsedEnvelope.frame.type !== 'NodeWelcome') {
32644
32424
  throw new Error(`Unexpected frame type '${parsedEnvelope.frame?.type ?? 'unknown'}'`);
32645
32425
  }
32646
- logger$e.debug('welcome_service_hello_success', {
32426
+ logger$f.debug('welcome_service_hello_success', {
32647
32427
  systemId: parsedEnvelope.frame.systemId,
32648
32428
  targetSystemId: parsedEnvelope.frame.targetSystemId,
32649
32429
  assignedPath: parsedEnvelope.frame.assignedPath,
@@ -33779,7 +33559,7 @@ var noopTokenVerifierFactory = /*#__PURE__*/Object.freeze({
33779
33559
  default: NoopTokenVerifierFactory
33780
33560
  });
33781
33561
 
33782
- const logger$d = getLogger('naylence.fame.security.auth.oauth2_authorizer_factory');
33562
+ const logger$e = getLogger('naylence.fame.security.auth.oauth2_authorizer_factory');
33783
33563
  let oauth2AuthorizerModulePromise = null;
33784
33564
  function getOAuth2AuthorizerModule() {
33785
33565
  if (!oauth2AuthorizerModulePromise) {
@@ -33806,12 +33586,12 @@ class OAuth2AuthorizerFactory extends AuthorizerFactory {
33806
33586
  if (normalized.tokenIssuerConfig) {
33807
33587
  try {
33808
33588
  tokenIssuer = await TokenIssuerFactory.createTokenIssuer(normalized.tokenIssuerConfig);
33809
- logger$d.debug('token_issuer_created_for_reverse_auth', {
33589
+ logger$e.debug('token_issuer_created_for_reverse_auth', {
33810
33590
  issuer_type: normalized.tokenIssuerConfig.type,
33811
33591
  });
33812
33592
  }
33813
33593
  catch (error) {
33814
- logger$d.warning('failed_to_create_token_issuer_for_reverse_auth', {
33594
+ logger$e.warning('failed_to_create_token_issuer_for_reverse_auth', {
33815
33595
  error: error instanceof Error ? error.message : String(error),
33816
33596
  issuer_config: normalized.tokenIssuerConfig,
33817
33597
  });
@@ -34764,7 +34544,7 @@ var sessionKeyCredentialProviderFactory = /*#__PURE__*/Object.freeze({
34764
34544
  normalizeSessionKeyConfig: normalizeSessionKeyConfig
34765
34545
  });
34766
34546
 
34767
- const logger$c = getLogger('naylence.fame.security.default_security_manager_factory');
34547
+ const logger$d = getLogger('naylence.fame.security.default_security_manager_factory');
34768
34548
  function normalizeDefaultSecurityManagerConfig(config) {
34769
34549
  if (!config) {
34770
34550
  return null;
@@ -34932,7 +34712,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
34932
34712
  return await KeyStoreFactory.createKeyStore(value, createOptions ?? undefined);
34933
34713
  }
34934
34714
  catch (error) {
34935
- logger$c.error('failed_to_create_key_store_from_config', {
34715
+ logger$d.error('failed_to_create_key_store_from_config', {
34936
34716
  error: error instanceof Error ? error.message : String(error),
34937
34717
  });
34938
34718
  return null;
@@ -34968,7 +34748,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
34968
34748
  return null;
34969
34749
  }
34970
34750
  const cryptoProvider = cryptoProviderOverride ?? null;
34971
- logger$c.debug('auto_create_envelope_signer', {
34751
+ logger$d.debug('auto_create_envelope_signer', {
34972
34752
  has_crypto_override: Boolean(cryptoProviderOverride),
34973
34753
  override_constructor: cryptoProviderOverride
34974
34754
  ? (cryptoProviderOverride.constructor?.name ?? 'unknown')
@@ -34989,7 +34769,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
34989
34769
  });
34990
34770
  }
34991
34771
  catch (error) {
34992
- logger$c.error('failed_to_auto_create_envelope_signer', {
34772
+ logger$d.error('failed_to_auto_create_envelope_signer', {
34993
34773
  error: error instanceof Error ? error.message : String(error),
34994
34774
  exc_info: true,
34995
34775
  });
@@ -35024,7 +34804,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
35024
34804
  });
35025
34805
  }
35026
34806
  catch (error) {
35027
- logger$c.error('failed_to_auto_create_envelope_verifier', {
34807
+ logger$d.error('failed_to_auto_create_envelope_verifier', {
35028
34808
  error: error instanceof Error ? error.message : String(error),
35029
34809
  exc_info: true,
35030
34810
  });
@@ -35036,7 +34816,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
35036
34816
  if (encryptionConfig &&
35037
34817
  DefaultSecurityManagerFactory.isConfigLike(encryptionConfig)) {
35038
34818
  if (!keyManager) {
35039
- logger$c.warning('encryption_manager_config_requires_key_manager');
34819
+ logger$d.warning('encryption_manager_config_requires_key_manager');
35040
34820
  return { encryptionManager: null, secureChannelManager };
35041
34821
  }
35042
34822
  const manager = await EncryptionManagerFactory.createEncryptionManager(encryptionConfig, {
@@ -35073,7 +34853,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
35073
34853
  return { encryptionManager: manager, secureChannelManager };
35074
34854
  }
35075
34855
  catch (error) {
35076
- logger$c.error('failed_to_auto_create_encryption_manager', {
34856
+ logger$d.error('failed_to_auto_create_encryption_manager', {
35077
34857
  error: error instanceof Error ? error.message : String(error),
35078
34858
  exc_info: true,
35079
34859
  });
@@ -35116,7 +34896,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
35116
34896
  });
35117
34897
  }
35118
34898
  catch (error) {
35119
- logger$c.error('failed_to_auto_create_key_manager', {
34899
+ logger$d.error('failed_to_auto_create_key_manager', {
35120
34900
  error: error instanceof Error ? error.message : String(error),
35121
34901
  exc_info: true,
35122
34902
  });
@@ -35165,7 +34945,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
35165
34945
  })) ?? null);
35166
34946
  }
35167
34947
  catch (error) {
35168
- logger$c.error('failed_to_auto_create_authorizer', {
34948
+ logger$d.error('failed_to_auto_create_authorizer', {
35169
34949
  error: error instanceof Error ? error.message : String(error),
35170
34950
  exc_info: true,
35171
34951
  });
@@ -35194,7 +34974,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
35194
34974
  });
35195
34975
  }
35196
34976
  catch (error) {
35197
- logger$c.error('failed_to_auto_create_certificate_manager', {
34977
+ logger$d.error('failed_to_auto_create_certificate_manager', {
35198
34978
  error: error instanceof Error ? error.message : String(error),
35199
34979
  exc_info: true,
35200
34980
  });
@@ -35452,7 +35232,7 @@ var defaultKeyManagerFactory = /*#__PURE__*/Object.freeze({
35452
35232
  default: DefaultKeyManagerFactory
35453
35233
  });
35454
35234
 
35455
- const logger$b = getLogger('naylence.fame.security.keys.in_memory_key_store');
35235
+ const logger$c = getLogger('naylence.fame.security.keys.in_memory_key_store');
35456
35236
  class InMemoryKeyStore extends KeyStore {
35457
35237
  constructor(initialKeys = null) {
35458
35238
  super();
@@ -35474,7 +35254,7 @@ class InMemoryKeyStore extends KeyStore {
35474
35254
  }
35475
35255
  catch (error) {
35476
35256
  if (error instanceof JWKValidationError) {
35477
- logger$b.warning('rejected_invalid_jwk_individual', {
35257
+ logger$c.warning('rejected_invalid_jwk_individual', {
35478
35258
  kid,
35479
35259
  error: error.message,
35480
35260
  });
@@ -35518,7 +35298,7 @@ class InMemoryKeyStore extends KeyStore {
35518
35298
  }
35519
35299
  }
35520
35300
  if (staleKeys.length > 0) {
35521
- logger$b.debug('removing_stale_keys_before_adding_new_key', {
35301
+ logger$c.debug('removing_stale_keys_before_adding_new_key', {
35522
35302
  new_kid: kid,
35523
35303
  physical_path: physicalPath,
35524
35304
  base_path: basePath,
@@ -35546,7 +35326,7 @@ class InMemoryKeyStore extends KeyStore {
35546
35326
  }
35547
35327
  keysByPath[path].push(existingKid);
35548
35328
  }
35549
- logger$b.debug('key_lookup_failed', {
35329
+ logger$c.debug('key_lookup_failed', {
35550
35330
  missing_kid: kid,
35551
35331
  available_kids: Array.from(this.keys.keys()),
35552
35332
  keys_by_path: keysByPath,
@@ -35595,7 +35375,7 @@ class InMemoryKeyStore extends KeyStore {
35595
35375
  this.keys.delete(kid);
35596
35376
  }
35597
35377
  if (keysToRemove.length > 0) {
35598
- logger$b.debug('removed_keys_for_path', {
35378
+ logger$c.debug('removed_keys_for_path', {
35599
35379
  physical_path: physicalPath,
35600
35380
  removed_key_ids: keysToRemove,
35601
35381
  count: keysToRemove.length,
@@ -35606,7 +35386,7 @@ class InMemoryKeyStore extends KeyStore {
35606
35386
  async removeKey(kid) {
35607
35387
  const removed = this.keys.delete(kid);
35608
35388
  if (removed) {
35609
- logger$b.debug('removed_individual_key', { kid });
35389
+ logger$c.debug('removed_individual_key', { kid });
35610
35390
  }
35611
35391
  return removed;
35612
35392
  }
@@ -35972,7 +35752,7 @@ var capabilityAwareRoutingPolicyFactory = /*#__PURE__*/Object.freeze({
35972
35752
  default: CapabilityAwareRoutingPolicyFactory
35973
35753
  });
35974
35754
 
35975
- const logger$a = getLogger('naylence.fame.sentinel.composite_routing_policy_factory');
35755
+ const logger$b = getLogger('naylence.fame.sentinel.composite_routing_policy_factory');
35976
35756
  const FACTORY_META$8 = {
35977
35757
  base: ROUTING_POLICY_FACTORY_BASE,
35978
35758
  key: 'CompositeRoutingPolicy',
@@ -35998,13 +35778,13 @@ class CompositeRoutingPolicyFactory extends RoutingPolicyFactory {
35998
35778
  policies.push(policy);
35999
35779
  }
36000
35780
  else {
36001
- logger$a.warning('composite_policy_null_child', {
35781
+ logger$b.warning('composite_policy_null_child', {
36002
35782
  config: policyConfig,
36003
35783
  });
36004
35784
  }
36005
35785
  }
36006
35786
  catch (error) {
36007
- logger$a.warning('composite_policy_child_error', {
35787
+ logger$b.warning('composite_policy_child_error', {
36008
35788
  error: error instanceof Error ? error.message : String(error),
36009
35789
  config: policyConfig,
36010
35790
  });
@@ -36300,7 +36080,7 @@ var hrwLoadBalancingStrategyFactory = /*#__PURE__*/Object.freeze({
36300
36080
  default: HRWLoadBalancingStrategyFactory
36301
36081
  });
36302
36082
 
36303
- const logger$9 = getLogger('naylence.fame.sentinel.load_balancing.load_balancing_profile_factory');
36083
+ const logger$a = getLogger('naylence.fame.sentinel.load_balancing.load_balancing_profile_factory');
36304
36084
  const PROFILE_NAME_RANDOM = 'random';
36305
36085
  const PROFILE_NAME_ROUND_ROBIN = 'round_robin';
36306
36086
  const PROFILE_NAME_HRW = 'hrw';
@@ -36334,7 +36114,7 @@ class LoadBalancingProfileFactory extends LoadBalancingStrategyFactory {
36334
36114
  async create(config, ...factoryArgs) {
36335
36115
  const finalConfig = this.normalizeConfig(config);
36336
36116
  const profileName = finalConfig.profile ?? PROFILE_NAME_DEVELOPMENT$1;
36337
- logger$9.debug('enabling_load_balancing_profile', { profile: profileName });
36117
+ logger$a.debug('enabling_load_balancing_profile', { profile: profileName });
36338
36118
  const strategyConfig = this.resolveProfile(profileName);
36339
36119
  const strategy = await createResource$1(LOAD_BALANCING_STRATEGY_FACTORY_BASE, strategyConfig, { factoryArgs });
36340
36120
  if (!strategy) {
@@ -36525,7 +36305,7 @@ var stickyLoadBalancingStrategyFactory = /*#__PURE__*/Object.freeze({
36525
36305
  default: StickyLoadBalancingStrategyFactory
36526
36306
  });
36527
36307
 
36528
- const logger$8 = getLogger('naylence.fame.sentinel.routing_profile_factory');
36308
+ const logger$9 = getLogger('naylence.fame.sentinel.routing_profile_factory');
36529
36309
  const PROFILE_NAME_DEVELOPMENT = 'development';
36530
36310
  const PROFILE_NAME_PRODUCTION = 'production';
36531
36311
  const PROFILE_NAME_BASIC = 'basic';
@@ -36576,7 +36356,7 @@ class RoutingProfileFactory extends RoutingPolicyFactory {
36576
36356
  }
36577
36357
  async create(config, ...kwargs) {
36578
36358
  const normalized = this.normalizeConfig(config);
36579
- logger$8.debug('enabling_routing_profile', { profile: normalized.profile });
36359
+ logger$9.debug('enabling_routing_profile', { profile: normalized.profile });
36580
36360
  const routingConfig = this.getProfileConfig(normalized.profile);
36581
36361
  const policy = await createResource$1(ROUTING_POLICY_FACTORY_BASE, routingConfig, {
36582
36362
  factoryArgs: kwargs,
@@ -36872,21 +36652,21 @@ class OpenTelemetryTraceEmitter extends BaseTraceEmitter {
36872
36652
  }
36873
36653
  function normalizeOpenTelemetryTraceEmitterOptions(input) {
36874
36654
  const source = (input ?? {});
36875
- const serviceName = extractNonEmptyString(pickFirst(source, ['serviceName', 'service_name'])) ?? 'naylence-service';
36876
- const tracer = pickFirst(source, ['tracer']);
36877
- const otelApi = pickFirst(source, [
36655
+ const serviceName = extractNonEmptyString$1(pickFirst$1(source, ['serviceName', 'service_name'])) ?? 'naylence-service';
36656
+ const tracer = pickFirst$1(source, ['tracer']);
36657
+ const otelApi = pickFirst$1(source, [
36878
36658
  'otelApi',
36879
36659
  'otel_api',
36880
36660
  ]);
36881
36661
  if (!otelApi) {
36882
36662
  throw new Error('OpenTelemetryTraceEmitter requires OpenTelemetry API bindings. Provide otelApi via options.');
36883
36663
  }
36884
- const lifecycle = pickFirst(source, [
36664
+ const lifecycle = pickFirst$1(source, [
36885
36665
  'lifecycle',
36886
36666
  'lifeCycle',
36887
36667
  'life_cycle',
36888
36668
  ]) ?? null;
36889
- const authStrategy = pickFirst(source, [
36669
+ const authStrategy = pickFirst$1(source, [
36890
36670
  'authStrategy',
36891
36671
  'auth_strategy',
36892
36672
  ]) ?? null;
@@ -36898,7 +36678,7 @@ function normalizeOpenTelemetryTraceEmitterOptions(input) {
36898
36678
  authStrategy,
36899
36679
  };
36900
36680
  }
36901
- function pickFirst(source, keys) {
36681
+ function pickFirst$1(source, keys) {
36902
36682
  for (const key of keys) {
36903
36683
  if (Object.prototype.hasOwnProperty.call(source, key)) {
36904
36684
  const value = source[key];
@@ -36909,7 +36689,7 @@ function pickFirst(source, keys) {
36909
36689
  }
36910
36690
  return undefined;
36911
36691
  }
36912
- function extractNonEmptyString(value) {
36692
+ function extractNonEmptyString$1(value) {
36913
36693
  if (typeof value === 'string') {
36914
36694
  const trimmed = value.trim();
36915
36695
  if (trimmed.length > 0) {
@@ -36962,6 +36742,241 @@ var openTelemetryTraceEmitter = /*#__PURE__*/Object.freeze({
36962
36742
  OpenTelemetryTraceEmitter: OpenTelemetryTraceEmitter
36963
36743
  });
36964
36744
 
36745
+ const logger$8 = getLogger('naylence.fame.telemetry.otel_setup');
36746
+ const stringFrom = (...codes) => String.fromCharCode(...codes);
36747
+ const OTEL_PREFIX = `${stringFrom(64, 111, 112, 101, 110, 116, 101, 108, 101, 109, 101, 116, 114, 121)}${stringFrom(47)}`;
36748
+ const OTEL_API_SPEC = `${OTEL_PREFIX}${stringFrom(97, 112, 105)}`;
36749
+ const OTEL_RESOURCES_SPEC = `${OTEL_PREFIX}${stringFrom(114, 101, 115, 111, 117, 114, 99, 101, 115)}`;
36750
+ const OTEL_TRACE_NODE_SPEC = `${OTEL_PREFIX}${stringFrom(115, 100, 107, 45, 116, 114, 97, 99, 101, 45, 110, 111, 100, 101)}`;
36751
+ const OTEL_TRACE_BASE_SPEC = `${OTEL_PREFIX}${stringFrom(115, 100, 107, 45, 116, 114, 97, 99, 101, 45, 98, 97, 115, 101)}`;
36752
+ const OTEL_EXPORTER_HTTP_SPEC = `${OTEL_PREFIX}${stringFrom(101, 120, 112, 111, 114, 116, 101, 114, 45, 116, 114, 97, 99, 101, 45, 111, 116, 108, 112, 45, 104, 116, 116, 112)}`;
36753
+ let registeredOtel = null;
36754
+ async function setupOtel(options) {
36755
+ const normalized = normalizeSetupOtelOptions(options);
36756
+ try {
36757
+ if (registeredOtel) {
36758
+ logger$8.debug('open_telemetry_reusing_provider', {
36759
+ service_name: normalized.serviceName,
36760
+ });
36761
+ return registeredOtel.control;
36762
+ }
36763
+ const [apiModule, resourcesModule, nodeModule, traceBaseModule] = await Promise.all([
36764
+ import(OTEL_API_SPEC),
36765
+ import(OTEL_RESOURCES_SPEC),
36766
+ import(OTEL_TRACE_NODE_SPEC),
36767
+ import(OTEL_TRACE_BASE_SPEC),
36768
+ ]);
36769
+ const { trace } = apiModule;
36770
+ const { defaultResource, resourceFromAttributes } = resourcesModule;
36771
+ const { NodeTracerProvider } = nodeModule;
36772
+ const { BatchSpanProcessor, ConsoleSpanExporter, ParentBasedSampler, AlwaysOnSampler, AlwaysOffSampler, TraceIdRatioBasedSampler, } = traceBaseModule;
36773
+ const currentProvider = trace.getTracerProvider();
36774
+ if (currentProvider && currentProvider instanceof NodeTracerProvider) {
36775
+ return null;
36776
+ }
36777
+ if (currentProvider &&
36778
+ currentProvider.constructor?.name === 'NodeTracerProvider') {
36779
+ logger$8.debug('open_telemetry_existing_node_provider', {
36780
+ service_name: normalized.serviceName,
36781
+ });
36782
+ return null;
36783
+ }
36784
+ logger$8.debug('open_telemetry_initializing', {
36785
+ service_name: normalized.serviceName,
36786
+ endpoint: normalized.endpoint ?? null,
36787
+ environment: normalized.environment ?? null,
36788
+ sampler: normalized.sampler ?? null,
36789
+ headers_present: Boolean(normalized.headers && Object.keys(normalized.headers).length),
36790
+ });
36791
+ const sampler = resolveSampler(normalized.sampler, {
36792
+ ParentBasedSampler,
36793
+ AlwaysOnSampler,
36794
+ AlwaysOffSampler,
36795
+ TraceIdRatioBasedSampler,
36796
+ });
36797
+ const baseResource = defaultResource();
36798
+ const mergedResource = resourceFromAttributes({
36799
+ 'service.name': normalized.serviceName,
36800
+ 'service.instance.id': generateInstanceId(),
36801
+ 'deployment.environment': normalized.environment ?? 'dev',
36802
+ });
36803
+ const resource = baseResource.merge(mergedResource);
36804
+ const exporter = await resolveExporter(normalized.endpoint ?? undefined, normalized.headers, ConsoleSpanExporter);
36805
+ const spanProcessor = new BatchSpanProcessor(exporter);
36806
+ const provider = new NodeTracerProvider({
36807
+ resource,
36808
+ sampler,
36809
+ spanProcessors: [spanProcessor],
36810
+ });
36811
+ provider.register();
36812
+ logger$8.debug('open_telemetry_initialized', {
36813
+ service_name: normalized.serviceName,
36814
+ exporter: exporter.constructor?.name ?? 'unknown_exporter',
36815
+ });
36816
+ const control = {
36817
+ forceFlush: async () => {
36818
+ try {
36819
+ await provider.forceFlush();
36820
+ }
36821
+ catch (flushError) {
36822
+ logger$8.warning('open_telemetry_force_flush_failed', {
36823
+ error: flushError instanceof Error
36824
+ ? flushError.message
36825
+ : String(flushError),
36826
+ });
36827
+ }
36828
+ },
36829
+ shutdown: async () => {
36830
+ try {
36831
+ await provider.shutdown();
36832
+ }
36833
+ catch (shutdownError) {
36834
+ logger$8.warning('open_telemetry_shutdown_failed', {
36835
+ error: shutdownError instanceof Error
36836
+ ? shutdownError.message
36837
+ : String(shutdownError),
36838
+ });
36839
+ }
36840
+ finally {
36841
+ registeredOtel = null;
36842
+ }
36843
+ },
36844
+ };
36845
+ registeredOtel = {
36846
+ provider,
36847
+ control,
36848
+ };
36849
+ return control;
36850
+ }
36851
+ catch (error) {
36852
+ logger$8.error('open_telemetry_not_available', {
36853
+ error: error instanceof Error ? error.message : String(error),
36854
+ stack: error instanceof Error && error.stack ? error.stack : undefined,
36855
+ });
36856
+ return null;
36857
+ }
36858
+ }
36859
+ function normalizeSetupOtelOptions(options) {
36860
+ const source = (options ?? {});
36861
+ const serviceName = extractNonEmptyString(pickFirst(source, ['serviceName', 'service_name'])) ??
36862
+ 'naylence-service';
36863
+ const endpoint = extractNonEmptyString(pickFirst(source, ['endpoint', 'otlpEndpoint', 'otlp_endpoint'])) ?? null;
36864
+ const environment = extractNonEmptyString(pickFirst(source, [
36865
+ 'environment',
36866
+ 'deploymentEnvironment',
36867
+ 'deployment_environment',
36868
+ ])) ?? null;
36869
+ const sampler = extractNonEmptyString(pickFirst(source, ['sampler', 'samplingStrategy', 'sampling_strategy'])) ?? null;
36870
+ const headers = extractHeaders(pickFirst(source, ['headers', 'otlpHeaders', 'otlp_headers']));
36871
+ return {
36872
+ serviceName,
36873
+ endpoint,
36874
+ environment,
36875
+ sampler,
36876
+ headers: headers ?? undefined,
36877
+ };
36878
+ }
36879
+ function pickFirst(source, keys) {
36880
+ for (const key of keys) {
36881
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
36882
+ const value = source[key];
36883
+ if (value !== undefined) {
36884
+ return value;
36885
+ }
36886
+ }
36887
+ }
36888
+ return undefined;
36889
+ }
36890
+ function extractNonEmptyString(value) {
36891
+ if (typeof value === 'string') {
36892
+ const trimmed = value.trim();
36893
+ if (trimmed.length > 0) {
36894
+ return trimmed;
36895
+ }
36896
+ }
36897
+ return undefined;
36898
+ }
36899
+ function extractHeaders(value) {
36900
+ if (!value || typeof value !== 'object') {
36901
+ return null;
36902
+ }
36903
+ const headers = {};
36904
+ for (const [key, raw] of Object.entries(value)) {
36905
+ if (typeof raw === 'string') {
36906
+ headers[key] = raw;
36907
+ }
36908
+ }
36909
+ return Object.keys(headers).length > 0 ? headers : null;
36910
+ }
36911
+ function generateInstanceId() {
36912
+ try {
36913
+ if (typeof crypto !== 'undefined' &&
36914
+ typeof crypto.randomUUID === 'function') {
36915
+ return crypto.randomUUID().replace(/-/g, '');
36916
+ }
36917
+ }
36918
+ catch {
36919
+ // Ignore crypto availability errors
36920
+ }
36921
+ const random = Math.random().toString(16).slice(2);
36922
+ return random.padEnd(32, '0').slice(0, 32);
36923
+ }
36924
+ function resolveSampler(samplerSetting, samplers) {
36925
+ const normalized = (samplerSetting ?? 'parentbased_always_on').toLowerCase();
36926
+ let base;
36927
+ if (normalized === 'always_off') {
36928
+ base = new samplers.AlwaysOffSampler();
36929
+ }
36930
+ else if (normalized === 'always_on' ||
36931
+ normalized === 'parentbased_always_on') {
36932
+ base = new samplers.AlwaysOnSampler();
36933
+ }
36934
+ else if (normalized.startsWith('ratio:')) {
36935
+ const ratioValue = Number.parseFloat(normalized.slice('ratio:'.length));
36936
+ const ratio = Number.isFinite(ratioValue)
36937
+ ? Math.min(Math.max(ratioValue, 0), 1)
36938
+ : 1;
36939
+ base = new samplers.TraceIdRatioBasedSampler(ratio);
36940
+ }
36941
+ else {
36942
+ base = new samplers.AlwaysOnSampler();
36943
+ }
36944
+ return new samplers.ParentBasedSampler({ root: base });
36945
+ }
36946
+ async function resolveExporter(endpoint, headers, ConsoleSpanExporter) {
36947
+ if (endpoint) {
36948
+ try {
36949
+ const exporterModule = await import(OTEL_EXPORTER_HTTP_SPEC);
36950
+ if ('OTLPTraceExporter' in exporterModule) {
36951
+ const { OTLPTraceExporter } = exporterModule;
36952
+ const exporterOptions = {
36953
+ url: endpoint,
36954
+ };
36955
+ if (headers && Object.keys(headers).length > 0) {
36956
+ exporterOptions.headers = headers;
36957
+ }
36958
+ logger$8.debug('open_telemetry_using_otlp_http_exporter', {
36959
+ endpoint,
36960
+ headers_present: Boolean(headers && Object.keys(headers).length),
36961
+ });
36962
+ return new OTLPTraceExporter(exporterOptions);
36963
+ }
36964
+ }
36965
+ catch (error) {
36966
+ logger$8.error('open_telemetry_exporter_not_available', {
36967
+ error: error instanceof Error ? error.message : String(error),
36968
+ });
36969
+ }
36970
+ }
36971
+ logger$8.warning('open_telemetry_falling_back_to_console_exporter');
36972
+ return new ConsoleSpanExporter();
36973
+ }
36974
+
36975
+ var otelSetup = /*#__PURE__*/Object.freeze({
36976
+ __proto__: null,
36977
+ setupOtel: setupOtel
36978
+ });
36979
+
36965
36980
  const logger$7 = getLogger('naylence.fame.connector.default_http_server');
36966
36981
  function makeKey(host, port) {
36967
36982
  return `${host}:${port}`;