





















@@ -860,6 +860,31 @@ describe("kitchen-sink RPC payload unwrapping", () => {
860860});
861861});
862862863+it("preserves gateway request error metadata from built RPC calls", () => {
864+const error = captureSyncError(() =>
865+unwrapRpcPayload({
866+ok: false,
867+error: {
868+type: "gateway_request_error",
869+code: "INVALID_REQUEST",
870+message: "unauthorized role: operator",
871+details: { method: "skills.bins" },
872+retryable: false,
873+retryAfterMs: 250,
874+},
875+}),
876+);
877+878+expect(error).toMatchObject({
879+name: "GatewayClientRequestError",
880+message: "unauthorized role: operator",
881+gatewayCode: "INVALID_REQUEST",
882+details: { method: "skills.bins" },
883+retryable: false,
884+retryAfterMs: 250,
885+});
886+});
887+863888it("bounds failed RPC payload diagnostics", () => {
864889const error = captureSyncError(() =>
865890unwrapRpcPayload({
@@ -983,6 +1008,19 @@ describe("kitchen-sink RPC command catalog assertions", () => {
9831008});
9841009}),
9851010).resolves.toBeUndefined();
1011+await expect(
1012+assertOperatorRpcDenied({ method: "skills.bins", params: {} }, async () =>
1013+unwrapRpcPayload({
1014+ok: false,
1015+error: {
1016+type: "gateway_request_error",
1017+code: "INVALID_REQUEST",
1018+message: "unauthorized role: operator",
1019+retryable: false,
1020+},
1021+}),
1022+),
1023+).resolves.toBeUndefined();
9861024await expect(
9871025assertOperatorRpcDenied({ method: "skills.bins", params: {} }, async () => {
9881026throw new Error(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。