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

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