diff --git a/.changeset/beige-years-hug.md b/.changeset/beige-years-hug.md new file mode 100644 index 00000000000..16bd59fc179 --- /dev/null +++ b/.changeset/beige-years-hug.md @@ -0,0 +1,5 @@ +--- +"@effect/rpc": patch +--- + +Fix JsonRpc client message handling diff --git a/packages/rpc/src/RpcClient.ts b/packages/rpc/src/RpcClient.ts index b01871f7031..1708ddbbf83 100644 --- a/packages/rpc/src/RpcClient.ts +++ b/packages/rpc/src/RpcClient.ts @@ -848,7 +848,8 @@ export const makeProtocolHttp = (client: HttpClient.HttpClient): Effect.Effect< if (isJson) { return client.post("", { body }).pipe( - Effect.flatMap((r) => r.json), + Effect.flatMap((r) => r.text), + Effect.map((text) => parser.decode(text)), Effect.mapError((cause) => new RpcClientError({ reason: "Protocol", diff --git a/packages/rpc/src/RpcSerialization.ts b/packages/rpc/src/RpcSerialization.ts index 4286c3e1c4b..461889bbec2 100644 --- a/packages/rpc/src/RpcSerialization.ts +++ b/packages/rpc/src/RpcSerialization.ts @@ -36,7 +36,13 @@ export const json: RpcSerialization["Type"] = RpcSerialization.of({ unsafeMake: () => { const decoder = new TextDecoder() return { - decode: (bytes) => [JSON.parse(typeof bytes === "string" ? bytes : decoder.decode(bytes))], + decode: (bytes) => { + const decoded = JSON.parse(typeof bytes === "string" ? bytes : decoder.decode(bytes)) + if (Array.isArray(decoded)) { + return decoded + } + return [decoded] + }, encode: (response) => JSON.stringify(response) } }