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 | 2x 2x 2x 2x 2x 108x 108x 108x 108x 108x 108x 108x 108x 108x 108x 738x 738x 180x 558x 210x 348x 141x 207x 74x 133x 31x 102x 57x 45x 27x 18x 11x 7x 7x 108x 108x 108x 108x 108x 108x 108x 738x 738x 108x 108x 738x 738x 700x 700x 700x 700x 509x 509x 509x 509x 108x | import {RpcMessageFormat} from '@jsonjoy.com/rpc-codec-base/lib/constants';
import {Value} from '@jsonjoy.com/json-type';
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 {BinBatchCodec} from '@jsonjoy.com/rpc-codec-base/lib/types';
/**
* Lite binary Reactive JSON RPC codec intended for browser/client use. Uses a
* injected codec for values, JSON Type values can be untyped.
*/
export class RxBinaryBatchCodec implements BinBatchCodec<msg.RxMessage> {
public readonly id = 'rx.binary';
public readonly format = RpcMessageFormat.Binary;
private readonly msgWriter: BinaryMessageWriter;
constructor(
public readonly codec: JsonValueCodec,
getTypeEncoder?: typeof getEncoder,
) {
this.msgWriter = new BinaryMessageWriter(getTypeEncoder);
}
public toChunk(batch: msg.RxMessage[]): Uint8Array {
const codec = this.codec;
const writer = codec.encoder.writer;
writer.reset();
const length = batch.length;
const msgWriter = this.msgWriter;
for (let i = 0; i < length; i++) {
const message = batch[i];
if (message instanceof msg.NotificationMessage) {
msgWriter.writeType2(codec, message.method, message.value);
} else if (message instanceof msg.RequestDataMessage) {
msgWriter.writeType4(codec, BinaryMessageType.RequestData << 13, message.id, message.method, message.value);
} else if (message instanceof msg.RequestCompleteMessage) {
msgWriter.writeType4(codec, BinaryMessageType.RequestComplete << 13, message.id, message.method, message.value);
} else if (message instanceof msg.RequestErrorMessage) {
msgWriter.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) {
msgWriter.writeType3(codec, BinaryMessageType.ResponseComplete << 13, message.id, message.value);
} else if (message instanceof msg.ResponseDataMessage) {
msgWriter.writeType3(codec, BinaryMessageType.ResponseData << 13, message.id, message.value);
} else if (message instanceof msg.ResponseErrorMessage) {
msgWriter.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);
}
}
return writer.flush();
}
public fromChunk(uint8: Uint8Array): msg.RxMessage[] {
const codec = this.codec;
const decoder = codec.decoder;
const reader = decoder.reader;
reader.reset(uint8);
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 = void 0;
else {
const arr = cut.uint8.subarray(cut.start, cut.start + cut.size);
const data = arr.length ? decoder.read(arr) : undefined;
Iif (data === undefined) message.value = void 0;
else message.value = new Value(data, void 0);
}
} else Emessage.value = void 0;
}
}
return messages;
}
}
|