Skip to content

Commit

Permalink
feat(core-kernel): required plugins to terminate on registration failure
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Faust committed Aug 22, 2019
1 parent 1de4f3f commit d44e29c
Show file tree
Hide file tree
Showing 12 changed files with 85 additions and 10 deletions.
4 changes: 4 additions & 0 deletions packages/core-blockchain/src/service-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,8 @@ export class ServiceProvider extends Support.AbstractServiceProvider {
public provides(): string[] {
return ["blockchain"];
}

public async required(): Promise<boolean> {
return true;
}
}
4 changes: 4 additions & 0 deletions packages/core-database-postgres/src/service-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,8 @@ export class ServiceProvider extends Support.AbstractServiceProvider {
public provides(): string[] {
return ["database"];
}

public async required(): Promise<boolean> {
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { State } from "../../enums/event";
import { FailedServiceProviderBoot } from "../../errors";
import { ServiceProviderRepository } from "../../repositories";
import { AbstractBootstrapper } from "../bootstrapper";

Expand All @@ -18,7 +19,15 @@ export class BootServiceProviders extends AbstractBootstrapper {

for (const [name, serviceProvider] of serviceProviders.all()) {
if (await serviceProvider.enableWhen()) {
await serviceProviders.boot(name);
try {
await serviceProviders.boot(name);
} catch (error) {
if (await serviceProvider.required()) {
throw new FailedServiceProviderBoot(serviceProvider.name(), error.message);
}

serviceProviders.fail(serviceProvider.name());
}
} else {
serviceProviders.defer(name);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@ export class RegisterServiceProviders extends AbstractBootstrapper {
try {
await serviceProviders.register(name);
} catch (error) {
throw new FailedServiceProviderRegistration(serviceProvider.name(), error.message);
if (await serviceProvider.required()) {
throw new FailedServiceProviderRegistration(serviceProvider.name(), error.message);
}

serviceProviders.fail(serviceProvider.name());
}
}
}
Expand All @@ -54,14 +58,10 @@ export class RegisterServiceProviders extends AbstractBootstrapper {
);

for (const dependency of dependencies) {
const { name, version, required, requiredWhen } = dependency;
const { name, version, required } = dependency;

if (!serviceProviders.has(name)) {
let isRequired: boolean = !!required;

if (requiredWhen) {
isRequired = await requiredWhen();
}
const isRequired: boolean = typeof required === "function" ? await required() : !!required;

const error: MissingDependency = new MissingDependency(serviceProvider.name(), name, isRequired);

Expand Down
16 changes: 14 additions & 2 deletions packages/core-kernel/src/contracts/core-kernel/application.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,20 @@ export interface IApplication extends IContainer {
* @interface IServiceProviderDependency
*/
export interface IServiceProviderDependency {
/**
* @type {string}
* @memberof IServiceProviderDependency
*/
name: string;

/**
* @type {string}
* @memberof IServiceProviderDependency
*/
version?: string;
required?: boolean;
requiredWhen?: () => Promise<boolean>;

/**
* @memberof IServiceProviderDependency
*/
required?: boolean | (() => Promise<boolean>);
}
16 changes: 16 additions & 0 deletions packages/core-kernel/src/errors/kernel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,22 @@ export class FailedServiceProviderRegistration extends KernelError {
}
}

/**
* @export
* @class FailedServiceProviderBoot
* @extends {KernelError}
*/
export class FailedServiceProviderBoot extends KernelError {
/**
* @param {string} name
* @param {string} error
* @memberof FailedServiceProviderBoot
*/
constructor(name: string, error: string) {
super(`Failed to boot "${name}": "${error}".`);
}
}

/**
* @export
* @class FailedDependencySatisfaction
Expand Down
10 changes: 10 additions & 0 deletions packages/core-kernel/src/support/service-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,16 @@ export abstract class AbstractServiceProvider {
return false;
}

/**
* Terminate the process if the package is required.
*
* @returns {Promise<boolean>}
* @memberof AbstractServiceProvider
*/
public async required(): Promise<boolean> {
return true;
}

/**
* @protected
* @param {ConfigObject} opts
Expand Down
4 changes: 4 additions & 0 deletions packages/core-logger-pino/src/service-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,8 @@ export class ServiceProvider extends Support.AbstractServiceProvider {
public provides(): string[] {
return ["log"];
}

public async required(): Promise<boolean> {
return true;
}
}
4 changes: 4 additions & 0 deletions packages/core-logger-signale/src/service-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,8 @@ export class ServiceProvider extends Support.AbstractServiceProvider {
public provides(): string[] {
return ["log"];
}

public async required(): Promise<boolean> {
return true;
}
}
4 changes: 4 additions & 0 deletions packages/core-logger-winston/src/service-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,8 @@ export class ServiceProvider extends Support.AbstractServiceProvider {
public provides(): string[] {
return ["log"];
}

public async required(): Promise<boolean> {
return true;
}
}
4 changes: 4 additions & 0 deletions packages/core-p2p/src/service-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ export class ServiceProvider extends Support.AbstractServiceProvider {
return ["p2p"];
}

public async required(): Promise<boolean> {
return true;
}

// @TODO: ioc
private makePeerService(options): PeerService {
const storage = new PeerStorage();
Expand Down
4 changes: 4 additions & 0 deletions packages/core-transaction-pool/src/service-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,8 @@ export class ServiceProvider extends Support.AbstractServiceProvider {
public provides(): string[] {
return ["transactionPool"];
}

public async required(): Promise<boolean> {
return true;
}
}

0 comments on commit d44e29c

Please sign in to comment.