@jsonjoy.com/reactive-rpc
Version:
Reactive-RPC is a library for building reactive APIs over WebSocket, HTTP, and other RPCs.
100 lines • 4.32 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.decode = void 0;
const Uint8ArrayCut_1 = require("@jsonjoy.com/util/lib/buffers/Uint8ArrayCut");
const messages_1 = require("../../messages");
const Value_1 = require("../../messages/Value");
const constants_1 = require("./constants");
const decode = (reader) => {
const word = reader.u32();
const type = word >>> 29;
switch (type) {
case constants_1.BinaryMessageType.Notification: {
const z = word & 0xff;
const x = word >>> 8;
const name = reader.ascii(z);
const cut = new Uint8ArrayCut_1.Uint8ArrayCut(reader.uint8, reader.x, x);
const value = new Value_1.RpcValue(cut, undefined);
reader.skip(x);
return new messages_1.NotificationMessage(name, value);
}
case constants_1.BinaryMessageType.RequestData:
case constants_1.BinaryMessageType.RequestComplete:
case constants_1.BinaryMessageType.RequestError: {
const z = reader.u8();
const name = reader.ascii(z);
const cutStart = reader.x;
let x = 0, y = 0;
if (word & 268435456) {
if (word & 32768) {
x = ((4095 & (word >>> 16)) << 15) | (word & 32767);
reader.skip(x);
y = reader.u16();
}
else {
x = ((4095 & (word >>> 16)) << 7) | ((word >>> 8) & 0x7f);
reader.skip(x);
y = ((word & 0xff) << 8) | reader.u8();
}
}
else {
x = (word >>> 16) & 4095;
y = word & 0xffff;
reader.skip(x);
}
const cut = new Uint8ArrayCut_1.Uint8ArrayCut(reader.uint8, cutStart, x);
const value = new Value_1.RpcValue(cut, undefined);
switch (type) {
case constants_1.BinaryMessageType.RequestData:
return new messages_1.RequestDataMessage(y, name, value);
case constants_1.BinaryMessageType.RequestComplete:
return new messages_1.RequestCompleteMessage(y, name, value);
case constants_1.BinaryMessageType.RequestError:
return new messages_1.RequestErrorMessage(y, name, value);
}
break;
}
case constants_1.BinaryMessageType.ResponseData:
case constants_1.BinaryMessageType.ResponseComplete:
case constants_1.BinaryMessageType.ResponseError: {
const cutStart = reader.x;
let x = 0, y = 0;
if (word & 268435456) {
if (word & 32768) {
x = ((4095 & (word >>> 16)) << 15) | (word & 32767);
reader.skip(x);
y = reader.u16();
}
else {
x = ((4095 & (word >>> 16)) << 7) | ((word >>> 8) & 0x7f);
reader.skip(x);
y = ((word & 0xff) << 8) | reader.u8();
}
}
else {
x = (word >>> 16) & 4095;
y = word & 0xffff;
reader.skip(x);
}
const cut = new Uint8ArrayCut_1.Uint8ArrayCut(reader.uint8, cutStart, x);
const value = new Value_1.RpcValue(cut, undefined);
switch (type) {
case constants_1.BinaryMessageType.ResponseData:
return new messages_1.ResponseDataMessage(y, value);
case constants_1.BinaryMessageType.ResponseComplete:
return new messages_1.ResponseCompleteMessage(y, value);
case constants_1.BinaryMessageType.ResponseError:
return new messages_1.ResponseErrorMessage(y, value);
}
break;
}
case constants_1.BinaryMessageType.Control: {
const isResponse = word & 65536;
const id = word & 0xffff;
return isResponse ? new messages_1.ResponseUnsubscribeMessage(id) : new messages_1.RequestUnsubscribeMessage(id);
}
}
throw new Error('UNKNOWN_MSG');
};
exports.decode = decode;
//# sourceMappingURL=decode.js.map