flashq 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 +283 -0
- package/dist/client/advanced.d.ts +174 -0
- package/dist/client/advanced.d.ts.map +1 -0
- package/dist/client/advanced.js +248 -0
- package/dist/client/advanced.js.map +1 -0
- package/dist/client/connection.d.ts +103 -0
- package/dist/client/connection.d.ts.map +1 -0
- package/dist/client/connection.js +570 -0
- package/dist/client/connection.js.map +1 -0
- package/dist/client/core.d.ts +119 -0
- package/dist/client/core.d.ts.map +1 -0
- package/dist/client/core.js +257 -0
- package/dist/client/core.js.map +1 -0
- package/dist/client/cron.d.ts +59 -0
- package/dist/client/cron.d.ts.map +1 -0
- package/dist/client/cron.js +82 -0
- package/dist/client/cron.js.map +1 -0
- package/dist/client/dlq.d.ts +52 -0
- package/dist/client/dlq.d.ts.map +1 -0
- package/dist/client/dlq.js +73 -0
- package/dist/client/dlq.js.map +1 -0
- package/dist/client/flows.d.ts +49 -0
- package/dist/client/flows.d.ts.map +1 -0
- package/dist/client/flows.js +67 -0
- package/dist/client/flows.js.map +1 -0
- package/dist/client/index.d.ts +644 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +829 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/jobs.d.ts +183 -0
- package/dist/client/jobs.d.ts.map +1 -0
- package/dist/client/jobs.js +272 -0
- package/dist/client/jobs.js.map +1 -0
- package/dist/client/kv.d.ts +63 -0
- package/dist/client/kv.d.ts.map +1 -0
- package/dist/client/kv.js +131 -0
- package/dist/client/kv.js.map +1 -0
- package/dist/client/metrics.d.ts +34 -0
- package/dist/client/metrics.d.ts.map +1 -0
- package/dist/client/metrics.js +49 -0
- package/dist/client/metrics.js.map +1 -0
- package/dist/client/pubsub.d.ts +42 -0
- package/dist/client/pubsub.d.ts.map +1 -0
- package/dist/client/pubsub.js +92 -0
- package/dist/client/pubsub.js.map +1 -0
- package/dist/client/queue.d.ts +111 -0
- package/dist/client/queue.d.ts.map +1 -0
- package/dist/client/queue.js +160 -0
- package/dist/client/queue.js.map +1 -0
- package/dist/client/types.d.ts +23 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +3 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +23 -0
- package/dist/client.js.map +1 -0
- package/dist/events.d.ts +184 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +340 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/queue.d.ts +104 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +139 -0
- package/dist/queue.js.map +1 -0
- package/dist/types.d.ts +185 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +88 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +296 -0
- package/dist/worker.js.map +1 -0
- package/package.json +70 -0
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flashQ Events - Real-time event subscriptions
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - SSE (Server-Sent Events) - Unidirectional, auto-reconnect
|
|
6
|
+
* - WebSocket - Bidirectional, low latency
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { EventSubscriber } from 'flashq';
|
|
11
|
+
*
|
|
12
|
+
* const events = new EventSubscriber({ host: 'localhost', httpPort: 6790 });
|
|
13
|
+
*
|
|
14
|
+
* events.on('completed', (event) => {
|
|
15
|
+
* console.log(`Job ${event.jobId} completed`);
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* events.on('failed', (event) => {
|
|
19
|
+
* console.log(`Job ${event.jobId} failed: ${event.error}`);
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* await events.connect();
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import { EventEmitter } from 'events';
|
|
26
|
+
export type EventType = 'pushed' | 'completed' | 'failed' | 'progress' | 'timeout';
|
|
27
|
+
export interface JobEvent {
|
|
28
|
+
/** Event type */
|
|
29
|
+
eventType: EventType;
|
|
30
|
+
/** Queue name */
|
|
31
|
+
queue: string;
|
|
32
|
+
/** Job ID */
|
|
33
|
+
jobId: number;
|
|
34
|
+
/** Event timestamp (ms) */
|
|
35
|
+
timestamp: number;
|
|
36
|
+
/** Job data (for pushed events) */
|
|
37
|
+
data?: unknown;
|
|
38
|
+
/** Error message (for failed events) */
|
|
39
|
+
error?: string;
|
|
40
|
+
/** Progress percentage (for progress events) */
|
|
41
|
+
progress?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface EventSubscriberOptions {
|
|
44
|
+
/** Server host (default: localhost) */
|
|
45
|
+
host?: string;
|
|
46
|
+
/** HTTP port (default: 6790) */
|
|
47
|
+
httpPort?: number;
|
|
48
|
+
/** Authentication token */
|
|
49
|
+
token?: string;
|
|
50
|
+
/** Filter to specific queue */
|
|
51
|
+
queue?: string;
|
|
52
|
+
/** Connection type: 'sse' or 'websocket' (default: 'sse') */
|
|
53
|
+
type?: 'sse' | 'websocket';
|
|
54
|
+
/** Auto-reconnect on disconnect (default: true) */
|
|
55
|
+
autoReconnect?: boolean;
|
|
56
|
+
/** Reconnect delay in ms (default: 1000) */
|
|
57
|
+
reconnectDelay?: number;
|
|
58
|
+
/** Max reconnect attempts (default: 10, 0 = infinite) */
|
|
59
|
+
maxReconnectAttempts?: number;
|
|
60
|
+
}
|
|
61
|
+
export interface EventSubscriberEvents {
|
|
62
|
+
/** Emitted when connected */
|
|
63
|
+
connected: () => void;
|
|
64
|
+
/** Emitted when disconnected */
|
|
65
|
+
disconnected: () => void;
|
|
66
|
+
/** Emitted on reconnect attempt */
|
|
67
|
+
reconnecting: (attempt: number) => void;
|
|
68
|
+
/** Emitted on error */
|
|
69
|
+
error: (error: Error) => void;
|
|
70
|
+
/** Emitted for all job events */
|
|
71
|
+
event: (event: JobEvent) => void;
|
|
72
|
+
/** Emitted when a job is pushed */
|
|
73
|
+
pushed: (event: JobEvent) => void;
|
|
74
|
+
/** Emitted when a job completes */
|
|
75
|
+
completed: (event: JobEvent) => void;
|
|
76
|
+
/** Emitted when a job fails */
|
|
77
|
+
failed: (event: JobEvent) => void;
|
|
78
|
+
/** Emitted on job progress update */
|
|
79
|
+
progress: (event: JobEvent) => void;
|
|
80
|
+
/** Emitted when a job times out */
|
|
81
|
+
timeout: (event: JobEvent) => void;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Real-time event subscriber for flashQ
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* // SSE (default, auto-reconnect)
|
|
89
|
+
* const events = new EventSubscriber({
|
|
90
|
+
* host: 'localhost',
|
|
91
|
+
* httpPort: 6790,
|
|
92
|
+
* queue: 'emails', // Optional: filter to one queue
|
|
93
|
+
* });
|
|
94
|
+
*
|
|
95
|
+
* events.on('completed', (e) => console.log(`Job ${e.jobId} done!`));
|
|
96
|
+
* events.on('failed', (e) => console.log(`Job ${e.jobId} failed: ${e.error}`));
|
|
97
|
+
*
|
|
98
|
+
* await events.connect();
|
|
99
|
+
*
|
|
100
|
+
* // Later...
|
|
101
|
+
* events.close();
|
|
102
|
+
* ```
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* // WebSocket
|
|
107
|
+
* const events = new EventSubscriber({
|
|
108
|
+
* type: 'websocket',
|
|
109
|
+
* token: 'your-auth-token',
|
|
110
|
+
* });
|
|
111
|
+
*
|
|
112
|
+
* await events.connect();
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare class EventSubscriber extends EventEmitter {
|
|
116
|
+
private options;
|
|
117
|
+
private eventSource;
|
|
118
|
+
private websocket;
|
|
119
|
+
private connected;
|
|
120
|
+
private reconnectAttempts;
|
|
121
|
+
private reconnectTimer;
|
|
122
|
+
private closed;
|
|
123
|
+
private sseHandlers;
|
|
124
|
+
private wsMessageHandler;
|
|
125
|
+
constructor(options?: EventSubscriberOptions);
|
|
126
|
+
on<K extends keyof EventSubscriberEvents>(event: K, listener: EventSubscriberEvents[K]): this;
|
|
127
|
+
off<K extends keyof EventSubscriberEvents>(event: K, listener: EventSubscriberEvents[K]): this;
|
|
128
|
+
emit<K extends keyof EventSubscriberEvents>(event: K, ...args: Parameters<EventSubscriberEvents[K]>): boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Connect to the event stream
|
|
131
|
+
*/
|
|
132
|
+
connect(): Promise<void>;
|
|
133
|
+
/**
|
|
134
|
+
* Close the connection
|
|
135
|
+
*/
|
|
136
|
+
close(): void;
|
|
137
|
+
/**
|
|
138
|
+
* Check if connected
|
|
139
|
+
*/
|
|
140
|
+
isConnected(): boolean;
|
|
141
|
+
private connectSSE;
|
|
142
|
+
private connectWebSocket;
|
|
143
|
+
private normalizeEvent;
|
|
144
|
+
private scheduleReconnect;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create an SSE event subscriber
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```typescript
|
|
151
|
+
* const events = createEventSubscriber({ queue: 'emails' });
|
|
152
|
+
* events.on('completed', (e) => console.log(e));
|
|
153
|
+
* await events.connect();
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export declare function createEventSubscriber(options?: EventSubscriberOptions): EventSubscriber;
|
|
157
|
+
/**
|
|
158
|
+
* Create a WebSocket event subscriber
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* const events = createWebSocketSubscriber({ token: 'xxx' });
|
|
163
|
+
* events.on('completed', (e) => console.log(e));
|
|
164
|
+
* await events.connect();
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
export declare function createWebSocketSubscriber(options?: EventSubscriberOptions): EventSubscriber;
|
|
168
|
+
/**
|
|
169
|
+
* Subscribe to events with a simple callback
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```typescript
|
|
173
|
+
* const unsubscribe = await subscribeToEvents(
|
|
174
|
+
* { queue: 'emails' },
|
|
175
|
+
* (event) => console.log(event)
|
|
176
|
+
* );
|
|
177
|
+
*
|
|
178
|
+
* // Later...
|
|
179
|
+
* unsubscribe();
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
export declare function subscribeToEvents(options: EventSubscriberOptions, callback: (event: JobEvent) => void): Promise<() => void>;
|
|
183
|
+
export default EventSubscriber;
|
|
184
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* flashQ Events - Real-time event subscriptions
|
|
4
|
+
*
|
|
5
|
+
* Supports:
|
|
6
|
+
* - SSE (Server-Sent Events) - Unidirectional, auto-reconnect
|
|
7
|
+
* - WebSocket - Bidirectional, low latency
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { EventSubscriber } from 'flashq';
|
|
12
|
+
*
|
|
13
|
+
* const events = new EventSubscriber({ host: 'localhost', httpPort: 6790 });
|
|
14
|
+
*
|
|
15
|
+
* events.on('completed', (event) => {
|
|
16
|
+
* console.log(`Job ${event.jobId} completed`);
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* events.on('failed', (event) => {
|
|
20
|
+
* console.log(`Job ${event.jobId} failed: ${event.error}`);
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* await events.connect();
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.EventSubscriber = void 0;
|
|
28
|
+
exports.createEventSubscriber = createEventSubscriber;
|
|
29
|
+
exports.createWebSocketSubscriber = createWebSocketSubscriber;
|
|
30
|
+
exports.subscribeToEvents = subscribeToEvents;
|
|
31
|
+
const events_1 = require("events");
|
|
32
|
+
// ============== EventSubscriber ==============
|
|
33
|
+
/**
|
|
34
|
+
* Real-time event subscriber for flashQ
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* // SSE (default, auto-reconnect)
|
|
39
|
+
* const events = new EventSubscriber({
|
|
40
|
+
* host: 'localhost',
|
|
41
|
+
* httpPort: 6790,
|
|
42
|
+
* queue: 'emails', // Optional: filter to one queue
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* events.on('completed', (e) => console.log(`Job ${e.jobId} done!`));
|
|
46
|
+
* events.on('failed', (e) => console.log(`Job ${e.jobId} failed: ${e.error}`));
|
|
47
|
+
*
|
|
48
|
+
* await events.connect();
|
|
49
|
+
*
|
|
50
|
+
* // Later...
|
|
51
|
+
* events.close();
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* // WebSocket
|
|
57
|
+
* const events = new EventSubscriber({
|
|
58
|
+
* type: 'websocket',
|
|
59
|
+
* token: 'your-auth-token',
|
|
60
|
+
* });
|
|
61
|
+
*
|
|
62
|
+
* await events.connect();
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
class EventSubscriber extends events_1.EventEmitter {
|
|
66
|
+
options;
|
|
67
|
+
eventSource = null;
|
|
68
|
+
websocket = null;
|
|
69
|
+
connected = false;
|
|
70
|
+
reconnectAttempts = 0;
|
|
71
|
+
reconnectTimer = null;
|
|
72
|
+
closed = false;
|
|
73
|
+
// Store handlers for proper cleanup
|
|
74
|
+
sseHandlers = new Map();
|
|
75
|
+
wsMessageHandler = null;
|
|
76
|
+
constructor(options = {}) {
|
|
77
|
+
super();
|
|
78
|
+
this.options = {
|
|
79
|
+
host: options.host ?? 'localhost',
|
|
80
|
+
httpPort: options.httpPort ?? 6790,
|
|
81
|
+
token: options.token ?? '',
|
|
82
|
+
queue: options.queue ?? '',
|
|
83
|
+
type: options.type ?? 'sse',
|
|
84
|
+
autoReconnect: options.autoReconnect ?? true,
|
|
85
|
+
reconnectDelay: options.reconnectDelay ?? 1000,
|
|
86
|
+
maxReconnectAttempts: options.maxReconnectAttempts ?? 10,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Typed event emitter overrides
|
|
90
|
+
on(event, listener) {
|
|
91
|
+
return super.on(event, listener);
|
|
92
|
+
}
|
|
93
|
+
off(event, listener) {
|
|
94
|
+
return super.off(event, listener);
|
|
95
|
+
}
|
|
96
|
+
emit(event, ...args) {
|
|
97
|
+
return super.emit(event, ...args);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Connect to the event stream
|
|
101
|
+
*/
|
|
102
|
+
async connect() {
|
|
103
|
+
this.closed = false;
|
|
104
|
+
this.reconnectAttempts = 0;
|
|
105
|
+
if (this.options.type === 'websocket') {
|
|
106
|
+
await this.connectWebSocket();
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
await this.connectSSE();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Close the connection
|
|
114
|
+
*/
|
|
115
|
+
close() {
|
|
116
|
+
this.closed = true;
|
|
117
|
+
if (this.reconnectTimer) {
|
|
118
|
+
clearTimeout(this.reconnectTimer);
|
|
119
|
+
this.reconnectTimer = null;
|
|
120
|
+
}
|
|
121
|
+
// Clean up SSE handlers to prevent memory leak
|
|
122
|
+
if (this.eventSource) {
|
|
123
|
+
for (const [eventType, handler] of this.sseHandlers) {
|
|
124
|
+
this.eventSource.removeEventListener(eventType, handler);
|
|
125
|
+
}
|
|
126
|
+
this.sseHandlers.clear();
|
|
127
|
+
this.eventSource.close();
|
|
128
|
+
this.eventSource = null;
|
|
129
|
+
}
|
|
130
|
+
// Clean up WebSocket
|
|
131
|
+
if (this.websocket) {
|
|
132
|
+
this.wsMessageHandler = null;
|
|
133
|
+
this.websocket.close();
|
|
134
|
+
this.websocket = null;
|
|
135
|
+
}
|
|
136
|
+
if (this.connected) {
|
|
137
|
+
this.connected = false;
|
|
138
|
+
this.emit('disconnected');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Check if connected
|
|
143
|
+
*/
|
|
144
|
+
isConnected() {
|
|
145
|
+
return this.connected;
|
|
146
|
+
}
|
|
147
|
+
// ============== SSE ==============
|
|
148
|
+
async connectSSE() {
|
|
149
|
+
return new Promise((resolve, reject) => {
|
|
150
|
+
const baseUrl = `http://${this.options.host}:${this.options.httpPort}`;
|
|
151
|
+
const url = this.options.queue
|
|
152
|
+
? `${baseUrl}/queues/${this.options.queue}/events`
|
|
153
|
+
: `${baseUrl}/events`;
|
|
154
|
+
try {
|
|
155
|
+
this.eventSource = new EventSource(url);
|
|
156
|
+
this.eventSource.onopen = () => {
|
|
157
|
+
this.connected = true;
|
|
158
|
+
this.reconnectAttempts = 0;
|
|
159
|
+
this.emit('connected');
|
|
160
|
+
resolve();
|
|
161
|
+
};
|
|
162
|
+
this.eventSource.onerror = (error) => {
|
|
163
|
+
const wasConnected = this.connected;
|
|
164
|
+
this.connected = false;
|
|
165
|
+
if (wasConnected) {
|
|
166
|
+
this.emit('disconnected');
|
|
167
|
+
}
|
|
168
|
+
if (!this.closed && this.options.autoReconnect) {
|
|
169
|
+
this.scheduleReconnect();
|
|
170
|
+
}
|
|
171
|
+
else if (!wasConnected) {
|
|
172
|
+
reject(new Error('Failed to connect to SSE'));
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
// Clear any existing handlers
|
|
176
|
+
this.sseHandlers.clear();
|
|
177
|
+
// Listen for specific event types
|
|
178
|
+
const eventTypes = ['pushed', 'completed', 'failed', 'progress', 'timeout'];
|
|
179
|
+
for (const eventType of eventTypes) {
|
|
180
|
+
const handler = (e) => {
|
|
181
|
+
try {
|
|
182
|
+
const messageEvent = e;
|
|
183
|
+
const rawEvent = JSON.parse(messageEvent.data);
|
|
184
|
+
const event = this.normalizeEvent(rawEvent);
|
|
185
|
+
this.emit('event', event);
|
|
186
|
+
this.emit(eventType, event);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// Ignore parse errors
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
this.sseHandlers.set(eventType, handler);
|
|
193
|
+
this.eventSource.addEventListener(eventType, handler);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
reject(error);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// ============== WebSocket ==============
|
|
202
|
+
async connectWebSocket() {
|
|
203
|
+
return new Promise((resolve, reject) => {
|
|
204
|
+
const protocol = this.options.host === 'localhost' ? 'ws' : 'wss';
|
|
205
|
+
let url = `${protocol}://${this.options.host}:${this.options.httpPort}`;
|
|
206
|
+
if (this.options.queue) {
|
|
207
|
+
url += `/ws/${this.options.queue}`;
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
url += '/ws';
|
|
211
|
+
}
|
|
212
|
+
if (this.options.token) {
|
|
213
|
+
url += `?token=${encodeURIComponent(this.options.token)}`;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
this.websocket = new WebSocket(url);
|
|
217
|
+
this.websocket.onopen = () => {
|
|
218
|
+
this.connected = true;
|
|
219
|
+
this.reconnectAttempts = 0;
|
|
220
|
+
this.emit('connected');
|
|
221
|
+
resolve();
|
|
222
|
+
};
|
|
223
|
+
this.websocket.onclose = () => {
|
|
224
|
+
const wasConnected = this.connected;
|
|
225
|
+
this.connected = false;
|
|
226
|
+
if (wasConnected) {
|
|
227
|
+
this.emit('disconnected');
|
|
228
|
+
}
|
|
229
|
+
if (!this.closed && this.options.autoReconnect) {
|
|
230
|
+
this.scheduleReconnect();
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
this.websocket.onerror = () => {
|
|
234
|
+
this.emit('error', new Error('WebSocket error'));
|
|
235
|
+
if (!this.connected) {
|
|
236
|
+
reject(new Error('Failed to connect to WebSocket'));
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
// Store message handler for cleanup
|
|
240
|
+
this.wsMessageHandler = (e) => {
|
|
241
|
+
try {
|
|
242
|
+
const rawEvent = JSON.parse(e.data);
|
|
243
|
+
const event = this.normalizeEvent(rawEvent);
|
|
244
|
+
this.emit('event', event);
|
|
245
|
+
this.emit(event.eventType, event);
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
// Ignore parse errors
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
this.websocket.onmessage = this.wsMessageHandler;
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
reject(error);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
// ============== Helpers ==============
|
|
259
|
+
normalizeEvent(raw) {
|
|
260
|
+
return {
|
|
261
|
+
eventType: (raw.event_type ?? raw.eventType),
|
|
262
|
+
queue: raw.queue,
|
|
263
|
+
jobId: (raw.job_id ?? raw.jobId),
|
|
264
|
+
timestamp: raw.timestamp,
|
|
265
|
+
data: raw.data,
|
|
266
|
+
error: raw.error,
|
|
267
|
+
progress: raw.progress,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
scheduleReconnect() {
|
|
271
|
+
if (this.closed)
|
|
272
|
+
return;
|
|
273
|
+
const maxAttempts = this.options.maxReconnectAttempts;
|
|
274
|
+
if (maxAttempts > 0 && this.reconnectAttempts >= maxAttempts) {
|
|
275
|
+
this.emit('error', new Error('Max reconnect attempts reached'));
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
this.reconnectAttempts++;
|
|
279
|
+
this.emit('reconnecting', this.reconnectAttempts);
|
|
280
|
+
// Exponential backoff with jitter
|
|
281
|
+
const delay = Math.min(this.options.reconnectDelay * Math.pow(1.5, this.reconnectAttempts - 1) +
|
|
282
|
+
Math.random() * 1000, 30000);
|
|
283
|
+
this.reconnectTimer = setTimeout(() => {
|
|
284
|
+
this.reconnectTimer = null;
|
|
285
|
+
this.connect().catch(() => {
|
|
286
|
+
// Error will trigger another reconnect
|
|
287
|
+
});
|
|
288
|
+
}, delay);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
exports.EventSubscriber = EventSubscriber;
|
|
292
|
+
// ============== Convenience Functions ==============
|
|
293
|
+
/**
|
|
294
|
+
* Create an SSE event subscriber
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* ```typescript
|
|
298
|
+
* const events = createEventSubscriber({ queue: 'emails' });
|
|
299
|
+
* events.on('completed', (e) => console.log(e));
|
|
300
|
+
* await events.connect();
|
|
301
|
+
* ```
|
|
302
|
+
*/
|
|
303
|
+
function createEventSubscriber(options) {
|
|
304
|
+
return new EventSubscriber({ ...options, type: 'sse' });
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Create a WebSocket event subscriber
|
|
308
|
+
*
|
|
309
|
+
* @example
|
|
310
|
+
* ```typescript
|
|
311
|
+
* const events = createWebSocketSubscriber({ token: 'xxx' });
|
|
312
|
+
* events.on('completed', (e) => console.log(e));
|
|
313
|
+
* await events.connect();
|
|
314
|
+
* ```
|
|
315
|
+
*/
|
|
316
|
+
function createWebSocketSubscriber(options) {
|
|
317
|
+
return new EventSubscriber({ ...options, type: 'websocket' });
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Subscribe to events with a simple callback
|
|
321
|
+
*
|
|
322
|
+
* @example
|
|
323
|
+
* ```typescript
|
|
324
|
+
* const unsubscribe = await subscribeToEvents(
|
|
325
|
+
* { queue: 'emails' },
|
|
326
|
+
* (event) => console.log(event)
|
|
327
|
+
* );
|
|
328
|
+
*
|
|
329
|
+
* // Later...
|
|
330
|
+
* unsubscribe();
|
|
331
|
+
* ```
|
|
332
|
+
*/
|
|
333
|
+
async function subscribeToEvents(options, callback) {
|
|
334
|
+
const subscriber = new EventSubscriber(options);
|
|
335
|
+
subscriber.on('event', callback);
|
|
336
|
+
await subscriber.connect();
|
|
337
|
+
return () => subscriber.close();
|
|
338
|
+
}
|
|
339
|
+
exports.default = EventSubscriber;
|
|
340
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* flashQ - High-performance Job Queue (BullMQ-compatible)
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { Queue, Worker } from 'flashq';
|
|
7
|
+
*
|
|
8
|
+
* // Add jobs
|
|
9
|
+
* const queue = new Queue('emails');
|
|
10
|
+
* await queue.add('send', { to: 'user@example.com' });
|
|
11
|
+
*
|
|
12
|
+
* // Process jobs (auto-starts)
|
|
13
|
+
* const worker = new Worker('emails', async (job) => {
|
|
14
|
+
* await sendEmail(job.data);
|
|
15
|
+
* return { sent: true };
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @packageDocumentation
|
|
20
|
+
*/
|
|
21
|
+
export { Queue } from './queue';
|
|
22
|
+
export type { QueueOptions, JobOptions } from './queue';
|
|
23
|
+
export { Worker } from './worker';
|
|
24
|
+
export type { BullMQWorkerOptions } from './worker';
|
|
25
|
+
export { FlashQ, FlashQ as default } from './client';
|
|
26
|
+
export { MAX_BATCH_SIZE, MAX_JOB_DATA_SIZE } from './client/core';
|
|
27
|
+
export { validateQueueName, validateJobDataSize } from './client/connection';
|
|
28
|
+
export { EventSubscriber } from './events';
|
|
29
|
+
export type { Job, JobState, PushOptions, WorkerOptions, ClientOptions, } from './types';
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,UAAU,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,YAAY,EACV,GAAG,EACH,QAAQ,EACR,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* flashQ - High-performance Job Queue (BullMQ-compatible)
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* import { Queue, Worker } from 'flashq';
|
|
8
|
+
*
|
|
9
|
+
* // Add jobs
|
|
10
|
+
* const queue = new Queue('emails');
|
|
11
|
+
* await queue.add('send', { to: 'user@example.com' });
|
|
12
|
+
*
|
|
13
|
+
* // Process jobs (auto-starts)
|
|
14
|
+
* const worker = new Worker('emails', async (job) => {
|
|
15
|
+
* await sendEmail(job.data);
|
|
16
|
+
* return { sent: true };
|
|
17
|
+
* });
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @packageDocumentation
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.EventSubscriber = exports.validateJobDataSize = exports.validateQueueName = exports.MAX_JOB_DATA_SIZE = exports.MAX_BATCH_SIZE = exports.default = exports.FlashQ = exports.Worker = exports.Queue = void 0;
|
|
24
|
+
// BullMQ-compatible API
|
|
25
|
+
var queue_1 = require("./queue");
|
|
26
|
+
Object.defineProperty(exports, "Queue", { enumerable: true, get: function () { return queue_1.Queue; } });
|
|
27
|
+
var worker_1 = require("./worker");
|
|
28
|
+
Object.defineProperty(exports, "Worker", { enumerable: true, get: function () { return worker_1.Worker; } });
|
|
29
|
+
// Low-level API
|
|
30
|
+
var client_1 = require("./client");
|
|
31
|
+
Object.defineProperty(exports, "FlashQ", { enumerable: true, get: function () { return client_1.FlashQ; } });
|
|
32
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return client_1.FlashQ; } });
|
|
33
|
+
// Constants and validation utilities
|
|
34
|
+
var core_1 = require("./client/core");
|
|
35
|
+
Object.defineProperty(exports, "MAX_BATCH_SIZE", { enumerable: true, get: function () { return core_1.MAX_BATCH_SIZE; } });
|
|
36
|
+
Object.defineProperty(exports, "MAX_JOB_DATA_SIZE", { enumerable: true, get: function () { return core_1.MAX_JOB_DATA_SIZE; } });
|
|
37
|
+
var connection_1 = require("./client/connection");
|
|
38
|
+
Object.defineProperty(exports, "validateQueueName", { enumerable: true, get: function () { return connection_1.validateQueueName; } });
|
|
39
|
+
Object.defineProperty(exports, "validateJobDataSize", { enumerable: true, get: function () { return connection_1.validateJobDataSize; } });
|
|
40
|
+
// Optional: Real-time events
|
|
41
|
+
var events_1 = require("./events");
|
|
42
|
+
Object.defineProperty(exports, "EventSubscriber", { enumerable: true, get: function () { return events_1.EventSubscriber; } });
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,wBAAwB;AACxB,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AAGd,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AAGf,gBAAgB;AAChB,mCAAqD;AAA5C,gGAAA,MAAM,OAAA;AAAE,iGAAA,MAAM,OAAW;AAElC,qCAAqC;AACrC,sCAAkE;AAAzD,sGAAA,cAAc,OAAA;AAAE,yGAAA,iBAAiB,OAAA;AAC1C,kDAA6E;AAApE,+GAAA,iBAAiB,OAAA;AAAE,iHAAA,mBAAmB,OAAA;AAE/C,6BAA6B;AAC7B,mCAA2C;AAAlC,yGAAA,eAAe,OAAA"}
|