All files / rpc-codec/src RpcCodec.ts

100% Statements 8/8
50% Branches 2/4
100% Functions 4/4
100% Lines 8/8

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29                1x   5x 5x 5x       5x 5x       4x       1x      
import type {JsonValueCodec} from '@jsonjoy.com/json-pack/lib/codecs/types';
import type {MessageCodec} from '@jsonjoy.com/rpc-codec-base/lib/types';
import type {RpcSpecifier} from './types';
 
/**
 * Represents a single message and value request/response pair. Typically to be
 * used for a single HTTP request/response, or a connection over WebSocket or similar.
 */
export class RpcCodec<Message> {
  constructor(
    public readonly msg: MessageCodec<Message>,
    public readonly req: JsonValueCodec,
    public readonly res: JsonValueCodec,
  ) {}
 
  public specifier(): RpcSpecifier {
    const specifier = `rpc.${this.msg.id}.${this.req.id}` + (this.req.id !== this.res.id ? `-${this.res.id}` : '');
    return specifier as RpcSpecifier;
  }
 
  public encode(messages: Message[], valueCodec: JsonValueCodec = this.res): Uint8Array {
    return this.msg.encode(valueCodec, messages);
  }
 
  public decode(data: Uint8Array, valueCodec: JsonValueCodec = this.req): Message[] {
    return this.msg.decode(valueCodec, data);
  }
}