Ghost/ghost/moleculer-service-from-class
Daniel Lockyer f918398779 Added c8 test coverage to all packages
refs https://github.com/TryGhost/Team/issues/870

- using `c8` allows us to see test coverage for all packages in the repo
- this commit adds `c8` as a dev dependency and prepends the `mocha`
  command with `c8` so it runs on all tests
2021-07-14 11:26:06 +01:00
..
lib Improved handling of invalid actions 2020-05-18 15:41:16 +02:00
test Remove trailing commas from .eslintrc.js files 2020-08-04 14:48:07 +01:00
types Added newly generated TypeScript definiton files 2021-04-07 13:41:49 +12:00
.eslintrc.js Remove trailing commas from .eslintrc.js files 2020-08-04 14:48:07 +01:00
index.js Added @tryghost/moleculer-service-from-class 2020-04-16 15:14:03 +02:00
LICENSE 2021 2021-01-25 16:20:43 +00:00
package.json Added c8 test coverage to all packages 2021-07-14 11:26:06 +01:00
README.md 2021 2021-01-25 16:20:43 +00:00
tsconfig.json Added @tryghost/moleculer-service-from-class 2020-04-16 15:14:03 +02:00

Moleculer Service From Class

This module is used to wrap a standard JS Class as a moleculer service, exposing the public methods as actions on the service. It will also wrap other moleculer services in an object with methods, for each of the services actions and injects them into the class constructor.

This allows us to write generic code, and then use moleculer as the transport layer between services, taking advantage of its load balancing, transporters, logging, tracing & other niceitys

Because moleculer is an asyncronous transport mechanism - all methods MUST be async. Also all methods should accept params as an object with keys - this works with moleculers concept of ctx.params much better.

Private methods are prefixed with an underscore ('_')

Install

npm install @tryghost/moleculer-service-from-class --save

or

yarn add @tryghost/moleculer-service-from-class

Usage

const srvFromClass = require('@tryghost/moleculer-service-from-class');

class SomeService {
    async capitalize({string}) {
        return string.toUpperCase();
    }
}

class MyAwesomeService {
    constructor({someService, someConfig}) {
        this._someService = someService;
        this._someConfig = someConfig;
    }

    async myCoolMethod({name}) {
        const NAME = await this._someService.capitalize({string: name});

        return `${this._someConfig.greeting}, ${NAME}`;
    }
}

/**
 * Moleculer way
 */

const { ServiceBroker } = require('moleculer');

const broker = new ServiceBroker();
broker.addService(srvFromClass({
    Service: SomeService,
    name: 'some-service'
}));
broker.addService(srvFromClass({
    Service: MyAwesomeService,
    name: 'awesome',
    serviceDeps: {
        someService: 'some-service'
    },
    staticDeps: {
        someConfig: { greeting: 'hello' }
    }
}))

broker.start().then(() => {
    broker.call('awesome.myCoolMethod', {name: 'egg'}).then(console.log);
});


/**
 * Generic way
 */

const awesome = new MyAwesomeService({
    someConfig: { greeting: 'Hello' },
    someService: new SomeService()
});

awesome.myCoolMethod({name: 'egg'}).then(console.log);

Develop

This is a mono repository, managed with lerna.

Follow the instructions for the top-level repo.

  1. git clone this repo & cd into it as usual
  2. Run yarn to install top-level dependencies.

Run

  • yarn dev

Test

  • yarn lint run just eslint
  • yarn test run lint and tests

Copyright & License

Copyright (c) 2013-2021 Ghost Foundation - Released under the MIT license.