@nolag/queue 0.1.2 → 1.0.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 CHANGED
@@ -24,55 +24,76 @@ npm install @nolag/js-sdk @nolag/queue
24
24
 
25
25
  ## Quick Start
26
26
 
27
+ The app owns one core NoLag client; wrappers attach to it. Any number of
28
+ wrapper SDKs (queue, chat, notify, ...) can share the same connection as
29
+ long as each uses its own app.
30
+
27
31
  ```typescript
32
+ import { NoLag } from "@nolag/js-sdk";
28
33
  import { NoLagQueue } from "@nolag/queue";
29
34
 
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
- });
35
+ // One client for the whole app. In a browser, use a token provider so the
36
+ // SDK can mint fresh short-lived client tokens from your backend.
37
+ const client = NoLag(async () => (await (await fetch("/api/nolag-token")).json()).token);
40
38
 
41
39
  // --- Worker: processes jobs ---
42
- const worker = new NoLagQueue("WORKER_TOKEN", {
43
- role: "worker",
44
- concurrency: 3,
45
- });
46
- await worker.connect();
40
+ const queue = new NoLagQueue({ client, role: "worker", concurrency: 3 });
47
41
 
48
- const workerQueue = worker.joinQueue("image-processing");
42
+ await client.connect(); // the app owns the connection
43
+ await queue.ready(); // wrapper setup done (identity, presence, queues)
49
44
 
50
- workerQueue.on("jobAdded", (job) => {
51
- const claimed = workerQueue.claimJob(job.id);
45
+ const room = queue.joinQueue("image-processing");
46
+
47
+ room.on("jobAdded", (job) => {
48
+ const claimed = room.claimJob(job.id);
52
49
  if (claimed) {
53
50
  processImage(claimed.payload, (progress) => {
54
- workerQueue.reportProgress(job.id, progress);
51
+ room.reportProgress(job.id, progress);
55
52
  }).then((result) => {
56
- workerQueue.completeJob(job.id, result);
53
+ room.completeJob(job.id, result);
57
54
  }).catch((err) => {
58
- workerQueue.failJob(job.id, err.message);
55
+ room.failJob(job.id, err.message);
59
56
  });
60
57
  }
61
58
  });
62
59
 
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);
60
+ // --- Producer: adds jobs (uses the SAME client, its own wrapper) ---
61
+ const producer = new NoLagQueue({ client, role: "producer" });
62
+ await producer.ready();
63
+ producer.joinQueue("image-processing").addJob({
64
+ type: "resize",
65
+ payload: { imageUrl: "https://example.com/photo.jpg", width: 800 },
66
+ priority: "high",
73
67
  });
68
+
69
+ // See who's online
70
+ queue.on("workerOnline", (w) => console.log(`Worker ${w.workerId} online`));
71
+
72
+ // Teardown: the wrapper releases its handlers and topics; the app closes
73
+ // the socket (never the other way around).
74
+ queue.detach();
75
+ client.disconnect();
74
76
  ```
75
77
 
78
+ ## Lifecycle
79
+
80
+ - **Construction = attach.** The wrapper wires its handlers onto the injected
81
+ client immediately. If the client is already connected, setup runs on the
82
+ next microtask; otherwise it runs when the client's `connect` event fires.
83
+ - **`ready()`** resolves once the first setup completed (identity, online
84
+ lobby, configured queues). Auth failures surface via your own
85
+ `await client.connect()`, not via `ready()`.
86
+ - **Reconnects are automatic.** The wrapper restores worker presence and
87
+ reconciles the online-worker list, emitting only real deltas.
88
+ - **`detach()`** removes exactly this wrapper's handlers and topics and never
89
+ touches the socket. It is terminal: construct a new instance to re-attach.
90
+ Detach while the client is still connected so server-side unsubscribes go
91
+ through. In frameworks, call it from your dispose hook (`onUnmounted`,
92
+ HMR dispose).
93
+ - **One wrapper per (client, app).** Sharing a client across wrappers of
94
+ DIFFERENT apps is the intended pattern; two wrappers on the same app would
95
+ collide on topics and presence (the SDK warns if you do this).
96
+
76
97
  ## API Reference
77
98
 
78
99
  ### `NoLagQueue`
@@ -80,41 +101,51 @@ monitorQueue.on("jobCompleted", (job) => {
80
101
  #### Constructor
81
102
 
82
103
  ```typescript
83
- const queue = new NoLagQueue(token: string, options?: NoLagQueueOptions);
104
+ const queue = new NoLagQueue(options: NoLagQueueOptions);
84
105
  ```
85
106
 
86
107
  **Options:**
87
108
 
88
109
  | Option | Type | Default | Description |
89
110
  |--------|------|---------|-------------|
111
+ | `client` | `NoLagSocket` | *required* | The injected core NoLag client |
90
112
  | `workerId` | `string` | auto-generated | Unique worker ID |
91
113
  | `role` | `WorkerRole` | `'monitor'` | `'producer'`, `'worker'`, or `'monitor'` |
92
114
  | `concurrency` | `number` | `1` | Max concurrent jobs (workers) |
93
115
  | `metadata` | `Record<string, unknown>` | — | Custom data |
116
+ | `appName` | `string` | `'queue'` | NoLag app for topic prefixes |
94
117
  | `queues` | `string[]` | — | Auto-join these queues on connect |
95
118
  | `maxJobCache` | `number` | `1000` | Max jobs kept in memory |
96
- | `loadBalanceGroup` | `string` | — | Worker partitioning group |
119
+ | `loadBalanceGroup` | `string` | — | Worker partitioning group (subscribe-level) |
97
120
  | `debug` | `boolean` | `false` | Enable debug logging |
98
- | `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
99
121
 
100
122
  #### Methods
101
123
 
102
124
  | Method | Returns | Description |
103
125
  |--------|---------|-------------|
104
- | `connect()` | `Promise<void>` | Connect to NoLag |
105
- | `disconnect()` | `void` | Disconnect |
126
+ | `ready()` | `Promise<void>` | Resolves when wrapper setup completed |
127
+ | `detach()` | `void` | Release handlers and topics (terminal; never closes the socket) |
106
128
  | `joinQueue(name)` | `QueueRoom` | Join a queue |
107
129
  | `leaveQueue(name)` | `void` | Leave a queue |
108
130
  | `getQueues()` | `QueueRoom[]` | Get all joined queues |
109
131
  | `getOnlineWorkers()` | `QueueWorker[]` | Get online workers |
110
132
 
133
+ #### Properties
134
+
135
+ | Property | Type | Description |
136
+ |----------|------|-------------|
137
+ | `connected` | `boolean` | Whether currently connected |
138
+ | `localWorker` | `QueueWorker \| null` | The local worker |
139
+ | `queues` | `Map<string, QueueRoom>` | All joined queues |
140
+
111
141
  #### Events
112
142
 
113
143
  | Event | Payload | Description |
114
144
  |-------|---------|-------------|
115
145
  | `connected` | — | Connected |
116
- | `disconnected` | | Disconnected |
117
- | `reconnected` | — | Reconnected |
146
+ | `disconnected` | `string` | Disconnected |
147
+ | `reconnecting` | — | Reconnect attempt started |
148
+ | `reconnected` | — | Reconnected after disconnect |
118
149
  | `error` | `Error` | Error |
119
150
  | `workerOnline` | `QueueWorker` | Worker came online |
120
151
  | `workerOffline` | `QueueWorker` | Worker went offline |
@@ -1,3 +1,4 @@
1
+ import type { NoLagSocket } from '@nolag/js-sdk';
1
2
  import { EventEmitter } from './EventEmitter';
2
3
  import { QueueRoom } from './QueueRoom';
3
4
  import type { NoLagQueueOptions, QueueClientEvents, QueueWorker } from './types';
@@ -7,29 +8,37 @@ import type { NoLagQueueOptions, QueueClientEvents, QueueWorker } from './types'
7
8
  * Provides job lifecycle management, progress tracking, worker management,
8
9
  * and global presence tracking — all framework-agnostic via events.
9
10
  *
11
+ * The wrapper NEVER manages the connection. The app owns one core NoLag
12
+ * client (shared by any number of wrappers on distinct apps) and the
13
+ * wrapper attaches to it at construction and releases it via `detach()`.
14
+ *
10
15
  * @example
11
16
  * ```typescript
17
+ * import { NoLag } from '@nolag/js-sdk';
12
18
  * import { NoLagQueue } from '@nolag/queue';
13
19
  *
14
- * const queue = new NoLagQueue(token, { role: 'worker', concurrency: 2 });
20
+ * const client = NoLag(async () => (await (await fetch('/api/nolag-token')).json()).token);
21
+ * const queue = new NoLagQueue({ client, role: 'worker', concurrency: 2 });
15
22
  *
16
23
  * queue.on('connected', () => console.log('Connected!'));
17
24
  *
18
- * await queue.connect();
25
+ * await client.connect(); // the app owns the connection
26
+ * await queue.ready(); // wrapper setup done (identity, lobby, queues)
19
27
  *
20
28
  * const room = queue.joinQueue('image-processing');
21
29
  * room.on('jobAdded', (job) => {
22
30
  * room.claimJob(job.id);
23
- * // process...
24
31
  * room.reportProgress(job.id, 50);
25
32
  * room.completeJob(job.id, { output: 'result' });
26
33
  * });
34
+ *
35
+ * queue.detach(); // wrapper releases its handlers and topics
36
+ * client.disconnect(); // the app closes the socket
27
37
  * ```
28
38
  */
29
39
  export declare class NoLagQueue extends EventEmitter<QueueClientEvents> {
30
- private _token;
31
- private _options;
32
40
  private _client;
41
+ private _options;
33
42
  private _localWorker;
34
43
  private _queues;
35
44
  private _lobby;
@@ -37,21 +46,54 @@ export declare class NoLagQueue extends EventEmitter<QueueClientEvents> {
37
46
  private _actorToWorkerId;
38
47
  private _workerId;
39
48
  private _log;
40
- constructor(token: string, options?: NoLagQueueOptions);
41
- /** Whether the underlying connection is established */
49
+ private _epoch;
50
+ private _detached;
51
+ private _isReady;
52
+ private _readyResolve;
53
+ private _readyReject;
54
+ private _readyPromise;
55
+ private _lobbyRefreshTimer;
56
+ private _onConnectRef;
57
+ private _onDisconnectRef;
58
+ private _onReconnectRef;
59
+ private _onErrorRef;
60
+ private _onPresenceJoinRef;
61
+ private _onPresenceLeaveRef;
62
+ private _onPresenceUpdateRef;
63
+ private _onLobbyJoinRef;
64
+ private _onLobbyLeaveRef;
65
+ private _onLobbyUpdateRef;
66
+ constructor(options: NoLagQueueOptions);
67
+ /** Whether the underlying connection is established (connected ≠ ready) */
42
68
  get connected(): boolean;
43
- /** The local worker's info (available after connect) */
69
+ /** The injected core client (owned by the app, not the wrapper) */
70
+ get client(): NoLagSocket;
71
+ /** The local worker's info (available after ready) */
44
72
  get localWorker(): QueueWorker | null;
45
73
  /** All currently joined queue rooms */
46
74
  get queues(): Map<string, QueueRoom>;
47
75
  /**
48
- * Connect to NoLag and set up global presence.
76
+ * Resolves once the wrapper's first setup completed (identity, lobby and
77
+ * configured queues ready — equivalently, once 'connected' has fired).
78
+ * Rejects only if detach() is called before that. Client auth failures
79
+ * surface via the app's own `await client.connect()`, not here.
80
+ */
81
+ ready(): Promise<void>;
82
+ /**
83
+ * Detach from the client: remove every handler this wrapper added,
84
+ * unsubscribe its topics and lobby (when connected), clear state.
85
+ * Terminal and idempotent; never touches the socket. To use the queue
86
+ * again, construct a new instance.
49
87
  */
50
- connect(): Promise<void>;
88
+ detach(): void;
89
+ private _onConnect;
51
90
  /**
52
- * Disconnect from NoLag and clean up all queue rooms.
91
+ * One setup pass per connection epoch. Serves both initial setup (epoch 1)
92
+ * and reconnect restore (epoch > 1). Aborts silently whenever a newer
93
+ * epoch started or the wrapper detached — checked after every await.
53
94
  */
54
- disconnect(): void;
95
+ private _runSetup;
96
+ private _scheduleLobbyRefresh;
55
97
  /**
56
98
  * Join a queue room. Creates, subscribes, and activates it.
57
99
  * Returns an existing room if already joined.
@@ -69,16 +111,27 @@ export declare class NoLagQueue extends EventEmitter<QueueClientEvents> {
69
111
  * Get all workers currently online across all queue rooms.
70
112
  */
71
113
  getOnlineWorkers(): QueueWorker[];
114
+ private _assertUsable;
72
115
  private _subscribeQueue;
116
+ /**
117
+ * On a shared client, presence events from other apps' wrappers arrive on
118
+ * the same connection-level events. Wrappers stamp their presence with a
119
+ * `__scope` (their appName); a mismatched tag means another app's data.
120
+ * Untagged presence is accepted (older peers in this same app).
121
+ */
122
+ private _foreignScope;
73
123
  private _handleRoomPresenceJoin;
74
124
  private _handleRoomPresenceLeave;
75
125
  private _handleRoomPresenceUpdate;
76
- private _setupLobby;
77
126
  private _handleLobbyJoin;
78
127
  private _handleLobbyLeave;
79
128
  private _handleLobbyUpdate;
80
- private _hydrateOnlineWorkers;
129
+ /**
130
+ * Reconcile the online-worker map against a fresh lobby snapshot, emitting
131
+ * only the deltas (workerOffline for vanished, workerOnline for new). One
132
+ * path for initial hydration, reconnect restore, and the deferred refetch.
133
+ */
134
+ private _diffHydrateOnlineWorkers;
81
135
  private _presenceToWorker;
82
136
  private _findWorkerIdByActorId;
83
- private _restoreQueues;
84
137
  }
@@ -17,8 +17,11 @@ export declare class QueueRoom extends EventEmitter<QueueRoomEvents> {
17
17
  private _workerManager;
18
18
  private _presenceManager;
19
19
  private _log;
20
+ private _isConnected;
21
+ private _onJobsRef;
22
+ private _onProgressRef;
20
23
  /** @internal */
21
- constructor(name: string, roomContext: RoomContext, localWorkerId: string, options: ResolvedQueueOptions, log: (...args: unknown[]) => void);
24
+ constructor(name: string, roomContext: RoomContext, localWorkerId: string, options: ResolvedQueueOptions, log: (...args: unknown[]) => void, isConnected: () => boolean);
22
25
  /** @internal Set the local actor ID once connected */
23
26
  _setLocalActorId(actorId: string): void;
24
27
  /**
package/dist/browser.js CHANGED
@@ -1,2 +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};
1
+ class e{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 t={pending:["claimed"],claimed:["active"],active:["completed","failed"],failed:["pending"]};class o{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,o,r){const s=this._jobs.get(e);if(!s)return null;const i=t[s.status];if(!i||!i.includes(o))return null;const n=Date.now(),c={...s,status:o,updatedAt:n,...r};return"completed"!==o&&"failed"!==o||(c.completedAt=n),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 r{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 s{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,i={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,i),this._actorToWorkerId.set(e,s),i}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 n(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const c=new WeakMap;const a="jobs",h="_progress";class _ extends e{constructor(e,t,i,n,c,a){super(),this._onJobsRef=null,this._onProgressRef=null,this.name=e,this._roomContext=t,this._localWorkerId=i,this._options=n,this._log=c,this._isConnected=a,this._jobStore=new o(n.maxJobCache),this._workerManager=new r,this._presenceManager=new s("")}_setLocalActorId(e){this._presenceManager=new s(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._onJobsRef=e=>{this._handleJobMessage(e)},this._roomContext.on(a,this._onJobsRef),this._onProgressRef=e=>{this._handleProgressMessage(e)},this._roomContext.on(h,this._onProgressRef)}_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._isConnected()&&(this._roomContext.unsubscribe(a),this._roomContext.unsubscribe(h)),this._onJobsRef&&this._roomContext.off(a,this._onJobsRef),this._onProgressRef&&this._roomContext.off(h,this._onProgressRef),this._onJobsRef=null,this._onProgressRef=null,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,__scope:this._options.appName};this._roomContext.setPresence(e)}}class l extends e{constructor(e){if(super(),this._localWorker=null,this._queues=new Map,this._lobby=null,this._onlineWorkers=new Map,this._actorToWorkerId=new Map,this._epoch=0,this._detached=!1,this._isReady=!1,this._lobbyRefreshTimer=null,this._onConnectRef=()=>this._onConnect(),this._onDisconnectRef=e=>{this._log("Disconnected:",e),this.emit("disconnected",e)},this._onReconnectRef=()=>{this._log("Reconnecting..."),this.emit("reconnecting")},this._onErrorRef=e=>{this._log("Error:",e),this.emit("error",e)},this._onPresenceJoinRef=e=>this._handleRoomPresenceJoin(e),this._onPresenceLeaveRef=e=>this._handleRoomPresenceLeave(e),this._onPresenceUpdateRef=e=>this._handleRoomPresenceUpdate(e),this._onLobbyJoinRef=e=>this._handleLobbyJoin(e),this._onLobbyLeaveRef=e=>this._handleLobbyLeave(e),this._onLobbyUpdateRef=e=>this._handleLobbyUpdate(e),!e?.client)throw new TypeError("NoLagQueue requires an injected NoLag client: new NoLagQueue({ client, role, ... })");this._client=e.client,this._workerId=e.workerId??i(),this._options={workerId:this._workerId,role:e.role??"monitor",concurrency:e.concurrency??1,metadata:e.metadata,appName:e.appName??"queue",maxJobCache:e.maxJobCache??1e3,debug:e.debug??!1,queues:e.queues??[],loadBalanceGroup:e.loadBalanceGroup},this._log=n("NoLagQueue",this._options.debug),this._readyPromise=new Promise((e,t)=>{this._readyResolve=e,this._readyReject=t}),this._readyPromise.catch(()=>{}),function(e,t,o){let r=c.get(e);r||(r=new Map,c.set(e,r));const s=r.get(t);s&&console.warn(`[${o}] Another wrapper (${s}) is already attached to this client for app "${t}". Use one wrapper per (client, app) — detach the other instance first.`),r.set(t,o)}(this._client,this._options.appName,"NoLagQueue"),this._client.on("connect",this._onConnectRef),this._client.on("disconnect",this._onDisconnectRef),this._client.on("reconnect",this._onReconnectRef),this._client.on("error",this._onErrorRef),this._client.on("presence:join",this._onPresenceJoinRef),this._client.on("presence:leave",this._onPresenceLeaveRef),this._client.on("presence:update",this._onPresenceUpdateRef),this._client.on("lobbyPresence:join",this._onLobbyJoinRef),this._client.on("lobbyPresence:leave",this._onLobbyLeaveRef),this._client.on("lobbyPresence:update",this._onLobbyUpdateRef),queueMicrotask(()=>{0===this._epoch&&!this._detached&&this._client.connected&&this._onConnect()})}get connected(){return!this._detached&&this._client.connected}get client(){return this._client}get localWorker(){return this._localWorker}get queues(){return this._queues}ready(){return this._readyPromise}detach(){if(!this._detached){this._log("Detaching..."),this._detached=!0,this._epoch++,this._lobbyRefreshTimer&&(clearTimeout(this._lobbyRefreshTimer),this._lobbyRefreshTimer=null),this._client.off("connect",this._onConnectRef),this._client.off("disconnect",this._onDisconnectRef),this._client.off("reconnect",this._onReconnectRef),this._client.off("error",this._onErrorRef),this._client.off("presence:join",this._onPresenceJoinRef),this._client.off("presence:leave",this._onPresenceLeaveRef),this._client.off("presence:update",this._onPresenceUpdateRef),this._client.off("lobbyPresence:join",this._onLobbyJoinRef),this._client.off("lobbyPresence:leave",this._onLobbyLeaveRef),this._client.off("lobbyPresence:update",this._onLobbyUpdateRef);for(const e of[...this._queues.keys()])this._queues.get(e)._cleanup(),this._queues.delete(e);if(this._lobby&&this._client.connected)try{this._lobby.unsubscribe()}catch{}var e,t;this._lobby=null,this._onlineWorkers.clear(),this._actorToWorkerId.clear(),this._localWorker=null,e=this._client,t=this._options.appName,c.get(e)?.delete(t),this._isReady||this._readyReject(new Error("NoLagQueue detached before ready"))}}_onConnect(){this._epoch++,this._runSetup(this._epoch)}async _runSetup(e){const t=()=>e!==this._epoch||this._detached;this._log(this._isReady?"Restoring after reconnect...":"Setting up..."),this._localWorker?this._localWorker.actorTokenId=this._client.actorId:(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)),this._lobby||(this._lobby=this._client.setApp(this._options.appName).setLobby("online"));try{const e=await this._lobby.subscribe();if(t())return;this._diffHydrateOnlineWorkers(e),this._log("Lobby subscribed, online workers:",this._onlineWorkers.size)}catch(e){if(t())return;this._log("Lobby subscription failed:",e)}if(this._isReady)for(const e of this._queues.values())e._updateLocalPresence();else for(const e of this._options.queues)this._subscribeQueue(e);t()||(this._isReady?this.emit("reconnected"):(this._isReady=!0,this._readyResolve(),this.emit("connected")),this._scheduleLobbyRefresh(e))}_scheduleLobbyRefresh(e){this._lobbyRefreshTimer&&clearTimeout(this._lobbyRefreshTimer),this._lobbyRefreshTimer=setTimeout(()=>{this._lobbyRefreshTimer=null,e===this._epoch&&!this._detached&&this._client.connected&&this._lobby&&this._lobby.fetchPresence().then(t=>{e!==this._epoch||this._detached||this._diffHydrateOnlineWorkers(t)}).catch(()=>{})},2e3)}joinQueue(e){this._assertUsable();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())}_assertUsable(){if(this._detached)throw new Error("NoLagQueue has been detached — construct a new instance");if(!this._isReady||!this._localWorker)throw new Error('NoLagQueue not ready — await ready() or the "connected" event')}_subscribeQueue(e){this._log("Subscribing queue:",e);const t=this._client.setApp(this._options.appName).setRoom(e),o=new _(e,t,this._workerId,this._options,n(`QueueRoom:${e}`,this._options.debug),()=>this._client.connected);return o._setLocalActorId(this._localWorker.actorTokenId),this._queues.set(e,o),o._subscribe(),o}_foreignScope(e){const t=e?.__scope;return"string"==typeof t&&t!==this._options.appName}_handleRoomPresenceJoin(e){if(e.actorTokenId===this._localWorker?.actorTokenId)return;const t=e.presence;if(!t?.workerId||this._foreignScope(t))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&&!this._foreignScope(t)){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)}}_handleLobbyJoin(e){const{actorId:t,data:o}=e;if(t===this._localWorker?.actorTokenId)return;const r=o;if(!r?.workerId||this._foreignScope(r))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;if(this._foreignScope(r))return;const 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||this._foreignScope(r))return;const s=this._presenceToWorker(t,r);this._onlineWorkers.set(s.workerId,s)}_diffHydrateOnlineWorkers(e){const t=new Map,o=new Map;for(const r of Object.keys(e)){const s=e[r];for(const e of Object.keys(s)){if(e===this._localWorker?.actorTokenId)continue;const r=s[e],i=r?.presence??r;i?.workerId&&!this._foreignScope(i)&&(t.has(i.workerId)||t.set(i.workerId,this._presenceToWorker(e,i)),o.set(e,i.workerId))}}for(const[e,o]of[...this._onlineWorkers])if(!t.has(e)){this._onlineWorkers.delete(e);for(const[t,o]of[...this._actorToWorkerId])o===e&&this._actorToWorkerId.delete(t);this.emit("workerOffline",o)}for(const[e,o]of t)this._onlineWorkers.has(e)||(this._onlineWorkers.set(e,o),this.emit("workerOnline",o));for(const[e,t]of o)this._actorToWorkerId.set(e,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}}export{e as EventEmitter,o as JobStore,l as NoLagQueue,s as PresenceManager,_ as QueueRoom,r as WorkerManager};
2
2
  //# sourceMappingURL=browser.js.map
@@ -1 +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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"}
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","wrapperRegistry","WeakMap","TOPIC_JOBS","TOPIC_PROGRESS","QueueRoom","name","roomContext","localWorkerId","options","isConnected","super","_onJobsRef","_onProgressRef","_roomContext","_localWorkerId","_options","_log","_isConnected","_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","__scope","appName","setPresence","NoLagQueue","_localWorker","_queues","_lobby","_onlineWorkers","_epoch","_detached","_isReady","_lobbyRefreshTimer","_onConnectRef","_onConnect","_onDisconnectRef","reason","_onReconnectRef","_onErrorRef","_onPresenceJoinRef","_handleRoomPresenceJoin","_onPresenceLeaveRef","_handleRoomPresenceLeave","_onPresenceUpdateRef","_handleRoomPresenceUpdate","_onLobbyJoinRef","_handleLobbyJoin","_onLobbyLeaveRef","_handleLobbyLeave","_onLobbyUpdateRef","_handleLobbyUpdate","client","TypeError","_client","_workerId","debug","queues","_readyPromise","Promise","resolve","reject","_readyResolve","_readyReject","wrapperName","apps","warn","registerWrapper","queueMicrotask","connected","localWorker","ready","detach","clearTimeout","Error","_runSetup","epoch","stale","setApp","setLobby","state","_diffHydrateOnlineWorkers","room","queueName","_subscribeQueue","_scheduleLobbyRefresh","setTimeout","joinQueue","_assertUsable","leaveQueue","getQueues","getOnlineWorkers","setRoom","_foreignScope","scope","_presenceToWorker","_findWorkerIdByActorId","fresh","freshActors","roomId","Object","roomPresence","raw","mappedWorkerId"],"mappings":"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"}
@@ -10,3 +10,5 @@ export declare const TOPIC_JOBS = "jobs";
10
10
  export declare const TOPIC_PROGRESS = "_progress";
11
11
  /** Lobby ID for global online presence */
12
12
  export declare const LOBBY_ID = "online";
13
+ /** Delay before the post-setup lobby presence refetch (catches simultaneous joiners) */
14
+ export declare const LOBBY_REFRESH_DELAY_MS = 2000;