feat(registry-envelope-integration): update execute(), call, subscribe, env to return ResponseEnvelope
- OperationRegistry.execute() now returns Promise<ResponseEnvelope<TOutput>> - Applies shared result pipeline: detect → wrap → normalize → validate - Uses KindGuard.IsUnknown() to check if Value.Cast should be applied - PendingRequestMap.call() returns Promise<ResponseEnvelope> - PendingRequestMap.respond() validates envelope via isResponseEnvelope() - CallHandler captures handler result, wraps, normalizes, validates, publishes - CallEventSchema call.responded.output changed to ResponseEnvelopeSchema - subscribe() yields ResponseEnvelope with isResponseEnvelope() passthrough - OperationEnv inner functions return Promise<ResponseEnvelope> - Tests updated for all new return types and behaviors - 171 tests passing, build and lint clean
This commit is contained in:
@@ -2,6 +2,7 @@ import { describe, it, expect } from "vitest";
|
||||
import { OperationRegistry, OperationType, buildEnv, type IOperationDefinition, type OperationContext } from "../src/index.js";
|
||||
import * as Type from "@alkdev/typebox";
|
||||
import { PendingRequestMap } from "../src/call.js";
|
||||
import { localEnvelope, isResponseEnvelope, type ResponseEnvelope } from "../src/response-envelope.js";
|
||||
|
||||
function makeOperation(name: string, handler?: any): IOperationDefinition {
|
||||
return {
|
||||
@@ -33,7 +34,9 @@ describe("buildEnv", () => {
|
||||
expect(typeof env.test.writeFile).toBe("function");
|
||||
|
||||
const result = await env.test.readFile({ value: "test" });
|
||||
expect(result).toEqual({ result: "test" });
|
||||
expect(isResponseEnvelope(result)).toBe(true);
|
||||
expect(result.meta.source).toBe("local");
|
||||
expect(result.data).toEqual({ result: "test" });
|
||||
});
|
||||
|
||||
it("filters out SUBSCRIPTION operations", () => {
|
||||
@@ -76,8 +79,8 @@ describe("buildEnv", () => {
|
||||
registry.register(makeOperation("readFile"));
|
||||
|
||||
const callMap = {
|
||||
call: async (opId: string, input: unknown, opts?: any) => {
|
||||
return { result: `routed: ${opId}` };
|
||||
call: async (opId: string, input: unknown, opts?: any): Promise<ResponseEnvelope> => {
|
||||
return localEnvelope({ result: `routed: ${opId}` }, opId);
|
||||
},
|
||||
};
|
||||
|
||||
@@ -88,6 +91,7 @@ describe("buildEnv", () => {
|
||||
});
|
||||
|
||||
const result = await env.test.readFile({ value: "test" });
|
||||
expect(result).toEqual({ result: "routed: test.readFile" });
|
||||
expect(isResponseEnvelope(result)).toBe(true);
|
||||
expect(result.data).toEqual({ result: "routed: test.readFile" });
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user