@interfere/server-core 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1,22 @@
1
+ import { LoggerProvider, SeverityNumber } from "@opentelemetry/api-logs";
2
+ /**
3
+ * Patches `console.{debug,log,info,warn,error}` to additionally emit OTel
4
+ * `LogRecord`s alongside the original output. Every log record carries
5
+ * the active span's context (so trace ↔ log correlation works in
6
+ * dashboards) and any `Error` arg gets unpacked into semconv exception
7
+ * attrs.
8
+ *
9
+ * Returns a disposer that restores the original `console.*` methods.
10
+ *
11
+ * Cycle protection: `emitting` guards against the bridge re-entering
12
+ * itself if a logger backend itself logs to console (which would
13
+ * recursively emit forever). Failures are bounded-rate logged via the
14
+ * original `console.error` so a broken backend doesn't drown the
15
+ * customer's logs in bridge-failure messages.
16
+ *
17
+ * Serialization is deferred to a microtask and bodies are capped at
18
+ * {@link MAX_BODY_CHARS} characters, so the synchronous `console.*`
19
+ * call only captures the active context; an arg mutated before the
20
+ * microtask runs is serialized in its mutated state.
21
+ */
22
+ export declare function bridgeConsoleToOtel(provider?: LoggerProvider, minimumSeverity?: SeverityNumber, name?: string): () => void;
@@ -0,0 +1 @@
1
+ import{omitUndefined}from"@interfere/helpers/omit-undefined";import{context,trace}from"@opentelemetry/api";import{SeverityNumber,logs}from"@opentelemetry/api-logs";const CONSOLE_METHODS=[`debug`,`log`,`info`,`warn`,`error`],SEVERITY={debug:SeverityNumber.DEBUG,error:SeverityNumber.ERROR,info:SeverityNumber.INFO,log:SeverityNumber.INFO,warn:SeverityNumber.WARN},MAX_BODY_CHARS=8192;function buildBody(args){let body=args.map(element=>stringify(element)).join(` `);return body.length>MAX_BODY_CHARS?`${body.slice(0,MAX_BODY_CHARS)}…`:body}function stringify(value){if(typeof value==`string`)return value;if(value instanceof Error)return value.stack??`${value.name}: ${value.message}`;try{return JSON.stringify(value)}catch{return String(value)}}function extractException(args){for(let arg of args)if(arg instanceof Error)return arg}function buildExceptionAttributes(args){let exception=extractException(args);if(exception)return omitUndefined({"exception.type":exception.name,"exception.message":exception.message,"exception.stacktrace":exception.stack||void 0})}function bridgeConsoleToOtel(provider=logs,minimumSeverity=SeverityNumber.DEBUG,name=`@interfere/server/console`){let methods=CONSOLE_METHODS.filter(method=>SEVERITY[method]>=minimumSeverity),logger=provider.getLogger(name),emitting=!1,bridgeFailures=0,original={debug:console.debug,error:console.error,info:console.info,log:console.log,warn:console.warn};function emitLog(orig,severity,method,args,activeContext,activeSpan){if(!emitting){emitting=!0;try{let attributes=buildExceptionAttributes(args);logger.emit(omitUndefined({body:buildBody(args),severityNumber:severity,severityText:method.toUpperCase(),context:activeSpan?activeContext:void 0,attributes}))}catch(error){bridgeFailures+=1,bridgeFailures%100==1&&orig.call(console,`[interfere] console→OTel bridge emission failed (${bridgeFailures} total):`,error)}finally{emitting=!1}}}for(let method of methods){let orig=original[method],severity=SEVERITY[method];console[method]=(...args)=>{orig.apply(console,args);let activeContext=context.active(),activeSpan=trace.getSpan(activeContext);queueMicrotask(()=>{emitLog(orig,severity,method,args,activeContext,activeSpan)})}}return(()=>{for(let method of methods)console[method]=original[method]})}export{bridgeConsoleToOtel};
@@ -0,0 +1,2 @@
1
+ export declare function contain<T>(site: string, run: () => T): T | null;
2
+ export declare function containAsync<T>(site: string, run: () => Promise<T>): Promise<T | null>;
@@ -0,0 +1 @@
1
+ const reported=/* @__PURE__ */ new Set;function reportContainedFailure(site,error){if(!reported.has(site)){reported.add(site);try{console.warn(`[interfere] ${site} failed inside the Interfere SDK. Your app keeps running; Interfere skipped this step and may send less telemetry.`,error)}catch{return}}}function contain(site,run){try{return run()}catch(error){return reportContainedFailure(site,error),null}}async function containAsync(site,run){try{return await run()}catch(error){return reportContainedFailure(site,error),null}}export{contain,containAsync};
@@ -0,0 +1,8 @@
1
+ import { SpanProcessor } from "@opentelemetry/sdk-trace-base";
2
+ export declare function containSpanProcessor(processor: SpanProcessor): {
3
+ forceFlush: () => Promise<void>;
4
+ onEnd: (span: import("@opentelemetry/sdk-trace-base").ReadableSpan) => void | null;
5
+ onEnding: (span: import("@opentelemetry/sdk-trace-base").Span) => void | null | undefined;
6
+ onStart: (span: import("@opentelemetry/sdk-trace-base").Span, parentContext: import("@opentelemetry/api").Context) => void | null;
7
+ shutdown: () => Promise<void>;
8
+ };
@@ -0,0 +1 @@
1
+ import{contain}from"./contain.mjs";const SITE=`Span processor`;function containSpanProcessor(processor){return{forceFlush:async()=>processor.forceFlush(),onEnd:span=>contain(SITE,()=>processor.onEnd(span)),onEnding:span=>contain(SITE,()=>processor.onEnding?.(span)),onStart:(span,parentContext)=>contain(SITE,()=>processor.onStart(span,parentContext)),shutdown:async()=>processor.shutdown()}}export{containSpanProcessor};
@@ -0,0 +1,61 @@
1
+ import { ServerPipeline } from "./runtime.mjs";
2
+ import { Attributes, TextMapPropagator, TracerProvider } from "@opentelemetry/api";
3
+ import { UrlRedactionOption } from "@interfere/types/sdk/url-redaction";
4
+ import { resourceFromAttributes } from "@opentelemetry/resources";
5
+ import { LogRecordProcessor } from "@opentelemetry/sdk-logs";
6
+ import { IdGenerator, Sampler, SpanProcessor } from "@opentelemetry/sdk-trace-base";
7
+ import { TracingOwnership } from "@interfere/types/sdk/remote-config/tracing-ownership";
8
+ export interface ServerOptions {
9
+ /** Forward console calls at or above the selected level. Defaults to debug. */
10
+ consoleBridge?: boolean | {
11
+ level?: "debug" | "info" | "warn" | "error";
12
+ };
13
+ /** Deliver exceptions through Interfere or the application provider. Defaults to Interfere. */
14
+ errors?: "interfere" | "host";
15
+ /** URL redaction policy applied before telemetry export. */
16
+ privacy?: {
17
+ urls?: UrlRedactionOption;
18
+ };
19
+ /** Adopt an existing application provider by default; otherwise manage one. */
20
+ tracing?: TracingOwnership | "auto";
21
+ /** OTLP compression. Defaults to none. */
22
+ compression?: "gzip" | "none";
23
+ _internalAdditionalSpanProcessors?: SpanProcessor[];
24
+ _internalAdditionalLogRecordProcessors?: LogRecordProcessor[];
25
+ }
26
+ export interface ManagedTracingInput {
27
+ resourceAttributes: Attributes;
28
+ spanProcessors: SpanProcessor[];
29
+ sampler: Sampler | undefined;
30
+ }
31
+ export interface NodeRuntimeInput {
32
+ name: string;
33
+ version: string;
34
+ apiUrl: string;
35
+ publicKey: string;
36
+ resourceAttributes: Attributes;
37
+ options: ServerOptions;
38
+ drain: boolean;
39
+ logDrain: boolean;
40
+ vercel: boolean;
41
+ propagator: TextMapPropagator;
42
+ idGenerator?: IdGenerator;
43
+ registerPlatform?: (input: ManagedTracingInput) => Promise<TracerProvider>;
44
+ instrument?: (provider: TracerProvider, resource: ReturnType<typeof resourceFromAttributes>, requests: boolean) => Pick<ServerPipeline, "flush" | "shutdown">;
45
+ }
46
+ /** Builds the owned server pipeline; framework hooks supply only platform registration and request instrumentation. */
47
+ export declare function startNodeRuntime(input: NodeRuntimeInput): Promise<{
48
+ mode: "application" | "managed";
49
+ provider: TracerProvider;
50
+ isolated: boolean;
51
+ capture: {
52
+ errors: "host" | "interfere";
53
+ recordOnHostSpan: boolean;
54
+ urlRedaction: {
55
+ fragment: boolean;
56
+ redactsValue: (name: string) => boolean;
57
+ };
58
+ };
59
+ flush: () => Promise<void>;
60
+ shutdown: () => Promise<void>;
61
+ }>;
package/dist/node.mjs ADDED
@@ -0,0 +1 @@
1
+ import{bridgeConsoleToOtel}from"./console-bridge.mjs";import{containSpanProcessor}from"./contained-span-processor.mjs";import{EXISTING_PROPAGATOR_WARNING,EXISTING_PROVIDER_WARNING,registeredLoggerProvider,registeredTracerProvider,resolveTracingMode}from"./ownership.mjs";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{context,propagation,trace}from"@opentelemetry/api";import{SeverityNumber,logs}from"@opentelemetry/api-logs";import{drainUrl}from"@interfere/constants/api";import{correlationBaggageSpanProcessor}from"@interfere/types/sdk/correlation-span-processor";import{VERCEL_EXPORT_TIMEOUT_MS}from"@interfere/types/sdk/server-tracing";import{createUrlRedactionSpanProcessor,resolveUrlRedaction}from"@interfere/types/sdk/url-redaction";import{AsyncLocalStorageContextManager}from"@opentelemetry/context-async-hooks";import{getStringFromEnv}from"@opentelemetry/core";import{OTLPTraceExporter}from"@opentelemetry/exporter-trace-otlp-http";import{OTLPLogExporter}from"@opentelemetry/exporter-logs-otlp-http";import{CompressionAlgorithm}from"@opentelemetry/otlp-exporter-base";import{resourceFromAttributes}from"@opentelemetry/resources";import{BatchLogRecordProcessor,LoggerProvider as LoggerProvider$1}from"@opentelemetry/sdk-logs";import{AlwaysOnSampler,BasicTracerProvider,BatchSpanProcessor,ParentBasedSampler}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider}from"@opentelemetry/sdk-trace-node";function canFlush(provider){return`forceFlush`in provider&&typeof provider.forceFlush==`function`}async function startNodeRuntime(input){let{options,resourceAttributes}=input,mode=resolveTracingMode(options.tracing),existing=mode===`managed`?registeredTracerProvider():null,ownsTracing=mode===`managed`&&existing===null,drain=input.drain&&ownsTracing,resource=resourceFromAttributes(resourceAttributes),urlRedaction=resolveUrlRedaction(options.privacy?.urls),attemptTimeout=input.vercel?VERCEL_EXPORT_TIMEOUT_MS:65e3,batchTimeout=input.vercel?VERCEL_EXPORT_TIMEOUT_MS:7e4,flushTimeout=input.vercel?VERCEL_EXPORT_TIMEOUT_MS:75e3,headers={"x-interfere-producer-version":input.version},compression=options.compression===`gzip`?CompressionAlgorithm.GZIP:CompressionAlgorithm.NONE,spanProcessors=[containSpanProcessor(createUrlRedactionSpanProcessor(urlRedaction)),correlationBaggageSpanProcessor,...drain?[]:[new BatchSpanProcessor(new OTLPTraceExporter({headers,compression,timeoutMillis:attemptTimeout,url:drainUrl(input.apiUrl,`traces`,input.publicKey)}),{exportTimeoutMillis:batchTimeout})],...options._internalAdditionalSpanProcessors??[]],sampler=getStringFromEnv(`OTEL_TRACES_SAMPLER`)?void 0:new ParentBasedSampler({root:new AlwaysOnSampler}),provider,ownedProvider,loggerProvider,ownsPropagator=!1,contextManager,instrumentation,restoreConsole;async function shutdown(){restoreConsole?.(),await instrumentation?.shutdown(),ownedProvider&&registeredTracerProvider()===ownedProvider&&trace.disable(),ownsPropagator&&propagation.disable(),contextManager&&(context.disable(),contextManager.disable()),loggerProvider&&logs.getLoggerProvider()===loggerProvider&&logs.disable(),await Promise.all([ownedProvider?.shutdown(),loggerProvider?.shutdown()])}try{if(!ownsTracing)existing&&console.warn(EXISTING_PROVIDER_WARNING),ownedProvider=new BasicTracerProvider(omitUndefined({resource,idGenerator:input.idGenerator,sampler:new AlwaysOnSampler,spanProcessors})),provider=ownedProvider;else if(drain&&input.registerPlatform)provider=await input.registerPlatform({resourceAttributes,spanProcessors,sampler}),ownsPropagator=!1;else{let nodeProvider=new NodeTracerProvider(omitUndefined({resource,idGenerator:input.idGenerator,sampler,spanProcessors}));ownedProvider=nodeProvider,provider=nodeProvider,ownsPropagator=propagation.setGlobalPropagator(input.propagator),ownsPropagator||console.warn(EXISTING_PROPAGATOR_WARNING);let manager=new AsyncLocalStorageContextManager().enable();context.setGlobalContextManager(manager)?contextManager=manager:manager.disable(),nodeProvider.register({contextManager:null,propagator:null})}let hostLogger=!ownsTracing&&mode===`application`?registeredLoggerProvider():null,bridgeTarget=input.logDrain?logs:hostLogger??(loggerProvider=new LoggerProvider$1({resource,processors:[new BatchLogRecordProcessor({exportTimeoutMillis:batchTimeout,exporter:new OTLPLogExporter({headers,compression,timeoutMillis:attemptTimeout,url:drainUrl(input.apiUrl,`logs`,input.publicKey)})}),...options._internalAdditionalLogRecordProcessors??[]]}));if(ownsTracing&&loggerProvider&&logs.setGlobalLoggerProvider(loggerProvider),ownsTracing&&(instrumentation=input.instrument?.(provider,resource,ownsPropagator&&!drain)),!input.logDrain&&options.consoleBridge!==!1){let level=options.consoleBridge!==void 0&&options.consoleBridge!==!0?options.consoleBridge.level??`debug`:`debug`;restoreConsole=bridgeConsoleToOtel(bridgeTarget,{debug:SeverityNumber.DEBUG,info:SeverityNumber.INFO,warn:SeverityNumber.WARN,error:SeverityNumber.ERROR}[level],`${input.name}/console`)}return{mode,provider,isolated:!ownsTracing,capture:{errors:options.errors??`interfere`,recordOnHostSpan:mode===`application`,urlRedaction},flush:async()=>{await Promise.all([canFlush(provider)?provider.forceFlush({timeoutMillis:flushTimeout}):void 0,loggerProvider?.forceFlush({timeoutMillis:flushTimeout}),instrumentation?.flush()])},shutdown}}catch(error){throw await shutdown(),error}}export{startNodeRuntime};
@@ -0,0 +1,24 @@
1
+ import { TracerProvider } from "@opentelemetry/api";
2
+ import { LoggerProvider } from "@opentelemetry/api-logs";
3
+ import { TracingOwnership } from "@interfere/types/sdk/remote-config/tracing-ownership";
4
+ /** Logged once when managed `register()` finds a tracer provider another owner registered first. */
5
+ export declare const EXISTING_PROVIDER_WARNING = "[interfere] Another OpenTelemetry tracer provider is already registered (for example by Sentry or @vercel/otel), so Interfere captures server errors through its own exporter and does not own request tracing. If that provider is yours, call register({ tracing: \"application\" }) and export its traces to Interfere over standard OTLP.";
6
+ /** Logged once when managed `register()` owns the tracer provider but another owner registered the propagator first. */
7
+ export declare const EXISTING_PROPAGATOR_WARNING = "[interfere] Another OpenTelemetry propagator already owns trace headers, so Interfere will not inject its own. If that propagator is yours, call register({ tracing: \"application\" }).";
8
+ /** The tracer provider another owner registered globally, or `null` while the API still serves its no-op delegate. */
9
+ export declare function registeredTracerProvider(): TracerProvider | null;
10
+ /**
11
+ * The tracing owner for this process: the explicit `register({ tracing })`
12
+ * option, else auto, which adopts an already registered provider and
13
+ * otherwise manages tracing.
14
+ */
15
+ export declare function resolveTracingMode(requested?: TracingOwnership | "auto"): "application" | "managed";
16
+ /**
17
+ * The logger provider another owner registered globally, or `null` while the
18
+ * logs API still serves its proxy. The API exposes no public query for this.
19
+ *
20
+ * WARNING: `_getDelegate` is the proxy's internal marker; a registered
21
+ * provider is returned directly and has no such method. Re-check when
22
+ * `@opentelemetry/api-logs` changes its proxy shape.
23
+ */
24
+ export declare function registeredLoggerProvider(): LoggerProvider | null;
@@ -0,0 +1 @@
1
+ import{ProxyTracerProvider,diag,trace}from"@opentelemetry/api";import{logs}from"@opentelemetry/api-logs";const EXISTING_PROVIDER_WARNING=`[interfere] Another OpenTelemetry tracer provider is already registered (for example by Sentry or @vercel/otel), so Interfere captures server errors through its own exporter and does not own request tracing. If that provider is yours, call register({ tracing: "application" }) and export its traces to Interfere over standard OTLP.`,EXISTING_PROPAGATOR_WARNING=`[interfere] Another OpenTelemetry propagator already owns trace headers, so Interfere will not inject its own. If that propagator is yours, call register({ tracing: "application" }).`,UNREGISTERED_TRACER_PROVIDER=new ProxyTracerProvider().getDelegate();function registeredTracerProvider(){let provider=trace.getTracerProvider(),delegate=provider instanceof ProxyTracerProvider?provider.getDelegate():provider;return delegate===UNREGISTERED_TRACER_PROVIDER?null:delegate}let adoptionLogged=!1;function resolveTracingMode(requested=`auto`){let mode;return mode=requested===`auto`?registeredTracerProvider()===null?`managed`:`application`:requested,requested===`auto`&&mode===`application`&&!adoptionLogged&&(adoptionLogged=!0,diag.debug(`[interfere] Adopting the application's registered OpenTelemetry tracer provider.`)),mode}function registeredLoggerProvider(){let provider=logs.getLoggerProvider();return`_getDelegate`in provider?null:provider}export{EXISTING_PROPAGATOR_WARNING,EXISTING_PROVIDER_WARNING,registeredLoggerProvider,registeredTracerProvider,resolveTracingMode};
@@ -0,0 +1,33 @@
1
+ import { Attributes, TracerProvider } from "@opentelemetry/api";
2
+ import { UrlRedactionPolicy } from "@interfere/types/sdk/url-redaction";
3
+ import { NonErrorException } from "@interfere/types/sdk/errors";
4
+ import { TracingOwnership } from "@interfere/types/sdk/remote-config/tracing-ownership";
5
+ import { ErrorMechanism } from "@interfere/types/sdk/plugins/payload/errors";
6
+ export interface CapturePolicy {
7
+ errors: "host" | "interfere";
8
+ recordOnHostSpan: boolean;
9
+ urlRedaction: UrlRedactionPolicy;
10
+ }
11
+ export interface ServerPipeline {
12
+ mode: TracingOwnership;
13
+ provider: TracerProvider;
14
+ isolated: boolean;
15
+ capture: CapturePolicy;
16
+ flush: () => Promise<void>;
17
+ shutdown: () => Promise<void>;
18
+ }
19
+ /** Owns one adapter's initialization, error delivery and provider lifetime. */
20
+ export declare class ServerRuntime {
21
+ private readonly name;
22
+ private pending;
23
+ private pipeline;
24
+ private isolatedProvider;
25
+ private policy;
26
+ constructor(name: string);
27
+ get mode(): "application" | "managed";
28
+ register(start: () => Promise<ServerPipeline | null>): Promise<void>;
29
+ configureCapture(provider: TracerProvider, policy: CapturePolicy): void;
30
+ flush(): Promise<void>;
31
+ shutdown(): Promise<void>;
32
+ recordException(value: Error | NonErrorException, mechanism: ErrorMechanism, attributes?: Attributes): void;
33
+ }
@@ -0,0 +1 @@
1
+ import{contain,containAsync}from"./contain.mjs";import{omitUndefined}from"@interfere/helpers/omit-undefined";import{ROOT_CONTEXT,SpanKind,SpanStatusCode,isSpanContextValid,trace}from"@opentelemetry/api";import{createUrlRedactionSpanProcessor,resolveUrlRedaction}from"@interfere/types/sdk/url-redaction";import{isNonErrorException,toExceptions}from"@interfere/types/sdk/errors";import{EXCEPTION_DELIVERY,EXCEPTION_DELIVERY_ATTRIBUTE}from"@interfere/types/sdk/exception-delivery";import{exceptionSpanName}from"@interfere/types/sdk/throw-site";var ServerRuntime=class{name;pending=null;pipeline=null;isolatedProvider=null;policy={errors:`interfere`,recordOnHostSpan:!0,urlRedaction:resolveUrlRedaction()};constructor(name){this.name=name}get mode(){return this.pipeline?.mode??`managed`}async register(start){if(this.pending)return this.pending;if(!this.pipeline)return this.pending=(async()=>{await containAsync(`register()`,async()=>{let pipeline=await start();this.pipeline=pipeline,pipeline&&(this.policy=pipeline.capture,this.isolatedProvider=pipeline.isolated?pipeline.provider:null)}),this.pending=null})(),this.pending}configureCapture(provider,policy){this.isolatedProvider=provider,this.policy=policy}async flush(){await this.pending,await containAsync(`flush()`,async()=>this.pipeline?.flush())}async shutdown(){await this.pending;let{pipeline}=this;this.pipeline=null,this.isolatedProvider=null,await containAsync(`shutdown()`,async()=>pipeline?.shutdown())}recordException(value,mechanism,attributes={}){contain(`captureError()`,()=>{let attrs={...attributes,"interfere.exception.handled":mechanism.handled,"interfere.exception.mechanism":mechanism.type,"exception.type":isNonErrorException(value)?value.type:value.name,"exception.message":isNonErrorException(value)?value.value:value.message,"interfere.exception.kind":isNonErrorException(value)?`non-error`:`error`};if(isNonErrorException(value)){let serialized=value.serialized===void 0?`undefined`:JSON.stringify(value.serialized);attrs[`interfere.exception.serialized`]=typeof value.serialized==`string`?value.serialized:serialized}else attrs[`interfere.exception.chain`]=JSON.stringify(toExceptions(value,mechanism)),value.stack&&(attrs[`exception.stacktrace`]=value.stack);createUrlRedactionSpanProcessor(this.policy.urlRedaction).onEnd({attributes:{},events:[{name:`exception`,attributes:attrs}]});let host=trace.getActiveSpan(),active=this.isolatedProvider&&!this.policy.recordOnHostSpan?void 0:host,timestamp=Date.now(),separate=this.isolatedProvider!==null&&this.policy.errors===`interfere`;if(active?.isRecording()&&(active.addEvent(`exception`,separate?{...attrs,[EXCEPTION_DELIVERY_ATTRIBUTE]:EXCEPTION_DELIVERY.interfere}:attrs,timestamp),mechanism.handled||active.setStatus({code:SpanStatusCode.ERROR,message:String(attrs[`exception.message`])}),!separate))return;let tracer=(this.isolatedProvider??trace.getTracerProvider()).getTracer(this.name),parent=host?.spanContext(),span=tracer.startSpan(exceptionSpanName(value),omitUndefined({attributes:{"interfere.capture.kind":`exception`},kind:SpanKind.INTERNAL,links:this.isolatedProvider&&parent&&isSpanContextValid(parent)?[{context:parent}]:void 0}),this.isolatedProvider?ROOT_CONTEXT:void 0);span.addEvent(`exception`,attrs,timestamp),mechanism.handled||span.setStatus({code:SpanStatusCode.ERROR,message:String(attrs[`exception.message`])}),span.end()})}};export{ServerRuntime};
package/package.json CHANGED
@@ -1,6 +1,76 @@
1
1
  {
2
2
  "name": "@interfere/server-core",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "Shared telemetry runtime for Interfere server adapters.",
5
+ "files": [
6
+ "dist"
7
+ ],
8
+ "type": "module",
9
+ "sideEffects": false,
10
+ "exports": {
11
+ "./runtime": {
12
+ "monorepo": "./src/runtime.ts",
13
+ "types": "./dist/runtime.d.mts",
14
+ "default": "./dist/runtime.mjs"
15
+ },
16
+ "./node": {
17
+ "monorepo": "./src/node.ts",
18
+ "types": "./dist/node.d.mts",
19
+ "default": "./dist/node.mjs"
20
+ },
21
+ "./ownership": {
22
+ "monorepo": "./src/ownership.ts",
23
+ "types": "./dist/ownership.d.mts",
24
+ "default": "./dist/ownership.mjs"
25
+ },
26
+ "./console-bridge": {
27
+ "monorepo": "./src/console-bridge.ts",
28
+ "types": "./dist/console-bridge.d.mts",
29
+ "default": "./dist/console-bridge.mjs"
30
+ },
31
+ "./contain": {
32
+ "monorepo": "./src/contain.ts",
33
+ "types": "./dist/contain.d.mts",
34
+ "default": "./dist/contain.mjs"
35
+ },
36
+ "./contained-span-processor": {
37
+ "monorepo": "./src/contained-span-processor.ts",
38
+ "types": "./dist/contained-span-processor.d.mts",
39
+ "default": "./dist/contained-span-processor.mjs"
40
+ }
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "scripts": {
46
+ "build": "tsdown",
47
+ "lint:oxlint": "cd ../../../.. && GOMAXPROCS=2 oxlint --max-warnings=0 --report-unused-disable-directives-severity=error --threads=2 src/packages/public/server-core",
48
+ "test": "node ../../private/vitest-config/src/cli.ts run --config ../../../../vitest.config.ts",
49
+ "typecheck": "bun check"
50
+ },
51
+ "dependencies": {
52
+ "@interfere/constants": "^9.3.2",
53
+ "@interfere/helpers": "^9.3.2",
54
+ "@interfere/types": "^11.0.0",
55
+ "@opentelemetry/api": "1.9.1",
56
+ "@opentelemetry/api-logs": "0.222.0",
57
+ "@opentelemetry/context-async-hooks": "2.11.0",
58
+ "@opentelemetry/core": "2.11.0",
59
+ "@opentelemetry/exporter-logs-otlp-http": "0.223.0",
60
+ "@opentelemetry/exporter-trace-otlp-http": "0.223.0",
61
+ "@opentelemetry/otlp-exporter-base": "0.223.0",
62
+ "@opentelemetry/resources": "2.11.0",
63
+ "@opentelemetry/sdk-logs": "0.222.0",
64
+ "@opentelemetry/sdk-trace-base": "2.11.0",
65
+ "@opentelemetry/sdk-trace-node": "2.11.0"
66
+ },
67
+ "devDependencies": {
68
+ "@interfere/test-utils": "^10.1.0",
69
+ "@interfere/typescript-config": "^9.0.3",
70
+ "@interfere/vitest-config": "0.0.0",
71
+ "@types/node": "26.6.6",
72
+ "tsdown": "0.23.4",
73
+ "typescript": "7.0.2",
74
+ "vitest": "5.1.0"
75
+ }
76
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.