nestjs-temporal-core 2.0.3 → 2.0.5

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.
Files changed (73) hide show
  1. package/README.md +407 -231
  2. package/dist/client/index.js.map +1 -1
  3. package/dist/client/temporal-client.module.js +12 -5
  4. package/dist/client/temporal-client.module.js.map +1 -1
  5. package/dist/client/temporal-client.service.d.ts +8 -1
  6. package/dist/client/temporal-client.service.js +90 -4
  7. package/dist/client/temporal-client.service.js.map +1 -1
  8. package/dist/constants.d.ts +57 -8
  9. package/dist/constants.js +51 -9
  10. package/dist/constants.js.map +1 -1
  11. package/dist/decorators/activity-method.decorator.d.ts +1 -7
  12. package/dist/decorators/activity-method.decorator.js +2 -2
  13. package/dist/decorators/activity-method.decorator.js.map +1 -1
  14. package/dist/decorators/activity.decorator.d.ts +1 -4
  15. package/dist/decorators/activity.decorator.js.map +1 -1
  16. package/dist/decorators/index.d.ts +5 -0
  17. package/dist/decorators/index.js +5 -0
  18. package/dist/decorators/index.js.map +1 -1
  19. package/dist/decorators/query.decorator.d.ts +2 -0
  20. package/dist/decorators/query.decorator.js +26 -0
  21. package/dist/decorators/query.decorator.js.map +1 -0
  22. package/dist/decorators/scheduled-workflow.decorator.d.ts +13 -0
  23. package/dist/decorators/scheduled-workflow.decorator.js +31 -0
  24. package/dist/decorators/scheduled-workflow.decorator.js.map +1 -0
  25. package/dist/decorators/signal.decorator.d.ts +2 -0
  26. package/dist/decorators/signal.decorator.js +26 -0
  27. package/dist/decorators/signal.decorator.js.map +1 -0
  28. package/dist/decorators/update.decorator.d.ts +2 -0
  29. package/dist/decorators/update.decorator.js +34 -0
  30. package/dist/decorators/update.decorator.js.map +1 -0
  31. package/dist/decorators/workflow-method.decorator.d.ts +2 -0
  32. package/dist/decorators/workflow-method.decorator.js +29 -0
  33. package/dist/decorators/workflow-method.decorator.js.map +1 -0
  34. package/dist/decorators/workflow.decorator.d.ts +2 -16
  35. package/dist/decorators/workflow.decorator.js +1 -0
  36. package/dist/decorators/workflow.decorator.js.map +1 -1
  37. package/dist/index.d.ts +10 -4
  38. package/dist/index.js +43 -4
  39. package/dist/index.js.map +1 -1
  40. package/dist/interfaces/activity.interface.d.ts +21 -0
  41. package/dist/interfaces/activity.interface.js +3 -0
  42. package/dist/interfaces/activity.interface.js.map +1 -0
  43. package/dist/interfaces/base.interface.d.ts +10 -1
  44. package/dist/interfaces/client.interface.d.ts +19 -3
  45. package/dist/interfaces/client.interface.js +11 -0
  46. package/dist/interfaces/client.interface.js.map +1 -1
  47. package/dist/interfaces/index.d.ts +8 -0
  48. package/dist/interfaces/index.js +17 -0
  49. package/dist/interfaces/index.js.map +1 -1
  50. package/dist/interfaces/schedule.interface.d.ts +40 -0
  51. package/dist/interfaces/schedule.interface.js +3 -0
  52. package/dist/interfaces/schedule.interface.js.map +1 -0
  53. package/dist/interfaces/worker.interface.d.ts +21 -5
  54. package/dist/interfaces/workflow.interface.d.ts +26 -0
  55. package/dist/interfaces/workflow.interface.js +3 -0
  56. package/dist/interfaces/workflow.interface.js.map +1 -0
  57. package/dist/schedule/index.d.ts +2 -0
  58. package/dist/schedule/index.js +19 -0
  59. package/dist/schedule/index.js.map +1 -0
  60. package/dist/schedule/temporal-schedule.module.d.ts +7 -0
  61. package/dist/schedule/temporal-schedule.module.js +94 -0
  62. package/dist/schedule/temporal-schedule.module.js.map +1 -0
  63. package/dist/schedule/temporal-schedule.service.d.ts +26 -0
  64. package/dist/schedule/temporal-schedule.service.js +210 -0
  65. package/dist/schedule/temporal-schedule.service.js.map +1 -0
  66. package/dist/tsconfig.tsbuildinfo +1 -1
  67. package/dist/worker/temporal-metadata.accessor.d.ts +2 -0
  68. package/dist/worker/temporal-metadata.accessor.js +12 -0
  69. package/dist/worker/temporal-metadata.accessor.js.map +1 -1
  70. package/dist/worker/worker-manager.service.d.ts +3 -2
  71. package/dist/worker/worker-manager.service.js +50 -12
  72. package/dist/worker/worker-manager.service.js.map +1 -1
  73. package/package.json +4 -2
package/README.md CHANGED
@@ -2,22 +2,24 @@
2
2
 
3
3
  A robust NestJS integration for [Temporal.io](https://temporal.io/) that provides seamless worker and client support for building reliable distributed applications.
4
4
 
5
+ ## Overview
6
+
7
+ NestJS Temporal Core simplifies building fault-tolerant, long-running processes in your NestJS applications by integrating with Temporal.io - a durable execution system for reliable microservices and workflow orchestration.
8
+
5
9
  ## Features
6
10
 
7
- - 🚀 Easy integration with NestJS modules
8
- - 🔄 Automatic worker initialization and shutdown
9
- - 🎯 Declarative activity and workflow decorators
10
- - 🔌 Built-in connection management
11
- - 🛡️ Type-safe workflow execution
12
- - 📡 Simplified client operations
13
- - 🔒 TLS support for secure connections
14
- - 🎛️ Configurable runtime options
15
- - 🔄 Enhanced worker options customization
16
- - 📊 Worker status monitoring
17
- - 📅 Cron workflow scheduling
18
- - 🔍 Query handling support
19
- - 📣 Signal handling
20
- - 🚦 Workflow retry policies
11
+ - 🚀 **Easy NestJS Integration** - Register modules with sync/async configuration
12
+ - 🔄 **Complete Lifecycle Management** - Automatic worker initialization and graceful shutdown
13
+ - 🎯 **Declarative Decorators** - Type-safe `@Activity()`, `@Workflow()`, `@Signal()`, `@Query()`, and `@Update()` decorators
14
+ - 🔌 **Connection Management** - Built-in connection handling with TLS support
15
+ - 🔒 **Type Safety** - Strongly typed interfaces for all Temporal concepts
16
+ - 📡 **Client Operation Utilities** - Methods for starting, signaling, querying, updating and managing workflows
17
+ - 📊 **Monitoring Support** - Worker status tracking and metrics
18
+ - 📅 **Scheduling** - Native support for cron and interval-based workflow scheduling
19
+ - 🔍 **Queries and Signals** - First-class support for Temporal's query and signal patterns
20
+ - 🆕 **Updates** - Support for Temporal's workflow update functionality
21
+ - 🔢 **Versioning** - Support for Temporal worker versioning
22
+ - 🚦 **Advanced Policies** - Built-in retry, timeout, and workflow management policies
21
23
 
22
24
  ## Installation
23
25
 
@@ -33,54 +35,41 @@ First, make sure to enable shutdown hooks in your `main.ts` file:
33
35
 
34
36
  ```typescript
35
37
  async function bootstrap() {
36
- const app = await NestFactory.create(AppModule);
37
- app.enableShutdownHooks();
38
- await app.listen(3000);
38
+ const app = await NestFactory.create(AppModule);
39
+ app.enableShutdownHooks();
40
+ await app.listen(3000);
39
41
  }
40
42
  bootstrap();
41
43
  ```
42
44
 
43
- ### 2. Register the Module
45
+ ### 2. Register the Modules
44
46
 
45
47
  ```typescript
46
48
  import { Module } from '@nestjs/common';
47
49
  import { TemporalWorkerModule, TemporalClientModule } from 'nestjs-temporal-core';
48
50
 
49
51
  @Module({
50
- imports: [
51
- TemporalWorkerModule.register({
52
- connection: {
53
- address: 'localhost:7233',
54
- },
55
- namespace: 'default',
56
- taskQueue: 'my-task-queue',
57
- workflowsPath: require.resolve('./workflows'),
58
- activityClasses: [MyActivity],
59
- // Optional runtime configuration
60
- runtimeOptions: {
61
- // Add your runtime options here
62
- },
63
- // Optional worker configuration
64
- workerOptions: {
65
- // Add your worker options here
66
- },
67
- // Auto-start configuration
68
- autoStart: {
69
- enabled: true,
70
- delayMs: 1000, // Start worker after 1 second
71
- },
72
- // Optional monitoring configuration
73
- monitoring: {
74
- statsIntervalMs: 60000, // Log stats every minute
75
- },
76
- }),
77
- TemporalClientModule.register({
78
- connection: {
79
- address: 'localhost:7233',
80
- },
81
- namespace: 'default',
82
- }),
83
- ],
52
+ imports: [
53
+ TemporalWorkerModule.register({
54
+ connection: {
55
+ address: 'localhost:7233',
56
+ },
57
+ namespace: 'default',
58
+ taskQueue: 'my-task-queue',
59
+ workflowsPath: require.resolve('./workflows'),
60
+ activityClasses: [MyActivity],
61
+ autoStart: {
62
+ enabled: true,
63
+ delayMs: 1000, // Start worker after 1 second
64
+ },
65
+ }),
66
+ TemporalClientModule.register({
67
+ connection: {
68
+ address: 'localhost:7233',
69
+ },
70
+ namespace: 'default',
71
+ }),
72
+ ],
84
73
  })
85
74
  export class AppModule {}
86
75
  ```
@@ -91,26 +80,26 @@ export class AppModule {}
91
80
  import { Activity, ActivityMethod } from 'nestjs-temporal-core';
92
81
 
93
82
  @Activity({
94
- name: 'PaymentActivities', // Optional custom name
95
- description: 'Activities for payment processing',
83
+ name: 'PaymentActivities', // Optional custom name
84
+ description: 'Activities for payment processing',
96
85
  })
97
86
  export class PaymentActivity {
98
- @ActivityMethod({
99
- name: 'processPayment', // Optional custom name
100
- timeout: {
101
- startToClose: '30s',
102
- },
103
- })
104
- async processPayment(amount: number): Promise<string> {
105
- // Implementation
106
- return 'payment-id';
107
- }
108
-
109
- @ActivityMethod()
110
- async refundPayment(paymentId: string): Promise<boolean> {
111
- // Implementation
112
- return true;
113
- }
87
+ @ActivityMethod({
88
+ name: 'processPayment', // Optional custom name
89
+ timeout: {
90
+ startToClose: '30s',
91
+ },
92
+ })
93
+ async processPayment(amount: number): Promise<string> {
94
+ // Implementation
95
+ return 'payment-id';
96
+ }
97
+
98
+ @ActivityMethod()
99
+ async refundPayment(paymentId: string): Promise<boolean> {
100
+ // Implementation
101
+ return true;
102
+ }
114
103
  }
115
104
  ```
116
105
 
@@ -120,16 +109,17 @@ export class PaymentActivity {
120
109
  import { proxyActivities } from '@temporalio/workflow';
121
110
  import type { PaymentActivity } from './payment.activity';
122
111
 
112
+ // Reference activities in your workflow
123
113
  const { processPayment, refundPayment } = proxyActivities<PaymentActivity>({
124
- startToCloseTimeout: '30 seconds',
114
+ startToCloseTimeout: '30 seconds',
125
115
  });
126
116
 
127
117
  export async function paymentWorkflow(amount: number): Promise<string> {
128
- return await processPayment(amount);
118
+ return await processPayment(amount);
129
119
  }
130
120
 
131
121
  export async function refundWorkflow(paymentId: string): Promise<boolean> {
132
- return await refundPayment(paymentId);
122
+ return await refundPayment(paymentId);
133
123
  }
134
124
  ```
135
125
 
@@ -141,37 +131,192 @@ import { TemporalClientService } from 'nestjs-temporal-core';
141
131
 
142
132
  @Injectable()
143
133
  export class PaymentService {
144
- constructor(private readonly temporalClient: TemporalClientService) {}
145
-
146
- async initiatePayment(amount: number) {
147
- const { result, workflowId } = await this.temporalClient.startWorkflow<string, [number]>(
148
- 'paymentWorkflow',
149
- [amount],
150
- {
151
- taskQueue: 'my-task-queue',
152
- workflowExecutionTimeout: '1h',
153
- workflowTaskTimeout: '10s',
154
- retry: {
155
- maximumAttempts: 3,
134
+ constructor(private readonly temporalClient: TemporalClientService) {}
135
+
136
+ async initiatePayment(amount: number) {
137
+ const { result, workflowId } = await this.temporalClient.startWorkflow<string, [number]>(
138
+ 'paymentWorkflow',
139
+ [amount],
140
+ {
141
+ taskQueue: 'my-task-queue',
142
+ workflowExecutionTimeout: '1h',
143
+ workflowTaskTimeout: '10s',
144
+ retry: {
145
+ maximumAttempts: 3,
146
+ },
147
+ },
148
+ );
149
+
150
+ // Wait for the workflow to complete
151
+ const paymentId = await result;
152
+
153
+ return { paymentId, workflowId };
154
+ }
155
+
156
+ async checkPaymentStatus(workflowId: string) {
157
+ // Query a running workflow
158
+ return await this.temporalClient.queryWorkflow<string>(workflowId, 'getPaymentStatus');
159
+ }
160
+
161
+ async cancelPayment(workflowId: string, reason: string) {
162
+ // Signal a running workflow
163
+ await this.temporalClient.signalWorkflow(workflowId, 'cancelPayment', [reason]);
164
+ }
165
+ }
166
+ ```
167
+
168
+ ## Advanced Features
169
+
170
+ ### Class-Based Workflows with Queries, Signals, and Updates
171
+
172
+ ```typescript
173
+ import { Workflow, WorkflowMethod, Query, Signal, Update } from 'nestjs-temporal-core';
174
+
175
+ @Workflow({
176
+ taskQueue: 'order-queue',
177
+ workflowExecutionTimeout: '24h',
178
+ })
179
+ export class OrderWorkflow {
180
+ private orderStatus: string = 'PENDING';
181
+ private orderItems: string[] = [];
182
+ private cancelReason: string | null = null;
183
+
184
+ @WorkflowMethod()
185
+ async execute(orderId: string): Promise<string> {
186
+ // Workflow implementation
187
+ return this.orderStatus;
188
+ }
189
+
190
+ @Query()
191
+ getStatus(): string {
192
+ return this.orderStatus;
193
+ }
194
+
195
+ @Signal()
196
+ cancel(reason: string): void {
197
+ this.orderStatus = 'CANCELLED';
198
+ this.cancelReason = reason;
199
+ }
200
+
201
+ @Update({
202
+ validator: (items: string[]) => {
203
+ if (items.length === 0) {
204
+ throw new Error('Order must contain at least one item');
205
+ }
156
206
  },
157
- },
158
- );
207
+ })
208
+ updateItems(items: string[]): string[] {
209
+ this.orderItems = items;
210
+ return this.orderItems;
211
+ }
212
+ }
213
+ ```
159
214
 
160
- // Wait for the workflow to complete
161
- const paymentId = await result;
215
+ ### Scheduled Workflows
162
216
 
163
- return { paymentId, workflowId };
164
- }
217
+ ```typescript
218
+ import { ScheduledWorkflow, WorkflowMethod } from 'nestjs-temporal-core';
165
219
 
166
- async checkPaymentStatus(workflowId: string) {
167
- // Query a running workflow
168
- return await this.temporalClient.queryWorkflow<string>(workflowId, 'getPaymentStatus');
169
- }
220
+ @ScheduledWorkflow({
221
+ taskQueue: 'scheduled-tasks',
222
+ schedule: {
223
+ cron: '0 0 * * *', // Run daily at midnight
224
+ },
225
+ description: 'Daily reporting workflow',
226
+ })
227
+ export class DailyReportWorkflow {
228
+ @WorkflowMethod()
229
+ async execute(): Promise<void> {
230
+ // Generate and send reports
231
+ }
232
+ }
170
233
 
171
- async cancelPayment(workflowId: string, reason: string) {
172
- // Signal a running workflow
173
- await this.temporalClient.signalWorkflow(workflowId, 'cancelPayment', [reason]);
174
- }
234
+ @ScheduledWorkflow({
235
+ taskQueue: 'scheduled-tasks',
236
+ schedule: {
237
+ interval: {
238
+ hours: 1, // Run every hour
239
+ },
240
+ },
241
+ description: 'Hourly data processing',
242
+ })
243
+ export class HourlyProcessingWorkflow {
244
+ @WorkflowMethod()
245
+ async execute(): Promise<void> {
246
+ // Process data hourly
247
+ }
248
+ }
249
+ ```
250
+
251
+ ### Using the Schedule Service
252
+
253
+ ```typescript
254
+ import { Injectable } from '@nestjs/common';
255
+ import { TemporalScheduleService } from 'nestjs-temporal-core';
256
+
257
+ @Injectable()
258
+ export class ReportingService {
259
+ constructor(private readonly scheduleService: TemporalScheduleService) {}
260
+
261
+ async createDailyReportSchedule() {
262
+ return await this.scheduleService.createCronWorkflow(
263
+ 'daily-sales-report',
264
+ 'generateSalesReport',
265
+ '0 0 * * *', // Daily at midnight
266
+ 'reports-queue',
267
+ [], // No arguments
268
+ 'Daily sales report generation',
269
+ );
270
+ }
271
+
272
+ async createHourlyDataBackup() {
273
+ return await this.scheduleService.createIntervalWorkflow(
274
+ 'hourly-data-backup',
275
+ 'backupData',
276
+ { hours: 1 },
277
+ 'backup-queue',
278
+ [],
279
+ 'Hourly data backup process',
280
+ );
281
+ }
282
+
283
+ async pauseReports() {
284
+ await this.scheduleService.pauseSchedule(
285
+ 'daily-sales-report',
286
+ 'Paused for system maintenance',
287
+ );
288
+ }
289
+
290
+ async listAllSchedules() {
291
+ return await this.scheduleService.listSchedules();
292
+ }
293
+ }
294
+ ```
295
+
296
+ ### Using Workflow Updates
297
+
298
+ ```typescript
299
+ import { Injectable } from '@nestjs/common';
300
+ import { TemporalClientService } from 'nestjs-temporal-core';
301
+
302
+ @Injectable()
303
+ export class OrderService {
304
+ constructor(private readonly temporalClient: TemporalClientService) {}
305
+
306
+ async updateOrderItems(orderId: string, items: string[]) {
307
+ try {
308
+ // Use the updateWorkflow method to modify a running workflow
309
+ const updatedItems = await this.temporalClient.updateWorkflow<string[]>(
310
+ `order-${orderId}`,
311
+ 'updateItems',
312
+ [items],
313
+ );
314
+
315
+ return { success: true, items: updatedItems };
316
+ } catch (error) {
317
+ return { success: false, error: error.message };
318
+ }
319
+ }
175
320
  }
176
321
  ```
177
322
 
@@ -179,178 +324,209 @@ export class PaymentService {
179
324
 
180
325
  ### Async Configuration
181
326
 
327
+ Use factory patterns for dynamic configuration:
328
+
182
329
  ```typescript
183
330
  TemporalWorkerModule.registerAsync({
184
- imports: [ConfigModule],
185
- useFactory: async (configService: ConfigService) => ({
186
- connection: {
187
- address: configService.get('TEMPORAL_ADDRESS'),
188
- connectionTimeout: configService.get('TEMPORAL_CONNECTION_TIMEOUT', 5000),
189
- },
190
- namespace: configService.get('TEMPORAL_NAMESPACE'),
191
- taskQueue: configService.get('TEMPORAL_TASK_QUEUE'),
192
- workflowsPath: require.resolve('./workflows'),
193
- activityClasses: [MyActivity],
194
- autoStart: {
195
- enabled: configService.get('TEMPORAL_WORKER_AUTOSTART', true),
196
- delayMs: configService.get('TEMPORAL_WORKER_START_DELAY', 0),
197
- },
198
- allowWorkerFailure: configService.get('TEMPORAL_ALLOW_WORKER_FAILURE', true),
199
- }),
200
- inject: [ConfigService],
331
+ imports: [ConfigModule],
332
+ useFactory: async (configService: ConfigService) => ({
333
+ connection: {
334
+ address: configService.get('TEMPORAL_ADDRESS'),
335
+ connectionTimeout: configService.get('TEMPORAL_CONNECTION_TIMEOUT', 5000),
336
+ },
337
+ namespace: configService.get('TEMPORAL_NAMESPACE'),
338
+ taskQueue: configService.get('TEMPORAL_TASK_QUEUE'),
339
+ workflowsPath: require.resolve('./workflows'),
340
+ activityClasses: [MyActivity],
341
+ autoStart: {
342
+ enabled: configService.get('TEMPORAL_WORKER_AUTOSTART', true),
343
+ delayMs: configService.get('TEMPORAL_WORKER_START_DELAY', 0),
344
+ },
345
+ allowWorkerFailure: configService.get('TEMPORAL_ALLOW_WORKER_FAILURE', true),
346
+ }),
347
+ inject: [ConfigService],
201
348
  });
202
349
  ```
203
350
 
204
351
  ### TLS Configuration
205
352
 
353
+ Set up secure communications with TLS:
354
+
206
355
  ```typescript
207
356
  TemporalClientModule.register({
208
- connection: {
209
- address: 'temporal.example.com:7233',
210
- tls: {
211
- clientCertPair: {
212
- crt: Buffer.from('...'),
213
- key: Buffer.from('...'),
214
- ca: Buffer.from('...'), // Optional CA certificate
215
- },
216
- serverName: 'temporal.example.com', // Optional for SNI
217
- verifyServer: true, // Optional, defaults to true
357
+ connection: {
358
+ address: 'temporal.example.com:7233',
359
+ tls: {
360
+ clientCertPair: {
361
+ crt: Buffer.from('...'),
362
+ key: Buffer.from('...'),
363
+ ca: Buffer.from('...'), // Optional CA certificate
364
+ },
365
+ serverName: 'temporal.example.com', // Optional for SNI
366
+ verifyServer: true, // Optional, defaults to true
367
+ },
368
+ connectionTimeout: 10000, // 10 seconds
218
369
  },
219
- connectionTimeout: 10000, // 10 seconds
220
- },
221
- namespace: 'production',
222
- allowConnectionFailure: true, // Allow application to start if Temporal connection fails
370
+ namespace: 'production',
371
+ allowConnectionFailure: true, // Allow application to start if Temporal connection fails
223
372
  });
224
373
  ```
225
374
 
226
- ## API Reference
227
-
228
- ### Decorators
229
-
230
- - `@Activity(options?)`: Marks a class as a Temporal activity with optional configuration
231
- - `@ActivityMethod(options?)`: Marks a method as a Temporal activity implementation with optional configuration
232
- - `@Workflow(options)`: Marks a class as a Temporal workflow with configuration
375
+ ### Worker Versioning
233
376
 
234
- ### Services
377
+ Enable worker versioning for compatibility management:
235
378
 
236
- #### TemporalClientService
379
+ ```typescript
380
+ TemporalWorkerModule.register({
381
+ // ... other options
382
+ useVersioning: true,
383
+ buildId: 'v1.2.3-20230615', // Unique identifier for this worker's code version
384
+ });
385
+ ```
237
386
 
238
- - `startWorkflow<T, A>()`: Start a new workflow execution
239
- - `signalWorkflow()`: Send a signal to a running workflow
240
- - `queryWorkflow<T>()`: Query a running workflow
241
- - `terminateWorkflow()`: Terminate a running workflow
242
- - `cancelWorkflow()`: Request cancellation of a workflow
243
- - `getWorkflowHandle()`: Get a handle to manage a workflow
244
- - `getWorkflowClient()`: Get the underlying workflow client instance
387
+ ### Worker Performance Tuning
245
388
 
246
- #### WorkerManager
389
+ Optimize worker performance with advanced options:
247
390
 
248
- - `startWorker()`: Manually start the worker if it's not running
249
- - `shutdown()`: Gracefully shutdown the worker
250
- - `getWorker()`: Get the underlying worker instance
391
+ ```typescript
392
+ TemporalWorkerModule.register({
393
+ // ... other options
394
+ reuseV8Context: true, // Significantly improves performance and reduces memory usage
395
+ maxConcurrentWorkflowTaskExecutions: 40,
396
+ maxConcurrentActivityTaskExecutions: 100,
397
+ maxConcurrentLocalActivityExecutions: 100,
398
+ workflowThreadPoolSize: 4,
399
+ maxActivitiesPerSecond: 50,
400
+ maxCachedWorkflows: 200,
401
+ });
402
+ ```
251
403
 
252
- ### Module Options
404
+ ### Worker Monitoring
253
405
 
254
- #### TemporalWorkerOptions
406
+ Enable worker monitoring and metrics:
255
407
 
256
408
  ```typescript
257
- interface TemporalWorkerOptions {
258
- connection: NativeConnectionOptions;
259
- namespace: string;
260
- taskQueue: string;
261
- workflowsPath: string;
262
- activityClasses?: Array<new (...args: any[]) => any>;
263
- runtimeOptions?: RuntimeOptions;
264
- workerOptions?: WorkerOptions;
265
- autoStart?: {
266
- enabled?: boolean;
267
- delayMs?: number;
268
- };
269
- allowWorkerFailure?: boolean;
270
- monitoring?: {
271
- statsIntervalMs?: number;
272
- metrics?: {
273
- enabled?: boolean;
274
- prometheus?: {
275
- enabled?: boolean;
276
- port?: number;
277
- };
278
- };
279
- };
280
- }
409
+ TemporalWorkerModule.register({
410
+ // ... other options
411
+ monitoring: {
412
+ statsIntervalMs: 60000, // Log stats every minute
413
+ metrics: {
414
+ enabled: true,
415
+ prometheus: {
416
+ enabled: true,
417
+ port: 9464,
418
+ },
419
+ },
420
+ },
421
+ });
281
422
  ```
282
423
 
283
- #### TemporalClientOptions
424
+ ## API Reference
284
425
 
285
- ```typescript
286
- interface TemporalClientOptions {
287
- connection: ConnectionOptions;
288
- namespace?: string;
289
- allowConnectionFailure?: boolean;
290
- reconnect?: {
291
- enabled?: boolean;
292
- maxAttempts?: number;
293
- initialDelayMs?: number;
294
- maxDelayMs?: number;
295
- backoffCoefficient?: number;
296
- };
297
- }
298
- ```
426
+ ### Core Modules
299
427
 
300
- ### Activity Method Options
428
+ - `TemporalClientModule` - Client connectivity for workflow operations
429
+ - `TemporalWorkerModule` - Worker process for running activities and workflows
430
+ - `TemporalScheduleModule` - Scheduling for recurring workflows
301
431
 
302
- ```typescript
303
- interface ActivityMethodOptions {
304
- name?: string;
305
- description?: string;
306
- timeout?: {
307
- startToClose?: string | number;
308
- scheduleToStart?: string | number;
309
- };
310
- }
311
- ```
432
+ ### Decorators
312
433
 
313
- ### Workflow Options
434
+ - `@Activity(options?)` - Marks a class as a Temporal activity
435
+ - `@ActivityMethod(options?)` - Marks a method as an activity implementation
436
+ - `@Workflow(options)` - Marks a class as a Temporal workflow
437
+ - `@WorkflowMethod(options?)` - Marks the primary workflow execution method
438
+ - `@Query(options?)` - Marks a method as a query handler
439
+ - `@Signal(options?)` - Marks a method as a signal handler
440
+ - `@Update(options?)` - Marks a method as an update handler
441
+ - `@ScheduledWorkflow(options)` - Defines a workflow with schedule configuration
314
442
 
315
- ```typescript
316
- interface TemporalWorkflowDecoratorOptions {
317
- name?: string;
318
- description?: string;
319
- taskQueue: string;
320
- workflowIdPrefix?: string;
321
- executionTimeout?: string;
322
- workflowTaskTimeout?: string;
323
- retry?: {
324
- maximumAttempts?: number;
325
- initialInterval?: number;
326
- maximumInterval?: number;
327
- backoffCoefficient?: number;
328
- };
329
- }
330
- ```
443
+ ### Services
444
+
445
+ #### TemporalClientService
446
+
447
+ - `startWorkflow<T, A>()` - Start a new workflow execution
448
+ - `signalWorkflow()` - Send a signal to a running workflow
449
+ - `queryWorkflow<T>()` - Query a running workflow
450
+ - `updateWorkflow<T>()` - Update a running workflow
451
+ - `terminateWorkflow()` - Terminate a running workflow
452
+ - `cancelWorkflow()` - Request cancellation of a workflow
453
+ - `getWorkflowHandle()` - Get a handle to manage a workflow
454
+ - `describeWorkflow()` - Get workflow execution details
455
+ - `listWorkflows()` - List workflows matching a query
456
+ - `countWorkflows()` - Count workflows matching a query
457
+ - `getWorkflowClient()` - Get the underlying workflow client
458
+ - `getRawClient()` - Get the raw Temporal client
459
+
460
+ #### TemporalScheduleService
461
+
462
+ - `createCronWorkflow()` - Create a workflow scheduled by cron expression
463
+ - `createIntervalWorkflow()` - Create a workflow scheduled by time interval
464
+ - `getSchedule()` - Get a handle to an existing schedule
465
+ - `pauseSchedule()` - Pause a schedule
466
+ - `resumeSchedule()` - Resume a paused schedule
467
+ - `deleteSchedule()` - Delete a schedule
468
+ - `triggerNow()` - Trigger an immediate execution
469
+ - `listSchedules()` - List all schedules
470
+
471
+ #### WorkerManager
472
+
473
+ - `startWorker()` - Manually start the worker
474
+ - `shutdown()` - Gracefully shutdown the worker
475
+ - `getWorker()` - Get the underlying worker instance
331
476
 
332
477
  ## Error Handling
333
478
 
334
479
  The module includes comprehensive error handling:
335
480
 
336
- - Worker initialization errors are logged and can prevent application startup if critical
481
+ - Worker initialization errors are logged and handled based on configuration
337
482
  - Client operations include detailed error messages and proper error propagation
338
- - Activity and workflow errors are properly captured and logged
483
+ - Activities and workflow errors are properly captured and logged
339
484
  - Connection errors are handled gracefully with automatic cleanup
340
485
  - Configurable failure modes for both client and worker connections
486
+ - SDK version compatibility checks for feature availability
341
487
 
342
488
  ## Best Practices
343
489
 
344
- 1. Always define activity interfaces for type safety
345
- 2. Use meaningful workflow IDs for tracking
346
- 3. Implement proper error handling in activities
347
- 4. Set appropriate timeouts for activities and workflows
348
- 5. Use signals for long-running workflow coordination
349
- 6. Monitor worker status using the WorkerManager service
350
- 7. Configure appropriate runtime and worker options for production deployments
351
- 8. Implement proper TLS security for production environments
352
- 9. Use workflow queries for reading workflow state without side effects
353
- 10. Configure graceful shutdown for workers to prevent activity interruptions
490
+ 1. **Activity Design**
491
+
492
+ - Define activity interfaces for type safety
493
+ - Keep activities focused on single responsibilities
494
+ - Set appropriate timeouts for expected durations
495
+ - Use heartbeats for long-running activities
496
+
497
+ 2. **Workflow Design**
498
+
499
+ - Make workflows deterministic
500
+ - Use signals for external events
501
+ - Use queries for retrieving workflow state
502
+ - Use updates for synchronous modifications
503
+ - Avoid side effects in workflow code
504
+
505
+ 3. **Configuration**
506
+
507
+ - Use meaningful workflow IDs for tracking
508
+ - Configure appropriate timeouts for activities and workflows
509
+ - Use retry policies for transient failures
510
+ - Set up monitoring for production deployments
511
+ - Enable worker versioning in production
512
+
513
+ 4. **Performance Optimization**
514
+
515
+ - Enable V8 context reuse for better performance
516
+ - Configure appropriate concurrency settings
517
+ - Use caching for frequently accessed workflows
518
+ - Balance worker thread pool size
519
+
520
+ 5. **Lifecycle Management**
521
+
522
+ - Enable NestJS shutdown hooks
523
+ - Configure proper worker shutdown grace periods
524
+ - Use the WorkerManager service for controlling worker lifecycle
525
+
526
+ 6. **Security**
527
+ - Implement proper TLS security for production environments
528
+ - Use namespaces to isolate different environments
529
+ - Use API keys for Temporal Cloud authentication
354
530
 
355
531
  ## Contributing
356
532