Skip to content

Releases: moleculerjs/moleculer-web

v0.10.7

12 Nov 18:12
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.10.6...v0.10.7

v0.10.6

15 Jul 17:35
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.10.5...v0.10.6

v0.10.5

17 Dec 16:22
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.10.4...v0.10.5

v0.10.4

09 Jan 10:06
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.10.3...v0.10.4

v0.10.3

17 Oct 13:49
Compare
Choose a tag to compare

Named authenticate & authorize methods #275

You can define custom authentication and authorization methods for every routes. In this case you should set the method name instead of true value.

module.exports = {
    mixins: ApiGatewayService,

    settings: {

        routes: [
            {
                path: "/aaa",
                authentication: "aaaAuthn",
                authorization: "aaaAuthz",
                aliases: {
                    "GET hello": "test.hello"
                }
            },
            {
                path: "/bbb",
                authentication: "bbbAuthn",
                authorization: "bbbAuthz",
                aliases: {
                    "GET hello": "test.hello"
                }
            },
            {
                path: "/ccc",
                authentication: true,
                authorization: true,
                aliases: {
                    "GET hello": "test.hello"
                }
            }
        ]
    },

    methods: {
        aaaAuthn() {
            // ... do authn
        },
        aaaAuthz() {
            // ... do authz
        },

        bbbAuthn() {
            // ... do authn
        },
        bbbAuthz() {
            // ... do authz
        },

        authenticate() {
            // ... do authn
        },
        authorize() {
            // ... do authz
        }
    }
}

Configure rate limit options in routes level

module.exports = {
    name: 'api',
    mixins: [ApiGateway],
    settings: {
        rateLimit: rateLimitGlobalConfig,
        routes: [
            {
                path: '/withLocalRateLimit',
                // now you can pass rateLimit here
                // it will override the global rateLimit
                rateLimit: rateLimitConfig,
                aliases: {
                    'GET /2': 'test.2'
                }
            },
            {
                path: '/withGlobalRateLimit',
                aliases: {
                    'GET /1': 'test.1'
                }
            }
        ]
    }
}

Other changes

  • update dependencies.
  • add support for custom cors origin function. #274
  • typescript definition file is rewritten. #259

v0.10.2

05 Sep 15:38
Compare
Choose a tag to compare

Named routes

Many developers issued that version 0.10 doesn't support multiple routes with the same path. This version fixes it but you should give a unique name for the routes if they have same path.

Example
You can call /api/hi without auth, but /api/hello only with auth.

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        path: "/api",

        routes: [
            {
                name: "no-auth-route", // unique name
                path: "/",
                aliases: {
                    hi: "greeter.hello",
                }
            },
            {
                name: "with-auth-route", // unique name
                path: "/",
                aliases: {
                    "hello": "greeter.hello",
                },
                authorization: true
            }
        ]
    }
};

Changes

  • add removeRouteByName(name: string) method to remove a route by its name.

v0.10.1

01 Sep 17:29
Compare
Choose a tag to compare

Changes

  • set the default JSON bodyparser if bodyParser: true. #258
  • add pathToRegexpOptions to route options to make available to pass options to path-to-regexp library. #268
  • add debounceTime to route options to make available to change the debounce time at service changes. #260
  • new errorHandler method to allow developers to change the default error handling behaviour. #266
  • fixes CORS preflight request handling in case of full-path aliases. #269
  • update dependencies

v0.10.0

27 Jun 19:04
Compare
Choose a tag to compare

Breaking changes

Avoid array wrapping at file uploading

Many users issued that at file uploading the response always wrapped into an array even single file uploading. This issues is fixed in this version.
If you define files: 1 in busboy settings, the response won't be wrapped into array.

Example

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        path: "/upload",

        routes: [
            {
                path: "/upload",

                busboyConfig: {
                    limits: {
                        files: 1
                    }
                },
            }
        ]
    }
};

JSON body-parser is the new default.

In early version, if you added multiple routes, you should always set JSON body-parser. As of v0.10, it's the new default, if you don't define bodyParsers in the route options. If you don't want to use any body-parsers just set bodyParsers: false.

Example: disable body parsers

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        routes: [
            {
                path: "/api",
                bodyParsers: false
            }
        ]
    }
};

New features

Actions for adding and removing routes

The addRoute and removeRoute methods exposed to service actions, as well. It means, you can add/remove routes from remote nodes, as well.

Adding a new route

broker.call("api.addRoute", {
    route: {
        path: "/api",
        aliases: {
            "hi": "greeter.hello"
        }
    },
    toBottom: true // add this route to the end of the route list.
})

Removing a route

broker.call("api.removeRoute", { path: "/api" });

New logging options

There are two new logging service settings: logRequest, logResponse. You can define the logging level for request & response log messages.

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        logRequest: "debug", // Logging with debug level
        logResponse: false, // Disable logging
        //.....
    }
};

New rootCallOptions options

There a new rootCallOptions property in the service settings. Here you can define the root Context calling options. It can be a static Object or a Function. It can be useful to take some data from the req and put them to the calling options (like tracing informations)

Example with static object

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        routes: [/*...*/],

        rootCallOptions: {
            timeout: 500
        }
    }
};

Example with Function which takes tracing information from the req and put them to the calling options

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        routes: [/*...*/],

        rootCallOptions(options, req, res) {
            if (req.headers["traceparent"]) {
                // More info https://www.w3.org/TR/trace-context/#traceparent-header
                const traceparent = req.headers["traceparent"].toLowerCase();
                if (traceparent.match(/^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/)) {
                    const [version, id, parentSpan, flags] = traceparent.split("-");
                    const sampled = (flags & FLAG_SAMPLED) == FLAG_SAMPLED;

                    options.parentSpan = {
                        id: parentSpan,
                        traceID: id,
                        sampled
                    };
                }
            } else {
                // Look for X-B3-Traceid, X-B3-Spanid
                options.parentSpan = {};

                if (req.headers["x-b3-traceid"]) {
                    options.parentSpan.traceID = req.headers["x-b3-traceid"].toLowerCase();
                    options.parentSpan.sampled = true;
                }
                if (req.headers["x-b3-spanid"]) {
                    options.parentSpan.id = req.headers["x-b3-spanid"].toLowerCase();
                }
            }
        }
    }
};

Multiple route aliases

You can define multiple REST aliases in the action definitions.

module.exports = {
    name: "posts",

    settings: {
        rest: ["/posts", "/v1/posts"]
    },

    actions: {
        find: {
            rest: ["GET /", "GET /all"]
            handler(ctx) {}
        }
    }
};

Multipart fields & URL Params

Several issues has been fixed with multipart handling.

  • URL parameters (e.g. /api/upload/:tenant/:folder) is available via ctx.meta.$params
  • Multipart fields is available via ctx.meta.$multipart
  • ctx.params.$params is not available, use ctx.meta.$params
  • The target action is called if no uploaded files but has multipart fields. In this case ctx.params is {} and the fields are in ctx.meta.$multipart.

Other changes

  • set response header from ctx.meta in case of errors, as well.
  • update dependencies.
  • update index.d.ts.
  • remove deprecated publish: false condition. Use `visibility: "public", instead.

v0.10.0-beta3

26 Mar 10:24
Compare
Choose a tag to compare
v0.10.0-beta3 Pre-release
Pre-release

New rootCallOptions options

There a new rootCallOptions property in the service settings. Here you can define the root Context calling options. It can be a static Object or a Function. It can be useful to take some data from the req and put them to the calling options (like tracing informations)

Example with static object

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        routes: [/*...*/],

        rootCallOptions: {
            timeout: 500
        }
    }
};

Example with Function which takes tracing information from the req and put them to the calling options

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        routes: [/*...*/],

        rootCallOptions(options, req, res) {
            if (req.headers["traceparent"]) {
                // More info https://www.w3.org/TR/trace-context/#traceparent-header
                const traceparent = req.headers["traceparent"].toLowerCase();
                if (traceparent.match(/^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/)) {
                    const [version, id, parentSpan, flags] = traceparent.split("-");
                    const sampled = (flags & FLAG_SAMPLED) == FLAG_SAMPLED;

                    options.parentSpan = {
                        id: parentSpan,
                        traceID: id,
                        sampled
                    };
                }
            } else {
                // Look for X-B3-Traceid, X-B3-Spanid
                options.parentSpan = {};

                if (req.headers["x-b3-traceid"]) {
                    options.parentSpan.traceID = req.headers["x-b3-traceid"].toLowerCase();
                    options.parentSpan.sampled = true;
                }
                if (req.headers["x-b3-spanid"]) {
                    options.parentSpan.id = req.headers["x-b3-spanid"].toLowerCase();
                }
            }
        }
    }
};

Multiple route aliases

You can define multiple REST aliases in the action definitions.

module.exports = {
    name: "posts",

    settings: {
        rest: ["/posts", "/v1/posts"]
    },

    actions: {
        find: {
            rest: ["GET /", "GET /all"]
            handler(ctx) {}
        }
    }
};

v0.10.0-beta1

20 Jul 18:08
Compare
Choose a tag to compare
v0.10.0-beta1 Pre-release
Pre-release

Breaking changes

Avoid array wrapping at file uploading

Many users issued that at file uploading the response always wrapped into an array even single file uploading. This issues is fixed in this version.
If you define files: 1 in busboy settings, the response won't be wrapped into array.

Example

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        path: "/upload",

        routes: [
            {
                path: "/upload",

                busboyConfig: {
                    limits: {
                        files: 1
                    }
                },
            }
        ]
    }
};

JSON body-parser is the new default.

In early version, if you added multiple routes, you should always set JSON body-parser. As of v0.10, it's the new default, if you don't define bodyParsers in the route options. If you don't want to use any body-parsers just set bodyParsers: false.

Example: disable body parsers

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        routes: [
            {
                path: "/api",
                bodyParsers: false
            }
        ]
    }
};

New features

Actions for adding and removing routes

The addRoute and removeRoute methods exposed to service actions, as well. It means, you can add/remove routes from remote nodes, as well.

Adding a new route

broker.call("api.addRoute", {
    route: {
        path: "/api",
        aliases: {
            "hi": "greeter.hello"
        }
    },
    toBottom: true // add this route to the end of the route list.
})

Removing a route

broker.call("api.removeRoute", { path: "/api" });

New logging options

There are two new logging service settings: logRequest, logResponse. You can define the logging level for request & response log messages.

const ApiGateway = require("moleculer-web");

module.exports = {
    mixins: [ApiGateway],
    settings: {
        logRequest: "debug", // Logging with debug level
        logResponse: false, // Disable logging
        //.....
    }
};

Other changes

  • set response header from ctx.meta in case of errors, as well.
  • update dependencies.
  • update index.d.ts.
  • remove deprecated publish: false condition. Use `visibility: "public", instead.