1
- # [ Graphile Worker] ( https://github.com/graphile/worker ) for [ Nest] ( https://github.com/nestjs/nest )
1
+ # Graphile Worker for Nest.js
2
2
3
3
[ ![ npm version] ( https://badge.fury.io/js/nestjs-graphile-worker.svg )] ( https://badge.fury.io/js/nestjs-graphile-worker )
4
4
5
- This is wrapper for Nest.js and [ Graphile Worker] ( https://github.com/graphile/worker ) .
5
+ This is wrapper for [ Nest.js] ( https://github.com/nestjs/nest ) and [ Graphile Worker] ( https://github.com/graphile/worker ) .
6
6
7
7
What is Graphile worker ?
8
8
@@ -14,9 +14,10 @@ Why you should prefer Graphile Worker instead of [Bull](https://github.com/nestj
14
14
15
15
## Features
16
16
17
- - use a ` GraphileWorkerModule ` to register Graphile Worker with a ` asRootAsync ` to pass dynamic parameters
17
+ - use a ` GraphileWorkerModule.forRoot ` to register Graphile Worker (support ` asRootAsync ` as well)
18
18
- provide a ` WorkerService ` to add jobs or start runner
19
- - provide a ` OnWorkerEvenet ` decorator to add custom behavior on ` job:success ` for example
19
+ - provide a ` @OnWorkerEvent ` decorator to add custom behavior on ` job:success ` for example
20
+ - provide a ` @Task(name) ` decorator to define your injectable tasks
20
21
21
22
## Installation
22
23
@@ -80,6 +81,46 @@ import { helloTask } from './hello.task';
80
81
export class AppModule {}
81
82
```
82
83
84
+ ## Create task
85
+
86
+ To create task you need to define an ` @Injectable ` class with ` @Task(name) ` decorator who contains a decorated method ` @TaskHandler ` :
87
+
88
+ ``` ts
89
+ import { Injectable , Logger } from ' @nestjs/common' ;
90
+ import { Helpers } from ' graphile-worker' ;
91
+ import { Task , TaskHandler } from ' ../../src/index' ;
92
+
93
+ @Injectable ()
94
+ @Task (' hello' )
95
+ export class HelloTask {
96
+ private logger = new Logger (HelloTask .name );
97
+
98
+ @TaskHandler ()
99
+ handler(payload : any , _helpers : Helpers ) {
100
+ this .logger .log (` handle ${JSON .stringify (payload )} ` );
101
+ }
102
+ }
103
+ ```
104
+
105
+ Then do not forget to register this class as provider in your module:
106
+
107
+ ``` ts
108
+ import { Module } from ' @nestjs/common' ;
109
+ import { HelloTask } from ' ./hello.task' ;
110
+ // ...
111
+
112
+ @Module ({
113
+ imports: [
114
+ /* ... */
115
+ ],
116
+ controllers: [
117
+ /* ... */
118
+ ],
119
+ providers: [HelloTask ],
120
+ })
121
+ export class AppModule {}
122
+ ```
123
+
83
124
## Create jobs
84
125
85
126
You may use ` WorkerService ` :
@@ -101,9 +142,7 @@ export class AppController {
101
142
@Post (' bulk' )
102
143
@HttpCode (201 )
103
144
async addJobs() {
104
- const jobs: Array <{ identifier: string ; payload? : unknown }> = new Array (
105
- 100 ,
106
- )
145
+ const jobs = new Array (100 )
107
146
.fill (undefined )
108
147
.map ((_ , i ) => ({ identifier: ' hello' , payload: { hello: i } }));
109
148
@@ -131,12 +170,14 @@ bootstrap();
131
170
132
171
## ` OnWorkerEvent ` decorator
133
172
173
+ This decorator allow you to listen all [ GRaphile Worker event] ( https://github.com/graphile/worker#workerevents )
174
+
134
175
You need to add ` @GraphileWorkerListener ` decorator on your class and then set ` @OnWorkerEvent(eventName) ` on method:
135
176
136
177
``` ts
137
- import { GraphileWorkerListener , OnWorkerEvent } from ' @app/graphile-worker' ;
138
178
import { Injectable , Logger } from ' @nestjs/common' ;
139
179
import { WorkerEventMap } from ' graphile-worker' ;
180
+ import { GraphileWorkerListener , OnWorkerEvent } from ' ../../src/index' ;
140
181
141
182
@Injectable ()
142
183
@GraphileWorkerListener ()
@@ -146,26 +187,29 @@ export class AppService {
146
187
@OnWorkerEvent (' job:success' )
147
188
onJobSuccess({ job }: WorkerEventMap [' job:success' ]) {
148
189
this .logger .debug (` job #${job .id } finished ` );
149
- // output: [Nest] 1732 - 09/14/2021, 12:42:45 PM DEBUG [AppService] job #349 finished
190
+ }
191
+
192
+ @OnWorkerEvent (' job:error' )
193
+ onJobError({ job , error }: WorkerEventMap [' job:error' ]) {
194
+ this .logger .error (` job #${job .id } fail ${JSON .stringify (error )} ` );
150
195
}
151
196
}
152
197
```
153
198
154
- You can find a complete list of available event on [ Graphile Worker's documentation] ( https://github.com/graphile/worker#workerevents ) .
155
-
156
199
## Test
157
200
158
201
``` bash
159
202
# unit tests
160
203
$ npm run test
161
204
162
- # e2e tests
163
- $ npm run test:e2e
164
-
165
205
# test coverage
166
206
$ npm run test:cov
167
207
```
168
208
169
209
# Sample
170
210
171
- You can find a [ sample] ( ./sample/README.md ) who use library.
211
+ You can find a [ sample] ( ./sample/ ) who use library. To run it, simply ` npm install ` and then:
212
+
213
+ ``` sh
214
+ docker-compose up
215
+ ```
0 commit comments