Skip to content

Commit fe690d8

Browse files
committed
feat(reactive-rpc): 🎸 add ability to store response codec in RpcCodec
1 parent 3f43171 commit fe690d8

File tree

3 files changed

+14
-8
lines changed

3 files changed

+14
-8
lines changed

src/__tests__/reactive-rpc/uws/ws/rx-rpc/RpcPersistentClient.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ if (process.env.TEST_E2E) {
5353
const setup: ApiTestSetup = async () => {
5454
const port = +(process.env.PORT || 9999);
5555
const url = `ws://localhost:${port}/rpc`;
56-
const codec = new RpcCodec(reqCodec, msgCodec);
56+
const codec = new RpcCodec(msgCodec, reqCodec, resCodec);
5757
const client = new RpcPersistentClient({
5858
codec,
5959
channel: {
6060
newChannel: () =>
6161
new WebSocketChannel({
62-
newSocket: () => new WebSocket(url, [protocolSpecifier]) as any,
62+
newSocket: () => new WebSocket(url, [codec.specifier()]) as any,
6363
}),
6464
},
6565
});
Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
1+
import type {RpcSpecifier} from '../rpc';
12
import type {ReactiveRpcMessage} from '../messages';
23
import type {JsonValueCodec} from '../../../json-pack/codecs/types';
34
import type {RpcMessageCodec} from './types';
45

56
export class RpcCodec {
6-
constructor(public readonly valueCodec: JsonValueCodec, public readonly messageCodec: RpcMessageCodec) {}
7+
constructor(public readonly msg: RpcMessageCodec, public readonly req: JsonValueCodec, public readonly res: JsonValueCodec) {}
8+
9+
public specifier(): RpcSpecifier {
10+
const specifier = `rpc.${this.msg.id}.${this.req.id}` + (this.req.id !== this.res.id ? `-${this.res.id}` : '');
11+
return specifier as RpcSpecifier;
12+
}
713

814
public encode(messages: ReactiveRpcMessage[]): Uint8Array {
9-
const valueCodec = this.valueCodec;
15+
const valueCodec = this.res;
1016
const encoder = valueCodec.encoder;
1117
const writer = encoder.writer;
1218
writer.reset();
13-
this.messageCodec.encodeBatch(valueCodec, messages);
19+
this.msg.encodeBatch(valueCodec, messages);
1420
return writer.flush();
1521
}
1622

1723
public decode(data: Uint8Array): ReactiveRpcMessage[] {
18-
const valueCodec = this.valueCodec;
24+
const valueCodec = this.req;
1925
const decoder = valueCodec.decoder;
2026
const reader = decoder.reader;
2127
reader.reset(data);
22-
return this.messageCodec.decodeBatch(valueCodec, data);
28+
return this.msg.decodeBatch(valueCodec, data);
2329
}
2430
}

src/reactive-rpc/common/rpc/__tests__/RpcPersistentClient.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ test('on remote method execution, sends message over WebSocket only once', async
1515
const ws = new Ws('');
1616
const valueCodecs = new Codecs(new Writer(128));
1717
const messageCodecs = new RpcMessageCodecs();
18-
const codec = new RpcCodec(valueCodecs.cbor, messageCodecs.compact);
18+
const codec = new RpcCodec(messageCodecs.compact, valueCodecs.cbor, valueCodecs.cbor);
1919
const client = new RpcPersistentClient({
2020
channel: {
2121
newChannel: () =>

0 commit comments

Comments
 (0)