diff --git a/src/runner-esm.mjs b/src/runner-esm.mjs index 41f11b76..02bc5a9a 100644 --- a/src/runner-esm.mjs +++ b/src/runner-esm.mjs @@ -86,7 +86,8 @@ export default class MoleculerRunner { .option("env", "Load .env file from the current directory") .option("envfile", "Load a specified .env file") .option("instances", "Launch [number] instances node (load balanced)") - .option("mask", "Filemask for service loading"); + .option("mask", "Filemask for service loading") + .option("dependencies", "List of global dependencies for all services"); this.flags = Args.parse(procArgs, { mri: { @@ -98,13 +99,18 @@ export default class MoleculerRunner { e: "env", E: "envfile", i: "instances", - m: "mask" + m: "mask", + d: "dependencies" }, boolean: ["repl", "silent", "hot", "env"], - string: ["config", "envfile", "mask"] + string: ["config", "envfile", "mask", "dependencies"] } }); + if (this.flags.dependencies) { + this.flags.dependencies = this.flags.dependencies.split(",").map(dep => dep.trim()); + } + this.servicePaths = Args.sub; } diff --git a/src/runner.js b/src/runner.js index 2cd25828..6f2afc24 100644 --- a/src/runner.js +++ b/src/runner.js @@ -83,7 +83,8 @@ class MoleculerRunner { .option("env", "Load .env file from the current directory") .option("envfile", "Load a specified .env file") .option("instances", "Launch [number] instances node (load balanced)") - .option("mask", "Filemask for service loading"); + .option("mask", "Filemask for service loading") + .option("dependencies", "List of global dependencies for all services"); this.flags = Args.parse(procArgs, { mri: { @@ -95,13 +96,18 @@ class MoleculerRunner { e: "env", E: "envfile", i: "instances", - m: "mask" + m: "mask", + d: "dependencies" }, boolean: ["repl", "silent", "hot", "env"], - string: ["config", "envfile", "mask"] + string: ["config", "envfile", "mask", "dependencies"] } }); + if (this.flags.dependencies) { + this.flags.dependencies = this.flags.dependencies.split(",").map(dep => dep.trim()); + } + this.servicePaths = Args.sub; } @@ -307,6 +313,8 @@ class MoleculerRunner { if (this.flags.hot) this.config.hotReload = true; + if (this.flags.dependencies) this.config.initialDependencies = this.flags.dependencies; + // console.log("Merged configuration", this.config); } diff --git a/src/service-broker.js b/src/service-broker.js index aac4410f..149156d4 100644 --- a/src/service-broker.js +++ b/src/service-broker.js @@ -46,6 +46,8 @@ const defaultOptions = { errorRegenerator: null, + initialDependencies: [], + requestTimeout: 0 * 1000, retryPolicy: { enabled: false, diff --git a/src/service.js b/src/service.js index cd430529..b65a1c55 100644 --- a/src/service.js +++ b/src/service.js @@ -287,13 +287,33 @@ class Service { return this.broker.callMiddlewareHook("serviceStarting", [this]); }) .then(() => { - // Wait for dependent services - if (this.schema.dependencies) - return this.waitForServices( - this.schema.dependencies, - this.settings.$dependencyTimeout || this.broker.options.dependencyTimeout, - this.settings.$dependencyInterval || this.broker.options.dependencyInterval - ); + if (this.schema.dependencies) { + const dependencies = []; + + if (this.broker.options.initialDependencies) + this.broker.options.initialDependencies.forEach(dependencie => { + if (dependencie !== this.name) dependencies.push(dependencie); + }); + + if (this.schema.dependencies) + Array.isArray(this.schema.dependencies) + ? this.schema.dependencies.forEach(dependencie => { + if (dependencie !== this.name) dependencies.push(dependencie); + }) + : dependencies.push(this.schema.dependencies); + + const uniqueDependencies = _.uniq(dependencies); + + if (uniqueDependencies.length > 0) { + return this.waitForServices( + uniqueDependencies, + this.settings.$dependencyTimeout || + this.broker.options.dependencyTimeout, + this.settings.$dependencyInterval || + this.broker.options.dependencyInterval + ); + } + } }) .then(() => { if (isFunction(this.schema.started)) diff --git a/test/unit/service-broker.spec.js b/test/unit/service-broker.spec.js index cfe2fc28..b2133c71 100644 --- a/test/unit/service-broker.spec.js +++ b/test/unit/service-broker.spec.js @@ -166,6 +166,7 @@ describe("Test ServiceBroker constructor", () => { enabled: true, retries: 3 }, + initialDependencies: [], contextParamsCloning: true, maxCallLevel: 10, requestTimeout: 5000, @@ -280,6 +281,7 @@ describe("Test ServiceBroker constructor", () => { factor: 2, check: expect.any(Function) }, + initialDependencies: [], requestTimeout: 5000, maxCallLevel: 10, maxSafeObjectSize: null,