All files / rpc-codec-binary/src RxBinaryMessageCodec.ts

96.66% Statements 58/60
89.18% Branches 33/37
100% Functions 6/6
98.18% Lines 54/55

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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102  1x 1x   1x           1x 108x 108x         108x       738x 738x 180x 558x 210x 348x 141x 207x 74x 133x 31x 102x 57x 45x 27x 18x 11x 7x 7x         108x 738x       108x 108x 108x 108x 108x       108x 108x 108x 108x 738x 738x   108x 108x 738x 738x                 700x 700x 700x   700x   509x 509x   509x 509x             108x       108x 108x      
import {RpcMessageFormat} from '@jsonjoy.com/rpc-codec-base/lib/constants';
import * as msg from '@jsonjoy.com/rpc-messages';
import {decode} from './decode';
import {BinaryMessageType} from './constants';
import {BinaryMessageWriter} from './BinaryMessageWriter';
import type {getEncoder} from '@jsonjoy.com/json-type/lib/codegen/binary/shared';
import type {Uint8ArrayCut} from '@jsonjoy.com/buffers/lib/Uint8ArrayCut';
import type {JsonValueCodec} from '@jsonjoy.com/json-pack/lib/codecs/types';
import type {MessageCodec} from '@jsonjoy.com/rpc-codec-base/lib/types';
 
export class RxBinaryMessageCodec implements MessageCodec<msg.RxMessage> {
  id = 'rx.binary';
  format = RpcMessageFormat.Binary;
 
  private readonly msgWriter: BinaryMessageWriter;
 
  constructor(getTypeEncoder?: typeof getEncoder) {
    this.msgWriter = new BinaryMessageWriter(getTypeEncoder);
  }
 
  public write(codec: JsonValueCodec, message: msg.RxMessage): void {
    const writer = this.msgWriter;
    if (message instanceof msg.NotificationMessage) {
      writer.writeType2(codec, message.method, message.value);
    } else if (message instanceof msg.RequestDataMessage) {
      writer.writeType4(codec, BinaryMessageType.RequestData << 13, message.id, message.method, message.value);
    } else if (message instanceof msg.RequestCompleteMessage) {
      writer.writeType4(codec, BinaryMessageType.RequestComplete << 13, message.id, message.method, message.value);
    } else if (message instanceof msg.RequestErrorMessage) {
      writer.writeType4(codec, BinaryMessageType.RequestError << 13, message.id, message.method, message.value);
    } else if (message instanceof msg.RequestUnsubscribeMessage) {
      codec.encoder.writer.u32(0b11100000_00000000_00000000_00000000 | message.id);
    } else if (message instanceof msg.ResponseCompleteMessage) {
      writer.writeType3(codec, BinaryMessageType.ResponseComplete << 13, message.id, message.value);
    } else if (message instanceof msg.ResponseDataMessage) {
      writer.writeType3(codec, BinaryMessageType.ResponseData << 13, message.id, message.value);
    } else if (message instanceof msg.ResponseErrorMessage) {
      writer.writeType3(codec, BinaryMessageType.ResponseError << 13, message.id, message.value);
    } else Eif (message instanceof msg.ResponseUnsubscribeMessage) {
      codec.encoder.writer.u32(0b11100000_00000001_00000000_00000000 | message.id);
    }
  }
 
  public writeBatch(valueCodec: JsonValueCodec, batch: msg.RxMessage[]): void {
    const length = batch.length;
    for (let i = 0; i < length; i++) this.write(valueCodec, batch[i]);
  }
 
  public encode(valueCodec: JsonValueCodec, batch: msg.RxMessage[]): Uint8Array {
    const encoder = valueCodec.encoder;
    const writer = encoder.writer;
    writer.reset();
    this.writeBatch(valueCodec, batch);
    return writer.flush();
  }
 
  public read(valueCodec: JsonValueCodec): msg.RxMessage[] {
    const decoder = valueCodec.decoder;
    const reader = decoder.reader;
    const messages: msg.RxMessage[] = [];
    while (reader.x < reader.uint8.length) {
      const message = decode(reader);
      messages.push(message);
    }
    const length = messages.length;
    for (let i = 0; i < length; i++) {
      const message = messages[i];
      if (
        message instanceof msg.NotificationMessage ||
        message instanceof msg.RequestCompleteMessage ||
        message instanceof msg.RequestDataMessage ||
        message instanceof msg.RequestErrorMessage ||
        message instanceof msg.ResponseCompleteMessage ||
        message instanceof msg.ResponseDataMessage ||
        message instanceof msg.ResponseErrorMessage
      ) {
        const value = message.value;
        if (value) {
          const cut = value.data as Uint8ArrayCut;
          // if (!cut || cut.size === 0) message.value = unknown(undefined);
          if (!cut || cut.size === 0) message.value = void 0;
          else {
            const arr = cut.uint8.subarray(cut.start, cut.start + cut.size);
            const data = arr.length ? decoder.read(arr) : undefined;
            // if (data === undefined) message.value = unknown(undefined);
            Iif (data === undefined) message.value = void 0;
            else value.data = data;
          }
        }
        // message.value = unknown(undefined);
        else Emessage.value = void 0;
      }
    }
    return messages;
  }
 
  public decode(valueCodec: JsonValueCodec, uint8: Uint8Array): msg.RxMessage[] {
    valueCodec.decoder.reader.reset(uint8);
    return this.read(valueCodec);
  }
}