All Versions
64
Latest Version
Avg Release Cycle
35 days
Latest Release
39 days ago

Changelog History
Page 1

  • v0.14.17 Changes

    September 13, 2021

    61 commits from 10 contributors.

    ๐Ÿ”„ Changes

    • reformat codebase with Prettier.
    • ๐Ÿ›  fix binding issue in Pino logger. #974
    • โšก๏ธ update d.ts file. #980 #970
    • transit message handler promises are resolved. #984
    • ๐Ÿ›  fix cacher issue if cacher is not connected. #987
    • ๐Ÿ›  fix Jest open handlers issue. #989
    • ๐Ÿ›  fix cacher cloning issue. #990
    • โž• add custom headers option to Zipkin trace exporter. #993
    • ๐Ÿ›  fix heartbeatTimeout option in BaseDiscoverer. #985
    • โž• add cacher keygen option action definition. #1004
    • โšก๏ธ update dependencies

  • v0.14.16 Changes

    July 21, 2021

    11 commits from 4 contributors.

    ๐Ÿ”„ Changes

    • ๐Ÿ›  fix nats-streaming version in peerDependencies.
    • RedisCacher pingInterval option. #961
    • โšก๏ธ Update NATS transporter messages to debug. #963
    • โšก๏ธ update d.ts file. #964 #966
    • โšก๏ธ update dependencies

  • v0.14.15 Changes

    July 10, 2021

    15 commits from 5 contributors.

    ๐Ÿ”„ Changes

    • ๐Ÿ›  fix nats version in peerDependencies.
    • convert url to servers in [email protected]. #954
    • โž• add typing for mcall settled option. #957
    • โช revert TS ThisType issue in 0.14.14. #958
    • โšก๏ธ update dependencies
    • โž• add useTag259ForMaps: false default option for CBOR serializer to keep the compatibility.

  • v0.14.14 Changes

    June 27, 2021

    105 commits from 11 contributors.

    ๐Ÿ†• New CBOR serializer #905

    CBOR (cbor-x) is a new serializer but faster than any other serializers.

    Example

    // moleculer.config.js
    module.exports = {
        logger: true,
        serializer: "CBOR"
    };
    

    Benchmark

    Suite: Serialize packet with 10bytes
    โˆš JSON               509,217 rps
    โˆš Avro               308,711 rps
    โˆš MsgPack             79,932 rps
    โˆš ProtoBuf           435,183 rps
    โˆš Thrift              93,324 rps
    โˆš Notepack           530,121 rps
    โˆš CBOR             1,016,135 rps
    
       JSON (#)            0%        (509,217 rps)   (avg: 1ฮผs)
       Avro           -39.38%        (308,711 rps)   (avg: 3ฮผs)
       MsgPack         -84.3%         (79,932 rps)   (avg: 12ฮผs)
       ProtoBuf       -14.54%        (435,183 rps)   (avg: 2ฮผs)
       Thrift         -81.67%         (93,324 rps)   (avg: 10ฮผs)
       Notepack        +4.11%        (530,121 rps)   (avg: 1ฮผs)
       CBOR           +99.55%      (1,016,135 rps)   (avg: 984ns)
    

    settled option in broker.mcall

    The broker.mcall method has a new settled option to receive all Promise results. Without this option, if you make a multi-call and one call is rejected, the response will be a rejected Promise and you don't know how many (and which) calls were rejected.

    If settled: true, the method returns a resolved Promise in any case and the response contains the statuses and responses of all calls.

    Example

    const res = await broker.mcall([
        { action: "posts.find", params: { limit: 2, offset: 0 },
        { action: "users.find", params: { limit: 2, sort: "username" } },
        { action: "service.notfound", params: { notfound: 1 } }
    ], { settled: true });
    console.log(res);
    

    The res will be something similar to

    [
        { status: "fulfilled", value: [/*... response of `posts.find`...*/] },
        { status: "fulfilled", value: [/*... response of `users.find`...*/] },
        { status: "rejected", reason: {/*... Rejected response/Error`...*/} }
    ]
    

    ๐Ÿ†• New MOLECULER_CONFIG environment variable in Runner

    ๐Ÿ”ง In the Moleculer Runner, you can configure the configuration filename and path with the MOLECULER_CONFIG environment variable. It means, no need to specify the config file with --config argument.

    ๐Ÿ‘Œ Supporting [email protected] in NATS transporter

    ๐Ÿš€ The new nats 2.x.x version has a new breaking API which has locked the NATS transporter for [email protected] library. As of this release, the NATS transporter supports both major versions of the nats library.

    The transporter automatically detects the version of the library and uses the correct API.

    ๐Ÿ“‡ Async custom validator functions and ctx as metadata

    ๐Ÿ“‡ Since [email protected], the FastestValidator supports async custom validators and you can pass metadata for custom validator functions. ๐Ÿ“‡ In Moleculer, the FastestValidator passes the ctx as metadata. It means you can access to the current context, service, broker and you can make async calls (e.g calling another service) in custom checker functions.

    Example

    // posts.service.js
    module.exports = {
        name: "posts",
        actions: {
            params: {
                $$async: true,
                owner: { type: "string", custom: async (value, errors, schema, name, parent, context) => {
                    const ctx = context.meta;
    
                    const res = await ctx.call("users.isValid", { id: value });
                    if (res !== true)
                        errors.push({ type: "invalidOwner", field: "owner", actual: value });
                    return value;
                } }, 
            },
            /* ... */
        }
    }
    

    ๐Ÿ”„ Changes

    • ๐Ÿ›  fix node crash in encryption mode with TCP transporter. #849
    • ๐Ÿ”ฆ expose Utils in typescript definition. #909
    • other d.ts improvements. #920, #922, #934, #950
    • ๐Ÿ›  fix etcd3 discoverer lease-loss issue #922
    • catch errors in Compression and Encryption middlewares. #850
    • using optional peer dependencies. #911
    • โž• add relevant packet to to serialization and deserialization calls. #932
    • ๐Ÿ›  fix disabled balancer issue with external discoverer. #933

  • v0.14.13 Changes

    April 09, 2021

    62 commits from 12 contributors.

    ๐Ÿ”„ Changes

    • โšก๏ธ update dependencies
    • ๐ŸŒฒ logging if encryption middleware can't decrypt the data instead of crashing. #853
    • ๐Ÿ›  fix disableHeartbeatChecks option handling. #858
    • ๐Ÿ‘ฎ force scanning only master redis nodes for deletion. #865
    • โž• add more info into waitForServices debug log messages. #870
    • ๐Ÿ›  fix EVENT packet Avro schema. #856
    • ๐Ÿ›  fix array & date conversion in cacher default key generator. #883
    • ๐Ÿ›  fix Datadog tracing exporter. #890
    • ๐Ÿ‘ better elapsed time handling in tracing. #899
    • ๐Ÿ‘Œ improve type definitions. #843, #885, #886
    • โž• add E2E tests for CI (test all built-in transporter & serializers)

  • v0.14.12 Changes

    January 03, 2021

    Other changes

    • โšก๏ธ update dependencies
    • ๐Ÿ‘Œ improved type definitions. #816 #817 #834 #840
    • ๐Ÿ‘Œ support rediss:// cacher URI. #837
    • ๐Ÿ›  fix Event Trace exporter generated events loop. #836
    • ๐Ÿ”„ change log level of node disconnected message. #838
    • ๐Ÿ‘Œ improve the broker.waitForServices response. #843
    • ๐Ÿ›  fix recursive hot-reload issue on Linux OS. #848

  • v0.14.11 Changes

    September 27, 2020

    ๐Ÿ†• New merged service lifecycle hook

    ๐Ÿ”€ Service has a new merged lifecycle hook which is called after the service schemas (including mixins) has been merged but before service is registered. It means you can manipulate the merged service schema before it's processed.

    Example

    // posts.service.js
    module.exports = {
        name: "posts",
    
        settings: {},
    
        actions: {
            find: {
                params: {
                    limit: "number"
                }
                handler(ctx) {
                    // ...
                }
            }
        },
    
        merged(schema) {
            // Modify the service settings
            schema.settings.myProp = "myValue";
            // Modify the param validation schema in an action schema
            schema.actions.find.params.offset = "number";
        }
    };
    

    Other changes

    • โž• add requestID tag to all action and event spans #802
    • ๐Ÿ›  fix bug in second level of mixins with $secureSettings #811

  • v0.14.10 Changes

    August 23, 2020

    ๐Ÿ”„ Changes

    • โšก๏ธ update dependencies
    • ๐Ÿ›  fix issues in index.d.ts
    • ๐Ÿ›  fix broadcast event sending issue when disableBalancer: true #799 (thanks for ngraef)

  • v0.14.9 Changes

    August 06, 2020

    Register method in module resolver

    If you create a custom module (e.g. serializer), you can register it into the built-in modules with the register method. This method is also available in all other built-in module resolver.

    Example

    // SafeJsonSerializer.js
    const { Serializers } = require("moleculer");
    
    class SafeJsonSerializer {}
    
    Serializers.register("SafeJSON", SafeJSON);
    
    module.exports = SafeJsonSerializer;
    
    // moleculer.config.js
    require("./SafeJsonSerializer");
    
    module.exports = {
        nodeID: "node-100",
        serializer: "SafeJSON"
        // ...
    });
    

    ๐Ÿ”„ Changeable validation property name

    You can change the params property name in validator options. It can be useful if you have a custom Validator implementation.

    const broker = new ServiceBroker({
        validator: {
            type: "Fastest",
            options: {
                paramName: "myParams" // using `myParams` instead of `params`
            }
        }
    });
    
    broker.createService({
        name: "posts",
        actions: {
            create: {
                myParams: {
                    title: "string"
                }
            },
            handler(ctx) { /* ... */ }
        }
    });
    

    Global tracing span tags for actions & events

    ๐Ÿ”ง Thanks for @kthompson23, you can configure the action & events tracing span tags globally. These tags will be used for all actions & events where tracing is enabled. Of course, you can overwrite them locally in the action & event schema.

    Example

    // moleculer.config.js
    module.exports = {
        tracing: {
            enabled: true,
            exporter: 'Zipkin',
            tags: {
                action: {
                    meta: ['app.id', 'user.email', 'workspace.name'],
                    params: false,  // overrides default behavior of all params being adding as tags
                    response: true,
                },
                event: (ctx) {
                    return {
                        caller: ctx.caller,
                    }
                }  
            }
        }
    }
    

    Other changes

    • ๐Ÿ›  fix multiple trace spans with same ID issue in case of retries.
    • โšก๏ธ update dependencies
    • โž• add lastValue property to histogram metric type.
    • โšก๏ธ update return type of context's copy method.
    • โž• add configuration hotReloadModules #779
    • โœ‚ Remove Zipkin v1 annotations and change kind to SERVER

  • v0.14.8 Changes

    June 27, 2020

    Github Sponsoring is available for Moleculer :tada:

    We have been approved in Github Sponsors program, so you can sponsor the Moleculer project via Github Sponsors. If you have taxing problem with Patreon, change to Github Sponsors.

    ๐Ÿ†• New Validator configuration

    ๐Ÿ”ง The validator has the same module configuration in broker options like other modules. It means you can configure the validation constructor options via broker options (moleculer.config.js).

    0๏ธโƒฃ Default usage:

    //moleculer.config.js
    module.exports = {
        nodeID: "node-100",
        validator: true // Using the default Fastest Validator
    }
    

    Using built-in validator name:

    //moleculer.config.js
    module.exports = {
        nodeID: "node-100",
        validator: "FastestValidator" // Using the Fastest Validator
    }
    

    Example with options:

    //moleculer.config.js
    module.exports = {
        nodeID: "node-100",
        validator: {
            type: "FastestValidator",
            options: {
                useNewCustomCheckerFunction: true,
                defaults: { /*...*/ },
                messages: { /*...*/ },
                aliases: { /*...*/ }
            }
        }
    }
    

    Example with custom validator

    //moleculer.config.js
    const BaseValidator = require("moleculer").Validators.Base;
    
    class MyValidator extends BaseValidator {}
    
    module.exports = {
        nodeID: "node-100",
        validator: new MyValidator()
    }
    

    ๐Ÿ†• New metrics

    โž• Added the following new metrics:

    • moleculer.event.received.active: Number of active event executions.
    • moleculer.event.received.error.total: Number of event execution errors.
    • moleculer.event.received.time: Execution time of events in milliseconds.
    • os.memory.total: OS used memory size.

    Other changes

    • ๐Ÿ‘Œ support using moleculer.config.js with export default.
    • โœ‚ remove some lodash methods.
    • โฌ†๏ธ upgrade to the latest tsd.
    • ๐Ÿ†• new dependencyInterval broker option. Using as default value for broker.waitForServices #761
    • ๐Ÿ›  fix Datadog traceID, spanID generation logic to work with latest dd-trace.
    • โž• add error stack trace to EventLegacy trace exporter.
    • ๐Ÿ›  fix INFO key issue in Redis Discoverer after Redis server restarting.