@adcp/sdk 14.0.0-beta.11 → 14.0.0-beta.12
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/bin/adcp-storyboard-sandbox.js +16 -0
- package/bin/adcp.js +28 -30
- package/dist/lib/schemas/index.d.mts +385 -1
- package/dist/lib/schemas/index.d.ts +385 -1
- package/dist/lib/schemas/index.d.ts.map +1 -1
- package/dist/lib/schemas/index.js +13 -0
- package/dist/lib/schemas/index.js.map +1 -1
- package/dist/lib/schemas/index.mjs +11 -0
- package/dist/lib/schemas/index.mjs.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/signing/agent-context.d.mts +1 -0
- package/dist/lib/signing/agent-context.d.ts +1 -0
- package/dist/lib/signing/agent-context.d.ts.map +1 -1
- package/dist/lib/signing/agent-context.js +37 -2
- package/dist/lib/signing/agent-context.js.map +1 -1
- package/dist/lib/signing/agent-context.mjs +38 -3
- package/dist/lib/signing/agent-context.mjs.map +1 -1
- package/dist/lib/signing/agent-fetch.d.mts +1 -2
- package/dist/lib/signing/agent-fetch.d.ts +1 -2
- package/dist/lib/signing/agent-fetch.d.ts.map +1 -1
- package/dist/lib/signing/agent-fetch.js +2 -0
- package/dist/lib/signing/agent-fetch.js.map +1 -1
- package/dist/lib/signing/agent-fetch.mjs +2 -0
- package/dist/lib/signing/agent-fetch.mjs.map +1 -1
- package/dist/lib/signing/agent-resolver/etld.js.map +1 -1
- package/dist/lib/signing/agent-resolver/etld.mjs.map +1 -1
- package/dist/lib/testing/client.d.mts +6 -0
- package/dist/lib/testing/client.d.ts +6 -0
- package/dist/lib/testing/client.d.ts.map +1 -1
- package/dist/lib/testing/client.js +76 -4
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/client.mjs +75 -4
- package/dist/lib/testing/client.mjs.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +6 -0
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/comply.mjs +7 -1
- package/dist/lib/testing/compliance/comply.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/functional-dispatch.d.mts +15 -0
- package/dist/lib/testing/storyboard/request-signing/functional-dispatch.d.ts +16 -0
- package/dist/lib/testing/storyboard/request-signing/functional-dispatch.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/functional-dispatch.js +106 -0
- package/dist/lib/testing/storyboard/request-signing/functional-dispatch.js.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/functional-dispatch.mjs +82 -0
- package/dist/lib/testing/storyboard/request-signing/functional-dispatch.mjs.map +1 -0
- package/dist/lib/testing/storyboard/request-signing/test-kit.d.mts +15 -0
- package/dist/lib/testing/storyboard/request-signing/test-kit.d.ts +15 -0
- package/dist/lib/testing/storyboard/request-signing/test-kit.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/test-kit.js +58 -0
- package/dist/lib/testing/storyboard/request-signing/test-kit.js.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs +58 -0
- package/dist/lib/testing/storyboard/request-signing/test-kit.mjs.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.mts +2 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +2 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.js +7 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.js.map +1 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +6 -1
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +10 -1
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +10 -1
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/testing/types.d.mts +10 -0
- package/dist/lib/testing/types.d.ts +10 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/testing/types.js.map +1 -1
- package/dist/lib/types/comply-test-controller.d.ts +1 -14
- package/dist/lib/types/core.generated.d.mts +1 -1
- package/dist/lib/types/core.generated.d.ts +1 -1
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js.map +1 -1
- package/dist/lib/types/get-products.d.ts +1 -14
- package/dist/lib/types/schemas.generated.d.ts +4 -56
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +2 -2
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/schemas.generated.mjs +2 -2
- package/dist/lib/types/schemas.generated.mjs.map +1 -1
- package/dist/lib/types/tools.generated.d.mts +1 -1
- package/dist/lib/types/tools.generated.d.ts +1 -1
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/types/tools.generated.js.map +1 -1
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/version.mjs +3 -3
- package/dist/lib/version.mjs.map +1 -1
- package/docs/llms.txt +1 -1
- package/package.json +2 -2
|
@@ -20,6 +20,7 @@ var vector_loader_exports = {};
|
|
|
20
20
|
__export(vector_loader_exports, {
|
|
21
21
|
__resetVectorCache: () => __resetVectorCache,
|
|
22
22
|
findKey: () => findKey,
|
|
23
|
+
loadRequestSigningKeys: () => loadRequestSigningKeys,
|
|
23
24
|
loadRequestSigningVectors: () => loadRequestSigningVectors
|
|
24
25
|
});
|
|
25
26
|
module.exports = __toCommonJS(vector_loader_exports);
|
|
@@ -67,12 +68,16 @@ function loadRequestSigningVectors(options = {}) {
|
|
|
67
68
|
negative: loadDir((0, import_path.join)(profile32Dir, "negative"), parseNegative, "profile-3.2/negative/")
|
|
68
69
|
}
|
|
69
70
|
} : {},
|
|
70
|
-
keys:
|
|
71
|
+
keys: loadRequestSigningKeys(options),
|
|
71
72
|
sourceDir
|
|
72
73
|
};
|
|
73
74
|
VECTOR_CACHE.set(sourceDir, loaded);
|
|
74
75
|
return loaded;
|
|
75
76
|
}
|
|
77
|
+
function loadRequestSigningKeys(options = {}) {
|
|
78
|
+
const cacheDir = (0, import_compliance.getComplianceCacheDir)(options);
|
|
79
|
+
return loadKeys((0, import_path.join)(cacheDir, "test-vectors", "request-signing", "keys.json"));
|
|
80
|
+
}
|
|
76
81
|
function __resetVectorCache() {
|
|
77
82
|
VECTOR_CACHE.clear();
|
|
78
83
|
}
|
|
@@ -268,6 +273,7 @@ function strArray(v, where) {
|
|
|
268
273
|
0 && (module.exports = {
|
|
269
274
|
__resetVectorCache,
|
|
270
275
|
findKey,
|
|
276
|
+
loadRequestSigningKeys,
|
|
271
277
|
loadRequestSigningVectors
|
|
272
278
|
});
|
|
273
279
|
//# sourceMappingURL=vector-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join } from 'path';\nimport { getComplianceCacheDir } from '../compliance';\nimport type { RequestSignatureErrorCode } from '../../../signing';\nimport { CONTRACT_IDS } from './types';\nimport type { ContractId, NegativeVector, PositiveVector, TestKeypair, TestKeyset, Vector } from './types';\n\nexport interface LoadVectorsOptions {\n complianceDir?: string;\n version?: string;\n}\n\nexport interface LoadedVectors {\n positive: PositiveVector[];\n negative: NegativeVector[];\n profiles: Record<string, { positive: PositiveVector[]; negative: NegativeVector[] }>;\n keys: TestKeyset;\n sourceDir: string;\n}\n\nconst ERROR_CODES: ReadonlySet<string> = new Set([\n 'request_signature_required',\n 'request_signature_header_malformed',\n 'request_signature_params_incomplete',\n 'request_signature_tag_invalid',\n 'request_signature_alg_not_allowed',\n 'request_signature_window_invalid',\n 'request_signature_components_incomplete',\n 'request_signature_components_unexpected',\n 'request_target_uri_malformed',\n 'request_signature_key_unknown',\n 'request_signature_key_purpose_invalid',\n 'request_signature_key_revoked',\n 'request_signature_invalid',\n 'request_signature_digest_mismatch',\n 'request_signature_replayed',\n 'request_signature_rate_abuse',\n]);\n\nconst CONTRACT_ID_SET: ReadonlySet<string> = new Set(CONTRACT_IDS);\n\n// Memoized per sourceDir — loading 28 JSON fixtures + keys.json on every\n// per-vector call in the runner path added up (~28 disk reads × 2-3 storyboard\n// resolve calls per CLI run). Invariant: the compliance cache is immutable\n// during a process lifetime — `npm run sync-schemas` runs before the process,\n// never concurrently. Cache key is the absolute cacheDir so env-var overrides\n// don't poison the entry.\nconst VECTOR_CACHE = new Map<string, LoadedVectors>();\n\nexport function loadRequestSigningVectors(options: LoadVectorsOptions = {}): LoadedVectors {\n const cacheDir = getComplianceCacheDir(options);\n const sourceDir = join(cacheDir, 'test-vectors', 'request-signing');\n const cached = VECTOR_CACHE.get(sourceDir);\n if (cached) return cached;\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Request-signing vectors not found at ${sourceDir}. Run \\`npm run sync-schemas\\` or check your ADCP_COMPLIANCE_DIR.`\n );\n }\n\n const profile32Dir = join(sourceDir, 'profile-3.2');\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n profiles: existsSync(profile32Dir)\n ? {\n '3.2': {\n positive: loadDir(join(profile32Dir, 'positive'), parsePositive, 'profile-3.2/positive/'),\n negative: loadDir(join(profile32Dir, 'negative'), parseNegative, 'profile-3.2/negative/'),\n },\n }\n : {},\n keys: loadKeys(join(sourceDir, 'keys.json')),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Test-only: clear the memoization cache so a fresh cache path is reread. */\nexport function __resetVectorCache(): void {\n VECTOR_CACHE.clear();\n}\n\nfunction loadDir<T extends Vector>(dir: string, parse: (id: string, raw: unknown) => T, idPrefix = ''): T[] {\n if (!existsSync(dir)) {\n throw new Error(`Vector directory missing: ${dir}`);\n }\n const files = readdirSync(dir)\n .filter(f => f.endsWith('.json'))\n .sort();\n return files.map(f => {\n const raw = JSON.parse(readFileSync(join(dir, f), 'utf-8'));\n return parse(`${idPrefix}${vectorIdFromFilename(f)}`, raw);\n });\n}\n\nfunction vectorIdFromFilename(file: string): string {\n return basename(file, '.json');\n}\n\nfunction parsePositive(id: string, raw: unknown): PositiveVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, true);\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'positive',\n id,\n name: str(r.name, `${id}.name`),\n signing_profile_version: optionalSigningProfileVersion(r),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_signature_base: typeof r.expected_signature_base === 'string' ? r.expected_signature_base : undefined,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseNegative(id: string, raw: unknown): NegativeVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, false);\n const outcome = r.expected_outcome as Record<string, unknown>;\n const errorCode = str(outcome.error_code, `${id}.expected_outcome.error_code`);\n if (!ERROR_CODES.has(errorCode)) {\n throw new Error(`${id}: unknown expected_outcome.error_code \"${errorCode}\" (spec drift?)`);\n }\n const failedStep = outcome.failed_step;\n if (typeof failedStep !== 'number' && typeof failedStep !== 'string') {\n throw new Error(`${id}: expected_outcome.failed_step must be number or string`);\n }\n let contract: ContractId | undefined;\n if (r.requires_contract !== undefined) {\n const c = str(r.requires_contract, `${id}.requires_contract`);\n if (!CONTRACT_ID_SET.has(c)) {\n throw new Error(`${id}: unknown requires_contract \"${c}\" (spec drift?)`);\n }\n contract = c as ContractId;\n }\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'negative',\n id,\n name: str(r.name, `${id}.name`),\n signing_profile_version: optionalSigningProfileVersion(r),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_error_code: errorCode as RequestSignatureErrorCode,\n expected_failed_step: failedStep,\n requires_contract: contract,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction optionalSigningProfileVersion(vector: Record<string, unknown>): string {\n // Older cached bundles predate the explicit marker; every root vector in\n // those bundles exercises the legacy 3.1 binary profile.\n return typeof vector.signing_profile_version === 'string' ? vector.signing_profile_version : '3.1';\n}\n\nfunction parseJwksSelector(\n id: string,\n r: Record<string, unknown>\n): { jwks_ref?: string[]; jwks_override?: { keys: Array<Record<string, unknown>> } } {\n const hasRef = r.jwks_ref !== undefined;\n const hasOverride = r.jwks_override !== undefined;\n if (hasRef && hasOverride) {\n throw new Error(`${id}: jwks_ref and jwks_override are mutually exclusive`);\n }\n if (!hasRef && !hasOverride) {\n throw new Error(`${id}: must declare either jwks_ref or jwks_override`);\n }\n if (hasOverride) {\n const override = r.jwks_override as Record<string, unknown>;\n const keys = override.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new Error(`${id}.jwks_override.keys must be a non-empty array`);\n }\n for (const k of keys) {\n if (!k || typeof k !== 'object') {\n throw new Error(`${id}.jwks_override.keys[] entries must be objects`);\n }\n }\n return { jwks_override: { keys: keys as Array<Record<string, unknown>> } };\n }\n return { jwks_ref: strArray(r.jwks_ref, `${id}.jwks_ref`) };\n}\n\nfunction assertSuccess(id: string, vector: Record<string, unknown>, expected: boolean): void {\n const outcome = vector.expected_outcome as Record<string, unknown> | undefined;\n if (!outcome || outcome.success !== expected) {\n throw new Error(\n `${id}: expected_outcome.success must be ${expected} for ${expected ? 'positive' : 'negative'} vector`\n );\n }\n}\n\nfunction parseRequest(id: string, raw: unknown): PositiveVector['request'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.request missing`);\n const headers = r.headers as Record<string, string> | undefined;\n if (!headers) throw new Error(`${id}.request.headers missing`);\n return {\n method: str(r.method, `${id}.request.method`),\n url: str(r.url, `${id}.request.url`),\n headers: { ...headers },\n body: typeof r.body === 'string' ? r.body : undefined,\n };\n}\n\nfunction parseCapability(id: string, raw: unknown): PositiveVector['verifier_capability'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.verifier_capability missing`);\n const digest = str(r.covers_content_digest, `${id}.verifier_capability.covers_content_digest`);\n if (digest !== 'required' && digest !== 'forbidden' && digest !== 'either') {\n throw new Error(`${id}: invalid covers_content_digest \"${digest}\"`);\n }\n return {\n supported: bool(r.supported, `${id}.verifier_capability.supported`),\n covers_content_digest: digest,\n required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),\n supported_for: Array.isArray(r.supported_for) ? (r.supported_for as string[]) : undefined,\n protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for)\n ? (r.protocol_methods_supported_for as string[])\n : undefined,\n protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for)\n ? (r.protocol_methods_required_for as string[])\n : undefined,\n };\n}\n\nfunction loadKeys(keysPath: string): TestKeyset {\n if (!existsSync(keysPath)) {\n throw new Error(`keys.json missing at ${keysPath}`);\n }\n const raw = JSON.parse(readFileSync(keysPath, 'utf-8')) as { keys?: unknown };\n if (!Array.isArray(raw.keys)) {\n throw new Error(`keys.json must contain a \"keys\" array`);\n }\n return { keys: raw.keys.map((k, i) => parseKey(i, k)) };\n}\n\nfunction parseKey(index: number, raw: unknown): TestKeypair {\n const r = raw as Record<string, unknown>;\n const where = `keys.json[${index}]`;\n const privateD = r._private_d_for_test_only;\n if (typeof privateD !== 'string' || privateD.length === 0) {\n throw new Error(`${where}._private_d_for_test_only missing (required for dynamic signing)`);\n }\n return {\n kid: str(r.kid, `${where}.kid`),\n kty: str(r.kty, `${where}.kty`),\n crv: typeof r.crv === 'string' ? r.crv : undefined,\n alg: typeof r.alg === 'string' ? r.alg : undefined,\n use: typeof r.use === 'string' ? r.use : undefined,\n key_ops: Array.isArray(r.key_ops) ? (r.key_ops as string[]) : undefined,\n adcp_use: typeof r.adcp_use === 'string' ? r.adcp_use : undefined,\n x: typeof r.x === 'string' ? r.x : undefined,\n y: typeof r.y === 'string' ? r.y : undefined,\n private_d: privateD,\n };\n}\n\nexport function findKey(keyset: TestKeyset, kid: string): TestKeypair {\n const match = keyset.keys.find(k => k.kid === kid);\n if (!match) {\n throw new Error(\n `No test keypair with kid=\"${kid}\" in keys.json (available: ${keyset.keys.map(k => k.kid).join(', ')})`\n );\n }\n return match;\n}\n\nfunction str(v: unknown, where: string): string {\n if (typeof v !== 'string') throw new Error(`${where} must be string`);\n return v;\n}\n\nfunction num(v: unknown, where: string): number {\n if (typeof v !== 'number') throw new Error(`${where} must be number`);\n return v;\n}\n\nfunction bool(v: unknown, where: string): boolean {\n if (typeof v !== 'boolean') throw new Error(`${where} must be boolean`);\n return v;\n}\n\nfunction strArray(v: unknown, where: string): string[] {\n if (!Array.isArray(v) || v.some(item => typeof item !== 'string')) {\n throw new Error(`${where} must be string[]`);\n }\n return v as string[];\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join } from 'path';\nimport { getComplianceCacheDir } from '../compliance';\nimport type { RequestSignatureErrorCode } from '../../../signing';\nimport { CONTRACT_IDS } from './types';\nimport type { ContractId, NegativeVector, PositiveVector, TestKeypair, TestKeyset, Vector } from './types';\n\nexport interface LoadVectorsOptions {\n complianceDir?: string;\n version?: string;\n}\n\nexport interface LoadedVectors {\n positive: PositiveVector[];\n negative: NegativeVector[];\n profiles: Record<string, { positive: PositiveVector[]; negative: NegativeVector[] }>;\n keys: TestKeyset;\n sourceDir: string;\n}\n\nconst ERROR_CODES: ReadonlySet<string> = new Set([\n 'request_signature_required',\n 'request_signature_header_malformed',\n 'request_signature_params_incomplete',\n 'request_signature_tag_invalid',\n 'request_signature_alg_not_allowed',\n 'request_signature_window_invalid',\n 'request_signature_components_incomplete',\n 'request_signature_components_unexpected',\n 'request_target_uri_malformed',\n 'request_signature_key_unknown',\n 'request_signature_key_purpose_invalid',\n 'request_signature_key_revoked',\n 'request_signature_invalid',\n 'request_signature_digest_mismatch',\n 'request_signature_replayed',\n 'request_signature_rate_abuse',\n]);\n\nconst CONTRACT_ID_SET: ReadonlySet<string> = new Set(CONTRACT_IDS);\n\n// Memoized per sourceDir — loading 28 JSON fixtures + keys.json on every\n// per-vector call in the runner path added up (~28 disk reads × 2-3 storyboard\n// resolve calls per CLI run). Invariant: the compliance cache is immutable\n// during a process lifetime — `npm run sync-schemas` runs before the process,\n// never concurrently. Cache key is the absolute cacheDir so env-var overrides\n// don't poison the entry.\nconst VECTOR_CACHE = new Map<string, LoadedVectors>();\n\nexport function loadRequestSigningVectors(options: LoadVectorsOptions = {}): LoadedVectors {\n const cacheDir = getComplianceCacheDir(options);\n const sourceDir = join(cacheDir, 'test-vectors', 'request-signing');\n const cached = VECTOR_CACHE.get(sourceDir);\n if (cached) return cached;\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Request-signing vectors not found at ${sourceDir}. Run \\`npm run sync-schemas\\` or check your ADCP_COMPLIANCE_DIR.`\n );\n }\n\n const profile32Dir = join(sourceDir, 'profile-3.2');\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n profiles: existsSync(profile32Dir)\n ? {\n '3.2': {\n positive: loadDir(join(profile32Dir, 'positive'), parsePositive, 'profile-3.2/positive/'),\n negative: loadDir(join(profile32Dir, 'negative'), parseNegative, 'profile-3.2/negative/'),\n },\n }\n : {},\n keys: loadRequestSigningKeys(options),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Load only the shared signing keyset, without requiring the grader vectors. */\nexport function loadRequestSigningKeys(options: LoadVectorsOptions = {}): TestKeyset {\n const cacheDir = getComplianceCacheDir(options);\n return loadKeys(join(cacheDir, 'test-vectors', 'request-signing', 'keys.json'));\n}\n\n/** Test-only: clear the memoization cache so a fresh cache path is reread. */\nexport function __resetVectorCache(): void {\n VECTOR_CACHE.clear();\n}\n\nfunction loadDir<T extends Vector>(dir: string, parse: (id: string, raw: unknown) => T, idPrefix = ''): T[] {\n if (!existsSync(dir)) {\n throw new Error(`Vector directory missing: ${dir}`);\n }\n const files = readdirSync(dir)\n .filter(f => f.endsWith('.json'))\n .sort();\n return files.map(f => {\n const raw = JSON.parse(readFileSync(join(dir, f), 'utf-8'));\n return parse(`${idPrefix}${vectorIdFromFilename(f)}`, raw);\n });\n}\n\nfunction vectorIdFromFilename(file: string): string {\n return basename(file, '.json');\n}\n\nfunction parsePositive(id: string, raw: unknown): PositiveVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, true);\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'positive',\n id,\n name: str(r.name, `${id}.name`),\n signing_profile_version: optionalSigningProfileVersion(r),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_signature_base: typeof r.expected_signature_base === 'string' ? r.expected_signature_base : undefined,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseNegative(id: string, raw: unknown): NegativeVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, false);\n const outcome = r.expected_outcome as Record<string, unknown>;\n const errorCode = str(outcome.error_code, `${id}.expected_outcome.error_code`);\n if (!ERROR_CODES.has(errorCode)) {\n throw new Error(`${id}: unknown expected_outcome.error_code \"${errorCode}\" (spec drift?)`);\n }\n const failedStep = outcome.failed_step;\n if (typeof failedStep !== 'number' && typeof failedStep !== 'string') {\n throw new Error(`${id}: expected_outcome.failed_step must be number or string`);\n }\n let contract: ContractId | undefined;\n if (r.requires_contract !== undefined) {\n const c = str(r.requires_contract, `${id}.requires_contract`);\n if (!CONTRACT_ID_SET.has(c)) {\n throw new Error(`${id}: unknown requires_contract \"${c}\" (spec drift?)`);\n }\n contract = c as ContractId;\n }\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'negative',\n id,\n name: str(r.name, `${id}.name`),\n signing_profile_version: optionalSigningProfileVersion(r),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_error_code: errorCode as RequestSignatureErrorCode,\n expected_failed_step: failedStep,\n requires_contract: contract,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction optionalSigningProfileVersion(vector: Record<string, unknown>): string {\n // Older cached bundles predate the explicit marker; every root vector in\n // those bundles exercises the legacy 3.1 binary profile.\n return typeof vector.signing_profile_version === 'string' ? vector.signing_profile_version : '3.1';\n}\n\nfunction parseJwksSelector(\n id: string,\n r: Record<string, unknown>\n): { jwks_ref?: string[]; jwks_override?: { keys: Array<Record<string, unknown>> } } {\n const hasRef = r.jwks_ref !== undefined;\n const hasOverride = r.jwks_override !== undefined;\n if (hasRef && hasOverride) {\n throw new Error(`${id}: jwks_ref and jwks_override are mutually exclusive`);\n }\n if (!hasRef && !hasOverride) {\n throw new Error(`${id}: must declare either jwks_ref or jwks_override`);\n }\n if (hasOverride) {\n const override = r.jwks_override as Record<string, unknown>;\n const keys = override.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new Error(`${id}.jwks_override.keys must be a non-empty array`);\n }\n for (const k of keys) {\n if (!k || typeof k !== 'object') {\n throw new Error(`${id}.jwks_override.keys[] entries must be objects`);\n }\n }\n return { jwks_override: { keys: keys as Array<Record<string, unknown>> } };\n }\n return { jwks_ref: strArray(r.jwks_ref, `${id}.jwks_ref`) };\n}\n\nfunction assertSuccess(id: string, vector: Record<string, unknown>, expected: boolean): void {\n const outcome = vector.expected_outcome as Record<string, unknown> | undefined;\n if (!outcome || outcome.success !== expected) {\n throw new Error(\n `${id}: expected_outcome.success must be ${expected} for ${expected ? 'positive' : 'negative'} vector`\n );\n }\n}\n\nfunction parseRequest(id: string, raw: unknown): PositiveVector['request'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.request missing`);\n const headers = r.headers as Record<string, string> | undefined;\n if (!headers) throw new Error(`${id}.request.headers missing`);\n return {\n method: str(r.method, `${id}.request.method`),\n url: str(r.url, `${id}.request.url`),\n headers: { ...headers },\n body: typeof r.body === 'string' ? r.body : undefined,\n };\n}\n\nfunction parseCapability(id: string, raw: unknown): PositiveVector['verifier_capability'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.verifier_capability missing`);\n const digest = str(r.covers_content_digest, `${id}.verifier_capability.covers_content_digest`);\n if (digest !== 'required' && digest !== 'forbidden' && digest !== 'either') {\n throw new Error(`${id}: invalid covers_content_digest \"${digest}\"`);\n }\n return {\n supported: bool(r.supported, `${id}.verifier_capability.supported`),\n covers_content_digest: digest,\n required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),\n supported_for: Array.isArray(r.supported_for) ? (r.supported_for as string[]) : undefined,\n protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for)\n ? (r.protocol_methods_supported_for as string[])\n : undefined,\n protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for)\n ? (r.protocol_methods_required_for as string[])\n : undefined,\n };\n}\n\nfunction loadKeys(keysPath: string): TestKeyset {\n if (!existsSync(keysPath)) {\n throw new Error(`keys.json missing at ${keysPath}`);\n }\n const raw = JSON.parse(readFileSync(keysPath, 'utf-8')) as { keys?: unknown };\n if (!Array.isArray(raw.keys)) {\n throw new Error(`keys.json must contain a \"keys\" array`);\n }\n return { keys: raw.keys.map((k, i) => parseKey(i, k)) };\n}\n\nfunction parseKey(index: number, raw: unknown): TestKeypair {\n const r = raw as Record<string, unknown>;\n const where = `keys.json[${index}]`;\n const privateD = r._private_d_for_test_only;\n if (typeof privateD !== 'string' || privateD.length === 0) {\n throw new Error(`${where}._private_d_for_test_only missing (required for dynamic signing)`);\n }\n return {\n kid: str(r.kid, `${where}.kid`),\n kty: str(r.kty, `${where}.kty`),\n crv: typeof r.crv === 'string' ? r.crv : undefined,\n alg: typeof r.alg === 'string' ? r.alg : undefined,\n use: typeof r.use === 'string' ? r.use : undefined,\n key_ops: Array.isArray(r.key_ops) ? (r.key_ops as string[]) : undefined,\n adcp_use: typeof r.adcp_use === 'string' ? r.adcp_use : undefined,\n x: typeof r.x === 'string' ? r.x : undefined,\n y: typeof r.y === 'string' ? r.y : undefined,\n private_d: privateD,\n };\n}\n\nexport function findKey(keyset: TestKeyset, kid: string): TestKeypair {\n const match = keyset.keys.find(k => k.kid === kid);\n if (!match) {\n throw new Error(\n `No test keypair with kid=\"${kid}\" in keys.json (available: ${keyset.keys.map(k => k.kid).join(', ')})`\n );\n }\n return match;\n}\n\nfunction str(v: unknown, where: string): string {\n if (typeof v !== 'string') throw new Error(`${where} must be string`);\n return v;\n}\n\nfunction num(v: unknown, where: string): number {\n if (typeof v !== 'number') throw new Error(`${where} must be number`);\n return v;\n}\n\nfunction bool(v: unknown, where: string): boolean {\n if (typeof v !== 'boolean') throw new Error(`${where} must be boolean`);\n return v;\n}\n\nfunction strArray(v: unknown, where: string): string[] {\n if (!Array.isArray(v) || v.some(item => typeof item !== 'string')) {\n throw new Error(`${where} must be string[]`);\n }\n return v as string[];\n}\n"],"mappings":"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","names":[]}
|
|
@@ -42,12 +42,16 @@ function loadRequestSigningVectors(options = {}) {
|
|
|
42
42
|
negative: loadDir(join(profile32Dir, "negative"), parseNegative, "profile-3.2/negative/")
|
|
43
43
|
}
|
|
44
44
|
} : {},
|
|
45
|
-
keys:
|
|
45
|
+
keys: loadRequestSigningKeys(options),
|
|
46
46
|
sourceDir
|
|
47
47
|
};
|
|
48
48
|
VECTOR_CACHE.set(sourceDir, loaded);
|
|
49
49
|
return loaded;
|
|
50
50
|
}
|
|
51
|
+
function loadRequestSigningKeys(options = {}) {
|
|
52
|
+
const cacheDir = getComplianceCacheDir(options);
|
|
53
|
+
return loadKeys(join(cacheDir, "test-vectors", "request-signing", "keys.json"));
|
|
54
|
+
}
|
|
51
55
|
function __resetVectorCache() {
|
|
52
56
|
VECTOR_CACHE.clear();
|
|
53
57
|
}
|
|
@@ -242,6 +246,7 @@ function strArray(v, where) {
|
|
|
242
246
|
export {
|
|
243
247
|
__resetVectorCache,
|
|
244
248
|
findKey,
|
|
249
|
+
loadRequestSigningKeys,
|
|
245
250
|
loadRequestSigningVectors
|
|
246
251
|
};
|
|
247
252
|
//# sourceMappingURL=vector-loader.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join } from 'path';\nimport { getComplianceCacheDir } from '../compliance';\nimport type { RequestSignatureErrorCode } from '../../../signing';\nimport { CONTRACT_IDS } from './types';\nimport type { ContractId, NegativeVector, PositiveVector, TestKeypair, TestKeyset, Vector } from './types';\n\nexport interface LoadVectorsOptions {\n complianceDir?: string;\n version?: string;\n}\n\nexport interface LoadedVectors {\n positive: PositiveVector[];\n negative: NegativeVector[];\n profiles: Record<string, { positive: PositiveVector[]; negative: NegativeVector[] }>;\n keys: TestKeyset;\n sourceDir: string;\n}\n\nconst ERROR_CODES: ReadonlySet<string> = new Set([\n 'request_signature_required',\n 'request_signature_header_malformed',\n 'request_signature_params_incomplete',\n 'request_signature_tag_invalid',\n 'request_signature_alg_not_allowed',\n 'request_signature_window_invalid',\n 'request_signature_components_incomplete',\n 'request_signature_components_unexpected',\n 'request_target_uri_malformed',\n 'request_signature_key_unknown',\n 'request_signature_key_purpose_invalid',\n 'request_signature_key_revoked',\n 'request_signature_invalid',\n 'request_signature_digest_mismatch',\n 'request_signature_replayed',\n 'request_signature_rate_abuse',\n]);\n\nconst CONTRACT_ID_SET: ReadonlySet<string> = new Set(CONTRACT_IDS);\n\n// Memoized per sourceDir — loading 28 JSON fixtures + keys.json on every\n// per-vector call in the runner path added up (~28 disk reads × 2-3 storyboard\n// resolve calls per CLI run). Invariant: the compliance cache is immutable\n// during a process lifetime — `npm run sync-schemas` runs before the process,\n// never concurrently. Cache key is the absolute cacheDir so env-var overrides\n// don't poison the entry.\nconst VECTOR_CACHE = new Map<string, LoadedVectors>();\n\nexport function loadRequestSigningVectors(options: LoadVectorsOptions = {}): LoadedVectors {\n const cacheDir = getComplianceCacheDir(options);\n const sourceDir = join(cacheDir, 'test-vectors', 'request-signing');\n const cached = VECTOR_CACHE.get(sourceDir);\n if (cached) return cached;\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Request-signing vectors not found at ${sourceDir}. Run \\`npm run sync-schemas\\` or check your ADCP_COMPLIANCE_DIR.`\n );\n }\n\n const profile32Dir = join(sourceDir, 'profile-3.2');\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n profiles: existsSync(profile32Dir)\n ? {\n '3.2': {\n positive: loadDir(join(profile32Dir, 'positive'), parsePositive, 'profile-3.2/positive/'),\n negative: loadDir(join(profile32Dir, 'negative'), parseNegative, 'profile-3.2/negative/'),\n },\n }\n : {},\n keys: loadKeys(join(sourceDir, 'keys.json')),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Test-only: clear the memoization cache so a fresh cache path is reread. */\nexport function __resetVectorCache(): void {\n VECTOR_CACHE.clear();\n}\n\nfunction loadDir<T extends Vector>(dir: string, parse: (id: string, raw: unknown) => T, idPrefix = ''): T[] {\n if (!existsSync(dir)) {\n throw new Error(`Vector directory missing: ${dir}`);\n }\n const files = readdirSync(dir)\n .filter(f => f.endsWith('.json'))\n .sort();\n return files.map(f => {\n const raw = JSON.parse(readFileSync(join(dir, f), 'utf-8'));\n return parse(`${idPrefix}${vectorIdFromFilename(f)}`, raw);\n });\n}\n\nfunction vectorIdFromFilename(file: string): string {\n return basename(file, '.json');\n}\n\nfunction parsePositive(id: string, raw: unknown): PositiveVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, true);\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'positive',\n id,\n name: str(r.name, `${id}.name`),\n signing_profile_version: optionalSigningProfileVersion(r),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_signature_base: typeof r.expected_signature_base === 'string' ? r.expected_signature_base : undefined,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseNegative(id: string, raw: unknown): NegativeVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, false);\n const outcome = r.expected_outcome as Record<string, unknown>;\n const errorCode = str(outcome.error_code, `${id}.expected_outcome.error_code`);\n if (!ERROR_CODES.has(errorCode)) {\n throw new Error(`${id}: unknown expected_outcome.error_code \"${errorCode}\" (spec drift?)`);\n }\n const failedStep = outcome.failed_step;\n if (typeof failedStep !== 'number' && typeof failedStep !== 'string') {\n throw new Error(`${id}: expected_outcome.failed_step must be number or string`);\n }\n let contract: ContractId | undefined;\n if (r.requires_contract !== undefined) {\n const c = str(r.requires_contract, `${id}.requires_contract`);\n if (!CONTRACT_ID_SET.has(c)) {\n throw new Error(`${id}: unknown requires_contract \"${c}\" (spec drift?)`);\n }\n contract = c as ContractId;\n }\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'negative',\n id,\n name: str(r.name, `${id}.name`),\n signing_profile_version: optionalSigningProfileVersion(r),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_error_code: errorCode as RequestSignatureErrorCode,\n expected_failed_step: failedStep,\n requires_contract: contract,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction optionalSigningProfileVersion(vector: Record<string, unknown>): string {\n // Older cached bundles predate the explicit marker; every root vector in\n // those bundles exercises the legacy 3.1 binary profile.\n return typeof vector.signing_profile_version === 'string' ? vector.signing_profile_version : '3.1';\n}\n\nfunction parseJwksSelector(\n id: string,\n r: Record<string, unknown>\n): { jwks_ref?: string[]; jwks_override?: { keys: Array<Record<string, unknown>> } } {\n const hasRef = r.jwks_ref !== undefined;\n const hasOverride = r.jwks_override !== undefined;\n if (hasRef && hasOverride) {\n throw new Error(`${id}: jwks_ref and jwks_override are mutually exclusive`);\n }\n if (!hasRef && !hasOverride) {\n throw new Error(`${id}: must declare either jwks_ref or jwks_override`);\n }\n if (hasOverride) {\n const override = r.jwks_override as Record<string, unknown>;\n const keys = override.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new Error(`${id}.jwks_override.keys must be a non-empty array`);\n }\n for (const k of keys) {\n if (!k || typeof k !== 'object') {\n throw new Error(`${id}.jwks_override.keys[] entries must be objects`);\n }\n }\n return { jwks_override: { keys: keys as Array<Record<string, unknown>> } };\n }\n return { jwks_ref: strArray(r.jwks_ref, `${id}.jwks_ref`) };\n}\n\nfunction assertSuccess(id: string, vector: Record<string, unknown>, expected: boolean): void {\n const outcome = vector.expected_outcome as Record<string, unknown> | undefined;\n if (!outcome || outcome.success !== expected) {\n throw new Error(\n `${id}: expected_outcome.success must be ${expected} for ${expected ? 'positive' : 'negative'} vector`\n );\n }\n}\n\nfunction parseRequest(id: string, raw: unknown): PositiveVector['request'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.request missing`);\n const headers = r.headers as Record<string, string> | undefined;\n if (!headers) throw new Error(`${id}.request.headers missing`);\n return {\n method: str(r.method, `${id}.request.method`),\n url: str(r.url, `${id}.request.url`),\n headers: { ...headers },\n body: typeof r.body === 'string' ? r.body : undefined,\n };\n}\n\nfunction parseCapability(id: string, raw: unknown): PositiveVector['verifier_capability'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.verifier_capability missing`);\n const digest = str(r.covers_content_digest, `${id}.verifier_capability.covers_content_digest`);\n if (digest !== 'required' && digest !== 'forbidden' && digest !== 'either') {\n throw new Error(`${id}: invalid covers_content_digest \"${digest}\"`);\n }\n return {\n supported: bool(r.supported, `${id}.verifier_capability.supported`),\n covers_content_digest: digest,\n required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),\n supported_for: Array.isArray(r.supported_for) ? (r.supported_for as string[]) : undefined,\n protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for)\n ? (r.protocol_methods_supported_for as string[])\n : undefined,\n protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for)\n ? (r.protocol_methods_required_for as string[])\n : undefined,\n };\n}\n\nfunction loadKeys(keysPath: string): TestKeyset {\n if (!existsSync(keysPath)) {\n throw new Error(`keys.json missing at ${keysPath}`);\n }\n const raw = JSON.parse(readFileSync(keysPath, 'utf-8')) as { keys?: unknown };\n if (!Array.isArray(raw.keys)) {\n throw new Error(`keys.json must contain a \"keys\" array`);\n }\n return { keys: raw.keys.map((k, i) => parseKey(i, k)) };\n}\n\nfunction parseKey(index: number, raw: unknown): TestKeypair {\n const r = raw as Record<string, unknown>;\n const where = `keys.json[${index}]`;\n const privateD = r._private_d_for_test_only;\n if (typeof privateD !== 'string' || privateD.length === 0) {\n throw new Error(`${where}._private_d_for_test_only missing (required for dynamic signing)`);\n }\n return {\n kid: str(r.kid, `${where}.kid`),\n kty: str(r.kty, `${where}.kty`),\n crv: typeof r.crv === 'string' ? r.crv : undefined,\n alg: typeof r.alg === 'string' ? r.alg : undefined,\n use: typeof r.use === 'string' ? r.use : undefined,\n key_ops: Array.isArray(r.key_ops) ? (r.key_ops as string[]) : undefined,\n adcp_use: typeof r.adcp_use === 'string' ? r.adcp_use : undefined,\n x: typeof r.x === 'string' ? r.x : undefined,\n y: typeof r.y === 'string' ? r.y : undefined,\n private_d: privateD,\n };\n}\n\nexport function findKey(keyset: TestKeyset, kid: string): TestKeypair {\n const match = keyset.keys.find(k => k.kid === kid);\n if (!match) {\n throw new Error(\n `No test keypair with kid=\"${kid}\" in keys.json (available: ${keyset.keys.map(k => k.kid).join(', ')})`\n );\n }\n return match;\n}\n\nfunction str(v: unknown, where: string): string {\n if (typeof v !== 'string') throw new Error(`${where} must be string`);\n return v;\n}\n\nfunction num(v: unknown, where: string): number {\n if (typeof v !== 'number') throw new Error(`${where} must be number`);\n return v;\n}\n\nfunction bool(v: unknown, where: string): boolean {\n if (typeof v !== 'boolean') throw new Error(`${where} must be boolean`);\n return v;\n}\n\nfunction strArray(v: unknown, where: string): string[] {\n if (!Array.isArray(v) || v.some(item => typeof item !== 'string')) {\n throw new Error(`${where} must be string[]`);\n }\n return v as string[];\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/testing/storyboard/request-signing/vector-loader.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join } from 'path';\nimport { getComplianceCacheDir } from '../compliance';\nimport type { RequestSignatureErrorCode } from '../../../signing';\nimport { CONTRACT_IDS } from './types';\nimport type { ContractId, NegativeVector, PositiveVector, TestKeypair, TestKeyset, Vector } from './types';\n\nexport interface LoadVectorsOptions {\n complianceDir?: string;\n version?: string;\n}\n\nexport interface LoadedVectors {\n positive: PositiveVector[];\n negative: NegativeVector[];\n profiles: Record<string, { positive: PositiveVector[]; negative: NegativeVector[] }>;\n keys: TestKeyset;\n sourceDir: string;\n}\n\nconst ERROR_CODES: ReadonlySet<string> = new Set([\n 'request_signature_required',\n 'request_signature_header_malformed',\n 'request_signature_params_incomplete',\n 'request_signature_tag_invalid',\n 'request_signature_alg_not_allowed',\n 'request_signature_window_invalid',\n 'request_signature_components_incomplete',\n 'request_signature_components_unexpected',\n 'request_target_uri_malformed',\n 'request_signature_key_unknown',\n 'request_signature_key_purpose_invalid',\n 'request_signature_key_revoked',\n 'request_signature_invalid',\n 'request_signature_digest_mismatch',\n 'request_signature_replayed',\n 'request_signature_rate_abuse',\n]);\n\nconst CONTRACT_ID_SET: ReadonlySet<string> = new Set(CONTRACT_IDS);\n\n// Memoized per sourceDir — loading 28 JSON fixtures + keys.json on every\n// per-vector call in the runner path added up (~28 disk reads × 2-3 storyboard\n// resolve calls per CLI run). Invariant: the compliance cache is immutable\n// during a process lifetime — `npm run sync-schemas` runs before the process,\n// never concurrently. Cache key is the absolute cacheDir so env-var overrides\n// don't poison the entry.\nconst VECTOR_CACHE = new Map<string, LoadedVectors>();\n\nexport function loadRequestSigningVectors(options: LoadVectorsOptions = {}): LoadedVectors {\n const cacheDir = getComplianceCacheDir(options);\n const sourceDir = join(cacheDir, 'test-vectors', 'request-signing');\n const cached = VECTOR_CACHE.get(sourceDir);\n if (cached) return cached;\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Request-signing vectors not found at ${sourceDir}. Run \\`npm run sync-schemas\\` or check your ADCP_COMPLIANCE_DIR.`\n );\n }\n\n const profile32Dir = join(sourceDir, 'profile-3.2');\n const loaded: LoadedVectors = {\n positive: loadDir(join(sourceDir, 'positive'), parsePositive),\n negative: loadDir(join(sourceDir, 'negative'), parseNegative),\n profiles: existsSync(profile32Dir)\n ? {\n '3.2': {\n positive: loadDir(join(profile32Dir, 'positive'), parsePositive, 'profile-3.2/positive/'),\n negative: loadDir(join(profile32Dir, 'negative'), parseNegative, 'profile-3.2/negative/'),\n },\n }\n : {},\n keys: loadRequestSigningKeys(options),\n sourceDir,\n };\n VECTOR_CACHE.set(sourceDir, loaded);\n return loaded;\n}\n\n/** Load only the shared signing keyset, without requiring the grader vectors. */\nexport function loadRequestSigningKeys(options: LoadVectorsOptions = {}): TestKeyset {\n const cacheDir = getComplianceCacheDir(options);\n return loadKeys(join(cacheDir, 'test-vectors', 'request-signing', 'keys.json'));\n}\n\n/** Test-only: clear the memoization cache so a fresh cache path is reread. */\nexport function __resetVectorCache(): void {\n VECTOR_CACHE.clear();\n}\n\nfunction loadDir<T extends Vector>(dir: string, parse: (id: string, raw: unknown) => T, idPrefix = ''): T[] {\n if (!existsSync(dir)) {\n throw new Error(`Vector directory missing: ${dir}`);\n }\n const files = readdirSync(dir)\n .filter(f => f.endsWith('.json'))\n .sort();\n return files.map(f => {\n const raw = JSON.parse(readFileSync(join(dir, f), 'utf-8'));\n return parse(`${idPrefix}${vectorIdFromFilename(f)}`, raw);\n });\n}\n\nfunction vectorIdFromFilename(file: string): string {\n return basename(file, '.json');\n}\n\nfunction parsePositive(id: string, raw: unknown): PositiveVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, true);\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'positive',\n id,\n name: str(r.name, `${id}.name`),\n signing_profile_version: optionalSigningProfileVersion(r),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_signature_base: typeof r.expected_signature_base === 'string' ? r.expected_signature_base : undefined,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction parseNegative(id: string, raw: unknown): NegativeVector {\n const r = raw as Record<string, unknown>;\n assertSuccess(id, r, false);\n const outcome = r.expected_outcome as Record<string, unknown>;\n const errorCode = str(outcome.error_code, `${id}.expected_outcome.error_code`);\n if (!ERROR_CODES.has(errorCode)) {\n throw new Error(`${id}: unknown expected_outcome.error_code \"${errorCode}\" (spec drift?)`);\n }\n const failedStep = outcome.failed_step;\n if (typeof failedStep !== 'number' && typeof failedStep !== 'string') {\n throw new Error(`${id}: expected_outcome.failed_step must be number or string`);\n }\n let contract: ContractId | undefined;\n if (r.requires_contract !== undefined) {\n const c = str(r.requires_contract, `${id}.requires_contract`);\n if (!CONTRACT_ID_SET.has(c)) {\n throw new Error(`${id}: unknown requires_contract \"${c}\" (spec drift?)`);\n }\n contract = c as ContractId;\n }\n const { jwks_ref, jwks_override } = parseJwksSelector(id, r);\n return {\n kind: 'negative',\n id,\n name: str(r.name, `${id}.name`),\n signing_profile_version: optionalSigningProfileVersion(r),\n reference_now: num(r.reference_now, `${id}.reference_now`),\n request: parseRequest(id, r.request),\n verifier_capability: parseCapability(id, r.verifier_capability),\n jwks_ref,\n jwks_override,\n expected_error_code: errorCode as RequestSignatureErrorCode,\n expected_failed_step: failedStep,\n requires_contract: contract,\n spec_reference: typeof r.spec_reference === 'string' ? r.spec_reference : undefined,\n };\n}\n\nfunction optionalSigningProfileVersion(vector: Record<string, unknown>): string {\n // Older cached bundles predate the explicit marker; every root vector in\n // those bundles exercises the legacy 3.1 binary profile.\n return typeof vector.signing_profile_version === 'string' ? vector.signing_profile_version : '3.1';\n}\n\nfunction parseJwksSelector(\n id: string,\n r: Record<string, unknown>\n): { jwks_ref?: string[]; jwks_override?: { keys: Array<Record<string, unknown>> } } {\n const hasRef = r.jwks_ref !== undefined;\n const hasOverride = r.jwks_override !== undefined;\n if (hasRef && hasOverride) {\n throw new Error(`${id}: jwks_ref and jwks_override are mutually exclusive`);\n }\n if (!hasRef && !hasOverride) {\n throw new Error(`${id}: must declare either jwks_ref or jwks_override`);\n }\n if (hasOverride) {\n const override = r.jwks_override as Record<string, unknown>;\n const keys = override.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new Error(`${id}.jwks_override.keys must be a non-empty array`);\n }\n for (const k of keys) {\n if (!k || typeof k !== 'object') {\n throw new Error(`${id}.jwks_override.keys[] entries must be objects`);\n }\n }\n return { jwks_override: { keys: keys as Array<Record<string, unknown>> } };\n }\n return { jwks_ref: strArray(r.jwks_ref, `${id}.jwks_ref`) };\n}\n\nfunction assertSuccess(id: string, vector: Record<string, unknown>, expected: boolean): void {\n const outcome = vector.expected_outcome as Record<string, unknown> | undefined;\n if (!outcome || outcome.success !== expected) {\n throw new Error(\n `${id}: expected_outcome.success must be ${expected} for ${expected ? 'positive' : 'negative'} vector`\n );\n }\n}\n\nfunction parseRequest(id: string, raw: unknown): PositiveVector['request'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.request missing`);\n const headers = r.headers as Record<string, string> | undefined;\n if (!headers) throw new Error(`${id}.request.headers missing`);\n return {\n method: str(r.method, `${id}.request.method`),\n url: str(r.url, `${id}.request.url`),\n headers: { ...headers },\n body: typeof r.body === 'string' ? r.body : undefined,\n };\n}\n\nfunction parseCapability(id: string, raw: unknown): PositiveVector['verifier_capability'] {\n const r = raw as Record<string, unknown> | undefined;\n if (!r) throw new Error(`${id}.verifier_capability missing`);\n const digest = str(r.covers_content_digest, `${id}.verifier_capability.covers_content_digest`);\n if (digest !== 'required' && digest !== 'forbidden' && digest !== 'either') {\n throw new Error(`${id}: invalid covers_content_digest \"${digest}\"`);\n }\n return {\n supported: bool(r.supported, `${id}.verifier_capability.supported`),\n covers_content_digest: digest,\n required_for: strArray(r.required_for, `${id}.verifier_capability.required_for`),\n supported_for: Array.isArray(r.supported_for) ? (r.supported_for as string[]) : undefined,\n protocol_methods_supported_for: Array.isArray(r.protocol_methods_supported_for)\n ? (r.protocol_methods_supported_for as string[])\n : undefined,\n protocol_methods_required_for: Array.isArray(r.protocol_methods_required_for)\n ? (r.protocol_methods_required_for as string[])\n : undefined,\n };\n}\n\nfunction loadKeys(keysPath: string): TestKeyset {\n if (!existsSync(keysPath)) {\n throw new Error(`keys.json missing at ${keysPath}`);\n }\n const raw = JSON.parse(readFileSync(keysPath, 'utf-8')) as { keys?: unknown };\n if (!Array.isArray(raw.keys)) {\n throw new Error(`keys.json must contain a \"keys\" array`);\n }\n return { keys: raw.keys.map((k, i) => parseKey(i, k)) };\n}\n\nfunction parseKey(index: number, raw: unknown): TestKeypair {\n const r = raw as Record<string, unknown>;\n const where = `keys.json[${index}]`;\n const privateD = r._private_d_for_test_only;\n if (typeof privateD !== 'string' || privateD.length === 0) {\n throw new Error(`${where}._private_d_for_test_only missing (required for dynamic signing)`);\n }\n return {\n kid: str(r.kid, `${where}.kid`),\n kty: str(r.kty, `${where}.kty`),\n crv: typeof r.crv === 'string' ? r.crv : undefined,\n alg: typeof r.alg === 'string' ? r.alg : undefined,\n use: typeof r.use === 'string' ? r.use : undefined,\n key_ops: Array.isArray(r.key_ops) ? (r.key_ops as string[]) : undefined,\n adcp_use: typeof r.adcp_use === 'string' ? r.adcp_use : undefined,\n x: typeof r.x === 'string' ? r.x : undefined,\n y: typeof r.y === 'string' ? r.y : undefined,\n private_d: privateD,\n };\n}\n\nexport function findKey(keyset: TestKeyset, kid: string): TestKeypair {\n const match = keyset.keys.find(k => k.kid === kid);\n if (!match) {\n throw new Error(\n `No test keypair with kid=\"${kid}\" in keys.json (available: ${keyset.keys.map(k => k.kid).join(', ')})`\n );\n }\n return match;\n}\n\nfunction str(v: unknown, where: string): string {\n if (typeof v !== 'string') throw new Error(`${where} must be string`);\n return v;\n}\n\nfunction num(v: unknown, where: string): number {\n if (typeof v !== 'number') throw new Error(`${where} must be number`);\n return v;\n}\n\nfunction bool(v: unknown, where: string): boolean {\n if (typeof v !== 'boolean') throw new Error(`${where} must be boolean`);\n return v;\n}\n\nfunction strArray(v: unknown, where: string): string[] {\n if (!Array.isArray(v) || v.some(item => typeof item !== 'string')) {\n throw new Error(`${where} must be string[]`);\n }\n return v as string[];\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,7 @@ var import_client = require('../client.js');
|
|
|
44
44
|
var import_protocols = require('../../protocols/index.js');
|
|
45
45
|
var import_rawResponseCapture = require('../../protocols/rawResponseCapture.js');
|
|
46
46
|
var import_task_map = require('./task-map.js');
|
|
47
|
+
var import_functional_dispatch = require('./request-signing/functional-dispatch.js');
|
|
47
48
|
var import_context = require('./context.js');
|
|
48
49
|
var import_rejection_hints = require('./rejection-hints.js');
|
|
49
50
|
var import_shape_drift_hints = require('./shape-drift-hints.js');
|
|
@@ -650,6 +651,10 @@ async function runStoryboard(agentUrlOrUrls, storyboard, options = {}) {
|
|
|
650
651
|
return (0, import_protocols.withMCPConnectionScope)(
|
|
651
652
|
async () => {
|
|
652
653
|
options = applyStoryboardVersionOptions(storyboard, options);
|
|
654
|
+
options = (0, import_functional_dispatch.applyFunctionalRequestSigning)(options, {
|
|
655
|
+
...options.complianceDir && { complianceDir: options.complianceDir },
|
|
656
|
+
...options.adcpVersion && { version: options.adcpVersion }
|
|
657
|
+
});
|
|
653
658
|
options = (0, import_test_kit.resolveDeclaredTestKit)(storyboard, options);
|
|
654
659
|
options = { ...options, transport: (0, import_protocols.normalizeTransportOptions)(options.transport) };
|
|
655
660
|
const schemaRoot = getRunSchemaRoot(options);
|
|
@@ -2478,6 +2483,10 @@ async function runStoryboardStep(agentUrl, storyboard, stepId, options = {}) {
|
|
|
2478
2483
|
async () => {
|
|
2479
2484
|
(0, import_loader.validateStoryboardShape)(storyboard);
|
|
2480
2485
|
options = applyStoryboardVersionOptions(storyboard, options);
|
|
2486
|
+
options = (0, import_functional_dispatch.applyFunctionalRequestSigning)(options, {
|
|
2487
|
+
...options.complianceDir && { complianceDir: options.complianceDir },
|
|
2488
|
+
...options.adcpVersion && { version: options.adcpVersion }
|
|
2489
|
+
});
|
|
2481
2490
|
options = (0, import_test_kit.resolveDeclaredTestKit)(storyboard, options);
|
|
2482
2491
|
const schemaRoot = getRunSchemaRoot(options);
|
|
2483
2492
|
if (schemaRoot) {
|
|
@@ -3077,7 +3086,7 @@ async function executeStep(client, step, storyboardId, phaseId, context, allStep
|
|
|
3077
3086
|
runState.agentProfile?.raw_capabilities,
|
|
3078
3087
|
"request_signing.required_for"
|
|
3079
3088
|
);
|
|
3080
|
-
if (taskResult?.adcp_error?.code === "request_signature_required" && Array.isArray(requiredForSigning) && requiredForSigning.includes(effectiveStep.task) && runState.storyboardRequiresRequestSigner !== true) {
|
|
3089
|
+
if (taskResult?.adcp_error?.code === "request_signature_required" && Array.isArray(requiredForSigning) && requiredForSigning.includes(effectiveStep.task) && options.functional_request_signing === void 0 && runState.storyboardRequiresRequestSigner !== true) {
|
|
3081
3090
|
const next2 = getNextStepPreview(step.id, allSteps, context, runState.runnerVars);
|
|
3082
3091
|
const detail = `Agent declared request_signing.required_for includes "${effectiveStep.task}" and rejected the unsigned request with request_signature_required; storyboard "${storyboardId}" does not require request_signer.`;
|
|
3083
3092
|
return {
|