UNPKG

moleculer

Version:

Fast & powerful microservices framework for Node.JS

174 lines (156 loc) 4.07 kB
/* * moleculer * Copyright (c) 2017 Ice Services (https://github.com/ice-services/moleculer) * MIT Licensed */ "use strict"; const BaseSerializer = require("./base"); const P = require("../packets"); function createSchemas() { const avro = require("avsc"); const schemas = {}; schemas[P.PACKET_EVENT] = avro.Type.forSchema({ name: P.PACKET_EVENT, type: "record", fields: [ { name: "sender", type: "string" }, { name: "event", type: "string" }, { name: "data", type: "string" } ] }); schemas[P.PACKET_REQUEST] = avro.Type.forSchema({ name: P.PACKET_REQUEST, type: "record", fields: [ { name: "sender", type: "string" }, { name: "id", type: "string" }, { name: "action", type: "string" }, { name: "params", type: "string" }, { name: "meta", type: "string" }, { name: "timeout", type: "int" }, { name: "level", type: "int" }, { name: "metrics", type: "boolean" }, { name: "parentID", type: [ "null", "string"], default: null } ] }); schemas[P.PACKET_RESPONSE] = avro.Type.forSchema({ name: P.PACKET_RESPONSE, type: "record", fields: [ { name: "sender", type: "string" }, { name: "id", type: "string" }, { name: "success", type: "boolean" }, { name: "data", type: [ "null", "string"] }, { name: "error", type: [ "null", { type: "record", fields: [ { name: "name", type: "string" }, { name: "message", type: "string" }, { name: "code", type: "int" }, { name: "type", type: "string" }, { name: "stack", type: "string" }, { name: "data", type: "string" }, { name: "nodeID", type: "string" } ] } ], default: null } ] }); schemas[P.PACKET_DISCOVER] = avro.Type.forSchema({ name: P.PACKET_DISCOVER, type: "record", fields: [ { name: "sender", type: "string" } ] }); schemas[P.PACKET_INFO] = avro.Type.forSchema({ name: P.PACKET_INFO, type: "record", fields: [ { name: "sender", type: "string" }, { name: "services", type: "string" }, { name: "uptime", type: "double" }, { name: "ipList", type: { type: "array", items: "string" }}, { name: "versions", type: { type: "record", fields: [ { name: "node", type: "string" }, { name: "moleculer", type: "string" } ] }} ] }); schemas[P.PACKET_DISCONNECT] = avro.Type.forSchema({ name: P.PACKET_DISCONNECT, type: "record", fields: [ { name: "sender", type: "string" } ] }); schemas[P.PACKET_HEARTBEAT] = avro.Type.forSchema({ name: P.PACKET_HEARTBEAT, type: "record", fields: [ { name: "sender", type: "string" }, { name: "uptime", type: "double" } ] }); return schemas; } /** * Avro serializer for Moleculer * * https://github.com/mtth/avsc * * @class AvroSerializer */ class AvroSerializer extends BaseSerializer { /** * Initialize Serializer * * @param {any} broker * * @memberOf Serializer */ init(broker) { super.init(broker); try { require("avsc"); } catch(err) { /* istanbul ignore next */ this.broker.fatal("The 'avsc' package is missing! Please install it with 'npm install avsc --save' command!", err, true); } this.schemas = createSchemas(broker); } /** * Serializer a JS object to string or Buffer * * @param {Object} obj * @param {String} type of packet * @returns {String|Buffer} * * @memberOf Serializer */ serialize(obj, type) { //const t = schemas[type].toBuffer(obj); const t = this.schemas[type].toBuffer(obj).toString("binary"); return t; } /** * Deserialize string/Buffer to JS object * * @param {String|Buffer} str * @param {String} type of packet * @returns {Object} * * @memberOf Serializer */ deserialize(str, type) { //const res = schemas[type].fromBuffer(str); const res = this.schemas[type].fromBuffer(Buffer.from(str, "binary")); return res; } } module.exports = AvroSerializer;