Releases: moleculerjs/moleculer-web
v0.10.7
What's Changed
- SSE Example with simple chat by @DonVietnam in #329
- fix: secure header assignment to avoid process crash by @furanzujin in #330
- Avoid stream hanging on error by @richardgarnier in #337
- imp(index.d.ts): correct export ts types by @0x0a0d in #338
- imp(index.d.ts): correct server type by @0x0a0d in #340
- fix: request url not logged correctly by @emiljanitzek in #341
- refactor: simplify http handler test with reusable setup functions by @emiljanitzek in #342
New Contributors
- @DonVietnam made their first contribution in #329
- @furanzujin made their first contribution in #330
- @richardgarnier made their first contribution in #337
- @emiljanitzek made their first contribution in #341
Full Changelog: v0.10.6...v0.10.7
v0.10.6
What's Changed
- update qs package to mitigate CVE-2022-24999 by @MichaelErmer in #320
- fix: correct types for route middleware functions by @andree-parakey in #327
- fix: incorrect key for calloptions type by @andree-parakey in #328
- feat: add support for qs options by @daniel-parakey in #326
New Contributors
- @MichaelErmer made their first contribution in #320
- @andree-parakey made their first contribution in #327
- @daniel-parakey made their first contribution in #326
Full Changelog: v0.10.5...v0.10.6
v0.10.5
What's Changed
- fix: #298: register on close and error event on response by @giovanni-bertoncelli in #299
- fix: resolve promise when close event is fired for res by @michelevincenzi in #301
- Update version number in changelog file by @HazemKhaled in #303
- Improve d.ts by @0x0a0d in #310
- add default reqTimeout by @AndreMaz in #312
- Improve rate limiter by @thib3113 in #317
- add
originalUrl
,parsedUrl
, andquery
to request typing by @OutdatedVersion in #304 - fix: add 201 Created to status codes by @mtiller in #297
New Contributors
- @giovanni-bertoncelli made their first contribution in #299
- @michelevincenzi made their first contribution in #301
- @HazemKhaled made their first contribution in #303
- @thib3113 made their first contribution in #317
- @mtiller made their first contribution in #297
Full Changelog: v0.10.4...v0.10.5
v0.10.4
What's Changed
- d.ts for v0.10.2 v0.10.3 by @0x0a0d in #280
- skip services without settings by @kechkibet in #283
- Fix to comment in multi-auth example by @machinaexdeo in #286
- Add alias as last parameter by @icebob in #290
- Fix cors problem in assets by @moonrailgun in #289
- Broadcast event after alias regeneration by @icebob in #292
New Contributors
- @kechkibet made their first contribution in #283
- @machinaexdeo made their first contribution in #286
- @moonrailgun made their first contribution in #289
Full Changelog: v0.10.3...v0.10.4
v0.10.3
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
v0.10.2
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
Changes
- set the default JSON bodyparser if
bodyParser: true
. #258 - add
pathToRegexpOptions
to route options to make available to pass options topath-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
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 viactx.meta.$params
- Multipart fields is available via
ctx.meta.$multipart
ctx.params.$params
is not available, usectx.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 inctx.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
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
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.