@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.
Files changed (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +902 -0
  3. package/bin/appkit.js +71 -0
  4. package/bin/commands/generate.js +1050 -0
  5. package/bin/templates/backend/README.md.template +39 -0
  6. package/bin/templates/backend/api.http.template +0 -0
  7. package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
  8. package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
  9. package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
  10. package/bin/templates/backend/package.json.template +34 -0
  11. package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
  12. package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
  13. package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
  14. package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
  15. package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
  16. package/bin/templates/backend/src/api/server.ts.template +188 -0
  17. package/bin/templates/backend/tsconfig.api.json.template +24 -0
  18. package/bin/templates/backend/tsconfig.json.template +40 -0
  19. package/bin/templates/feature/feature.http.template +63 -0
  20. package/bin/templates/feature/feature.route.ts.template +36 -0
  21. package/bin/templates/feature/feature.service.ts.template +81 -0
  22. package/bin/templates/feature/feature.types.ts.template +23 -0
  23. package/bin/templates/feature-db/feature.http.template +63 -0
  24. package/bin/templates/feature-db/feature.model.ts.template +74 -0
  25. package/bin/templates/feature-db/feature.route.ts.template +58 -0
  26. package/bin/templates/feature-db/feature.service.ts.template +231 -0
  27. package/bin/templates/feature-db/feature.types.ts.template +25 -0
  28. package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
  29. package/bin/templates/feature-db/seeding/README.md.template +57 -0
  30. package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
  31. package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
  32. package/bin/templates/feature-user/user.http.template +157 -0
  33. package/bin/templates/feature-user/user.model.ts.template +244 -0
  34. package/bin/templates/feature-user/user.route.ts.template +379 -0
  35. package/bin/templates/feature-user/user.seed.js.template +182 -0
  36. package/bin/templates/feature-user/user.service.ts.template +426 -0
  37. package/bin/templates/feature-user/user.types.ts.template +127 -0
  38. package/dist/auth/auth.d.ts +182 -0
  39. package/dist/auth/auth.d.ts.map +1 -0
  40. package/dist/auth/auth.js +477 -0
  41. package/dist/auth/auth.js.map +1 -0
  42. package/dist/auth/defaults.d.ts +104 -0
  43. package/dist/auth/defaults.d.ts.map +1 -0
  44. package/dist/auth/defaults.js +374 -0
  45. package/dist/auth/defaults.js.map +1 -0
  46. package/dist/auth/index.d.ts +70 -0
  47. package/dist/auth/index.d.ts.map +1 -0
  48. package/dist/auth/index.js +94 -0
  49. package/dist/auth/index.js.map +1 -0
  50. package/dist/cache/cache.d.ts +118 -0
  51. package/dist/cache/cache.d.ts.map +1 -0
  52. package/dist/cache/cache.js +249 -0
  53. package/dist/cache/cache.js.map +1 -0
  54. package/dist/cache/defaults.d.ts +63 -0
  55. package/dist/cache/defaults.d.ts.map +1 -0
  56. package/dist/cache/defaults.js +193 -0
  57. package/dist/cache/defaults.js.map +1 -0
  58. package/dist/cache/index.d.ts +101 -0
  59. package/dist/cache/index.d.ts.map +1 -0
  60. package/dist/cache/index.js +203 -0
  61. package/dist/cache/index.js.map +1 -0
  62. package/dist/cache/strategies/memory.d.ts +138 -0
  63. package/dist/cache/strategies/memory.d.ts.map +1 -0
  64. package/dist/cache/strategies/memory.js +348 -0
  65. package/dist/cache/strategies/memory.js.map +1 -0
  66. package/dist/cache/strategies/redis.d.ts +105 -0
  67. package/dist/cache/strategies/redis.d.ts.map +1 -0
  68. package/dist/cache/strategies/redis.js +318 -0
  69. package/dist/cache/strategies/redis.js.map +1 -0
  70. package/dist/config/config.d.ts +62 -0
  71. package/dist/config/config.d.ts.map +1 -0
  72. package/dist/config/config.js +107 -0
  73. package/dist/config/config.js.map +1 -0
  74. package/dist/config/defaults.d.ts +44 -0
  75. package/dist/config/defaults.d.ts.map +1 -0
  76. package/dist/config/defaults.js +217 -0
  77. package/dist/config/defaults.js.map +1 -0
  78. package/dist/config/index.d.ts +105 -0
  79. package/dist/config/index.d.ts.map +1 -0
  80. package/dist/config/index.js +163 -0
  81. package/dist/config/index.js.map +1 -0
  82. package/dist/database/adapters/mongoose.d.ts +106 -0
  83. package/dist/database/adapters/mongoose.d.ts.map +1 -0
  84. package/dist/database/adapters/mongoose.js +480 -0
  85. package/dist/database/adapters/mongoose.js.map +1 -0
  86. package/dist/database/adapters/prisma.d.ts +106 -0
  87. package/dist/database/adapters/prisma.d.ts.map +1 -0
  88. package/dist/database/adapters/prisma.js +494 -0
  89. package/dist/database/adapters/prisma.js.map +1 -0
  90. package/dist/database/defaults.d.ts +87 -0
  91. package/dist/database/defaults.d.ts.map +1 -0
  92. package/dist/database/defaults.js +271 -0
  93. package/dist/database/defaults.js.map +1 -0
  94. package/dist/database/index.d.ts +137 -0
  95. package/dist/database/index.d.ts.map +1 -0
  96. package/dist/database/index.js +490 -0
  97. package/dist/database/index.js.map +1 -0
  98. package/dist/email/defaults.d.ts +100 -0
  99. package/dist/email/defaults.d.ts.map +1 -0
  100. package/dist/email/defaults.js +400 -0
  101. package/dist/email/defaults.js.map +1 -0
  102. package/dist/email/email.d.ts +139 -0
  103. package/dist/email/email.d.ts.map +1 -0
  104. package/dist/email/email.js +316 -0
  105. package/dist/email/email.js.map +1 -0
  106. package/dist/email/index.d.ts +176 -0
  107. package/dist/email/index.d.ts.map +1 -0
  108. package/dist/email/index.js +251 -0
  109. package/dist/email/index.js.map +1 -0
  110. package/dist/email/strategies/console.d.ts +90 -0
  111. package/dist/email/strategies/console.d.ts.map +1 -0
  112. package/dist/email/strategies/console.js +268 -0
  113. package/dist/email/strategies/console.js.map +1 -0
  114. package/dist/email/strategies/resend.d.ts +84 -0
  115. package/dist/email/strategies/resend.d.ts.map +1 -0
  116. package/dist/email/strategies/resend.js +266 -0
  117. package/dist/email/strategies/resend.js.map +1 -0
  118. package/dist/email/strategies/smtp.d.ts +77 -0
  119. package/dist/email/strategies/smtp.d.ts.map +1 -0
  120. package/dist/email/strategies/smtp.js +286 -0
  121. package/dist/email/strategies/smtp.js.map +1 -0
  122. package/dist/error/defaults.d.ts +40 -0
  123. package/dist/error/defaults.d.ts.map +1 -0
  124. package/dist/error/defaults.js +75 -0
  125. package/dist/error/defaults.js.map +1 -0
  126. package/dist/error/error.d.ts +140 -0
  127. package/dist/error/error.d.ts.map +1 -0
  128. package/dist/error/error.js +200 -0
  129. package/dist/error/error.js.map +1 -0
  130. package/dist/error/index.d.ts +145 -0
  131. package/dist/error/index.d.ts.map +1 -0
  132. package/dist/error/index.js +145 -0
  133. package/dist/error/index.js.map +1 -0
  134. package/dist/event/defaults.d.ts +111 -0
  135. package/dist/event/defaults.d.ts.map +1 -0
  136. package/dist/event/defaults.js +378 -0
  137. package/dist/event/defaults.js.map +1 -0
  138. package/dist/event/event.d.ts +171 -0
  139. package/dist/event/event.d.ts.map +1 -0
  140. package/dist/event/event.js +391 -0
  141. package/dist/event/event.js.map +1 -0
  142. package/dist/event/index.d.ts +173 -0
  143. package/dist/event/index.d.ts.map +1 -0
  144. package/dist/event/index.js +302 -0
  145. package/dist/event/index.js.map +1 -0
  146. package/dist/event/strategies/memory.d.ts +122 -0
  147. package/dist/event/strategies/memory.d.ts.map +1 -0
  148. package/dist/event/strategies/memory.js +331 -0
  149. package/dist/event/strategies/memory.js.map +1 -0
  150. package/dist/event/strategies/redis.d.ts +115 -0
  151. package/dist/event/strategies/redis.d.ts.map +1 -0
  152. package/dist/event/strategies/redis.js +434 -0
  153. package/dist/event/strategies/redis.js.map +1 -0
  154. package/dist/index.d.ts +58 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +72 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/logger/defaults.d.ts +67 -0
  159. package/dist/logger/defaults.d.ts.map +1 -0
  160. package/dist/logger/defaults.js +213 -0
  161. package/dist/logger/defaults.js.map +1 -0
  162. package/dist/logger/index.d.ts +84 -0
  163. package/dist/logger/index.d.ts.map +1 -0
  164. package/dist/logger/index.js +101 -0
  165. package/dist/logger/index.js.map +1 -0
  166. package/dist/logger/logger.d.ts +165 -0
  167. package/dist/logger/logger.d.ts.map +1 -0
  168. package/dist/logger/logger.js +843 -0
  169. package/dist/logger/logger.js.map +1 -0
  170. package/dist/logger/transports/console.d.ts +102 -0
  171. package/dist/logger/transports/console.d.ts.map +1 -0
  172. package/dist/logger/transports/console.js +276 -0
  173. package/dist/logger/transports/console.js.map +1 -0
  174. package/dist/logger/transports/database.d.ts +153 -0
  175. package/dist/logger/transports/database.d.ts.map +1 -0
  176. package/dist/logger/transports/database.js +539 -0
  177. package/dist/logger/transports/database.js.map +1 -0
  178. package/dist/logger/transports/file.d.ts +146 -0
  179. package/dist/logger/transports/file.d.ts.map +1 -0
  180. package/dist/logger/transports/file.js +464 -0
  181. package/dist/logger/transports/file.js.map +1 -0
  182. package/dist/logger/transports/http.d.ts +128 -0
  183. package/dist/logger/transports/http.d.ts.map +1 -0
  184. package/dist/logger/transports/http.js +401 -0
  185. package/dist/logger/transports/http.js.map +1 -0
  186. package/dist/logger/transports/webhook.d.ts +152 -0
  187. package/dist/logger/transports/webhook.d.ts.map +1 -0
  188. package/dist/logger/transports/webhook.js +485 -0
  189. package/dist/logger/transports/webhook.js.map +1 -0
  190. package/dist/queue/defaults.d.ts +66 -0
  191. package/dist/queue/defaults.d.ts.map +1 -0
  192. package/dist/queue/defaults.js +205 -0
  193. package/dist/queue/defaults.js.map +1 -0
  194. package/dist/queue/index.d.ts +124 -0
  195. package/dist/queue/index.d.ts.map +1 -0
  196. package/dist/queue/index.js +116 -0
  197. package/dist/queue/index.js.map +1 -0
  198. package/dist/queue/queue.d.ts +156 -0
  199. package/dist/queue/queue.d.ts.map +1 -0
  200. package/dist/queue/queue.js +387 -0
  201. package/dist/queue/queue.js.map +1 -0
  202. package/dist/queue/transports/database.d.ts +165 -0
  203. package/dist/queue/transports/database.d.ts.map +1 -0
  204. package/dist/queue/transports/database.js +595 -0
  205. package/dist/queue/transports/database.js.map +1 -0
  206. package/dist/queue/transports/memory.d.ts +143 -0
  207. package/dist/queue/transports/memory.d.ts.map +1 -0
  208. package/dist/queue/transports/memory.js +415 -0
  209. package/dist/queue/transports/memory.js.map +1 -0
  210. package/dist/queue/transports/redis.d.ts +203 -0
  211. package/dist/queue/transports/redis.d.ts.map +1 -0
  212. package/dist/queue/transports/redis.js +744 -0
  213. package/dist/queue/transports/redis.js.map +1 -0
  214. package/dist/security/defaults.d.ts +64 -0
  215. package/dist/security/defaults.d.ts.map +1 -0
  216. package/dist/security/defaults.js +159 -0
  217. package/dist/security/defaults.js.map +1 -0
  218. package/dist/security/index.d.ts +110 -0
  219. package/dist/security/index.d.ts.map +1 -0
  220. package/dist/security/index.js +160 -0
  221. package/dist/security/index.js.map +1 -0
  222. package/dist/security/security.d.ts +138 -0
  223. package/dist/security/security.d.ts.map +1 -0
  224. package/dist/security/security.js +419 -0
  225. package/dist/security/security.js.map +1 -0
  226. package/dist/storage/defaults.d.ts +79 -0
  227. package/dist/storage/defaults.d.ts.map +1 -0
  228. package/dist/storage/defaults.js +358 -0
  229. package/dist/storage/defaults.js.map +1 -0
  230. package/dist/storage/index.d.ts +153 -0
  231. package/dist/storage/index.d.ts.map +1 -0
  232. package/dist/storage/index.js +242 -0
  233. package/dist/storage/index.js.map +1 -0
  234. package/dist/storage/storage.d.ts +151 -0
  235. package/dist/storage/storage.d.ts.map +1 -0
  236. package/dist/storage/storage.js +439 -0
  237. package/dist/storage/storage.js.map +1 -0
  238. package/dist/storage/strategies/local.d.ts +117 -0
  239. package/dist/storage/strategies/local.d.ts.map +1 -0
  240. package/dist/storage/strategies/local.js +368 -0
  241. package/dist/storage/strategies/local.js.map +1 -0
  242. package/dist/storage/strategies/r2.d.ts +130 -0
  243. package/dist/storage/strategies/r2.d.ts.map +1 -0
  244. package/dist/storage/strategies/r2.js +470 -0
  245. package/dist/storage/strategies/r2.js.map +1 -0
  246. package/dist/storage/strategies/s3.d.ts +121 -0
  247. package/dist/storage/strategies/s3.d.ts.map +1 -0
  248. package/dist/storage/strategies/s3.js +461 -0
  249. package/dist/storage/strategies/s3.js.map +1 -0
  250. package/dist/util/defaults.d.ts +77 -0
  251. package/dist/util/defaults.d.ts.map +1 -0
  252. package/dist/util/defaults.js +193 -0
  253. package/dist/util/defaults.js.map +1 -0
  254. package/dist/util/index.d.ts +97 -0
  255. package/dist/util/index.d.ts.map +1 -0
  256. package/dist/util/index.js +165 -0
  257. package/dist/util/index.js.map +1 -0
  258. package/dist/util/util.d.ts +145 -0
  259. package/dist/util/util.d.ts.map +1 -0
  260. package/dist/util/util.js +481 -0
  261. package/dist/util/util.js.map +1 -0
  262. 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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"}