Skip to content

Commit

Permalink
add more context value to PacketRequest
Browse files Browse the repository at this point in the history
meta, timeout, level, metrics, parentID
  • Loading branch information
icebob committed Apr 11, 2017
1 parent 0235b7c commit be2ccbc
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 45 deletions.
16 changes: 12 additions & 4 deletions src/packets.js
Original file line number Diff line number Diff line change
Expand Up @@ -197,17 +197,25 @@ class PacketEvent extends Packet {
* @extends {Packet}
*/
class PacketRequest extends Packet {
constructor(transit, target, id, action, params) {
constructor(transit, target, ctx) {
super(transit, PACKET_REQUEST, target);

this.payload.id = id;
this.payload.action = action;
this.payload.params = JSON.stringify(params);
if (ctx) {
this.payload.id = ctx.id;
this.payload.action = ctx.action.name;
this.payload.params = JSON.stringify(ctx.params);
this.payload.meta = JSON.stringify(ctx.meta);
this.payload.timeout = ctx.timeout;
this.payload.level = ctx.level;
this.payload.metrics = ctx.metrics;
this.payload.parentID = ctx.parentID;
}
}

transformPayload(payload) {
super.transformPayload(payload);
payload.params = JSON.parse(payload.params);
payload.meta = JSON.parse(payload.meta);
}
}

Expand Down
7 changes: 6 additions & 1 deletion src/serializers/avro.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,12 @@ schemas[P.PACKET_REQUEST] = avro.Type.forSchema({
{ name: "sender", type: "string" },
{ name: "id", type: "string" },
{ name: "action", type: "string" },
{ name: "params", 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: "string" }
]
});

Expand Down
12 changes: 6 additions & 6 deletions src/transit.js
Original file line number Diff line number Diff line change
Expand Up @@ -196,11 +196,11 @@ class Transit {
*
* @memberOf Transit
*/
_requestHandler({ sender, action, id, params }) {
this.logger.info(`Request '${action}' from '${sender}'. Params:`, params);
return this.broker.call(action, params, {}) // empty {} opts to avoid deoptimizing
.then(res => this.sendResponse(sender, id, res, null))
.catch(err => this.sendResponse(sender, id, null, err));
_requestHandler(payload) {
this.logger.info(`Request '${payload.action}' from '${payload.sender}'. Params:`, payload.params);
return this.broker.call(payload.action, payload.params, {}) // empty {} opts to avoid deoptimizing
.then(res => this.sendResponse(payload.sender, payload.id, res, null))
.catch(err => this.sendResponse(payload.sender, payload.id, null, err));
}

/**
Expand Down Expand Up @@ -266,7 +266,7 @@ class Transit {
reject
};

const packet = new P.PacketRequest(this, ctx.nodeID, ctx.id, ctx.action.name, ctx.params);
const packet = new P.PacketRequest(this, ctx.nodeID, ctx);

// Add to pendings
this.pendingRequests.set(ctx.id, request);
Expand Down
72 changes: 49 additions & 23 deletions test/integration/serializer.spec.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,31 @@
const ServiceBroker = require("../../src/service-broker");
const FakeTransporter = require("../../src/transporters/fake");
const Serializers = require("../../src/serializers");
const Context = require("../../src/context");
const { ValidationError } = require("../../src/errors");
const P = require("../../src/packets");

const ctx = new Context({
id: "100",
action: {
name: "posts.find"
},
// requestID: "12345",
params: { id: 5 },
meta: {
user: {
id: 1,
roles: [ "admin" ]
}
},
level: 4,
timeout: 1500,
metrics: true,
parent: {
id: "999"
}
});

describe("Test JSON serializer", () => {

const broker = new ServiceBroker({
Expand Down Expand Up @@ -73,19 +95,19 @@ describe("Test JSON serializer", () => {
});

it("should serialize the request packet", () => {
const params = {
a: 5,
b: "Test"
};
const packet = new P.PacketRequest(broker.transit, "test-2", "12345", "user.update", params);
const packet = new P.PacketRequest(broker.transit, "test-2", ctx);
const s = packet.serialize();
expect(s).toBe("{\"sender\":\"test-1\",\"id\":\"12345\",\"action\":\"user.update\",\"params\":\"{\\\"a\\\":5,\\\"b\\\":\\\"Test\\\"}\"}");
expect(s).toBe("{\"sender\":\"test-1\",\"id\":\"100\",\"action\":\"posts.find\",\"params\":\"{\\\"id\\\":5}\",\"meta\":\"{\\\"user\\\":{\\\"id\\\":1,\\\"roles\\\":[\\\"admin\\\"]}}\",\"timeout\":1500,\"level\":4,\"metrics\":true,\"parentID\":\"999\"}");

const res = P.Packet.deserialize(broker.transit, P.PACKET_REQUEST, s);
expect(res).toBeInstanceOf(P.PacketRequest);
expect(res.payload.id).toBe("12345");
expect(res.payload.action).toBe("user.update");
expect(res.payload.params).toEqual(params);
expect(res.payload.id).toBe("100");
expect(res.payload.action).toBe("posts.find");
expect(res.payload.params).toEqual(ctx.params);
expect(res.payload.meta).toEqual(ctx.meta);
expect(res.payload.timeout).toBe(1500);
expect(res.payload.metrics).toBe(true);
expect(res.payload.parentID).toBe("999");
});

it("should serialize the response packet with data", () => {
Expand Down Expand Up @@ -195,19 +217,19 @@ describe("Test Avro serializer", () => {
});

it("should serialize the request packet", () => {
const params = {
a: 5,
b: "Test"
};
const packet = new P.PacketRequest(broker.transit, "test-2", "12345", "user.update", params);
const packet = new P.PacketRequest(broker.transit, "test-2", ctx);
const s = packet.serialize();
expect(s.length).toBe(44);
expect(s.length).toBe(75);

const res = P.Packet.deserialize(broker.transit, P.PACKET_REQUEST, s);
expect(res).toBeInstanceOf(P.PacketRequest);
expect(res.payload.id).toBe("12345");
expect(res.payload.action).toBe("user.update");
expect(res.payload.params).toEqual(params);
expect(res.payload.id).toBe("100");
expect(res.payload.action).toBe("posts.find");
expect(res.payload.params).toEqual(ctx.params);
expect(res.payload.meta).toEqual(ctx.meta);
expect(res.payload.timeout).toBe(1500);
expect(res.payload.metrics).toBe(true);
expect(res.payload.parentID).toBe("999");
});

it("should serialize the response packet with data", () => {
Expand Down Expand Up @@ -322,15 +344,19 @@ describe("Test MsgPack serializer", () => {
a: 5,
b: "Test"
};
const packet = new P.PacketRequest(broker.transit, "test-2", "12345", "user.update", params);
const packet = new P.PacketRequest(broker.transit, "test-2", ctx);
const s = packet.serialize();
expect(Buffer.byteLength(s, "binary")).toBe(69);
expect(Buffer.byteLength(s, "binary")).toBe(138);

const res = P.Packet.deserialize(broker.transit, P.PACKET_REQUEST, s);
expect(res).toBeInstanceOf(P.PacketRequest);
expect(res.payload.id).toBe("12345");
expect(res.payload.action).toBe("user.update");
expect(res.payload.params).toEqual(params);
expect(res.payload.id).toBe("100");
expect(res.payload.action).toBe("posts.find");
expect(res.payload.params).toEqual(ctx.params);
expect(res.payload.meta).toEqual(ctx.meta);
expect(res.payload.timeout).toBe(1500);
expect(res.payload.metrics).toBe(true);
expect(res.payload.parentID).toBe("999");
});

it("should serialize the response packet with data", () => {
Expand Down
41 changes: 33 additions & 8 deletions test/unit/packets.spec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
const ServiceBroker = require("../../src/service-broker");
const Transit = require("../../src/transit");
const FakeTransporter = require("../../src/transporters/fake");
const Context = require("../../src/context");
const { ValidationError } = require("../../src/errors");

const P = require("../../src/packets");
Expand Down Expand Up @@ -176,26 +174,53 @@ describe("Test PacketRequest", () => {
const transit = { nodeID: "node-1" };

it("should set properties", () => {
let params = { id: 5 };
let packet = new P.PacketRequest(transit, "server-2", "12345", "posts.find", params);
let ctx = new Context({
id: 100,
action: {
name: "posts.find"
},
// requestID: "12345",
params: { id: 5 },
meta: {
user: {
id: 1,
roles: [ "admin" ]
}
},
level: 4,
timeout: 1500,
retryCount: 2,
metrics: true,
parent: {
id: 999
}
});
let packet = new P.PacketRequest(transit, "server-2", ctx);
expect(packet).toBeDefined();
expect(packet.type).toBe(P.PACKET_REQUEST);
expect(packet.target).toBe("server-2");
expect(packet.payload).toBeDefined();
expect(packet.payload.sender).toBe("node-1");
expect(packet.payload.id).toBe("12345");
expect(packet.payload.id).toBe(100);
expect(packet.payload.action).toBe("posts.find");
expect(packet.payload.params).toBe("{\"id\":5}");
expect(packet.payload.meta).toBe("{\"user\":{\"id\":1,\"roles\":[\"admin\"]}}");
expect(packet.payload.timeout).toBe(1500);
expect(packet.payload.level).toBe(4);
expect(packet.payload.metrics).toBe(true);
expect(packet.payload.parentID).toBe(999);
});

it("should transform payload", () => {
let payload = {
params: "{\"a\":5}"
params: "{\"a\":5}",
meta: "{\"b\":\"John\"}"
};
let packet = new P.PacketRequest(transit, "server-2", "12345", "", {});
let packet = new P.PacketRequest(transit, "server-2");
packet.transformPayload(payload);

expect(packet.payload.params).toEqual({ a: 5 });
expect(packet.payload.meta).toEqual({ b: "John" });
});

});
Expand Down
16 changes: 13 additions & 3 deletions test/unit/transit.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ describe("Test Transit.messageHandler", () => {
let response = [1, 5, 8];
broker.call = jest.fn(() => Promise.resolve(response));

let msg = { sender: "remote", action: "posts.find", id: "123", params: JSON.stringify({ limit: 5 }) };
let msg = { sender: "remote", action: "posts.find", id: "123", params: JSON.stringify({ limit: 5 }), meta: "{}" };
return transit.messageHandler("REQ", JSON.stringify(msg)).then(() => {
expect(broker.call).toHaveBeenCalledTimes(1);
expect(broker.call).toHaveBeenCalledWith(msg.action, { limit: 5 }, {});
Expand All @@ -192,7 +192,7 @@ describe("Test Transit.messageHandler", () => {
transit.sendResponse.mockClear();
broker.call = jest.fn(() => Promise.reject(new ValidationError("Not valid params")));

let msg = { sender: "remote", action: "posts.create", id: "123", params: JSON.stringify({ title: "Hello" }) };
let msg = { sender: "remote", action: "posts.create", id: "123", params: JSON.stringify({ title: "Hello" }), meta: "{}" };
return transit.messageHandler("REQ", JSON.stringify(msg)).then(() => {
expect(broker.call).toHaveBeenCalledTimes(1);
expect(broker.call).toHaveBeenCalledWith(msg.action, { title: "Hello" }, {});
Expand Down Expand Up @@ -325,7 +325,14 @@ describe("Test Transit.request", () => {
let ctx = new Context({
nodeID: "remote",
action: { name: "users.find" },
params: { a: 5 }
params: { a: 5 },
meta: {
user: {
id: 5,
roles: [ "user" ]
}
},
timeout: 500
});
ctx.id = "12345";

Expand All @@ -337,11 +344,14 @@ describe("Test Transit.request", () => {
return transit.request(ctx).then(req => {
expect(transit.pendingRequests.size).toBe(1);
expect(transit.publish).toHaveBeenCalledTimes(1);

const packet = transit.publish.mock.calls[0][0];
expect(packet).toBeInstanceOf(P.PacketRequest);
expect(packet.payload.id).toBe("12345");
expect(packet.payload.action).toBe("users.find");
expect(packet.payload.params).toBe("{\"a\":5}");
expect(packet.payload.meta).toBe("{\"user\":{\"id\":5,\"roles\":[\"user\"]}}");
expect(packet.payload.timeout).toBe(500);

expect(req.nodeID).toBe("remote");
//expect(req.ctx).toBe(ctx);
Expand Down

0 comments on commit be2ccbc

Please sign in to comment.