diff --git a/src/adapters/http/index.ts b/src/adapters/http/index.ts index 7959c4c..e4316ae 100644 --- a/src/adapters/http/index.ts +++ b/src/adapters/http/index.ts @@ -23,8 +23,11 @@ export { export type { CredentialPatchOutcome } from "./http-contract-bridge.ts"; /** * V2 legacy. operationId + `LegacyHttpInput`으로 호출하는 범용 클라이언트다. - * 새 코드는 위의 V3 실행기를 쓴다. 남아 있는 이유는 계약이 아직 없는 - * 오퍼레이션을 위한 이행 경로이기 때문이다. + * 새 코드는 위의 V3 실행기를 쓴다. + * + * 이 템플릿은 V2의 오퍼레이션 레지스트리와 payload 매퍼를 비워서 출하한다. + * 제품이 `RuntimeHttpContract`(`src/bootstrap/runtime-adapters.ts`)의 네 + * 슬롯을 주입해야 동작한다 — 주입 없이 V3에서 되돌리면 모든 요청이 실패한다. */ export { createHttpClient, diff --git a/src/bootstrap/runtime-adapters.ts b/src/bootstrap/runtime-adapters.ts index 4d97f5a..fd39f2e 100644 --- a/src/bootstrap/runtime-adapters.ts +++ b/src/bootstrap/runtime-adapters.ts @@ -63,6 +63,21 @@ import { } from "../contracts/query-invalidation.ts"; type HttpClientDependencies = Parameters[0]; +/** + * 제품이 V2 전송을 쓰려면 채워야 하는 슬롯 네 개. + * + * 이 템플릿은 넷 다 비워서 출하한다. 기본값인 + * `contracts/api-operations.ts`의 `API_OPERATIONS`는 빈 객체이고 + * `adapters/http/resource-mapper.ts`의 `mapOperationPayload`는 항상 + * `MAPPING_INVARIANT_REJECTED`를 반환한다. 그래서 **이 레포 상태 그대로는 + * V2로 어떤 오퍼레이션도 실행되지 않는다** — 그건 결함이 아니라 제품이 + * 채우는 자리다. + * + * V2를 rollback/compatibility 경로로 쓰려는 제품은 이 네 슬롯을 주입해야 + * 한다. 주입하지 않은 채 V3에서 되돌리면 모든 요청이 실패한다. + * V3(`createContractHttpExecutor`)는 설치된 feature 계약에서 오퍼레이션을 + * 받으므로 이 슬롯과 무관하게 동작한다. + */ export type RuntimeHttpContract = Pick< HttpClientDependencies, "getOperation" | "validatePayload" | "validateRequest" | "mapPayload"