import { type Context, type SpanContext, type TextMapGetter, type TextMapPropagator, type TextMapSetter } from "@opentelemetry/api";
import type * as sampling from "@solarwinds-apm/sampling";
/** SolarWinds headers */
export interface Headers {
    /** Headers to be extracted from incoming requests */
    request: sampling.RequestHeaders;
    /** Headers to be injected into outgoing responses */
    response: sampling.ResponseHeaders;
}
export type RequestHeader = keyof Headers["request"];
export type ResponseHeader = keyof Headers["response"] | typeof X_TRACE | typeof ACCESS_CONTROL_EXPOSE_HEADERS;
export type Header = RequestHeader | ResponseHeader;
/** Storage for headers inside the OTel Context */
export declare const HEADERS_STORAGE: import("../storage.js").ContextStorage<Headers>;
export declare function traceParent(spanContext: SpanContext): string;
declare const X_TRACE = "X-Trace";
declare const ACCESS_CONTROL_EXPOSE_HEADERS = "Access-Control-Expose-Headers";
/**
 * Propagator that extracts SolarWinds request headers
 */
export declare class RequestHeadersPropagator implements TextMapPropagator<unknown> {
    extract(context: Context, carrier: unknown, getter: TextMapGetter<unknown>): Context;
    inject(): void;
    fields(): RequestHeader[];
}
/**
 * Propagator that injects SolarWinds response headers
 *
 * This propagator SHOULD NOT be registered with the tracer provider
 * since it is meant for response and not request.
 * Currently it is registered in the HTTP instrumentation response hook
 * until an official response propagation API is added.
 */
export declare class ResponseHeadersPropagator implements TextMapPropagator<unknown> {
    inject(context: Context, carrier: unknown, setter: TextMapSetter<unknown>): void;
    fields(): ResponseHeader[];
    extract(context: Context): Context;
}
/**
 * Returns the first element if the value is an array
 * or the value as-is otherwise
 */
export declare function firstIfArray<T>(value: T | T[] | undefined): T | undefined;
/**
 * Returns the result of {@link Array.join} if the value is an array
 * or the value as-is otherwise
 *
 * @param separator - Separator used between elements
 */
export declare function joinIfArray(value: string | string[] | undefined, separator: string): string | undefined;
export {};
//# sourceMappingURL=headers.d.ts.map