autotel-pact 0.2.0
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 +385 -0
- package/dist/audit.cjs +412 -0
- package/dist/audit.cjs.map +1 -0
- package/dist/audit.d.cts +25 -0
- package/dist/audit.d.ts +25 -0
- package/dist/audit.js +403 -0
- package/dist/audit.js.map +1 -0
- package/dist/auto-wrap.cjs +255 -0
- package/dist/auto-wrap.cjs.map +1 -0
- package/dist/auto-wrap.d.cts +57 -0
- package/dist/auto-wrap.d.ts +57 -0
- package/dist/auto-wrap.js +248 -0
- package/dist/auto-wrap.js.map +1 -0
- package/dist/broker.cjs +84 -0
- package/dist/broker.cjs.map +1 -0
- package/dist/broker.d.cts +23 -0
- package/dist/broker.d.ts +23 -0
- package/dist/broker.js +80 -0
- package/dist/broker.js.map +1 -0
- package/dist/cli.cjs +662 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +4 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +656 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +967 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +200 -0
- package/dist/index.d.ts +200 -0
- package/dist/index.js +932 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger-BuBmfWNc.d.ts +22 -0
- package/dist/ledger-D88TzN1c.d.cts +22 -0
- package/dist/processor.cjs +200 -0
- package/dist/processor.cjs.map +1 -0
- package/dist/processor.d.cts +58 -0
- package/dist/processor.d.ts +58 -0
- package/dist/processor.js +193 -0
- package/dist/processor.js.map +1 -0
- package/dist/provider.cjs +219 -0
- package/dist/provider.cjs.map +1 -0
- package/dist/provider.d.cts +41 -0
- package/dist/provider.d.ts +41 -0
- package/dist/provider.js +213 -0
- package/dist/provider.js.map +1 -0
- package/dist/tag.cjs +50 -0
- package/dist/tag.cjs.map +1 -0
- package/dist/tag.d.cts +9 -0
- package/dist/tag.d.ts +9 -0
- package/dist/tag.js +48 -0
- package/dist/tag.js.map +1 -0
- package/dist/types-BHGiwqcp.d.cts +157 -0
- package/dist/types-BHGiwqcp.d.ts +157 -0
- package/package.json +108 -0
- package/schemas/README.md +24 -0
- package/schemas/audit-matrix-v0.2.0.json +78 -0
- package/schemas/ledger-entry-v0.2.0.json +77 -0
- package/src/attrs.test.ts +35 -0
- package/src/attrs.ts +53 -0
- package/src/audit.test.ts +189 -0
- package/src/audit.ts +251 -0
- package/src/auto-wrap.test.ts +149 -0
- package/src/auto-wrap.ts +283 -0
- package/src/broker.test.ts +175 -0
- package/src/broker.ts +118 -0
- package/src/cli.test.ts +148 -0
- package/src/cli.ts +287 -0
- package/src/index.ts +94 -0
- package/src/labels.ts +25 -0
- package/src/ledger-normalize.test.ts +141 -0
- package/src/ledger-normalize.ts +82 -0
- package/src/ledger.test.ts +92 -0
- package/src/ledger.ts +156 -0
- package/src/pact-file.test.ts +124 -0
- package/src/pact-file.ts +65 -0
- package/src/processor.test.ts +90 -0
- package/src/processor.ts +191 -0
- package/src/tag.test.ts +72 -0
- package/src/tag.ts +21 -0
- package/src/types.ts +169 -0
- package/src/wrapper-http.test.ts +133 -0
- package/src/wrapper-http.ts +194 -0
- package/src/wrapper-provider.test.ts +132 -0
- package/src/wrapper-provider.ts +163 -0
- package/src/wrapper.test.ts +176 -0
- package/src/wrapper.ts +221 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/attrs.ts","../src/types.ts","../src/ledger-normalize.ts","../src/ledger.ts","../src/wrapper.ts","../src/wrapper-http.ts","../src/pact-file.ts","../src/wrapper-provider.ts","../src/tag.ts","../src/processor.ts","../src/broker.ts","../src/audit.ts","../src/labels.ts"],"names":["entry","path","mkdirSync","appendFileSync","existsSync","readdirSync","readFileSync","mkdir","appendFile","autotelSpan","getActiveSpan","statSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PactInteractionMeta, PactOutcome } from './types.js';\n\n/**\n * Attribute keys for Pact interactions. Centralised so the namespace is\n * a single source of truth and is forward-compatible with eventual OTel\n * semantic conventions.\n */\nexport const PACT_ATTRS = {\n CONSUMER: 'pact.consumer',\n PROVIDER: 'pact.provider',\n KIND: 'pact.kind',\n INTERACTION_DESCRIPTION: 'pact.interaction.description',\n INTERACTION_ID: 'pact.interaction.id',\n INTERACTION_STATES: 'pact.interaction.states',\n CONTRACT_FILE: 'pact.contract.file',\n OUTCOME: 'pact.outcome',\n} as const;\n\nexport type PactAttributeKey = (typeof PACT_ATTRS)[keyof typeof PACT_ATTRS];\n\n/**\n * Build the set of attributes to stamp on a span when an interaction is\n * about to be exercised. `outcome` is added later by the wrapper.\n */\nexport function buildPactAttributes(\n meta: PactInteractionMeta,\n opts: { contractFile?: string } = {},\n): Record<string, string | string[]> {\n const attrs: Record<string, string | string[]> = {\n [PACT_ATTRS.CONSUMER]: meta.consumer,\n [PACT_ATTRS.PROVIDER]: meta.provider,\n [PACT_ATTRS.KIND]: meta.kind,\n [PACT_ATTRS.INTERACTION_DESCRIPTION]: meta.description,\n [PACT_ATTRS.INTERACTION_STATES]: meta.states,\n };\n if (opts.contractFile) {\n attrs[PACT_ATTRS.CONTRACT_FILE] = opts.contractFile;\n }\n if (meta.interactionId) {\n attrs[PACT_ATTRS.INTERACTION_ID] = meta.interactionId;\n }\n return attrs;\n}\n\n/**\n * Helper that returns just the outcome attribute — stamped after the\n * handler resolves or rejects.\n */\nexport function outcomeAttribute(\n outcome: PactOutcome,\n): Record<string, string> {\n return { [PACT_ATTRS.OUTCOME]: outcome };\n}\n","/**\n * Kind of contract interaction observed.\n */\nexport type PactKind = 'message' | 'http';\n\nexport type PactOutcome = 'passed' | 'failed';\n\nexport type LedgerSource = 'test' | 'production';\nexport type LedgerRole = 'consumer' | 'provider';\n\nexport const LEDGER_ENTRY_SPEC = 'autotel-pact-ledger-entry/v0.2.0';\nexport const AUDIT_MATRIX_SPEC = 'autotel-pact-audit-matrix/v0.2.0';\n\n/**\n * Metadata about a single Pact interaction, derived from the reified message\n * plus the consumer/provider config. Stamped onto the span and the ledger entry.\n */\nexport interface PactInteractionMeta {\n consumer: string;\n provider: string;\n description: string;\n states: string[];\n kind: PactKind;\n interactionId?: string;\n}\n\n/**\n * Per-interaction ledger evidence (consumer exercise, provider verify, or production tag).\n */\nexport interface InteractionLedgerEntry {\n type?: 'interaction';\n spec: typeof LEDGER_ENTRY_SPEC;\n consumer: string;\n provider: string;\n interaction: string;\n interaction_id?: string;\n states: string[];\n kind: PactKind;\n outcome: PactOutcome;\n source: LedgerSource;\n role: LedgerRole;\n duration_ms: number;\n observed_at: string;\n trace_id?: string;\n span_id?: string;\n run_id?: string;\n git_sha?: string;\n error?: string;\n}\n\n/**\n * Run-level provider verification failure — does not imply per-interaction outcomes.\n */\nexport interface ProviderVerificationRunEntry {\n type: 'provider_verification_run';\n spec: typeof LEDGER_ENTRY_SPEC;\n consumer: string;\n provider: string;\n outcome: 'failed';\n source: LedgerSource;\n role: 'provider';\n observed_at: string;\n error: string;\n run_id?: string;\n git_sha?: string;\n trace_id?: string;\n span_id?: string;\n}\n\nexport type LedgerRecord = InteractionLedgerEntry | ProviderVerificationRunEntry;\n\nexport function isInteractionLedgerEntry(\n entry: LedgerRecord,\n): entry is InteractionLedgerEntry {\n return entry.type !== 'provider_verification_run';\n}\n\nexport function isProviderVerificationRun(\n entry: LedgerRecord,\n): entry is ProviderVerificationRunEntry {\n return entry.type === 'provider_verification_run';\n}\n\n/**\n * Shape of a Pact contract file on disk (subset we read).\n */\nexport interface PactFile {\n consumer: { name: string };\n provider: { name: string };\n messages?: Array<{\n description: string;\n providerStates?: Array<{ name: string }>;\n metadata?: Record<string, unknown>;\n }>;\n interactions?: Array<{\n description: string;\n providerStates?: Array<{ name: string }>;\n metadata?: Record<string, unknown>;\n }>;\n}\n\nexport interface BrokerVerification {\n consumer: string;\n provider: string;\n success: boolean;\n verifiedAt?: string;\n /**\n * Populated when the broker could not be reached or returned a non-2xx\n * response. Distinguishes \"broker said the pact is not verified\" (no error)\n * from \"we could not determine verification status\" (error set).\n */\n error?: string;\n}\n\n/**\n * One row in the audit matrix.\n */\nexport interface AuditRow {\n consumer: string;\n provider: string;\n interaction: string;\n interaction_id?: string;\n kind: PactKind;\n contracted: boolean;\n /** Any interaction-level ledger hit in the window (test or production). */\n observed: boolean;\n test_seen: boolean;\n prod_seen: boolean;\n provider_verified: boolean;\n broker_verified: boolean;\n broker_verified_at?: string;\n /** Set when the broker check failed (network error, non-2xx, parse error). */\n broker_error?: string;\n last_observed_at?: string;\n last_outcome?: PactOutcome;\n}\n\nexport interface AuditMatrix {\n spec: typeof AUDIT_MATRIX_SPEC;\n rows: AuditRow[];\n counts: {\n total: number;\n /** Any contracted row. */\n contracted: number;\n /** Any row with test_seen OR prod_seen. */\n observed: number;\n /** Contracted AND seen in a consumer test. */\n contracted_and_test_seen: number;\n /** Contracted but not seen in a consumer test (stale confidence). */\n contracted_not_test_seen: number;\n /** Seen (test or production) without a matching contract (ungoverned flow). */\n test_or_prod_seen_not_contracted: number;\n test_seen: number;\n prod_seen: number;\n provider_verified: number;\n broker_verified: number;\n };\n window_days: number;\n generated_at: string;\n verification_failures?: ProviderVerificationRunEntry[];\n}\n\nexport interface PactInteractionKey {\n consumer: string;\n provider: string;\n interaction: string;\n kind: PactKind;\n interactionId?: string;\n}\n","import {\n LEDGER_ENTRY_SPEC,\n type InteractionLedgerEntry,\n type LedgerRecord,\n type ProviderVerificationRunEntry,\n} from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Validate a parsed JSONL line and return a typed ledger record.\n * Rejects anything that does not match the current v0.2 spec.\n */\nexport function normalizeLedgerRecord(parsed: unknown): LedgerRecord | null {\n if (!isRecord(parsed) || parsed.spec !== LEDGER_ENTRY_SPEC) return null;\n\n const { consumer, provider, observed_at } = parsed;\n if (\n typeof consumer !== 'string' ||\n typeof provider !== 'string' ||\n typeof observed_at !== 'string'\n ) {\n return null;\n }\n\n if (parsed.type === 'provider_verification_run') {\n if (typeof parsed.error !== 'string') return null;\n const entry: ProviderVerificationRunEntry = {\n type: 'provider_verification_run',\n spec: LEDGER_ENTRY_SPEC,\n consumer,\n provider,\n outcome: 'failed',\n source: parsed.source === 'production' ? 'production' : 'test',\n role: 'provider',\n observed_at,\n error: parsed.error,\n };\n if (typeof parsed.run_id === 'string') entry.run_id = parsed.run_id;\n if (typeof parsed.git_sha === 'string') entry.git_sha = parsed.git_sha;\n if (typeof parsed.trace_id === 'string') entry.trace_id = parsed.trace_id;\n if (typeof parsed.span_id === 'string') entry.span_id = parsed.span_id;\n return entry;\n }\n\n if (typeof parsed.interaction !== 'string') return null;\n\n const states = Array.isArray(parsed.states)\n ? parsed.states.filter((s): s is string => typeof s === 'string')\n : [];\n\n const entry: InteractionLedgerEntry = {\n type: 'interaction',\n spec: LEDGER_ENTRY_SPEC,\n consumer,\n provider,\n interaction: parsed.interaction,\n states,\n kind: parsed.kind === 'http' ? 'http' : 'message',\n outcome: parsed.outcome === 'failed' ? 'failed' : 'passed',\n source: parsed.source === 'production' ? 'production' : 'test',\n role: parsed.role === 'provider' ? 'provider' : 'consumer',\n duration_ms:\n typeof parsed.duration_ms === 'number' && parsed.duration_ms >= 0\n ? parsed.duration_ms\n : 0,\n observed_at,\n };\n\n if (typeof parsed.interaction_id === 'string' && parsed.interaction_id.length > 0) {\n entry.interaction_id = parsed.interaction_id;\n }\n if (typeof parsed.trace_id === 'string') entry.trace_id = parsed.trace_id;\n if (typeof parsed.span_id === 'string') entry.span_id = parsed.span_id;\n if (typeof parsed.run_id === 'string') entry.run_id = parsed.run_id;\n if (typeof parsed.git_sha === 'string') entry.git_sha = parsed.git_sha;\n if (typeof parsed.error === 'string') entry.error = parsed.error;\n\n return entry;\n}\n","import {\n appendFileSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n existsSync,\n} from 'node:fs';\nimport { appendFile, mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { normalizeLedgerRecord } from './ledger-normalize.js';\nimport { LEDGER_ENTRY_SPEC, type LedgerRecord } from './types.js';\n\nexport interface LedgerOptions {\n dir?: string;\n runId?: string;\n}\n\nconst DEFAULT_DIR = '.autotel-pact';\n\nfunction resolveLedgerDir(opts: LedgerOptions = {}): string {\n return path.resolve(process.cwd(), opts.dir ?? process.env.AUTOTEL_PACT_LEDGER_DIR ?? DEFAULT_DIR);\n}\n\nfunction resolveRunId(opts: LedgerOptions = {}): string {\n const explicit = opts.runId ?? process.env.AUTOTEL_PACT_RUN_ID;\n if (explicit) return explicit;\n return `local-${new Date().toISOString().replaceAll(/[:.]/g, '-')}`;\n}\n\nexport function ledgerPath(opts: LedgerOptions = {}): string {\n const dir = resolveLedgerDir(opts);\n return path.join(dir, `ledger-${resolveRunId(opts)}.jsonl`);\n}\n\nfunction writeLine(filePath: string, entry: LedgerRecord): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n appendFileSync(filePath, JSON.stringify(entry) + '\\n', 'utf8');\n}\n\n/**\n * Append a ledger record synchronously (tests and consumer wrappers).\n */\nexport function appendLedgerEntry(\n entry: LedgerRecord,\n opts: LedgerOptions = {},\n): void {\n const filePath = ledgerPath(opts);\n const normalized: LedgerRecord =\n entry.type === 'provider_verification_run'\n ? entry\n : { ...entry, spec: LEDGER_ENTRY_SPEC, type: 'interaction' as const };\n writeLine(filePath, normalized);\n}\n\nexport function appendProviderVerificationFailure(\n entry: Omit<\n import('./types.js').ProviderVerificationRunEntry,\n 'type' | 'spec' | 'outcome' | 'role'\n > & { error: string },\n opts: LedgerOptions = {},\n): void {\n appendLedgerEntry(\n {\n type: 'provider_verification_run',\n spec: LEDGER_ENTRY_SPEC,\n outcome: 'failed',\n role: 'provider',\n source: entry.source ?? 'test',\n consumer: entry.consumer,\n provider: entry.provider,\n observed_at: entry.observed_at,\n error: entry.error,\n run_id: entry.run_id,\n git_sha: entry.git_sha,\n trace_id: entry.trace_id,\n span_id: entry.span_id,\n },\n opts,\n );\n}\n\n/**\n * Read all ledger files and return normalized records.\n */\nexport function readLedger(opts: LedgerOptions = {}): LedgerRecord[] {\n const dir = resolveLedgerDir(opts);\n if (!existsSync(dir)) return [];\n const files = readdirSync(dir).filter((f) => f.endsWith('.jsonl'));\n const entries: LedgerRecord[] = [];\n for (const file of files) {\n const text = readFileSync(path.join(dir, file), 'utf8');\n for (const line of text.split('\\n')) {\n if (!line.trim()) continue;\n try {\n const normalized = normalizeLedgerRecord(JSON.parse(line));\n if (normalized) entries.push(normalized);\n } catch {\n // skip malformed lines\n }\n }\n }\n return entries;\n}\n\n/**\n * Serialized async writes for production span processor.\n * Bounded by a producer-side backpressure threshold: once `pendingWrites`\n * reaches `MAX_PENDING_WRITES`, new callers await drainage before queueing,\n * so memory cannot grow unbounded under sustained pressure.\n */\nconst MAX_PENDING_WRITES = 4096;\nlet asyncWriteChain: Promise<void> = Promise.resolve();\nlet pendingWrites = 0;\n\nexport async function appendLedgerEntryAsync(\n entry: LedgerRecord,\n opts: LedgerOptions = {},\n): Promise<void> {\n if (pendingWrites >= MAX_PENDING_WRITES) {\n await asyncWriteChain;\n }\n\n const filePath = ledgerPath(opts);\n const normalized: LedgerRecord =\n entry.type === 'provider_verification_run'\n ? entry\n : { ...entry, spec: LEDGER_ENTRY_SPEC, type: 'interaction' as const };\n const line = JSON.stringify(normalized);\n\n pendingWrites++;\n const run = asyncWriteChain.then(async () => {\n try {\n await mkdir(path.dirname(filePath), { recursive: true });\n await appendFile(filePath, line + '\\n', 'utf8');\n } finally {\n pendingWrites--;\n }\n });\n asyncWriteChain = run.catch(() => {});\n return run;\n}\n\nexport async function flushLedgerWrites(): Promise<void> {\n await asyncWriteChain;\n}\n\n/** @internal Reset async chain between tests. */\nexport function resetLedgerWriteChainForTests(): void {\n asyncWriteChain = Promise.resolve();\n pendingWrites = 0;\n}\n\n/** @internal Expose pending write count for tests. */\nexport function pendingLedgerWriteCount(): number {\n return pendingWrites;\n}\n","import { span as autotelSpan, getActiveSpan } from 'autotel';\nimport { buildPactAttributes, outcomeAttribute } from './attrs.js';\nimport { appendLedgerEntry, type LedgerOptions } from './ledger.js';\nimport {\n LEDGER_ENTRY_SPEC,\n type InteractionLedgerEntry,\n type PactInteractionMeta,\n type PactKind,\n} from './types.js';\n\n/**\n * Minimal structural type for `MessageConsumerPact`. We don't declare\n * `config` here because pact-js marks it `private` — listing it on a\n * public structural type would prevent users passing the real class.\n * Inside the wrapper we read `(pact as MessageConsumerPactWithConfig).config`\n * at runtime, with `opts.consumer` / `opts.provider` as override fallbacks.\n */\nexport interface MessageConsumerPactLike {\n verify: (handler: (message: ReifiedMessage) => Promise<unknown>) => Promise<unknown>;\n /**\n * Optional fluent metadata appender. Pact-JS's `MessageConsumerPact`\n * provides this; we use it (when present) to write `interactionId`\n * into the pact file's `messages[].metadata` block so the audit can\n * key on the same id from both sides.\n *\n * The value type is `string` because that is the only thing autotel-pact\n * passes. A narrower-than-pact-js type keeps real `MessageConsumerPact`\n * assignable here by parameter contravariance.\n */\n withMetadata?: (metadata: Record<string, string>) => MessageConsumerPactLike;\n}\n\ninterface MessageConsumerPactWithConfig extends MessageConsumerPactLike {\n config?: { consumer?: string; provider?: string };\n}\n\nexport interface ReifiedMessage {\n contents: unknown;\n description?: string;\n metadata?: Record<string, unknown>;\n providerStates?: Array<{ name: string }>;\n}\n\nexport type PactMessageHandler<R = unknown> = (\n message: ReifiedMessage,\n) => R | Promise<R>;\n\nexport interface WithPactInteractionOptions extends LedgerOptions {\n /**\n * Path (relative to cwd) of the pact file this interaction belongs to.\n * Stamped on the span as `pact.contract.file` and surfaced in the audit.\n */\n contractFile?: string;\n /**\n * Override the span name. Defaults to `pact.interaction`.\n */\n spanName?: string;\n /**\n * Consumer name. Only needed if the supplied pact instance doesn't expose\n * `.config.consumer` (e.g. a custom pact-like wrapper).\n */\n consumer?: string;\n /**\n * Provider name. Same caveat as `consumer`.\n */\n provider?: string;\n /**\n * Stable identity for this interaction. Recommended whenever you might\n * rename the human-readable `expectsToReceive` description in the future —\n * the audit matches on `interactionId` first, so renames don't break\n * continuity. Conventional form: `domain.event.vN` (e.g. `order.created.v1`).\n */\n interactionId?: string;\n}\n\nfunction resolveParticipants(\n pact: MessageConsumerPactLike,\n opts: WithPactInteractionOptions,\n): { consumer: string; provider: string } {\n const cfg = (pact as MessageConsumerPactWithConfig).config;\n const consumer = opts.consumer ?? cfg?.consumer;\n const provider = opts.provider ?? cfg?.provider;\n if (!consumer || !provider) {\n throw new Error(\n 'autotel-pact: could not resolve consumer/provider from the Pact instance. ' +\n 'Pass `{ consumer, provider }` in the options object.',\n );\n }\n return { consumer, provider };\n}\n\n/**\n * Wrap a Pact-Message `verify()` call so that:\n * 1. An autotel span opens around the verification.\n * 2. Span attributes capture consumer / provider / interaction / states.\n * 3. A ledger entry records that this interaction was actually exercised.\n *\n * The handler arg to `verify()` is wrapped so we can read the reified\n * message (the only place description + states are exposed by Pact-JS).\n *\n * @example\n * ```ts\n * const pact = new MessageConsumerPact({ consumer, provider, dir });\n * pact.given('an order exists').expectsToReceive('OrderCreated').withContent({...});\n *\n * await withPactInteraction(pact, (msg) => orderHandler(msg.contents));\n * ```\n */\nexport async function withPactInteraction<R>(\n pact: MessageConsumerPactLike,\n handler: PactMessageHandler<R>,\n opts: WithPactInteractionOptions = {},\n): Promise<R> {\n const start = process.hrtime.bigint();\n const spanName = opts.spanName ?? 'pact.interaction';\n const kind: PactKind = 'message';\n const { consumer, provider } = resolveParticipants(pact, opts);\n\n // When the caller asked for a stable interaction id, write it into the\n // pact file's message metadata so the audit matches the same identity\n // on both sides. Without this, the ledger entry carries the id but the\n // pact file does not — producing one STALE row (description-keyed\n // contracted) and one SHADOW row (id-keyed observed) for what is really\n // a single interaction.\n if (opts.interactionId && typeof pact.withMetadata === 'function') {\n pact.withMetadata({ interactionId: opts.interactionId });\n }\n\n let captured: ReifiedMessage | undefined;\n let handlerResult: R | undefined;\n\n // Run the verify inside an autotel span. We populate attributes once we\n // have the reified message; until then `pact.consumer` / `pact.provider`\n // are known but the description/states are not.\n return autotelSpan(spanName, async (span) => {\n span.setAttributes({\n 'pact.consumer': consumer,\n 'pact.provider': provider,\n 'pact.kind': kind,\n });\n\n try {\n await pact.verify(async (reified) => {\n captured = reified;\n const meta: PactInteractionMeta = {\n consumer,\n provider,\n description: reified.description ?? '<unknown>',\n states: (reified.providerStates ?? []).map((s) => s.name),\n kind,\n interactionId: opts.interactionId,\n };\n span.setAttributes(buildPactAttributes(meta, { contractFile: opts.contractFile }));\n\n handlerResult = (await handler(reified)) as R;\n return handlerResult;\n });\n\n span.setAttributes(outcomeAttribute('passed'));\n writeLedgerForOutcome({\n consumer,\n provider,\n captured,\n kind,\n outcome: 'passed',\n start,\n opts,\n });\n\n return handlerResult as R;\n } catch (error) {\n span.setAttributes(outcomeAttribute('failed'));\n writeLedgerForOutcome({\n consumer,\n provider,\n captured,\n kind,\n outcome: 'failed',\n start,\n opts,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n });\n}\n\nfunction writeLedgerForOutcome(args: {\n consumer: string;\n provider: string;\n captured: ReifiedMessage | undefined;\n kind: PactKind;\n outcome: 'passed' | 'failed';\n start: bigint;\n opts: WithPactInteractionOptions;\n error?: string;\n}): void {\n const { consumer, provider, captured, kind, outcome, start, opts, error } = args;\n const ctx = getActiveSpan()?.spanContext();\n const entry: InteractionLedgerEntry = {\n type: 'interaction',\n spec: LEDGER_ENTRY_SPEC,\n consumer,\n provider,\n interaction: captured?.description ?? '<unknown>',\n interaction_id: opts.interactionId,\n states: (captured?.providerStates ?? []).map((s) => s.name),\n kind,\n source: 'test',\n role: 'consumer',\n outcome,\n duration_ms: Number(process.hrtime.bigint() - start) / 1e6,\n observed_at: new Date().toISOString(),\n trace_id: ctx?.traceId,\n span_id: ctx?.spanId,\n run_id: process.env.AUTOTEL_PACT_RUN_ID,\n git_sha: process.env.GIT_SHA ?? process.env.GITHUB_SHA,\n error,\n };\n appendLedgerEntry(entry, opts);\n}\n","// HTTP Pact wrapper. Mirrors the Pact-Message wrapper shape but targets\n// PactV3 / PactV4 (HTTP) instances, where the lifecycle is\n// `addInteraction(...)` + `executeTest(fn)` instead of `.verify(handler)`.\n\nimport { span as autotelSpan, getActiveSpan } from 'autotel';\nimport { buildPactAttributes, outcomeAttribute } from './attrs.js';\nimport { appendLedgerEntry, type LedgerOptions } from './ledger.js';\nimport {\n LEDGER_ENTRY_SPEC,\n type InteractionLedgerEntry,\n type PactInteractionMeta,\n} from './types.js';\n\n/**\n * Minimal structural type for a PactV3 / PactV4 HTTP pact instance — we\n * only call `addInteraction` and `executeTest`. The `opts` property is\n * private in Pact-JS but readable at runtime, exactly like the message\n * variant's `config`.\n */\nexport interface HttpPactLike {\n addInteraction: (interaction: HttpInteraction) => unknown;\n executeTest: <T>(testFn: (mockServer: HttpMockServer) => Promise<T>) => Promise<T | undefined>;\n}\n\ninterface HttpPactWithOpts extends HttpPactLike {\n opts?: { consumer?: string; provider?: string };\n}\n\n/**\n * Structural shape of a single HTTP interaction as passed to\n * `PactV3.addInteraction`. We only read the description and states\n * directly; the rest is forwarded to Pact untouched.\n */\nexport interface HttpInteraction {\n uponReceiving: string;\n states?: Array<{ description: string; parameters?: unknown }>;\n withRequest?: unknown;\n willRespondWith?: unknown;\n [key: string]: unknown;\n}\n\n/** Subset of Pact's `V3MockServer` the test function typically uses. */\nexport interface HttpMockServer {\n url: string;\n port: number;\n [key: string]: unknown;\n}\n\nexport type HttpPactTestFn<T> = (mockServer: HttpMockServer) => Promise<T>;\n\nexport interface WithHttpPactInteractionOptions extends LedgerOptions {\n contractFile?: string;\n spanName?: string;\n consumer?: string;\n provider?: string;\n /** See {@link WithPactInteractionOptions.interactionId}. */\n interactionId?: string;\n}\n\nfunction resolveHttpParticipants(\n pact: HttpPactLike,\n opts: WithHttpPactInteractionOptions,\n): { consumer: string; provider: string } {\n const fromOpts = (pact as HttpPactWithOpts).opts;\n const consumer = opts.consumer ?? fromOpts?.consumer;\n const provider = opts.provider ?? fromOpts?.provider;\n if (!consumer || !provider) {\n throw new Error(\n 'autotel-pact: could not resolve consumer/provider from the PactV3 instance. ' +\n 'Pass `{ consumer, provider }` in the options object.',\n );\n }\n return { consumer, provider };\n}\n\n/**\n * Wrap a Pact-JS HTTP test (PactV3 / PactV4) so that:\n * 1. The interaction is added to the pact via `addInteraction`.\n * 2. An autotel span opens around the test body, with `pact.*` attributes.\n * 3. A ledger entry records that this interaction was exercised.\n *\n * Mirrors `withPactInteraction` (the message variant) so the DX is the\n * same regardless of contract kind.\n *\n * @example\n * ```ts\n * const provider = new PactV3({ consumer: 'Web', provider: 'Catalog', dir: './pacts' });\n *\n * it('gets all products', async () => {\n * await withHttpPactInteraction(\n * provider,\n * {\n * states: [{ description: 'products exist' }],\n * uponReceiving: 'get all products',\n * withRequest: { method: 'GET', path: '/products' },\n * willRespondWith: { status: 200, body: [...] },\n * },\n * async (mockServer) => {\n * const api = new API(mockServer.url);\n * expect(await api.getAllProducts()).toEqual([...]);\n * },\n * );\n * });\n * ```\n */\nexport async function withHttpPactInteraction<T>(\n pact: HttpPactLike,\n interaction: HttpInteraction,\n testFn: HttpPactTestFn<T>,\n opts: WithHttpPactInteractionOptions = {},\n): Promise<T | undefined> {\n // PactV3 interactions have no metadata channel we can write an id into\n // (V4's `comments` field will let us do this in a future release). Without\n // a way to land the id on the pact-file side, observed-side and contracted-\n // side would key on different identities and produce spurious STALE+SHADOW\n // pairs. Refuse the option until v0.2 wires it through PactV4.\n if (opts.interactionId !== undefined) {\n throw new Error(\n 'autotel-pact: `interactionId` is not yet supported for HTTP Pact. ' +\n 'PactV3 interactions have no metadata channel to persist the id; ' +\n 'support arrives in v0.2 via PactV4 comments. Use the description as ' +\n 'the stable identity for HTTP interactions in v0.1.',\n );\n }\n\n const start = process.hrtime.bigint();\n const spanName = opts.spanName ?? 'pact.interaction';\n const kind = 'http' as const;\n const { consumer, provider } = resolveHttpParticipants(pact, opts);\n\n const meta: PactInteractionMeta = {\n consumer,\n provider,\n description: interaction.uponReceiving,\n states: (interaction.states ?? []).map((s) => s.description),\n kind,\n interactionId: opts.interactionId,\n };\n\n pact.addInteraction(interaction);\n\n return autotelSpan(spanName, async (span) => {\n span.setAttributes(buildPactAttributes(meta, { contractFile: opts.contractFile }));\n\n try {\n const result = await pact.executeTest(testFn);\n span.setAttributes(outcomeAttribute('passed'));\n writeHttpLedgerEntry({ meta, outcome: 'passed', start, opts });\n return result;\n } catch (error) {\n span.setAttributes(outcomeAttribute('failed'));\n writeHttpLedgerEntry({\n meta,\n outcome: 'failed',\n start,\n opts,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n });\n}\n\nfunction writeHttpLedgerEntry(args: {\n meta: PactInteractionMeta;\n outcome: 'passed' | 'failed';\n start: bigint;\n opts: WithHttpPactInteractionOptions;\n error?: string;\n}): void {\n const { meta, outcome, start, opts, error } = args;\n const ctx = getActiveSpan()?.spanContext();\n const entry: InteractionLedgerEntry = {\n type: 'interaction',\n spec: LEDGER_ENTRY_SPEC,\n consumer: meta.consumer,\n provider: meta.provider,\n interaction: meta.description,\n interaction_id: meta.interactionId,\n states: meta.states,\n kind: 'http',\n source: 'test',\n role: 'consumer',\n outcome,\n duration_ms: Number(process.hrtime.bigint() - start) / 1e6,\n observed_at: new Date().toISOString(),\n trace_id: ctx?.traceId,\n span_id: ctx?.spanId,\n run_id: process.env.AUTOTEL_PACT_RUN_ID,\n git_sha: process.env.GIT_SHA ?? process.env.GITHUB_SHA,\n error,\n };\n appendLedgerEntry(entry, opts);\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport type { PactFile, PactInteractionKey } from './types.js';\n\n/**\n * Walk a directory and return absolute paths of all *.json pact files.\n */\nexport function listPactFiles(dir: string): string[] {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n out.push(...listPactFiles(full));\n } else if (entry.isFile() && entry.name.endsWith('.json')) {\n out.push(full);\n }\n }\n return out;\n}\n\nexport function extractInteractionId(\n metadata: Record<string, unknown> | undefined,\n): string | undefined {\n if (!metadata) return undefined;\n const id = metadata.interactionId ?? metadata.interaction_id;\n return typeof id === 'string' && id.length > 0 ? id : undefined;\n}\n\n/**\n * Extract interaction tuples declared in a pact file.\n */\nexport function interactionsFromPactFile(pact: PactFile): PactInteractionKey[] {\n const consumer = pact.consumer?.name;\n const provider = pact.provider?.name;\n if (!consumer || !provider) return [];\n const keys: PactInteractionKey[] = [];\n for (const m of pact.messages ?? []) {\n keys.push({\n consumer,\n provider,\n interaction: m.description,\n kind: 'message',\n interactionId: extractInteractionId(m.metadata),\n });\n }\n for (const i of pact.interactions ?? []) {\n keys.push({\n consumer,\n provider,\n interaction: i.description,\n kind: 'http',\n interactionId: extractInteractionId(i.metadata),\n });\n }\n return keys;\n}\n\nexport function parsePactFile(filePath: string): PactFile | null {\n try {\n return JSON.parse(readFileSync(filePath, 'utf8')) as PactFile;\n } catch {\n return null;\n }\n}\n","import path from 'node:path';\nimport { span as autotelSpan, getActiveSpan } from 'autotel';\nimport { appendLedgerEntry, appendProviderVerificationFailure, type LedgerOptions } from './ledger.js';\nimport { interactionsFromPactFile, parsePactFile } from './pact-file.js';\nimport { LEDGER_ENTRY_SPEC, type InteractionLedgerEntry, type PactKind } from './types.js';\nimport { PACT_ATTRS } from './attrs.js';\n\n/**\n * Minimal Verifier options — structural match for @pact-foundation/pact Verifier.\n */\nexport interface VerifierOptionsLike {\n provider: string;\n providerBaseUrl: string;\n pactUrls?: string[];\n logLevel?: string;\n [key: string]: unknown;\n}\n\nexport interface VerifierLike {\n verifyProvider: () => Promise<unknown>;\n}\n\nexport interface VerifierConstructor {\n new (options: VerifierOptionsLike): VerifierLike;\n}\n\nexport interface WithProviderVerificationOptions extends LedgerOptions {\n /** Consumer name when not inferrable from pact files. */\n consumer?: string;\n spanName?: string;\n /** Custom Verifier class (defaults to dynamic import from @pact-foundation/pact). */\n Verifier?: VerifierConstructor;\n /**\n * Skip loading and calling the Verifier entirely. Emits the same\n * per-interaction ledger rows as a successful verification, parsed from the\n * supplied pact files. Use for demos, smoke tests, and audit-pipeline\n * exercises where running a real provider is impractical. Do not use in\n * production CI: it will mark every interaction in the pact file as\n * provider-verified without any actual verification.\n */\n skipVerifier?: boolean;\n}\n\nfunction resolvePactPaths(opts: VerifierOptionsLike): string[] {\n const urls = opts.pactUrls ?? [];\n return urls.map((u) => path.resolve(process.cwd(), u));\n}\n\nfunction inferConsumerFromPacts(pactPaths: string[], fallback?: string): string {\n for (const filePath of pactPaths) {\n const pact = parsePactFile(filePath);\n if (pact?.consumer?.name) return pact.consumer.name;\n }\n if (fallback) return fallback;\n throw new Error(\n 'autotel-pact: could not infer consumer from pact files. Pass `consumer` in options.',\n );\n}\n\nfunction kindForPactFile(filePath: string): PactKind {\n const pact = parsePactFile(filePath);\n if (!pact) return 'message';\n if ((pact.interactions?.length ?? 0) > 0) return 'http';\n return 'message';\n}\n\nasync function loadVerifier(\n VerifierClass?: VerifierConstructor,\n): Promise<VerifierConstructor> {\n if (VerifierClass) return VerifierClass;\n const mod = await import('@pact-foundation/pact');\n const Verifier = (mod as { Verifier?: VerifierConstructor }).Verifier;\n if (!Verifier) {\n throw new Error(\n 'autotel-pact: @pact-foundation/pact Verifier not found. Install the peer dependency.',\n );\n }\n return Verifier;\n}\n\n/**\n * Wrap provider verification — records per-interaction evidence only on success.\n */\nexport async function withProviderVerification(\n verifierOpts: VerifierOptionsLike,\n wrapOpts: WithProviderVerificationOptions = {},\n): Promise<void> {\n const pactPaths = resolvePactPaths(verifierOpts);\n const provider = verifierOpts.provider;\n const consumer = inferConsumerFromPacts(pactPaths, wrapOpts.consumer);\n const spanName = wrapOpts.spanName ?? 'pact.verification';\n const start = process.hrtime.bigint();\n const Verifier = wrapOpts.skipVerifier ? undefined : await loadVerifier(wrapOpts.Verifier);\n\n return autotelSpan(spanName, async () => {\n const span = getActiveSpan();\n span?.setAttributes({\n [PACT_ATTRS.CONSUMER]: consumer,\n [PACT_ATTRS.PROVIDER]: provider,\n [PACT_ATTRS.KIND]: pactPaths.length === 1 ? kindForPactFile(pactPaths[0]!) : 'message',\n 'pact.role': 'provider',\n });\n\n try {\n if (Verifier) {\n await new Verifier(verifierOpts).verifyProvider();\n }\n span?.setAttributes({ [PACT_ATTRS.OUTCOME]: 'passed' });\n\n const ctx = span?.spanContext();\n const base = {\n source: 'test' as const,\n role: 'provider' as const,\n outcome: 'passed' as const,\n observed_at: new Date().toISOString(),\n trace_id: ctx?.traceId,\n span_id: ctx?.spanId,\n run_id: process.env.AUTOTEL_PACT_RUN_ID,\n git_sha: process.env.GIT_SHA ?? process.env.GITHUB_SHA,\n };\n\n for (const filePath of pactPaths) {\n const pact = parsePactFile(filePath);\n if (!pact) continue;\n const interactions = interactionsFromPactFile(pact);\n for (const i of interactions) {\n const entry: InteractionLedgerEntry = {\n type: 'interaction',\n spec: LEDGER_ENTRY_SPEC,\n consumer: i.consumer,\n provider: i.provider,\n interaction: i.interaction,\n interaction_id: i.interactionId,\n states: [],\n kind: i.kind,\n duration_ms: Number(process.hrtime.bigint() - start) / 1e6,\n ...base,\n };\n appendLedgerEntry(entry, wrapOpts);\n }\n }\n } catch (error) {\n span?.setAttributes({ [PACT_ATTRS.OUTCOME]: 'failed' });\n const message = error instanceof Error ? error.message : String(error);\n const ctx = span?.spanContext();\n appendProviderVerificationFailure(\n {\n consumer,\n provider,\n source: 'test',\n observed_at: new Date().toISOString(),\n error: message,\n trace_id: ctx?.traceId,\n span_id: ctx?.spanId,\n run_id: process.env.AUTOTEL_PACT_RUN_ID,\n git_sha: process.env.GIT_SHA ?? process.env.GITHUB_SHA,\n },\n wrapOpts,\n );\n throw error;\n }\n });\n}\n","import { getActiveSpan } from 'autotel';\nimport { buildPactAttributes, PACT_ATTRS } from './attrs.js';\nimport type { PactInteractionMeta } from './types.js';\n\n/**\n * Stamp `pact.*` attributes on the active span for production observation.\n * Requires an active span (wrap handlers with `trace()` first).\n */\nexport function tagPactInteraction(meta: PactInteractionMeta): void {\n const span = getActiveSpan();\n if (!span) {\n throw new Error(\n 'autotel-pact: tagPactInteraction requires an active span. Wrap the handler with trace() first.',\n );\n }\n const attrs = buildPactAttributes(meta);\n span.setAttributes(attrs);\n if (meta.interactionId) {\n span.setAttribute(PACT_ATTRS.INTERACTION_ID, meta.interactionId);\n }\n}\n","import { appendLedgerEntryAsync, flushLedgerWrites, type LedgerOptions } from './ledger.js';\nimport { PACT_ATTRS } from './attrs.js';\nimport { LEDGER_ENTRY_SPEC, type InteractionLedgerEntry, type PactKind } from './types.js';\n\n/** Minimal ReadableSpan shape — avoids hard dependency on sdk-trace-base. */\nexport interface ReadableSpanLike {\n attributes: Record<string, unknown>;\n spanContext(): { traceId: string; spanId: string };\n /** OTel SpanStatus. code 2 = ERROR (see @opentelemetry/api SpanStatusCode). */\n status?: { code: number; message?: string };\n}\n\nexport interface SpanLike {\n spanContext(): { traceId: string; spanId: string };\n}\n\n/** Opaque parent context — matches OTel SpanProcessor without a hard dependency. */\nexport type OtelContext = unknown;\n\nexport interface SpanProcessorLike {\n onStart(span: SpanLike, parentContext: OtelContext): void;\n onEnd(span: ReadableSpanLike): void;\n shutdown(): Promise<void>;\n forceFlush(): Promise<void>;\n}\n\nexport interface PactLedgerProcessorOptions extends LedgerOptions {\n /** Max queued ledger writes before dropping (default 1024). */\n maxQueueSize?: number;\n onDrop?: (reason: 'queue_full') => void;\n onWriteError?: (error: unknown) => void;\n onWarn?: (message: string) => void;\n}\n\nconst DEFAULT_MAX_QUEUE = 1024;\nconst WARN_INTERVAL_MS = 60_000;\n\ntype QueueItem = { entry: InteractionLedgerEntry; opts: LedgerOptions };\n\nfunction attrString(attrs: Record<string, unknown>, key: string): string | undefined {\n const v = attrs[key];\n if (typeof v === 'string' && v.length > 0) return v;\n return undefined;\n}\n\nfunction attrStates(attrs: Record<string, unknown>): string[] {\n const v = attrs[PACT_ATTRS.INTERACTION_STATES];\n if (Array.isArray(v)) {\n return v.filter((s): s is string => typeof s === 'string');\n }\n return [];\n}\n\nfunction ledgerEntryFromSpan(span: ReadableSpanLike): InteractionLedgerEntry | null {\n const attrs = span.attributes;\n const consumer = attrString(attrs, PACT_ATTRS.CONSUMER);\n const provider = attrString(attrs, PACT_ATTRS.PROVIDER);\n const description = attrString(attrs, PACT_ATTRS.INTERACTION_DESCRIPTION);\n const interactionId = attrString(attrs, PACT_ATTRS.INTERACTION_ID);\n if (!consumer || !provider || (!description && !interactionId)) {\n return null;\n }\n\n const kindRaw = attrString(attrs, PACT_ATTRS.KIND);\n const kind: PactKind = kindRaw === 'http' ? 'http' : 'message';\n const ctx = span.spanContext();\n // SpanStatusCode.ERROR === 2. Treat anything else (UNSET, OK) as passed.\n const errored = span.status?.code === 2;\n\n const entry: InteractionLedgerEntry = {\n type: 'interaction',\n spec: LEDGER_ENTRY_SPEC,\n consumer,\n provider,\n interaction: description ?? interactionId!,\n interaction_id: interactionId,\n states: attrStates(attrs),\n kind,\n outcome: errored ? 'failed' : 'passed',\n source: 'production',\n role: 'consumer',\n duration_ms: 0,\n observed_at: new Date().toISOString(),\n trace_id: ctx.traceId,\n span_id: ctx.spanId,\n run_id: process.env.AUTOTEL_PACT_RUN_ID,\n git_sha: process.env.GIT_SHA ?? process.env.GITHUB_SHA,\n };\n if (errored && span.status?.message) {\n entry.error = span.status.message;\n }\n return entry;\n}\n\n/**\n * Records pact-tagged spans to the JSONL ledger. Bounded queue, drop-on-full, fail-open.\n */\nexport class PactLedgerSpanProcessor implements SpanProcessorLike {\n private readonly opts: PactLedgerProcessorOptions;\n private readonly maxQueue: number;\n private pending: QueueItem[] = [];\n private flushing = false;\n private drops = 0;\n private lastWarnAt = 0;\n\n constructor(opts: PactLedgerProcessorOptions = {}) {\n this.opts = opts;\n this.maxQueue = opts.maxQueueSize ?? DEFAULT_MAX_QUEUE;\n }\n\n onStart(_span: SpanLike, _parentContext: OtelContext): void {\n // no-op\n }\n\n onEnd(span: ReadableSpanLike): void {\n try {\n const entry = ledgerEntryFromSpan(span);\n if (!entry) return;\n\n if (this.pending.length >= this.maxQueue) {\n // FIFO eviction: drop the oldest queued entry to keep the newest.\n // Recent evidence is more valuable than backlog under sustained pressure.\n this.pending.shift();\n this.drops++;\n this.opts.onDrop?.('queue_full');\n this.maybeWarn(\n `autotel-pact: dropped oldest queued ledger entry (queue full, max ${this.maxQueue}). ` +\n `${this.drops} total drops.`,\n );\n }\n\n this.pending.push({ entry, opts: this.opts });\n queueMicrotask(() => {\n void this.flush();\n });\n } catch (error) {\n this.opts.onWriteError?.(error);\n }\n }\n\n private maybeWarn(message: string): void {\n const now = Date.now();\n if (now - this.lastWarnAt < WARN_INTERVAL_MS) return;\n this.lastWarnAt = now;\n if (this.opts.onWarn) {\n this.opts.onWarn(message);\n } else {\n console.warn(message);\n }\n }\n\n private async flush(): Promise<void> {\n if (this.flushing) return;\n this.flushing = true;\n try {\n while (this.pending.length > 0) {\n const item = this.pending.shift()!;\n try {\n await appendLedgerEntryAsync(item.entry, item.opts);\n } catch (error) {\n this.opts.onWriteError?.(error);\n this.maybeWarn(\n `autotel-pact: ledger write failed (fail-open): ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n } finally {\n this.flushing = false;\n if (this.pending.length > 0) {\n queueMicrotask(() => {\n void this.flush();\n });\n }\n }\n }\n\n async forceFlush(): Promise<void> {\n await this.flush();\n await flushLedgerWrites();\n }\n\n async shutdown(): Promise<void> {\n await this.forceFlush();\n }\n}\n\nexport function createPactLedgerProcessor(\n opts: PactLedgerProcessorOptions = {},\n): PactLedgerSpanProcessor {\n return new PactLedgerSpanProcessor(opts);\n}\n","import type { BrokerVerification } from './types.js';\n\nexport interface BrokerConfig {\n baseUrl: string;\n token?: string;\n username?: string;\n password?: string;\n}\n\nexport interface ConsumerProviderPair {\n consumer: string;\n provider: string;\n}\n\nfunction authHeaders(config: BrokerConfig): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n if (config.token) {\n headers.Authorization = `Bearer ${config.token}`;\n } else if (config.username && config.password) {\n const encoded = Buffer.from(`${config.username}:${config.password}`).toString('base64');\n headers.Authorization = `Basic ${encoded}`;\n }\n return headers;\n}\n\nfunction trimBaseUrl(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\n/**\n * Parse Pact Broker latest verification result payload.\n */\nexport function parseBrokerVerificationResult(\n consumer: string,\n provider: string,\n json: unknown,\n): BrokerVerification | null {\n if (!json || typeof json !== 'object') return null;\n const body = json as Record<string, unknown>;\n const success =\n body.success === true ||\n (body.success === undefined && body.result === 'success');\n const verifiedAt =\n typeof body.verifiedAt === 'string'\n ? body.verifiedAt\n : typeof body.verified_at === 'string'\n ? body.verified_at\n : typeof body.createdAt === 'string'\n ? body.createdAt\n : undefined;\n\n return {\n consumer,\n provider,\n success: !!success,\n verifiedAt,\n };\n}\n\n/**\n * Fetch latest verification results for each consumer–provider pair.\n */\nexport async function fetchBrokerVerifications(\n config: BrokerConfig,\n pairs: ConsumerProviderPair[],\n): Promise<BrokerVerification[]> {\n const base = trimBaseUrl(config.baseUrl);\n const headers = authHeaders(config);\n const results: BrokerVerification[] = [];\n\n for (const { consumer, provider } of pairs) {\n const url = `${base}/pacts/provider/${encodeURIComponent(provider)}/consumer/${encodeURIComponent(consumer)}/latest/verification-results`;\n try {\n const res = await fetch(url, { headers });\n if (!res.ok) {\n results.push({\n consumer,\n provider,\n success: false,\n error: `HTTP ${res.status} ${res.statusText}`.trim(),\n });\n continue;\n }\n const json: unknown = await res.json();\n const parsed = parseBrokerVerificationResult(consumer, provider, json);\n results.push(\n parsed ?? {\n consumer,\n provider,\n success: false,\n error: 'Unparseable broker response',\n },\n );\n } catch (error) {\n results.push({\n consumer,\n provider,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n}\n\nexport function brokerConfigFromEnv(): BrokerConfig | undefined {\n const baseUrl = process.env.PACT_BROKER_BASE_URL;\n if (!baseUrl) return undefined;\n return {\n baseUrl,\n token: process.env.PACT_BROKER_TOKEN,\n username: process.env.PACT_BROKER_USERNAME,\n password: process.env.PACT_BROKER_PASSWORD,\n };\n}\n","import path from 'node:path';\nimport { fetchBrokerVerifications, type BrokerConfig } from './broker.js';\nimport { readLedger, type LedgerOptions } from './ledger.js';\nimport {\n interactionsFromPactFile,\n listPactFiles,\n parsePactFile,\n} from './pact-file.js';\nimport {\n AUDIT_MATRIX_SPEC,\n isInteractionLedgerEntry,\n isProviderVerificationRun,\n type AuditMatrix,\n type AuditRow,\n type BrokerVerification,\n type InteractionLedgerEntry,\n type LedgerRecord,\n type PactInteractionKey,\n type ProviderVerificationRunEntry,\n} from './types.js';\n\nexport interface AuditOptions extends LedgerOptions {\n pactsDir?: string;\n windowDays?: number;\n broker?: BrokerConfig;\n}\n\nconst DEFAULT_PACTS_DIR = './pacts';\nconst DEFAULT_WINDOW_DAYS = 14;\n\nexport function keyOf(k: PactInteractionKey): string {\n const identity = k.interactionId ?? k.interaction;\n return `${k.consumer}::${k.provider}::${k.kind}::${identity}`;\n}\n\nfunction pairKey(consumer: string, provider: string): string {\n return `${consumer}::${provider}`;\n}\n\nfunction inWindow(observedAt: string, cutoff: number): boolean {\n const t = Date.parse(observedAt);\n return Number.isFinite(t) && t >= cutoff;\n}\n\n/**\n * Compute the audit matrix from pact files, ledger, and optional broker data.\n */\nexport function computeAuditMatrix(input: {\n contracted: PactInteractionKey[];\n ledger: LedgerRecord[];\n brokerVerifications?: BrokerVerification[];\n windowDays?: number;\n now?: Date;\n}): AuditMatrix {\n const windowDays = input.windowDays ?? DEFAULT_WINDOW_DAYS;\n const now = input.now ?? new Date();\n const cutoff = now.getTime() - windowDays * 24 * 60 * 60 * 1000;\n\n const verificationFailures: ProviderVerificationRunEntry[] = [];\n const recentInteractions: InteractionLedgerEntry[] = [];\n\n for (const entry of input.ledger) {\n if (!inWindow(entry.observed_at, cutoff)) continue;\n if (isProviderVerificationRun(entry)) {\n verificationFailures.push(entry);\n continue;\n }\n if (isInteractionLedgerEntry(entry)) {\n recentInteractions.push(entry);\n }\n }\n\n const brokerByPair = new Map<string, BrokerVerification>();\n for (const b of input.brokerVerifications ?? []) {\n brokerByPair.set(pairKey(b.consumer, b.provider), b);\n }\n\n const testSeenByKey = new Map<string, InteractionLedgerEntry[]>();\n const prodSeenByKey = new Map<string, InteractionLedgerEntry[]>();\n const providerVerifiedByKey = new Map<string, InteractionLedgerEntry[]>();\n const anyObservedByKey = new Map<string, InteractionLedgerEntry[]>();\n\n for (const entry of recentInteractions) {\n const k = keyOf({\n consumer: entry.consumer,\n provider: entry.provider,\n interaction: entry.interaction,\n kind: entry.kind,\n interactionId: entry.interaction_id,\n });\n\n const push = (map: Map<string, InteractionLedgerEntry[]>) => {\n const arr = map.get(k) ?? [];\n arr.push(entry);\n map.set(k, arr);\n };\n\n push(anyObservedByKey);\n\n if (entry.source === 'test' && entry.role === 'consumer') {\n push(testSeenByKey);\n }\n if (entry.source === 'production') {\n push(prodSeenByKey);\n }\n if (entry.role === 'provider' && entry.outcome === 'passed') {\n push(providerVerifiedByKey);\n }\n }\n\n const contractedByKey = new Map<string, PactInteractionKey>();\n for (const c of input.contracted) {\n contractedByKey.set(keyOf(c), c);\n }\n\n const rows: AuditRow[] = [];\n\n function pushRow(parts: PactInteractionKey, k: string, isContracted: boolean): void {\n const testObs = testSeenByKey.get(k) ?? [];\n const prodObs = prodSeenByKey.get(k) ?? [];\n const providerObs = providerVerifiedByKey.get(k) ?? [];\n const allObs = anyObservedByKey.get(k) ?? [];\n const latest = allObs.toSorted((a, b) =>\n b.observed_at.localeCompare(a.observed_at),\n )[0];\n const broker = brokerByPair.get(pairKey(parts.consumer, parts.provider));\n\n rows.push({\n consumer: parts.consumer,\n provider: parts.provider,\n interaction: parts.interaction,\n interaction_id: parts.interactionId ?? latest?.interaction_id,\n kind: parts.kind,\n contracted: isContracted,\n observed: testObs.length > 0 || prodObs.length > 0,\n test_seen: testObs.length > 0,\n prod_seen: prodObs.length > 0,\n provider_verified: providerObs.length > 0,\n broker_verified: broker?.success === true,\n broker_verified_at: broker?.verifiedAt,\n broker_error: broker?.error,\n last_observed_at: latest?.observed_at,\n last_outcome: latest?.outcome,\n });\n }\n\n for (const [k, contracted] of contractedByKey) {\n pushRow(contracted, k, true);\n }\n for (const [k, observations] of anyObservedByKey) {\n if (contractedByKey.has(k)) continue;\n const first = observations[0]!;\n pushRow(\n {\n consumer: first.consumer,\n provider: first.provider,\n interaction: first.interaction,\n kind: first.kind,\n interactionId: first.interaction_id,\n },\n k,\n false,\n );\n }\n\n rows.sort((a, b) =>\n a.consumer.localeCompare(b.consumer) ||\n a.provider.localeCompare(b.provider) ||\n a.interaction.localeCompare(b.interaction),\n );\n\n const counts = {\n total: rows.length,\n contracted: rows.filter((r) => r.contracted).length,\n observed: rows.filter((r) => r.observed).length,\n contracted_and_test_seen: rows.filter((r) => r.contracted && r.test_seen).length,\n contracted_not_test_seen: rows.filter((r) => r.contracted && !r.test_seen).length,\n test_or_prod_seen_not_contracted: rows.filter(\n (r) => !r.contracted && (r.test_seen || r.prod_seen),\n ).length,\n test_seen: rows.filter((r) => r.test_seen).length,\n prod_seen: rows.filter((r) => r.prod_seen).length,\n provider_verified: rows.filter((r) => r.provider_verified).length,\n broker_verified: rows.filter((r) => r.broker_verified).length,\n };\n\n const matrix: AuditMatrix = {\n spec: AUDIT_MATRIX_SPEC,\n rows,\n counts,\n window_days: windowDays,\n generated_at: now.toISOString(),\n };\n\n if (verificationFailures.length > 0) {\n matrix.verification_failures = verificationFailures;\n }\n\n return matrix;\n}\n\nexport async function runAudit(opts: AuditOptions = {}): Promise<AuditMatrix> {\n const pactsDir = path.resolve(process.cwd(), opts.pactsDir ?? DEFAULT_PACTS_DIR);\n const contracted: PactInteractionKey[] = [];\n const pairs = new Set<string>();\n\n for (const file of listPactFiles(pactsDir)) {\n const pact = parsePactFile(file);\n if (!pact) continue;\n const interactions = interactionsFromPactFile(pact);\n contracted.push(...interactions);\n const consumer = pact.consumer?.name;\n const provider = pact.provider?.name;\n if (consumer && provider) {\n pairs.add(pairKey(consumer, provider));\n }\n }\n\n const ledger = readLedger(opts);\n\n let brokerVerifications: BrokerVerification[] | undefined;\n if (opts.broker) {\n brokerVerifications = await fetchBrokerVerifications(opts.broker, [...pairs].map((p) => {\n const [consumer, provider] = p.split('::');\n return { consumer: consumer!, provider: provider! };\n }));\n }\n\n return computeAuditMatrix({\n contracted,\n ledger,\n brokerVerifications,\n windowDays: opts.windowDays,\n });\n}\n\n/** Sync audit without broker (backward compatible for tests). */\nexport function runAuditSync(opts: Omit<AuditOptions, 'broker'> = {}): AuditMatrix {\n const pactsDir = path.resolve(process.cwd(), opts.pactsDir ?? DEFAULT_PACTS_DIR);\n const contracted: PactInteractionKey[] = [];\n for (const file of listPactFiles(pactsDir)) {\n const pact = parsePactFile(file);\n if (pact) contracted.push(...interactionsFromPactFile(pact));\n }\n const ledger = readLedger(opts);\n return computeAuditMatrix({\n contracted,\n ledger,\n windowDays: opts.windowDays,\n });\n}\n","/**\n * Human-facing labels for CLI and docs. Internal JSON keeps machine keys.\n */\n\nexport const CLI_COLUMNS = {\n STATUS: 'STATUS',\n CONTRACTED: 'CONTRACTED',\n TEST_SEEN: 'TEST_SEEN',\n PROD_SEEN: 'PROD_SEEN',\n PROVIDER_VERIFIED: 'PROVIDER_VERIFIED',\n BROKER_VERIFIED: 'BROKER_VERIFIED',\n PAIR: 'CONSUMER → PROVIDER',\n KIND: 'KIND',\n INTERACTION: 'INTERACTION',\n} as const;\n\nexport function formatYesNo(value: boolean): string {\n return value ? 'yes' : 'no';\n}\n\nexport const EVIDENCE_THEME =\n 'We do not guess. We record evidence.';\n\nexport const BROKER_GRANULARITY_WARNING =\n 'Broker verification proves the latest pact between a consumer and provider was verified. It does not prove each interaction was individually observed by autotel-pact.';\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { L as LedgerOptions } from './ledger-D88TzN1c.cjs';
|
|
2
|
+
export { a as appendLedgerEntry, b as appendLedgerEntryAsync, c as appendProviderVerificationFailure, f as flushLedgerWrites, l as ledgerPath, r as readLedger } from './ledger-D88TzN1c.cjs';
|
|
3
|
+
export { VerifierConstructor, VerifierLike, VerifierOptionsLike, WithProviderVerificationOptions, withProviderVerification } from './provider.cjs';
|
|
4
|
+
import { P as PactInteractionMeta, a as PactOutcome, b as PactFile, c as PactInteractionKey } from './types-BHGiwqcp.cjs';
|
|
5
|
+
export { A as AUDIT_MATRIX_SPEC, d as AuditMatrix, e as AuditRow, B as BrokerVerification, I as InteractionLedgerEntry, L as LEDGER_ENTRY_SPEC, f as LedgerRecord, g as LedgerRole, h as LedgerSource, i as PactKind, j as ProviderVerificationRunEntry, k as isInteractionLedgerEntry, l as isProviderVerificationRun } from './types-BHGiwqcp.cjs';
|
|
6
|
+
export { tagPactInteraction } from './tag.cjs';
|
|
7
|
+
export { PactLedgerProcessorOptions, PactLedgerSpanProcessor, ReadableSpanLike, SpanProcessorLike, createPactLedgerProcessor } from './processor.cjs';
|
|
8
|
+
export { AuditOptions, computeAuditMatrix, keyOf, runAudit, runAuditSync } from './audit.cjs';
|
|
9
|
+
export { BrokerConfig, ConsumerProviderPair, brokerConfigFromEnv, fetchBrokerVerifications, parseBrokerVerificationResult } from './broker.cjs';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Minimal structural type for `MessageConsumerPact`. We don't declare
|
|
13
|
+
* `config` here because pact-js marks it `private` — listing it on a
|
|
14
|
+
* public structural type would prevent users passing the real class.
|
|
15
|
+
* Inside the wrapper we read `(pact as MessageConsumerPactWithConfig).config`
|
|
16
|
+
* at runtime, with `opts.consumer` / `opts.provider` as override fallbacks.
|
|
17
|
+
*/
|
|
18
|
+
interface MessageConsumerPactLike {
|
|
19
|
+
verify: (handler: (message: ReifiedMessage) => Promise<unknown>) => Promise<unknown>;
|
|
20
|
+
/**
|
|
21
|
+
* Optional fluent metadata appender. Pact-JS's `MessageConsumerPact`
|
|
22
|
+
* provides this; we use it (when present) to write `interactionId`
|
|
23
|
+
* into the pact file's `messages[].metadata` block so the audit can
|
|
24
|
+
* key on the same id from both sides.
|
|
25
|
+
*
|
|
26
|
+
* The value type is `string` because that is the only thing autotel-pact
|
|
27
|
+
* passes. A narrower-than-pact-js type keeps real `MessageConsumerPact`
|
|
28
|
+
* assignable here by parameter contravariance.
|
|
29
|
+
*/
|
|
30
|
+
withMetadata?: (metadata: Record<string, string>) => MessageConsumerPactLike;
|
|
31
|
+
}
|
|
32
|
+
interface ReifiedMessage {
|
|
33
|
+
contents: unknown;
|
|
34
|
+
description?: string;
|
|
35
|
+
metadata?: Record<string, unknown>;
|
|
36
|
+
providerStates?: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
40
|
+
type PactMessageHandler<R = unknown> = (message: ReifiedMessage) => R | Promise<R>;
|
|
41
|
+
interface WithPactInteractionOptions extends LedgerOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Path (relative to cwd) of the pact file this interaction belongs to.
|
|
44
|
+
* Stamped on the span as `pact.contract.file` and surfaced in the audit.
|
|
45
|
+
*/
|
|
46
|
+
contractFile?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Override the span name. Defaults to `pact.interaction`.
|
|
49
|
+
*/
|
|
50
|
+
spanName?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Consumer name. Only needed if the supplied pact instance doesn't expose
|
|
53
|
+
* `.config.consumer` (e.g. a custom pact-like wrapper).
|
|
54
|
+
*/
|
|
55
|
+
consumer?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Provider name. Same caveat as `consumer`.
|
|
58
|
+
*/
|
|
59
|
+
provider?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Stable identity for this interaction. Recommended whenever you might
|
|
62
|
+
* rename the human-readable `expectsToReceive` description in the future —
|
|
63
|
+
* the audit matches on `interactionId` first, so renames don't break
|
|
64
|
+
* continuity. Conventional form: `domain.event.vN` (e.g. `order.created.v1`).
|
|
65
|
+
*/
|
|
66
|
+
interactionId?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Wrap a Pact-Message `verify()` call so that:
|
|
70
|
+
* 1. An autotel span opens around the verification.
|
|
71
|
+
* 2. Span attributes capture consumer / provider / interaction / states.
|
|
72
|
+
* 3. A ledger entry records that this interaction was actually exercised.
|
|
73
|
+
*
|
|
74
|
+
* The handler arg to `verify()` is wrapped so we can read the reified
|
|
75
|
+
* message (the only place description + states are exposed by Pact-JS).
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* const pact = new MessageConsumerPact({ consumer, provider, dir });
|
|
80
|
+
* pact.given('an order exists').expectsToReceive('OrderCreated').withContent({...});
|
|
81
|
+
*
|
|
82
|
+
* await withPactInteraction(pact, (msg) => orderHandler(msg.contents));
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
declare function withPactInteraction<R>(pact: MessageConsumerPactLike, handler: PactMessageHandler<R>, opts?: WithPactInteractionOptions): Promise<R>;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Minimal structural type for a PactV3 / PactV4 HTTP pact instance — we
|
|
89
|
+
* only call `addInteraction` and `executeTest`. The `opts` property is
|
|
90
|
+
* private in Pact-JS but readable at runtime, exactly like the message
|
|
91
|
+
* variant's `config`.
|
|
92
|
+
*/
|
|
93
|
+
interface HttpPactLike {
|
|
94
|
+
addInteraction: (interaction: HttpInteraction) => unknown;
|
|
95
|
+
executeTest: <T>(testFn: (mockServer: HttpMockServer) => Promise<T>) => Promise<T | undefined>;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Structural shape of a single HTTP interaction as passed to
|
|
99
|
+
* `PactV3.addInteraction`. We only read the description and states
|
|
100
|
+
* directly; the rest is forwarded to Pact untouched.
|
|
101
|
+
*/
|
|
102
|
+
interface HttpInteraction {
|
|
103
|
+
uponReceiving: string;
|
|
104
|
+
states?: Array<{
|
|
105
|
+
description: string;
|
|
106
|
+
parameters?: unknown;
|
|
107
|
+
}>;
|
|
108
|
+
withRequest?: unknown;
|
|
109
|
+
willRespondWith?: unknown;
|
|
110
|
+
[key: string]: unknown;
|
|
111
|
+
}
|
|
112
|
+
/** Subset of Pact's `V3MockServer` the test function typically uses. */
|
|
113
|
+
interface HttpMockServer {
|
|
114
|
+
url: string;
|
|
115
|
+
port: number;
|
|
116
|
+
[key: string]: unknown;
|
|
117
|
+
}
|
|
118
|
+
type HttpPactTestFn<T> = (mockServer: HttpMockServer) => Promise<T>;
|
|
119
|
+
interface WithHttpPactInteractionOptions extends LedgerOptions {
|
|
120
|
+
contractFile?: string;
|
|
121
|
+
spanName?: string;
|
|
122
|
+
consumer?: string;
|
|
123
|
+
provider?: string;
|
|
124
|
+
/** See {@link WithPactInteractionOptions.interactionId}. */
|
|
125
|
+
interactionId?: string;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Wrap a Pact-JS HTTP test (PactV3 / PactV4) so that:
|
|
129
|
+
* 1. The interaction is added to the pact via `addInteraction`.
|
|
130
|
+
* 2. An autotel span opens around the test body, with `pact.*` attributes.
|
|
131
|
+
* 3. A ledger entry records that this interaction was exercised.
|
|
132
|
+
*
|
|
133
|
+
* Mirrors `withPactInteraction` (the message variant) so the DX is the
|
|
134
|
+
* same regardless of contract kind.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```ts
|
|
138
|
+
* const provider = new PactV3({ consumer: 'Web', provider: 'Catalog', dir: './pacts' });
|
|
139
|
+
*
|
|
140
|
+
* it('gets all products', async () => {
|
|
141
|
+
* await withHttpPactInteraction(
|
|
142
|
+
* provider,
|
|
143
|
+
* {
|
|
144
|
+
* states: [{ description: 'products exist' }],
|
|
145
|
+
* uponReceiving: 'get all products',
|
|
146
|
+
* withRequest: { method: 'GET', path: '/products' },
|
|
147
|
+
* willRespondWith: { status: 200, body: [...] },
|
|
148
|
+
* },
|
|
149
|
+
* async (mockServer) => {
|
|
150
|
+
* const api = new API(mockServer.url);
|
|
151
|
+
* expect(await api.getAllProducts()).toEqual([...]);
|
|
152
|
+
* },
|
|
153
|
+
* );
|
|
154
|
+
* });
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
declare function withHttpPactInteraction<T>(pact: HttpPactLike, interaction: HttpInteraction, testFn: HttpPactTestFn<T>, opts?: WithHttpPactInteractionOptions): Promise<T | undefined>;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Attribute keys for Pact interactions. Centralised so the namespace is
|
|
161
|
+
* a single source of truth and is forward-compatible with eventual OTel
|
|
162
|
+
* semantic conventions.
|
|
163
|
+
*/
|
|
164
|
+
declare const PACT_ATTRS: {
|
|
165
|
+
readonly CONSUMER: "pact.consumer";
|
|
166
|
+
readonly PROVIDER: "pact.provider";
|
|
167
|
+
readonly KIND: "pact.kind";
|
|
168
|
+
readonly INTERACTION_DESCRIPTION: "pact.interaction.description";
|
|
169
|
+
readonly INTERACTION_ID: "pact.interaction.id";
|
|
170
|
+
readonly INTERACTION_STATES: "pact.interaction.states";
|
|
171
|
+
readonly CONTRACT_FILE: "pact.contract.file";
|
|
172
|
+
readonly OUTCOME: "pact.outcome";
|
|
173
|
+
};
|
|
174
|
+
type PactAttributeKey = (typeof PACT_ATTRS)[keyof typeof PACT_ATTRS];
|
|
175
|
+
/**
|
|
176
|
+
* Build the set of attributes to stamp on a span when an interaction is
|
|
177
|
+
* about to be exercised. `outcome` is added later by the wrapper.
|
|
178
|
+
*/
|
|
179
|
+
declare function buildPactAttributes(meta: PactInteractionMeta, opts?: {
|
|
180
|
+
contractFile?: string;
|
|
181
|
+
}): Record<string, string | string[]>;
|
|
182
|
+
/**
|
|
183
|
+
* Helper that returns just the outcome attribute — stamped after the
|
|
184
|
+
* handler resolves or rejects.
|
|
185
|
+
*/
|
|
186
|
+
declare function outcomeAttribute(outcome: PactOutcome): Record<string, string>;
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Walk a directory and return absolute paths of all *.json pact files.
|
|
190
|
+
*/
|
|
191
|
+
declare function listPactFiles(dir: string): string[];
|
|
192
|
+
/**
|
|
193
|
+
* Extract interaction tuples declared in a pact file.
|
|
194
|
+
*/
|
|
195
|
+
declare function interactionsFromPactFile(pact: PactFile): PactInteractionKey[];
|
|
196
|
+
declare function parsePactFile(filePath: string): PactFile | null;
|
|
197
|
+
|
|
198
|
+
declare const BROKER_GRANULARITY_WARNING = "Broker verification proves the latest pact between a consumer and provider was verified. It does not prove each interaction was individually observed by autotel-pact.";
|
|
199
|
+
|
|
200
|
+
export { BROKER_GRANULARITY_WARNING, type HttpInteraction, type HttpMockServer, type HttpPactLike, type HttpPactTestFn, LedgerOptions, type MessageConsumerPactLike, PACT_ATTRS, type PactAttributeKey, PactFile, PactInteractionKey, PactInteractionMeta, type PactMessageHandler, PactOutcome, type ReifiedMessage, type WithHttpPactInteractionOptions, type WithPactInteractionOptions, buildPactAttributes, interactionsFromPactFile, listPactFiles, outcomeAttribute, parsePactFile, withHttpPactInteraction, withPactInteraction };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { L as LedgerOptions } from './ledger-BuBmfWNc.js';
|
|
2
|
+
export { a as appendLedgerEntry, b as appendLedgerEntryAsync, c as appendProviderVerificationFailure, f as flushLedgerWrites, l as ledgerPath, r as readLedger } from './ledger-BuBmfWNc.js';
|
|
3
|
+
export { VerifierConstructor, VerifierLike, VerifierOptionsLike, WithProviderVerificationOptions, withProviderVerification } from './provider.js';
|
|
4
|
+
import { P as PactInteractionMeta, a as PactOutcome, b as PactFile, c as PactInteractionKey } from './types-BHGiwqcp.js';
|
|
5
|
+
export { A as AUDIT_MATRIX_SPEC, d as AuditMatrix, e as AuditRow, B as BrokerVerification, I as InteractionLedgerEntry, L as LEDGER_ENTRY_SPEC, f as LedgerRecord, g as LedgerRole, h as LedgerSource, i as PactKind, j as ProviderVerificationRunEntry, k as isInteractionLedgerEntry, l as isProviderVerificationRun } from './types-BHGiwqcp.js';
|
|
6
|
+
export { tagPactInteraction } from './tag.js';
|
|
7
|
+
export { PactLedgerProcessorOptions, PactLedgerSpanProcessor, ReadableSpanLike, SpanProcessorLike, createPactLedgerProcessor } from './processor.js';
|
|
8
|
+
export { AuditOptions, computeAuditMatrix, keyOf, runAudit, runAuditSync } from './audit.js';
|
|
9
|
+
export { BrokerConfig, ConsumerProviderPair, brokerConfigFromEnv, fetchBrokerVerifications, parseBrokerVerificationResult } from './broker.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Minimal structural type for `MessageConsumerPact`. We don't declare
|
|
13
|
+
* `config` here because pact-js marks it `private` — listing it on a
|
|
14
|
+
* public structural type would prevent users passing the real class.
|
|
15
|
+
* Inside the wrapper we read `(pact as MessageConsumerPactWithConfig).config`
|
|
16
|
+
* at runtime, with `opts.consumer` / `opts.provider` as override fallbacks.
|
|
17
|
+
*/
|
|
18
|
+
interface MessageConsumerPactLike {
|
|
19
|
+
verify: (handler: (message: ReifiedMessage) => Promise<unknown>) => Promise<unknown>;
|
|
20
|
+
/**
|
|
21
|
+
* Optional fluent metadata appender. Pact-JS's `MessageConsumerPact`
|
|
22
|
+
* provides this; we use it (when present) to write `interactionId`
|
|
23
|
+
* into the pact file's `messages[].metadata` block so the audit can
|
|
24
|
+
* key on the same id from both sides.
|
|
25
|
+
*
|
|
26
|
+
* The value type is `string` because that is the only thing autotel-pact
|
|
27
|
+
* passes. A narrower-than-pact-js type keeps real `MessageConsumerPact`
|
|
28
|
+
* assignable here by parameter contravariance.
|
|
29
|
+
*/
|
|
30
|
+
withMetadata?: (metadata: Record<string, string>) => MessageConsumerPactLike;
|
|
31
|
+
}
|
|
32
|
+
interface ReifiedMessage {
|
|
33
|
+
contents: unknown;
|
|
34
|
+
description?: string;
|
|
35
|
+
metadata?: Record<string, unknown>;
|
|
36
|
+
providerStates?: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
40
|
+
type PactMessageHandler<R = unknown> = (message: ReifiedMessage) => R | Promise<R>;
|
|
41
|
+
interface WithPactInteractionOptions extends LedgerOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Path (relative to cwd) of the pact file this interaction belongs to.
|
|
44
|
+
* Stamped on the span as `pact.contract.file` and surfaced in the audit.
|
|
45
|
+
*/
|
|
46
|
+
contractFile?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Override the span name. Defaults to `pact.interaction`.
|
|
49
|
+
*/
|
|
50
|
+
spanName?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Consumer name. Only needed if the supplied pact instance doesn't expose
|
|
53
|
+
* `.config.consumer` (e.g. a custom pact-like wrapper).
|
|
54
|
+
*/
|
|
55
|
+
consumer?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Provider name. Same caveat as `consumer`.
|
|
58
|
+
*/
|
|
59
|
+
provider?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Stable identity for this interaction. Recommended whenever you might
|
|
62
|
+
* rename the human-readable `expectsToReceive` description in the future —
|
|
63
|
+
* the audit matches on `interactionId` first, so renames don't break
|
|
64
|
+
* continuity. Conventional form: `domain.event.vN` (e.g. `order.created.v1`).
|
|
65
|
+
*/
|
|
66
|
+
interactionId?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Wrap a Pact-Message `verify()` call so that:
|
|
70
|
+
* 1. An autotel span opens around the verification.
|
|
71
|
+
* 2. Span attributes capture consumer / provider / interaction / states.
|
|
72
|
+
* 3. A ledger entry records that this interaction was actually exercised.
|
|
73
|
+
*
|
|
74
|
+
* The handler arg to `verify()` is wrapped so we can read the reified
|
|
75
|
+
* message (the only place description + states are exposed by Pact-JS).
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* const pact = new MessageConsumerPact({ consumer, provider, dir });
|
|
80
|
+
* pact.given('an order exists').expectsToReceive('OrderCreated').withContent({...});
|
|
81
|
+
*
|
|
82
|
+
* await withPactInteraction(pact, (msg) => orderHandler(msg.contents));
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
declare function withPactInteraction<R>(pact: MessageConsumerPactLike, handler: PactMessageHandler<R>, opts?: WithPactInteractionOptions): Promise<R>;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Minimal structural type for a PactV3 / PactV4 HTTP pact instance — we
|
|
89
|
+
* only call `addInteraction` and `executeTest`. The `opts` property is
|
|
90
|
+
* private in Pact-JS but readable at runtime, exactly like the message
|
|
91
|
+
* variant's `config`.
|
|
92
|
+
*/
|
|
93
|
+
interface HttpPactLike {
|
|
94
|
+
addInteraction: (interaction: HttpInteraction) => unknown;
|
|
95
|
+
executeTest: <T>(testFn: (mockServer: HttpMockServer) => Promise<T>) => Promise<T | undefined>;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Structural shape of a single HTTP interaction as passed to
|
|
99
|
+
* `PactV3.addInteraction`. We only read the description and states
|
|
100
|
+
* directly; the rest is forwarded to Pact untouched.
|
|
101
|
+
*/
|
|
102
|
+
interface HttpInteraction {
|
|
103
|
+
uponReceiving: string;
|
|
104
|
+
states?: Array<{
|
|
105
|
+
description: string;
|
|
106
|
+
parameters?: unknown;
|
|
107
|
+
}>;
|
|
108
|
+
withRequest?: unknown;
|
|
109
|
+
willRespondWith?: unknown;
|
|
110
|
+
[key: string]: unknown;
|
|
111
|
+
}
|
|
112
|
+
/** Subset of Pact's `V3MockServer` the test function typically uses. */
|
|
113
|
+
interface HttpMockServer {
|
|
114
|
+
url: string;
|
|
115
|
+
port: number;
|
|
116
|
+
[key: string]: unknown;
|
|
117
|
+
}
|
|
118
|
+
type HttpPactTestFn<T> = (mockServer: HttpMockServer) => Promise<T>;
|
|
119
|
+
interface WithHttpPactInteractionOptions extends LedgerOptions {
|
|
120
|
+
contractFile?: string;
|
|
121
|
+
spanName?: string;
|
|
122
|
+
consumer?: string;
|
|
123
|
+
provider?: string;
|
|
124
|
+
/** See {@link WithPactInteractionOptions.interactionId}. */
|
|
125
|
+
interactionId?: string;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Wrap a Pact-JS HTTP test (PactV3 / PactV4) so that:
|
|
129
|
+
* 1. The interaction is added to the pact via `addInteraction`.
|
|
130
|
+
* 2. An autotel span opens around the test body, with `pact.*` attributes.
|
|
131
|
+
* 3. A ledger entry records that this interaction was exercised.
|
|
132
|
+
*
|
|
133
|
+
* Mirrors `withPactInteraction` (the message variant) so the DX is the
|
|
134
|
+
* same regardless of contract kind.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```ts
|
|
138
|
+
* const provider = new PactV3({ consumer: 'Web', provider: 'Catalog', dir: './pacts' });
|
|
139
|
+
*
|
|
140
|
+
* it('gets all products', async () => {
|
|
141
|
+
* await withHttpPactInteraction(
|
|
142
|
+
* provider,
|
|
143
|
+
* {
|
|
144
|
+
* states: [{ description: 'products exist' }],
|
|
145
|
+
* uponReceiving: 'get all products',
|
|
146
|
+
* withRequest: { method: 'GET', path: '/products' },
|
|
147
|
+
* willRespondWith: { status: 200, body: [...] },
|
|
148
|
+
* },
|
|
149
|
+
* async (mockServer) => {
|
|
150
|
+
* const api = new API(mockServer.url);
|
|
151
|
+
* expect(await api.getAllProducts()).toEqual([...]);
|
|
152
|
+
* },
|
|
153
|
+
* );
|
|
154
|
+
* });
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
declare function withHttpPactInteraction<T>(pact: HttpPactLike, interaction: HttpInteraction, testFn: HttpPactTestFn<T>, opts?: WithHttpPactInteractionOptions): Promise<T | undefined>;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Attribute keys for Pact interactions. Centralised so the namespace is
|
|
161
|
+
* a single source of truth and is forward-compatible with eventual OTel
|
|
162
|
+
* semantic conventions.
|
|
163
|
+
*/
|
|
164
|
+
declare const PACT_ATTRS: {
|
|
165
|
+
readonly CONSUMER: "pact.consumer";
|
|
166
|
+
readonly PROVIDER: "pact.provider";
|
|
167
|
+
readonly KIND: "pact.kind";
|
|
168
|
+
readonly INTERACTION_DESCRIPTION: "pact.interaction.description";
|
|
169
|
+
readonly INTERACTION_ID: "pact.interaction.id";
|
|
170
|
+
readonly INTERACTION_STATES: "pact.interaction.states";
|
|
171
|
+
readonly CONTRACT_FILE: "pact.contract.file";
|
|
172
|
+
readonly OUTCOME: "pact.outcome";
|
|
173
|
+
};
|
|
174
|
+
type PactAttributeKey = (typeof PACT_ATTRS)[keyof typeof PACT_ATTRS];
|
|
175
|
+
/**
|
|
176
|
+
* Build the set of attributes to stamp on a span when an interaction is
|
|
177
|
+
* about to be exercised. `outcome` is added later by the wrapper.
|
|
178
|
+
*/
|
|
179
|
+
declare function buildPactAttributes(meta: PactInteractionMeta, opts?: {
|
|
180
|
+
contractFile?: string;
|
|
181
|
+
}): Record<string, string | string[]>;
|
|
182
|
+
/**
|
|
183
|
+
* Helper that returns just the outcome attribute — stamped after the
|
|
184
|
+
* handler resolves or rejects.
|
|
185
|
+
*/
|
|
186
|
+
declare function outcomeAttribute(outcome: PactOutcome): Record<string, string>;
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Walk a directory and return absolute paths of all *.json pact files.
|
|
190
|
+
*/
|
|
191
|
+
declare function listPactFiles(dir: string): string[];
|
|
192
|
+
/**
|
|
193
|
+
* Extract interaction tuples declared in a pact file.
|
|
194
|
+
*/
|
|
195
|
+
declare function interactionsFromPactFile(pact: PactFile): PactInteractionKey[];
|
|
196
|
+
declare function parsePactFile(filePath: string): PactFile | null;
|
|
197
|
+
|
|
198
|
+
declare const BROKER_GRANULARITY_WARNING = "Broker verification proves the latest pact between a consumer and provider was verified. It does not prove each interaction was individually observed by autotel-pact.";
|
|
199
|
+
|
|
200
|
+
export { BROKER_GRANULARITY_WARNING, type HttpInteraction, type HttpMockServer, type HttpPactLike, type HttpPactTestFn, LedgerOptions, type MessageConsumerPactLike, PACT_ATTRS, type PactAttributeKey, PactFile, PactInteractionKey, PactInteractionMeta, type PactMessageHandler, PactOutcome, type ReifiedMessage, type WithHttpPactInteractionOptions, type WithPactInteractionOptions, buildPactAttributes, interactionsFromPactFile, listPactFiles, outcomeAttribute, parsePactFile, withHttpPactInteraction, withPactInteraction };
|