@nolag/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 ADDED
@@ -0,0 +1,198 @@
1
+ # @nolag/queue
2
+
3
+ Real-time job queue SDK for [NoLag](https://nolag.app) — job lifecycle, progress tracking, and worker management.
4
+
5
+ ## How It Works with NoLag
6
+
7
+ NoLag is a real-time messaging platform that handles WebSocket connections, message routing, persistence, and scaling. This SDK wraps the low-level [@nolag/js-sdk](https://www.npmjs.com/package/@nolag/js-sdk) and gives you a purpose-built queue API — add jobs, claim and process them with workers, track progress in real-time — without managing topics or subscriptions yourself.
8
+
9
+ ### Getting Your Token
10
+
11
+ 1. Sign up at [nolag.app](https://nolag.app)
12
+ 2. Create a new **project** in the portal
13
+ 3. Choose the **Queue** blueprint when creating an app — this pre-configures the topics (`jobs`, `_progress`) and settings your queue needs
14
+ 4. Go to the app's **Tokens** page and generate an **actor token**
15
+ 5. Use that token when connecting with this SDK
16
+
17
+ Each token identifies a unique worker, producer, or monitor (actor) in NoLag. The blueprint handles all the infrastructure setup — you just build your queue logic.
18
+
19
+ ## Install
20
+
21
+ ```bash
22
+ npm install @nolag/js-sdk @nolag/queue
23
+ ```
24
+
25
+ ## Quick Start
26
+
27
+ ```typescript
28
+ import { NoLagQueue } from "@nolag/queue";
29
+
30
+ // --- Producer: adds jobs ---
31
+ const producer = new NoLagQueue("PRODUCER_TOKEN", { role: "producer" });
32
+ await producer.connect();
33
+
34
+ const queue = producer.joinQueue("image-processing");
35
+ queue.addJob({
36
+ type: "resize",
37
+ payload: { imageUrl: "https://example.com/photo.jpg", width: 800 },
38
+ priority: "high",
39
+ });
40
+
41
+ // --- Worker: processes jobs ---
42
+ const worker = new NoLagQueue("WORKER_TOKEN", {
43
+ role: "worker",
44
+ concurrency: 3,
45
+ });
46
+ await worker.connect();
47
+
48
+ const workerQueue = worker.joinQueue("image-processing");
49
+
50
+ workerQueue.on("jobAdded", (job) => {
51
+ const claimed = workerQueue.claimJob(job.id);
52
+ if (claimed) {
53
+ processImage(claimed.payload, (progress) => {
54
+ workerQueue.reportProgress(job.id, progress);
55
+ }).then((result) => {
56
+ workerQueue.completeJob(job.id, result);
57
+ }).catch((err) => {
58
+ workerQueue.failJob(job.id, err.message);
59
+ });
60
+ }
61
+ });
62
+
63
+ // --- Monitor: watches progress ---
64
+ const monitor = new NoLagQueue("MONITOR_TOKEN", { role: "monitor" });
65
+ await monitor.connect();
66
+
67
+ const monitorQueue = monitor.joinQueue("image-processing");
68
+ monitorQueue.on("jobProgress", (p) => {
69
+ updateProgressBar(p.jobId, p.progress);
70
+ });
71
+ monitorQueue.on("jobCompleted", (job) => {
72
+ console.log(`Job ${job.id} done:`, job.result);
73
+ });
74
+ ```
75
+
76
+ ## API Reference
77
+
78
+ ### `NoLagQueue`
79
+
80
+ #### Constructor
81
+
82
+ ```typescript
83
+ const queue = new NoLagQueue(token: string, options?: NoLagQueueOptions);
84
+ ```
85
+
86
+ **Options:**
87
+
88
+ | Option | Type | Default | Description |
89
+ |--------|------|---------|-------------|
90
+ | `workerId` | `string` | auto-generated | Unique worker ID |
91
+ | `role` | `WorkerRole` | `'monitor'` | `'producer'`, `'worker'`, or `'monitor'` |
92
+ | `concurrency` | `number` | `1` | Max concurrent jobs (workers) |
93
+ | `metadata` | `Record<string, unknown>` | — | Custom data |
94
+ | `queues` | `string[]` | — | Auto-join these queues on connect |
95
+ | `maxJobCache` | `number` | `1000` | Max jobs kept in memory |
96
+ | `loadBalanceGroup` | `string` | — | Worker partitioning group |
97
+ | `debug` | `boolean` | `false` | Enable debug logging |
98
+ | `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
99
+
100
+ #### Methods
101
+
102
+ | Method | Returns | Description |
103
+ |--------|---------|-------------|
104
+ | `connect()` | `Promise<void>` | Connect to NoLag |
105
+ | `disconnect()` | `void` | Disconnect |
106
+ | `joinQueue(name)` | `QueueRoom` | Join a queue |
107
+ | `leaveQueue(name)` | `void` | Leave a queue |
108
+ | `getQueues()` | `QueueRoom[]` | Get all joined queues |
109
+ | `getOnlineWorkers()` | `QueueWorker[]` | Get online workers |
110
+
111
+ #### Events
112
+
113
+ | Event | Payload | Description |
114
+ |-------|---------|-------------|
115
+ | `connected` | — | Connected |
116
+ | `disconnected` | — | Disconnected |
117
+ | `reconnected` | — | Reconnected |
118
+ | `error` | `Error` | Error |
119
+ | `workerOnline` | `QueueWorker` | Worker came online |
120
+ | `workerOffline` | `QueueWorker` | Worker went offline |
121
+
122
+ ### `QueueRoom`
123
+
124
+ #### Methods
125
+
126
+ | Method | Returns | Description |
127
+ |--------|---------|-------------|
128
+ | `addJob(options)` | `Job` | Add a job (producer only) |
129
+ | `claimJob(jobId)` | `Job \| null` | Claim a pending job (worker only) |
130
+ | `reportProgress(jobId, progress)` | `void` | Report progress 0–100 (worker only) |
131
+ | `completeJob(jobId, result?)` | `Job \| null` | Mark job complete (worker only) |
132
+ | `failJob(jobId, error)` | `Job \| null` | Mark job failed (worker only) |
133
+ | `retryJob(jobId)` | `Job \| null` | Retry a failed job (worker only) |
134
+ | `getJob(jobId)` | `Job \| undefined` | Get a specific job |
135
+ | `getJobs(filter?)` | `Job[]` | Get jobs, optionally filtered |
136
+ | `getWorkers()` | `QueueWorker[]` | Get workers in this queue |
137
+
138
+ #### Events
139
+
140
+ | Event | Payload | Description |
141
+ |-------|---------|-------------|
142
+ | `jobAdded` | `Job` | New job added |
143
+ | `jobClaimed` | `Job` | Job claimed by a worker |
144
+ | `jobProgress` | `JobProgress` | Job progress updated |
145
+ | `jobCompleted` | `Job` | Job completed |
146
+ | `jobFailed` | `Job` | Job failed |
147
+ | `jobRetrying` | `Job` | Job being retried |
148
+ | `workerJoined` | `QueueWorker` | Worker joined |
149
+ | `workerLeft` | `QueueWorker` | Worker left |
150
+ | `replayStart` / `replayEnd` | — | Job replay |
151
+
152
+ ## Types
153
+
154
+ ```typescript
155
+ interface Job {
156
+ id: string;
157
+ type: string;
158
+ payload?: Record<string, unknown>;
159
+ priority: JobPriority;
160
+ status: JobStatus;
161
+ progress: number;
162
+ result?: unknown;
163
+ error?: string;
164
+ attempts: number;
165
+ maxAttempts: number;
166
+ claimedBy?: string;
167
+ createdBy: string;
168
+ createdAt: number;
169
+ updatedAt: number;
170
+ completedAt?: number;
171
+ isReplay: boolean;
172
+ }
173
+
174
+ type JobStatus = "pending" | "claimed" | "active" | "completed" | "failed";
175
+ type JobPriority = "low" | "normal" | "high" | "critical";
176
+
177
+ interface QueueWorker {
178
+ workerId: string;
179
+ actorTokenId: string;
180
+ role: WorkerRole;
181
+ activeJobs: number;
182
+ concurrency: number;
183
+ metadata?: Record<string, unknown>;
184
+ joinedAt: number;
185
+ isLocal: boolean;
186
+ }
187
+
188
+ interface JobProgress {
189
+ jobId: string;
190
+ progress: number;
191
+ workerId: string;
192
+ timestamp: number;
193
+ }
194
+ ```
195
+
196
+ ## License
197
+
198
+ MIT
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tiny typed event emitter — framework-agnostic base for NoLag SDKs.
3
+ *
4
+ * EventMap is a record of event name → tuple of handler arguments.
5
+ */
6
+ export declare class EventEmitter<EventMap extends {
7
+ [K in keyof EventMap]: unknown[];
8
+ }> {
9
+ private _handlers;
10
+ on<K extends keyof EventMap>(event: K, handler: (...args: EventMap[K]) => void): this;
11
+ off<K extends keyof EventMap>(event: K, handler?: (...args: EventMap[K]) => void): this;
12
+ removeAllListeners(): this;
13
+ protected emit<K extends keyof EventMap>(event: K, ...args: EventMap[K]): void;
14
+ listenerCount<K extends keyof EventMap>(event: K): number;
15
+ }
@@ -0,0 +1,57 @@
1
+ import type { Job, JobStatus, JobPriority } from './types';
2
+ export interface JobFilter {
3
+ status?: JobStatus;
4
+ type?: string;
5
+ priority?: JobPriority;
6
+ }
7
+ /**
8
+ * In-memory job store with deduplication, filtering, and state-transition validation.
9
+ */
10
+ export declare class JobStore {
11
+ private _jobs;
12
+ private _maxSize;
13
+ constructor(maxSize: number);
14
+ /**
15
+ * Add a job to the store.
16
+ * Returns true if added, false if already present (dedup).
17
+ */
18
+ add(job: Job): boolean;
19
+ /**
20
+ * Get a job by ID.
21
+ */
22
+ get(id: string): Job | undefined;
23
+ /**
24
+ * Get all jobs, optionally filtered.
25
+ */
26
+ getAll(filter?: JobFilter): Job[];
27
+ /**
28
+ * Transition a job to a new status with optional data update.
29
+ * Validates the state transition. Returns updated job or null if invalid.
30
+ */
31
+ updateStatus(id: string, status: JobStatus, data?: Partial<Pick<Job, 'result' | 'error' | 'claimedBy' | 'attempts'>>): Job | null;
32
+ /**
33
+ * Update the progress percentage (0–100) for a job.
34
+ * Returns the updated job or null if not found.
35
+ */
36
+ updateProgress(id: string, progress: number): Job | null;
37
+ /**
38
+ * Number of jobs currently in 'pending' status.
39
+ */
40
+ get pendingCount(): number;
41
+ /**
42
+ * Number of jobs currently in 'active' status.
43
+ */
44
+ get activeCount(): number;
45
+ /**
46
+ * Check if a job with the given ID exists.
47
+ */
48
+ has(id: string): boolean;
49
+ /**
50
+ * Total number of jobs in the store.
51
+ */
52
+ get size(): number;
53
+ /**
54
+ * Clear all jobs from the store.
55
+ */
56
+ clear(): void;
57
+ }
@@ -0,0 +1,84 @@
1
+ import { EventEmitter } from './EventEmitter';
2
+ import { QueueRoom } from './QueueRoom';
3
+ import type { NoLagQueueOptions, QueueClientEvents, QueueWorker } from './types';
4
+ /**
5
+ * NoLagQueue — high-level real-time job queue SDK built on @nolag/js-sdk.
6
+ *
7
+ * Provides job lifecycle management, progress tracking, worker management,
8
+ * and global presence tracking — all framework-agnostic via events.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { NoLagQueue } from '@nolag/queue';
13
+ *
14
+ * const queue = new NoLagQueue(token, { role: 'worker', concurrency: 2 });
15
+ *
16
+ * queue.on('connected', () => console.log('Connected!'));
17
+ *
18
+ * await queue.connect();
19
+ *
20
+ * const room = queue.joinQueue('image-processing');
21
+ * room.on('jobAdded', (job) => {
22
+ * room.claimJob(job.id);
23
+ * // process...
24
+ * room.reportProgress(job.id, 50);
25
+ * room.completeJob(job.id, { output: 'result' });
26
+ * });
27
+ * ```
28
+ */
29
+ export declare class NoLagQueue extends EventEmitter<QueueClientEvents> {
30
+ private _token;
31
+ private _options;
32
+ private _client;
33
+ private _localWorker;
34
+ private _queues;
35
+ private _lobby;
36
+ private _onlineWorkers;
37
+ private _actorToWorkerId;
38
+ private _workerId;
39
+ private _log;
40
+ constructor(token: string, options?: NoLagQueueOptions);
41
+ /** Whether the underlying connection is established */
42
+ get connected(): boolean;
43
+ /** The local worker's info (available after connect) */
44
+ get localWorker(): QueueWorker | null;
45
+ /** All currently joined queue rooms */
46
+ get queues(): Map<string, QueueRoom>;
47
+ /**
48
+ * Connect to NoLag and set up global presence.
49
+ */
50
+ connect(): Promise<void>;
51
+ /**
52
+ * Disconnect from NoLag and clean up all queue rooms.
53
+ */
54
+ disconnect(): void;
55
+ /**
56
+ * Join a queue room. Creates, subscribes, and activates it.
57
+ * Returns an existing room if already joined.
58
+ */
59
+ joinQueue(name: string): QueueRoom;
60
+ /**
61
+ * Leave a queue room. Fully unsubscribes and removes it.
62
+ */
63
+ leaveQueue(name: string): void;
64
+ /**
65
+ * Get all joined queue rooms.
66
+ */
67
+ getQueues(): QueueRoom[];
68
+ /**
69
+ * Get all workers currently online across all queue rooms.
70
+ */
71
+ getOnlineWorkers(): QueueWorker[];
72
+ private _subscribeQueue;
73
+ private _handleRoomPresenceJoin;
74
+ private _handleRoomPresenceLeave;
75
+ private _handleRoomPresenceUpdate;
76
+ private _setupLobby;
77
+ private _handleLobbyJoin;
78
+ private _handleLobbyLeave;
79
+ private _handleLobbyUpdate;
80
+ private _hydrateOnlineWorkers;
81
+ private _presenceToWorker;
82
+ private _findWorkerIdByActorId;
83
+ private _restoreQueues;
84
+ }
@@ -0,0 +1,40 @@
1
+ import type { QueueWorker, QueuePresenceData } from './types';
2
+ /**
3
+ * Maps actorTokenId ↔ QueueWorker, filtering self.
4
+ */
5
+ export declare class PresenceManager {
6
+ private _workers;
7
+ private _actorToWorkerId;
8
+ private _localActorId;
9
+ constructor(localActorId: string);
10
+ /**
11
+ * Add or update a worker from presence data.
12
+ * Returns the QueueWorker if it's a remote worker, null if it's self.
13
+ */
14
+ addFromPresence(actorTokenId: string, presence: QueuePresenceData, joinedAt?: number): QueueWorker | null;
15
+ /**
16
+ * Remove a worker by actorTokenId.
17
+ * Returns the removed worker, or null if not found / is self.
18
+ */
19
+ removeByActorId(actorTokenId: string): QueueWorker | null;
20
+ /**
21
+ * Get a worker by workerId.
22
+ */
23
+ getWorker(workerId: string): QueueWorker | undefined;
24
+ /**
25
+ * Get a worker by actorTokenId.
26
+ */
27
+ getWorkerByActorId(actorTokenId: string): QueueWorker | undefined;
28
+ /**
29
+ * Get all remote workers.
30
+ */
31
+ getAll(): QueueWorker[];
32
+ /**
33
+ * Get the workers Map (readonly view).
34
+ */
35
+ get workers(): Map<string, QueueWorker>;
36
+ /**
37
+ * Clear all tracked workers.
38
+ */
39
+ clear(): void;
40
+ }
@@ -0,0 +1,85 @@
1
+ import type { RoomContext } from '@nolag/js-sdk';
2
+ import { EventEmitter } from './EventEmitter';
3
+ import type { QueueRoomEvents, Job, AddJobOptions, JobFilter, QueueWorker, QueuePresenceData, ResolvedQueueOptions } from './types';
4
+ /**
5
+ * QueueRoom — a single named queue with job lifecycle, progress tracking, and worker presence.
6
+ *
7
+ * Created via `NoLagQueue.joinQueue(name)`. Do not instantiate directly.
8
+ */
9
+ export declare class QueueRoom extends EventEmitter<QueueRoomEvents> {
10
+ /** Queue (room) name */
11
+ readonly name: string;
12
+ private _roomContext;
13
+ private _localWorkerId;
14
+ private _options;
15
+ private _jobStore;
16
+ private _workerManager;
17
+ private _presenceManager;
18
+ private _log;
19
+ /** @internal */
20
+ constructor(name: string, roomContext: RoomContext, localWorkerId: string, options: ResolvedQueueOptions, log: (...args: unknown[]) => void);
21
+ /** @internal Set the local actor ID once connected */
22
+ _setLocalActorId(actorId: string): void;
23
+ /**
24
+ * Add a new job to the queue. Only producers should call this.
25
+ */
26
+ addJob(opts: AddJobOptions): Job;
27
+ /**
28
+ * Claim a pending job. Only workers should call this.
29
+ */
30
+ claimJob(jobId: string): Job | null;
31
+ /**
32
+ * Report progress on an active job (0–100).
33
+ */
34
+ reportProgress(jobId: string, progress: number): void;
35
+ /**
36
+ * Mark a claimed/active job as completed with an optional result.
37
+ */
38
+ completeJob(jobId: string, result?: unknown): Job | null;
39
+ /**
40
+ * Mark an active job as failed with an optional error message.
41
+ * Automatically retries if attempts < maxAttempts.
42
+ */
43
+ failJob(jobId: string, error?: string): Job | null;
44
+ /**
45
+ * Get a single job by ID.
46
+ */
47
+ getJob(id: string): Job | undefined;
48
+ /**
49
+ * Get all jobs, optionally filtered.
50
+ */
51
+ getJobs(filter?: JobFilter): Job[];
52
+ /**
53
+ * Number of pending jobs.
54
+ */
55
+ get pendingCount(): number;
56
+ /**
57
+ * Number of active jobs.
58
+ */
59
+ get activeCount(): number;
60
+ /**
61
+ * All workers currently in this queue room.
62
+ */
63
+ get workers(): Map<string, QueueWorker>;
64
+ /**
65
+ * Get all workers in this queue room.
66
+ */
67
+ getWorkers(): QueueWorker[];
68
+ /** @internal Subscribe to jobs and progress topics, attach listeners */
69
+ _subscribe(): void;
70
+ /** @internal Set presence and fetch room members */
71
+ _activate(): void;
72
+ /** @internal Re-set presence after reconnect */
73
+ _updateLocalPresence(): void;
74
+ /** @internal Handle a presence:join event */
75
+ _handlePresenceJoin(actorTokenId: string, presenceData: QueuePresenceData): void;
76
+ /** @internal Handle a presence:leave event */
77
+ _handlePresenceLeave(actorTokenId: string): void;
78
+ /** @internal Handle a presence:update event */
79
+ _handlePresenceUpdate(actorTokenId: string, presenceData: QueuePresenceData): void;
80
+ /** @internal Unsubscribe and clean up */
81
+ _cleanup(): void;
82
+ private _handleJobMessage;
83
+ private _handleProgressMessage;
84
+ private _setPresence;
85
+ }
@@ -0,0 +1,42 @@
1
+ import type { QueueWorker } from './types';
2
+ /**
3
+ * Tracks all known queue workers (local and remote).
4
+ */
5
+ export declare class WorkerManager {
6
+ private _workers;
7
+ /**
8
+ * Add or replace a worker entry.
9
+ */
10
+ addWorker(worker: QueueWorker): void;
11
+ /**
12
+ * Remove a worker by workerId.
13
+ * Returns the removed worker, or null if not found.
14
+ */
15
+ removeWorker(workerId: string): QueueWorker | null;
16
+ /**
17
+ * Get a worker by workerId.
18
+ */
19
+ getWorker(workerId: string): QueueWorker | undefined;
20
+ /**
21
+ * Get all tracked workers.
22
+ */
23
+ getAll(): QueueWorker[];
24
+ /**
25
+ * Increment the active job count for a worker.
26
+ * Returns the updated worker or null if not found.
27
+ */
28
+ incrementActiveJobs(workerId: string): QueueWorker | null;
29
+ /**
30
+ * Decrement the active job count for a worker (floor 0).
31
+ * Returns the updated worker or null if not found.
32
+ */
33
+ decrementActiveJobs(workerId: string): QueueWorker | null;
34
+ /**
35
+ * Check whether a worker can accept more work (activeJobs < concurrency).
36
+ */
37
+ canAcceptWork(workerId: string): boolean;
38
+ /**
39
+ * Clear all tracked workers.
40
+ */
41
+ clear(): void;
42
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @nolag/queue — Browser entry point
3
+ */
4
+ export { NoLagQueue } from './NoLagQueue';
5
+ export { QueueRoom } from './QueueRoom';
6
+ export { JobStore } from './JobStore';
7
+ export { WorkerManager } from './WorkerManager';
8
+ export { PresenceManager } from './PresenceManager';
9
+ export { EventEmitter } from './EventEmitter';
10
+ export type { NoLagQueueOptions, ResolvedQueueOptions, WorkerRole, JobStatus, JobPriority, Job, AddJobOptions, JobProgress, QueueWorker, QueuePresenceData, QueueClientEvents, QueueRoomEvents, } from './types';
@@ -0,0 +1,2 @@
1
+ import{NoLag as e}from"@nolag/js-sdk";class t{constructor(){this._handlers=new Map}on(e,t){return this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t),this}off(e,t){return t?this._handlers.get(e)?.delete(t):this._handlers.delete(e),this}removeAllListeners(){return this._handlers.clear(),this}emit(e,...t){const o=this._handlers.get(e);if(o)for(const r of o)try{r(...t)}catch(t){console.error(`Error in ${String(e)} handler:`,t)}}listenerCount(e){return this._handlers.get(e)?.size??0}}const o={pending:["claimed"],claimed:["active"],active:["completed","failed"],failed:["pending"]};class r{constructor(e){this._jobs=new Map,this._maxSize=e}add(e){if(this._jobs.has(e.id))return!1;if(this._jobs.size>=this._maxSize){const e=this._jobs.keys().next().value;void 0!==e&&this._jobs.delete(e)}return this._jobs.set(e.id,e),!0}get(e){return this._jobs.get(e)}getAll(e){const t=Array.from(this._jobs.values());return e?t.filter(t=>(void 0===e.status||t.status===e.status)&&((void 0===e.type||t.type===e.type)&&(void 0===e.priority||t.priority===e.priority))):t}updateStatus(e,t,r){const s=this._jobs.get(e);if(!s)return null;const n=o[s.status];if(!n||!n.includes(t))return null;const i=Date.now(),c={...s,status:t,updatedAt:i,...r};return"completed"!==t&&"failed"!==t||(c.completedAt=i),this._jobs.set(e,c),c}updateProgress(e,t){const o=this._jobs.get(e);if(!o)return null;const r=Math.min(100,Math.max(0,t)),s={...o,progress:r,updatedAt:Date.now()};return this._jobs.set(e,s),s}get pendingCount(){let e=0;for(const t of this._jobs.values())"pending"===t.status&&e++;return e}get activeCount(){let e=0;for(const t of this._jobs.values())"active"===t.status&&e++;return e}has(e){return this._jobs.has(e)}get size(){return this._jobs.size}clear(){this._jobs.clear()}}class s{constructor(){this._workers=new Map}addWorker(e){this._workers.set(e.workerId,e)}removeWorker(e){const t=this._workers.get(e)??null;return this._workers.delete(e),t}getWorker(e){return this._workers.get(e)}getAll(){return Array.from(this._workers.values())}incrementActiveJobs(e){const t=this._workers.get(e);if(!t)return null;const o={...t,activeJobs:t.activeJobs+1};return this._workers.set(e,o),o}decrementActiveJobs(e){const t=this._workers.get(e);if(!t)return null;const o={...t,activeJobs:Math.max(0,t.activeJobs-1)};return this._workers.set(e,o),o}canAcceptWork(e){const t=this._workers.get(e);return!!t&&t.activeJobs<t.concurrency}clear(){this._workers.clear()}}class n{constructor(e){this._workers=new Map,this._actorToWorkerId=new Map,this._localActorId=e}addFromPresence(e,t,o){if(e===this._localActorId)return null;const r=this._actorToWorkerId.get(e),s=t.workerId||r||e,n={workerId:s,actorTokenId:e,role:t.role,activeJobs:t.activeJobs??0,concurrency:t.concurrency??1,metadata:t.metadata,joinedAt:o||Date.now(),isLocal:!1};return this._workers.set(s,n),this._actorToWorkerId.set(e,s),n}removeByActorId(e){if(e===this._localActorId)return null;const t=this._actorToWorkerId.get(e);if(!t)return null;const o=this._workers.get(t)??null;return this._workers.delete(t),this._actorToWorkerId.delete(e),o}getWorker(e){return this._workers.get(e)}getWorkerByActorId(e){const t=this._actorToWorkerId.get(e);return t?this._workers.get(t):void 0}getAll(){return Array.from(this._workers.values())}get workers(){return this._workers}clear(){this._workers.clear(),this._actorToWorkerId.clear()}}function i(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"xxxx-xxxx-xxxx-xxxx".replace(/x/g,()=>Math.floor(16*Math.random()).toString(16))}function c(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const a="jobs",h="_progress";class l extends t{constructor(e,t,o,i,c){super(),this.name=e,this._roomContext=t,this._localWorkerId=o,this._options=i,this._log=c,this._jobStore=new r(i.maxJobCache),this._workerManager=new s,this._presenceManager=new n("")}_setLocalActorId(e){this._presenceManager=new n(e)}addJob(e){const t=Date.now(),o={id:i(),type:e.type,payload:e.payload,priority:e.priority??"normal",status:"pending",progress:0,attempts:0,maxAttempts:e.maxAttempts??3,createdBy:this._localWorkerId,createdAt:t,updatedAt:t,isReplay:!1};return this._jobStore.add(o),this._log("Job added:",o.id,o.type),this._roomContext.emit(a,{event:"jobAdded",job:o},{echo:!0}),this.emit("jobAdded",o),o}claimJob(e){const t=this._jobStore.updateStatus(e,"claimed",{claimedBy:this._localWorkerId});return t?(this._log("Job claimed:",e,"by",this._localWorkerId),this._roomContext.emit(a,{event:"jobClaimed",job:t},{echo:!0}),this.emit("jobClaimed",t),t):null}reportProgress(e,t){const o=this._jobStore.updateProgress(e,t);if(!o)return;const r={jobId:e,progress:o.progress,workerId:this._localWorkerId,timestamp:Date.now()};this._log("Job progress:",e,o.progress+"%"),this._roomContext.emit(h,r,{echo:!0}),this.emit("jobProgress",r)}completeJob(e,t){let o=this._jobStore.updateStatus(e,"active");if(o||(o=this._jobStore.get(e)??null),!o)return null;const r=this._jobStore.updateStatus(e,"completed",{result:t});return r?(this._log("Job completed:",e),this._roomContext.emit(a,{event:"jobCompleted",job:r},{echo:!0}),this.emit("jobCompleted",r),r):null}failJob(e,t){const o=this._jobStore.get(e);if(!o)return null;"claimed"===o.status&&this._jobStore.updateStatus(e,"active");const r=o.attempts+1,s=this._jobStore.updateStatus(e,"failed",{error:t,attempts:r});if(!s)return null;if(this._log("Job failed:",e,"attempts:",r,"/",s.maxAttempts),this._roomContext.emit(a,{event:"jobFailed",job:s},{echo:!0}),this.emit("jobFailed",s),r<s.maxAttempts){const t=this._jobStore.updateStatus(e,"pending");t&&(this._log("Job retrying:",e,"attempt",r+1),this._roomContext.emit(a,{event:"jobRetrying",job:t},{echo:!0}),this.emit("jobRetrying",t))}return s}getJob(e){return this._jobStore.get(e)}getJobs(e){return this._jobStore.getAll(e)}get pendingCount(){return this._jobStore.pendingCount}get activeCount(){return this._jobStore.activeCount}get workers(){return this._presenceManager.workers}getWorkers(){return this._presenceManager.getAll()}_subscribe(){if(this._log("Room subscribe:",this.name),"worker"===this._options.role){const e=this._options.loadBalanceGroup??`queue-workers-${this.name}`;this._log("Subscribing with load balance, group:",e),this._roomContext.subscribe(a,{loadBalance:!0,loadBalanceGroup:e})}else this._roomContext.subscribe(a);this._roomContext.subscribe(h),this._roomContext.on(a,e=>{this._handleJobMessage(e)}),this._roomContext.on(h,e=>{this._handleProgressMessage(e)})}_activate(){this._log("Room activate:",this.name),this._setPresence(),this._roomContext.fetchPresence().then(e=>{this._log("Room presence fetched:",this.name,e.length,"actors");for(const t of e)if(t.presence){const e=this._presenceManager.addFromPresence(t.actorTokenId,t.presence,t.joinedAt);e&&(this._workerManager.addWorker(e),this.emit("workerJoined",e))}}).catch(e=>{this._log("Failed to fetch room presence:",e)})}_updateLocalPresence(){this._setPresence()}_handlePresenceJoin(e,t){const o=this._presenceManager.addFromPresence(e,t);o&&(this._log("Worker joined queue:",this.name,o.workerId),this._workerManager.addWorker(o),this.emit("workerJoined",o))}_handlePresenceLeave(e){const t=this._presenceManager.removeByActorId(e);t&&(this._log("Worker left queue:",this.name,t.workerId),this._workerManager.removeWorker(t.workerId),this.emit("workerLeft",t))}_handlePresenceUpdate(e,t){const o=this._presenceManager.addFromPresence(e,t);o&&this._workerManager.addWorker(o)}_cleanup(){this._log("Room cleanup:",this.name),this._roomContext.unsubscribe(a),this._roomContext.unsubscribe(h),this._roomContext.off(a),this._roomContext.off(h),this._jobStore.clear(),this._workerManager.clear(),this._presenceManager.clear(),this.removeAllListeners()}_handleJobMessage(e){const t=e;if(!t?.event||!t?.job)return;const{event:o,job:r}=t;switch(this._log("Job message:",o,r.id),o){case"jobAdded":this._jobStore.add(r)&&this.emit("jobAdded",r);break;case"jobClaimed":if(this._jobStore.get(r.id)){this._jobStore.updateStatus(r.id,"claimed",{claimedBy:r.claimedBy});const e=this._jobStore.get(r.id);this.emit("jobClaimed",e)}break;case"jobCompleted":{const e=this._jobStore.get(r.id);if(e){const t={...e,...r};this._jobStore.add(t),this.emit("jobCompleted",t)}break}case"jobFailed":{const e=this._jobStore.get(r.id);if(e){const t={...e,...r};this._jobStore.add(t),this.emit("jobFailed",t)}break}case"jobRetrying":{const e=this._jobStore.get(r.id);if(e){const t={...e,...r};this._jobStore.add(t),this.emit("jobRetrying",t)}break}}}_handleProgressMessage(e){const t=e;t?.jobId&&(this._jobStore.updateProgress(t.jobId,t.progress),this._log("Job progress update:",t.jobId,t.progress+"%"),this.emit("jobProgress",t))}_setPresence(){const e={workerId:this._localWorkerId,role:this._options.role,activeJobs:0,concurrency:this._options.concurrency,metadata:this._options.metadata};this._roomContext.setPresence(e)}}class d extends t{constructor(e,t={}){super(),this._client=null,this._localWorker=null,this._queues=new Map,this._lobby=null,this._onlineWorkers=new Map,this._actorToWorkerId=new Map,this._token=e,this._workerId=t.workerId??i(),this._options={workerId:this._workerId,role:t.role??"monitor",concurrency:t.concurrency??1,metadata:t.metadata,appName:t.appName??"queue",url:t.url,maxJobCache:t.maxJobCache??1e3,debug:t.debug??!1,reconnect:t.reconnect??!0,queues:t.queues??[],loadBalanceGroup:t.loadBalanceGroup},this._log=c("NoLagQueue",this._options.debug)}get connected(){return this._client?.connected??!1}get localWorker(){return this._localWorker}get queues(){return this._queues}async connect(){this._log("Connecting...");const t={debug:this._options.debug,reconnect:this._options.reconnect};this._options.url&&(t.url=this._options.url),this._client=e(this._token,t),this._client.on("connect",()=>{this._log("Connected"),this._queues.size>0&&(this._log("Reconnected — restoring queues..."),this._restoreQueues(),this.emit("reconnected"))}),this._client.on("disconnect",e=>{this._log("Disconnected:",e),this.emit("disconnected",e)}),this._client.on("reconnect",()=>{this._log("Reconnecting...")}),this._client.on("error",e=>{this._log("Error:",e),this.emit("error",e)}),await this._client.connect(),this._client.on("presence:join",e=>{this._handleRoomPresenceJoin(e)}),this._client.on("presence:leave",e=>{this._handleRoomPresenceLeave(e)}),this._client.on("presence:update",e=>{this._handleRoomPresenceUpdate(e)}),this._localWorker={workerId:this._workerId,actorTokenId:this._client.actorId,role:this._options.role,activeJobs:0,concurrency:this._options.concurrency,metadata:this._options.metadata,joinedAt:Date.now(),isLocal:!0},this._log("Local worker:",this._localWorker.workerId,"→",this._localWorker.actorTokenId),await this._setupLobby(),this.emit("connected"),setTimeout(()=>{this._lobby&&this._client?.connected&&this._lobby.fetchPresence().then(e=>{this._hydrateOnlineWorkers(e)}).catch(()=>{})},2e3)}disconnect(){this._log("Disconnecting...");for(const e of[...this._queues.keys()])this.leaveQueue(e);this._lobby?.unsubscribe(),this._lobby=null,this._client?.disconnect(),this._client=null,this._onlineWorkers.clear(),this._actorToWorkerId.clear(),this._localWorker=null}joinQueue(e){if(!this._client||!this._localWorker)throw new Error("Not connected — call connect() first");let t=this._queues.get(e);return t||(t=this._subscribeQueue(e),t._activate()),t}leaveQueue(e){const t=this._queues.get(e);t&&(this._log("Leaving queue:",e),t._cleanup(),this._queues.delete(e))}getQueues(){return Array.from(this._queues.values())}getOnlineWorkers(){return Array.from(this._onlineWorkers.values())}_subscribeQueue(e){if(!this._client||!this._localWorker)throw new Error("Not connected — call connect() first");this._log("Subscribing queue:",e);const t=this._client.setApp(this._options.appName).setRoom(e),o=new l(e,t,this._workerId,this._options,c(`QueueRoom:${e}`,this._options.debug));return o._setLocalActorId(this._localWorker.actorTokenId),this._queues.set(e,o),o._subscribe(),o}_handleRoomPresenceJoin(e){if(e.actorTokenId===this._localWorker?.actorTokenId)return;const t=e.presence;if(!t?.workerId)return;const o=this._presenceToWorker(e.actorTokenId,t);this._actorToWorkerId.set(e.actorTokenId,o.workerId),this._onlineWorkers.has(o.workerId)||(this._onlineWorkers.set(o.workerId,o),this.emit("workerOnline",o));for(const o of this._queues.values())o._handlePresenceJoin(e.actorTokenId,t)}_handleRoomPresenceLeave(e){if(e.actorTokenId!==this._localWorker?.actorTokenId)for(const t of this._queues.values())t._handlePresenceLeave(e.actorTokenId)}_handleRoomPresenceUpdate(e){if(e.actorTokenId===this._localWorker?.actorTokenId)return;const t=e.presence;if(t?.workerId){if(this._onlineWorkers.has(t.workerId)){const o=this._presenceToWorker(e.actorTokenId,t);this._onlineWorkers.set(o.workerId,o)}for(const o of this._queues.values())o._handlePresenceUpdate(e.actorTokenId,t)}}async _setupLobby(){if(!this._client)return;this._lobby=this._client.setApp(this._options.appName).setLobby("online");const e=e=>t=>{const o=t;"join"===e?this._handleLobbyJoin(o):"leave"===e?this._handleLobbyLeave(o):this._handleLobbyUpdate(o)};this._client.on("lobbyPresence:join",e("join")),this._client.on("lobbyPresence:leave",e("leave")),this._client.on("lobbyPresence:update",e("update"));try{const e=await this._lobby.subscribe();this._hydrateOnlineWorkers(e),this._log("Lobby subscribed, online workers:",this._onlineWorkers.size)}catch(e){this._log("Lobby subscription failed:",e)}}_handleLobbyJoin(e){const{actorId:t,data:o}=e;if(t===this._localWorker?.actorTokenId)return;const r=o;if(!r.workerId)return;const s=this._presenceToWorker(t,r);this._actorToWorkerId.set(t,s.workerId),this._onlineWorkers.has(s.workerId)||(this._onlineWorkers.set(s.workerId,s),this.emit("workerOnline",s))}_handleLobbyLeave(e){const{actorId:t,data:o}=e;if(t===this._localWorker?.actorTokenId)return;const r=o,s=r?.workerId||this._actorToWorkerId.get(t)||this._findWorkerIdByActorId(t);if(s){const e=this._onlineWorkers.get(s);e&&(this._onlineWorkers.delete(s),this._actorToWorkerId.delete(t),this.emit("workerOffline",e))}}_handleLobbyUpdate(e){const{actorId:t,data:o}=e;if(t===this._localWorker?.actorTokenId)return;const r=o;if(!r.workerId)return;const s=this._presenceToWorker(t,r);this._onlineWorkers.set(s.workerId,s)}_hydrateOnlineWorkers(e){for(const t of Object.keys(e)){const o=e[t];for(const e of Object.keys(o)){if(e===this._localWorker?.actorTokenId)continue;const t=o[e],r=t?.presence??t;if(r?.workerId){const t=this._presenceToWorker(e,r);this._actorToWorkerId.set(e,t.workerId),this._onlineWorkers.has(t.workerId)||(this._onlineWorkers.set(t.workerId,t),this.emit("workerOnline",t))}}}}_presenceToWorker(e,t){return{workerId:t.workerId,actorTokenId:e,role:t.role,activeJobs:t.activeJobs??0,concurrency:t.concurrency??1,metadata:t.metadata,joinedAt:Date.now(),isLocal:!1}}_findWorkerIdByActorId(e){for(const t of this._onlineWorkers.values())if(t.actorTokenId===e)return t.workerId}_restoreQueues(){for(const e of this._queues.values())e._updateLocalPresence();this._lobby?.fetchPresence().then(e=>{this._onlineWorkers.clear(),this._actorToWorkerId.clear(),this._hydrateOnlineWorkers(e)}).catch(e=>{this._log("Failed to re-fetch lobby presence:",e)})}}export{t as EventEmitter,r as JobStore,d as NoLagQueue,n as PresenceManager,l as QueueRoom,s as WorkerManager};
2
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/JobStore.ts","../src/WorkerManager.ts","../src/PresenceManager.ts","../src/utils.ts","../src/constants.ts","../src/QueueRoom.ts","../src/NoLagQueue.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["EventEmitter","constructor","this","_handlers","Map","on","event","handler","has","set","Set","get","add","off","delete","removeAllListeners","clear","emit","args","handlers","e","console","error","String","listenerCount","size","VALID_TRANSITIONS","pending","claimed","active","failed","JobStore","maxSize","_jobs","_maxSize","job","id","firstKey","keys","next","value","undefined","getAll","filter","jobs","Array","from","values","status","type","priority","updateStatus","data","allowed","includes","now","Date","updated","updatedAt","completedAt","updateProgress","progress","clamped","Math","min","max","pendingCount","count","activeCount","WorkerManager","_workers","addWorker","worker","workerId","removeWorker","getWorker","incrementActiveJobs","activeJobs","decrementActiveJobs","canAcceptWork","concurrency","PresenceManager","localActorId","_actorToWorkerId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","existing","role","metadata","isLocal","removeByActorId","getWorkerByActorId","workers","generateId","crypto","randomUUID","replace","floor","random","toString","createLogger","prefix","enabled","log","_args","TOPIC_JOBS","TOPIC_PROGRESS","QueueRoom","name","roomContext","localWorkerId","options","super","_roomContext","_localWorkerId","_options","_log","_jobStore","maxJobCache","_workerManager","_presenceManager","_setLocalActorId","actorId","addJob","opts","payload","attempts","maxAttempts","createdBy","createdAt","isReplay","echo","claimJob","jobId","claimedBy","reportProgress","progressEvent","timestamp","completeJob","result","completed","failJob","nextAttempts","retried","getJob","getJobs","getWorkers","_subscribe","group","loadBalanceGroup","subscribe","loadBalance","_handleJobMessage","_handleProgressMessage","_activate","_setPresence","fetchPresence","then","actors","length","actor","catch","err","_updateLocalPresence","_handlePresenceJoin","presenceData","_handlePresenceLeave","_handlePresenceUpdate","_cleanup","unsubscribe","msg","synced","setPresence","NoLagQueue","token","_client","_localWorker","_queues","_lobby","_onlineWorkers","_token","_workerId","appName","url","debug","reconnect","queues","connected","localWorker","connect","clientOptions","NoLag","_restoreQueues","reason","_handleRoomPresenceJoin","_handleRoomPresenceLeave","_handleRoomPresenceUpdate","_setupLobby","setTimeout","state","_hydrateOnlineWorkers","disconnect","leaveQueue","joinQueue","Error","room","_subscribeQueue","getQueues","getOnlineWorkers","setApp","setRoom","_presenceToWorker","setLobby","lobbyHandler","_handleLobbyJoin","_handleLobbyLeave","_handleLobbyUpdate","initialState","_findWorkerIdByActorId","roomId","Object","roomPresence","raw"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Default app name for NoLag queue SDK */
2
+ export declare const DEFAULT_APP_NAME = "queue";
3
+ /** Default maximum number of jobs to cache in memory */
4
+ export declare const DEFAULT_MAX_JOB_CACHE = 1000;
5
+ /** Default maximum number of attempts before a job is permanently failed */
6
+ export declare const DEFAULT_MAX_ATTEMPTS = 3;
7
+ /** Topic name for job lifecycle messages within a queue room */
8
+ export declare const TOPIC_JOBS = "jobs";
9
+ /** Topic name for job progress updates within a queue room */
10
+ export declare const TOPIC_PROGRESS = "_progress";
11
+ /** Lobby ID for global online presence */
12
+ export declare const LOBBY_ID = "online";