@reinconsole/gate 0.1.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/LICENSE +21 -0
- package/README.md +46 -0
- package/dist/index.cjs +864 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +561 -0
- package/dist/index.d.ts +561 -0
- package/dist/index.js +844 -0
- package/dist/index.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/v2.ts","../src/wire.ts","../src/rails.ts","../src/routes.ts","../src/stores.ts","../src/velocity.ts","../src/gate.ts","../src/node.ts","../src/fetch.ts"],"names":["envelope","transfer","messageOf"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Why the gate turned a payment away. Stable strings — clients switch on these.\n *\n * Two classes carry no payer fault and MUST NOT feed reputation evidence\n * (@reinconsole/graph skips them): the throttle codes (`rate_limited`,\n * `velocity_exceeded` — the vendor's cap, not payer misbehavior) and the rails\n * codes (`rails_unavailable`, `settle_unknown` — the vendor's infrastructure\n * failing; a settle_unknown payment may even have gone through).\n */\nexport type GateRefusalCode =\n | 'malformed_payment'\n | 'scheme_mismatch'\n | 'network_mismatch'\n | 'amount_mismatch'\n | 'recipient_mismatch'\n | 'payer_denied'\n | 'payer_not_allowed'\n | 'payment_replayed'\n /** Too many presentations in the velocity window (429; Retry-After set). */\n | 'rate_limited'\n /** The settled-spend cap would be exceeded (429; Retry-After when a slot frees). */\n | 'velocity_exceeded'\n | 'verify_failed'\n | 'settle_failed'\n /** The rails could not be reached and the payment provably did NOT settle\n * (503). The replay slot is released — the same header may be re-presented. */\n | 'rails_unavailable'\n /** Settlement was attempted but its fate is unknown — the request may have\n * reached the rails (503). The slot stays burned; do NOT re-pay blindly:\n * reconcile against transaction records (e.g. the on-chain indexer) first. */\n | 'settle_unknown';\n\nexport class GateError extends Error {\n /** Seconds until the refused payment could be admitted (throttle codes). */\n readonly retryAfterSeconds?: number;\n\n constructor(\n readonly code: GateRefusalCode,\n message: string,\n options: { retryAfterSeconds?: number } = {},\n ) {\n super(message);\n this.name = 'GateError';\n this.retryAfterSeconds = options.retryAfterSeconds;\n }\n}\n","import type { PaymentRequirement } from '@reinconsole/sdk';\n\n/**\n * x402 v2 wire builders (vendor side). Verified against the published spec\n * (coinbase/x402 specs/x402-specification-v2.md + transports-v2/http.md) and\n * the live facilitator's /supported (2026-07):\n *\n * - Requirements rename `maxAmountRequired` → `amount`, move resource fields\n * out into a `ResourceInfo` object, and use CAIP-2 network ids.\n * - All protocol data travels in headers: 402s carry `PAYMENT-REQUIRED`\n * (base64 PaymentRequired), clients pay with `PAYMENT-SIGNATURE` (base64\n * PaymentPayload), settlements return in `PAYMENT-RESPONSE`.\n *\n * Rein's internal requirement shape stays v1 (the zod contract in @reinconsole/sdk);\n * v2 is a WIRE dialect converted at the edges by the helpers here.\n */\n\n/**\n * Known v1 network names → CAIP-2. EVM entries are chain-id math; the Solana\n * ids are what the live facilitator advertises. Unknown names pass through\n * lowercased, so two spellings of an UNKNOWN network still compare equal.\n */\nconst CAIP2_ALIASES: Record<string, string> = {\n base: 'eip155:8453',\n 'base-sepolia': 'eip155:84532',\n polygon: 'eip155:137',\n 'polygon-amoy': 'eip155:80002',\n bnb: 'eip155:56',\n bsc: 'eip155:56',\n solana: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n 'solana-devnet': 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n};\n\n/** The CAIP-2 id for a network name, or the lowercased name when unknown. */\nexport function caip2Of(network: string): string {\n const key = network.toLowerCase();\n return CAIP2_ALIASES[key] ?? key;\n}\n\n/** Do two network ids name the same chain, across the v1/CAIP-2 divide? */\nexport function sameNetwork(a: string, b: string): boolean {\n return caip2Of(a) === caip2Of(b);\n}\n\n/** x402 v2 PaymentRequirements (one entry of a 402's `accepts`). */\nexport interface PaymentRequirementsV2 {\n scheme: string;\n /** CAIP-2, e.g. \"eip155:84532\". */\n network: string;\n /** Atomic units — v2's rename of v1's maxAmountRequired. */\n amount: string;\n asset: string;\n payTo: string;\n maxTimeoutSeconds?: number;\n extra?: Record<string, unknown>;\n}\n\n/** v2 PaymentRequired — the decoded PAYMENT-REQUIRED header. */\nexport interface PaymentRequiredV2 {\n x402Version: 2;\n error?: string;\n resource?: { url: string; description?: string; mimeType?: string };\n accepts: PaymentRequirementsV2[];\n extensions?: Record<string, unknown>;\n}\n\n/** Convert Rein's internal (v1-shaped) requirement to the v2 wire shape. */\nexport function v2Requirements(requirement: PaymentRequirement): PaymentRequirementsV2 {\n return {\n scheme: requirement.scheme,\n network: caip2Of(requirement.network),\n amount: requirement.maxAmountRequired,\n asset: requirement.asset,\n payTo: requirement.payTo,\n ...(requirement.maxTimeoutSeconds !== undefined\n ? { maxTimeoutSeconds: requirement.maxTimeoutSeconds }\n : {}),\n ...(requirement.extra ? { extra: requirement.extra } : {}),\n };\n}\n\n/** The full v2 PaymentRequired for one quoted requirement. */\nexport function buildPaymentRequiredV2(\n requirement: PaymentRequirement,\n error: string,\n): PaymentRequiredV2 {\n return {\n x402Version: 2,\n error,\n ...(requirement.resource\n ? {\n resource: {\n url: requirement.resource,\n ...(requirement.description ? { description: requirement.description } : {}),\n ...(requirement.mimeType ? { mimeType: requirement.mimeType } : {}),\n },\n }\n : {}),\n accepts: [v2Requirements(requirement)],\n extensions: {},\n };\n}\n\n/** The one codec every x402 header uses: base64 of compact JSON. */\nexport function encodeBase64Json(value: unknown): string {\n return Buffer.from(JSON.stringify(value)).toString('base64');\n}\n","import { z } from 'zod';\nimport { GateError } from './errors.js';\n\n/**\n * The gate's view of an X-PAYMENT header. Both payload dialects Rein speaks —\n * the real exact-EVM scheme (EIP-3009 authorization nested under\n * `payload.authorization`) and the mock rails' flat payload — share the same\n * base64-JSON v1 envelope and carry the same transfer facts, so the gate can\n * screen payers and cross-check amounts BEFORE any facilitator round-trip.\n * Signature validity stays the rails' job; the gate never trusts these facts\n * for settlement, only for cheap early refusals.\n */\n\nconst UintString = z.string().regex(/^\\d+$/, 'must be a decimal integer string');\n\nconst Transfer = z.object({\n from: z.string().min(1),\n to: z.string().min(1),\n /** Atomic-unit amount, mirroring the requirement's maxAmountRequired. */\n value: UintString,\n});\n\nconst Envelope = z.object({\n x402Version: z.literal(1),\n scheme: z.string(),\n network: z.string(),\n payload: z.record(z.unknown()),\n});\n\n/**\n * The v2 envelope (PAYMENT-SIGNATURE header): scheme/network live inside\n * `accepted` — the requirement the payer chose — and the scheme payload keeps\n * the same authorization nesting. `.passthrough()` keeps resource/extensions\n * intact for rails that re-verify the envelope verbatim.\n */\nconst AcceptedV2 = z\n .object({\n scheme: z.string(),\n network: z.string(),\n amount: UintString,\n asset: z.string().min(1),\n payTo: z.string().min(1),\n })\n .passthrough();\n\nconst EnvelopeV2 = z\n .object({\n x402Version: z.literal(2),\n accepted: AcceptedV2,\n payload: z.record(z.unknown()),\n })\n .passthrough();\n\nexport interface InspectedPayment {\n /** Which wire dialect the payment arrived in. */\n version: 1 | 2;\n scheme: string;\n network: string;\n /** The paying wallet address (`from` in the transfer). */\n payer: string;\n to: string;\n /** Atomic-unit amount. */\n value: string;\n /** The decoded envelope exactly as sent, for rails that re-verify it. */\n envelope: unknown;\n}\n\nexport function inspectPaymentHeader(raw: string): InspectedPayment {\n let json: unknown;\n try {\n json = JSON.parse(Buffer.from(raw, 'base64').toString('utf8'));\n } catch {\n throw new GateError('malformed_payment', 'the payment header is not base64-encoded JSON');\n }\n\n const claimed = (json as { x402Version?: unknown } | null)?.x402Version;\n if (claimed === 2) {\n const envelope = EnvelopeV2.safeParse(json);\n if (!envelope.success) {\n throw new GateError(\n 'malformed_payment',\n `invalid v2 payment envelope: ${envelope.error.message}`,\n );\n }\n const transfer = extractTransfer(envelope.data.payload, 'PAYMENT-SIGNATURE');\n // A self-contradictory envelope (accepted terms vs signed transfer) is\n // malformed on its face — no rails round-trip needed to refuse it.\n if (transfer.value !== envelope.data.accepted.amount) {\n throw new GateError(\n 'malformed_payment',\n `v2 envelope contradicts itself: accepted.amount ${envelope.data.accepted.amount} vs signed value ${transfer.value}`,\n );\n }\n return {\n version: 2,\n scheme: envelope.data.accepted.scheme,\n network: envelope.data.accepted.network,\n payer: transfer.from,\n to: transfer.to,\n value: transfer.value,\n envelope: json,\n };\n }\n\n const envelope = Envelope.safeParse(json);\n if (!envelope.success) {\n throw new GateError('malformed_payment', `invalid X-PAYMENT envelope: ${envelope.error.message}`);\n }\n const transfer = extractTransfer(envelope.data.payload, 'X-PAYMENT');\n return {\n version: 1,\n scheme: envelope.data.scheme,\n network: envelope.data.network,\n payer: transfer.from,\n to: transfer.to,\n value: transfer.value,\n envelope: json,\n };\n}\n\n/** Exact-EVM nests the transfer in `authorization`; the mock payload is flat. */\nfunction extractTransfer(\n payload: Record<string, unknown>,\n headerName: string,\n): z.infer<typeof Transfer> {\n const source = payload['authorization'] ?? payload;\n const transfer = Transfer.safeParse(source);\n if (!transfer.success) {\n throw new GateError(\n 'malformed_payment',\n `${headerName} carries no recognizable transfer: ${transfer.error.message}`,\n );\n }\n return transfer.data;\n}\n\n/** Base64 the settlement for X-PAYMENT-RESPONSE (same codec all rails use). */\nexport function encodeSettlementHeader(response: unknown): string {\n return Buffer.from(JSON.stringify(response)).toString('base64');\n}\n","import type { PaymentRequirement } from '@reinconsole/sdk';\nimport { GateError } from './errors.js';\nimport { v2Requirements } from './v2.js';\nimport { encodeSettlementHeader, inspectPaymentHeader } from './wire.js';\n\n/**\n * The gate's settlement seam. The gate decides WHETHER a payment is acceptable\n * (routes, screening, replay, amount cross-checks); the rails decide whether it\n * is VALID and move the money. Both Rein rails plug in via the structural\n * adapters below — @reinconsole/gate deliberately imports neither, so vendors install\n * only what they run.\n */\nexport interface GateRails {\n /** Throw GateError('verify_failed') if the payment does not check out. */\n verify(paymentHeader: string, requirement: PaymentRequirement): Promise<void>;\n /** Move the money. Throw GateError('settle_failed') if it cannot. */\n settle(paymentHeader: string, requirement: PaymentRequirement): Promise<GateSettlement>;\n}\n\n/**\n * Error taxonomy at this seam — the gate's retry policy hangs off it:\n *\n * - `GateError` — a semantic verdict (bad signature, rejected authorization).\n * Final; never retried.\n * - `RailsUnreachableError` — the request PROVABLY never reached the rails\n * (connection refused, DNS failure). Safe to retry, even for settle.\n * - anything else — ambiguous transport failure (timeout, connection reset,\n * gateway error): the request MAY have executed. verify is read-only so the\n * gate retries it anyway; an ambiguous settle failure is never retried and\n * refuses `settle_unknown`, because re-settling an authorization that\n * actually landed would misreport a paid payment as failed.\n */\nexport class RailsUnreachableError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options as ErrorOptions);\n this.name = 'RailsUnreachableError';\n }\n}\n\n/** Error codes proving the request never left this machine. */\nconst NEVER_SENT_CODES = new Set(['ECONNREFUSED', 'ENOTFOUND', 'EAI_AGAIN']);\n\n/** Walk cause chains (and AggregateError fan-outs) for a never-sent code. */\nfunction isNeverSent(err: unknown): boolean {\n for (let e = err; e !== null && e !== undefined; e = (e as { cause?: unknown }).cause) {\n const code = (e as { code?: unknown }).code;\n if (typeof code === 'string' && NEVER_SENT_CODES.has(code)) return true;\n if (e instanceof AggregateError && e.errors.some(isNeverSent)) return true;\n }\n return false;\n}\n\n/** Re-throw a transport error, tagged when it provably never reached the rails. */\nfunction classifyTransport(err: unknown): never {\n if (isNeverSent(err)) {\n throw new RailsUnreachableError(messageOf(err), { cause: err });\n }\n throw err;\n}\n\nexport interface GateSettlement {\n /** Ready-made X-PAYMENT-RESPONSE header value. */\n header: string;\n /** Settlement transaction hash (mock ledger or on-chain). */\n transaction: string;\n network: string;\n payer?: string;\n}\n\nfunction messageOf(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/** What the gate needs of @reinconsole/mock-rails' MockFacilitator (structural). */\nexport interface MockFacilitatorLike {\n verify(paymentHeader: string, requirement: PaymentRequirement): unknown;\n settle(\n paymentHeader: string,\n requirement: PaymentRequirement,\n ): { header: string; response: { transaction: string; network: string; payer?: string } };\n}\n\n/** Wire the gate to the mock rails (offline twin; throws map to refusals). */\nexport function mockFacilitatorRails(facilitator: MockFacilitatorLike): GateRails {\n return {\n async verify(paymentHeader, requirement) {\n try {\n facilitator.verify(paymentHeader, requirement);\n } catch (err) {\n throw new GateError('verify_failed', messageOf(err));\n }\n },\n async settle(paymentHeader, requirement) {\n let settled;\n try {\n settled = facilitator.settle(paymentHeader, requirement);\n } catch (err) {\n throw new GateError('settle_failed', messageOf(err));\n }\n return {\n header: settled.header,\n transaction: settled.response.transaction,\n network: settled.response.network,\n payer: settled.response.payer,\n };\n },\n };\n}\n\n/** What the gate needs of @reinconsole/x402-rails' FacilitatorClient (structural).\n * `requirements` is untyped because the DIALECT varies per payment: v1\n * payments relay Rein's internal (v1-shaped) requirement, v2 payments the\n * converted v2 shape (see facilitatorClientRails). */\nexport interface FacilitatorClientLike {\n verify(\n payload: unknown,\n requirements: unknown,\n ): Promise<{ isValid: boolean; invalidReason?: string }>;\n settle(\n payload: unknown,\n requirements: unknown,\n ): Promise<{\n success: boolean;\n errorReason?: string;\n transaction: string;\n network: string;\n payer?: string;\n }>;\n}\n\n/**\n * Wire the gate to a real x402 facilitator client. The facilitator wants the\n * DECODED payment envelope; the gate re-decodes the header it already\n * inspected and relays the facilitator's settle response verbatim into the\n * settlement header (tx hash included). Requirements travel in the same\n * dialect the payment arrived in — a v2 envelope is verified against\n * v2-shaped (amount/CAIP-2) requirements.\n */\nexport function facilitatorClientRails(client: FacilitatorClientLike): GateRails {\n const dialectRequirements = (paymentHeader: string, requirement: PaymentRequirement) => {\n const { envelope, version } = inspectPaymentHeader(paymentHeader);\n return { envelope, requirements: version === 2 ? v2Requirements(requirement) : requirement };\n };\n return {\n async verify(paymentHeader, requirement) {\n const { envelope, requirements } = dialectRequirements(paymentHeader, requirement);\n let verified;\n try {\n verified = await client.verify(envelope, requirements);\n } catch (err) {\n classifyTransport(err);\n }\n if (!verified.isValid) {\n throw new GateError('verify_failed', verified.invalidReason ?? 'payment verification failed');\n }\n },\n async settle(paymentHeader, requirement) {\n const { envelope, requirements } = dialectRequirements(paymentHeader, requirement);\n let settled;\n try {\n settled = await client.settle(envelope, requirements);\n } catch (err) {\n classifyTransport(err);\n }\n if (!settled.success) {\n throw new GateError('settle_failed', settled.errorReason ?? 'payment settlement failed');\n }\n return {\n header: encodeSettlementHeader(settled),\n transaction: settled.transaction,\n network: settled.network,\n payer: settled.payer,\n };\n },\n };\n}\n","import { globMatch } from '@reinconsole/core';\nimport { PaymentRequirement, decimalToAtomic } from '@reinconsole/sdk';\n\n/**\n * One priced route. Anything a route doesn't override falls back to the\n * gate-level payment defaults, so most vendors only write `path` + `price`.\n */\nexport interface GateRoute {\n /** Glob over the request path, e.g. \"/api/reports/*\". First match wins. */\n path: string;\n /** HTTP method (case-insensitive); omit to price every method. */\n method?: string;\n /** Human-unit decimal price, e.g. \"0.05\". */\n price: string;\n description?: string;\n mimeType?: string;\n payTo?: string;\n network?: string;\n asset?: string;\n /** Atomic decimals of the asset (default 6, all Rein stablecoins). */\n decimals?: number;\n maxTimeoutSeconds?: number;\n /** EIP-712 domain hints etc., merged over the gate-level extra. */\n extra?: Record<string, unknown>;\n}\n\n/** Gate-level payment defaults every route inherits. */\nexport interface PaymentDefaults {\n payTo: string;\n network: string;\n asset: string;\n decimals?: number;\n maxTimeoutSeconds?: number;\n extra?: Record<string, unknown>;\n}\n\n/** First route whose method and path glob accept the request, or undefined. */\nexport function matchRoute(\n routes: readonly GateRoute[],\n method: string,\n pathname: string,\n): GateRoute | undefined {\n return routes.find(\n (route) =>\n (route.method === undefined || route.method.toUpperCase() === method.toUpperCase()) &&\n globMatch(route.path, pathname),\n );\n}\n\nexport function routeDecimals(route: GateRoute, defaults: PaymentDefaults): number {\n return route.decimals ?? defaults.decimals ?? 6;\n}\n\n/**\n * Build the v1 payment requirement this route quotes for a concrete resource\n * URL. Fully populated (description/mimeType/maxTimeoutSeconds, absolute\n * resource) because hosted facilitators validate requirements strictly.\n */\nexport function requirementFor(\n route: GateRoute,\n defaults: PaymentDefaults,\n resourceUrl: string,\n): PaymentRequirement {\n const decimals = routeDecimals(route, defaults);\n const extra: Record<string, unknown> = {\n ...(defaults.extra ?? {}),\n ...(route.extra ?? {}),\n // Non-standard decimals must travel with the quote or payers misprice.\n ...(decimals !== 6 ? { decimals } : {}),\n };\n return PaymentRequirement.parse({\n scheme: 'exact',\n network: route.network ?? defaults.network,\n maxAmountRequired: decimalToAtomic(route.price, decimals),\n resource: resourceUrl,\n description: route.description ?? '',\n mimeType: route.mimeType ?? 'application/json',\n payTo: route.payTo ?? defaults.payTo,\n maxTimeoutSeconds: route.maxTimeoutSeconds ?? defaults.maxTimeoutSeconds ?? 300,\n asset: route.asset ?? defaults.asset,\n extra: Object.keys(extra).length > 0 ? extra : undefined,\n });\n}\n","import type { GateReceipt } from '@reinconsole/core';\n\n/** Sync for in-memory stores; durable stores return a promise. */\nexport type MaybePromise<T> = T | Promise<T>;\n\n/**\n * The gate's storage seam. Two consistency classes live here, split the same\n * way the engine and graph stores are:\n *\n * - **Replay slots are security state** — the gate AWAITS `burnReplay`, and a\n * durable impl persists the burn BEFORE resolving. A payment settles only\n * after its slot is durably burned, so a crash-and-restart cannot let the\n * same header settle twice (the mock ledger, unlike the chain, would).\n * - **Receipts and counters are telemetry** — writes may trail behind\n * (cache-then-persist), with `flush()` as the error channel: it drains\n * pending writes and throws the first failure since the last flush.\n *\n * Reads are synchronous from the working set (`stats()` stays sync).\n */\nexport interface GateStorePort {\n /**\n * Check-and-burn a replay slot: returns false when this exact payment was\n * already presented. The check-and-set MUST happen synchronously at call\n * time so two concurrent copies of one header cannot both see it fresh;\n * a durable impl then persists the burn before resolving. Slots are never\n * released — a failed settle after the burn stays burned (deliberate:\n * the payer must re-quote).\n */\n burnReplay(key: string): MaybePromise<boolean>;\n /**\n * OPTIONAL: remove a burned slot (memory AND disk). The gate calls this in\n * exactly one situation — the rails PROVABLY never saw the payment\n * (`rails_unavailable`), so re-presenting the same header is safe once they\n * return. Stores that omit it leave the slot burned: conservative, the\n * payer re-signs instead. Never called after an ambiguous settle.\n */\n releaseReplay?(key: string): MaybePromise<void>;\n /** Record a settled payment's receipt (may trail; see flush). Note: the\n * receipt is the ONLY durable record of a settlement — a hard crash with\n * the tail unflushed permanently undercounts that payment's revenue. */\n appendReceipt(receipt: GateReceipt): MaybePromise<void>;\n /** Count a 402 quote served (may trail; see flush). */\n recordQuote(): MaybePromise<void>;\n /** Count a refused payment (may trail; see flush). */\n recordRefusal(): MaybePromise<void>;\n\n // Sync reads from the working set.\n receipts(): readonly GateReceipt[];\n quoted(): number;\n refused(): number;\n\n /** Durable impls: drain trailing writes, throw the first failure. */\n flush?(): Promise<void>;\n}\n\n/** In-memory gate store — the default, and the working set durable stores hydrate into. */\nexport class InMemoryGateStore implements GateStorePort {\n private readonly seenPayments = new Set<string>();\n private readonly receiptLog: GateReceipt[] = [];\n private quotedCount = 0;\n private refusedCount = 0;\n\n burnReplay(key: string): boolean {\n if (this.seenPayments.has(key)) return false;\n this.seenPayments.add(key);\n return true;\n }\n\n /**\n * Release a burned slot — on the port (optional) since the rails-unreachable\n * path, and still what a persist-then-cache impl uses to leave memory\n * untouched when its own INSERT fails.\n */\n releaseReplay(key: string): void {\n this.seenPayments.delete(key);\n }\n\n appendReceipt(receipt: GateReceipt): void {\n this.receiptLog.push(receipt);\n }\n\n recordQuote(): void {\n this.quotedCount += 1;\n }\n\n recordRefusal(): void {\n this.refusedCount += 1;\n }\n\n /** Hydration primitive for durable stores: set the resumed counter totals. */\n loadCounters(quoted: number, refused: number): void {\n this.quotedCount = quoted;\n this.refusedCount = refused;\n }\n\n receipts(): readonly GateReceipt[] {\n return this.receiptLog;\n }\n\n quoted(): number {\n return this.quotedCount;\n }\n\n refused(): number {\n return this.refusedCount;\n }\n}\n","import { isValidDecimal, type GateReceipt } from '@reinconsole/core';\n\n/**\n * Per-payer velocity limits, all sharing one rolling window. Two evidence\n * sources, deliberately different in durability:\n *\n * - `maxPayments` / `maxAmount` cap SETTLED spend and are derived from the\n * gate's receipts at check time — on a durable store they survive restarts\n * for free (receipts hydrate), and they never drift from revenue truth.\n * - `maxAttempts` caps PRESENTATIONS (any outcome) and lives in memory only —\n * refused attempts leave no durable row, so this counter resets on restart.\n * That is acceptable for what it protects against (hammering), and it keeps\n * the port unchanged.\n *\n * Limits are gate-wide per payer (no per-route caps in v0.1). A payment\n * refused for velocity is NOT replay-burned — the same signed header may be\n * re-presented once the window clears; the refusal carries Retry-After.\n */\nexport interface GateVelocity {\n /** Rolling window in milliseconds. */\n windowMs: number;\n /** Max settled payments per payer inside the window (any asset). */\n maxPayments?: number;\n /**\n * Max settled decimal amount per payer inside the window, compared per\n * asset (only receipts in the incoming payment's asset count toward it).\n * Also acts as a per-payment ceiling: a single payment above it never\n * clears, and its refusal carries no Retry-After.\n */\n maxAmount?: string;\n /** Max payment presentations per payer inside the window, any outcome. */\n maxAttempts?: number;\n}\n\n/** Fail fast on misconfiguration — a silent zero-cap gate refuses everyone. */\nexport function validateVelocity(velocity: GateVelocity): void {\n if (!Number.isFinite(velocity.windowMs) || velocity.windowMs <= 0) {\n throw new TypeError(`velocity.windowMs must be a positive number, got ${velocity.windowMs}`);\n }\n if (\n velocity.maxPayments === undefined &&\n velocity.maxAmount === undefined &&\n velocity.maxAttempts === undefined\n ) {\n throw new TypeError('velocity needs at least one of maxPayments, maxAmount, maxAttempts');\n }\n for (const key of ['maxPayments', 'maxAttempts'] as const) {\n const value = velocity[key];\n if (value !== undefined && (!Number.isInteger(value) || value <= 0)) {\n throw new TypeError(`velocity.${key} must be a positive integer, got ${value}`);\n }\n }\n if (velocity.maxAmount !== undefined && !isValidDecimal(velocity.maxAmount)) {\n throw new TypeError(`velocity.maxAmount must be a decimal string, got ${JSON.stringify(velocity.maxAmount)}`);\n }\n}\n\n/** How many keys the attempt tracker holds before sweeping expired entries. */\nconst SWEEP_THRESHOLD = 10_000;\n\n/**\n * In-memory sliding-window presentation counter, keyed by lowercased payer.\n * Every presentation counts, including refused ones — a payer hammering\n * mismatched payments is exactly who this exists for.\n */\nexport class AttemptWindow {\n private readonly hits = new Map<string, number[]>();\n\n constructor(private readonly windowMs: number) {}\n\n /** Record a presentation at `nowMs`; returns the in-window count (incl. it). */\n record(key: string, nowMs: number): number {\n if (this.hits.size >= SWEEP_THRESHOLD && !this.hits.has(key)) this.sweep(nowMs);\n const since = nowMs - this.windowMs;\n const kept = (this.hits.get(key) ?? []).filter((at) => at > since);\n kept.push(nowMs);\n this.hits.set(key, kept);\n return kept.length;\n }\n\n /**\n * Ms until the in-window count drops below `maxAttempts` — i.e. until enough\n * of the oldest hits expire that one more presentation would be admitted.\n */\n msUntilSlot(key: string, nowMs: number, maxAttempts: number): number {\n const since = nowMs - this.windowMs;\n const inWindow = (this.hits.get(key) ?? []).filter((at) => at > since);\n // When hit [count - maxAttempts] leaves the window, count falls to maxAttempts - 1.\n const gatingHit = inWindow[inWindow.length - maxAttempts];\n if (gatingHit === undefined) return 0;\n return Math.max(1, gatingHit + this.windowMs - nowMs);\n }\n\n /** Drop keys with no in-window hits (unbounded-payer protection). */\n private sweep(nowMs: number): void {\n const since = nowMs - this.windowMs;\n for (const [key, times] of this.hits) {\n const kept = times.filter((at) => at > since);\n if (kept.length === 0) this.hits.delete(key);\n else this.hits.set(key, kept);\n }\n }\n}\n\n/**\n * Receipts by `payer` (case-insensitive, EVM rule) at or after `sinceMs`,\n * oldest first — the receipt log is append-ordered and durable stores hydrate\n * it in original order, so no sort is needed.\n */\nexport function payerReceiptsSince(\n receipts: readonly GateReceipt[],\n payer: string,\n sinceMs: number,\n): GateReceipt[] {\n const key = payer.toLowerCase();\n return receipts.filter((r) => r.payer.toLowerCase() === key && r.at.getTime() >= sinceMs);\n}\n","import { EventEmitter } from 'node:events';\nimport { createHash } from 'node:crypto';\nimport { GateReceipt, gt, newId, sumDecimal, type ReinEvent } from '@reinconsole/core';\nimport { atomicToDecimal, type PaymentRequired, type PaymentRequirement } from '@reinconsole/sdk';\nimport { GateError, type GateRefusalCode } from './errors.js';\nimport { RailsUnreachableError, type GateRails, type GateSettlement } from './rails.js';\nimport {\n matchRoute,\n requirementFor,\n routeDecimals,\n type GateRoute,\n type PaymentDefaults,\n} from './routes.js';\nimport { InMemoryGateStore, type GateStorePort, type MaybePromise } from './stores.js';\nimport {\n AttemptWindow,\n payerReceiptsSince,\n validateVelocity,\n type GateVelocity,\n} from './velocity.js';\nimport { buildPaymentRequiredV2, encodeBase64Json, sameNetwork } from './v2.js';\nimport { inspectPaymentHeader, type InspectedPayment } from './wire.js';\n\n/** Wallet-address screening. Addresses compare case-insensitively (EVM rule). */\nexport interface GateScreen {\n /** If set, ONLY these payers may pay. */\n allowPayers?: readonly string[];\n /** These payers are always refused, allowlist or not. */\n denyPayers?: readonly string[];\n /**\n * Dynamic screening hook, consulted after the static lists with the payer\n * address as presented. Return a refusal reason to turn the payer away\n * (403, code `payer_denied`); return undefined to let the payment proceed.\n * Reputation-driven screening (@reinconsole/graph's `payerCheck`) plugs in here.\n */\n check?: (payer: string) => string | undefined;\n}\n\nexport interface GateOptions {\n /** Priced routes; first match wins. Unmatched requests pass through free. */\n routes: readonly GateRoute[];\n /** Settlement rails: mockFacilitatorRails(...) or facilitatorClientRails(...). */\n rails: GateRails;\n /** Default recipient address (a route can override). */\n payTo: string;\n /** Default x402 network id, e.g. \"base\" (mock rails) or \"base-sepolia\". */\n network: string;\n /** Default asset: a symbol (mock rails) or token contract address (real). */\n asset: string;\n decimals?: number;\n maxTimeoutSeconds?: number;\n /** EIP-712 domain hints etc., quoted on every requirement. */\n extra?: Record<string, unknown>;\n screen?: GateScreen;\n /**\n * Also advertise quotes on the x402 v2 wire: 402 outcomes gain a\n * `paymentRequiredHeader` (base64 PaymentRequired, CAIP-2 networks) that the\n * adapters send as `PAYMENT-REQUIRED`, alongside the unchanged v1 body —\n * dual-stack, each dialect reads its own channel. Off by default. Note the\n * gate ACCEPTS v2 payments (PAYMENT-SIGNATURE envelopes) regardless of this\n * flag; it only controls what quotes advertise.\n */\n advertiseV2?: boolean;\n /** Per-payer velocity limits (see GateVelocity). Off when omitted. */\n velocity?: GateVelocity;\n /**\n * Rails transport-failure retry policy. `attempts` counts EXTRA tries after\n * the first (default 2), spaced `backoffMs * attemptNumber` apart (default\n * 250ms; pass 0 in tests). Applies only to transport failures — a GateError\n * from the rails is a semantic verdict and is never retried. See GateRails\n * for which settle failures are retry-safe.\n */\n retry?: { attempts?: number; backoffMs?: number };\n /** Injectable clock (tests). */\n now?: () => Date;\n /**\n * Gate storage. Defaults in-memory; pass @reinconsole/store's gate store and\n * receipts, revenue stats, and burned replay slots survive restarts.\n */\n store?: GateStorePort;\n}\n\n/** The transport-agnostic request shape every adapter reduces to. */\nexport interface GateRequest {\n method: string;\n /** Absolute request URL (quoted verbatim as the requirement's resource). */\n url: string;\n /** Raw X-PAYMENT header value, or null when absent. */\n payment: string | null;\n}\n\nexport type GateOutcome =\n /** No priced route matched — the vendor serves this request for free. */\n | { kind: 'open' }\n /** No payment attached: here is what this resource costs. The optional\n * `paymentRequiredHeader` (advertiseV2) is the base64 v2 PaymentRequired\n * for the PAYMENT-REQUIRED response header. */\n | { kind: 'quote'; status: 402; body: PaymentRequired; paymentRequiredHeader?: string }\n /**\n * A payment was attached and turned away. 403 = screening, 402 = re-quote,\n * 429 = throttled (retryAfterSeconds set when a slot will free), 503 = the\n * rails failed us (`rails_unavailable` = provably unsettled, slot released;\n * `settle_unknown` = fate unknown, slot stays burned — do not re-pay blindly).\n */\n | {\n kind: 'refused';\n status: 402 | 403 | 429 | 503;\n code: GateRefusalCode;\n reason: string;\n body: unknown;\n retryAfterSeconds?: number;\n /** On 402 re-quotes with advertiseV2: the v2 PAYMENT-REQUIRED value. */\n paymentRequiredHeader?: string;\n }\n /** Verified and settled — serve, attaching settlementHeader as X-PAYMENT-RESPONSE. */\n | { kind: 'paid'; receipt: GateReceipt; settlementHeader: string };\n\nexport interface GateLineStats {\n settled: number;\n revenue: string;\n}\n\nexport interface GateStats {\n quoted: number;\n settled: number;\n refused: number;\n /** Decimal revenue grouped by asset. */\n revenue: Record<string, string>;\n /** Per route pattern. */\n routes: Record<string, GateLineStats>;\n /** Per payer (lowercased address). */\n payers: Record<string, GateLineStats>;\n}\n\n/**\n * Rein Gate — the vendor side of the wire. One gate fronts one vendor API:\n * it quotes x402 requirements for priced routes, cross-checks and screens\n * incoming payments, settles them through the configured rails, and keeps\n * vendor-side receipts so monetization is observable, not anecdotal.\n *\n * Check order for a presented payment: envelope decode -> rate limit ->\n * quote consistency (scheme/network/amount/recipient) -> payer screening ->\n * velocity caps -> replay burn -> rails verify -> rails settle. The replay\n * slot is burned BEFORE the async legs so two concurrent copies of the same\n * payment cannot both settle (the mock ledger, unlike the chain, would\n * happily double-spend); throttle refusals fire before the burn so a\n * velocity-refused header can be re-presented once its window clears.\n */\nexport class Gate {\n private readonly routes: readonly GateRoute[];\n private readonly rails: GateRails;\n private readonly defaults: PaymentDefaults;\n private readonly allowPayers: Set<string> | undefined;\n private readonly denyPayers: Set<string>;\n private readonly screenCheck: ((payer: string) => string | undefined) | undefined;\n private readonly advertiseV2: boolean;\n private readonly velocity: GateVelocity | undefined;\n private readonly attempts: AttemptWindow | undefined;\n private readonly retryPolicy: { attempts: number; backoffMs: number };\n private readonly now: () => Date;\n private readonly bus = new EventEmitter();\n private readonly store: GateStorePort;\n\n constructor(options: GateOptions) {\n this.routes = options.routes;\n this.rails = options.rails;\n this.defaults = {\n payTo: options.payTo,\n network: options.network,\n asset: options.asset,\n decimals: options.decimals,\n maxTimeoutSeconds: options.maxTimeoutSeconds,\n extra: options.extra,\n };\n this.allowPayers = options.screen?.allowPayers\n ? new Set(options.screen.allowPayers.map((a) => a.toLowerCase()))\n : undefined;\n this.denyPayers = new Set((options.screen?.denyPayers ?? []).map((a) => a.toLowerCase()));\n this.screenCheck = options.screen?.check;\n this.advertiseV2 = options.advertiseV2 ?? false;\n if (options.velocity) validateVelocity(options.velocity);\n this.velocity = options.velocity;\n this.attempts = options.velocity?.maxAttempts\n ? new AttemptWindow(options.velocity.windowMs)\n : undefined;\n this.retryPolicy = {\n attempts: options.retry?.attempts ?? 2,\n backoffMs: options.retry?.backoffMs ?? 250,\n };\n this.now = options.now ?? (() => new Date());\n this.store = options.store ?? new InMemoryGateStore();\n }\n\n onEvent(handler: (event: ReinEvent) => void): void {\n this.bus.on('event', handler);\n }\n\n get receipts(): readonly GateReceipt[] {\n return this.store.receipts();\n }\n\n /** Drain trailing telemetry writes; throws the first failure (durable stores). */\n async flush(): Promise<void> {\n await this.store.flush?.();\n }\n\n /** Telemetry writes may trail (cache-then-persist) — a store failure,\n * rejected OR thrown synchronously, must surface through flush() and can\n * never alter a payment outcome (a receipt write turning a SETTLED payment\n * into a 500 would charge the payer and serve nothing). */\n private fire(write: () => MaybePromise<void>): void {\n try {\n void Promise.resolve(write()).catch(() => undefined);\n } catch {\n // swallowed by design — see above\n }\n }\n\n /** The requirement a given request would be quoted (or undefined if free). */\n quoteFor(method: string, url: string): PaymentRequirement | undefined {\n const route = matchRoute(this.routes, method, new URL(url).pathname);\n return route && requirementFor(route, this.defaults, url);\n }\n\n async handle(request: GateRequest): Promise<GateOutcome> {\n const url = new URL(request.url);\n const method = (request.method || 'GET').toUpperCase();\n const route = matchRoute(this.routes, method, url.pathname);\n if (!route) return { kind: 'open' };\n\n const requirement = requirementFor(route, this.defaults, request.url);\n const amount = atomicToDecimal(\n requirement.maxAmountRequired,\n routeDecimals(route, this.defaults),\n );\n\n if (request.payment === null) {\n this.fire(() => this.store.recordQuote());\n this.emit({\n type: 'gate.quoted',\n at: this.now(),\n resource: url.pathname,\n method,\n amount,\n asset: requirement.asset,\n network: requirement.network,\n });\n return {\n kind: 'quote',\n status: 402,\n body: { x402Version: 1, accepts: [requirement], error: 'X-PAYMENT header is required' },\n ...this.v2Quote(requirement, 'PAYMENT-SIGNATURE header is required'),\n };\n }\n\n let payer: string | undefined;\n try {\n const payment = inspectPaymentHeader(request.payment);\n payer = payment.payer;\n this.checkRate(payment.payer);\n this.checkConsistency(payment, requirement);\n this.screenPayer(payment.payer);\n this.checkVelocity(payment.payer, requirement, amount);\n await this.burnReplay(request.payment);\n const settlement = await this.settleThroughRails(request.payment, requirement);\n\n const receipt = GateReceipt.parse({\n id: newId('grc'),\n at: this.now(),\n route: route.path,\n resource: url.pathname,\n method,\n payer: payment.payer,\n payTo: requirement.payTo,\n amount,\n amountAtomic: requirement.maxAmountRequired,\n asset: requirement.asset,\n network: requirement.network,\n transaction: settlement.transaction,\n });\n this.fire(() => this.store.appendReceipt(receipt));\n this.emit({ type: 'gate.settled', at: receipt.at, receipt });\n return { kind: 'paid', receipt, settlementHeader: settlement.header };\n } catch (err) {\n if (!(err instanceof GateError)) throw err;\n return this.refuse(err, url.pathname, requirement, payer);\n }\n }\n\n stats(): GateStats {\n const receipts = this.store.receipts();\n const revenue: Record<string, string[]> = {};\n const routes: Record<string, { settled: number; amounts: string[] }> = {};\n const payers: Record<string, { settled: number; amounts: string[] }> = {};\n for (const receipt of receipts) {\n (revenue[receipt.asset] ??= []).push(receipt.amount);\n const routeLine = (routes[receipt.route] ??= { settled: 0, amounts: [] });\n routeLine.settled += 1;\n routeLine.amounts.push(receipt.amount);\n const payerLine = (payers[receipt.payer.toLowerCase()] ??= { settled: 0, amounts: [] });\n payerLine.settled += 1;\n payerLine.amounts.push(receipt.amount);\n }\n const sumLines = (lines: Record<string, { settled: number; amounts: string[] }>) =>\n Object.fromEntries(\n Object.entries(lines).map(([key, line]) => [\n key,\n { settled: line.settled, revenue: sumDecimal(line.amounts) },\n ]),\n );\n return {\n quoted: this.store.quoted(),\n settled: receipts.length,\n refused: this.store.refused(),\n revenue: Object.fromEntries(\n Object.entries(revenue).map(([asset, amounts]) => [asset, sumDecimal(amounts)]),\n ),\n routes: sumLines(routes),\n payers: sumLines(payers),\n };\n }\n\n private emit(event: ReinEvent): void {\n this.bus.emit('event', event);\n }\n\n private checkConsistency(payment: InspectedPayment, requirement: PaymentRequirement): void {\n if (payment.scheme.toLowerCase() !== requirement.scheme.toLowerCase()) {\n throw new GateError(\n 'scheme_mismatch',\n `payment scheme \"${payment.scheme}\" does not match the quoted \"${requirement.scheme}\"`,\n );\n }\n // Compared through CAIP-2 normalization: a v2 payment naming\n // \"eip155:84532\" matches a gate configured with v1's \"base-sepolia\".\n if (!sameNetwork(payment.network, requirement.network)) {\n throw new GateError(\n 'network_mismatch',\n `payment is on \"${payment.network}\" but the quote wants \"${requirement.network}\"`,\n );\n }\n if (payment.value !== requirement.maxAmountRequired) {\n throw new GateError(\n 'amount_mismatch',\n `payment of ${payment.value} does not match the quoted ${requirement.maxAmountRequired}`,\n );\n }\n if (payment.to.toLowerCase() !== requirement.payTo.toLowerCase()) {\n throw new GateError(\n 'recipient_mismatch',\n `payment pays \"${payment.to}\" but the quote pays \"${requirement.payTo}\"`,\n );\n }\n }\n\n /**\n * Presentation rate limit — first check after decode, so a hammering payer\n * is shed before any further work. Every presentation counts, including\n * ones that would go on to fail consistency or screening.\n */\n private checkRate(payer: string): void {\n const max = this.velocity?.maxAttempts;\n if (!max || !this.attempts) return;\n const key = payer.toLowerCase();\n const nowMs = this.now().getTime();\n if (this.attempts.record(key, nowMs) > max) {\n const retryAfterSeconds = Math.ceil(this.attempts.msUntilSlot(key, nowMs, max) / 1000);\n throw new GateError(\n 'rate_limited',\n `payer ${payer} exceeded ${max} payment presentations per ${this.velocity!.windowMs}ms`,\n { retryAfterSeconds },\n );\n }\n }\n\n /**\n * Settled-spend velocity caps, derived from receipts at check time (restart\n * -safe on durable stores). Runs BEFORE the replay burn on purpose: a\n * velocity refusal is temporal, not a payment defect, so the same signed\n * header may come back once the window clears.\n */\n private checkVelocity(payer: string, requirement: PaymentRequirement, amount: string): void {\n const v = this.velocity;\n if (!v || (v.maxPayments === undefined && v.maxAmount === undefined)) return;\n const nowMs = this.now().getTime();\n const recent = payerReceiptsSince(this.store.receipts(), payer, nowMs - v.windowMs);\n\n const oldest = recent[0];\n if (v.maxPayments !== undefined && oldest !== undefined && recent.length >= v.maxPayments) {\n const retryAfterSeconds = secondsUntil(oldest.at.getTime() + v.windowMs, nowMs);\n throw new GateError(\n 'velocity_exceeded',\n `payer ${payer} already settled ${recent.length} payments in the last ${v.windowMs}ms; the cap is ${v.maxPayments}`,\n { retryAfterSeconds },\n );\n }\n\n if (v.maxAmount !== undefined) {\n const sameAsset = recent.filter((r) => r.asset === requirement.asset);\n const oldestSameAsset = sameAsset[0];\n const wouldBe = sumDecimal([...sameAsset.map((r) => r.amount), amount]);\n if (gt(wouldBe, v.maxAmount)) {\n // No Retry-After when the window is already empty — a single payment\n // above the cap will never clear, and saying \"try later\" would lie.\n const retryAfterSeconds =\n oldestSameAsset !== undefined\n ? secondsUntil(oldestSameAsset.at.getTime() + v.windowMs, nowMs)\n : undefined;\n throw new GateError(\n 'velocity_exceeded',\n `settling ${amount} ${requirement.asset} would put payer ${payer} at ${wouldBe} in the last ${v.windowMs}ms; the cap is ${v.maxAmount}`,\n { retryAfterSeconds },\n );\n }\n }\n }\n\n /**\n * Drive both rails legs under the retry policy (see GateRails for the error\n * taxonomy). GateErrors are semantic verdicts and pass straight through.\n * Transport failures:\n *\n * - verify (read-only): every transport failure is retried; exhausted ->\n * `rails_unavailable`, and the slot is released (settle never ran).\n * - settle: only RailsUnreachableError (provably never sent) is retried;\n * exhausted -> `rails_unavailable` + release (still provably unsettled).\n * Anything else is ambiguous — the money MAY have moved — so it refuses\n * `settle_unknown` immediately and the slot STAYS burned: on real rails a\n * re-present would misreport (nonce already used -> settle_failed), and on\n * the mock ledger it would double-spend. Vendors reconcile ambiguous\n * settles against transaction records (e.g. the on-chain indexer).\n */\n private async settleThroughRails(\n paymentHeader: string,\n requirement: PaymentRequirement,\n ): Promise<GateSettlement> {\n await this.railsLeg('verify', paymentHeader, () =>\n this.rails.verify(paymentHeader, requirement),\n );\n return this.railsLeg('settle', paymentHeader, () =>\n this.rails.settle(paymentHeader, requirement),\n );\n }\n\n private async railsLeg<T>(\n leg: 'verify' | 'settle',\n paymentHeader: string,\n fn: () => Promise<T>,\n ): Promise<T> {\n const { attempts, backoffMs } = this.retryPolicy;\n let lastErr: unknown;\n for (let attempt = 0; attempt <= attempts; attempt++) {\n if (attempt > 0 && backoffMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, backoffMs * attempt));\n }\n try {\n return await fn();\n } catch (err) {\n if (err instanceof GateError) throw err;\n if (leg === 'settle' && !(err instanceof RailsUnreachableError)) {\n throw new GateError(\n 'settle_unknown',\n `settlement fate unknown (${messageOf(err)}); do not re-pay before reconciling`,\n );\n }\n lastErr = err;\n }\n }\n // Exhausted retries on provably-unsettled failures: the payment did not\n // happen. Release the slot so the same header can retry when rails return;\n // a failed release just leaves it burned (conservative).\n try {\n await this.store.releaseReplay?.(replayKey(paymentHeader));\n } catch {\n // slot stays burned — the payer re-signs instead\n }\n throw new GateError(\n 'rails_unavailable',\n `payment rails unreachable after ${attempts + 1} attempts (${messageOf(lastErr)}); the payment was NOT settled`,\n );\n }\n\n private screenPayer(payer: string): void {\n const key = payer.toLowerCase();\n if (this.denyPayers.has(key)) {\n throw new GateError('payer_denied', `payer ${payer} is blocked by this gate`);\n }\n if (this.allowPayers && !this.allowPayers.has(key)) {\n throw new GateError('payer_not_allowed', `payer ${payer} is not on this gate's allowlist`);\n }\n const reason = this.screenCheck?.(payer);\n if (reason) {\n throw new GateError('payer_denied', reason);\n }\n }\n\n /**\n * Burn the replay slot. The store's check-and-set is sync at call time\n * (concurrent copies cannot both pass); the await is the durability barrier\n * — on a durable store the burn is on disk before verify/settle run, so a\n * crash mid-settle cannot resurrect the slot on restart. A store WRITE\n * failure is not a GateError: it escapes as a 500, because \"we cannot\n * guarantee replay protection\" must never settle a payment.\n */\n private async burnReplay(paymentHeader: string): Promise<void> {\n if (!(await this.store.burnReplay(replayKey(paymentHeader)))) {\n throw new GateError(\n 'payment_replayed',\n 'this exact payment was already presented; one settlement per payment',\n );\n }\n }\n\n private refuse(\n err: GateError,\n resource: string,\n requirement: PaymentRequirement,\n payer: string | undefined,\n ): GateOutcome {\n this.fire(() => this.store.recordRefusal());\n this.emit({\n type: 'gate.refused',\n at: this.now(),\n code: err.code,\n reason: err.message,\n resource,\n payer,\n });\n const retry =\n err.retryAfterSeconds !== undefined ? { retryAfterSeconds: err.retryAfterSeconds } : {};\n if (err.code === 'payer_denied' || err.code === 'payer_not_allowed') {\n return {\n kind: 'refused',\n status: 403,\n code: err.code,\n reason: err.message,\n body: { error: 'refused', code: err.code, reason: err.message },\n };\n }\n if (err.code === 'rate_limited' || err.code === 'velocity_exceeded') {\n return {\n kind: 'refused',\n status: 429,\n code: err.code,\n reason: err.message,\n body: { error: 'refused', code: err.code, reason: err.message, ...retry },\n ...retry,\n };\n }\n if (err.code === 'rails_unavailable' || err.code === 'settle_unknown') {\n // No accepts re-quote: after settle_unknown a re-pay could double-charge,\n // and rails_unavailable means the SAME header will work later.\n return {\n kind: 'refused',\n status: 503,\n code: err.code,\n reason: err.message,\n body: {\n error: 'refused',\n code: err.code,\n reason: err.message,\n retriable: err.code === 'rails_unavailable',\n },\n };\n }\n // Payment problems re-quote per the x402 spec: 402 + accepts + error.\n return {\n kind: 'refused',\n status: 402,\n code: err.code,\n reason: err.message,\n body: { x402Version: 1, accepts: [requirement], error: err.message },\n ...this.v2Quote(requirement, err.message),\n };\n }\n\n /** The v2 half of a dual-stack 402 (see advertiseV2), or nothing. */\n private v2Quote(\n requirement: PaymentRequirement,\n error: string,\n ): { paymentRequiredHeader: string } | Record<string, never> {\n if (!this.advertiseV2) return {};\n return {\n paymentRequiredHeader: encodeBase64Json(buildPaymentRequiredV2(requirement, error)),\n };\n }\n}\n\nexport function createGate(options: GateOptions): Gate {\n return new Gate(options);\n}\n\n/** The replay-slot key: hash of the exact header bytes as presented. */\nfunction replayKey(paymentHeader: string): string {\n return createHash('sha256').update(paymentHeader).digest('hex');\n}\n\nfunction messageOf(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/** Whole seconds (>= 1) from nowMs until atMs — Retry-After semantics. */\nfunction secondsUntil(atMs: number, nowMs: number): number {\n return Math.max(1, Math.ceil((atMs - nowMs) / 1000));\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Gate, GateOutcome } from './gate.js';\n\nexport interface GateMiddlewareOptions {\n /**\n * Origin used to absolutize req.url for quotes, e.g. \"https://api.vendor.com\".\n * Defaults to http://<Host header> — set this when serving behind TLS/proxies\n * so quoted resources match what agents actually requested.\n */\n origin?: string;\n /** Called with every outcome — the vendor's observability hook. */\n onOutcome?: (outcome: GateOutcome, req: IncomingMessage) => void;\n}\n\n/**\n * Drop the gate in front of any Node HTTP handler. Express-compatible\n * `(req, res, next)` signature; with a raw `node:http` server, pass your\n * content handler as `next`:\n *\n * const paywall = gateMiddleware(gate);\n * http.createServer((req, res) => paywall(req, res, () => serve(req, res)));\n *\n * Free and paid requests reach `next()` (paid ones with X-PAYMENT-RESPONSE\n * already set on the response); quotes and refusals are answered here and\n * never reach the vendor's handler.\n */\nexport function gateMiddleware(gate: Gate, options: GateMiddlewareOptions = {}) {\n return (req: IncomingMessage, res: ServerResponse, next: () => void): void => {\n void (async () => {\n const origin = options.origin ?? `http://${req.headers.host ?? 'localhost'}`;\n const url = new URL(req.url ?? '/', origin).toString();\n // Dual-stack: v2 payers send PAYMENT-SIGNATURE, v1 payers X-PAYMENT.\n const raw = req.headers['payment-signature'] ?? req.headers['x-payment'];\n const payment = (Array.isArray(raw) ? raw[0] : raw) ?? null;\n\n const outcome = await gate.handle({ method: req.method ?? 'GET', url, payment });\n options.onOutcome?.(outcome, req);\n\n if (outcome.kind === 'open') return next();\n if (outcome.kind === 'paid') {\n // Both dialect names carry the same base64 settlement object.\n res.setHeader('X-PAYMENT-RESPONSE', outcome.settlementHeader);\n res.setHeader('PAYMENT-RESPONSE', outcome.settlementHeader);\n return next();\n }\n res.writeHead(outcome.status, {\n 'content-type': 'application/json',\n ...(outcome.paymentRequiredHeader !== undefined\n ? { 'payment-required': outcome.paymentRequiredHeader }\n : {}),\n ...(outcome.kind === 'refused' && outcome.retryAfterSeconds !== undefined\n ? { 'retry-after': String(outcome.retryAfterSeconds) }\n : {}),\n });\n res.end(JSON.stringify(outcome.body));\n })().catch((err: unknown) => {\n // A rails outage must not crash the vendor's server: answer 500, move on.\n const message = err instanceof Error ? err.message : String(err);\n if (!res.headersSent) res.writeHead(500, { 'content-type': 'application/json' });\n res.end(JSON.stringify({ error: 'internal_error', message }));\n });\n };\n}\n","import type { FetchLike } from '@reinconsole/sdk';\nimport type { Gate } from './gate.js';\n\nexport interface GatedFetchOptions {\n /** Serves the actual content once the gate clears a request. */\n serve?: (request: { url: string; method: string }) => Response | Promise<Response>;\n}\n\nconst defaultServe = () =>\n new Response(JSON.stringify({ ok: true }), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n\n/**\n * The gate as an in-process vendor fetch — a drop-in replacement for\n * createMockVendor()/createRealVendor() anywhere a FetchLike vendor is\n * composed (guard tests, demos, the console world), with the gate's pricing,\n * screening, replay protection, and receipts in the loop.\n */\nexport function createGatedFetch(gate: Gate, options: GatedFetchOptions = {}): FetchLike {\n const serve = options.serve ?? defaultServe;\n\n return async (input, init) => {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const method =\n init?.method ?? (input instanceof Request ? input.method : 'GET');\n const headers = new Headers(\n init?.headers ?? (input instanceof Request ? input.headers : undefined),\n );\n\n const outcome = await gate.handle({\n method,\n url,\n // Dual-stack: v2 payers send PAYMENT-SIGNATURE, v1 payers X-PAYMENT.\n payment: headers.get('PAYMENT-SIGNATURE') ?? headers.get('X-PAYMENT'),\n });\n\n if (outcome.kind === 'open') return serve({ url, method });\n if (outcome.kind === 'paid') {\n const response = await serve({ url, method });\n const merged = new Headers(response.headers);\n merged.set('X-PAYMENT-RESPONSE', outcome.settlementHeader);\n merged.set('PAYMENT-RESPONSE', outcome.settlementHeader);\n return new Response(response.body, { status: response.status, headers: merged });\n }\n return new Response(JSON.stringify(outcome.body), {\n status: outcome.status,\n headers: {\n 'content-type': 'application/json',\n ...(outcome.paymentRequiredHeader !== undefined\n ? { 'payment-required': outcome.paymentRequiredHeader }\n : {}),\n ...(outcome.kind === 'refused' && outcome.retryAfterSeconds !== undefined\n ? { 'retry-after': String(outcome.retryAfterSeconds) }\n : {}),\n },\n });\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@reinconsole/gate",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Rein Gate — vendor-side x402 monetization middleware. Price your routes, verify and settle agent payments, screen payers, and get receipts and revenue observability from one middleware.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/bugiiiii11/rein#readme",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/bugiiiii11/rein.git",
|
|
10
|
+
"directory": "packages/gate"
|
|
11
|
+
},
|
|
12
|
+
"bugs": "https://github.com/bugiiiii11/rein/issues",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"rein",
|
|
15
|
+
"x402",
|
|
16
|
+
"402",
|
|
17
|
+
"micropayments",
|
|
18
|
+
"api-monetization",
|
|
19
|
+
"middleware",
|
|
20
|
+
"usdc",
|
|
21
|
+
"ai-agents"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=22"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"type": "module",
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.js",
|
|
35
|
+
"require": "./dist/index.cjs"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"main": "./dist/index.cjs",
|
|
39
|
+
"module": "./dist/index.js",
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"files": [
|
|
42
|
+
"dist"
|
|
43
|
+
],
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"zod": "^3.24.1",
|
|
46
|
+
"@reinconsole/core": "^0.1.0",
|
|
47
|
+
"@reinconsole/sdk": "^0.1.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^22.10.0",
|
|
51
|
+
"tsup": "^8.3.5",
|
|
52
|
+
"typescript": "^5.7.2",
|
|
53
|
+
"vitest": "^2.1.8",
|
|
54
|
+
"@reinconsole/policy-engine": "0.1.0",
|
|
55
|
+
"@reinconsole/mock-rails": "0.1.0",
|
|
56
|
+
"@reinconsole/x402-rails": "0.1.0"
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "tsup",
|
|
60
|
+
"dev": "tsup --watch",
|
|
61
|
+
"typecheck": "tsc --noEmit",
|
|
62
|
+
"test": "vitest run",
|
|
63
|
+
"test:watch": "vitest",
|
|
64
|
+
"clean": "rimraf dist .turbo"
|
|
65
|
+
}
|
|
66
|
+
}
|