@riktajs/queue 0.1.0
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/README.md +476 -0
- package/dist/config/queue.config.d.ts +137 -0
- package/dist/config/queue.config.d.ts.map +1 -0
- package/dist/config/queue.config.js +82 -0
- package/dist/config/queue.config.js.map +1 -0
- package/dist/constants.d.ts +33 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +37 -0
- package/dist/constants.js.map +1 -0
- package/dist/decorators/events.decorator.d.ts +85 -0
- package/dist/decorators/events.decorator.d.ts.map +1 -0
- package/dist/decorators/events.decorator.js +120 -0
- package/dist/decorators/events.decorator.js.map +1 -0
- package/dist/decorators/index.d.ts +8 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +8 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/process.decorator.d.ts +41 -0
- package/dist/decorators/process.decorator.d.ts.map +1 -0
- package/dist/decorators/process.decorator.js +61 -0
- package/dist/decorators/process.decorator.js.map +1 -0
- package/dist/decorators/processor.decorator.d.ts +41 -0
- package/dist/decorators/processor.decorator.d.ts.map +1 -0
- package/dist/decorators/processor.decorator.js +59 -0
- package/dist/decorators/processor.decorator.js.map +1 -0
- package/dist/decorators/queue.decorator.d.ts +35 -0
- package/dist/decorators/queue.decorator.d.ts.map +1 -0
- package/dist/decorators/queue.decorator.js +49 -0
- package/dist/decorators/queue.decorator.js.map +1 -0
- package/dist/events/queue-events.d.ts +32 -0
- package/dist/events/queue-events.d.ts.map +1 -0
- package/dist/events/queue-events.js +103 -0
- package/dist/events/queue-events.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/monitoring/bull-board.d.ts +77 -0
- package/dist/monitoring/bull-board.d.ts.map +1 -0
- package/dist/monitoring/bull-board.js +112 -0
- package/dist/monitoring/bull-board.js.map +1 -0
- package/dist/providers/queue.provider.d.ts +94 -0
- package/dist/providers/queue.provider.d.ts.map +1 -0
- package/dist/providers/queue.provider.js +333 -0
- package/dist/providers/queue.provider.js.map +1 -0
- package/dist/services/queue.service.d.ts +133 -0
- package/dist/services/queue.service.d.ts.map +1 -0
- package/dist/services/queue.service.js +192 -0
- package/dist/services/queue.service.js.map +1 -0
- package/dist/types.d.ts +133 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/connection.d.ts +47 -0
- package/dist/utils/connection.d.ts.map +1 -0
- package/dist/utils/connection.js +104 -0
- package/dist/utils/connection.js.map +1 -0
- package/dist/utils/validation.d.ts +187 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +156 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.service.js","sourceRoot":"","sources":["../../src/services/queue.service.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for @riktajs/queue
|
|
3
|
+
*/
|
|
4
|
+
import type { QueueOptions as BullMQQueueOptions, WorkerOptions as BullMQWorkerOptions, JobsOptions, RepeatOptions } from 'bullmq';
|
|
5
|
+
/** Redis connection configuration */
|
|
6
|
+
export interface RedisConnectionOptions {
|
|
7
|
+
/** Redis host */
|
|
8
|
+
host?: string;
|
|
9
|
+
/** Redis port */
|
|
10
|
+
port?: number;
|
|
11
|
+
/** Redis password */
|
|
12
|
+
password?: string;
|
|
13
|
+
/** Redis username */
|
|
14
|
+
username?: string;
|
|
15
|
+
/** Redis database number */
|
|
16
|
+
db?: number;
|
|
17
|
+
/** Enable TLS */
|
|
18
|
+
tls?: boolean;
|
|
19
|
+
/** Cluster mode configuration */
|
|
20
|
+
cluster?: {
|
|
21
|
+
nodes: Array<{
|
|
22
|
+
host: string;
|
|
23
|
+
port: number;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Options for @Queue decorator */
|
|
28
|
+
export interface QueueDecoratorOptions {
|
|
29
|
+
/** Queue name (required) */
|
|
30
|
+
name: string;
|
|
31
|
+
/** BullMQ queue options */
|
|
32
|
+
options?: Omit<BullMQQueueOptions, 'connection'>;
|
|
33
|
+
/** Default job options */
|
|
34
|
+
defaultJobOptions?: JobsOptions;
|
|
35
|
+
}
|
|
36
|
+
/** Options for @Processor decorator */
|
|
37
|
+
export interface ProcessorOptions {
|
|
38
|
+
/** The queue name to process */
|
|
39
|
+
queueName: string;
|
|
40
|
+
/** Worker concurrency */
|
|
41
|
+
concurrency?: number;
|
|
42
|
+
/** Rate limiter configuration */
|
|
43
|
+
rateLimiter?: {
|
|
44
|
+
/** Maximum jobs per duration */
|
|
45
|
+
max: number;
|
|
46
|
+
/** Duration in milliseconds */
|
|
47
|
+
duration: number;
|
|
48
|
+
};
|
|
49
|
+
/** Additional BullMQ worker options */
|
|
50
|
+
workerOptions?: Omit<BullMQWorkerOptions, 'connection' | 'concurrency' | 'limiter'>;
|
|
51
|
+
}
|
|
52
|
+
/** Metadata for a job handler method */
|
|
53
|
+
export interface JobHandlerMeta {
|
|
54
|
+
/** Job name */
|
|
55
|
+
name: string;
|
|
56
|
+
/** Method name on the processor class */
|
|
57
|
+
methodName: string;
|
|
58
|
+
/** Validation schema (Zod) */
|
|
59
|
+
schema?: unknown;
|
|
60
|
+
}
|
|
61
|
+
/** Queue event names */
|
|
62
|
+
export type QueueEventName = 'job:added' | 'job:completed' | 'job:failed' | 'job:progress' | 'job:stalled' | 'job:delayed' | 'job:removed' | 'worker:ready' | 'worker:closed' | 'worker:error';
|
|
63
|
+
/** Metadata for an event handler method */
|
|
64
|
+
export interface EventHandlerMeta {
|
|
65
|
+
/** Event name */
|
|
66
|
+
event: QueueEventName;
|
|
67
|
+
/** Method name on the processor class */
|
|
68
|
+
methodName: string;
|
|
69
|
+
}
|
|
70
|
+
/** Event payload for queue events */
|
|
71
|
+
export interface QueueEventPayload<TData = unknown, TResult = unknown> {
|
|
72
|
+
/** Queue name */
|
|
73
|
+
queueName: string;
|
|
74
|
+
/** Job ID */
|
|
75
|
+
jobId: string;
|
|
76
|
+
/** Job name */
|
|
77
|
+
jobName: string;
|
|
78
|
+
/** Job data */
|
|
79
|
+
data: TData;
|
|
80
|
+
/** Job return value (for completed events) */
|
|
81
|
+
returnValue?: TResult;
|
|
82
|
+
/** Number of attempts made */
|
|
83
|
+
attemptsMade?: number;
|
|
84
|
+
/** Error message (for failed events) */
|
|
85
|
+
error?: string;
|
|
86
|
+
/** Progress value (for progress events) */
|
|
87
|
+
progress?: number | object;
|
|
88
|
+
/** Timestamp */
|
|
89
|
+
timestamp: number;
|
|
90
|
+
}
|
|
91
|
+
/** Options for adding a job */
|
|
92
|
+
export interface AddJobOptions extends JobsOptions {
|
|
93
|
+
/** Deduplicate by this key */
|
|
94
|
+
deduplicationKey?: string;
|
|
95
|
+
}
|
|
96
|
+
/** Repeat options for scheduled jobs */
|
|
97
|
+
export interface ScheduleOptions extends RepeatOptions {
|
|
98
|
+
/** Job ID for the repeatable job */
|
|
99
|
+
jobId?: string;
|
|
100
|
+
}
|
|
101
|
+
/** Queue configuration from environment/config */
|
|
102
|
+
export interface QueueConfig {
|
|
103
|
+
/** Redis connection options */
|
|
104
|
+
redis: RedisConnectionOptions;
|
|
105
|
+
/** Default worker concurrency */
|
|
106
|
+
defaultConcurrency?: number;
|
|
107
|
+
/** Default rate limiter */
|
|
108
|
+
defaultRateLimiter?: {
|
|
109
|
+
max: number;
|
|
110
|
+
duration: number;
|
|
111
|
+
};
|
|
112
|
+
/** Bull Board dashboard path */
|
|
113
|
+
dashboardPath?: string;
|
|
114
|
+
/** Enable dashboard (default: false in production) */
|
|
115
|
+
dashboardEnabled?: boolean;
|
|
116
|
+
/** Graceful shutdown timeout in ms */
|
|
117
|
+
shutdownTimeout?: number;
|
|
118
|
+
}
|
|
119
|
+
/** Provider options for creating QueueProvider */
|
|
120
|
+
export interface QueueProviderOptions {
|
|
121
|
+
/** Queue configuration */
|
|
122
|
+
config?: Partial<QueueConfig>;
|
|
123
|
+
/** Auto-initialize on provider init */
|
|
124
|
+
autoInitialize?: boolean;
|
|
125
|
+
/** Retry connection attempts */
|
|
126
|
+
retryAttempts?: number;
|
|
127
|
+
/** Delay between retries in ms */
|
|
128
|
+
retryDelay?: number;
|
|
129
|
+
}
|
|
130
|
+
/** Re-export useful BullMQ types */
|
|
131
|
+
export type { Job, Queue as BullQueue, Worker, QueueEvents } from 'bullmq';
|
|
132
|
+
export type { Redis } from 'ioredis';
|
|
133
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis connection utilities
|
|
3
|
+
*/
|
|
4
|
+
import type { RedisConnectionOptions } from '../types.js';
|
|
5
|
+
import type { Redis, Cluster } from 'ioredis';
|
|
6
|
+
/**
|
|
7
|
+
* Create a Redis client based on configuration
|
|
8
|
+
* @param config - Redis connection options
|
|
9
|
+
*/
|
|
10
|
+
export declare function createRedisClient(config: RedisConnectionOptions): Redis | Cluster;
|
|
11
|
+
/**
|
|
12
|
+
* Error thrown when Redis connection fails
|
|
13
|
+
*/
|
|
14
|
+
export declare class QueueConnectionError extends Error {
|
|
15
|
+
readonly host?: string | undefined;
|
|
16
|
+
readonly port?: number | undefined;
|
|
17
|
+
readonly cause?: Error | undefined;
|
|
18
|
+
constructor(message: string, host?: string | undefined, port?: number | undefined, cause?: Error | undefined);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Manages a shared Redis connection for all queues
|
|
22
|
+
*/
|
|
23
|
+
export declare class RedisConnectionManager {
|
|
24
|
+
private client;
|
|
25
|
+
private config;
|
|
26
|
+
/**
|
|
27
|
+
* Initialize the connection manager with configuration
|
|
28
|
+
*/
|
|
29
|
+
configure(config: RedisConnectionOptions): this;
|
|
30
|
+
/**
|
|
31
|
+
* Get or create the Redis client
|
|
32
|
+
*/
|
|
33
|
+
getClient(): Redis | Cluster;
|
|
34
|
+
/**
|
|
35
|
+
* Check if client is connected
|
|
36
|
+
*/
|
|
37
|
+
isConnected(): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Close the Redis connection
|
|
40
|
+
*/
|
|
41
|
+
close(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Disconnect immediately (force)
|
|
44
|
+
*/
|
|
45
|
+
disconnect(): void;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,KAAK,GAAG,OAAO,CAyBjF;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAG3B,IAAI,CAAC,EAAE,MAAM;aACb,IAAI,CAAC,EAAE,MAAM;aACb,KAAK,CAAC,EAAE,KAAK;gBAH7B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,MAAM,CAAuC;IAErD;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAK/C;;OAEG;IACH,SAAS,IAAI,KAAK,GAAG,OAAO;IAqB5B;;OAEG;IACH,WAAW,IAAI,OAAO;IAKtB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACH,UAAU,IAAI,IAAI;CAMnB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis connection utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Create a Redis client based on configuration
|
|
6
|
+
* @param config - Redis connection options
|
|
7
|
+
*/
|
|
8
|
+
export function createRedisClient(config) {
|
|
9
|
+
// Dynamic import to avoid bundling issues
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
11
|
+
const IORedis = require('ioredis').default || require('ioredis');
|
|
12
|
+
if (config.cluster?.nodes) {
|
|
13
|
+
// Cluster mode
|
|
14
|
+
return new IORedis.Cluster(config.cluster.nodes, {
|
|
15
|
+
redisOptions: {
|
|
16
|
+
password: config.password,
|
|
17
|
+
username: config.username,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
// Single node mode
|
|
22
|
+
return new IORedis({
|
|
23
|
+
host: config.host || 'localhost',
|
|
24
|
+
port: config.port || 6379,
|
|
25
|
+
password: config.password,
|
|
26
|
+
username: config.username,
|
|
27
|
+
db: config.db || 0,
|
|
28
|
+
maxRetriesPerRequest: null, // Required for BullMQ
|
|
29
|
+
enableReadyCheck: false,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Error thrown when Redis connection fails
|
|
34
|
+
*/
|
|
35
|
+
export class QueueConnectionError extends Error {
|
|
36
|
+
host;
|
|
37
|
+
port;
|
|
38
|
+
cause;
|
|
39
|
+
constructor(message, host, port, cause) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.host = host;
|
|
42
|
+
this.port = port;
|
|
43
|
+
this.cause = cause;
|
|
44
|
+
this.name = 'QueueConnectionError';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Manages a shared Redis connection for all queues
|
|
49
|
+
*/
|
|
50
|
+
export class RedisConnectionManager {
|
|
51
|
+
client = null;
|
|
52
|
+
config = null;
|
|
53
|
+
/**
|
|
54
|
+
* Initialize the connection manager with configuration
|
|
55
|
+
*/
|
|
56
|
+
configure(config) {
|
|
57
|
+
this.config = config;
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get or create the Redis client
|
|
62
|
+
*/
|
|
63
|
+
getClient() {
|
|
64
|
+
if (!this.client) {
|
|
65
|
+
if (!this.config) {
|
|
66
|
+
throw new QueueConnectionError('Redis connection not configured');
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
this.client = createRedisClient(this.config);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw new QueueConnectionError(`Failed to create Redis connection: ${error.message}`, this.config.host, this.config.port, error);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return this.client;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if client is connected
|
|
79
|
+
*/
|
|
80
|
+
isConnected() {
|
|
81
|
+
if (!this.client)
|
|
82
|
+
return false;
|
|
83
|
+
return this.client.status === 'ready';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Close the Redis connection
|
|
87
|
+
*/
|
|
88
|
+
async close() {
|
|
89
|
+
if (this.client) {
|
|
90
|
+
await this.client.quit();
|
|
91
|
+
this.client = null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Disconnect immediately (force)
|
|
96
|
+
*/
|
|
97
|
+
disconnect() {
|
|
98
|
+
if (this.client) {
|
|
99
|
+
this.client.disconnect();
|
|
100
|
+
this.client = null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA8B;IAC9D,0CAA0C;IAC1C,iEAAiE;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAEjE,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1B,eAAe;QACf,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;YAC/C,YAAY,EAAE;gBACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;SACF,CAAY,CAAC;IAChB,CAAC;IAED,mBAAmB;IACnB,OAAO,IAAI,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,WAAW;QAChC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC;QAClB,oBAAoB,EAAE,IAAI,EAAE,sBAAsB;QAClD,gBAAgB,EAAE,KAAK;KACxB,CAAU,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAG3B;IACA;IACA;IAJlB,YACE,OAAe,EACC,IAAa,EACb,IAAa,EACb,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAS;QACb,SAAI,GAAJ,IAAI,CAAS;QACb,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAsB;IACzB,MAAM,GAA2B,IAAI,CAAC;IACtC,MAAM,GAAkC,IAAI,CAAC;IAErD;;OAEG;IACH,SAAS,CAAC,MAA8B;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,IAAI,oBAAoB,CAAC,iCAAiC,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,oBAAoB,CAC5B,sCAAuC,KAAe,CAAC,OAAO,EAAE,EAChE,IAAI,CAAC,MAAM,CAAC,IAAI,EAChB,IAAI,CAAC,MAAM,CAAC,IAAI,EAChB,KAAc,CACf,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod validation utilities for job payloads
|
|
3
|
+
*/
|
|
4
|
+
import { z, type ZodSchema, type ZodError } from 'zod';
|
|
5
|
+
/**
|
|
6
|
+
* Creates a wrapper around a Zod schema for job validation
|
|
7
|
+
*
|
|
8
|
+
* @param schema - The Zod schema to use for validation
|
|
9
|
+
* @returns A wrapped schema with job-specific utilities
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const EmailJobSchema = createJobSchema(z.object({
|
|
14
|
+
* to: z.string().email(),
|
|
15
|
+
* subject: z.string().min(1),
|
|
16
|
+
* body: z.string(),
|
|
17
|
+
* }));
|
|
18
|
+
*
|
|
19
|
+
* // Validate job data
|
|
20
|
+
* const result = EmailJobSchema.validate({ to: 'test@example.com', subject: 'Hello', body: 'World' });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function createJobSchema<T>(schema: ZodSchema<T>): JobSchema<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Wrapper class for Zod schemas with job-specific utilities
|
|
26
|
+
*/
|
|
27
|
+
export declare class JobSchema<T> {
|
|
28
|
+
private readonly schema;
|
|
29
|
+
constructor(schema: ZodSchema<T>);
|
|
30
|
+
/**
|
|
31
|
+
* Get the underlying Zod schema
|
|
32
|
+
*/
|
|
33
|
+
getSchema(): ZodSchema<T>;
|
|
34
|
+
/**
|
|
35
|
+
* Validate job data
|
|
36
|
+
* @throws JobValidationError if validation fails
|
|
37
|
+
*/
|
|
38
|
+
validate(data: unknown): T;
|
|
39
|
+
/**
|
|
40
|
+
* Validate job data, returning undefined on failure
|
|
41
|
+
*/
|
|
42
|
+
validateSafe(data: unknown): T | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Check if data is valid without throwing
|
|
45
|
+
*/
|
|
46
|
+
isValid(data: unknown): data is T;
|
|
47
|
+
/**
|
|
48
|
+
* Get validation errors for data
|
|
49
|
+
*/
|
|
50
|
+
getErrors(data: unknown): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Parse and transform data with defaults
|
|
53
|
+
*/
|
|
54
|
+
parse(data: unknown): T;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Error thrown when job schema validation fails
|
|
58
|
+
*/
|
|
59
|
+
export declare class JobSchemaValidationError extends Error {
|
|
60
|
+
readonly zodError: ZodError;
|
|
61
|
+
constructor(message: string, zodError: ZodError);
|
|
62
|
+
/**
|
|
63
|
+
* Get formatted validation errors
|
|
64
|
+
*/
|
|
65
|
+
getErrors(): Array<{
|
|
66
|
+
path: string;
|
|
67
|
+
message: string;
|
|
68
|
+
}>;
|
|
69
|
+
}
|
|
70
|
+
export { z };
|
|
71
|
+
/**
|
|
72
|
+
* Common job schemas for typical use cases
|
|
73
|
+
*/
|
|
74
|
+
export declare const CommonJobSchemas: {
|
|
75
|
+
/**
|
|
76
|
+
* Email job schema
|
|
77
|
+
*/
|
|
78
|
+
email: z.ZodObject<{
|
|
79
|
+
to: z.ZodString;
|
|
80
|
+
cc: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
81
|
+
bcc: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
82
|
+
subject: z.ZodString;
|
|
83
|
+
body: z.ZodString;
|
|
84
|
+
html: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
85
|
+
attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
86
|
+
filename: z.ZodString;
|
|
87
|
+
content: z.ZodString;
|
|
88
|
+
contentType: z.ZodOptional<z.ZodString>;
|
|
89
|
+
}, "strip", z.ZodTypeAny, {
|
|
90
|
+
filename: string;
|
|
91
|
+
content: string;
|
|
92
|
+
contentType?: string | undefined;
|
|
93
|
+
}, {
|
|
94
|
+
filename: string;
|
|
95
|
+
content: string;
|
|
96
|
+
contentType?: string | undefined;
|
|
97
|
+
}>, "many">>;
|
|
98
|
+
}, "strip", z.ZodTypeAny, {
|
|
99
|
+
body: string;
|
|
100
|
+
to: string;
|
|
101
|
+
subject: string;
|
|
102
|
+
html: boolean;
|
|
103
|
+
cc?: string[] | undefined;
|
|
104
|
+
bcc?: string[] | undefined;
|
|
105
|
+
attachments?: {
|
|
106
|
+
filename: string;
|
|
107
|
+
content: string;
|
|
108
|
+
contentType?: string | undefined;
|
|
109
|
+
}[] | undefined;
|
|
110
|
+
}, {
|
|
111
|
+
body: string;
|
|
112
|
+
to: string;
|
|
113
|
+
subject: string;
|
|
114
|
+
cc?: string[] | undefined;
|
|
115
|
+
bcc?: string[] | undefined;
|
|
116
|
+
html?: boolean | undefined;
|
|
117
|
+
attachments?: {
|
|
118
|
+
filename: string;
|
|
119
|
+
content: string;
|
|
120
|
+
contentType?: string | undefined;
|
|
121
|
+
}[] | undefined;
|
|
122
|
+
}>;
|
|
123
|
+
/**
|
|
124
|
+
* Notification job schema
|
|
125
|
+
*/
|
|
126
|
+
notification: z.ZodObject<{
|
|
127
|
+
userId: z.ZodString;
|
|
128
|
+
title: z.ZodString;
|
|
129
|
+
message: z.ZodString;
|
|
130
|
+
type: z.ZodDefault<z.ZodEnum<["info", "warning", "error", "success"]>>;
|
|
131
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
132
|
+
}, "strip", z.ZodTypeAny, {
|
|
133
|
+
message: string;
|
|
134
|
+
type: "error" | "info" | "warning" | "success";
|
|
135
|
+
userId: string;
|
|
136
|
+
title: string;
|
|
137
|
+
metadata?: Record<string, unknown> | undefined;
|
|
138
|
+
}, {
|
|
139
|
+
message: string;
|
|
140
|
+
userId: string;
|
|
141
|
+
title: string;
|
|
142
|
+
type?: "error" | "info" | "warning" | "success" | undefined;
|
|
143
|
+
metadata?: Record<string, unknown> | undefined;
|
|
144
|
+
}>;
|
|
145
|
+
/**
|
|
146
|
+
* File processing job schema
|
|
147
|
+
*/
|
|
148
|
+
fileProcessing: z.ZodObject<{
|
|
149
|
+
fileId: z.ZodString;
|
|
150
|
+
filePath: z.ZodString;
|
|
151
|
+
operation: z.ZodEnum<["resize", "compress", "convert", "thumbnail"]>;
|
|
152
|
+
options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
153
|
+
}, "strip", z.ZodTypeAny, {
|
|
154
|
+
fileId: string;
|
|
155
|
+
filePath: string;
|
|
156
|
+
operation: "resize" | "compress" | "convert" | "thumbnail";
|
|
157
|
+
options?: Record<string, unknown> | undefined;
|
|
158
|
+
}, {
|
|
159
|
+
fileId: string;
|
|
160
|
+
filePath: string;
|
|
161
|
+
operation: "resize" | "compress" | "convert" | "thumbnail";
|
|
162
|
+
options?: Record<string, unknown> | undefined;
|
|
163
|
+
}>;
|
|
164
|
+
/**
|
|
165
|
+
* Webhook job schema
|
|
166
|
+
*/
|
|
167
|
+
webhook: z.ZodObject<{
|
|
168
|
+
url: z.ZodString;
|
|
169
|
+
method: z.ZodDefault<z.ZodEnum<["GET", "POST", "PUT", "PATCH", "DELETE"]>>;
|
|
170
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
171
|
+
body: z.ZodOptional<z.ZodUnknown>;
|
|
172
|
+
timeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
173
|
+
}, "strip", z.ZodTypeAny, {
|
|
174
|
+
timeout: number;
|
|
175
|
+
method: "DELETE" | "GET" | "PATCH" | "POST" | "PUT";
|
|
176
|
+
url: string;
|
|
177
|
+
headers?: Record<string, string> | undefined;
|
|
178
|
+
body?: unknown;
|
|
179
|
+
}, {
|
|
180
|
+
url: string;
|
|
181
|
+
timeout?: number | undefined;
|
|
182
|
+
headers?: Record<string, string> | undefined;
|
|
183
|
+
body?: unknown;
|
|
184
|
+
method?: "DELETE" | "GET" | "PATCH" | "POST" | "PUT" | undefined;
|
|
185
|
+
}>;
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAEvD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAErE;AAED;;GAEG;AACH,qBAAa,SAAS,CAAC,CAAC;IACV,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjD;;OAEG;IACH,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC;IAIzB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC;IAa1B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS;IAK1C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,CAAC;IAIjC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE;IAUlC;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC;CAGxB;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;aAG/B,QAAQ,EAAE,QAAQ;gBADlC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,QAAQ;IAUpC;;OAEG;IACH,SAAS,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAMtD;AAGD,OAAO,EAAE,CAAC,EAAE,CAAC;AAEb;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAeH;;OAEG;;;;;;;;;;;;;;;;;;;;IASH;;OAEG;;;;;;;;;;;;;;;;;IAQH;;OAEG;;;;;;;;;;;;;;;;;;;;CAQJ,CAAC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod validation utilities for job payloads
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
/**
|
|
6
|
+
* Creates a wrapper around a Zod schema for job validation
|
|
7
|
+
*
|
|
8
|
+
* @param schema - The Zod schema to use for validation
|
|
9
|
+
* @returns A wrapped schema with job-specific utilities
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const EmailJobSchema = createJobSchema(z.object({
|
|
14
|
+
* to: z.string().email(),
|
|
15
|
+
* subject: z.string().min(1),
|
|
16
|
+
* body: z.string(),
|
|
17
|
+
* }));
|
|
18
|
+
*
|
|
19
|
+
* // Validate job data
|
|
20
|
+
* const result = EmailJobSchema.validate({ to: 'test@example.com', subject: 'Hello', body: 'World' });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function createJobSchema(schema) {
|
|
24
|
+
return new JobSchema(schema);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Wrapper class for Zod schemas with job-specific utilities
|
|
28
|
+
*/
|
|
29
|
+
export class JobSchema {
|
|
30
|
+
schema;
|
|
31
|
+
constructor(schema) {
|
|
32
|
+
this.schema = schema;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the underlying Zod schema
|
|
36
|
+
*/
|
|
37
|
+
getSchema() {
|
|
38
|
+
return this.schema;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Validate job data
|
|
42
|
+
* @throws JobValidationError if validation fails
|
|
43
|
+
*/
|
|
44
|
+
validate(data) {
|
|
45
|
+
const result = this.schema.safeParse(data);
|
|
46
|
+
if (!result.success) {
|
|
47
|
+
throw new JobSchemaValidationError('Job data validation failed', result.error);
|
|
48
|
+
}
|
|
49
|
+
return result.data;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Validate job data, returning undefined on failure
|
|
53
|
+
*/
|
|
54
|
+
validateSafe(data) {
|
|
55
|
+
const result = this.schema.safeParse(data);
|
|
56
|
+
return result.success ? result.data : undefined;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if data is valid without throwing
|
|
60
|
+
*/
|
|
61
|
+
isValid(data) {
|
|
62
|
+
return this.schema.safeParse(data).success;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get validation errors for data
|
|
66
|
+
*/
|
|
67
|
+
getErrors(data) {
|
|
68
|
+
const result = this.schema.safeParse(data);
|
|
69
|
+
if (result.success) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
return result.error.errors.map(e => `${e.path.join('.')}: ${e.message}`);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Parse and transform data with defaults
|
|
76
|
+
*/
|
|
77
|
+
parse(data) {
|
|
78
|
+
return this.schema.parse(data);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Error thrown when job schema validation fails
|
|
83
|
+
*/
|
|
84
|
+
export class JobSchemaValidationError extends Error {
|
|
85
|
+
zodError;
|
|
86
|
+
constructor(message, zodError) {
|
|
87
|
+
const details = zodError.errors
|
|
88
|
+
.map(e => `${e.path.join('.')}: ${e.message}`)
|
|
89
|
+
.join(', ');
|
|
90
|
+
super(`${message}: ${details}`);
|
|
91
|
+
this.zodError = zodError;
|
|
92
|
+
this.name = 'JobSchemaValidationError';
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get formatted validation errors
|
|
96
|
+
*/
|
|
97
|
+
getErrors() {
|
|
98
|
+
return this.zodError.errors.map(e => ({
|
|
99
|
+
path: e.path.join('.'),
|
|
100
|
+
message: e.message,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Re-export z for convenience
|
|
105
|
+
export { z };
|
|
106
|
+
/**
|
|
107
|
+
* Common job schemas for typical use cases
|
|
108
|
+
*/
|
|
109
|
+
export const CommonJobSchemas = {
|
|
110
|
+
/**
|
|
111
|
+
* Email job schema
|
|
112
|
+
*/
|
|
113
|
+
email: z.object({
|
|
114
|
+
to: z.string().email(),
|
|
115
|
+
cc: z.array(z.string().email()).optional(),
|
|
116
|
+
bcc: z.array(z.string().email()).optional(),
|
|
117
|
+
subject: z.string().min(1).max(998),
|
|
118
|
+
body: z.string(),
|
|
119
|
+
html: z.boolean().optional().default(false),
|
|
120
|
+
attachments: z.array(z.object({
|
|
121
|
+
filename: z.string(),
|
|
122
|
+
content: z.string(),
|
|
123
|
+
contentType: z.string().optional(),
|
|
124
|
+
})).optional(),
|
|
125
|
+
}),
|
|
126
|
+
/**
|
|
127
|
+
* Notification job schema
|
|
128
|
+
*/
|
|
129
|
+
notification: z.object({
|
|
130
|
+
userId: z.string(),
|
|
131
|
+
title: z.string().max(100),
|
|
132
|
+
message: z.string().max(1000),
|
|
133
|
+
type: z.enum(['info', 'warning', 'error', 'success']).default('info'),
|
|
134
|
+
metadata: z.record(z.unknown()).optional(),
|
|
135
|
+
}),
|
|
136
|
+
/**
|
|
137
|
+
* File processing job schema
|
|
138
|
+
*/
|
|
139
|
+
fileProcessing: z.object({
|
|
140
|
+
fileId: z.string(),
|
|
141
|
+
filePath: z.string(),
|
|
142
|
+
operation: z.enum(['resize', 'compress', 'convert', 'thumbnail']),
|
|
143
|
+
options: z.record(z.unknown()).optional(),
|
|
144
|
+
}),
|
|
145
|
+
/**
|
|
146
|
+
* Webhook job schema
|
|
147
|
+
*/
|
|
148
|
+
webhook: z.object({
|
|
149
|
+
url: z.string().url(),
|
|
150
|
+
method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).default('POST'),
|
|
151
|
+
headers: z.record(z.string()).optional(),
|
|
152
|
+
body: z.unknown().optional(),
|
|
153
|
+
timeout: z.number().positive().optional().default(30000),
|
|
154
|
+
}),
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|