@jsonjoy.com/reactive-rpc
Version:
Reactive-RPC is a library for building reactive APIs over WebSocket, HTTP, and other RPCs.
228 lines • 7.96 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ResponseUnsubscribeMessage = exports.ResponseErrorMessage = exports.ResponseDataMessage = exports.ResponseCompleteMessage = exports.RequestUnsubscribeMessage = exports.RequestErrorMessage = exports.RequestCompleteMessage = exports.RequestDataMessage = exports.NotificationMessage = void 0;
const constants_1 = require("../codec/binary/constants");
const constants_2 = require("../codec/compact/constants");
const validation_1 = require("../rpc/validation");
const encodeHeader = (writer, typeU16, id, payloadSize, start) => {
if (payloadSize <= 4095) {
const w1 = typeU16 | payloadSize;
const w2 = id;
writer.view.setUint32(start, (w1 << 16) | w2);
}
else if (payloadSize <= 524287) {
writer.u8(id & 0xff);
const w1 = typeU16 | 4096 | (payloadSize >> 7);
const w2 = ((payloadSize & 127) << 8) | (id >> 8);
writer.view.setUint32(start, (w1 << 16) | w2);
}
else {
writer.u16(id);
const w1 = typeU16 | 4096 | (payloadSize >> 15);
const w2 = 32768 | (payloadSize & 32767);
writer.view.setUint32(start, (w1 << 16) | w2);
}
};
const encodeBinaryWithNameAndPayload = (codec, typeU16, id, name, value) => {
const writer = codec.encoder.writer;
const nameLength = name.length;
writer.ensureCapacity(5 + nameLength);
writer.uint8[writer.x + 4] = nameLength;
writer.x += 5;
writer.ascii(name);
const x0 = writer.x0;
const x = writer.x;
if (value)
value.encode(codec);
const shift = writer.x0 - x0;
const payloadStart = x + shift;
const start = payloadStart - 5 - nameLength;
const payloadSize = writer.x - payloadStart;
encodeHeader(writer, typeU16, id, payloadSize, start);
};
const encodeBinaryWithPayload = (codec, typeU16, id, value) => {
const writer = codec.encoder.writer;
writer.move(4);
const x0 = writer.x0;
const x = writer.x;
if (value) {
value.encode(codec);
}
const shift = writer.x0 - x0;
const payloadStart = x + shift;
const start = payloadStart - 4;
const payloadSize = writer.x - payloadStart;
encodeHeader(writer, typeU16, id, payloadSize, start);
};
class NotificationMessage {
constructor(method, value) {
this.method = method;
this.value = value;
}
validate() {
(0, validation_1.validateMethod)(this.method);
}
toCompact() {
return this.value === undefined
? [constants_2.CompactMessageType.Notification, this.method]
: [constants_2.CompactMessageType.Notification, this.method, this.value.data];
}
encodeBinary(codec) {
const writer = codec.encoder.writer;
const name = this.method;
const nameLength = name.length;
writer.move(4);
writer.ascii(name);
const x0 = writer.x0;
const x = writer.x;
this.value.encode(codec);
const shift = writer.x0 - x0;
const payloadStart = x + shift;
const start = payloadStart - 4 - nameLength;
const payloadSize = writer.x - payloadStart;
writer.view.setUint32(start, (payloadSize << 8) + nameLength);
}
}
exports.NotificationMessage = NotificationMessage;
class RequestDataMessage {
constructor(id, method, value) {
this.id = id;
this.method = method;
this.value = value;
}
validate() {
(0, validation_1.validateId)(this.id);
if (this.method)
(0, validation_1.validateMethod)(this.method);
}
toCompact() {
return this.value === undefined
? [constants_2.CompactMessageType.RequestData, this.id, this.method]
: [constants_2.CompactMessageType.RequestData, this.id, this.method, this.value.data];
}
encodeBinary(codec) {
encodeBinaryWithNameAndPayload(codec, constants_1.BinaryMessageType.RequestData << 13, this.id, this.method, this.value);
}
}
exports.RequestDataMessage = RequestDataMessage;
class RequestCompleteMessage {
constructor(id, method, value) {
this.id = id;
this.method = method;
this.value = value;
}
validate() {
(0, validation_1.validateId)(this.id);
if (this.method)
(0, validation_1.validateMethod)(this.method);
}
toCompact() {
return this.value === undefined
? [constants_2.CompactMessageType.RequestComplete, this.id, this.method]
: [constants_2.CompactMessageType.RequestComplete, this.id, this.method, this.value.data];
}
encodeBinary(codec) {
encodeBinaryWithNameAndPayload(codec, constants_1.BinaryMessageType.RequestComplete << 13, this.id, this.method, this.value);
}
}
exports.RequestCompleteMessage = RequestCompleteMessage;
class RequestErrorMessage {
constructor(id, method, value) {
this.id = id;
this.method = method;
this.value = value;
}
validate() {
(0, validation_1.validateId)(this.id);
if (this.method)
(0, validation_1.validateMethod)(this.method);
}
toCompact() {
return [constants_2.CompactMessageType.RequestError, this.id, this.method, this.value.data];
}
encodeBinary(codec) {
encodeBinaryWithNameAndPayload(codec, constants_1.BinaryMessageType.RequestError << 13, this.id, this.method, this.value);
}
}
exports.RequestErrorMessage = RequestErrorMessage;
class RequestUnsubscribeMessage {
constructor(id) {
this.id = id;
}
validate() {
(0, validation_1.validateId)(this.id);
}
toCompact() {
return [constants_2.CompactMessageType.RequestUnsubscribe, this.id];
}
encodeBinary(codec) {
codec.encoder.writer.u32(3758096384 | this.id);
}
}
exports.RequestUnsubscribeMessage = RequestUnsubscribeMessage;
class ResponseCompleteMessage {
constructor(id, value) {
this.id = id;
this.value = value;
}
validate() {
(0, validation_1.validateId)(this.id);
}
toCompact() {
return this.value === undefined
? [constants_2.CompactMessageType.ResponseComplete, this.id]
: [constants_2.CompactMessageType.ResponseComplete, this.id, this.value.data];
}
encodeBinary(codec) {
encodeBinaryWithPayload(codec, constants_1.BinaryMessageType.ResponseComplete << 13, this.id, this.value);
}
}
exports.ResponseCompleteMessage = ResponseCompleteMessage;
class ResponseDataMessage {
constructor(id, value) {
this.id = id;
this.value = value;
}
validate() {
(0, validation_1.validateId)(this.id);
}
toCompact() {
return [constants_2.CompactMessageType.ResponseData, this.id, this.value.data];
}
encodeBinary(codec) {
encodeBinaryWithPayload(codec, constants_1.BinaryMessageType.ResponseData << 13, this.id, this.value);
}
}
exports.ResponseDataMessage = ResponseDataMessage;
class ResponseErrorMessage {
constructor(id, value) {
this.id = id;
this.value = value;
}
validate() {
(0, validation_1.validateId)(this.id);
}
toCompact() {
return [constants_2.CompactMessageType.ResponseError, this.id, this.value.data];
}
encodeBinary(codec) {
encodeBinaryWithPayload(codec, constants_1.BinaryMessageType.ResponseError << 13, this.id, this.value);
}
}
exports.ResponseErrorMessage = ResponseErrorMessage;
class ResponseUnsubscribeMessage {
constructor(id) {
this.id = id;
}
validate() {
(0, validation_1.validateId)(this.id);
}
toCompact() {
return [constants_2.CompactMessageType.ResponseUnsubscribe, this.id];
}
encodeBinary(codec) {
codec.encoder.writer.u32(3758161920 | this.id);
}
}
exports.ResponseUnsubscribeMessage = ResponseUnsubscribeMessage;
//# sourceMappingURL=messages.js.map