@interfere/node 0.0.1-canary.5 → 0.1.0-canary.10
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/README.md +1 -1
- package/dist/capture.d.cts +1 -2
- package/dist/capture.d.mts +1 -2
- package/dist/capture.mjs +1 -2
- package/dist/init.cjs +2 -2
- package/dist/init.d.cts +9 -2
- package/dist/init.d.mts +9 -2
- package/dist/init.mjs +2 -3
- package/dist/internal/dedupe.d.cts +1 -2
- package/dist/internal/dedupe.d.mts +1 -2
- package/dist/internal/dedupe.mjs +1 -2
- package/dist/internal/env.cjs +1 -1
- package/dist/internal/env.d.cts +1 -5
- package/dist/internal/env.d.mts +1 -5
- package/dist/internal/env.mjs +1 -2
- package/dist/internal/global-handlers.d.cts +1 -2
- package/dist/internal/global-handlers.d.mts +1 -2
- package/dist/internal/global-handlers.mjs +1 -2
- package/dist/internal/normalize-request.d.cts +1 -2
- package/dist/internal/normalize-request.d.mts +1 -2
- package/dist/internal/normalize-request.mjs +1 -2
- package/dist/internal/release-slug.d.cts +1 -2
- package/dist/internal/release-slug.d.mts +1 -2
- package/dist/internal/release-slug.mjs +1 -2
- package/dist/internal/types.d.cts +1 -2
- package/dist/internal/types.d.mts +1 -2
- package/dist/internal/url.d.cts +1 -2
- package/dist/internal/url.d.mts +1 -2
- package/dist/internal/url.mjs +1 -2
- package/dist/internal/version.d.cts +1 -2
- package/dist/internal/version.d.mts +1 -2
- package/dist/internal/version.mjs +1 -2
- package/dist/otel-config.cjs +1 -0
- package/dist/otel-config.d.cts +58 -0
- package/dist/otel-config.d.mts +58 -0
- package/dist/otel-config.mjs +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.mjs +1 -2
- package/package.json +24 -14
package/README.md
CHANGED
|
@@ -27,4 +27,4 @@ try {
|
|
|
27
27
|
}
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
Set `INTERFERE_PUBLIC_KEY` to your surface's `
|
|
30
|
+
Set `INTERFERE_PUBLIC_KEY` to your surface's regional publishable key (`interfere_pub_us_*` or `interfere_pub_eu_*`). Full docs at <https://interfere.com/docs>.
|
package/dist/capture.d.cts
CHANGED
|
@@ -30,5 +30,4 @@ declare function captureMessage(message: string, request?: unknown, errorContext
|
|
|
30
30
|
*/
|
|
31
31
|
declare function withSpan<T>(name: string, fn: () => Promise<T> | T): Promise<T>;
|
|
32
32
|
//#endregion
|
|
33
|
-
export { type CaptureErrorContext, captureError, captureMessage, withSpan };
|
|
34
|
-
//# sourceMappingURL=capture.d.cts.map
|
|
33
|
+
export { type CaptureErrorContext, captureError, captureMessage, withSpan };
|
package/dist/capture.d.mts
CHANGED
|
@@ -30,5 +30,4 @@ declare function captureMessage(message: string, request?: unknown, errorContext
|
|
|
30
30
|
*/
|
|
31
31
|
declare function withSpan<T>(name: string, fn: () => Promise<T> | T): Promise<T>;
|
|
32
32
|
//#endregion
|
|
33
|
-
export { type CaptureErrorContext, captureError, captureMessage, withSpan };
|
|
34
|
-
//# sourceMappingURL=capture.d.mts.map
|
|
33
|
+
export { type CaptureErrorContext, captureError, captureMessage, withSpan };
|
package/dist/capture.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
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
|
-
//# sourceMappingURL=capture.mjs.map
|
|
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};
|
package/dist/init.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_internal_global_handlers=require("./internal/global-handlers.cjs"),require_internal_version=require("./internal/version.cjs"),require_otel_config=require("./otel-config.cjs");let _opentelemetry_context_async_hooks=require("@opentelemetry/context-async-hooks"),_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`,serviceName=options.serviceName??process.env.OTEL_SERVICE_NAME??`node-app`,config=require_otel_config.resolveOtelConfig({serviceName,serviceNamespace:options.serviceNamespace,environment:options.environment,sdkName:`@interfere/node`,producerVersion:require_internal_version.PRODUCER_VERSION,debug});if(!config){console.warn(`[interfere] INTERFERE_PUBLIC_KEY not set; SDK disabled`);return}config.releaseSlug||console.warn(`[interfere] No release slug resolved — the collector will reject spans. Add a postbuild script to your package.json:
|
|
2
2
|
"postbuild": "interfere sourcemaps upload ./dist"
|
|
3
|
-
and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`)
|
|
3
|
+
and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`),provider=new _opentelemetry_sdk_trace_node.NodeTracerProvider({resource:config.resource,spanProcessors:config.spanProcessors}),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&&(console.log(`[interfere] init: service=${serviceName}, env=${config.environment}, endpoint=${config.endpoint}`),config.releaseSlug&&console.log(`[interfere] release.slug=${config.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
|
@@ -18,6 +18,14 @@ interface InitOptions {
|
|
|
18
18
|
* errors). Also activatable via `INTERFERE_DEBUG=1`. Default `false`.
|
|
19
19
|
*/
|
|
20
20
|
readonly debug?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Deployment environment label (e.g. `production`, `staging`, `preview`).
|
|
23
|
+
* Highest-precedence source; falls back to `INTERFERE_ENVIRONMENT`, then
|
|
24
|
+
* `VERCEL_ENV`, then `NODE_ENV`, then `development`. Free-form — the
|
|
25
|
+
* collector accepts any label and only filters known-local ones
|
|
26
|
+
* (`development`/`local`/`test`) per surface config.
|
|
27
|
+
*/
|
|
28
|
+
readonly environment?: string;
|
|
21
29
|
/**
|
|
22
30
|
* Sets the OTel `service.name` resource attribute — the identity spans
|
|
23
31
|
* are grouped by in the dashboard. Defaults to `OTEL_SERVICE_NAME` env
|
|
@@ -63,5 +71,4 @@ declare function close(): Promise<void>;
|
|
|
63
71
|
*/
|
|
64
72
|
declare function flush(): Promise<void>;
|
|
65
73
|
//#endregion
|
|
66
|
-
export { InitOptions, close, flush, init };
|
|
67
|
-
//# sourceMappingURL=init.d.cts.map
|
|
74
|
+
export { InitOptions, close, flush, init };
|
package/dist/init.d.mts
CHANGED
|
@@ -18,6 +18,14 @@ interface InitOptions {
|
|
|
18
18
|
* errors). Also activatable via `INTERFERE_DEBUG=1`. Default `false`.
|
|
19
19
|
*/
|
|
20
20
|
readonly debug?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Deployment environment label (e.g. `production`, `staging`, `preview`).
|
|
23
|
+
* Highest-precedence source; falls back to `INTERFERE_ENVIRONMENT`, then
|
|
24
|
+
* `VERCEL_ENV`, then `NODE_ENV`, then `development`. Free-form — the
|
|
25
|
+
* collector accepts any label and only filters known-local ones
|
|
26
|
+
* (`development`/`local`/`test`) per surface config.
|
|
27
|
+
*/
|
|
28
|
+
readonly environment?: string;
|
|
21
29
|
/**
|
|
22
30
|
* Sets the OTel `service.name` resource attribute — the identity spans
|
|
23
31
|
* are grouped by in the dashboard. Defaults to `OTEL_SERVICE_NAME` env
|
|
@@ -63,5 +71,4 @@ declare function close(): Promise<void>;
|
|
|
63
71
|
*/
|
|
64
72
|
declare function flush(): Promise<void>;
|
|
65
73
|
//#endregion
|
|
66
|
-
export { InitOptions, close, flush, init };
|
|
67
|
-
//# sourceMappingURL=init.d.mts.map
|
|
74
|
+
export { InitOptions, close, flush, init };
|
package/dist/init.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{installGlobalHandlers,uninstallGlobalHandlers}from"./internal/global-handlers.mjs";import{PRODUCER_VERSION}from"./internal/version.mjs";import{resolveOtelConfig}from"./otel-config.mjs";import{AsyncLocalStorageContextManager}from"@opentelemetry/context-async-hooks";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`,serviceName=options.serviceName??process.env.OTEL_SERVICE_NAME??`node-app`,config=resolveOtelConfig({serviceName,serviceNamespace:options.serviceNamespace,environment:options.environment,sdkName:`@interfere/node`,producerVersion:PRODUCER_VERSION,debug});if(!config){console.warn(`[interfere] INTERFERE_PUBLIC_KEY not set; SDK disabled`);return}config.releaseSlug||console.warn(`[interfere] No release slug resolved — the collector will reject spans. Add a postbuild script to your package.json:
|
|
2
2
|
"postbuild": "interfere sourcemaps upload ./dist"
|
|
3
|
-
and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`)
|
|
4
|
-
//# sourceMappingURL=init.mjs.map
|
|
3
|
+
and set INTERFERE_API_KEY in your CI environment. See https://interfere.com/docs/nest#releases`),provider=new NodeTracerProvider({resource:config.resource,spanProcessors:config.spanProcessors}),provider.register({contextManager:new AsyncLocalStorageContextManager().enable()}),installGlobalHandlers({captureUncaughtException:options.captureUncaughtException??!0,captureUnhandledRejection:options.captureUnhandledRejection??!0,flush}),debug&&(console.log(`[interfere] init: service=${serviceName}, env=${config.environment}, endpoint=${config.endpoint}`),config.releaseSlug&&console.log(`[interfere] release.slug=${config.releaseSlug}`))}async function close(){provider&&=(uninstallGlobalHandlers(),await provider.shutdown(),null)}async function flush(){provider&&await provider.forceFlush()}export{close,flush,init};
|
|
@@ -2,5 +2,4 @@
|
|
|
2
2
|
declare function isErrorCaptured(error: unknown): boolean;
|
|
3
3
|
declare function markErrorCaptured(error: unknown): void;
|
|
4
4
|
//#endregion
|
|
5
|
-
export { isErrorCaptured, markErrorCaptured };
|
|
6
|
-
//# sourceMappingURL=dedupe.d.cts.map
|
|
5
|
+
export { isErrorCaptured, markErrorCaptured };
|
|
@@ -2,5 +2,4 @@
|
|
|
2
2
|
declare function isErrorCaptured(error: unknown): boolean;
|
|
3
3
|
declare function markErrorCaptured(error: unknown): void;
|
|
4
4
|
//#endregion
|
|
5
|
-
export { isErrorCaptured, markErrorCaptured };
|
|
6
|
-
//# sourceMappingURL=dedupe.d.mts.map
|
|
5
|
+
export { isErrorCaptured, markErrorCaptured };
|
package/dist/internal/dedupe.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
const seenErrors=new WeakSet;function isErrorCaptured(error){return error instanceof Error&&seenErrors.has(error)}function markErrorCaptured(error){error instanceof Error&&seenErrors.add(error)}export{isErrorCaptured,markErrorCaptured};
|
|
2
|
-
//# sourceMappingURL=dedupe.mjs.map
|
|
1
|
+
const seenErrors=new WeakSet;function isErrorCaptured(error){return error instanceof Error&&seenErrors.has(error)}function markErrorCaptured(error){error instanceof Error&&seenErrors.add(error)}export{isErrorCaptured,markErrorCaptured};
|
package/dist/internal/env.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let _interfere_constants_api=require("@interfere/constants/api"),_interfere_types_sdk_env=require("@interfere/types/sdk/env")
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let _interfere_constants_api=require("@interfere/constants/api"),_interfere_types_sdk_env=require("@interfere/types/sdk/env");function isEnabledInEnvironment(){return!0}function readInterfereEnv(){return{apiUrl:(0,_interfere_types_sdk_env.parseEnvValue)(process.env.INTERFERE_API_URL)??_interfere_constants_api.API_URL,forceEnable:process.env.INTERFERE_FORCE_ENABLE===`1`,publicKey:(0,_interfere_types_sdk_env.parseEnvValue)(process.env.INTERFERE_PUBLIC_KEY)}}exports.isEnabledInEnvironment=isEnabledInEnvironment,exports.readInterfereEnv=readInterfereEnv;
|
package/dist/internal/env.d.cts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { Env } from "@interfere/types/sdk/runtime";
|
|
2
|
-
|
|
3
1
|
//#region src/internal/env.d.ts
|
|
4
2
|
interface InterfereEnv {
|
|
5
3
|
readonly apiUrl: string;
|
|
6
4
|
readonly forceEnable: boolean;
|
|
7
|
-
readonly nodeEnvironment: Env;
|
|
8
5
|
readonly publicKey: string | null;
|
|
9
6
|
}
|
|
10
7
|
/**
|
|
@@ -17,5 +14,4 @@ interface InterfereEnv {
|
|
|
17
14
|
declare function isEnabledInEnvironment(): boolean;
|
|
18
15
|
declare function readInterfereEnv(): InterfereEnv;
|
|
19
16
|
//#endregion
|
|
20
|
-
export { InterfereEnv, isEnabledInEnvironment, readInterfereEnv };
|
|
21
|
-
//# sourceMappingURL=env.d.cts.map
|
|
17
|
+
export { InterfereEnv, isEnabledInEnvironment, readInterfereEnv };
|
package/dist/internal/env.d.mts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { Env } from "@interfere/types/sdk/runtime";
|
|
2
|
-
|
|
3
1
|
//#region src/internal/env.d.ts
|
|
4
2
|
interface InterfereEnv {
|
|
5
3
|
readonly apiUrl: string;
|
|
6
4
|
readonly forceEnable: boolean;
|
|
7
|
-
readonly nodeEnvironment: Env;
|
|
8
5
|
readonly publicKey: string | null;
|
|
9
6
|
}
|
|
10
7
|
/**
|
|
@@ -17,5 +14,4 @@ interface InterfereEnv {
|
|
|
17
14
|
declare function isEnabledInEnvironment(): boolean;
|
|
18
15
|
declare function readInterfereEnv(): InterfereEnv;
|
|
19
16
|
//#endregion
|
|
20
|
-
export { InterfereEnv, isEnabledInEnvironment, readInterfereEnv };
|
|
21
|
-
//# sourceMappingURL=env.d.mts.map
|
|
17
|
+
export { InterfereEnv, isEnabledInEnvironment, readInterfereEnv };
|
package/dist/internal/env.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{API_URL}from"@interfere/constants/api";import{parseEnvValue}from"@interfere/types/sdk/env";
|
|
2
|
-
//# sourceMappingURL=env.mjs.map
|
|
1
|
+
import{API_URL}from"@interfere/constants/api";import{parseEnvValue}from"@interfere/types/sdk/env";function isEnabledInEnvironment(){return!0}function readInterfereEnv(){return{apiUrl:parseEnvValue(process.env.INTERFERE_API_URL)??API_URL,forceEnable:process.env.INTERFERE_FORCE_ENABLE===`1`,publicKey:parseEnvValue(process.env.INTERFERE_PUBLIC_KEY)}}export{isEnabledInEnvironment,readInterfereEnv};
|
|
@@ -22,5 +22,4 @@ declare function installGlobalHandlers(options: {
|
|
|
22
22
|
}): void;
|
|
23
23
|
declare function uninstallGlobalHandlers(): void;
|
|
24
24
|
//#endregion
|
|
25
|
-
export { installGlobalHandlers, uninstallGlobalHandlers };
|
|
26
|
-
//# sourceMappingURL=global-handlers.d.cts.map
|
|
25
|
+
export { installGlobalHandlers, uninstallGlobalHandlers };
|
|
@@ -22,5 +22,4 @@ declare function installGlobalHandlers(options: {
|
|
|
22
22
|
}): void;
|
|
23
23
|
declare function uninstallGlobalHandlers(): void;
|
|
24
24
|
//#endregion
|
|
25
|
-
export { installGlobalHandlers, uninstallGlobalHandlers };
|
|
26
|
-
//# sourceMappingURL=global-handlers.d.mts.map
|
|
25
|
+
export { installGlobalHandlers, uninstallGlobalHandlers };
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{captureError}from"../capture.mjs";import{MECHANISM_TYPE}from"@interfere/types/sdk/errors";let uncaughtHandler=null,unhandledHandler=null;function installGlobalHandlers(options){options.captureUncaughtException&&uncaughtHandler===null&&(uncaughtHandler=error=>{handleUncaughtException(error,options.flush).catch(()=>void 0)},process.on(`uncaughtException`,uncaughtHandler)),options.captureUnhandledRejection&&unhandledHandler===null&&(unhandledHandler=reason=>{handleUnhandledRejection(reason,options.flush).catch(()=>void 0)},process.on(`unhandledRejection`,unhandledHandler))}function uninstallGlobalHandlers(){uncaughtHandler!==null&&(process.off(`uncaughtException`,uncaughtHandler),uncaughtHandler=null),unhandledHandler!==null&&(process.off(`unhandledRejection`,unhandledHandler),unhandledHandler=null)}async function handleUncaughtException(error,flush){await captureError(error,void 0,{mechanism:{type:MECHANISM_TYPE.node.uncaughtException,handled:!1}}),await flushWithTimeout(flush),process.exit(1)}async function handleUnhandledRejection(reason,flush){await captureError(reason,void 0,{mechanism:{type:MECHANISM_TYPE.node.unhandledRejection,handled:!1}}),await flushWithTimeout(flush)}function flushWithTimeout(flush){return Promise.race([flush(),new Promise(resolve=>{setTimeout(resolve,2e3)})])}export{installGlobalHandlers,uninstallGlobalHandlers};
|
|
2
|
-
//# sourceMappingURL=global-handlers.mjs.map
|
|
1
|
+
import{captureError}from"../capture.mjs";import{MECHANISM_TYPE}from"@interfere/types/sdk/errors";let uncaughtHandler=null,unhandledHandler=null;function installGlobalHandlers(options){options.captureUncaughtException&&uncaughtHandler===null&&(uncaughtHandler=error=>{handleUncaughtException(error,options.flush).catch(()=>void 0)},process.on(`uncaughtException`,uncaughtHandler)),options.captureUnhandledRejection&&unhandledHandler===null&&(unhandledHandler=reason=>{handleUnhandledRejection(reason,options.flush).catch(()=>void 0)},process.on(`unhandledRejection`,unhandledHandler))}function uninstallGlobalHandlers(){uncaughtHandler!==null&&(process.off(`uncaughtException`,uncaughtHandler),uncaughtHandler=null),unhandledHandler!==null&&(process.off(`unhandledRejection`,unhandledHandler),unhandledHandler=null)}async function handleUncaughtException(error,flush){await captureError(error,void 0,{mechanism:{type:MECHANISM_TYPE.node.uncaughtException,handled:!1}}),await flushWithTimeout(flush),process.exit(1)}async function handleUnhandledRejection(reason,flush){await captureError(reason,void 0,{mechanism:{type:MECHANISM_TYPE.node.unhandledRejection,handled:!1}}),await flushWithTimeout(flush)}function flushWithTimeout(flush){return Promise.race([flush(),new Promise(resolve=>{setTimeout(resolve,2e3)})])}export{installGlobalHandlers,uninstallGlobalHandlers};
|
|
@@ -12,5 +12,4 @@ declare const TRACEPARENT_HEADER = "traceparent";
|
|
|
12
12
|
*/
|
|
13
13
|
declare function normalizeRequest(request: unknown): NormalizedRequest | null;
|
|
14
14
|
//#endregion
|
|
15
|
-
export { TRACEPARENT_HEADER, normalizeRequest };
|
|
16
|
-
//# sourceMappingURL=normalize-request.d.cts.map
|
|
15
|
+
export { TRACEPARENT_HEADER, normalizeRequest };
|
|
@@ -12,5 +12,4 @@ declare const TRACEPARENT_HEADER = "traceparent";
|
|
|
12
12
|
*/
|
|
13
13
|
declare function normalizeRequest(request: unknown): NormalizedRequest | null;
|
|
14
14
|
//#endregion
|
|
15
|
-
export { TRACEPARENT_HEADER, normalizeRequest };
|
|
16
|
-
//# sourceMappingURL=normalize-request.d.mts.map
|
|
15
|
+
export { TRACEPARENT_HEADER, normalizeRequest };
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
const TRACEPARENT_HEADER=`traceparent`;function normalizeRequest(request){if(request instanceof Request)return{method:normalizeMethod(request.method),path:normalizePath(request.url),headers:request.headers};if(typeof request!=`object`||!request)return null;let value=request;return{method:normalizeMethod(value.method),path:normalizePath(typeof value.path==`string`?value.path:toStringOrDefault(value.url)),headers:normalizeHeaders(value.headers)}}function normalizeMethod(value){if(typeof value!=`string`)return`GET`;let method=value.trim();return method.length>0?method.toUpperCase():`GET`}function normalizePath(value){if(value.length===0)return`/`;try{return new URL(value,`http://localhost`).pathname||`/`}catch{return value.startsWith(`/`)?value:`/${value}`}}function toStringOrDefault(value,fallback=`/`){if(typeof value!=`string`)return fallback;let trimmed=value.trim();return trimmed.length>0?trimmed:fallback}function normalizeHeaders(value){if(value instanceof Headers)return new Headers(value);if(typeof value!=`object`||!value)return new Headers;let headers=new Headers;for(let[key,headerValue]of Object.entries(value))if(headerValue!==void 0){if(Array.isArray(headerValue)){headers.set(key,headerValue.join(`, `));continue}headers.set(key,String(headerValue))}return headers}export{TRACEPARENT_HEADER,normalizeRequest};
|
|
2
|
-
//# sourceMappingURL=normalize-request.mjs.map
|
|
1
|
+
const TRACEPARENT_HEADER=`traceparent`;function normalizeRequest(request){if(request instanceof Request)return{method:normalizeMethod(request.method),path:normalizePath(request.url),headers:request.headers};if(typeof request!=`object`||!request)return null;let value=request;return{method:normalizeMethod(value.method),path:normalizePath(typeof value.path==`string`?value.path:toStringOrDefault(value.url)),headers:normalizeHeaders(value.headers)}}function normalizeMethod(value){if(typeof value!=`string`)return`GET`;let method=value.trim();return method.length>0?method.toUpperCase():`GET`}function normalizePath(value){if(value.length===0)return`/`;try{return new URL(value,`http://localhost`).pathname||`/`}catch{return value.startsWith(`/`)?value:`/${value}`}}function toStringOrDefault(value,fallback=`/`){if(typeof value!=`string`)return fallback;let trimmed=value.trim();return trimmed.length>0?trimmed:fallback}function normalizeHeaders(value){if(value instanceof Headers)return new Headers(value);if(typeof value!=`object`||!value)return new Headers;let headers=new Headers;for(let[key,headerValue]of Object.entries(value))if(headerValue!==void 0){if(Array.isArray(headerValue)){headers.set(key,headerValue.join(`, `));continue}headers.set(key,String(headerValue))}return headers}export{TRACEPARENT_HEADER,normalizeRequest};
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{readFirstEnvValue}from"@interfere/types/sdk/env";import{deriveReleaseSlug}from"@interfere/types/releases/slug";import{releaseSourceIdEnvKeys}from"@interfere/types/integrations";import{execSync}from"node:child_process";function runGitCommand(command){try{let output=execSync(command,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim();return output.length>0?output:null}catch{return null}}function resolveCommitSha(){return readFirstEnvValue(process.env,releaseSourceIdEnvKeys)??runGitCommand(`git rev-parse HEAD`)}function resolveReleaseSlug(){let commitSha=resolveCommitSha();return{commitSha,slug:commitSha?deriveReleaseSlug(commitSha):null}}export{resolveCommitSha,resolveReleaseSlug};
|
|
2
|
-
//# sourceMappingURL=release-slug.mjs.map
|
|
1
|
+
import{readFirstEnvValue}from"@interfere/types/sdk/env";import{deriveReleaseSlug}from"@interfere/types/releases/slug";import{releaseSourceIdEnvKeys}from"@interfere/types/integrations";import{execSync}from"node:child_process";function runGitCommand(command){try{let output=execSync(command,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim();return output.length>0?output:null}catch{return null}}function resolveCommitSha(){return readFirstEnvValue(process.env,releaseSourceIdEnvKeys)??runGitCommand(`git rev-parse HEAD`)}function resolveReleaseSlug(){let commitSha=resolveCommitSha();return{commitSha,slug:commitSha?deriveReleaseSlug(commitSha):null}}export{resolveCommitSha,resolveReleaseSlug};
|
package/dist/internal/url.d.cts
CHANGED
package/dist/internal/url.d.mts
CHANGED
package/dist/internal/url.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
function withPublicKey(url,publicKey){let next=new URL(url);return next.searchParams.set(`pk`,publicKey),next.toString()}export{withPublicKey};
|
|
2
|
-
//# sourceMappingURL=url.mjs.map
|
|
1
|
+
function withPublicKey(url,publicKey){let next=new URL(url);return next.searchParams.set(`pk`,publicKey),next.toString()}export{withPublicKey};
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{name,version}from"../package.mjs";const PRODUCER_VERSION=`${name}@${version}`;export{PRODUCER_VERSION};
|
|
2
|
-
//# sourceMappingURL=version.mjs.map
|
|
1
|
+
import{name,version}from"../package.mjs";const PRODUCER_VERSION=`${name}@${version}`;export{PRODUCER_VERSION};
|
|
@@ -0,0 +1 @@
|
|
|
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");let _interfere_constants_api=require("@interfere/constants/api"),_interfere_types_releases_slug=require("@interfere/types/releases/slug"),_interfere_types_sdk_runtime=require("@interfere/types/sdk/runtime"),_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");function resolveOtelConfig(options){let env=require_internal_env.readInterfereEnv();if(!env.publicKey)return null;let environment=(0,_interfere_types_sdk_runtime.resolveEnvironment)({explicit:options.environment,env:process.env}),releaseSlug=env.forceEnable?_interfere_types_releases_slug.LOCAL_DEV_RELEASE_SLUG:require_internal_release_slug.resolveReleaseSlug().slug,endpoint=require_internal_url.withPublicKey(`${env.apiUrl}${_interfere_constants_api.API_PATHS.SINK}`,env.publicKey),exporter=new _opentelemetry_exporter_trace_otlp_http.OTLPTraceExporter({url:endpoint,headers:{"user-agent":options.producerVersion,"x-interfere-producer-version":options.producerVersion,...env.forceEnable?{"x-interfere-force-enable":`1`}:{}}});return options.debug&&instrumentExporterLogging(exporter),{endpoint,environment,releaseSlug,resource:(0,_opentelemetry_resources.resourceFromAttributes)({"service.name":options.serviceName,...options.serviceNamespace?{"service.namespace":options.serviceNamespace}:{},"deployment.environment.name":environment,"telemetry.sdk.language":`nodejs`,"interfere.sdk.name":options.sdkName,"interfere.sdk.version":options.producerVersion,...releaseSlug?{"release.slug":releaseSlug}:{}}),spanProcessors:[new _opentelemetry_sdk_trace_base.BatchSpanProcessor(exporter)]}}function instrumentExporterLogging(exporter){let orig=exporter.export.bind(exporter);exporter.export=(spans,cb)=>{let t=Date.now();orig(spans,result=>{let ms=Date.now()-t;if(result.code===0)console.log(`[interfere] export: ${spans.length} spans (${ms}ms)`);else{let err=result.error,status=err?.code?` ${err.code}`:``,body=err?.data??err?.message??`unknown error`;console.warn(`[interfere] export failed:${status} ${body} (${ms}ms, ${spans.length} spans dropped)`)}cb(result)})}}exports.installGlobalHandlers=require_internal_global_handlers.installGlobalHandlers,exports.resolveOtelConfig=resolveOtelConfig,exports.uninstallGlobalHandlers=require_internal_global_handlers.uninstallGlobalHandlers;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { installGlobalHandlers, uninstallGlobalHandlers } from "./internal/global-handlers.cjs";
|
|
2
|
+
import { Resource } from "@opentelemetry/resources";
|
|
3
|
+
import { SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
4
|
+
|
|
5
|
+
//#region src/otel-config.d.ts
|
|
6
|
+
interface OtelConfigOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Log exporter results to `stdout`. Also activatable via
|
|
9
|
+
* `INTERFERE_DEBUG=1` upstream.
|
|
10
|
+
*/
|
|
11
|
+
readonly debug?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Deployment environment label. Falls back through `INTERFERE_ENVIRONMENT`,
|
|
14
|
+
* `VERCEL_ENV`, `NODE_ENV`, then `development` when unset.
|
|
15
|
+
*/
|
|
16
|
+
readonly environment?: string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* The producer version string (`name@version`) sent as the
|
|
19
|
+
* `x-interfere-producer-version` header and recorded as
|
|
20
|
+
* `interfere.sdk.version`.
|
|
21
|
+
*/
|
|
22
|
+
readonly producerVersion: string;
|
|
23
|
+
/**
|
|
24
|
+
* The `interfere.sdk.name` resource attribute — the npm name of the SDK
|
|
25
|
+
* building this config (e.g. `@interfere/node`).
|
|
26
|
+
*/
|
|
27
|
+
readonly sdkName: string;
|
|
28
|
+
/**
|
|
29
|
+
* OTel `service.name` resource attribute — the identity spans are grouped
|
|
30
|
+
* by in the dashboard.
|
|
31
|
+
*/
|
|
32
|
+
readonly serviceName: string;
|
|
33
|
+
/**
|
|
34
|
+
* Optional OTel `service.namespace` resource attribute for grouping
|
|
35
|
+
* several services under one logical product surface.
|
|
36
|
+
*/
|
|
37
|
+
readonly serviceNamespace?: string | undefined;
|
|
38
|
+
}
|
|
39
|
+
interface ResolvedOtelConfig {
|
|
40
|
+
readonly endpoint: string;
|
|
41
|
+
readonly environment: string;
|
|
42
|
+
readonly releaseSlug: string | null;
|
|
43
|
+
readonly resource: Resource;
|
|
44
|
+
readonly spanProcessors: SpanProcessor[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Builds the OpenTelemetry exporter, resource, and span processors that ship
|
|
48
|
+
* traces to the Interfere collector. Returns `null` when
|
|
49
|
+
* `INTERFERE_PUBLIC_KEY` is unset so callers can disable themselves cleanly.
|
|
50
|
+
*
|
|
51
|
+
* Centralizes the collector contract — OTLP/HTTP JSON transport, the public
|
|
52
|
+
* key query param, the producer-version header, and the required
|
|
53
|
+
* `service.name` / `release.slug` / `deployment.environment.name` resource
|
|
54
|
+
* attributes — so every server SDK reports identically.
|
|
55
|
+
*/
|
|
56
|
+
declare function resolveOtelConfig(options: OtelConfigOptions): ResolvedOtelConfig | null;
|
|
57
|
+
//#endregion
|
|
58
|
+
export { OtelConfigOptions, ResolvedOtelConfig, installGlobalHandlers, resolveOtelConfig, uninstallGlobalHandlers };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { installGlobalHandlers, uninstallGlobalHandlers } from "./internal/global-handlers.mjs";
|
|
2
|
+
import { Resource } from "@opentelemetry/resources";
|
|
3
|
+
import { SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
4
|
+
|
|
5
|
+
//#region src/otel-config.d.ts
|
|
6
|
+
interface OtelConfigOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Log exporter results to `stdout`. Also activatable via
|
|
9
|
+
* `INTERFERE_DEBUG=1` upstream.
|
|
10
|
+
*/
|
|
11
|
+
readonly debug?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Deployment environment label. Falls back through `INTERFERE_ENVIRONMENT`,
|
|
14
|
+
* `VERCEL_ENV`, `NODE_ENV`, then `development` when unset.
|
|
15
|
+
*/
|
|
16
|
+
readonly environment?: string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* The producer version string (`name@version`) sent as the
|
|
19
|
+
* `x-interfere-producer-version` header and recorded as
|
|
20
|
+
* `interfere.sdk.version`.
|
|
21
|
+
*/
|
|
22
|
+
readonly producerVersion: string;
|
|
23
|
+
/**
|
|
24
|
+
* The `interfere.sdk.name` resource attribute — the npm name of the SDK
|
|
25
|
+
* building this config (e.g. `@interfere/node`).
|
|
26
|
+
*/
|
|
27
|
+
readonly sdkName: string;
|
|
28
|
+
/**
|
|
29
|
+
* OTel `service.name` resource attribute — the identity spans are grouped
|
|
30
|
+
* by in the dashboard.
|
|
31
|
+
*/
|
|
32
|
+
readonly serviceName: string;
|
|
33
|
+
/**
|
|
34
|
+
* Optional OTel `service.namespace` resource attribute for grouping
|
|
35
|
+
* several services under one logical product surface.
|
|
36
|
+
*/
|
|
37
|
+
readonly serviceNamespace?: string | undefined;
|
|
38
|
+
}
|
|
39
|
+
interface ResolvedOtelConfig {
|
|
40
|
+
readonly endpoint: string;
|
|
41
|
+
readonly environment: string;
|
|
42
|
+
readonly releaseSlug: string | null;
|
|
43
|
+
readonly resource: Resource;
|
|
44
|
+
readonly spanProcessors: SpanProcessor[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Builds the OpenTelemetry exporter, resource, and span processors that ship
|
|
48
|
+
* traces to the Interfere collector. Returns `null` when
|
|
49
|
+
* `INTERFERE_PUBLIC_KEY` is unset so callers can disable themselves cleanly.
|
|
50
|
+
*
|
|
51
|
+
* Centralizes the collector contract — OTLP/HTTP JSON transport, the public
|
|
52
|
+
* key query param, the producer-version header, and the required
|
|
53
|
+
* `service.name` / `release.slug` / `deployment.environment.name` resource
|
|
54
|
+
* attributes — so every server SDK reports identically.
|
|
55
|
+
*/
|
|
56
|
+
declare function resolveOtelConfig(options: OtelConfigOptions): ResolvedOtelConfig | null;
|
|
57
|
+
//#endregion
|
|
58
|
+
export { OtelConfigOptions, ResolvedOtelConfig, installGlobalHandlers, resolveOtelConfig, uninstallGlobalHandlers };
|
|
@@ -0,0 +1 @@
|
|
|
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{API_PATHS}from"@interfere/constants/api";import{LOCAL_DEV_RELEASE_SLUG}from"@interfere/types/releases/slug";import{resolveEnvironment}from"@interfere/types/sdk/runtime";import{OTLPTraceExporter}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes}from"@opentelemetry/resources";import{BatchSpanProcessor}from"@opentelemetry/sdk-trace-base";function resolveOtelConfig(options){let env=readInterfereEnv();if(!env.publicKey)return null;let environment=resolveEnvironment({explicit:options.environment,env:process.env}),releaseSlug=env.forceEnable?LOCAL_DEV_RELEASE_SLUG:resolveReleaseSlug().slug,endpoint=withPublicKey(`${env.apiUrl}${API_PATHS.SINK}`,env.publicKey),exporter=new OTLPTraceExporter({url:endpoint,headers:{"user-agent":options.producerVersion,"x-interfere-producer-version":options.producerVersion,...env.forceEnable?{"x-interfere-force-enable":`1`}:{}}});return options.debug&&instrumentExporterLogging(exporter),{endpoint,environment,releaseSlug,resource:resourceFromAttributes({"service.name":options.serviceName,...options.serviceNamespace?{"service.namespace":options.serviceNamespace}:{},"deployment.environment.name":environment,"telemetry.sdk.language":`nodejs`,"interfere.sdk.name":options.sdkName,"interfere.sdk.version":options.producerVersion,...releaseSlug?{"release.slug":releaseSlug}:{}}),spanProcessors:[new BatchSpanProcessor(exporter)]}}function instrumentExporterLogging(exporter){let orig=exporter.export.bind(exporter);exporter.export=(spans,cb)=>{let t=Date.now();orig(spans,result=>{let ms=Date.now()-t;if(result.code===0)console.log(`[interfere] export: ${spans.length} spans (${ms}ms)`);else{let err=result.error,status=err?.code?` ${err.code}`:``,body=err?.data??err?.message??`unknown error`;console.warn(`[interfere] export failed:${status} ${body} (${ms}ms, ${spans.length} spans dropped)`)}cb(result)})}}export{installGlobalHandlers,resolveOtelConfig,uninstallGlobalHandlers};
|
package/dist/package.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
Object.defineProperty(exports,"name",{enumerable:!0,get:function(){return`@interfere/node`}}),Object.defineProperty(exports,"version",{enumerable:!0,get:function(){return`0.1.0-canary.10`}});
|
package/dist/package.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
var name=`@interfere/node`,version=`0.0
|
|
2
|
-
//# sourceMappingURL=package.mjs.map
|
|
1
|
+
var name=`@interfere/node`,version=`0.1.0-canary.10`;export{name,version};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interfere/node",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0-canary.10",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Node.js SDK for Interfere. Error tracking and OTel instrumentation for any Node server.",
|
|
6
6
|
"keywords": [
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"author": "Interfere <support@interfere.com> (https://interfere.com)",
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
20
|
-
"url": "git+https://
|
|
20
|
+
"url": "git+https://interfere.ghe.com/interfere/interfere.git",
|
|
21
21
|
"directory": "src/packages/public/node"
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
@@ -64,6 +64,17 @@
|
|
|
64
64
|
"types": "./dist/capture.d.cts",
|
|
65
65
|
"default": "./dist/capture.cjs"
|
|
66
66
|
}
|
|
67
|
+
},
|
|
68
|
+
"./otel-config": {
|
|
69
|
+
"monorepo": "./src/otel-config.ts",
|
|
70
|
+
"import": {
|
|
71
|
+
"types": "./dist/otel-config.d.mts",
|
|
72
|
+
"default": "./dist/otel-config.mjs"
|
|
73
|
+
},
|
|
74
|
+
"require": {
|
|
75
|
+
"types": "./dist/otel-config.d.cts",
|
|
76
|
+
"default": "./dist/otel-config.cjs"
|
|
77
|
+
}
|
|
67
78
|
}
|
|
68
79
|
},
|
|
69
80
|
"sideEffects": false,
|
|
@@ -73,26 +84,25 @@
|
|
|
73
84
|
"scripts": {
|
|
74
85
|
"build": "tsdown",
|
|
75
86
|
"test": "vitest run --passWithNoTests",
|
|
76
|
-
"typecheck": "tsc --noEmit
|
|
87
|
+
"typecheck": "tsc --noEmit"
|
|
77
88
|
},
|
|
78
89
|
"dependencies": {
|
|
79
|
-
"@interfere/constants": "^9.0.2-canary.
|
|
80
|
-
"@interfere/types": "^
|
|
90
|
+
"@interfere/constants": "^9.0.2-canary.3",
|
|
91
|
+
"@interfere/types": "^10.0.0-canary.6",
|
|
81
92
|
"@opentelemetry/api": "^1.9.1",
|
|
82
93
|
"@opentelemetry/context-async-hooks": "^2.7.1",
|
|
83
|
-
"@opentelemetry/exporter-trace-otlp-http": "^0.
|
|
94
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.219.0",
|
|
84
95
|
"@opentelemetry/resources": "^2.7.0",
|
|
85
96
|
"@opentelemetry/sdk-trace-base": "^2.7.0",
|
|
86
|
-
"@opentelemetry/sdk-trace-node": "^2.7.1"
|
|
87
|
-
"uuid": "^14.0.0"
|
|
97
|
+
"@opentelemetry/sdk-trace-node": "^2.7.1"
|
|
88
98
|
},
|
|
89
99
|
"devDependencies": {
|
|
90
|
-
"@interfere/test-utils": "^9.0.
|
|
91
|
-
"@interfere/typescript-config": "^9.0.
|
|
92
|
-
"@types/node": "^
|
|
93
|
-
"@vitest/coverage-v8": "
|
|
94
|
-
"tsdown": "^0.22.
|
|
100
|
+
"@interfere/test-utils": "^9.0.1-canary.1",
|
|
101
|
+
"@interfere/typescript-config": "^9.0.1-canary.1",
|
|
102
|
+
"@types/node": "^26.1.0",
|
|
103
|
+
"@vitest/coverage-v8": "4.1.9",
|
|
104
|
+
"tsdown": "^0.22.2",
|
|
95
105
|
"typescript": "^6.0.3",
|
|
96
|
-
"vitest": "
|
|
106
|
+
"vitest": "4.1.9"
|
|
97
107
|
}
|
|
98
108
|
}
|