@naylence/runtime 0.3.5-test.928 → 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.
@@ -14,12 +14,12 @@ var fastify = require('fastify');
14
14
  var websocketPlugin = require('@fastify/websocket');
15
15
 
16
16
  // This file is auto-generated during build - do not edit manually
17
- // Generated from package.json version: 0.3.5-test.928
17
+ // Generated from package.json version: 0.3.5-test.930
18
18
  /**
19
19
  * The package version, injected at build time.
20
20
  * @internal
21
21
  */
22
- const VERSION = '0.3.5-test.928';
22
+ const VERSION = '0.3.5-test.930';
23
23
 
24
24
  /**
25
25
  * Fame protocol specific error classes with WebSocket close codes and proper inheritance.
@@ -28371,239 +28371,10 @@ var noopTraceEmitterFactory = /*#__PURE__*/Object.freeze({
28371
28371
  default: NoopTraceEmitterFactory
28372
28372
  });
28373
28373
 
28374
- const logger$q = getLogger('naylence.fame.telemetry.otel_setup');
28375
- const stringFrom = (...codes) => String.fromCharCode(...codes);
28376
- const OTEL_PREFIX = `${stringFrom(64, 111, 112, 101, 110, 116, 101, 108, 101, 109, 101, 116, 114, 121)}${stringFrom(47)}`;
28377
- const OTEL_API_SPEC = `${OTEL_PREFIX}${stringFrom(97, 112, 105)}`;
28378
- const OTEL_RESOURCES_SPEC = `${OTEL_PREFIX}${stringFrom(114, 101, 115, 111, 117, 114, 99, 101, 115)}`;
28379
- const OTEL_TRACE_NODE_SPEC = `${OTEL_PREFIX}${stringFrom(115, 100, 107, 45, 116, 114, 97, 99, 101, 45, 110, 111, 100, 101)}`;
28380
- const OTEL_TRACE_BASE_SPEC = `${OTEL_PREFIX}${stringFrom(115, 100, 107, 45, 116, 114, 97, 99, 101, 45, 98, 97, 115, 101)}`;
28381
- 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)}`;
28382
- let registeredOtel = null;
28383
- async function setupOtel(options) {
28384
- const normalized = normalizeSetupOtelOptions(options);
28385
- try {
28386
- if (registeredOtel) {
28387
- logger$q.debug('open_telemetry_reusing_provider', {
28388
- service_name: normalized.serviceName,
28389
- });
28390
- return registeredOtel.control;
28391
- }
28392
- const [apiModule, resourcesModule, nodeModule, traceBaseModule] = await Promise.all([
28393
- import(OTEL_API_SPEC),
28394
- import(OTEL_RESOURCES_SPEC),
28395
- import(OTEL_TRACE_NODE_SPEC),
28396
- import(OTEL_TRACE_BASE_SPEC),
28397
- ]);
28398
- const { trace } = apiModule;
28399
- const { defaultResource, resourceFromAttributes } = resourcesModule;
28400
- const { NodeTracerProvider } = nodeModule;
28401
- const { BatchSpanProcessor, ConsoleSpanExporter, ParentBasedSampler, AlwaysOnSampler, AlwaysOffSampler, TraceIdRatioBasedSampler, } = traceBaseModule;
28402
- const currentProvider = trace.getTracerProvider();
28403
- if (currentProvider && currentProvider instanceof NodeTracerProvider) {
28404
- return null;
28405
- }
28406
- if (currentProvider &&
28407
- currentProvider.constructor?.name === 'NodeTracerProvider') {
28408
- logger$q.debug('open_telemetry_existing_node_provider', {
28409
- service_name: normalized.serviceName,
28410
- });
28411
- return null;
28412
- }
28413
- logger$q.debug('open_telemetry_initializing', {
28414
- service_name: normalized.serviceName,
28415
- endpoint: normalized.endpoint ?? null,
28416
- environment: normalized.environment ?? null,
28417
- sampler: normalized.sampler ?? null,
28418
- headers_present: Boolean(normalized.headers && Object.keys(normalized.headers).length),
28419
- });
28420
- const sampler = resolveSampler(normalized.sampler, {
28421
- ParentBasedSampler,
28422
- AlwaysOnSampler,
28423
- AlwaysOffSampler,
28424
- TraceIdRatioBasedSampler,
28425
- });
28426
- const baseResource = defaultResource();
28427
- const mergedResource = resourceFromAttributes({
28428
- 'service.name': normalized.serviceName,
28429
- 'service.instance.id': generateInstanceId(),
28430
- 'deployment.environment': normalized.environment ?? 'dev',
28431
- });
28432
- const resource = baseResource.merge(mergedResource);
28433
- const exporter = await resolveExporter(normalized.endpoint ?? undefined, normalized.headers, ConsoleSpanExporter);
28434
- const spanProcessor = new BatchSpanProcessor(exporter);
28435
- const provider = new NodeTracerProvider({
28436
- resource,
28437
- sampler,
28438
- spanProcessors: [spanProcessor],
28439
- });
28440
- provider.register();
28441
- logger$q.debug('open_telemetry_initialized', {
28442
- service_name: normalized.serviceName,
28443
- exporter: exporter.constructor?.name ?? 'unknown_exporter',
28444
- });
28445
- const control = {
28446
- forceFlush: async () => {
28447
- try {
28448
- await provider.forceFlush();
28449
- }
28450
- catch (flushError) {
28451
- logger$q.warning('open_telemetry_force_flush_failed', {
28452
- error: flushError instanceof Error
28453
- ? flushError.message
28454
- : String(flushError),
28455
- });
28456
- }
28457
- },
28458
- shutdown: async () => {
28459
- try {
28460
- await provider.shutdown();
28461
- }
28462
- catch (shutdownError) {
28463
- logger$q.warning('open_telemetry_shutdown_failed', {
28464
- error: shutdownError instanceof Error
28465
- ? shutdownError.message
28466
- : String(shutdownError),
28467
- });
28468
- }
28469
- finally {
28470
- registeredOtel = null;
28471
- }
28472
- },
28473
- };
28474
- registeredOtel = {
28475
- provider,
28476
- control,
28477
- };
28478
- return control;
28479
- }
28480
- catch (error) {
28481
- logger$q.error('open_telemetry_not_available', {
28482
- error: error instanceof Error ? error.message : String(error),
28483
- stack: error instanceof Error && error.stack ? error.stack : undefined,
28484
- });
28485
- return null;
28486
- }
28487
- }
28488
- function normalizeSetupOtelOptions(options) {
28489
- const source = (options ?? {});
28490
- const serviceName = extractNonEmptyString$1(pickFirst$2(source, ['serviceName', 'service_name'])) ??
28491
- 'naylence-service';
28492
- const endpoint = extractNonEmptyString$1(pickFirst$2(source, ['endpoint', 'otlpEndpoint', 'otlp_endpoint'])) ?? null;
28493
- const environment = extractNonEmptyString$1(pickFirst$2(source, [
28494
- 'environment',
28495
- 'deploymentEnvironment',
28496
- 'deployment_environment',
28497
- ])) ?? null;
28498
- const sampler = extractNonEmptyString$1(pickFirst$2(source, ['sampler', 'samplingStrategy', 'sampling_strategy'])) ?? null;
28499
- const headers = extractHeaders$1(pickFirst$2(source, ['headers', 'otlpHeaders', 'otlp_headers']));
28500
- return {
28501
- serviceName,
28502
- endpoint,
28503
- environment,
28504
- sampler,
28505
- headers: headers ?? undefined,
28506
- };
28507
- }
28508
- function pickFirst$2(source, keys) {
28509
- for (const key of keys) {
28510
- if (Object.prototype.hasOwnProperty.call(source, key)) {
28511
- const value = source[key];
28512
- if (value !== undefined) {
28513
- return value;
28514
- }
28515
- }
28516
- }
28517
- return undefined;
28518
- }
28519
- function extractNonEmptyString$1(value) {
28520
- if (typeof value === 'string') {
28521
- const trimmed = value.trim();
28522
- if (trimmed.length > 0) {
28523
- return trimmed;
28524
- }
28525
- }
28526
- return undefined;
28527
- }
28528
- function extractHeaders$1(value) {
28529
- if (!value || typeof value !== 'object') {
28530
- return null;
28531
- }
28532
- const headers = {};
28533
- for (const [key, raw] of Object.entries(value)) {
28534
- if (typeof raw === 'string') {
28535
- headers[key] = raw;
28536
- }
28537
- }
28538
- return Object.keys(headers).length > 0 ? headers : null;
28539
- }
28540
- function generateInstanceId() {
28541
- try {
28542
- if (typeof crypto !== 'undefined' &&
28543
- typeof crypto.randomUUID === 'function') {
28544
- return crypto.randomUUID().replace(/-/g, '');
28545
- }
28546
- }
28547
- catch {
28548
- // Ignore crypto availability errors
28549
- }
28550
- const random = Math.random().toString(16).slice(2);
28551
- return random.padEnd(32, '0').slice(0, 32);
28552
- }
28553
- function resolveSampler(samplerSetting, samplers) {
28554
- const normalized = (samplerSetting ?? 'parentbased_always_on').toLowerCase();
28555
- let base;
28556
- if (normalized === 'always_off') {
28557
- base = new samplers.AlwaysOffSampler();
28558
- }
28559
- else if (normalized === 'always_on' ||
28560
- normalized === 'parentbased_always_on') {
28561
- base = new samplers.AlwaysOnSampler();
28562
- }
28563
- else if (normalized.startsWith('ratio:')) {
28564
- const ratioValue = Number.parseFloat(normalized.slice('ratio:'.length));
28565
- const ratio = Number.isFinite(ratioValue)
28566
- ? Math.min(Math.max(ratioValue, 0), 1)
28567
- : 1;
28568
- base = new samplers.TraceIdRatioBasedSampler(ratio);
28569
- }
28570
- else {
28571
- base = new samplers.AlwaysOnSampler();
28572
- }
28573
- return new samplers.ParentBasedSampler({ root: base });
28574
- }
28575
- async function resolveExporter(endpoint, headers, ConsoleSpanExporter) {
28576
- if (endpoint) {
28577
- try {
28578
- const exporterModule = await import(OTEL_EXPORTER_HTTP_SPEC);
28579
- if ('OTLPTraceExporter' in exporterModule) {
28580
- const { OTLPTraceExporter } = exporterModule;
28581
- const exporterOptions = {
28582
- url: endpoint,
28583
- };
28584
- if (headers && Object.keys(headers).length > 0) {
28585
- exporterOptions.headers = headers;
28586
- }
28587
- logger$q.debug('open_telemetry_using_otlp_http_exporter', {
28588
- endpoint,
28589
- headers_present: Boolean(headers && Object.keys(headers).length),
28590
- });
28591
- return new OTLPTraceExporter(exporterOptions);
28592
- }
28593
- }
28594
- catch (error) {
28595
- logger$q.error('open_telemetry_exporter_not_available', {
28596
- error: error instanceof Error ? error.message : String(error),
28597
- });
28598
- }
28599
- }
28600
- logger$q.warning('open_telemetry_falling_back_to_console_exporter');
28601
- return new ConsoleSpanExporter();
28602
- }
28603
-
28604
28374
  let openTelemetryTraceEmitterModulePromise = null;
28605
28375
  let otelApiModulePromise = null;
28606
- const logger$p = getLogger('naylence.fame.telemetry.open_telemetry_trace_emitter_factory');
28376
+ let otelSetupModulePromise = null;
28377
+ const logger$q = getLogger('naylence.fame.telemetry.open_telemetry_trace_emitter_factory');
28607
28378
  const MISSING_OTEL_HELP_MESSAGE = 'Missing optional OpenTelemetry dependency. Install @opentelemetry/api (and related packages) to enable trace emission.';
28608
28379
  function getOpenTelemetryTraceEmitterModule() {
28609
28380
  if (!openTelemetryTraceEmitterModulePromise) {
@@ -28621,6 +28392,14 @@ function getOtelApiModule() {
28621
28392
  }
28622
28393
  return otelApiModulePromise;
28623
28394
  }
28395
+ function getOtelSetupModule() {
28396
+ if (!otelSetupModulePromise) {
28397
+ otelSetupModulePromise = safeImport(() => Promise.resolve().then(function () { return otelSetup; }), '@opentelemetry/api', {
28398
+ helpMessage: MISSING_OTEL_HELP_MESSAGE,
28399
+ });
28400
+ }
28401
+ return otelSetupModulePromise;
28402
+ }
28624
28403
  const FACTORY_META$Z = {
28625
28404
  base: TRACE_EMITTER_FACTORY_BASE_TYPE,
28626
28405
  key: 'OpenTelemetryTraceEmitter',
@@ -28644,7 +28423,7 @@ class OpenTelemetryTraceEmitterFactory extends TraceEmitterFactory {
28644
28423
  await AuthInjectionStrategyFactory.createAuthInjectionStrategy(normalized.auth);
28645
28424
  try {
28646
28425
  await authStrategy.apply(mergedHeaders);
28647
- logger$p.info('trace_emitter_auth_applied', {
28426
+ logger$q.info('trace_emitter_auth_applied', {
28648
28427
  service_name: normalized.serviceName,
28649
28428
  });
28650
28429
  }
@@ -28660,6 +28439,7 @@ class OpenTelemetryTraceEmitterFactory extends TraceEmitterFactory {
28660
28439
  }
28661
28440
  let lifecycle = null;
28662
28441
  try {
28442
+ const { setupOtel } = await getOtelSetupModule();
28663
28443
  lifecycle = await setupOtel({
28664
28444
  serviceName: normalized.serviceName,
28665
28445
  endpoint: normalized.endpoint,
@@ -28667,7 +28447,7 @@ class OpenTelemetryTraceEmitterFactory extends TraceEmitterFactory {
28667
28447
  sampler: normalized.sampler,
28668
28448
  headers: Object.keys(mergedHeaders).length > 0 ? mergedHeaders : undefined,
28669
28449
  });
28670
- logger$p.debug('trace_emitter_lifecycle_acquired', {
28450
+ logger$q.debug('trace_emitter_lifecycle_acquired', {
28671
28451
  service_name: normalized.serviceName,
28672
28452
  lifecycle_available: Boolean(lifecycle),
28673
28453
  });
@@ -28705,7 +28485,7 @@ class OpenTelemetryTraceEmitterFactory extends TraceEmitterFactory {
28705
28485
  }
28706
28486
  try {
28707
28487
  const emitter = new OpenTelemetryTraceEmitter(emitterOptions);
28708
- logger$p.debug('trace_emitter_created', {
28488
+ logger$q.debug('trace_emitter_created', {
28709
28489
  service_name: normalized.serviceName,
28710
28490
  has_lifecycle: Boolean(lifecycle),
28711
28491
  has_auth_strategy: Boolean(authStrategy),
@@ -28737,17 +28517,17 @@ function normalizeConfig$r(config) {
28737
28517
  };
28738
28518
  }
28739
28519
  const candidate = config;
28740
- const serviceName = extractString(pickFirst$1(candidate, ['serviceName', 'service_name'])) ??
28520
+ const serviceName = extractString(pickFirst$2(candidate, ['serviceName', 'service_name'])) ??
28741
28521
  'naylence-service';
28742
- const endpoint = extractString(pickFirst$1(candidate, ['endpoint', 'otlpEndpoint', 'otlp_endpoint'])) ?? null;
28743
- const environment = extractString(pickFirst$1(candidate, [
28522
+ const endpoint = extractString(pickFirst$2(candidate, ['endpoint', 'otlpEndpoint', 'otlp_endpoint'])) ?? null;
28523
+ const environment = extractString(pickFirst$2(candidate, [
28744
28524
  'environment',
28745
28525
  'deploymentEnvironment',
28746
28526
  'deployment_environment',
28747
28527
  ])) ?? null;
28748
- const sampler = extractString(pickFirst$1(candidate, ['sampler', 'samplingStrategy', 'sampling_strategy'])) ?? null;
28749
- const headersFromConfig = extractHeaders(pickFirst$1(candidate, ['headers', 'otlpHeaders', 'otlp_headers']));
28750
- const authConfig = pickFirst$1(candidate, [
28528
+ const sampler = extractString(pickFirst$2(candidate, ['sampler', 'samplingStrategy', 'sampling_strategy'])) ?? null;
28529
+ const headersFromConfig = extractHeaders$1(pickFirst$2(candidate, ['headers', 'otlpHeaders', 'otlp_headers']));
28530
+ const authConfig = pickFirst$2(candidate, [
28751
28531
  'auth',
28752
28532
  ]);
28753
28533
  return {
@@ -28765,7 +28545,7 @@ function extractString(value) {
28765
28545
  }
28766
28546
  return undefined;
28767
28547
  }
28768
- function pickFirst$1(source, keys) {
28548
+ function pickFirst$2(source, keys) {
28769
28549
  for (const key of keys) {
28770
28550
  if (Object.prototype.hasOwnProperty.call(source, key)) {
28771
28551
  const value = source[key];
@@ -28776,7 +28556,7 @@ function pickFirst$1(source, keys) {
28776
28556
  }
28777
28557
  return undefined;
28778
28558
  }
28779
- function extractHeaders(value) {
28559
+ function extractHeaders$1(value) {
28780
28560
  if (!value || typeof value !== 'object') {
28781
28561
  return null;
28782
28562
  }
@@ -28796,7 +28576,7 @@ var openTelemetryTraceEmitterFactory = /*#__PURE__*/Object.freeze({
28796
28576
  default: OpenTelemetryTraceEmitterFactory
28797
28577
  });
28798
28578
 
28799
- const logger$o = getLogger('naylence.fame.telemetry.trace_emitter_profile_factory');
28579
+ const logger$p = getLogger('naylence.fame.telemetry.trace_emitter_profile_factory');
28800
28580
  const PROFILE_NAME_NOOP$1 = 'noop';
28801
28581
  const PROFILE_NAME_OPEN_TELEMETRY = 'open-telemetry';
28802
28582
  const ENV_VAR_TELEMETRY_SERVICE_NAME = 'FAME_TELEMETRY_SERVICE_NAME';
@@ -28824,7 +28604,7 @@ class TraceEmitterProfileFactory extends TraceEmitterFactory {
28824
28604
  async create(config, ...factoryArgs) {
28825
28605
  const normalized = normalizeTraceEmitterProfileConfig(config);
28826
28606
  const profileConfig = resolveProfileConfig$2(normalized.profile);
28827
- logger$o.debug('enabling_trace_emitter_profile', {
28607
+ logger$p.debug('enabling_trace_emitter_profile', {
28828
28608
  profile: normalized.profile,
28829
28609
  });
28830
28610
  const traceEmitter = await TraceEmitterFactory.createTraceEmitter(profileConfig, {
@@ -29234,7 +29014,7 @@ var httpListenerFactory = /*#__PURE__*/Object.freeze({
29234
29014
  default: HttpListenerFactory
29235
29015
  });
29236
29016
 
29237
- const logger$n = getLogger('naylence.fame.connector.http_stateless_connector');
29017
+ const logger$o = getLogger('naylence.fame.connector.http_stateless_connector');
29238
29018
  class HttpStatelessConnector extends BaseAsyncConnector {
29239
29019
  constructor(config, dependencies = {}) {
29240
29020
  super(config);
@@ -29280,7 +29060,7 @@ class HttpStatelessConnector extends BaseAsyncConnector {
29280
29060
  }
29281
29061
  catch (error) {
29282
29062
  if (error instanceof QueueFullError) {
29283
- logger$n.warning('receive_queue_full', {
29063
+ logger$o.warning('receive_queue_full', {
29284
29064
  url: this.url,
29285
29065
  });
29286
29066
  }
@@ -29302,7 +29082,7 @@ class HttpStatelessConnector extends BaseAsyncConnector {
29302
29082
  });
29303
29083
  if (!response.ok) {
29304
29084
  const statusText = response.statusText || 'HTTP error';
29305
- logger$n.error('http_request_failed', {
29085
+ logger$o.error('http_request_failed', {
29306
29086
  url: this.url,
29307
29087
  status: response.status,
29308
29088
  statusText,
@@ -29314,7 +29094,7 @@ class HttpStatelessConnector extends BaseAsyncConnector {
29314
29094
  if (error instanceof FameTransportClose) {
29315
29095
  throw error;
29316
29096
  }
29317
- logger$n.error('http_request_error', {
29097
+ logger$o.error('http_request_error', {
29318
29098
  url: this.url,
29319
29099
  error: error instanceof Error ? error.message : String(error),
29320
29100
  });
@@ -29752,7 +29532,7 @@ var inpageListenerFactory = /*#__PURE__*/Object.freeze({
29752
29532
  default: InPageListenerFactory
29753
29533
  });
29754
29534
 
29755
- const logger$m = getLogger('naylence.fame.connector.websocket_connector_factory');
29535
+ const logger$n = getLogger('naylence.fame.connector.websocket_connector_factory');
29756
29536
  let sslLoader = null;
29757
29537
  function setWebSocketConnectorSslLoader(loader) {
29758
29538
  sslLoader = loader;
@@ -30036,7 +29816,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
30036
29816
  }
30037
29817
  async _defaultWebSocketClient(url, subprotocols, headers) {
30038
29818
  try {
30039
- logger$m.debug('websocket_connector_connecting', { url, subprotocols });
29819
+ logger$n.debug('websocket_connector_connecting', { url, subprotocols });
30040
29820
  if (typeof window !== 'undefined' &&
30041
29821
  typeof window.WebSocket !== 'undefined') {
30042
29822
  return await this._createBrowserWebSocket(url, subprotocols);
@@ -30119,7 +29899,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
30119
29899
  await Promise.resolve().then(function () { return websocketConnectorNodeSsl; });
30120
29900
  }
30121
29901
  catch (error) {
30122
- logger$m.debug('ssl_certificate_loader_import_failed', {
29902
+ logger$n.debug('ssl_certificate_loader_import_failed', {
30123
29903
  error: error instanceof Error ? error.message : String(error),
30124
29904
  });
30125
29905
  }
@@ -30128,7 +29908,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
30128
29908
  if (!loader) {
30129
29909
  return undefined;
30130
29910
  }
30131
- return await loader(logger$m);
29911
+ return await loader(logger$n);
30132
29912
  }
30133
29913
  }
30134
29914
 
@@ -30463,7 +30243,7 @@ var atMostOnceDeliveryPolicyFactory = /*#__PURE__*/Object.freeze({
30463
30243
  default: AtMostOnceDeliveryPolicyFactory
30464
30244
  });
30465
30245
 
30466
- const logger$l = getLogger('naylence.fame.delivery.delivery_profile_factory');
30246
+ const logger$m = getLogger('naylence.fame.delivery.delivery_profile_factory');
30467
30247
  const PROFILE_NAME_AT_LEAST_ONCE = 'at-least-once';
30468
30248
  const PROFILE_NAME_AT_MOST_ONCE = 'at-most-once';
30469
30249
  const ENV_VAR_FAME_DELIVERY_MAX_RETRIES = 'FAME_DELIVERY_MAX_RETRIES';
@@ -30503,7 +30283,7 @@ class DeliveryProfileFactory extends DeliveryPolicyFactory {
30503
30283
  async create(config) {
30504
30284
  const normalized = normalizeDeliveryProfileConfig(config);
30505
30285
  const profileConfig = resolveProfileConfig$1(normalized.profile);
30506
- logger$l.debug('enabling_delivery_profile', { profile: normalized.profile });
30286
+ logger$m.debug('enabling_delivery_profile', { profile: normalized.profile });
30507
30287
  const policy = await DeliveryPolicyFactory.createDeliveryPolicy(profileConfig);
30508
30288
  if (!policy) {
30509
30289
  throw new Error(`Failed to create delivery policy for profile: ${normalized.profile}`);
@@ -30586,7 +30366,7 @@ function isSinkService(service) {
30586
30366
  service.capabilities.includes(core.SINK_CAPABILITY));
30587
30367
  }
30588
30368
 
30589
- const logger$k = getLogger('naylence.fame.fabric.in_process');
30369
+ const logger$l = getLogger('naylence.fame.fabric.in_process');
30590
30370
  function normalizeNodeConfig(config) {
30591
30371
  if (config && typeof config === 'object' && !Array.isArray(config)) {
30592
30372
  return config;
@@ -30610,13 +30390,13 @@ class InProcessFameFabric extends core.FameFabric {
30610
30390
  this._versionLogged = true;
30611
30391
  const version = await resolveRuntimeVersion();
30612
30392
  if (version) {
30613
- logger$k.info('naylence_runtime_startup', {
30393
+ logger$l.info('naylence_runtime_startup', {
30614
30394
  version,
30615
30395
  fabric_type: 'in_process',
30616
30396
  });
30617
30397
  }
30618
30398
  else {
30619
- logger$k.warning('naylence_runtime_version_not_found', {
30399
+ logger$l.warning('naylence_runtime_version_not_found', {
30620
30400
  message: 'Could not determine package version',
30621
30401
  fabric_type: 'in_process',
30622
30402
  });
@@ -30641,7 +30421,7 @@ class InProcessFameFabric extends core.FameFabric {
30641
30421
  return;
30642
30422
  }
30643
30423
  await this.logStartupVersion();
30644
- logger$k.debug('starting_fabric', { type: 'in_process' });
30424
+ logger$l.debug('starting_fabric', { type: 'in_process' });
30645
30425
  if (!this._currentNode) {
30646
30426
  const nodeConfig = normalizeNodeConfig(this._config?.node ?? null);
30647
30427
  this._currentNode = await NodeLikeFactory.createNode(nodeConfig);
@@ -30776,7 +30556,7 @@ var inProcessFameFabricFactory = /*#__PURE__*/Object.freeze({
30776
30556
  default: InProcessFameFabricFactory
30777
30557
  });
30778
30558
 
30779
- const logger$j = getLogger('naylence.fame.node.admission.admission_profile_factory');
30559
+ const logger$k = getLogger('naylence.fame.node.admission.admission_profile_factory');
30780
30560
  const ENV_VAR_IS_ROOT = 'FAME_ROOT';
30781
30561
  const ENV_VAR_JWT_AUDIENCE = 'FAME_JWT_AUDIENCE';
30782
30562
  const ENV_VAR_ADMISSION_TOKEN_URL = 'FAME_ADMISSION_TOKEN_URL';
@@ -31011,7 +30791,7 @@ class AdmissionProfileFactory extends AdmissionClientFactory {
31011
30791
  async create(config) {
31012
30792
  const normalized = normalizeConfig$m(config);
31013
30793
  const profileConfig = resolveProfileConfig(normalized.profile);
31014
- logger$j.debug('enabling_admission_profile', { profile: normalized.profile });
30794
+ logger$k.debug('enabling_admission_profile', { profile: normalized.profile });
31015
30795
  return AdmissionClientFactory.createAdmissionClient(profileConfig);
31016
30796
  }
31017
30797
  }
@@ -31050,7 +30830,7 @@ var admissionProfileFactory = /*#__PURE__*/Object.freeze({
31050
30830
  default: AdmissionProfileFactory
31051
30831
  });
31052
30832
 
31053
- const logger$i = getLogger('naylence.fame.node.admission.direct_admission_client');
30833
+ const logger$j = getLogger('naylence.fame.node.admission.direct_admission_client');
31054
30834
  class DirectAdmissionClient {
31055
30835
  constructor(options) {
31056
30836
  this.hasUpstream = true;
@@ -31075,7 +30855,7 @@ class DirectAdmissionClient {
31075
30855
  }
31076
30856
  }
31077
30857
  async hello(systemId, instanceId, requestedLogicals) {
31078
- logger$i.debug('direct_admission_hello_start', {
30858
+ logger$j.debug('direct_admission_hello_start', {
31079
30859
  providedSystemId: systemId,
31080
30860
  instanceId,
31081
30861
  requestedLogicals,
@@ -31083,7 +30863,7 @@ class DirectAdmissionClient {
31083
30863
  const effectiveSystemId = systemId && systemId.trim().length > 0
31084
30864
  ? systemId
31085
30865
  : await core.generateIdAsync({ mode: 'fingerprint' }).catch(async () => {
31086
- logger$i.debug('direct_admission_fingerprint_generation_failed', {
30866
+ logger$j.debug('direct_admission_fingerprint_generation_failed', {
31087
30867
  reason: 'falling back to random id',
31088
30868
  });
31089
30869
  return core.generateIdAsync({ mode: 'random' });
@@ -31105,7 +30885,7 @@ class DirectAdmissionClient {
31105
30885
  const envelope = core.createFameEnvelope({
31106
30886
  frame: welcomeFrame,
31107
30887
  });
31108
- logger$i.debug('direct_admission_hello_success', {
30888
+ logger$j.debug('direct_admission_hello_success', {
31109
30889
  systemId: welcomeFrame.systemId,
31110
30890
  instanceId: welcomeFrame.instanceId,
31111
30891
  acceptedLogicals: welcomeFrame.acceptedLogicals,
@@ -31282,7 +31062,7 @@ var noAuthInjectionStrategyFactory = /*#__PURE__*/Object.freeze({
31282
31062
  default: NoAuthInjectionStrategyFactory
31283
31063
  });
31284
31064
 
31285
- const logger$h = getLogger('naylence.fame.node.admission.welcome_service_client');
31065
+ const logger$i = getLogger('naylence.fame.node.admission.welcome_service_client');
31286
31066
  class WelcomeServiceClient {
31287
31067
  constructor(options) {
31288
31068
  this.hasUpstream = options.hasUpstream ?? options.has_upstream ?? false;
@@ -31331,7 +31111,7 @@ class WelcomeServiceClient {
31331
31111
  'Content-Type': 'application/json',
31332
31112
  ...authHeaders,
31333
31113
  };
31334
- logger$h.debug('welcome_service_hello_request', {
31114
+ logger$i.debug('welcome_service_hello_request', {
31335
31115
  url: this.url,
31336
31116
  systemId,
31337
31117
  instanceId,
@@ -31367,7 +31147,7 @@ class WelcomeServiceClient {
31367
31147
  parsedEnvelope.frame.type !== 'NodeWelcome') {
31368
31148
  throw new Error(`Unexpected frame type '${parsedEnvelope.frame?.type ?? 'unknown'}'`);
31369
31149
  }
31370
- logger$h.debug('welcome_service_hello_success', {
31150
+ logger$i.debug('welcome_service_hello_success', {
31371
31151
  systemId: parsedEnvelope.frame.systemId,
31372
31152
  targetSystemId: parsedEnvelope.frame.targetSystemId,
31373
31153
  assignedPath: parsedEnvelope.frame.assignedPath,
@@ -32503,7 +32283,7 @@ var noopTokenVerifierFactory = /*#__PURE__*/Object.freeze({
32503
32283
  default: NoopTokenVerifierFactory
32504
32284
  });
32505
32285
 
32506
- const logger$g = getLogger('naylence.fame.security.auth.oauth2_authorizer_factory');
32286
+ const logger$h = getLogger('naylence.fame.security.auth.oauth2_authorizer_factory');
32507
32287
  let oauth2AuthorizerModulePromise = null;
32508
32288
  function getOAuth2AuthorizerModule() {
32509
32289
  if (!oauth2AuthorizerModulePromise) {
@@ -32530,12 +32310,12 @@ class OAuth2AuthorizerFactory extends AuthorizerFactory {
32530
32310
  if (normalized.tokenIssuerConfig) {
32531
32311
  try {
32532
32312
  tokenIssuer = await TokenIssuerFactory.createTokenIssuer(normalized.tokenIssuerConfig);
32533
- logger$g.debug('token_issuer_created_for_reverse_auth', {
32313
+ logger$h.debug('token_issuer_created_for_reverse_auth', {
32534
32314
  issuer_type: normalized.tokenIssuerConfig.type,
32535
32315
  });
32536
32316
  }
32537
32317
  catch (error) {
32538
- logger$g.warning('failed_to_create_token_issuer_for_reverse_auth', {
32318
+ logger$h.warning('failed_to_create_token_issuer_for_reverse_auth', {
32539
32319
  error: error instanceof Error ? error.message : String(error),
32540
32320
  issuer_config: normalized.tokenIssuerConfig,
32541
32321
  });
@@ -33488,7 +33268,7 @@ var sessionKeyCredentialProviderFactory = /*#__PURE__*/Object.freeze({
33488
33268
  normalizeSessionKeyConfig: normalizeSessionKeyConfig
33489
33269
  });
33490
33270
 
33491
- const logger$f = getLogger('naylence.fame.security.default_security_manager_factory');
33271
+ const logger$g = getLogger('naylence.fame.security.default_security_manager_factory');
33492
33272
  function normalizeDefaultSecurityManagerConfig(config) {
33493
33273
  if (!config) {
33494
33274
  return null;
@@ -33656,7 +33436,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
33656
33436
  return await KeyStoreFactory.createKeyStore(value, createOptions ?? undefined);
33657
33437
  }
33658
33438
  catch (error) {
33659
- logger$f.error('failed_to_create_key_store_from_config', {
33439
+ logger$g.error('failed_to_create_key_store_from_config', {
33660
33440
  error: error instanceof Error ? error.message : String(error),
33661
33441
  });
33662
33442
  return null;
@@ -33692,7 +33472,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
33692
33472
  return null;
33693
33473
  }
33694
33474
  const cryptoProvider = cryptoProviderOverride ?? null;
33695
- logger$f.debug('auto_create_envelope_signer', {
33475
+ logger$g.debug('auto_create_envelope_signer', {
33696
33476
  has_crypto_override: Boolean(cryptoProviderOverride),
33697
33477
  override_constructor: cryptoProviderOverride
33698
33478
  ? (cryptoProviderOverride.constructor?.name ?? 'unknown')
@@ -33713,7 +33493,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
33713
33493
  });
33714
33494
  }
33715
33495
  catch (error) {
33716
- logger$f.error('failed_to_auto_create_envelope_signer', {
33496
+ logger$g.error('failed_to_auto_create_envelope_signer', {
33717
33497
  error: error instanceof Error ? error.message : String(error),
33718
33498
  exc_info: true,
33719
33499
  });
@@ -33748,7 +33528,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
33748
33528
  });
33749
33529
  }
33750
33530
  catch (error) {
33751
- logger$f.error('failed_to_auto_create_envelope_verifier', {
33531
+ logger$g.error('failed_to_auto_create_envelope_verifier', {
33752
33532
  error: error instanceof Error ? error.message : String(error),
33753
33533
  exc_info: true,
33754
33534
  });
@@ -33760,7 +33540,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
33760
33540
  if (encryptionConfig &&
33761
33541
  DefaultSecurityManagerFactory.isConfigLike(encryptionConfig)) {
33762
33542
  if (!keyManager) {
33763
- logger$f.warning('encryption_manager_config_requires_key_manager');
33543
+ logger$g.warning('encryption_manager_config_requires_key_manager');
33764
33544
  return { encryptionManager: null, secureChannelManager };
33765
33545
  }
33766
33546
  const manager = await EncryptionManagerFactory.createEncryptionManager(encryptionConfig, {
@@ -33797,7 +33577,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
33797
33577
  return { encryptionManager: manager, secureChannelManager };
33798
33578
  }
33799
33579
  catch (error) {
33800
- logger$f.error('failed_to_auto_create_encryption_manager', {
33580
+ logger$g.error('failed_to_auto_create_encryption_manager', {
33801
33581
  error: error instanceof Error ? error.message : String(error),
33802
33582
  exc_info: true,
33803
33583
  });
@@ -33840,7 +33620,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
33840
33620
  });
33841
33621
  }
33842
33622
  catch (error) {
33843
- logger$f.error('failed_to_auto_create_key_manager', {
33623
+ logger$g.error('failed_to_auto_create_key_manager', {
33844
33624
  error: error instanceof Error ? error.message : String(error),
33845
33625
  exc_info: true,
33846
33626
  });
@@ -33889,7 +33669,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
33889
33669
  })) ?? null);
33890
33670
  }
33891
33671
  catch (error) {
33892
- logger$f.error('failed_to_auto_create_authorizer', {
33672
+ logger$g.error('failed_to_auto_create_authorizer', {
33893
33673
  error: error instanceof Error ? error.message : String(error),
33894
33674
  exc_info: true,
33895
33675
  });
@@ -33918,7 +33698,7 @@ class DefaultSecurityManagerFactory extends SecurityManagerFactory {
33918
33698
  });
33919
33699
  }
33920
33700
  catch (error) {
33921
- logger$f.error('failed_to_auto_create_certificate_manager', {
33701
+ logger$g.error('failed_to_auto_create_certificate_manager', {
33922
33702
  error: error instanceof Error ? error.message : String(error),
33923
33703
  exc_info: true,
33924
33704
  });
@@ -34176,7 +33956,7 @@ var defaultKeyManagerFactory = /*#__PURE__*/Object.freeze({
34176
33956
  default: DefaultKeyManagerFactory
34177
33957
  });
34178
33958
 
34179
- const logger$e = getLogger('naylence.fame.security.keys.in_memory_key_store');
33959
+ const logger$f = getLogger('naylence.fame.security.keys.in_memory_key_store');
34180
33960
  class InMemoryKeyStore extends KeyStore {
34181
33961
  constructor(initialKeys = null) {
34182
33962
  super();
@@ -34198,7 +33978,7 @@ class InMemoryKeyStore extends KeyStore {
34198
33978
  }
34199
33979
  catch (error) {
34200
33980
  if (error instanceof JWKValidationError) {
34201
- logger$e.warning('rejected_invalid_jwk_individual', {
33981
+ logger$f.warning('rejected_invalid_jwk_individual', {
34202
33982
  kid,
34203
33983
  error: error.message,
34204
33984
  });
@@ -34242,7 +34022,7 @@ class InMemoryKeyStore extends KeyStore {
34242
34022
  }
34243
34023
  }
34244
34024
  if (staleKeys.length > 0) {
34245
- logger$e.debug('removing_stale_keys_before_adding_new_key', {
34025
+ logger$f.debug('removing_stale_keys_before_adding_new_key', {
34246
34026
  new_kid: kid,
34247
34027
  physical_path: physicalPath,
34248
34028
  base_path: basePath,
@@ -34270,7 +34050,7 @@ class InMemoryKeyStore extends KeyStore {
34270
34050
  }
34271
34051
  keysByPath[path].push(existingKid);
34272
34052
  }
34273
- logger$e.debug('key_lookup_failed', {
34053
+ logger$f.debug('key_lookup_failed', {
34274
34054
  missing_kid: kid,
34275
34055
  available_kids: Array.from(this.keys.keys()),
34276
34056
  keys_by_path: keysByPath,
@@ -34319,7 +34099,7 @@ class InMemoryKeyStore extends KeyStore {
34319
34099
  this.keys.delete(kid);
34320
34100
  }
34321
34101
  if (keysToRemove.length > 0) {
34322
- logger$e.debug('removed_keys_for_path', {
34102
+ logger$f.debug('removed_keys_for_path', {
34323
34103
  physical_path: physicalPath,
34324
34104
  removed_key_ids: keysToRemove,
34325
34105
  count: keysToRemove.length,
@@ -34330,7 +34110,7 @@ class InMemoryKeyStore extends KeyStore {
34330
34110
  async removeKey(kid) {
34331
34111
  const removed = this.keys.delete(kid);
34332
34112
  if (removed) {
34333
- logger$e.debug('removed_individual_key', { kid });
34113
+ logger$f.debug('removed_individual_key', { kid });
34334
34114
  }
34335
34115
  return removed;
34336
34116
  }
@@ -34696,7 +34476,7 @@ var capabilityAwareRoutingPolicyFactory = /*#__PURE__*/Object.freeze({
34696
34476
  default: CapabilityAwareRoutingPolicyFactory
34697
34477
  });
34698
34478
 
34699
- const logger$d = getLogger('naylence.fame.sentinel.composite_routing_policy_factory');
34479
+ const logger$e = getLogger('naylence.fame.sentinel.composite_routing_policy_factory');
34700
34480
  const FACTORY_META$8 = {
34701
34481
  base: ROUTING_POLICY_FACTORY_BASE,
34702
34482
  key: 'CompositeRoutingPolicy',
@@ -34722,13 +34502,13 @@ class CompositeRoutingPolicyFactory extends RoutingPolicyFactory {
34722
34502
  policies.push(policy);
34723
34503
  }
34724
34504
  else {
34725
- logger$d.warning('composite_policy_null_child', {
34505
+ logger$e.warning('composite_policy_null_child', {
34726
34506
  config: policyConfig,
34727
34507
  });
34728
34508
  }
34729
34509
  }
34730
34510
  catch (error) {
34731
- logger$d.warning('composite_policy_child_error', {
34511
+ logger$e.warning('composite_policy_child_error', {
34732
34512
  error: error instanceof Error ? error.message : String(error),
34733
34513
  config: policyConfig,
34734
34514
  });
@@ -35024,7 +34804,7 @@ var hrwLoadBalancingStrategyFactory = /*#__PURE__*/Object.freeze({
35024
34804
  default: HRWLoadBalancingStrategyFactory
35025
34805
  });
35026
34806
 
35027
- const logger$c = getLogger('naylence.fame.sentinel.load_balancing.load_balancing_profile_factory');
34807
+ const logger$d = getLogger('naylence.fame.sentinel.load_balancing.load_balancing_profile_factory');
35028
34808
  const PROFILE_NAME_RANDOM = 'random';
35029
34809
  const PROFILE_NAME_ROUND_ROBIN = 'round_robin';
35030
34810
  const PROFILE_NAME_HRW = 'hrw';
@@ -35058,7 +34838,7 @@ class LoadBalancingProfileFactory extends LoadBalancingStrategyFactory {
35058
34838
  async create(config, ...factoryArgs) {
35059
34839
  const finalConfig = this.normalizeConfig(config);
35060
34840
  const profileName = finalConfig.profile ?? PROFILE_NAME_DEVELOPMENT$1;
35061
- logger$c.debug('enabling_load_balancing_profile', { profile: profileName });
34841
+ logger$d.debug('enabling_load_balancing_profile', { profile: profileName });
35062
34842
  const strategyConfig = this.resolveProfile(profileName);
35063
34843
  const strategy = await factory.createResource(LOAD_BALANCING_STRATEGY_FACTORY_BASE, strategyConfig, { factoryArgs });
35064
34844
  if (!strategy) {
@@ -35249,7 +35029,7 @@ var stickyLoadBalancingStrategyFactory = /*#__PURE__*/Object.freeze({
35249
35029
  default: StickyLoadBalancingStrategyFactory
35250
35030
  });
35251
35031
 
35252
- const logger$b = getLogger('naylence.fame.sentinel.routing_profile_factory');
35032
+ const logger$c = getLogger('naylence.fame.sentinel.routing_profile_factory');
35253
35033
  const PROFILE_NAME_DEVELOPMENT = 'development';
35254
35034
  const PROFILE_NAME_PRODUCTION = 'production';
35255
35035
  const PROFILE_NAME_BASIC = 'basic';
@@ -35300,7 +35080,7 @@ class RoutingProfileFactory extends RoutingPolicyFactory {
35300
35080
  }
35301
35081
  async create(config, ...kwargs) {
35302
35082
  const normalized = this.normalizeConfig(config);
35303
- logger$b.debug('enabling_routing_profile', { profile: normalized.profile });
35083
+ logger$c.debug('enabling_routing_profile', { profile: normalized.profile });
35304
35084
  const routingConfig = this.getProfileConfig(normalized.profile);
35305
35085
  const policy = await factory.createResource(ROUTING_POLICY_FACTORY_BASE, routingConfig, {
35306
35086
  factoryArgs: kwargs,
@@ -35596,21 +35376,21 @@ class OpenTelemetryTraceEmitter extends BaseTraceEmitter {
35596
35376
  }
35597
35377
  function normalizeOpenTelemetryTraceEmitterOptions(input) {
35598
35378
  const source = (input ?? {});
35599
- const serviceName = extractNonEmptyString(pickFirst(source, ['serviceName', 'service_name'])) ?? 'naylence-service';
35600
- const tracer = pickFirst(source, ['tracer']);
35601
- const otelApi = pickFirst(source, [
35379
+ const serviceName = extractNonEmptyString$1(pickFirst$1(source, ['serviceName', 'service_name'])) ?? 'naylence-service';
35380
+ const tracer = pickFirst$1(source, ['tracer']);
35381
+ const otelApi = pickFirst$1(source, [
35602
35382
  'otelApi',
35603
35383
  'otel_api',
35604
35384
  ]);
35605
35385
  if (!otelApi) {
35606
35386
  throw new Error('OpenTelemetryTraceEmitter requires OpenTelemetry API bindings. Provide otelApi via options.');
35607
35387
  }
35608
- const lifecycle = pickFirst(source, [
35388
+ const lifecycle = pickFirst$1(source, [
35609
35389
  'lifecycle',
35610
35390
  'lifeCycle',
35611
35391
  'life_cycle',
35612
35392
  ]) ?? null;
35613
- const authStrategy = pickFirst(source, [
35393
+ const authStrategy = pickFirst$1(source, [
35614
35394
  'authStrategy',
35615
35395
  'auth_strategy',
35616
35396
  ]) ?? null;
@@ -35622,7 +35402,7 @@ function normalizeOpenTelemetryTraceEmitterOptions(input) {
35622
35402
  authStrategy,
35623
35403
  };
35624
35404
  }
35625
- function pickFirst(source, keys) {
35405
+ function pickFirst$1(source, keys) {
35626
35406
  for (const key of keys) {
35627
35407
  if (Object.prototype.hasOwnProperty.call(source, key)) {
35628
35408
  const value = source[key];
@@ -35633,7 +35413,7 @@ function pickFirst(source, keys) {
35633
35413
  }
35634
35414
  return undefined;
35635
35415
  }
35636
- function extractNonEmptyString(value) {
35416
+ function extractNonEmptyString$1(value) {
35637
35417
  if (typeof value === 'string') {
35638
35418
  const trimmed = value.trim();
35639
35419
  if (trimmed.length > 0) {
@@ -35686,6 +35466,241 @@ var openTelemetryTraceEmitter = /*#__PURE__*/Object.freeze({
35686
35466
  OpenTelemetryTraceEmitter: OpenTelemetryTraceEmitter
35687
35467
  });
35688
35468
 
35469
+ const logger$b = getLogger('naylence.fame.telemetry.otel_setup');
35470
+ const stringFrom = (...codes) => String.fromCharCode(...codes);
35471
+ const OTEL_PREFIX = `${stringFrom(64, 111, 112, 101, 110, 116, 101, 108, 101, 109, 101, 116, 114, 121)}${stringFrom(47)}`;
35472
+ const OTEL_API_SPEC = `${OTEL_PREFIX}${stringFrom(97, 112, 105)}`;
35473
+ const OTEL_RESOURCES_SPEC = `${OTEL_PREFIX}${stringFrom(114, 101, 115, 111, 117, 114, 99, 101, 115)}`;
35474
+ const OTEL_TRACE_NODE_SPEC = `${OTEL_PREFIX}${stringFrom(115, 100, 107, 45, 116, 114, 97, 99, 101, 45, 110, 111, 100, 101)}`;
35475
+ const OTEL_TRACE_BASE_SPEC = `${OTEL_PREFIX}${stringFrom(115, 100, 107, 45, 116, 114, 97, 99, 101, 45, 98, 97, 115, 101)}`;
35476
+ 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)}`;
35477
+ let registeredOtel = null;
35478
+ async function setupOtel(options) {
35479
+ const normalized = normalizeSetupOtelOptions(options);
35480
+ try {
35481
+ if (registeredOtel) {
35482
+ logger$b.debug('open_telemetry_reusing_provider', {
35483
+ service_name: normalized.serviceName,
35484
+ });
35485
+ return registeredOtel.control;
35486
+ }
35487
+ const [apiModule, resourcesModule, nodeModule, traceBaseModule] = await Promise.all([
35488
+ import(OTEL_API_SPEC),
35489
+ import(OTEL_RESOURCES_SPEC),
35490
+ import(OTEL_TRACE_NODE_SPEC),
35491
+ import(OTEL_TRACE_BASE_SPEC),
35492
+ ]);
35493
+ const { trace } = apiModule;
35494
+ const { defaultResource, resourceFromAttributes } = resourcesModule;
35495
+ const { NodeTracerProvider } = nodeModule;
35496
+ const { BatchSpanProcessor, ConsoleSpanExporter, ParentBasedSampler, AlwaysOnSampler, AlwaysOffSampler, TraceIdRatioBasedSampler, } = traceBaseModule;
35497
+ const currentProvider = trace.getTracerProvider();
35498
+ if (currentProvider && currentProvider instanceof NodeTracerProvider) {
35499
+ return null;
35500
+ }
35501
+ if (currentProvider &&
35502
+ currentProvider.constructor?.name === 'NodeTracerProvider') {
35503
+ logger$b.debug('open_telemetry_existing_node_provider', {
35504
+ service_name: normalized.serviceName,
35505
+ });
35506
+ return null;
35507
+ }
35508
+ logger$b.debug('open_telemetry_initializing', {
35509
+ service_name: normalized.serviceName,
35510
+ endpoint: normalized.endpoint ?? null,
35511
+ environment: normalized.environment ?? null,
35512
+ sampler: normalized.sampler ?? null,
35513
+ headers_present: Boolean(normalized.headers && Object.keys(normalized.headers).length),
35514
+ });
35515
+ const sampler = resolveSampler(normalized.sampler, {
35516
+ ParentBasedSampler,
35517
+ AlwaysOnSampler,
35518
+ AlwaysOffSampler,
35519
+ TraceIdRatioBasedSampler,
35520
+ });
35521
+ const baseResource = defaultResource();
35522
+ const mergedResource = resourceFromAttributes({
35523
+ 'service.name': normalized.serviceName,
35524
+ 'service.instance.id': generateInstanceId(),
35525
+ 'deployment.environment': normalized.environment ?? 'dev',
35526
+ });
35527
+ const resource = baseResource.merge(mergedResource);
35528
+ const exporter = await resolveExporter(normalized.endpoint ?? undefined, normalized.headers, ConsoleSpanExporter);
35529
+ const spanProcessor = new BatchSpanProcessor(exporter);
35530
+ const provider = new NodeTracerProvider({
35531
+ resource,
35532
+ sampler,
35533
+ spanProcessors: [spanProcessor],
35534
+ });
35535
+ provider.register();
35536
+ logger$b.debug('open_telemetry_initialized', {
35537
+ service_name: normalized.serviceName,
35538
+ exporter: exporter.constructor?.name ?? 'unknown_exporter',
35539
+ });
35540
+ const control = {
35541
+ forceFlush: async () => {
35542
+ try {
35543
+ await provider.forceFlush();
35544
+ }
35545
+ catch (flushError) {
35546
+ logger$b.warning('open_telemetry_force_flush_failed', {
35547
+ error: flushError instanceof Error
35548
+ ? flushError.message
35549
+ : String(flushError),
35550
+ });
35551
+ }
35552
+ },
35553
+ shutdown: async () => {
35554
+ try {
35555
+ await provider.shutdown();
35556
+ }
35557
+ catch (shutdownError) {
35558
+ logger$b.warning('open_telemetry_shutdown_failed', {
35559
+ error: shutdownError instanceof Error
35560
+ ? shutdownError.message
35561
+ : String(shutdownError),
35562
+ });
35563
+ }
35564
+ finally {
35565
+ registeredOtel = null;
35566
+ }
35567
+ },
35568
+ };
35569
+ registeredOtel = {
35570
+ provider,
35571
+ control,
35572
+ };
35573
+ return control;
35574
+ }
35575
+ catch (error) {
35576
+ logger$b.error('open_telemetry_not_available', {
35577
+ error: error instanceof Error ? error.message : String(error),
35578
+ stack: error instanceof Error && error.stack ? error.stack : undefined,
35579
+ });
35580
+ return null;
35581
+ }
35582
+ }
35583
+ function normalizeSetupOtelOptions(options) {
35584
+ const source = (options ?? {});
35585
+ const serviceName = extractNonEmptyString(pickFirst(source, ['serviceName', 'service_name'])) ??
35586
+ 'naylence-service';
35587
+ const endpoint = extractNonEmptyString(pickFirst(source, ['endpoint', 'otlpEndpoint', 'otlp_endpoint'])) ?? null;
35588
+ const environment = extractNonEmptyString(pickFirst(source, [
35589
+ 'environment',
35590
+ 'deploymentEnvironment',
35591
+ 'deployment_environment',
35592
+ ])) ?? null;
35593
+ const sampler = extractNonEmptyString(pickFirst(source, ['sampler', 'samplingStrategy', 'sampling_strategy'])) ?? null;
35594
+ const headers = extractHeaders(pickFirst(source, ['headers', 'otlpHeaders', 'otlp_headers']));
35595
+ return {
35596
+ serviceName,
35597
+ endpoint,
35598
+ environment,
35599
+ sampler,
35600
+ headers: headers ?? undefined,
35601
+ };
35602
+ }
35603
+ function pickFirst(source, keys) {
35604
+ for (const key of keys) {
35605
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
35606
+ const value = source[key];
35607
+ if (value !== undefined) {
35608
+ return value;
35609
+ }
35610
+ }
35611
+ }
35612
+ return undefined;
35613
+ }
35614
+ function extractNonEmptyString(value) {
35615
+ if (typeof value === 'string') {
35616
+ const trimmed = value.trim();
35617
+ if (trimmed.length > 0) {
35618
+ return trimmed;
35619
+ }
35620
+ }
35621
+ return undefined;
35622
+ }
35623
+ function extractHeaders(value) {
35624
+ if (!value || typeof value !== 'object') {
35625
+ return null;
35626
+ }
35627
+ const headers = {};
35628
+ for (const [key, raw] of Object.entries(value)) {
35629
+ if (typeof raw === 'string') {
35630
+ headers[key] = raw;
35631
+ }
35632
+ }
35633
+ return Object.keys(headers).length > 0 ? headers : null;
35634
+ }
35635
+ function generateInstanceId() {
35636
+ try {
35637
+ if (typeof crypto !== 'undefined' &&
35638
+ typeof crypto.randomUUID === 'function') {
35639
+ return crypto.randomUUID().replace(/-/g, '');
35640
+ }
35641
+ }
35642
+ catch {
35643
+ // Ignore crypto availability errors
35644
+ }
35645
+ const random = Math.random().toString(16).slice(2);
35646
+ return random.padEnd(32, '0').slice(0, 32);
35647
+ }
35648
+ function resolveSampler(samplerSetting, samplers) {
35649
+ const normalized = (samplerSetting ?? 'parentbased_always_on').toLowerCase();
35650
+ let base;
35651
+ if (normalized === 'always_off') {
35652
+ base = new samplers.AlwaysOffSampler();
35653
+ }
35654
+ else if (normalized === 'always_on' ||
35655
+ normalized === 'parentbased_always_on') {
35656
+ base = new samplers.AlwaysOnSampler();
35657
+ }
35658
+ else if (normalized.startsWith('ratio:')) {
35659
+ const ratioValue = Number.parseFloat(normalized.slice('ratio:'.length));
35660
+ const ratio = Number.isFinite(ratioValue)
35661
+ ? Math.min(Math.max(ratioValue, 0), 1)
35662
+ : 1;
35663
+ base = new samplers.TraceIdRatioBasedSampler(ratio);
35664
+ }
35665
+ else {
35666
+ base = new samplers.AlwaysOnSampler();
35667
+ }
35668
+ return new samplers.ParentBasedSampler({ root: base });
35669
+ }
35670
+ async function resolveExporter(endpoint, headers, ConsoleSpanExporter) {
35671
+ if (endpoint) {
35672
+ try {
35673
+ const exporterModule = await import(OTEL_EXPORTER_HTTP_SPEC);
35674
+ if ('OTLPTraceExporter' in exporterModule) {
35675
+ const { OTLPTraceExporter } = exporterModule;
35676
+ const exporterOptions = {
35677
+ url: endpoint,
35678
+ };
35679
+ if (headers && Object.keys(headers).length > 0) {
35680
+ exporterOptions.headers = headers;
35681
+ }
35682
+ logger$b.debug('open_telemetry_using_otlp_http_exporter', {
35683
+ endpoint,
35684
+ headers_present: Boolean(headers && Object.keys(headers).length),
35685
+ });
35686
+ return new OTLPTraceExporter(exporterOptions);
35687
+ }
35688
+ }
35689
+ catch (error) {
35690
+ logger$b.error('open_telemetry_exporter_not_available', {
35691
+ error: error instanceof Error ? error.message : String(error),
35692
+ });
35693
+ }
35694
+ }
35695
+ logger$b.warning('open_telemetry_falling_back_to_console_exporter');
35696
+ return new ConsoleSpanExporter();
35697
+ }
35698
+
35699
+ var otelSetup = /*#__PURE__*/Object.freeze({
35700
+ __proto__: null,
35701
+ setupOtel: setupOtel
35702
+ });
35703
+
35689
35704
  /**
35690
35705
  * Abstract base class for transport listeners.
35691
35706
  *