import { BodyBoundCapabilityVerifier, decodeBodyBoundCapability, signBodyBoundRequest, type BodyBoundRequestSignature, type BodyBoundRequestSignatureInput, } from "../web/body-capability.js"; export const REVIEW_TIMESTAMP_HEADER = "x-thoughtstream-review-timestamp"; export const REVIEW_NONCE_HEADER = "x-thoughtstream-review-nonce"; export const REVIEW_SIGNATURE_HEADER = "x-thoughtstream-review-signature"; export const REVIEW_CSRF_HEADER = "x-thoughtstream-csrf"; export type ReviewRequestSignatureInput = BodyBoundRequestSignatureInput; export type ReviewRequestSignature = BodyBoundRequestSignature; export function signReviewRequest(key: Buffer, input: ReviewRequestSignatureInput): ReviewRequestSignature { return signBodyBoundRequest(key, input, "Review"); } export class ReviewCapabilityVerifier { private readonly verifier: BodyBoundCapabilityVerifier; constructor( key: Buffer, options: { now?: (() => number) | undefined; maxSkewMs?: number | undefined; maxNonces?: number | undefined; } = {}, ) { this.verifier = new BodyBoundCapabilityVerifier(key, "Review", options); } verify( headers: Record, method: string, path: string, body: Buffer, ): boolean { return this.verifier.verify(headers, { timestamp: REVIEW_TIMESTAMP_HEADER, nonce: REVIEW_NONCE_HEADER, signature: REVIEW_SIGNATURE_HEADER, }, method, path, body); } } export function decodeReviewCapability(value: string | undefined): Buffer | undefined { return decodeBodyBoundCapability(value, "Review"); }