UNPKG

@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
"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