@interfere/node 0.0.1-canary.1 → 0.0.1-canary.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/capture.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_internal_dedupe=require("./internal/dedupe.cjs"),require_internal_env=require("./internal/env.cjs"),require_internal_normalize_request=require("./internal/normalize-request.cjs"),require_internal_remote_config=require("./internal/remote-config.cjs");let _interfere_types_sdk_errors=require("@interfere/types/sdk/errors"),_opentelemetry_api=require("@opentelemetry/api");const TRACER_NAME=`@interfere/node`,DEFAULT_ERROR_MECHANISM={type:_interfere_types_sdk_errors.MECHANISM_TYPE.node.captureError,handled:!0};function captureError(error,request,errorContext){if(!require_internal_env.isEnabledInEnvironment()||!require_internal_remote_config.isPluginEnabled(`errors`)||require_internal_dedupe.isErrorCaptured(error))return;require_internal_dedupe.markErrorCaptured(error);let err=(0,_interfere_types_sdk_errors.toError)(error),normalizedRequest=require_internal_normalize_request.normalizeRequest(request),mechanism=errorContext?.mechanism??DEFAULT_ERROR_MECHANISM,span=_opentelemetry_api.trace.getTracer(TRACER_NAME).startSpan(`interfere.error.captured`,{kind:_opentelemetry_api.SpanKind.INTERNAL},_opentelemetry_api.context.active()),requestMethod=errorContext?.node?.requestMethod??normalizedRequest?.method??null;requestMethod&&span.setAttribute(`http.request.method`,requestMethod);let requestPath=errorContext?.node?.requestPath??normalizedRequest?.path??null;requestPath&&span.setAttribute(`url.path`,requestPath);let sessionId=normalizedRequest?.headers.get(`x-interfere-session`);sessionId&&span.setAttribute(`interfere.session.id`,sessionId);let eventAttrs={"exception.type":err.name,"exception.message":err.message,"interfere.exception.mechanism":mechanism.type,"interfere.exception.handled":mechanism.handled};err.stack&&(eventAttrs[`exception.stacktrace`]=err.stack);let digest=errorContext?.node?.errorDigest;digest&&(eventAttrs[`interfere.error.digest`]=digest),span.addEvent(`exception`,eventAttrs),span.setStatus({code:_opentelemetry_api.SpanStatusCode.ERROR}),span.end()}function captureMessage(message,request,errorContext){captureError(Error(message),request,errorContext)}async function withSpan(name,fn){let span=_opentelemetry_api.trace.getTracer(TRACER_NAME).startSpan(name);try{return await _opentelemetry_api.context.with(_opentelemetry_api.trace.setSpan(_opentelemetry_api.context.active(),span),fn)}catch(error){throw span.recordException(error),span.setStatus({code:_opentelemetry_api.SpanStatusCode.ERROR}),error}finally{span.end()}}exports.captureError=captureError,exports.captureMessage=captureMessage,exports.withSpan=withSpan;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_internal_dedupe=require("./internal/dedupe.cjs"),require_internal_env=require("./internal/env.cjs"),require_internal_normalize_request=require("./internal/normalize-request.cjs");let _interfere_types_sdk_errors=require("@interfere/types/sdk/errors"),_opentelemetry_api=require("@opentelemetry/api");const TRACER_NAME=`@interfere/node`,DEFAULT_ERROR_MECHANISM={type:_interfere_types_sdk_errors.MECHANISM_TYPE.node.captureError,handled:!0};function captureError(error,request,errorContext){if(!require_internal_env.isEnabledInEnvironment()||require_internal_dedupe.isErrorCaptured(error))return;require_internal_dedupe.markErrorCaptured(error);let err=(0,_interfere_types_sdk_errors.toError)(error),normalizedRequest=require_internal_normalize_request.normalizeRequest(request),mechanism=errorContext?.mechanism??DEFAULT_ERROR_MECHANISM,span=_opentelemetry_api.trace.getTracer(TRACER_NAME).startSpan(`interfere.error.captured`,{kind:_opentelemetry_api.SpanKind.INTERNAL},_opentelemetry_api.context.active()),requestMethod=errorContext?.node?.requestMethod??normalizedRequest?.method??null;requestMethod&&span.setAttribute(`http.request.method`,requestMethod);let requestPath=errorContext?.node?.requestPath??normalizedRequest?.path??null;requestPath&&span.setAttribute(`url.path`,requestPath);let sessionId=normalizedRequest?.headers.get(`x-interfere-session`);sessionId&&span.setAttribute(`interfere.session.id`,sessionId);let eventAttrs={"exception.type":err.name,"exception.message":err.message,"interfere.exception.mechanism":mechanism.type,"interfere.exception.handled":mechanism.handled};err.stack&&(eventAttrs[`exception.stacktrace`]=err.stack);let digest=errorContext?.node?.errorDigest;digest&&(eventAttrs[`interfere.error.digest`]=digest),span.addEvent(`exception`,eventAttrs),span.setStatus({code:_opentelemetry_api.SpanStatusCode.ERROR}),span.end()}function captureMessage(message,request,errorContext){captureError(Error(message),request,errorContext)}async function withSpan(name,fn){let span=_opentelemetry_api.trace.getTracer(TRACER_NAME).startSpan(name);try{return await _opentelemetry_api.context.with(_opentelemetry_api.trace.setSpan(_opentelemetry_api.context.active(),span),fn)}catch(error){throw span.recordException(error),span.setStatus({code:_opentelemetry_api.SpanStatusCode.ERROR}),error}finally{span.end()}}exports.captureError=captureError,exports.captureMessage=captureMessage,exports.withSpan=withSpan;
@@ -3,8 +3,7 @@ import { CaptureErrorContext } from "./internal/types.cjs";
3
3
  //#region src/capture.d.ts
4
4
  /**
5
5
  * Reports an error to Interfere. Safe to call from anywhere — no-op when the
6
- * SDK is not configured (`INTERFERE_PUBLIC_KEY` unset) or when the `errors`
7
- * plugin is disabled by remote config.
6
+ * SDK is not configured (`INTERFERE_PUBLIC_KEY` unset).
8
7
  *
9
8
  * Internally opens a short OTel span and records the error as an `exception`
10
9
  * event on it. The span ships through the same `OTLPTraceExporter` wired up
@@ -3,8 +3,7 @@ import { CaptureErrorContext } from "./internal/types.mjs";
3
3
  //#region src/capture.d.ts
4
4
  /**
5
5
  * Reports an error to Interfere. Safe to call from anywhere — no-op when the
6
- * SDK is not configured (`INTERFERE_PUBLIC_KEY` unset) or when the `errors`
7
- * plugin is disabled by remote config.
6
+ * SDK is not configured (`INTERFERE_PUBLIC_KEY` unset).
8
7
  *
9
8
  * Internally opens a short OTel span and records the error as an `exception`
10
9
  * event on it. The span ships through the same `OTLPTraceExporter` wired up
package/dist/capture.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{isErrorCaptured,markErrorCaptured}from"./internal/dedupe.mjs";import{isEnabledInEnvironment}from"./internal/env.mjs";import{normalizeRequest}from"./internal/normalize-request.mjs";import{isPluginEnabled}from"./internal/remote-config.mjs";import{MECHANISM_TYPE,toError}from"@interfere/types/sdk/errors";import{SpanKind,SpanStatusCode,context,trace}from"@opentelemetry/api";const TRACER_NAME=`@interfere/node`,DEFAULT_ERROR_MECHANISM={type:MECHANISM_TYPE.node.captureError,handled:!0};function captureError(error,request,errorContext){if(!isEnabledInEnvironment()||!isPluginEnabled(`errors`)||isErrorCaptured(error))return;markErrorCaptured(error);let err=toError(error),normalizedRequest=normalizeRequest(request),mechanism=errorContext?.mechanism??DEFAULT_ERROR_MECHANISM,span=trace.getTracer(TRACER_NAME).startSpan(`interfere.error.captured`,{kind:SpanKind.INTERNAL},context.active()),requestMethod=errorContext?.node?.requestMethod??normalizedRequest?.method??null;requestMethod&&span.setAttribute(`http.request.method`,requestMethod);let requestPath=errorContext?.node?.requestPath??normalizedRequest?.path??null;requestPath&&span.setAttribute(`url.path`,requestPath);let sessionId=normalizedRequest?.headers.get(`x-interfere-session`);sessionId&&span.setAttribute(`interfere.session.id`,sessionId);let eventAttrs={"exception.type":err.name,"exception.message":err.message,"interfere.exception.mechanism":mechanism.type,"interfere.exception.handled":mechanism.handled};err.stack&&(eventAttrs[`exception.stacktrace`]=err.stack);let digest=errorContext?.node?.errorDigest;digest&&(eventAttrs[`interfere.error.digest`]=digest),span.addEvent(`exception`,eventAttrs),span.setStatus({code:SpanStatusCode.ERROR}),span.end()}function captureMessage(message,request,errorContext){captureError(Error(message),request,errorContext)}async function withSpan(name,fn){let span=trace.getTracer(TRACER_NAME).startSpan(name);try{return await context.with(trace.setSpan(context.active(),span),fn)}catch(error){throw span.recordException(error),span.setStatus({code:SpanStatusCode.ERROR}),error}finally{span.end()}}export{captureError,captureMessage,withSpan};
1
+ import{isErrorCaptured,markErrorCaptured}from"./internal/dedupe.mjs";import{isEnabledInEnvironment}from"./internal/env.mjs";import{normalizeRequest}from"./internal/normalize-request.mjs";import{MECHANISM_TYPE,toError}from"@interfere/types/sdk/errors";import{SpanKind,SpanStatusCode,context,trace}from"@opentelemetry/api";const TRACER_NAME=`@interfere/node`,DEFAULT_ERROR_MECHANISM={type:MECHANISM_TYPE.node.captureError,handled:!0};function captureError(error,request,errorContext){if(!isEnabledInEnvironment()||isErrorCaptured(error))return;markErrorCaptured(error);let err=toError(error),normalizedRequest=normalizeRequest(request),mechanism=errorContext?.mechanism??DEFAULT_ERROR_MECHANISM,span=trace.getTracer(TRACER_NAME).startSpan(`interfere.error.captured`,{kind:SpanKind.INTERNAL},context.active()),requestMethod=errorContext?.node?.requestMethod??normalizedRequest?.method??null;requestMethod&&span.setAttribute(`http.request.method`,requestMethod);let requestPath=errorContext?.node?.requestPath??normalizedRequest?.path??null;requestPath&&span.setAttribute(`url.path`,requestPath);let sessionId=normalizedRequest?.headers.get(`x-interfere-session`);sessionId&&span.setAttribute(`interfere.session.id`,sessionId);let eventAttrs={"exception.type":err.name,"exception.message":err.message,"interfere.exception.mechanism":mechanism.type,"interfere.exception.handled":mechanism.handled};err.stack&&(eventAttrs[`exception.stacktrace`]=err.stack);let digest=errorContext?.node?.errorDigest;digest&&(eventAttrs[`interfere.error.digest`]=digest),span.addEvent(`exception`,eventAttrs),span.setStatus({code:SpanStatusCode.ERROR}),span.end()}function captureMessage(message,request,errorContext){captureError(Error(message),request,errorContext)}async function withSpan(name,fn){let span=trace.getTracer(TRACER_NAME).startSpan(name);try{return await context.with(trace.setSpan(context.active(),span),fn)}catch(error){throw span.recordException(error),span.setStatus({code:SpanStatusCode.ERROR}),error}finally{span.end()}}export{captureError,captureMessage,withSpan};
2
2
  //# sourceMappingURL=capture.mjs.map
package/dist/init.cjs CHANGED
@@ -1 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_internal_env=require("./internal/env.cjs"),require_internal_url=require("./internal/url.cjs"),require_internal_remote_config=require("./internal/remote-config.cjs"),require_internal_global_handlers=require("./internal/global-handlers.cjs"),require_internal_release_slug=require("./internal/release-slug.cjs"),require_internal_version=require("./internal/version.cjs");let _interfere_constants_api=require("@interfere/constants/api"),_interfere_types_releases_slug=require("@interfere/types/releases/slug"),_opentelemetry_context_async_hooks=require("@opentelemetry/context-async-hooks"),_opentelemetry_exporter_trace_otlp_http=require("@opentelemetry/exporter-trace-otlp-http"),_opentelemetry_resources=require("@opentelemetry/resources"),_opentelemetry_sdk_trace_base=require("@opentelemetry/sdk-trace-base"),_opentelemetry_sdk_trace_node=require("@opentelemetry/sdk-trace-node"),provider=null;async function init(options={}){if(provider)return;let env=require_internal_env.readInterfereEnv();if(!env.publicKey)return;let releaseSlug=env.forceEnable?_interfere_types_releases_slug.LOCAL_DEV_RELEASE_SLUG:require_internal_release_slug.resolveReleaseSlug().slug;releaseSlug||console.warn("[interfere] No commit SHA available; server spans will ship without `release.slug`. Set `INTERFERE_SOURCE_ID` (or any of `VERCEL_GIT_COMMIT_SHA`, `GITHUB_SHA`) on the runtime env."),provider=new _opentelemetry_sdk_trace_node.NodeTracerProvider({resource:(0,_opentelemetry_resources.resourceFromAttributes)({"service.name":options.serviceName??process.env.OTEL_SERVICE_NAME??`node-app`,...options.serviceNamespace?{"service.namespace":options.serviceNamespace}:{},"deployment.environment.name":env.nodeEnvironment??`unknown`,"telemetry.sdk.language":`nodejs`,"interfere.sdk.name":`@interfere/node`,"interfere.sdk.version":require_internal_version.PRODUCER_VERSION,...releaseSlug?{"release.slug":releaseSlug}:{}}),spanProcessors:[new _opentelemetry_sdk_trace_base.BatchSpanProcessor(new _opentelemetry_exporter_trace_otlp_http.OTLPTraceExporter({url:require_internal_url.withPublicKey(`${env.apiUrl}${_interfere_constants_api.API_PATHS.SINK}`,env.publicKey),headers:{"user-agent":require_internal_version.PRODUCER_VERSION,"x-interfere-producer-version":require_internal_version.PRODUCER_VERSION,...env.forceEnable?{"x-interfere-force-enable":`1`}:{}}}))]}),provider.register({contextManager:new _opentelemetry_context_async_hooks.AsyncLocalStorageContextManager().enable()}),require_internal_global_handlers.installGlobalHandlers({captureUncaughtException:options.captureUncaughtException??!0,captureUnhandledRejection:options.captureUnhandledRejection??!0,flush}),await require_internal_remote_config.fetchAndCacheRemoteConfig()}async function close(){provider&&=(require_internal_global_handlers.uninstallGlobalHandlers(),await provider.shutdown(),null)}async function flush(){provider&&await provider.forceFlush()}exports.close=close,exports.flush=flush,exports.init=init;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_internal_env=require("./internal/env.cjs"),require_internal_global_handlers=require("./internal/global-handlers.cjs"),require_internal_release_slug=require("./internal/release-slug.cjs"),require_internal_url=require("./internal/url.cjs"),require_internal_version=require("./internal/version.cjs");let _interfere_constants_api=require("@interfere/constants/api"),_interfere_types_releases_slug=require("@interfere/types/releases/slug"),_opentelemetry_context_async_hooks=require("@opentelemetry/context-async-hooks"),_opentelemetry_exporter_trace_otlp_http=require("@opentelemetry/exporter-trace-otlp-http"),_opentelemetry_resources=require("@opentelemetry/resources"),_opentelemetry_sdk_trace_base=require("@opentelemetry/sdk-trace-base"),_opentelemetry_sdk_trace_node=require("@opentelemetry/sdk-trace-node"),provider=null;function init(options={}){if(provider)return;let debug=options.debug??process.env.INTERFERE_DEBUG===`1`,env=require_internal_env.readInterfereEnv();if(!env.publicKey){console.warn(`[interfere] INTERFERE_PUBLIC_KEY not set; SDK disabled`);return}let releaseSlug=env.forceEnable?_interfere_types_releases_slug.LOCAL_DEV_RELEASE_SLUG:require_internal_release_slug.resolveReleaseSlug().slug;releaseSlug||console.warn(`[interfere] No release slug resolved the collector will reject spans. Add a postbuild script to your package.json:
2
+ "postbuild": "interfere sourcemaps upload ./dist"
3
+ and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`);let serviceName=options.serviceName??process.env.OTEL_SERVICE_NAME??`node-app`;if(provider=new _opentelemetry_sdk_trace_node.NodeTracerProvider({resource:(0,_opentelemetry_resources.resourceFromAttributes)({"service.name":serviceName,...options.serviceNamespace?{"service.namespace":options.serviceNamespace}:{},"deployment.environment.name":env.nodeEnvironment??`unknown`,"telemetry.sdk.language":`nodejs`,"interfere.sdk.name":`@interfere/node`,"interfere.sdk.version":require_internal_version.PRODUCER_VERSION,...releaseSlug?{"release.slug":releaseSlug}:{}}),spanProcessors:[new _opentelemetry_sdk_trace_base.BatchSpanProcessor(new _opentelemetry_exporter_trace_otlp_http.OTLPTraceExporter({url:require_internal_url.withPublicKey(`${env.apiUrl}${_interfere_constants_api.API_PATHS.SINK}`,env.publicKey),headers:{"user-agent":require_internal_version.PRODUCER_VERSION,"x-interfere-producer-version":require_internal_version.PRODUCER_VERSION,...env.forceEnable?{"x-interfere-force-enable":`1`}:{}}}))]}),provider.register({contextManager:new _opentelemetry_context_async_hooks.AsyncLocalStorageContextManager().enable()}),require_internal_global_handlers.installGlobalHandlers({captureUncaughtException:options.captureUncaughtException??!0,captureUnhandledRejection:options.captureUnhandledRejection??!0,flush}),debug){let endpoint=require_internal_url.withPublicKey(`${env.apiUrl}${_interfere_constants_api.API_PATHS.SINK}`,env.publicKey);console.log(`[interfere] init: service=${serviceName}, env=${env.nodeEnvironment??`unknown`}, endpoint=${endpoint}`),releaseSlug&&console.log(`[interfere] release.slug=${releaseSlug}`)}}async function close(){provider&&=(require_internal_global_handlers.uninstallGlobalHandlers(),await provider.shutdown(),null)}async function flush(){provider&&await provider.forceFlush()}exports.close=close,exports.flush=flush,exports.init=init;
package/dist/init.d.cts CHANGED
@@ -13,6 +13,11 @@ interface InitOptions {
13
13
  * `--unhandled-rejections` flag, not the SDK.
14
14
  */
15
15
  readonly captureUnhandledRejection?: boolean;
16
+ /**
17
+ * Log lifecycle events to `stdout` (`init`, `release.slug`, exporter
18
+ * errors). Also activatable via `INTERFERE_DEBUG=1`. Default `false`.
19
+ */
20
+ readonly debug?: boolean;
16
21
  /**
17
22
  * Sets the OTel `service.name` resource attribute — the identity spans
18
23
  * are grouped by in the dashboard. Defaults to `OTEL_SERVICE_NAME` env
@@ -31,13 +36,13 @@ interface InitOptions {
31
36
  * Bootstraps the Interfere Node SDK: wires a private `NodeTracerProvider`
32
37
  * whose spans export to the Interfere collector via OTLP/HTTP, registers an
33
38
  * `AsyncLocalStorageContextManager` so user spans propagate across async
34
- * boundaries, and fetches the remote-config gate.
39
+ * boundaries.
35
40
  *
36
41
  * Idempotent — safe to call from multiple entry points; only the first call
37
42
  * wires up.
38
43
  *
39
- * Bails silently when `INTERFERE_PUBLIC_KEY` is unset so dev runs without the
40
- * SDK configured don't crash.
44
+ * Warns and bails when `INTERFERE_PUBLIC_KEY` is unset so dev runs without
45
+ * the SDK configured don't crash.
41
46
  *
42
47
  * The `release.slug` resource attribute is derived deterministically from
43
48
  * the commit SHA (auto-detected from `INTERFERE_SOURCE_ID`,
@@ -45,7 +50,7 @@ interface InitOptions {
45
50
  * public key — same algorithm used by `@interfere/next` and the browser SDKs,
46
51
  * so spans from cohabiting frontends agree on release identity.
47
52
  */
48
- declare function init(options?: InitOptions): Promise<void>;
53
+ declare function init(options?: InitOptions): void;
49
54
  /**
50
55
  * Flushes any buffered spans and shuts down the tracer provider. Call from
51
56
  * a server shutdown hook (`SIGTERM`, `process.on("beforeExit")`, framework
package/dist/init.d.mts CHANGED
@@ -13,6 +13,11 @@ interface InitOptions {
13
13
  * `--unhandled-rejections` flag, not the SDK.
14
14
  */
15
15
  readonly captureUnhandledRejection?: boolean;
16
+ /**
17
+ * Log lifecycle events to `stdout` (`init`, `release.slug`, exporter
18
+ * errors). Also activatable via `INTERFERE_DEBUG=1`. Default `false`.
19
+ */
20
+ readonly debug?: boolean;
16
21
  /**
17
22
  * Sets the OTel `service.name` resource attribute — the identity spans
18
23
  * are grouped by in the dashboard. Defaults to `OTEL_SERVICE_NAME` env
@@ -31,13 +36,13 @@ interface InitOptions {
31
36
  * Bootstraps the Interfere Node SDK: wires a private `NodeTracerProvider`
32
37
  * whose spans export to the Interfere collector via OTLP/HTTP, registers an
33
38
  * `AsyncLocalStorageContextManager` so user spans propagate across async
34
- * boundaries, and fetches the remote-config gate.
39
+ * boundaries.
35
40
  *
36
41
  * Idempotent — safe to call from multiple entry points; only the first call
37
42
  * wires up.
38
43
  *
39
- * Bails silently when `INTERFERE_PUBLIC_KEY` is unset so dev runs without the
40
- * SDK configured don't crash.
44
+ * Warns and bails when `INTERFERE_PUBLIC_KEY` is unset so dev runs without
45
+ * the SDK configured don't crash.
41
46
  *
42
47
  * The `release.slug` resource attribute is derived deterministically from
43
48
  * the commit SHA (auto-detected from `INTERFERE_SOURCE_ID`,
@@ -45,7 +50,7 @@ interface InitOptions {
45
50
  * public key — same algorithm used by `@interfere/next` and the browser SDKs,
46
51
  * so spans from cohabiting frontends agree on release identity.
47
52
  */
48
- declare function init(options?: InitOptions): Promise<void>;
53
+ declare function init(options?: InitOptions): void;
49
54
  /**
50
55
  * Flushes any buffered spans and shuts down the tracer provider. Call from
51
56
  * a server shutdown hook (`SIGTERM`, `process.on("beforeExit")`, framework
package/dist/init.mjs CHANGED
@@ -1,2 +1,4 @@
1
- import{readInterfereEnv}from"./internal/env.mjs";import{withPublicKey}from"./internal/url.mjs";import{fetchAndCacheRemoteConfig}from"./internal/remote-config.mjs";import{installGlobalHandlers,uninstallGlobalHandlers}from"./internal/global-handlers.mjs";import{resolveReleaseSlug}from"./internal/release-slug.mjs";import{PRODUCER_VERSION}from"./internal/version.mjs";import{API_PATHS}from"@interfere/constants/api";import{LOCAL_DEV_RELEASE_SLUG}from"@interfere/types/releases/slug";import{AsyncLocalStorageContextManager}from"@opentelemetry/context-async-hooks";import{OTLPTraceExporter}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes}from"@opentelemetry/resources";import{BatchSpanProcessor}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider}from"@opentelemetry/sdk-trace-node";let provider=null;async function init(options={}){if(provider)return;let env=readInterfereEnv();if(!env.publicKey)return;let releaseSlug=env.forceEnable?LOCAL_DEV_RELEASE_SLUG:resolveReleaseSlug().slug;releaseSlug||console.warn("[interfere] No commit SHA available; server spans will ship without `release.slug`. Set `INTERFERE_SOURCE_ID` (or any of `VERCEL_GIT_COMMIT_SHA`, `GITHUB_SHA`) on the runtime env."),provider=new NodeTracerProvider({resource:resourceFromAttributes({"service.name":options.serviceName??process.env.OTEL_SERVICE_NAME??`node-app`,...options.serviceNamespace?{"service.namespace":options.serviceNamespace}:{},"deployment.environment.name":env.nodeEnvironment??`unknown`,"telemetry.sdk.language":`nodejs`,"interfere.sdk.name":`@interfere/node`,"interfere.sdk.version":PRODUCER_VERSION,...releaseSlug?{"release.slug":releaseSlug}:{}}),spanProcessors:[new BatchSpanProcessor(new OTLPTraceExporter({url:withPublicKey(`${env.apiUrl}${API_PATHS.SINK}`,env.publicKey),headers:{"user-agent":PRODUCER_VERSION,"x-interfere-producer-version":PRODUCER_VERSION,...env.forceEnable?{"x-interfere-force-enable":`1`}:{}}}))]}),provider.register({contextManager:new AsyncLocalStorageContextManager().enable()}),installGlobalHandlers({captureUncaughtException:options.captureUncaughtException??!0,captureUnhandledRejection:options.captureUnhandledRejection??!0,flush}),await fetchAndCacheRemoteConfig()}async function close(){provider&&=(uninstallGlobalHandlers(),await provider.shutdown(),null)}async function flush(){provider&&await provider.forceFlush()}export{close,flush,init};
1
+ import{readInterfereEnv}from"./internal/env.mjs";import{installGlobalHandlers,uninstallGlobalHandlers}from"./internal/global-handlers.mjs";import{resolveReleaseSlug}from"./internal/release-slug.mjs";import{withPublicKey}from"./internal/url.mjs";import{PRODUCER_VERSION}from"./internal/version.mjs";import{API_PATHS}from"@interfere/constants/api";import{LOCAL_DEV_RELEASE_SLUG}from"@interfere/types/releases/slug";import{AsyncLocalStorageContextManager}from"@opentelemetry/context-async-hooks";import{OTLPTraceExporter}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes}from"@opentelemetry/resources";import{BatchSpanProcessor}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider}from"@opentelemetry/sdk-trace-node";let provider=null;function init(options={}){if(provider)return;let debug=options.debug??process.env.INTERFERE_DEBUG===`1`,env=readInterfereEnv();if(!env.publicKey){console.warn(`[interfere] INTERFERE_PUBLIC_KEY not set; SDK disabled`);return}let releaseSlug=env.forceEnable?LOCAL_DEV_RELEASE_SLUG:resolveReleaseSlug().slug;releaseSlug||console.warn(`[interfere] No release slug resolved the collector will reject spans. Add a postbuild script to your package.json:
2
+ "postbuild": "interfere sourcemaps upload ./dist"
3
+ and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`);let serviceName=options.serviceName??process.env.OTEL_SERVICE_NAME??`node-app`;if(provider=new NodeTracerProvider({resource:resourceFromAttributes({"service.name":serviceName,...options.serviceNamespace?{"service.namespace":options.serviceNamespace}:{},"deployment.environment.name":env.nodeEnvironment??`unknown`,"telemetry.sdk.language":`nodejs`,"interfere.sdk.name":`@interfere/node`,"interfere.sdk.version":PRODUCER_VERSION,...releaseSlug?{"release.slug":releaseSlug}:{}}),spanProcessors:[new BatchSpanProcessor(new OTLPTraceExporter({url:withPublicKey(`${env.apiUrl}${API_PATHS.SINK}`,env.publicKey),headers:{"user-agent":PRODUCER_VERSION,"x-interfere-producer-version":PRODUCER_VERSION,...env.forceEnable?{"x-interfere-force-enable":`1`}:{}}}))]}),provider.register({contextManager:new AsyncLocalStorageContextManager().enable()}),installGlobalHandlers({captureUncaughtException:options.captureUncaughtException??!0,captureUnhandledRejection:options.captureUnhandledRejection??!0,flush}),debug){let endpoint=withPublicKey(`${env.apiUrl}${API_PATHS.SINK}`,env.publicKey);console.log(`[interfere] init: service=${serviceName}, env=${env.nodeEnvironment??`unknown`}, endpoint=${endpoint}`),releaseSlug&&console.log(`[interfere] release.slug=${releaseSlug}`)}}async function close(){provider&&=(uninstallGlobalHandlers(),await provider.shutdown(),null)}async function flush(){provider&&await provider.forceFlush()}export{close,flush,init};
2
4
  //# sourceMappingURL=init.mjs.map
package/dist/package.cjs CHANGED
@@ -1 +1 @@
1
- var name=`@interfere/node`,version=`0.0.1-canary.1`;Object.defineProperty(exports,"name",{enumerable:!0,get:function(){return name}}),Object.defineProperty(exports,"version",{enumerable:!0,get:function(){return version}});
1
+ var name=`@interfere/node`,version=`0.0.1-canary.3`;Object.defineProperty(exports,"name",{enumerable:!0,get:function(){return name}}),Object.defineProperty(exports,"version",{enumerable:!0,get:function(){return version}});
package/dist/package.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var name=`@interfere/node`,version=`0.0.1-canary.1`;export{name,version};
1
+ var name=`@interfere/node`,version=`0.0.1-canary.3`;export{name,version};
2
2
  //# sourceMappingURL=package.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@interfere/node",
3
- "version": "0.0.1-canary.1",
3
+ "version": "0.0.1-canary.3",
4
4
  "license": "MIT",
5
5
  "description": "Node.js SDK for Interfere. Error tracking and OTel instrumentation for any Node server.",
6
6
  "keywords": [
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_internal_env=require("./env.cjs"),require_internal_url=require("./url.cjs");let _interfere_constants_api=require("@interfere/constants/api"),cachedConfig=null;async function fetchAndCacheRemoteConfig(){if(!require_internal_env.isEnabledInEnvironment())return;let env=require_internal_env.readInterfereEnv();if(env.publicKey!==null)try{let url=require_internal_url.withPublicKey(`${env.apiUrl}${_interfere_constants_api.API_PATHS.CONFIG}`,env.publicKey),response=await fetch(url,{method:`GET`,headers:{"content-type":`application/json`},signal:AbortSignal.timeout(1e4)});if(!response.ok)return;let config=await response.json();config?.plugins&&(cachedConfig=config.plugins)}catch{}}function isPluginEnabled(plugin){return cachedConfig?cachedConfig[plugin]!==!1:!0}exports.fetchAndCacheRemoteConfig=fetchAndCacheRemoteConfig,exports.isPluginEnabled=isPluginEnabled;
@@ -1,6 +0,0 @@
1
- //#region src/internal/remote-config.d.ts
2
- declare function fetchAndCacheRemoteConfig(): Promise<void>;
3
- declare function isPluginEnabled(plugin: string): boolean;
4
- //#endregion
5
- export { fetchAndCacheRemoteConfig, isPluginEnabled };
6
- //# sourceMappingURL=remote-config.d.cts.map
@@ -1,6 +0,0 @@
1
- //#region src/internal/remote-config.d.ts
2
- declare function fetchAndCacheRemoteConfig(): Promise<void>;
3
- declare function isPluginEnabled(plugin: string): boolean;
4
- //#endregion
5
- export { fetchAndCacheRemoteConfig, isPluginEnabled };
6
- //# sourceMappingURL=remote-config.d.mts.map
@@ -1,2 +0,0 @@
1
- import{isEnabledInEnvironment,readInterfereEnv}from"./env.mjs";import{withPublicKey}from"./url.mjs";import{API_PATHS}from"@interfere/constants/api";let cachedConfig=null;async function fetchAndCacheRemoteConfig(){if(!isEnabledInEnvironment())return;let env=readInterfereEnv();if(env.publicKey!==null)try{let url=withPublicKey(`${env.apiUrl}${API_PATHS.CONFIG}`,env.publicKey),response=await fetch(url,{method:`GET`,headers:{"content-type":`application/json`},signal:AbortSignal.timeout(1e4)});if(!response.ok)return;let config=await response.json();config?.plugins&&(cachedConfig=config.plugins)}catch{}}function isPluginEnabled(plugin){return cachedConfig?cachedConfig[plugin]!==!1:!0}export{fetchAndCacheRemoteConfig,isPluginEnabled};
2
- //# sourceMappingURL=remote-config.mjs.map