Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/service-broker.js
Original file line number Diff line number Diff line change
Expand Up @@ -394,9 +394,11 @@ class ServiceBroker {
* It is necessary to keep the context of the call when using call middleware.
*/
interceptCallMiddleware(createMiddleware) {
return next => {
// We need to use ordinary function here, so "this" identifier can be bound to it later via call method.
return function (next) {
let result = null;
const call = createMiddleware((...args) => (result = next(...args)));
// Preserve "this" identifier inside intercepted middleware.
const call = createMiddleware.call(this, (...args) => (result = next(...args)));
return (...args) => {
const promise = call(...args);
if (result) promise.ctx = result.ctx;
Expand Down
14 changes: 13 additions & 1 deletion test/integration/middlewares.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,18 @@ describe("Test middleware system", () => {
validator: false,
internalMiddlewares: false,
middlewares: [
{
call(next) {
return (...args) => {
if (this.nodeID !== broker.nodeID) {
throw new Error(
"This identifier inside call middleware is incorrect."
);
}
return next(...args);
};
}
},
{
call(next) {
return (actionName, params, opts) => {
Expand Down Expand Up @@ -56,7 +68,7 @@ describe("Test middleware system", () => {
beforeAll(() => broker.start());
afterAll(() => broker.stop());

it("The context is passed through the call middlware.", async () => {
it("The context is passed through the call middleware.", async () => {
const p = broker.call("test.testAction");
await expect(p).resolves.toBe("testmeta!");
expect(p.ctx).toBeDefined();
Expand Down
18 changes: 18 additions & 0 deletions test/unit/service-broker.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,24 @@ describe("Test broker.interceptCallMiddleware", () => {
expect(result.ctx).toEqual({ test: "test" });
await expect(result).resolves.toBe("middleware-result");
});

it("call interceptor should preserve this identifier", async () => {
const testThis = "test-this";

const createTestMiddleware = function (next) {
return async (...args) => {
await next(...args);
// This must be equal to testThis.
return this;
};
};

const createInterceptedMiddleware = broker.interceptCallMiddleware(createTestMiddleware);

const result = createInterceptedMiddleware.call(testThis, () => Promise.resolve())();

await expect(result).resolves.toBe(testThis);
});
});

describe("Test broker.start", () => {
Expand Down
Loading