nestjs-temporal-core 3.0.0 → 3.0.3

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 (101) hide show
  1. package/README.md +271 -150
  2. package/dist/client/temporal-client.module.d.ts +9 -3
  3. package/dist/client/temporal-client.module.js +43 -13
  4. package/dist/client/temporal-client.module.js.map +1 -1
  5. package/dist/client/temporal-client.service.d.ts +10 -3
  6. package/dist/client/temporal-client.service.js +15 -6
  7. package/dist/client/temporal-client.service.js.map +1 -1
  8. package/dist/client/temporal-schedule.service.d.ts +21 -5
  9. package/dist/client/temporal-schedule.service.js +42 -10
  10. package/dist/client/temporal-schedule.service.js.map +1 -1
  11. package/dist/constants.d.ts +47 -70
  12. package/dist/constants.js +51 -74
  13. package/dist/constants.js.map +1 -1
  14. package/dist/decorators/activity.decorator.d.ts +3 -0
  15. package/dist/decorators/activity.decorator.js +39 -0
  16. package/dist/decorators/activity.decorator.js.map +1 -0
  17. package/dist/decorators/index.d.ts +4 -5
  18. package/dist/decorators/index.js +17 -19
  19. package/dist/decorators/index.js.map +1 -1
  20. package/dist/decorators/parameter.decorator.d.ts +7 -0
  21. package/dist/decorators/parameter.decorator.js +69 -0
  22. package/dist/decorators/parameter.decorator.js.map +1 -0
  23. package/dist/decorators/{scheduling.decorators.d.ts → scheduling.decorator.d.ts} +1 -1
  24. package/dist/decorators/{scheduling.decorators.js → scheduling.decorator.js} +24 -1
  25. package/dist/decorators/scheduling.decorator.js.map +1 -0
  26. package/dist/decorators/workflow.decorator.d.ts +3 -0
  27. package/dist/decorators/workflow.decorator.js +58 -0
  28. package/dist/decorators/workflow.decorator.js.map +1 -0
  29. package/dist/discovery/index.d.ts +2 -2
  30. package/dist/discovery/index.js +2 -2
  31. package/dist/discovery/index.js.map +1 -1
  32. package/dist/discovery/{workflow-discovery.service.d.ts → temporal-discovery.service.d.ts} +21 -18
  33. package/dist/discovery/temporal-discovery.service.js +190 -0
  34. package/dist/discovery/temporal-discovery.service.js.map +1 -0
  35. package/dist/discovery/{schedule-manager.service.d.ts → temporal-schedule-manager.service.d.ts} +20 -15
  36. package/dist/discovery/{schedule-manager.service.js → temporal-schedule-manager.service.js} +96 -76
  37. package/dist/discovery/temporal-schedule-manager.service.js.map +1 -0
  38. package/dist/index.d.ts +6 -11
  39. package/dist/index.js +16 -16
  40. package/dist/index.js.map +1 -1
  41. package/dist/interfaces.d.ts +193 -0
  42. package/dist/interfaces.js +9 -0
  43. package/dist/interfaces.js.map +1 -0
  44. package/dist/temporal.module.d.ts +2 -1
  45. package/dist/temporal.module.js +84 -49
  46. package/dist/temporal.module.js.map +1 -1
  47. package/dist/temporal.service.d.ts +34 -26
  48. package/dist/temporal.service.js +76 -47
  49. package/dist/temporal.service.js.map +1 -1
  50. package/dist/tsconfig.tsbuildinfo +1 -1
  51. package/dist/worker/index.d.ts +1 -1
  52. package/dist/worker/index.js +1 -1
  53. package/dist/worker/index.js.map +1 -1
  54. package/dist/worker/temporal-metadata.accessor.d.ts +13 -5
  55. package/dist/worker/temporal-metadata.accessor.js +38 -26
  56. package/dist/worker/temporal-metadata.accessor.js.map +1 -1
  57. package/dist/worker/{worker-manager.service.d.ts → temporal-worker-manager.service.d.ts} +13 -4
  58. package/dist/worker/{worker-manager.service.js → temporal-worker-manager.service.js} +58 -22
  59. package/dist/worker/temporal-worker-manager.service.js.map +1 -0
  60. package/dist/worker/temporal-worker.module.d.ts +14 -4
  61. package/dist/worker/temporal-worker.module.js +81 -15
  62. package/dist/worker/temporal-worker.module.js.map +1 -1
  63. package/package.json +13 -7
  64. package/dist/decorators/communication.decorators.d.ts +0 -5
  65. package/dist/decorators/communication.decorators.js +0 -66
  66. package/dist/decorators/communication.decorators.js.map +0 -1
  67. package/dist/decorators/core.decorators.d.ts +0 -6
  68. package/dist/decorators/core.decorators.js +0 -87
  69. package/dist/decorators/core.decorators.js.map +0 -1
  70. package/dist/decorators/parameter.decorators.d.ts +0 -2
  71. package/dist/decorators/parameter.decorators.js +0 -29
  72. package/dist/decorators/parameter.decorators.js.map +0 -1
  73. package/dist/decorators/scheduling.decorators.js.map +0 -1
  74. package/dist/decorators/workflow-starter.decorator.d.ts +0 -2
  75. package/dist/decorators/workflow-starter.decorator.js +0 -14
  76. package/dist/decorators/workflow-starter.decorator.js.map +0 -1
  77. package/dist/discovery/schedule-manager.service.js.map +0 -1
  78. package/dist/discovery/workflow-discovery.service.js +0 -216
  79. package/dist/discovery/workflow-discovery.service.js.map +0 -1
  80. package/dist/interfaces/activity.interface.d.ts +0 -8
  81. package/dist/interfaces/activity.interface.js +0 -3
  82. package/dist/interfaces/activity.interface.js.map +0 -1
  83. package/dist/interfaces/core.interface.d.ts +0 -112
  84. package/dist/interfaces/core.interface.js +0 -3
  85. package/dist/interfaces/core.interface.js.map +0 -1
  86. package/dist/interfaces/discovery.interface.d.ts +0 -61
  87. package/dist/interfaces/discovery.interface.js +0 -3
  88. package/dist/interfaces/discovery.interface.js.map +0 -1
  89. package/dist/interfaces/index.d.ts +0 -9
  90. package/dist/interfaces/index.js +0 -29
  91. package/dist/interfaces/index.js.map +0 -1
  92. package/dist/interfaces/scheduling.interface.d.ts +0 -17
  93. package/dist/interfaces/scheduling.interface.js +0 -3
  94. package/dist/interfaces/scheduling.interface.js.map +0 -1
  95. package/dist/interfaces/worker.interface.d.ts +0 -23
  96. package/dist/interfaces/worker.interface.js +0 -3
  97. package/dist/interfaces/worker.interface.js.map +0 -1
  98. package/dist/interfaces/workflow.interface.d.ts +0 -55
  99. package/dist/interfaces/workflow.interface.js +0 -3
  100. package/dist/interfaces/workflow.interface.js.map +0 -1
  101. package/dist/worker/worker-manager.service.js.map +0 -1
package/README.md CHANGED
@@ -1,216 +1,337 @@
1
1
  # NestJS Temporal Core
2
2
 
3
- A comprehensive NestJS integration for [Temporal.io](https://temporal.io/) that provides seamless worker and client support with auto-discovery, declarative scheduling, and enterprise-ready features for building reliable distributed applications.
3
+ A comprehensive NestJS integration for [Temporal.io](https://temporal.io/) that provides seamless workflow orchestration with auto-discovery, declarative scheduling, and production-ready features.
4
4
 
5
5
  [![npm version](https://badge.fury.io/js/nestjs-temporal-core.svg)](https://badge.fury.io/js/nestjs-temporal-core)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
7
  [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/)
8
8
 
9
- ## 📚 Documentation
10
-
11
- ### Quick Links
12
- - **[🚀 Getting Started](./docs/getting-started.md)** - Installation, basic setup, and first workflow
13
- - **[⚙️ Configuration](./docs/configuration.md)** - Complete configuration reference and examples
14
- - **[📖 API Reference](./docs/api-reference.md)** - Detailed API documentation for all services and decorators
15
- - **[🍳 Examples & Recipes](./docs/examples.md)** - Practical examples and common patterns
16
- - **[🏗️ Best Practices](./docs/best-practices.md)** - Production guidelines and optimization tips
17
- - **[🔄 Migration Guide](./docs/migration.md)** - Upgrading from previous versions
18
- - **[🔧 Troubleshooting](./docs/troubleshooting.md)** - Common issues and solutions
19
-
20
- ### Advanced Topics
21
- - **[🏢 Enterprise Features](./docs/enterprise.md)** - Advanced features for production deployments
22
- - **[📊 Monitoring & Health](./docs/monitoring.md)** - Health checks, metrics, and observability
23
- - **[🔐 Security](./docs/security.md)** - TLS, authentication, and security best practices
24
- - **[🧪 Testing](./docs/testing.md)** - Testing workflows and activities
25
- - **[🐳 Deployment](./docs/deployment.md)** - Docker, Kubernetes, and cloud deployment guides
26
-
27
9
  ## Overview
28
10
 
29
- NestJS Temporal Core makes it easy to integrate Temporal.io with your NestJS applications using familiar decorator patterns. Temporal is a durable execution system for reliable microservices and workflow orchestration.
11
+ NestJS Temporal Core brings Temporal's durable execution to NestJS with familiar decorator patterns and automatic discovery. Build reliable distributed systems with activities and scheduled tasks using native NestJS conventions.
30
12
 
31
- ## Features
13
+ ## 🚀 Key Features
32
14
 
33
- - 🚀 **Easy NestJS Integration** - Simple module registration with unified configuration
34
- - 🎯 **Auto-Discovery** - Automatic discovery of workflow controllers and scheduled workflows
35
- - 🔄 **Complete Lifecycle Management** - Automatic worker initialization and graceful shutdown
36
- - 📋 **Declarative Decorators** - NestJS-style `@WorkflowController`, `@Cron`, `@Interval`, and more
37
- - 🕐 **Smart Scheduling** - Built-in cron and interval-based workflow scheduling with management
38
- - 🔌 **Connection Management** - Simplified connection handling with TLS and Temporal Cloud support
39
- - 🔒 **Type Safety** - Clean, strongly typed interfaces for all Temporal concepts
40
- - 📡 **Enhanced Client** - Methods for starting, signaling, and querying workflows with auto-discovery
41
- - 📊 **Worker Management** - Advanced worker lifecycle control, monitoring, and health checks
42
- - 🏭 **Production Ready** - Environment-aware configuration, health monitoring, and graceful degradation
15
+ - **🎯 NestJS-Native** - Familiar patterns: `@Activity`, `@Cron`, `@Interval`
16
+ - **🔍 Auto-Discovery** - Automatically finds and registers activities and schedules
17
+ - **📅 Declarative Scheduling** - Built-in cron and interval scheduling that just works
18
+ - **🔄 Unified Service** - Single `TemporalService` for all operations
19
+ - **⚙️ Flexible Setup** - Client-only, worker-only, or unified deployments
20
+ - **🏥 Health Monitoring** - Comprehensive status monitoring and health checks
21
+ - **🔧 Production Ready** - TLS, connection management, graceful shutdowns
22
+ - **📊 Complete Integration** - Full-featured module architecture
43
23
 
44
- ## 🚀 Quick Start
45
-
46
- ### Installation
24
+ ## 📦 Installation
47
25
 
48
26
  ```bash
49
27
  npm install nestjs-temporal-core @temporalio/client @temporalio/worker @temporalio/workflow
50
28
  ```
51
29
 
52
- ### Basic Setup
30
+ ## 🚀 Quick Start
31
+
32
+ ### 1. Module Setup
53
33
 
54
34
  ```typescript
55
35
  // app.module.ts
56
36
  import { Module } from '@nestjs/common';
57
37
  import { TemporalModule } from 'nestjs-temporal-core';
38
+ import { EmailActivities } from './activities/email.activities';
58
39
 
59
40
  @Module({
60
- imports: [
61
- TemporalModule.register({
62
- connection: {
63
- address: 'localhost:7233',
64
- namespace: 'default',
65
- },
66
- taskQueue: 'my-task-queue',
67
- worker: {
68
- workflowsPath: './dist/workflows',
69
- activityClasses: [EmailActivities],
70
- autoStart: true,
71
- },
72
- isGlobal: true,
73
- }),
74
- ],
41
+ imports: [
42
+ TemporalModule.register({
43
+ connection: {
44
+ address: 'localhost:7233',
45
+ namespace: 'default',
46
+ },
47
+ taskQueue: 'my-app',
48
+ worker: {
49
+ workflowsPath: './dist/workflows',
50
+ activityClasses: [EmailActivities], // Auto-discovered
51
+ },
52
+ }),
53
+ ],
54
+ providers: [EmailActivities],
75
55
  })
76
56
  export class AppModule {}
77
57
  ```
78
58
 
79
- ### Create a Workflow Controller
59
+ ### 2. Create Activities
80
60
 
81
61
  ```typescript
82
- import { WorkflowController, WorkflowMethod, Cron, Signal, Query } from 'nestjs-temporal-core';
62
+ // activities/email.activities.ts
63
+ import { Injectable } from '@nestjs/common';
64
+ import { Activity, ActivityMethod } from 'nestjs-temporal-core';
83
65
 
84
- @WorkflowController({ taskQueue: 'orders' })
85
- export class OrderWorkflowController {
86
- private status = 'pending';
87
-
88
- @WorkflowMethod()
89
- async processOrder(orderId: string, customerId: string): Promise<string> {
90
- this.status = 'processing';
91
- // Workflow logic here
92
- this.status = 'completed';
93
- return this.status;
94
- }
95
-
96
- @Cron('0 8 * * *', {
97
- scheduleId: 'daily-order-report',
98
- description: 'Generate daily order report'
99
- })
100
- @WorkflowMethod()
101
- async generateDailyReport(): Promise<void> {
102
- console.log('Generating daily order report...');
103
- }
104
-
105
- @Signal('addItem')
106
- async addItemToOrder(item: any): Promise<void> {
107
- console.log('Item added to order:', item);
108
- }
109
-
110
- @Query('getStatus')
111
- getOrderStatus(): string {
112
- return this.status;
113
- }
66
+ @Injectable()
67
+ @Activity()
68
+ export class EmailActivities {
69
+ @ActivityMethod()
70
+ async sendWelcomeEmail(email: string, name: string): Promise<boolean> {
71
+ console.log(`Sending welcome email to ${email}`);
72
+ // Your email logic here
73
+ return true;
74
+ }
75
+
76
+ @ActivityMethod()
77
+ async sendNotification(email: string, message: string): Promise<void> {
78
+ console.log(`Notification to ${email}: ${message}`);
79
+ // Your notification logic here
80
+ }
114
81
  }
115
82
  ```
116
83
 
117
- ### Use the Service
84
+ ### 3. Create Scheduled Workflows
118
85
 
119
86
  ```typescript
87
+ // services/scheduled.service.ts
120
88
  import { Injectable } from '@nestjs/common';
121
- import { TemporalService } from 'nestjs-temporal-core';
89
+ import { Cron, Interval } from 'nestjs-temporal-core';
122
90
 
123
91
  @Injectable()
124
- export class OrderService {
125
- constructor(private readonly temporalService: TemporalService) {}
126
-
127
- async processOrder(orderId: string, customerId: string): Promise<string> {
128
- const { workflowId } = await this.temporalService.startWorkflow(
129
- 'processOrder',
130
- [orderId, customerId],
131
- { workflowId: `order-${orderId}` }
132
- );
133
-
134
- return workflowId;
135
- }
92
+ export class ScheduledService {
93
+ // Automatic scheduling - runs at 9 AM daily
94
+ @Cron('0 9 * * *', {
95
+ scheduleId: 'daily-user-report',
96
+ description: 'Generate daily user report'
97
+ })
98
+ async generateDailyReport(): Promise<void> {
99
+ console.log('Generating daily user report...');
100
+ // Report generation logic
101
+ }
102
+
103
+ // Interval-based scheduling - runs every hour
104
+ @Interval('1h', {
105
+ scheduleId: 'hourly-cleanup',
106
+ description: 'Hourly cleanup task'
107
+ })
108
+ async cleanupTask(): Promise<void> {
109
+ console.log('Running cleanup task...');
110
+ // Cleanup logic
111
+ }
136
112
  }
137
113
  ```
138
114
 
139
- ## 📖 Core Concepts
115
+ ### 4. Use in Services
116
+
117
+ ```typescript
118
+ // services/user.service.ts
119
+ import { Injectable } from '@nestjs/common';
120
+ import { TemporalService } from 'nestjs-temporal-core';
140
121
 
141
- ### Workflow Controllers
142
- New NestJS-style controllers for defining workflows with auto-discovery and declarative scheduling.
122
+ @Injectable()
123
+ export class UserService {
124
+ constructor(private readonly temporal: TemporalService) {}
125
+
126
+ async processUser(email: string, name: string): Promise<string> {
127
+ // Start workflow directly with client
128
+ const { workflowId } = await this.temporal.startWorkflow(
129
+ 'processUser',
130
+ [email, name],
131
+ {
132
+ taskQueue: 'user-processing',
133
+ workflowId: `user-${email}-${Date.now()}`
134
+ }
135
+ );
136
+
137
+ return workflowId;
138
+ }
139
+
140
+ async getUserStatus(workflowId: string): Promise<string> {
141
+ return await this.temporal.queryWorkflow(workflowId, 'getStatus');
142
+ }
143
+
144
+ async updateUserStatus(workflowId: string, status: string): Promise<void> {
145
+ await this.temporal.signalWorkflow(workflowId, 'updateStatus', [status]);
146
+ }
147
+
148
+ // Schedule management
149
+ async pauseDailyReport(): Promise<void> {
150
+ await this.temporal.pauseSchedule('daily-user-report', 'Maintenance mode');
151
+ }
152
+
153
+ async resumeDailyReport(): Promise<void> {
154
+ await this.temporal.resumeSchedule('daily-user-report');
155
+ }
156
+ }
157
+ ```
143
158
 
144
- ### Activities
145
- Reusable business logic components that can be called from workflows.
159
+ ## ⚙️ Configuration Options
146
160
 
147
- ### Scheduling
148
- Built-in support for cron and interval-based workflow scheduling using decorators.
161
+ ### Basic Configuration
149
162
 
150
- ### Auto-Discovery
151
- Automatic detection and registration of workflow controllers and scheduled workflows.
163
+ ```typescript
164
+ TemporalModule.register({
165
+ connection: {
166
+ address: 'localhost:7233',
167
+ namespace: 'default',
168
+ },
169
+ taskQueue: 'my-app',
170
+ worker: {
171
+ workflowsPath: './dist/workflows',
172
+ activityClasses: [EmailActivities, PaymentActivities],
173
+ },
174
+ });
175
+ ```
152
176
 
153
- ## 🏗️ Architecture
177
+ ### Client-Only Mode
154
178
 
179
+ ```typescript
180
+ TemporalModule.forClient({
181
+ connection: {
182
+ address: 'temporal.company.com:7233',
183
+ namespace: 'production',
184
+ tls: true,
185
+ },
186
+ });
155
187
  ```
156
- ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
157
- │ NestJS App │ │ Temporal Server │ │ Worker Process │
158
- │ │ │ │ │ │
159
- │ ┌─────────────┐ │ │ ┌──────────────┐ │ │ ┌─────────────┐ │
160
- │ │ Controllers │ │───▶│ │ Workflows │ │───▶│ │ Activities │ │
161
- │ │ Services │ │ │ Schedules │ │ │ │ Workers │ │
162
- │ └─────────────┘ │ └──────────────┘ │ │ └─────────────┘ │
163
- └─────────────────┘ └──────────────────┘ └─────────────────┘
188
+
189
+ ### Worker-Only Mode
190
+
191
+ ```typescript
192
+ TemporalModule.forWorker({
193
+ connection: {
194
+ address: 'localhost:7233',
195
+ namespace: 'development',
196
+ },
197
+ taskQueue: 'worker-queue',
198
+ workflowsPath: './dist/workflows',
199
+ activityClasses: [ProcessingActivities],
200
+ });
164
201
  ```
165
202
 
166
- ## 🎯 Use Cases
203
+ ### Async Configuration
167
204
 
168
- - **Order Processing** - Reliable order fulfillment with compensation
169
- - **Payment Processing** - Multi-step payment flows with retries
170
- - **Data Pipelines** - Long-running data processing workflows
171
- - **Scheduled Jobs** - Cron-based and interval-based background tasks
172
- - **Saga Patterns** - Distributed transaction management
173
- - **Human Tasks** - Workflows requiring human intervention
174
- - **Microservice Orchestration** - Coordinating multiple services
205
+ ```typescript
206
+ TemporalModule.registerAsync({
207
+ imports: [ConfigModule],
208
+ useFactory: (config: ConfigService) => ({
209
+ connection: {
210
+ address: config.get('TEMPORAL_ADDRESS'),
211
+ namespace: config.get('TEMPORAL_NAMESPACE'),
212
+ },
213
+ taskQueue: config.get('TEMPORAL_TASK_QUEUE'),
214
+ worker: {
215
+ workflowsPath: './dist/workflows',
216
+ activityClasses: [EmailActivities],
217
+ },
218
+ }),
219
+ inject: [ConfigService],
220
+ });
221
+ ```
175
222
 
176
- ## 🌟 What's New in v3.0
223
+ ## 📋 Core Concepts
177
224
 
178
- - **🎮 Workflow Controllers** - NestJS-style workflow definition
179
- - **📅 Declarative Scheduling** - `@Cron` and `@Interval` decorators
180
- - **🔍 Auto-Discovery** - Automatic workflow and schedule detection
181
- - **📊 Enhanced Monitoring** - Built-in health checks and metrics
182
- - **🏭 Production Features** - Worker presets, graceful shutdown, error handling
183
- - **🔧 Better Developer Experience** - Improved APIs and TypeScript support
225
+ ### Auto-Discovery
226
+ The module automatically discovers and registers:
227
+ - **Activity Classes** marked with `@Activity`
228
+ - **Scheduled Workflows** marked with `@Cron` or `@Interval`
229
+ - **Signals and Queries** within classes
184
230
 
185
- ## 📦 Packages
231
+ ### Scheduling Made Simple
232
+ ```typescript
233
+ // Just add the decorator - schedule is created automatically!
234
+ @Cron('0 8 * * *', { scheduleId: 'daily-report' })
235
+ async generateReport(): Promise<void> {
236
+ // This will run every day at 8 AM
237
+ }
238
+ ```
186
239
 
187
- | Package | Version | Description |
188
- | ---------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------ |
189
- | `nestjs-temporal-core` | [![npm](https://img.shields.io/npm/v/nestjs-temporal-core.svg)](https://www.npmjs.com/package/nestjs-temporal-core) | Main integration package |
190
- | `@temporalio/client` | [![npm](https://img.shields.io/npm/v/@temporalio/client.svg)](https://www.npmjs.com/package/@temporalio/client) | Temporal client library |
191
- | `@temporalio/worker` | [![npm](https://img.shields.io/npm/v/@temporalio/worker.svg)](https://www.npmjs.com/package/@temporalio/worker) | Temporal worker library |
192
- | `@temporalio/workflow` | [![npm](https://img.shields.io/npm/v/@temporalio/workflow.svg)](https://www.npmjs.com/package/@temporalio/workflow) | Workflow runtime library |
240
+ ## 🔧 Common Use Cases
193
241
 
194
- ## 🤝 Community
242
+ ### Scheduled Reports
243
+ ```typescript
244
+ @Injectable()
245
+ export class ReportService {
246
+ @Cron('0 0 * * 0', { scheduleId: 'weekly-sales-report' })
247
+ async generateWeeklySalesReport(): Promise<void> {
248
+ // Automatically runs every Sunday at midnight
249
+ console.log('Generating weekly sales report...');
250
+ }
251
+ }
252
+ ```
195
253
 
196
- - **GitHub Discussions** - Ask questions and share ideas
197
- - **Issues** - Report bugs and request features
198
- - **Pull Requests** - Contribute to the project
254
+ ### Data Processing
255
+ ```typescript
256
+ @Injectable()
257
+ @Activity()
258
+ export class DataProcessingActivities {
259
+ @ActivityMethod()
260
+ async processFile(filePath: string): Promise<string> {
261
+ console.log(`Processing file: ${filePath}`);
262
+ // File processing logic
263
+ return 'processed';
264
+ }
265
+
266
+ @ActivityMethod()
267
+ async sendNotification(message: string): Promise<void> {
268
+ console.log(`Sending notification: ${message}`);
269
+ // Notification logic
270
+ }
271
+ }
272
+ ```
199
273
 
200
- ## 📄 License
274
+ ### Monitoring Tasks
275
+ ```typescript
276
+ @Injectable()
277
+ export class MonitoringService {
278
+ @Interval('5m', {
279
+ scheduleId: 'health-check',
280
+ description: 'Health check every 5 minutes'
281
+ })
282
+ async healthCheck(): Promise<void> {
283
+ console.log('Running health check...');
284
+ // Health check logic
285
+ }
286
+ }
287
+ ```
288
+
289
+ ## 📊 Monitoring & Health Checks
201
290
 
202
- This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
291
+ ```typescript
292
+ @Injectable()
293
+ export class MonitoringService {
294
+ constructor(private readonly temporal: TemporalService) {}
295
+
296
+ async getSystemHealth() {
297
+ // Comprehensive health status
298
+ const health = await this.temporal.getOverallHealth();
299
+ return {
300
+ status: health.status, // 'healthy' | 'degraded' | 'unhealthy'
301
+ components: health.components,
302
+ };
303
+ }
304
+
305
+ async getDiscoveryInfo() {
306
+ // What was discovered
307
+ const schedules = this.temporal.getManagedSchedules();
308
+ const stats = this.temporal.getDiscoveryStats();
309
+
310
+ return { schedules, stats };
311
+ }
312
+
313
+ async manageSchedules() {
314
+ // Schedule management
315
+ await this.temporal.pauseSchedule('daily-report', 'Maintenance');
316
+ await this.temporal.resumeSchedule('daily-report');
317
+ await this.temporal.triggerSchedule('daily-report'); // Run now
318
+ }
319
+ }
320
+ ```
203
321
 
204
- ## 👨‍💻 Author
322
+ ## 🌟 Why This Package?
205
323
 
206
- **Harsh M** - [GitHub](https://github.com/harsh-simform)
324
+ - **🎯 NestJS First** - Built specifically for NestJS with familiar patterns
325
+ - **🔄 Auto-Discovery** - No manual registration, just use decorators
326
+ - **📅 Built-in Scheduling** - Cron jobs that integrate with workflows
327
+ - **🔧 Production Ready** - Health checks, monitoring, graceful shutdowns
328
+ - **📚 Easy to Learn** - Familiar NestJS service patterns
329
+ - **🚀 Scalable** - Client-only, worker-only, or unified deployments
207
330
 
208
- ## 🙏 Acknowledgments
331
+ ## 🤝 Contributing
209
332
 
210
- - [Temporal.io](https://temporal.io/) - For the amazing workflow engine
211
- - [NestJS](https://nestjs.com/) - For the incredible framework
212
- - [TypeScript](https://www.typescriptlang.org/) - For making JavaScript enjoyable
333
+ Contributions welcome! Please read our [Contributing Guide](./CONTRIBUTING.md) for details.
213
334
 
214
- ---
335
+ ## 📄 License
215
336
 
216
- **[📚 Continue to Getting Started →](./docs/getting-started.md)**
337
+ MIT License - see [LICENSE](LICENSE) file for details.
@@ -1,12 +1,18 @@
1
1
  import { DynamicModule } from '@nestjs/common';
2
- import { TemporalClientOptions, TemporalClientAsyncOptions } from '../interfaces';
2
+ import { TemporalAsyncOptions, TemporalOptions } from '../interfaces';
3
3
  export declare class TemporalClientModule {
4
4
  private static readonly logger;
5
- static register(options: TemporalClientOptions): DynamicModule;
6
- static registerAsync(options: TemporalClientAsyncOptions): DynamicModule;
5
+ static register(options: TemporalOptions): DynamicModule;
6
+ static registerAsync(options: TemporalAsyncOptions): DynamicModule;
7
+ static forClient(options: {
8
+ connection: TemporalOptions['connection'];
9
+ isGlobal?: boolean;
10
+ }): DynamicModule;
7
11
  private static createClientProvider;
8
12
  private static createAsyncClientProvider;
9
13
  private static createAsyncProviders;
10
14
  private static createClientInstance;
11
15
  private static enhanceClientWithShutdown;
16
+ private static extractClientOptions;
17
+ private static validateOptions;
12
18
  }
@@ -15,18 +15,19 @@ const temporal_client_service_1 = require("./temporal-client.service");
15
15
  const temporal_schedule_service_1 = require("./temporal-schedule.service");
16
16
  let TemporalClientModule = TemporalClientModule_1 = class TemporalClientModule {
17
17
  static register(options) {
18
+ const clientOptions = this.extractClientOptions(options);
18
19
  return {
19
20
  module: TemporalClientModule_1,
20
21
  providers: [
21
22
  {
22
- provide: constants_1.TEMPORAL_CLIENT_MODULE_OPTIONS,
23
- useValue: options,
23
+ provide: constants_1.TEMPORAL_MODULE_OPTIONS,
24
+ useValue: clientOptions,
24
25
  },
25
- this.createClientProvider(options),
26
+ this.createClientProvider(clientOptions),
26
27
  temporal_client_service_1.TemporalClientService,
27
28
  temporal_schedule_service_1.TemporalScheduleService,
28
29
  ],
29
- exports: [temporal_client_service_1.TemporalClientService, temporal_schedule_service_1.TemporalScheduleService],
30
+ exports: [temporal_client_service_1.TemporalClientService, temporal_schedule_service_1.TemporalScheduleService, constants_1.TEMPORAL_CLIENT],
30
31
  };
31
32
  }
32
33
  static registerAsync(options) {
@@ -39,9 +40,15 @@ let TemporalClientModule = TemporalClientModule_1 = class TemporalClientModule {
39
40
  temporal_client_service_1.TemporalClientService,
40
41
  temporal_schedule_service_1.TemporalScheduleService,
41
42
  ],
42
- exports: [temporal_client_service_1.TemporalClientService, temporal_schedule_service_1.TemporalScheduleService],
43
+ exports: [temporal_client_service_1.TemporalClientService, temporal_schedule_service_1.TemporalScheduleService, constants_1.TEMPORAL_CLIENT],
43
44
  };
44
45
  }
46
+ static forClient(options) {
47
+ return this.register({
48
+ connection: options.connection,
49
+ isGlobal: options.isGlobal,
50
+ });
51
+ }
45
52
  static createClientProvider(options) {
46
53
  return {
47
54
  provide: constants_1.TEMPORAL_CLIENT,
@@ -51,15 +58,18 @@ let TemporalClientModule = TemporalClientModule_1 = class TemporalClientModule {
51
58
  static createAsyncClientProvider() {
52
59
  return {
53
60
  provide: constants_1.TEMPORAL_CLIENT,
54
- useFactory: async (clientOptions) => this.createClientInstance(clientOptions),
55
- inject: [constants_1.TEMPORAL_CLIENT_MODULE_OPTIONS],
61
+ useFactory: async (temporalOptions) => {
62
+ const clientOptions = this.extractClientOptions(temporalOptions);
63
+ return this.createClientInstance(clientOptions);
64
+ },
65
+ inject: [constants_1.TEMPORAL_MODULE_OPTIONS],
56
66
  };
57
67
  }
58
68
  static createAsyncProviders(options) {
59
69
  if (options.useFactory) {
60
70
  return [
61
71
  {
62
- provide: constants_1.TEMPORAL_CLIENT_MODULE_OPTIONS,
72
+ provide: constants_1.TEMPORAL_MODULE_OPTIONS,
63
73
  useFactory: options.useFactory,
64
74
  inject: options.inject || [],
65
75
  },
@@ -68,8 +78,8 @@ let TemporalClientModule = TemporalClientModule_1 = class TemporalClientModule {
68
78
  if (options.useClass) {
69
79
  return [
70
80
  {
71
- provide: constants_1.TEMPORAL_CLIENT_MODULE_OPTIONS,
72
- useFactory: async (optionsFactory) => optionsFactory.createClientOptions(),
81
+ provide: constants_1.TEMPORAL_MODULE_OPTIONS,
82
+ useFactory: async (optionsFactory) => optionsFactory.createTemporalOptions(),
73
83
  inject: [options.useClass],
74
84
  },
75
85
  {
@@ -81,8 +91,8 @@ let TemporalClientModule = TemporalClientModule_1 = class TemporalClientModule {
81
91
  if (options.useExisting) {
82
92
  return [
83
93
  {
84
- provide: constants_1.TEMPORAL_CLIENT_MODULE_OPTIONS,
85
- useFactory: async (optionsFactory) => optionsFactory.createClientOptions(),
94
+ provide: constants_1.TEMPORAL_MODULE_OPTIONS,
95
+ useFactory: async (optionsFactory) => optionsFactory.createTemporalOptions(),
86
96
  inject: [options.useExisting],
87
97
  },
88
98
  ];
@@ -105,7 +115,7 @@ let TemporalClientModule = TemporalClientModule_1 = class TemporalClientModule {
105
115
  };
106
116
  }
107
117
  connection = await client_1.Connection.connect(connectionConfig);
108
- const namespace = options.namespace || constants_1.DEFAULT_NAMESPACE;
118
+ const namespace = options.connection.namespace || constants_1.DEFAULT_NAMESPACE;
109
119
  this.logger.log(`Connected to Temporal server, using namespace "${namespace}"`);
110
120
  const client = new client_1.Client({ connection, namespace });
111
121
  return this.enhanceClientWithShutdown(client);
@@ -141,6 +151,26 @@ let TemporalClientModule = TemporalClientModule_1 = class TemporalClientModule {
141
151
  };
142
152
  return enhancedClient;
143
153
  }
154
+ static extractClientOptions(options) {
155
+ return {
156
+ connection: {
157
+ address: options.connection.address,
158
+ namespace: options.connection.namespace,
159
+ tls: options.connection.tls,
160
+ apiKey: options.connection.apiKey,
161
+ metadata: options.connection.metadata,
162
+ },
163
+ allowConnectionFailure: true,
164
+ };
165
+ }
166
+ static validateOptions(options) {
167
+ if (!options.connection) {
168
+ throw new Error('Connection configuration is required');
169
+ }
170
+ if (!options.connection.address) {
171
+ throw new Error('Connection address is required');
172
+ }
173
+ }
144
174
  };
145
175
  exports.TemporalClientModule = TemporalClientModule;
146
176
  TemporalClientModule.logger = new common_1.Logger(TemporalClientModule_1.name);
@@ -1 +1 @@
1
- {"version":3,"file":"temporal-client.module.js","sourceRoot":"","sources":["../../src/client/temporal-client.module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"temporal-client.module.js","sourceRoot":"","sources":["../../src/client/temporal-client.module.ts"],"names":[],"mappings":"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"}