@bull-board/nestjs 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # <img alt="@bull-board" src="https://raw.githubusercontent.com/felixmosh/bull-board/master/packages/ui/src/static/images/logo.svg" width="35px" /> @bull-board/nestjs
2
+
3
+ [NestJS](https://nestjs.com/) for `bull-board`.
4
+
5
+ <p align="center">
6
+ <a href="https://www.npmjs.com/package/@bull-board/nestjs">
7
+ <img alt="npm version" src="https://img.shields.io/npm/v/@bull-board/nestjs">
8
+ </a>
9
+ <a href="https://www.npmjs.com/package/bull-board">
10
+ <img alt="npm downloads" src="https://img.shields.io/npm/dw/bull-board">
11
+ </a>
12
+ <a href="https://github.com/vcapretz/bull-board/blob/master/LICENSE">
13
+ <img alt="licence" src="https://img.shields.io/github/license/vcapretz/bull-board">
14
+ </a>
15
+ <p>
16
+
17
+ ![UI](https://raw.githubusercontent.com/felixmosh/bull-board/master/screenshots/dashboard.png)
18
+
19
+ ## Installation
20
+
21
+ Install both @bull-board/api and this module.
22
+ ```bash
23
+ $ npm install --save @bull-board/nestjs @bull-board/api
24
+ ```
25
+
26
+ Install the Express or Fastify adapter depending on what you use in NestJS (default is Express)
27
+ ```bash
28
+ $ npm install --save @bull-board/express
29
+ //or
30
+ $ npm install --save @bull-board/fastify
31
+ ```
32
+
33
+ ## Register the root module
34
+ Once the installation is completed, we can import the `BullBoardModule` into your rootmodule e.g. `AppModule`.
35
+
36
+ ```typescript
37
+ import { Module } from '@nestjs/common';
38
+ import { BullBoardModule } from "@bull-board/nestjs";
39
+ import { ExpressAdapter } from "@bull-board/express";
40
+
41
+ @Module({
42
+ imports: [
43
+ BullModule.forRoot({
44
+ // your bull module config here.
45
+ }),
46
+
47
+ BullBoardModule.forRoot({
48
+ route: '/queues',
49
+ adapter: ExpressAdapter // Or FastifyAdapter from `@bull-board/fastify`
50
+ }),
51
+ ],
52
+ })
53
+ export class AppModule {
54
+ }
55
+ ```
56
+
57
+ The `forRoot()` method registers the bull-board instance and allows you to pass several options to both the instance and module.
58
+ The following options are available.
59
+ - `route` the base route for the bull-board instance adapter.
60
+ - `adapter` The routing adapter to be used, either the Express Adapter or Fastify Adapter provided by bull-board.
61
+ - `boardOptions` options as provided by the bull-board package, such as `uiBasePath` and `uiConfig`
62
+ - `middleware` optional middleware for the express adapter (e.g. basic authentication)
63
+
64
+ ## Register your queues
65
+ To register a new queue, you need to register `BullBoardModule.forFeature` in the same module as where your queues are registered.
66
+
67
+ ```typescript
68
+ import { Module } from '@nestjs/common';
69
+ import { BullBoardModule } from "@bull-board/nestjs";
70
+ import { BullModule } from "@nestjs/bullmq";
71
+
72
+ @Module({
73
+ imports: [
74
+ BullModule.registerQueue(
75
+ {
76
+ name: 'my_awesome_queue'
77
+ }
78
+ ),
79
+
80
+ BullBoardModule.forFeature({
81
+ name: 'my_awesome_queue',
82
+ adapter: BullMQAdapter, //or use BullAdapter if you're using bull instead of bullMQ
83
+ }),
84
+ ],
85
+ })
86
+ export class FeatureModule {}
87
+ ```
88
+
89
+ The `forFeature` method registers the given queues to the bull-board instance.
90
+ The following options are available.
91
+ - `name` the queue name to register
92
+ - `adapter` either `BullAdapter` or `BullMQAdapter` depending on which package you use.
93
+ - `options` queue adapter options as found in the bull-board package, such as `readOnlyMode`, `description` etc.
94
+
95
+ ## Using the bull-board instance in your controllers and/or services.
96
+ The created bull-board instance is available via the `@InjectBullBoard()` decorator.
97
+ For example in a controller:
98
+
99
+ ```typescript
100
+ import { Controller, Get } from "@nestjs/common";
101
+ import { BullBoardInstance, InjectBullBoard } from "@bull-board/nestjs";
102
+
103
+ @Controller('my-feature')
104
+ export class FeatureController {
105
+
106
+ constructor(
107
+ @InjectBullBoard() private readonly boardInstance: BullBoardInstance
108
+ ) {
109
+ }
110
+
111
+ //controller methods
112
+ }
113
+ ```
114
+
115
+ # Usage examples
116
+ 1. [Simple NestJS setup](https://github.com/felixmosh/bull-board/tree/master/examples/with-nestjs)
117
+
118
+ For more info visit the main [README](https://github.com/felixmosh/bull-board#readme)
@@ -0,0 +1,4 @@
1
+ export declare const BULL_BOARD_OPTIONS = "bull_board_options";
2
+ export declare const BULL_BOARD_QUEUES = "bull_board_queues";
3
+ export declare const BULL_BOARD_ADAPTER = "bull_board_adapter";
4
+ export declare const BULL_BOARD_INSTANCE = "bull_board_instance";
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BULL_BOARD_INSTANCE = exports.BULL_BOARD_ADAPTER = exports.BULL_BOARD_QUEUES = exports.BULL_BOARD_OPTIONS = void 0;
4
+ exports.BULL_BOARD_OPTIONS = 'bull_board_options';
5
+ exports.BULL_BOARD_QUEUES = 'bull_board_queues';
6
+ exports.BULL_BOARD_ADAPTER = 'bull_board_adapter';
7
+ exports.BULL_BOARD_INSTANCE = 'bull_board_instance';
@@ -0,0 +1 @@
1
+ export declare const InjectBullBoard: () => ParameterDecorator;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectBullBoard = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const bull_board_constants_1 = require("./bull-board.constants");
6
+ const InjectBullBoard = () => (0, common_1.Inject)(bull_board_constants_1.BULL_BOARD_INSTANCE);
7
+ exports.InjectBullBoard = InjectBullBoard;
@@ -0,0 +1,10 @@
1
+ import { OnModuleInit } from "@nestjs/common";
2
+ import { ModuleRef } from "@nestjs/core";
3
+ import { BullBoardInstance, BullBoardQueueOptions } from "./bull-board.types";
4
+ export declare class BullBoardFeatureModule implements OnModuleInit {
5
+ private readonly moduleRef;
6
+ private readonly queues;
7
+ private readonly board;
8
+ constructor(moduleRef: ModuleRef, queues: BullBoardQueueOptions[], board: BullBoardInstance);
9
+ onModuleInit(): any;
10
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.BullBoardFeatureModule = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const core_1 = require("@nestjs/core");
18
+ const bull_shared_1 = require("@nestjs/bull-shared");
19
+ const bull_board_constants_1 = require("./bull-board.constants");
20
+ let BullBoardFeatureModule = exports.BullBoardFeatureModule = class BullBoardFeatureModule {
21
+ constructor(moduleRef, queues, board) {
22
+ this.moduleRef = moduleRef;
23
+ this.queues = queues;
24
+ this.board = board;
25
+ }
26
+ onModuleInit() {
27
+ for (const queueOption of this.queues) {
28
+ const queue = this.moduleRef.get((0, bull_shared_1.getQueueToken)(queueOption.name), { strict: false });
29
+ const queueAdapter = new queueOption.adapter(queue, queueOption.options);
30
+ this.board.addQueue(queueAdapter);
31
+ }
32
+ }
33
+ };
34
+ exports.BullBoardFeatureModule = BullBoardFeatureModule = __decorate([
35
+ (0, common_1.Module)({}),
36
+ __param(1, (0, common_1.Inject)(bull_board_constants_1.BULL_BOARD_QUEUES)),
37
+ __param(2, (0, common_1.Inject)(bull_board_constants_1.BULL_BOARD_INSTANCE)),
38
+ __metadata("design:paramtypes", [core_1.ModuleRef, Array, Object])
39
+ ], BullBoardFeatureModule);
@@ -0,0 +1,6 @@
1
+ import { DynamicModule } from "@nestjs/common";
2
+ import { BullBoardModuleOptions, BullBoardQueueOptions } from "./bull-board.types";
3
+ export declare class BullBoardModule {
4
+ static forFeature(...queues: BullBoardQueueOptions[]): DynamicModule;
5
+ static forRoot(options: BullBoardModuleOptions): DynamicModule;
6
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var BullBoardModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.BullBoardModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const bull_board_feature_module_1 = require("./bull-board.feature-module");
13
+ const bull_board_root_module_1 = require("./bull-board.root-module");
14
+ const bull_board_constants_1 = require("./bull-board.constants");
15
+ let BullBoardModule = exports.BullBoardModule = BullBoardModule_1 = class BullBoardModule {
16
+ static forFeature(...queues) {
17
+ return {
18
+ module: bull_board_feature_module_1.BullBoardFeatureModule,
19
+ providers: [
20
+ {
21
+ provide: bull_board_constants_1.BULL_BOARD_QUEUES,
22
+ useValue: queues
23
+ }
24
+ ]
25
+ };
26
+ }
27
+ static forRoot(options) {
28
+ return {
29
+ module: BullBoardModule_1,
30
+ imports: [bull_board_root_module_1.BullBoardRootModule.forRoot(options)],
31
+ exports: [bull_board_root_module_1.BullBoardRootModule],
32
+ };
33
+ }
34
+ };
35
+ exports.BullBoardModule = BullBoardModule = BullBoardModule_1 = __decorate([
36
+ (0, common_1.Module)({})
37
+ ], BullBoardModule);
@@ -0,0 +1,11 @@
1
+ import { DynamicModule, MiddlewareConsumer, NestModule } from "@nestjs/common";
2
+ import { BullBoardModuleOptions, BullBoardServerAdapter } from "./bull-board.types";
3
+ import { HttpAdapterHost } from "@nestjs/core";
4
+ export declare class BullBoardRootModule implements NestModule {
5
+ private readonly adapterHost;
6
+ private readonly adapter;
7
+ private readonly options;
8
+ constructor(adapterHost: HttpAdapterHost, adapter: BullBoardServerAdapter, options: BullBoardModuleOptions);
9
+ configure(consumer: MiddlewareConsumer): any;
10
+ static forRoot(options: BullBoardModuleOptions): DynamicModule;
11
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var BullBoardRootModule_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.BullBoardRootModule = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const api_1 = require("@bull-board/api");
19
+ const bull_board_constants_1 = require("./bull-board.constants");
20
+ const core_1 = require("@nestjs/core");
21
+ const bull_board_util_1 = require("./bull-board.util");
22
+ let BullBoardRootModule = exports.BullBoardRootModule = BullBoardRootModule_1 = class BullBoardRootModule {
23
+ constructor(adapterHost, adapter, options) {
24
+ this.adapterHost = adapterHost;
25
+ this.adapter = adapter;
26
+ this.options = options;
27
+ }
28
+ configure(consumer) {
29
+ this.adapter.setBasePath(this.options.route);
30
+ if ((0, bull_board_util_1.isExpressAdapter)(this.adapter)) {
31
+ return consumer
32
+ .apply(this.options.middleware, this.adapter.getRouter())
33
+ .forRoutes(this.options.route);
34
+ }
35
+ if ((0, bull_board_util_1.isFastifyAdapter)(this.adapter)) {
36
+ this.adapterHost.httpAdapter
37
+ .getInstance()
38
+ .register(this.adapter.registerPlugin(), { prefix: this.options.route });
39
+ return consumer
40
+ .apply(this.options.middleware)
41
+ .forRoutes(this.options.route);
42
+ }
43
+ }
44
+ static forRoot(options) {
45
+ const serverAdapter = new options.adapter();
46
+ const bullBoardProvider = {
47
+ provide: bull_board_constants_1.BULL_BOARD_INSTANCE,
48
+ useFactory: () => (0, api_1.createBullBoard)({
49
+ queues: [],
50
+ serverAdapter: serverAdapter,
51
+ options: options.boardOptions,
52
+ })
53
+ };
54
+ const serverAdapterProvider = {
55
+ provide: bull_board_constants_1.BULL_BOARD_ADAPTER,
56
+ useFactory: () => serverAdapter
57
+ };
58
+ const optionsProvider = {
59
+ provide: bull_board_constants_1.BULL_BOARD_OPTIONS,
60
+ useValue: options
61
+ };
62
+ return {
63
+ module: BullBoardRootModule_1,
64
+ global: true,
65
+ imports: [],
66
+ providers: [
67
+ serverAdapterProvider,
68
+ optionsProvider,
69
+ bullBoardProvider
70
+ ],
71
+ exports: [
72
+ serverAdapterProvider,
73
+ bullBoardProvider,
74
+ optionsProvider
75
+ ],
76
+ };
77
+ }
78
+ };
79
+ exports.BullBoardRootModule = BullBoardRootModule = BullBoardRootModule_1 = __decorate([
80
+ (0, common_1.Module)({}),
81
+ __param(1, (0, common_1.Inject)(bull_board_constants_1.BULL_BOARD_ADAPTER)),
82
+ __param(2, (0, common_1.Inject)(bull_board_constants_1.BULL_BOARD_OPTIONS)),
83
+ __metadata("design:paramtypes", [core_1.HttpAdapterHost, Object, Object])
84
+ ], BullBoardRootModule);
@@ -0,0 +1,28 @@
1
+ import { createBullBoard } from "@bull-board/api";
2
+ import { BoardOptions, IServerAdapter, QueueAdapterOptions } from "@bull-board/api/dist/typings/app";
3
+ import { BaseAdapter } from "@bull-board/api/dist/src/queueAdapters/base";
4
+ export type BullBoardInstance = ReturnType<typeof createBullBoard>;
5
+ export type BullBoardModuleOptions = {
6
+ route: string;
7
+ adapter: {
8
+ new (): BullBoardServerAdapter;
9
+ };
10
+ boardOptions?: BoardOptions;
11
+ middleware?: any;
12
+ };
13
+ export type BullBoardQueueOptions = {
14
+ name: string;
15
+ adapter: {
16
+ new (queue: any, options?: QueueAdapterOptions): BaseAdapter;
17
+ };
18
+ options?: QueueAdapterOptions;
19
+ };
20
+ export type BullBoardServerAdapter = IServerAdapter & {
21
+ setBasePath(path: string): any;
22
+ };
23
+ export type BullBoardFastifyAdapter = BullBoardServerAdapter & {
24
+ registerPlugin(): any;
25
+ };
26
+ export type BullBoardExpressAdapter = BullBoardServerAdapter & {
27
+ getRouter(): any;
28
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ import { BullBoardExpressAdapter, BullBoardFastifyAdapter, BullBoardServerAdapter } from "./bull-board.types";
2
+ export declare const isFastifyAdapter: (adapter: BullBoardServerAdapter) => adapter is BullBoardFastifyAdapter;
3
+ export declare const isExpressAdapter: (adapter: BullBoardServerAdapter) => adapter is BullBoardExpressAdapter;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isExpressAdapter = exports.isFastifyAdapter = void 0;
4
+ const isFastifyAdapter = (adapter) => {
5
+ return 'registerPlugin' in adapter;
6
+ };
7
+ exports.isFastifyAdapter = isFastifyAdapter;
8
+ const isExpressAdapter = (adapter) => {
9
+ return 'getRouter' in adapter;
10
+ };
11
+ exports.isExpressAdapter = isExpressAdapter;
@@ -0,0 +1,4 @@
1
+ export * from './bull-board.module';
2
+ export * from './bull-board.types';
3
+ export * from './bull-board.constants';
4
+ export * from './bull-board.decorator';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./bull-board.module"), exports);
18
+ __exportStar(require("./bull-board.types"), exports);
19
+ __exportStar(require("./bull-board.constants"), exports);
20
+ __exportStar(require("./bull-board.decorator"), exports);
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@bull-board/nestjs",
3
+ "version": "5.3.1",
4
+ "description": "A NestJS module for Bull-Board dashboard.",
5
+ "keywords": [
6
+ "bull",
7
+ "bullmq",
8
+ "redis",
9
+ "queue",
10
+ "monitoring",
11
+ "nestjs",
12
+ "nestjs-module"
13
+ ],
14
+ "main": "dist/index.js",
15
+ "author": "Dennis Snijder <dennis@snijder.io>",
16
+ "license": "MIT",
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "clean": "rm -rf dist"
20
+ },
21
+ "devDependencies": {
22
+ "@bull-board/api": "^5.3.1",
23
+ "@bull-board/express": "^5.3.1",
24
+ "@bull-board/fastify": "^5.3.1",
25
+ "@nestjs/bullmq": "^1.1.0",
26
+ "@nestjs/common": "9.4.2",
27
+ "@nestjs/core": "9.4.2",
28
+ "@types/node": "18.16.16",
29
+ "bull": "^4.10.4",
30
+ "bullmq": "^3.15.2",
31
+ "reflect-metadata": "0.1.13",
32
+ "rxjs": "7.8.1",
33
+ "typescript": "^5.1.3"
34
+ },
35
+ "dependencies": {
36
+ "@nestjs/bull-shared": "^0.1.3"
37
+ },
38
+ "peerDependencies": {
39
+ "@bull-board/api": "^5.3.1",
40
+ "@bull-board/express": "^5.3.1",
41
+ "@nestjs/common": "^8.0.0 || ^9.0.0",
42
+ "@nestjs/core": "^8.0.0 || ^9.0.0",
43
+ "reflect-metadata": "^0.1.13",
44
+ "rxjs": "^7.2.0"
45
+ },
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "git+https://github.com/felixmosh/bull-board.git",
49
+ "directory": "packages/nestjs"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ }
54
+ }
@@ -0,0 +1,5 @@
1
+
2
+ export const BULL_BOARD_OPTIONS = 'bull_board_options';
3
+ export const BULL_BOARD_QUEUES = 'bull_board_queues';
4
+ export const BULL_BOARD_ADAPTER = 'bull_board_adapter';
5
+ export const BULL_BOARD_INSTANCE = 'bull_board_instance';
@@ -0,0 +1,4 @@
1
+ import { Inject } from '@nestjs/common';
2
+ import { BULL_BOARD_INSTANCE } from "./bull-board.constants";
3
+
4
+ export const InjectBullBoard = (): ParameterDecorator => Inject(BULL_BOARD_INSTANCE);
@@ -0,0 +1,25 @@
1
+ import { Inject, Module, OnModuleInit } from "@nestjs/common";
2
+ import { ModuleRef } from "@nestjs/core";
3
+ import { getQueueToken } from "@nestjs/bull-shared";
4
+ import { BullBoardInstance, BullBoardQueueOptions } from "./bull-board.types";
5
+ import { Queue } from "bullmq";
6
+ import { BULL_BOARD_INSTANCE, BULL_BOARD_QUEUES } from "./bull-board.constants";
7
+
8
+ @Module({})
9
+ export class BullBoardFeatureModule implements OnModuleInit {
10
+
11
+ constructor(
12
+ private readonly moduleRef: ModuleRef,
13
+ @Inject(BULL_BOARD_QUEUES) private readonly queues: BullBoardQueueOptions[],
14
+ @Inject(BULL_BOARD_INSTANCE) private readonly board: BullBoardInstance
15
+ ) {
16
+ }
17
+
18
+ onModuleInit(): any {
19
+ for (const queueOption of this.queues) {
20
+ const queue = this.moduleRef.get<Queue>(getQueueToken(queueOption.name), {strict: false});
21
+ const queueAdapter = new queueOption.adapter(queue, queueOption.options);
22
+ this.board.addQueue(queueAdapter);
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,29 @@
1
+ import { DynamicModule, Module} from "@nestjs/common";
2
+ import { BullBoardFeatureModule } from "./bull-board.feature-module";
3
+ import { BullBoardRootModule } from "./bull-board.root-module";
4
+ import { BULL_BOARD_QUEUES } from "./bull-board.constants";
5
+ import { BullBoardModuleOptions, BullBoardQueueOptions } from "./bull-board.types";
6
+
7
+ @Module({})
8
+ export class BullBoardModule {
9
+
10
+ static forFeature(...queues: BullBoardQueueOptions[]): DynamicModule {
11
+ return {
12
+ module: BullBoardFeatureModule,
13
+ providers: [
14
+ {
15
+ provide: BULL_BOARD_QUEUES,
16
+ useValue: queues
17
+ }
18
+ ]
19
+ };
20
+ }
21
+
22
+ static forRoot(options: BullBoardModuleOptions): DynamicModule {
23
+ return {
24
+ module: BullBoardModule,
25
+ imports: [ BullBoardRootModule.forRoot(options) ],
26
+ exports: [ BullBoardRootModule ],
27
+ };
28
+ }
29
+ }
@@ -0,0 +1,76 @@
1
+ import { DynamicModule, Inject, MiddlewareConsumer, Module, NestModule, Provider } from "@nestjs/common";
2
+ import { createBullBoard } from "@bull-board/api";
3
+ import { BULL_BOARD_ADAPTER, BULL_BOARD_INSTANCE, BULL_BOARD_OPTIONS } from "./bull-board.constants";
4
+ import { BullBoardModuleOptions, BullBoardServerAdapter } from "./bull-board.types";
5
+ import { HttpAdapterHost } from "@nestjs/core";
6
+ import { isExpressAdapter, isFastifyAdapter } from "./bull-board.util";
7
+
8
+ @Module({})
9
+ export class BullBoardRootModule implements NestModule {
10
+
11
+ constructor(
12
+ private readonly adapterHost: HttpAdapterHost,
13
+ @Inject(BULL_BOARD_ADAPTER) private readonly adapter: BullBoardServerAdapter,
14
+ @Inject(BULL_BOARD_OPTIONS) private readonly options: BullBoardModuleOptions
15
+ ) {
16
+ }
17
+
18
+ configure(consumer: MiddlewareConsumer): any {
19
+ this.adapter.setBasePath(this.options.route);
20
+
21
+ if (isExpressAdapter(this.adapter)) {
22
+ return consumer
23
+ .apply(this.options.middleware, this.adapter.getRouter())
24
+ .forRoutes(this.options.route);
25
+ }
26
+
27
+ if (isFastifyAdapter(this.adapter)) {
28
+ this.adapterHost.httpAdapter
29
+ .getInstance()
30
+ .register(this.adapter.registerPlugin(), {prefix: this.options.route});
31
+
32
+ return consumer
33
+ .apply(this.options.middleware)
34
+ .forRoutes(this.options.route);
35
+ }
36
+ }
37
+
38
+ static forRoot(options: BullBoardModuleOptions): DynamicModule {
39
+ const serverAdapter = new options.adapter();
40
+
41
+ const bullBoardProvider: Provider = {
42
+ provide: BULL_BOARD_INSTANCE,
43
+ useFactory: () => createBullBoard({
44
+ queues: [],
45
+ serverAdapter: serverAdapter,
46
+ options: options.boardOptions,
47
+ })
48
+ };
49
+
50
+ const serverAdapterProvider: Provider = {
51
+ provide: BULL_BOARD_ADAPTER,
52
+ useFactory: () => serverAdapter
53
+ };
54
+
55
+ const optionsProvider: Provider = {
56
+ provide: BULL_BOARD_OPTIONS,
57
+ useValue: options
58
+ };
59
+
60
+ return {
61
+ module: BullBoardRootModule,
62
+ global: true,
63
+ imports: [],
64
+ providers: [
65
+ serverAdapterProvider,
66
+ optionsProvider,
67
+ bullBoardProvider
68
+ ],
69
+ exports: [
70
+ serverAdapterProvider,
71
+ bullBoardProvider,
72
+ optionsProvider
73
+ ],
74
+ };
75
+ }
76
+ }
@@ -0,0 +1,23 @@
1
+ import { createBullBoard } from "@bull-board/api";
2
+ import { BoardOptions, IServerAdapter, QueueAdapterOptions } from "@bull-board/api/dist/typings/app";
3
+ import { BaseAdapter } from "@bull-board/api/dist/src/queueAdapters/base";
4
+
5
+ export type BullBoardInstance = ReturnType<typeof createBullBoard>;
6
+
7
+ export type BullBoardModuleOptions = {
8
+ route: string;
9
+ adapter: { new(): BullBoardServerAdapter };
10
+ boardOptions?: BoardOptions;
11
+ middleware?: any
12
+ }
13
+
14
+ export type BullBoardQueueOptions = {
15
+ name: string;
16
+ adapter: { new(queue: any, options?: QueueAdapterOptions): BaseAdapter },
17
+ options?: QueueAdapterOptions,
18
+ };
19
+
20
+ //create our own types with the needed functions, so we don't need to include express/fastify libraries here.
21
+ export type BullBoardServerAdapter = IServerAdapter & { setBasePath(path: string): any };
22
+ export type BullBoardFastifyAdapter = BullBoardServerAdapter & { registerPlugin(): any };
23
+ export type BullBoardExpressAdapter = BullBoardServerAdapter & { getRouter(): any };
@@ -0,0 +1,12 @@
1
+ import {
2
+ BullBoardExpressAdapter,
3
+ BullBoardFastifyAdapter, BullBoardServerAdapter,
4
+ } from "./bull-board.types";
5
+
6
+ export const isFastifyAdapter = (adapter: BullBoardServerAdapter): adapter is BullBoardFastifyAdapter => {
7
+ return 'registerPlugin' in adapter;
8
+ }
9
+
10
+ export const isExpressAdapter = (adapter: BullBoardServerAdapter): adapter is BullBoardExpressAdapter => {
11
+ return 'getRouter' in adapter;
12
+ }
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from './bull-board.module';
2
+ export * from './bull-board.types';
3
+ export * from './bull-board.constants';
4
+ export * from './bull-board.decorator';
package/tsconfig.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "declaration": true,
5
+ "strict": true,
6
+ "removeComments": false,
7
+ "noLib": false,
8
+ "emitDecoratorMetadata": true,
9
+ "experimentalDecorators": true,
10
+ "target": "es6",
11
+ "sourceMap": false,
12
+ "outDir": "./dist",
13
+ "rootDir": "./src",
14
+ "skipLibCheck": true,
15
+ "useUnknownInCatchVariables": false
16
+ },
17
+ "include": [
18
+ "src/**/*"
19
+ ],
20
+ "exclude": [
21
+ "node_modules",
22
+ "**/*.spec.ts",
23
+ "tests",
24
+ ]
25
+ }