PR R: FIN-link sandbox service #22

Merged
nsatoshi merged 1 commits from devin/1776883027-pr-r-fin-sandbox into main 2026-04-22 20:30:47 +00:00

1 Commits

Author SHA1 Message Date
Devin
7c5dd145d6 FIN-link sandbox service
Some checks failed
CI / Frontend Lint (pull_request) Failing after 6s
CI / Frontend Type Check (pull_request) Failing after 5s
CI / Frontend Build (pull_request) Failing after 7s
CI / Frontend E2E Tests (pull_request) Failing after 8s
CI / Orchestrator Build (pull_request) Failing after 7s
CI / Contracts Compile (pull_request) Failing after 5s
CI / Contracts Test (pull_request) Failing after 6s
Code Quality / SonarQube Analysis (pull_request) Failing after 18s
Code Quality / Code Quality Checks (pull_request) Failing after 4s
Security Scan / Dependency Vulnerability Scan (pull_request) Failing after 4s
Security Scan / OWASP ZAP Scan (pull_request) Failing after 4s
Closes gap-analysis v2 §7.1 (no FIN-link adapter; SWIFT generators
produce strings but no transport) + §10.6 (stand up sandbox transport).

- services/finLink/sandbox.ts — in-process FIN-link sandbox.
  Accepts POST /dispatch with a SWIFT/ISO payload, assigns a FIN
  reference, and advances messages deterministically through
  received -> acknowledged -> accepted -> settled (with reject as a
  terminal fork). Optional webhook per-message (x-fin-sandbox-signature
  header, HMAC-SHA256). Timer-driven auto-progress opt-in via
  startAutoProgress().
- services/finLink/client.ts — two client adapters:
    createHttpFinLinkClient(baseUrl) - for the live router
    createInProcessFinLinkClient()   - for unit tests that skip
                                       the HTTP hop
  getFinLinkClient() picks HTTP when FIN_SANDBOX_URL is set, else
  falls back to in-process.
- services/finLink/index.ts — public surface.
- src/index.ts — mounts /fin-sandbox only when
  FIN_SANDBOX_ENABLED=true; off by default to keep prod surface clean.
- tests/unit/finLinkSandbox.test.ts — 12 tests covering lifecycle,
  rejection, listing, signature determinism, HTTP endpoints
  (dispatch/advance/messages/filtering), and both client adapters
  (including a live ephemeral-port HTTP round-trip).
- Verification: tsc --noEmit clean; full jest 92/92 passing
  (8 suites).
2026-04-22 18:39:31 +00:00