Skip to content

Commit

Permalink
add msgpack serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
icebob committed Apr 3, 2017
1 parent b1de6ce commit df3283e
Show file tree
Hide file tree
Showing 9 changed files with 198 additions and 9 deletions.
4 changes: 2 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
- [ ] meta in context which will be transported. (for user, session, state...etc)
- [ ] other meta for response, that need to be transported back to caller (for contentType, pagination...etc)

- [ ] pluggable serializer for transport
- [ ] JSON parse/stringify
- [x] pluggable serializer for transport
- [x] JSON parse/stringify
- [ ] [PSON](https://github.com/dcodeIO/PSON)
- [ ] [Avro](https://github.com/mtth/avsc)

Expand Down
6 changes: 5 additions & 1 deletion benchmark/perf-runner.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const v8 = require('v8-natives');
let ServiceBroker = require("../src/service-broker");
let Context = require("../src/context");
let Transporters = require("../src/transporters");
let MsgPackSerializer = require("../src/serializers/msgpack");

let { generateToken, json2String } = require("../src/utils");
let Promise = require("bluebird");
Expand All @@ -16,14 +17,17 @@ function createBrokers(Transporter, opts) {
requestTimeout: 0,
//logger: console,
//logLevel: "debug",
nodeID: "node-1"
serializer: new MsgPackSerializer(),
nodeID: "node-1",

});

let b2 = new ServiceBroker({
transporter: new Transporter(opts),
//requestTimeout: 0,
//logger: console,
//logLevel: "debug",
serializer: new MsgPackSerializer(),
nodeID: "node-2"
});

Expand Down
2 changes: 2 additions & 0 deletions examples/transporter/server1.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ let { delay } = require("../../src/utils");

let ServiceBroker = require("../../src/service-broker");
let NatsTransporter = require("../../src/transporters/nats");
let MsgPackSerializer = require("../../src/serializers/msgpack");

// Create broker
let broker = new ServiceBroker({
Expand All @@ -12,6 +13,7 @@ let broker = new ServiceBroker({
logger: console,
logLevel: "info",
requestTimeout: 5 * 1000,
serializer: new MsgPackSerializer()
//requestRetry: 3
});

Expand Down
4 changes: 3 additions & 1 deletion examples/transporter/server2.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ let { delay } = require("../../src/utils");

let ServiceBroker = require("../../src/service-broker");
let NatsTransporter = require("../../src/transporters/nats");
let MsgPackSerializer = require("../../src/serializers/msgpack");

// Create broker
let broker = new ServiceBroker({
nodeID: process.argv[2] || "server-2",
transporter: new NatsTransporter(),
logger: console,
logLevel: "info"
logLevel: "info",
serializer: new MsgPackSerializer()
});

//broker.loadService(__dirname + "/../post.service");
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
},
"dependencies": {
"amqplib": "0.5.1",
"avsc": "5.0.0",
"bluebird": "3.5.0",
"chalk": "1.1.3",
"es6-error": "4.0.2",
Expand All @@ -72,6 +73,7 @@
"lodash": "4.17.4",
"micromatch": "2.3.11",
"mqtt": "2.5.2",
"msgpack5": "3.4.1",
"nats": "0.7.16",
"node-object-hash": "1.2.0"
},
Expand Down
64 changes: 64 additions & 0 deletions src/serializers/avro.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* moleculer
* Copyright (c) 2017 Ice Services (https://github.com/ice-services/moleculer)
* MIT Licensed
*/

"use strict";

const avro = require("avsc");
const BaseSerializer = require("./base");

const schema = {
name: "Request",
type: "record",
fields: [
]
};

/**
* Avro serializer for Moleculer
*
* https://github.com/mtth/avsc
*
* @class AvroSerializer
*/
class AvroSerializer extends BaseSerializer {

/**
* Creates an instance of AvroSerializer.
*
* @memberOf AvroSerializer
*/
constructor() {
super();
}

/**
* Serializer a JS object to string or Buffer
*
* @param {Object} obj
* @returns {String|Buffer}
*
* @memberOf Serializer
*/
serialize(obj) {
const schema = avro.Type.forValue(obj);
const t = schema.toBuffer(obj);
return t;
}

/**
* Deserialize string/Buffer to JS object
*
* @param {String|Buffer} str
* @returns {Object}
*
* @memberOf Serializer
*/
deserialize(str) {
return JSON.parse(str);
}
}

module.exports = AvroSerializer;
59 changes: 59 additions & 0 deletions src/serializers/msgpack.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* moleculer
* Copyright (c) 2017 Ice Services (https://github.com/ice-services/moleculer)
* MIT Licensed
*/

"use strict";

const avro = require("avsc");
const BaseSerializer = require("./base");

/**
* MessagePack serializer for Moleculer
*
* https://github.com/mcollina/msgpack5
*
* @class MsgPackSerializer
*/
class MsgPackSerializer extends BaseSerializer {

/**
* Creates an instance of MsgPackSerializer.
*
* @memberOf MsgPackSerializer
*/
constructor() {
super();

this.msgpack = require("msgpack5")();
}

/**
* Serializer a JS object to string or Buffer
*
* @param {Object} obj
* @returns {String|Buffer}
*
* @memberOf Serializer
*/
serialize(obj) {
const res = this.msgpack.encode(obj);
return res;
}

/**
* Deserialize string/Buffer to JS object
*
* @param {String|Buffer} str
* @returns {Object}
*
* @memberOf Serializer
*/
deserialize(str) {
const res = this.msgpack.decode(Buffer.from(str));
return res;
}
}

module.exports = MsgPackSerializer;
44 changes: 44 additions & 0 deletions test/unit/serializers/avro.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
const ServiceBroker = require("../../../src/service-broker");
const AvroSerializer = require("../../../src/serializers/avro");


describe("Test AvroSerializer constructor", () => {
it("should create an empty options", () => {
let serializer = new AvroSerializer();
expect(serializer).toBeDefined();
expect(serializer.serialize).toBeDefined();
expect(serializer.deserialize).toBeDefined();
});
});

describe("Test AvroSerializer serialize", () => {

let broker = new ServiceBroker();
let serializer = new AvroSerializer();
serializer.init(broker);

let data1 = {
a: 1,
b: false,
c: "Test",
d: {
e: 55
}
};

it("should convert data to JSON string", () => {
const res = serializer.serialize(data1);
expect(res).toBe("{\"a\":1,\"b\":false,\"c\":\"Test\",\"d\":{\"e\":55}}");
});

it("should give undefined if data is not defined", () => {
const res = serializer.serialize();
expect(res).toBe(undefined);
});

it("should give null if data is null", () => {
const res = serializer.serialize(null);
expect(res).toBe("null");
});

});
22 changes: 17 additions & 5 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"

avsc@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/avsc/-/avsc-5.0.0.tgz#779a24073e39298ba898ea161c235098a8f8c6d7"

aws-sign2@~0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
Expand Down Expand Up @@ -408,7 +412,7 @@ bitsyntax@~0.0.4:
dependencies:
buffer-more-ints "0.0.2"

bl@^1.2.0:
bl@^1.0.0, bl@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.0.tgz#1397e7ec42c5f5dc387470c500e34a9f6be9ea98"
dependencies:
Expand Down Expand Up @@ -1025,13 +1029,13 @@ dateformat@^1.0.11, dateformat@^1.0.12:
get-stdin "^4.0.1"
meow "^3.3.0"

debug@2, debug@2.6.1, debug@^2.1.1:
debug@2, debug@2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
dependencies:
ms "0.7.2"

debug@2.2.0, debug@^2.2.0:
debug@2.2.0, debug@^2.1.1, debug@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
dependencies:
Expand Down Expand Up @@ -2579,14 +2583,14 @@ js-tokens@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5"

js-yaml@3.6.1:
js-yaml@3.6.1, js-yaml@^3.5.1:
version "3.6.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30"
dependencies:
argparse "^1.0.7"
esprima "^2.6.0"

js-yaml@^3.5.1, js-yaml@^3.7.0:
js-yaml@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
dependencies:
Expand Down Expand Up @@ -2971,6 +2975,14 @@ ms@0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"

msgpack5@3.4.1:
version "3.4.1"
resolved "https://registry.yarnpkg.com/msgpack5/-/msgpack5-3.4.1.tgz#350ef35899c6c8773710fd84d881ddd3340a8114"
dependencies:
bl "^1.0.0"
inherits "^2.0.1"
readable-stream "^2.0.1"

mute-stream@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
Expand Down

0 comments on commit df3283e

Please sign in to comment.