UNPKG

@nixjs23n6/grpc-socket-core

Version:

gRPC for Web Clients.

88 lines 3.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.proto = exports.Proto = void 0; const tslib_1 = require("tslib"); const protobufjs_1 = tslib_1.__importDefault(require("protobufjs")); const uuid_1 = require("uuid"); const enums_1 = require("./enums"); class Proto { constructor() { this.subscribers = []; this.encoderDecoder = {}; } subscribe(callback) { this.subscribers.push(callback); } _readProto(nestedRoot, resolve, reject, root, executeEncoderDecoderMap) { if (root && root.nested && root.nested[nestedRoot]) { this.protoRoot = root.nested[nestedRoot]; this.Msg = this.protoRoot.Msg; this.MsgType = this.protoRoot.MsgType; if (typeof executeEncoderDecoderMap === "function") executeEncoderDecoderMap(this); if (Object.keys(this.encoderDecoder).length === 0) { return reject(enums_1.WSEnums.ProtoState.MESSAGE_ENCODERS_FAILED); } return resolve(enums_1.WSEnums.ProtoState.READY); } return reject(enums_1.WSEnums.ProtoState.NOT_YET); } init(nestedRoot = "ws", protoFile, protoJSONFallback, executeEncoderDecoderMap) { return new Promise((resolve, reject) => { if (!protoFile) { if (protoJSONFallback && Object.keys(protoJSONFallback).length > 0) { const root = protobufjs_1.default.Root.fromJSON(protoJSONFallback); this._readProto(nestedRoot, resolve, reject, root, executeEncoderDecoderMap); } return reject(enums_1.WSEnums.ProtoState.PROTO_NOT_FOUND); } protobufjs_1.default.load(protoFile, (err, root) => { if (err) { return reject(enums_1.WSEnums.ProtoState.NOT_YET); } this._readProto(nestedRoot, resolve, reject, root, executeEncoderDecoderMap); }); }); } _getCurrentUnixTimestamp() { return new Date().getTime(); } buildMsg(type, data, msgId) { let id = !msgId ? this.generateId() : msgId; id = id.toString(); const encoder = this.encoderDecoder[type]; if (!encoder) { return null; } return this.Msg.encode({ id, type, data: encoder.encode(data).finish(), }).finish(); } generateId() { return `${this._getCurrentUnixTimestamp()}-${(0, uuid_1.v4)()}`; } createPingMessage() { return this.buildMsg(this.MsgType.PING); } decodeMsg(buffer) { const msg = this.Msg.decode(new Uint8Array(buffer)); const { data, type } = msg; msg.data = this.decodeData(data, type); return msg; } decodeData(data, type) { if (!data || !type) return null; const newData = new Uint8Array(data); const decoder = this.encoderDecoder[type]; if (!decoder) { return null; } return decoder.decode(newData); } } exports.Proto = Proto; exports.proto = new Proto(); //# sourceMappingURL=proto.js.map