@bloomneo/appkit 1.2.9
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/LICENSE +21 -0
- package/README.md +902 -0
- package/bin/appkit.js +71 -0
- package/bin/commands/generate.js +1050 -0
- package/bin/templates/backend/README.md.template +39 -0
- package/bin/templates/backend/api.http.template +0 -0
- package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
- package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
- package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
- package/bin/templates/backend/package.json.template +34 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
- package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
- package/bin/templates/backend/src/api/server.ts.template +188 -0
- package/bin/templates/backend/tsconfig.api.json.template +24 -0
- package/bin/templates/backend/tsconfig.json.template +40 -0
- package/bin/templates/feature/feature.http.template +63 -0
- package/bin/templates/feature/feature.route.ts.template +36 -0
- package/bin/templates/feature/feature.service.ts.template +81 -0
- package/bin/templates/feature/feature.types.ts.template +23 -0
- package/bin/templates/feature-db/feature.http.template +63 -0
- package/bin/templates/feature-db/feature.model.ts.template +74 -0
- package/bin/templates/feature-db/feature.route.ts.template +58 -0
- package/bin/templates/feature-db/feature.service.ts.template +231 -0
- package/bin/templates/feature-db/feature.types.ts.template +25 -0
- package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
- package/bin/templates/feature-db/seeding/README.md.template +57 -0
- package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
- package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
- package/bin/templates/feature-user/user.http.template +157 -0
- package/bin/templates/feature-user/user.model.ts.template +244 -0
- package/bin/templates/feature-user/user.route.ts.template +379 -0
- package/bin/templates/feature-user/user.seed.js.template +182 -0
- package/bin/templates/feature-user/user.service.ts.template +426 -0
- package/bin/templates/feature-user/user.types.ts.template +127 -0
- package/dist/auth/auth.d.ts +182 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +477 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/defaults.d.ts +104 -0
- package/dist/auth/defaults.d.ts.map +1 -0
- package/dist/auth/defaults.js +374 -0
- package/dist/auth/defaults.js.map +1 -0
- package/dist/auth/index.d.ts +70 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +94 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/cache.d.ts +118 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +249 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/defaults.d.ts +63 -0
- package/dist/cache/defaults.d.ts.map +1 -0
- package/dist/cache/defaults.js +193 -0
- package/dist/cache/defaults.js.map +1 -0
- package/dist/cache/index.d.ts +101 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +203 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/strategies/memory.d.ts +138 -0
- package/dist/cache/strategies/memory.d.ts.map +1 -0
- package/dist/cache/strategies/memory.js +348 -0
- package/dist/cache/strategies/memory.js.map +1 -0
- package/dist/cache/strategies/redis.d.ts +105 -0
- package/dist/cache/strategies/redis.d.ts.map +1 -0
- package/dist/cache/strategies/redis.js +318 -0
- package/dist/cache/strategies/redis.js.map +1 -0
- package/dist/config/config.d.ts +62 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +107 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +44 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +217 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +105 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +163 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/adapters/mongoose.d.ts +106 -0
- package/dist/database/adapters/mongoose.d.ts.map +1 -0
- package/dist/database/adapters/mongoose.js +480 -0
- package/dist/database/adapters/mongoose.js.map +1 -0
- package/dist/database/adapters/prisma.d.ts +106 -0
- package/dist/database/adapters/prisma.d.ts.map +1 -0
- package/dist/database/adapters/prisma.js +494 -0
- package/dist/database/adapters/prisma.js.map +1 -0
- package/dist/database/defaults.d.ts +87 -0
- package/dist/database/defaults.d.ts.map +1 -0
- package/dist/database/defaults.js +271 -0
- package/dist/database/defaults.js.map +1 -0
- package/dist/database/index.d.ts +137 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +490 -0
- package/dist/database/index.js.map +1 -0
- package/dist/email/defaults.d.ts +100 -0
- package/dist/email/defaults.d.ts.map +1 -0
- package/dist/email/defaults.js +400 -0
- package/dist/email/defaults.js.map +1 -0
- package/dist/email/email.d.ts +139 -0
- package/dist/email/email.d.ts.map +1 -0
- package/dist/email/email.js +316 -0
- package/dist/email/email.js.map +1 -0
- package/dist/email/index.d.ts +176 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +251 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/strategies/console.d.ts +90 -0
- package/dist/email/strategies/console.d.ts.map +1 -0
- package/dist/email/strategies/console.js +268 -0
- package/dist/email/strategies/console.js.map +1 -0
- package/dist/email/strategies/resend.d.ts +84 -0
- package/dist/email/strategies/resend.d.ts.map +1 -0
- package/dist/email/strategies/resend.js +266 -0
- package/dist/email/strategies/resend.js.map +1 -0
- package/dist/email/strategies/smtp.d.ts +77 -0
- package/dist/email/strategies/smtp.d.ts.map +1 -0
- package/dist/email/strategies/smtp.js +286 -0
- package/dist/email/strategies/smtp.js.map +1 -0
- package/dist/error/defaults.d.ts +40 -0
- package/dist/error/defaults.d.ts.map +1 -0
- package/dist/error/defaults.js +75 -0
- package/dist/error/defaults.js.map +1 -0
- package/dist/error/error.d.ts +140 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/error.js +200 -0
- package/dist/error/error.js.map +1 -0
- package/dist/error/index.d.ts +145 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +145 -0
- package/dist/error/index.js.map +1 -0
- package/dist/event/defaults.d.ts +111 -0
- package/dist/event/defaults.d.ts.map +1 -0
- package/dist/event/defaults.js +378 -0
- package/dist/event/defaults.js.map +1 -0
- package/dist/event/event.d.ts +171 -0
- package/dist/event/event.d.ts.map +1 -0
- package/dist/event/event.js +391 -0
- package/dist/event/event.js.map +1 -0
- package/dist/event/index.d.ts +173 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/index.js +302 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/strategies/memory.d.ts +122 -0
- package/dist/event/strategies/memory.d.ts.map +1 -0
- package/dist/event/strategies/memory.js +331 -0
- package/dist/event/strategies/memory.js.map +1 -0
- package/dist/event/strategies/redis.d.ts +115 -0
- package/dist/event/strategies/redis.d.ts.map +1 -0
- package/dist/event/strategies/redis.js +434 -0
- package/dist/event/strategies/redis.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/defaults.d.ts +67 -0
- package/dist/logger/defaults.d.ts.map +1 -0
- package/dist/logger/defaults.js +213 -0
- package/dist/logger/defaults.js.map +1 -0
- package/dist/logger/index.d.ts +84 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +101 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +165 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +843 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/transports/console.d.ts +102 -0
- package/dist/logger/transports/console.d.ts.map +1 -0
- package/dist/logger/transports/console.js +276 -0
- package/dist/logger/transports/console.js.map +1 -0
- package/dist/logger/transports/database.d.ts +153 -0
- package/dist/logger/transports/database.d.ts.map +1 -0
- package/dist/logger/transports/database.js +539 -0
- package/dist/logger/transports/database.js.map +1 -0
- package/dist/logger/transports/file.d.ts +146 -0
- package/dist/logger/transports/file.d.ts.map +1 -0
- package/dist/logger/transports/file.js +464 -0
- package/dist/logger/transports/file.js.map +1 -0
- package/dist/logger/transports/http.d.ts +128 -0
- package/dist/logger/transports/http.d.ts.map +1 -0
- package/dist/logger/transports/http.js +401 -0
- package/dist/logger/transports/http.js.map +1 -0
- package/dist/logger/transports/webhook.d.ts +152 -0
- package/dist/logger/transports/webhook.d.ts.map +1 -0
- package/dist/logger/transports/webhook.js +485 -0
- package/dist/logger/transports/webhook.js.map +1 -0
- package/dist/queue/defaults.d.ts +66 -0
- package/dist/queue/defaults.d.ts.map +1 -0
- package/dist/queue/defaults.js +205 -0
- package/dist/queue/defaults.js.map +1 -0
- package/dist/queue/index.d.ts +124 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +116 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.d.ts +156 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +387 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/transports/database.d.ts +165 -0
- package/dist/queue/transports/database.d.ts.map +1 -0
- package/dist/queue/transports/database.js +595 -0
- package/dist/queue/transports/database.js.map +1 -0
- package/dist/queue/transports/memory.d.ts +143 -0
- package/dist/queue/transports/memory.d.ts.map +1 -0
- package/dist/queue/transports/memory.js +415 -0
- package/dist/queue/transports/memory.js.map +1 -0
- package/dist/queue/transports/redis.d.ts +203 -0
- package/dist/queue/transports/redis.d.ts.map +1 -0
- package/dist/queue/transports/redis.js +744 -0
- package/dist/queue/transports/redis.js.map +1 -0
- package/dist/security/defaults.d.ts +64 -0
- package/dist/security/defaults.d.ts.map +1 -0
- package/dist/security/defaults.js +159 -0
- package/dist/security/defaults.js.map +1 -0
- package/dist/security/index.d.ts +110 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +160 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security.d.ts +138 -0
- package/dist/security/security.d.ts.map +1 -0
- package/dist/security/security.js +419 -0
- package/dist/security/security.js.map +1 -0
- package/dist/storage/defaults.d.ts +79 -0
- package/dist/storage/defaults.d.ts.map +1 -0
- package/dist/storage/defaults.js +358 -0
- package/dist/storage/defaults.js.map +1 -0
- package/dist/storage/index.d.ts +153 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +242 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/storage.d.ts +151 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +439 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/strategies/local.d.ts +117 -0
- package/dist/storage/strategies/local.d.ts.map +1 -0
- package/dist/storage/strategies/local.js +368 -0
- package/dist/storage/strategies/local.js.map +1 -0
- package/dist/storage/strategies/r2.d.ts +130 -0
- package/dist/storage/strategies/r2.d.ts.map +1 -0
- package/dist/storage/strategies/r2.js +470 -0
- package/dist/storage/strategies/r2.js.map +1 -0
- package/dist/storage/strategies/s3.d.ts +121 -0
- package/dist/storage/strategies/s3.d.ts.map +1 -0
- package/dist/storage/strategies/s3.js +461 -0
- package/dist/storage/strategies/s3.js.map +1 -0
- package/dist/util/defaults.d.ts +77 -0
- package/dist/util/defaults.d.ts.map +1 -0
- package/dist/util/defaults.js +193 -0
- package/dist/util/defaults.js.map +1 -0
- package/dist/util/index.d.ts +97 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +165 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/util.d.ts +145 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +481 -0
- package/dist/util/util.js.map +1 -0
- package/package.json +234 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core queuing class with automatic transport management and job processing
|
|
3
|
+
* @module @bloomneo/appkit/queue
|
|
4
|
+
* @file src/queue/queue.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: Building queue instances - called via queueClass.get(), not directly
|
|
7
|
+
* @llm-rule AVOID: Creating QueueClass directly - always use queueClass.get() for proper setup
|
|
8
|
+
* @llm-rule NOTE: Auto-detects and switches between Memory, Redis, Database transports
|
|
9
|
+
*/
|
|
10
|
+
import type { QueueConfig } from './defaults.js';
|
|
11
|
+
import type { JobData, JobOptions, JobHandler, Queue, QueueStats, JobInfo, JobStatus } from './index.js';
|
|
12
|
+
export interface Transport {
|
|
13
|
+
add(id: string, jobType: string, data: JobData, options: JobOptions): Promise<void>;
|
|
14
|
+
process(jobType: string, handler: JobHandler<JobData>): void;
|
|
15
|
+
schedule(id: string, jobType: string, data: JobData, delay: number): Promise<void>;
|
|
16
|
+
pause(jobType?: string): Promise<void>;
|
|
17
|
+
resume(jobType?: string): Promise<void>;
|
|
18
|
+
getStats(jobType?: string): Promise<QueueStats>;
|
|
19
|
+
getJobs(status: JobStatus, jobType?: string): Promise<JobInfo[]>;
|
|
20
|
+
retry(jobId: string): Promise<void>;
|
|
21
|
+
remove(jobId: string): Promise<void>;
|
|
22
|
+
clean(status: JobStatus, grace?: number): Promise<void>;
|
|
23
|
+
getHealth(): {
|
|
24
|
+
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
25
|
+
message?: string;
|
|
26
|
+
};
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Core queuing class with automatic transport management
|
|
31
|
+
*/
|
|
32
|
+
export declare class QueueClass implements Queue {
|
|
33
|
+
private config;
|
|
34
|
+
private transport;
|
|
35
|
+
private transportType;
|
|
36
|
+
private isClosing;
|
|
37
|
+
constructor(config: QueueConfig);
|
|
38
|
+
/**
|
|
39
|
+
* Initialize transport based on configuration
|
|
40
|
+
* @llm-rule WHEN: QueueClass construction - sets up appropriate transport
|
|
41
|
+
* @llm-rule AVOID: Manual transport selection - config determines transport type
|
|
42
|
+
*/
|
|
43
|
+
private initializeTransport;
|
|
44
|
+
/**
|
|
45
|
+
* Add job to queue with automatic ID generation and validation
|
|
46
|
+
* @llm-rule WHEN: Adding background jobs for processing
|
|
47
|
+
* @llm-rule AVOID: Direct transport calls - this handles ID generation and validation
|
|
48
|
+
*/
|
|
49
|
+
add<T = JobData>(jobType: string, data: T, options?: JobOptions): Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* Register job processor for specific job type
|
|
52
|
+
* @llm-rule WHEN: Setting up job handlers for background processing
|
|
53
|
+
* @llm-rule AVOID: Multiple processors for same job type - causes conflicts
|
|
54
|
+
*/
|
|
55
|
+
process<T = JobData>(jobType: string, handler: JobHandler<T>): void;
|
|
56
|
+
/**
|
|
57
|
+
* Schedule job for future execution
|
|
58
|
+
* @llm-rule WHEN: Need to delay job execution (reminders, notifications, etc.)
|
|
59
|
+
* @llm-rule AVOID: Using setTimeout - this persists across app restarts
|
|
60
|
+
*/
|
|
61
|
+
schedule<T = JobData>(jobType: string, data: T, delay: number): Promise<string>;
|
|
62
|
+
/**
|
|
63
|
+
* Pause queue processing
|
|
64
|
+
* @llm-rule WHEN: Maintenance mode or controlled shutdown
|
|
65
|
+
* @llm-rule AVOID: Pausing without resume plan - jobs will accumulate
|
|
66
|
+
*/
|
|
67
|
+
pause(jobType?: string): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Resume queue processing
|
|
70
|
+
* @llm-rule WHEN: Resuming after maintenance or pause
|
|
71
|
+
* @llm-rule AVOID: Resuming without checking system health
|
|
72
|
+
*/
|
|
73
|
+
resume(jobType?: string): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Get queue statistics for monitoring
|
|
76
|
+
* @llm-rule WHEN: Health checks, monitoring dashboards, debugging
|
|
77
|
+
* @llm-rule AVOID: Frequent polling - can be expensive for some transports
|
|
78
|
+
*/
|
|
79
|
+
getStats(jobType?: string): Promise<QueueStats>;
|
|
80
|
+
/**
|
|
81
|
+
* Get jobs by status for debugging and monitoring
|
|
82
|
+
* @llm-rule WHEN: Debugging failed jobs or monitoring queue health
|
|
83
|
+
* @llm-rule AVOID: Getting large result sets - use pagination for big queues
|
|
84
|
+
*/
|
|
85
|
+
getJobs(status: JobStatus, jobType?: string): Promise<JobInfo[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Retry failed job by ID
|
|
88
|
+
* @llm-rule WHEN: Manual retry of failed jobs from admin interface
|
|
89
|
+
* @llm-rule AVOID: Retrying jobs that failed due to code errors without fixing code
|
|
90
|
+
*/
|
|
91
|
+
retry(jobId: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Remove job from queue
|
|
94
|
+
* @llm-rule WHEN: Canceling scheduled jobs or cleaning up specific jobs
|
|
95
|
+
* @llm-rule AVOID: Removing active jobs - let them complete naturally
|
|
96
|
+
*/
|
|
97
|
+
remove(jobId: string): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Clean old jobs by status
|
|
100
|
+
* @llm-rule WHEN: Periodic cleanup to prevent queue storage growth
|
|
101
|
+
* @llm-rule AVOID: Aggressive cleanup - keep some completed jobs for debugging
|
|
102
|
+
*/
|
|
103
|
+
clean(status: JobStatus, grace?: number): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Gracefully close queue and cleanup resources
|
|
106
|
+
* @llm-rule WHEN: App shutdown or testing cleanup
|
|
107
|
+
* @llm-rule AVOID: Abrupt shutdown - can cause job loss
|
|
108
|
+
*/
|
|
109
|
+
close(): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Get active transport type for debugging
|
|
112
|
+
* @llm-rule WHEN: Debugging transport selection or health checks
|
|
113
|
+
* @llm-rule AVOID: Using for business logic - transport is implementation detail
|
|
114
|
+
*/
|
|
115
|
+
getActiveTransport(): string;
|
|
116
|
+
/**
|
|
117
|
+
* Check if specific transport is active
|
|
118
|
+
* @llm-rule WHEN: Feature detection based on transport capabilities
|
|
119
|
+
* @llm-rule AVOID: Complex transport-specific logic - keep handlers generic
|
|
120
|
+
*/
|
|
121
|
+
hasTransport(name: string): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Get current configuration for debugging
|
|
124
|
+
* @llm-rule WHEN: Debugging configuration or health checks
|
|
125
|
+
* @llm-rule AVOID: Using for runtime decisions - config is set at startup
|
|
126
|
+
*/
|
|
127
|
+
getConfig(): QueueConfig;
|
|
128
|
+
/**
|
|
129
|
+
* Get health status of queue system
|
|
130
|
+
* @llm-rule WHEN: Health checks or monitoring
|
|
131
|
+
* @llm-rule AVOID: Frequent health checks - can impact performance
|
|
132
|
+
*/
|
|
133
|
+
getHealth(): {
|
|
134
|
+
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
135
|
+
transport: string;
|
|
136
|
+
message?: string;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Wrap job handler with error handling and retry logic
|
|
140
|
+
*/
|
|
141
|
+
private wrapHandler;
|
|
142
|
+
/**
|
|
143
|
+
* Wait for active jobs to complete with timeout
|
|
144
|
+
*/
|
|
145
|
+
private waitForActiveJobs;
|
|
146
|
+
/**
|
|
147
|
+
* Setup graceful shutdown handlers
|
|
148
|
+
*/
|
|
149
|
+
private setupGracefulShutdown;
|
|
150
|
+
private validateJobType;
|
|
151
|
+
private validateJobData;
|
|
152
|
+
private validateHandler;
|
|
153
|
+
private validateDelay;
|
|
154
|
+
private validateJobId;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/queue/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core queuing class with automatic transport management and job processing
|
|
3
|
+
* @module @bloomneo/appkit/queue
|
|
4
|
+
* @file src/queue/queue.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: Building queue instances - called via queueClass.get(), not directly
|
|
7
|
+
* @llm-rule AVOID: Creating QueueClass directly - always use queueClass.get() for proper setup
|
|
8
|
+
* @llm-rule NOTE: Auto-detects and switches between Memory, Redis, Database transports
|
|
9
|
+
*/
|
|
10
|
+
import { randomUUID } from 'crypto';
|
|
11
|
+
import { MemoryTransport } from './transports/memory.js';
|
|
12
|
+
import { RedisTransport } from './transports/redis.js';
|
|
13
|
+
import { DatabaseTransport } from './transports/database.js';
|
|
14
|
+
/**
|
|
15
|
+
* Core queuing class with automatic transport management
|
|
16
|
+
*/
|
|
17
|
+
export class QueueClass {
|
|
18
|
+
config;
|
|
19
|
+
transport;
|
|
20
|
+
transportType;
|
|
21
|
+
isClosing = false;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
this.transportType = config.transport;
|
|
25
|
+
this.transport = this.initializeTransport();
|
|
26
|
+
// Setup graceful shutdown
|
|
27
|
+
this.setupGracefulShutdown();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Initialize transport based on configuration
|
|
31
|
+
* @llm-rule WHEN: QueueClass construction - sets up appropriate transport
|
|
32
|
+
* @llm-rule AVOID: Manual transport selection - config determines transport type
|
|
33
|
+
*/
|
|
34
|
+
initializeTransport() {
|
|
35
|
+
try {
|
|
36
|
+
switch (this.config.transport) {
|
|
37
|
+
case 'redis':
|
|
38
|
+
if (!this.config.redis.url) {
|
|
39
|
+
console.warn('Redis transport selected but REDIS_URL not available, falling back to memory');
|
|
40
|
+
return new MemoryTransport(this.config);
|
|
41
|
+
}
|
|
42
|
+
return new RedisTransport(this.config);
|
|
43
|
+
case 'database':
|
|
44
|
+
if (!this.config.database.url) {
|
|
45
|
+
console.warn('Database transport selected but DATABASE_URL not available, falling back to memory');
|
|
46
|
+
return new MemoryTransport(this.config);
|
|
47
|
+
}
|
|
48
|
+
return new DatabaseTransport(this.config);
|
|
49
|
+
case 'memory':
|
|
50
|
+
default:
|
|
51
|
+
return new MemoryTransport(this.config);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error(`Failed to initialize ${this.config.transport} transport:`, error.message);
|
|
56
|
+
console.log('Falling back to memory transport');
|
|
57
|
+
this.transportType = 'memory';
|
|
58
|
+
return new MemoryTransport(this.config);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Add job to queue with automatic ID generation and validation
|
|
63
|
+
* @llm-rule WHEN: Adding background jobs for processing
|
|
64
|
+
* @llm-rule AVOID: Direct transport calls - this handles ID generation and validation
|
|
65
|
+
*/
|
|
66
|
+
async add(jobType, data, options = {}) {
|
|
67
|
+
this.validateJobType(jobType);
|
|
68
|
+
this.validateJobData(data);
|
|
69
|
+
const jobId = randomUUID();
|
|
70
|
+
const jobOptions = {
|
|
71
|
+
priority: options.priority ?? this.config.defaultPriority,
|
|
72
|
+
delay: options.delay ?? 0,
|
|
73
|
+
attempts: options.attempts ?? this.config.maxAttempts,
|
|
74
|
+
backoff: options.backoff ?? this.config.retryBackoff,
|
|
75
|
+
removeOnComplete: options.removeOnComplete ?? this.config.removeOnComplete,
|
|
76
|
+
removeOnFail: options.removeOnFail ?? this.config.removeOnFail,
|
|
77
|
+
};
|
|
78
|
+
try {
|
|
79
|
+
if (jobOptions.delay && jobOptions.delay > 0) {
|
|
80
|
+
await this.transport.schedule(jobId, jobType, data, jobOptions.delay);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
await this.transport.add(jobId, jobType, data, jobOptions);
|
|
84
|
+
}
|
|
85
|
+
return jobId;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(`Failed to add job: ${error.message}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Register job processor for specific job type
|
|
93
|
+
* @llm-rule WHEN: Setting up job handlers for background processing
|
|
94
|
+
* @llm-rule AVOID: Multiple processors for same job type - causes conflicts
|
|
95
|
+
*/
|
|
96
|
+
process(jobType, handler) {
|
|
97
|
+
this.validateJobType(jobType);
|
|
98
|
+
this.validateHandler(handler);
|
|
99
|
+
// Wrap handler with error handling and retry logic
|
|
100
|
+
const wrappedHandler = this.wrapHandler(handler);
|
|
101
|
+
try {
|
|
102
|
+
this.transport.process(jobType, wrappedHandler);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw new Error(`Failed to register processor for ${jobType}: ${error.message}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Schedule job for future execution
|
|
110
|
+
* @llm-rule WHEN: Need to delay job execution (reminders, notifications, etc.)
|
|
111
|
+
* @llm-rule AVOID: Using setTimeout - this persists across app restarts
|
|
112
|
+
*/
|
|
113
|
+
async schedule(jobType, data, delay) {
|
|
114
|
+
this.validateJobType(jobType);
|
|
115
|
+
this.validateJobData(data);
|
|
116
|
+
this.validateDelay(delay);
|
|
117
|
+
const jobId = randomUUID();
|
|
118
|
+
try {
|
|
119
|
+
await this.transport.schedule(jobId, jobType, data, delay);
|
|
120
|
+
return jobId;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
throw new Error(`Failed to schedule job: ${error.message}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Pause queue processing
|
|
128
|
+
* @llm-rule WHEN: Maintenance mode or controlled shutdown
|
|
129
|
+
* @llm-rule AVOID: Pausing without resume plan - jobs will accumulate
|
|
130
|
+
*/
|
|
131
|
+
async pause(jobType) {
|
|
132
|
+
try {
|
|
133
|
+
await this.transport.pause(jobType);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
throw new Error(`Failed to pause queue: ${error.message}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Resume queue processing
|
|
141
|
+
* @llm-rule WHEN: Resuming after maintenance or pause
|
|
142
|
+
* @llm-rule AVOID: Resuming without checking system health
|
|
143
|
+
*/
|
|
144
|
+
async resume(jobType) {
|
|
145
|
+
try {
|
|
146
|
+
await this.transport.resume(jobType);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw new Error(`Failed to resume queue: ${error.message}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get queue statistics for monitoring
|
|
154
|
+
* @llm-rule WHEN: Health checks, monitoring dashboards, debugging
|
|
155
|
+
* @llm-rule AVOID: Frequent polling - can be expensive for some transports
|
|
156
|
+
*/
|
|
157
|
+
async getStats(jobType) {
|
|
158
|
+
try {
|
|
159
|
+
return await this.transport.getStats(jobType);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
throw new Error(`Failed to get stats: ${error.message}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get jobs by status for debugging and monitoring
|
|
167
|
+
* @llm-rule WHEN: Debugging failed jobs or monitoring queue health
|
|
168
|
+
* @llm-rule AVOID: Getting large result sets - use pagination for big queues
|
|
169
|
+
*/
|
|
170
|
+
async getJobs(status, jobType) {
|
|
171
|
+
try {
|
|
172
|
+
return await this.transport.getJobs(status, jobType);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
throw new Error(`Failed to get jobs: ${error.message}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Retry failed job by ID
|
|
180
|
+
* @llm-rule WHEN: Manual retry of failed jobs from admin interface
|
|
181
|
+
* @llm-rule AVOID: Retrying jobs that failed due to code errors without fixing code
|
|
182
|
+
*/
|
|
183
|
+
async retry(jobId) {
|
|
184
|
+
this.validateJobId(jobId);
|
|
185
|
+
try {
|
|
186
|
+
await this.transport.retry(jobId);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
throw new Error(`Failed to retry job ${jobId}: ${error.message}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Remove job from queue
|
|
194
|
+
* @llm-rule WHEN: Canceling scheduled jobs or cleaning up specific jobs
|
|
195
|
+
* @llm-rule AVOID: Removing active jobs - let them complete naturally
|
|
196
|
+
*/
|
|
197
|
+
async remove(jobId) {
|
|
198
|
+
this.validateJobId(jobId);
|
|
199
|
+
try {
|
|
200
|
+
await this.transport.remove(jobId);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
throw new Error(`Failed to remove job ${jobId}: ${error.message}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Clean old jobs by status
|
|
208
|
+
* @llm-rule WHEN: Periodic cleanup to prevent queue storage growth
|
|
209
|
+
* @llm-rule AVOID: Aggressive cleanup - keep some completed jobs for debugging
|
|
210
|
+
*/
|
|
211
|
+
async clean(status, grace = 24 * 60 * 60 * 1000) {
|
|
212
|
+
try {
|
|
213
|
+
await this.transport.clean(status, grace);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
throw new Error(`Failed to clean ${status} jobs: ${error.message}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Gracefully close queue and cleanup resources
|
|
221
|
+
* @llm-rule WHEN: App shutdown or testing cleanup
|
|
222
|
+
* @llm-rule AVOID: Abrupt shutdown - can cause job loss
|
|
223
|
+
*/
|
|
224
|
+
async close() {
|
|
225
|
+
if (this.isClosing) {
|
|
226
|
+
return; // Already closing
|
|
227
|
+
}
|
|
228
|
+
this.isClosing = true;
|
|
229
|
+
try {
|
|
230
|
+
// Pause processing first
|
|
231
|
+
await this.transport.pause();
|
|
232
|
+
// Wait for current jobs to complete (with timeout)
|
|
233
|
+
await this.waitForActiveJobs();
|
|
234
|
+
// Close transport
|
|
235
|
+
await this.transport.close();
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
console.error('Error during graceful shutdown:', error.message);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Get active transport type for debugging
|
|
243
|
+
* @llm-rule WHEN: Debugging transport selection or health checks
|
|
244
|
+
* @llm-rule AVOID: Using for business logic - transport is implementation detail
|
|
245
|
+
*/
|
|
246
|
+
getActiveTransport() {
|
|
247
|
+
return this.transportType;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Check if specific transport is active
|
|
251
|
+
* @llm-rule WHEN: Feature detection based on transport capabilities
|
|
252
|
+
* @llm-rule AVOID: Complex transport-specific logic - keep handlers generic
|
|
253
|
+
*/
|
|
254
|
+
hasTransport(name) {
|
|
255
|
+
return this.transportType === name;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get current configuration for debugging
|
|
259
|
+
* @llm-rule WHEN: Debugging configuration or health checks
|
|
260
|
+
* @llm-rule AVOID: Using for runtime decisions - config is set at startup
|
|
261
|
+
*/
|
|
262
|
+
getConfig() {
|
|
263
|
+
return this.config;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get health status of queue system
|
|
267
|
+
* @llm-rule WHEN: Health checks or monitoring
|
|
268
|
+
* @llm-rule AVOID: Frequent health checks - can impact performance
|
|
269
|
+
*/
|
|
270
|
+
getHealth() {
|
|
271
|
+
try {
|
|
272
|
+
const transportHealth = this.transport.getHealth();
|
|
273
|
+
return {
|
|
274
|
+
...transportHealth,
|
|
275
|
+
transport: this.transportType,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
return {
|
|
280
|
+
status: 'unhealthy',
|
|
281
|
+
transport: this.transportType,
|
|
282
|
+
message: `Health check failed: ${error.message}`,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// ============================================================================
|
|
287
|
+
// PRIVATE HELPER METHODS
|
|
288
|
+
// ============================================================================
|
|
289
|
+
/**
|
|
290
|
+
* Wrap job handler with error handling and retry logic
|
|
291
|
+
*/
|
|
292
|
+
wrapHandler(handler) {
|
|
293
|
+
return async (data) => {
|
|
294
|
+
try {
|
|
295
|
+
const result = await handler(data);
|
|
296
|
+
return result;
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
// Re-throw error for transport to handle retry logic
|
|
300
|
+
throw error;
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Wait for active jobs to complete with timeout
|
|
306
|
+
*/
|
|
307
|
+
async waitForActiveJobs() {
|
|
308
|
+
const timeout = this.config.worker.gracefulShutdownTimeout;
|
|
309
|
+
const startTime = Date.now();
|
|
310
|
+
while (Date.now() - startTime < timeout) {
|
|
311
|
+
try {
|
|
312
|
+
const stats = await this.transport.getStats();
|
|
313
|
+
if (stats.active === 0) {
|
|
314
|
+
return; // No active jobs
|
|
315
|
+
}
|
|
316
|
+
// Wait a bit before checking again
|
|
317
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
// If we can't check stats, just wait the timeout
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
console.warn(`Graceful shutdown timeout (${timeout}ms) exceeded, forcing close`);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Setup graceful shutdown handlers
|
|
328
|
+
*/
|
|
329
|
+
setupGracefulShutdown() {
|
|
330
|
+
const handleShutdown = async (signal) => {
|
|
331
|
+
console.log(`Received ${signal}, starting graceful shutdown...`);
|
|
332
|
+
await this.close();
|
|
333
|
+
process.exit(0);
|
|
334
|
+
};
|
|
335
|
+
process.once('SIGTERM', () => handleShutdown('SIGTERM'));
|
|
336
|
+
process.once('SIGINT', () => handleShutdown('SIGINT'));
|
|
337
|
+
}
|
|
338
|
+
// ============================================================================
|
|
339
|
+
// VALIDATION METHODS
|
|
340
|
+
// ============================================================================
|
|
341
|
+
validateJobType(jobType) {
|
|
342
|
+
if (!jobType || typeof jobType !== 'string') {
|
|
343
|
+
throw new Error('Job type must be a non-empty string');
|
|
344
|
+
}
|
|
345
|
+
if (jobType.length > 100) {
|
|
346
|
+
throw new Error('Job type must be 100 characters or less');
|
|
347
|
+
}
|
|
348
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(jobType)) {
|
|
349
|
+
throw new Error('Job type can only contain letters, numbers, underscores, and hyphens');
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
validateJobData(data) {
|
|
353
|
+
if (data === null || data === undefined) {
|
|
354
|
+
throw new Error('Job data cannot be null or undefined');
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
JSON.stringify(data);
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
throw new Error('Job data must be JSON serializable');
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
validateHandler(handler) {
|
|
364
|
+
if (typeof handler !== 'function') {
|
|
365
|
+
throw new Error('Job handler must be a function');
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
validateDelay(delay) {
|
|
369
|
+
if (typeof delay !== 'number' || delay < 0) {
|
|
370
|
+
throw new Error('Delay must be a positive number (milliseconds)');
|
|
371
|
+
}
|
|
372
|
+
if (delay > 365 * 24 * 60 * 60 * 1000) {
|
|
373
|
+
throw new Error('Delay cannot exceed 1 year');
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
validateJobId(jobId) {
|
|
377
|
+
if (!jobId || typeof jobId !== 'string') {
|
|
378
|
+
throw new Error('Job ID must be a non-empty string');
|
|
379
|
+
}
|
|
380
|
+
// Validate UUID format
|
|
381
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
382
|
+
if (!uuidRegex.test(jobId)) {
|
|
383
|
+
throw new Error('Job ID must be a valid UUID');
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/queue/queue.ts"],"names":[],"mappings":"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"}
|