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