@nolag/queue 1.0.0 → 1.2.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.
@@ -1,7 +1,7 @@
1
1
  import type { NoLagSocket } from '@nolag/js-sdk';
2
2
  import { EventEmitter } from './EventEmitter';
3
3
  import { QueueRoom } from './QueueRoom';
4
- import type { NoLagQueueOptions, QueueClientEvents, QueueWorker } from './types';
4
+ import type { NoLagQueueOptions, QueueClientEvents, QueueWorker, JoinQueueOptions } from './types';
5
5
  /**
6
6
  * NoLagQueue — high-level real-time job queue SDK built on @nolag/js-sdk.
7
7
  *
@@ -98,7 +98,7 @@ export declare class NoLagQueue extends EventEmitter<QueueClientEvents> {
98
98
  * Join a queue room. Creates, subscribes, and activates it.
99
99
  * Returns an existing room if already joined.
100
100
  */
101
- joinQueue(name: string): QueueRoom;
101
+ joinQueue(name: string, opts?: JoinQueueOptions): QueueRoom;
102
102
  /**
103
103
  * Leave a queue room. Fully unsubscribes and removes it.
104
104
  */
@@ -1,7 +1,7 @@
1
1
  import type { RoomContext } from '@nolag/js-sdk';
2
2
  import { EventEmitter } from './EventEmitter';
3
3
  import type { JobFilter } from './JobStore';
4
- import type { QueueRoomEvents, Job, AddJobOptions, QueueWorker, QueuePresenceData, ResolvedQueueOptions } from './types';
4
+ import type { QueueRoomEvents, Job, AddJobOptions, QueueWorker, QueuePresenceData, ResolvedQueueOptions, FilterValue } from './types';
5
5
  /**
6
6
  * QueueRoom — a single named queue with job lifecycle, progress tracking, and worker presence.
7
7
  *
@@ -20,6 +20,8 @@ export declare class QueueRoom extends EventEmitter<QueueRoomEvents> {
20
20
  private _isConnected;
21
21
  private _onJobsRef;
22
22
  private _onProgressRef;
23
+ /** Filter values applied to the jobs subscription. */
24
+ private _filters;
23
25
  /** @internal */
24
26
  constructor(name: string, roomContext: RoomContext, localWorkerId: string, options: ResolvedQueueOptions, log: (...args: unknown[]) => void, isConnected: () => boolean);
25
27
  /** @internal Set the local actor ID once connected */
@@ -45,6 +47,35 @@ export declare class QueueRoom extends EventEmitter<QueueRoomEvents> {
45
47
  * Automatically retries if attempts < maxAttempts.
46
48
  */
47
49
  failJob(jobId: string, error?: string): Job | null;
50
+ /** The filter values currently applied to this queue's subscription. */
51
+ get filters(): FilterValue[];
52
+ /**
53
+ * Replace this queue's filters — only jobs published with one of these
54
+ * values are delivered. For a worker this declares its capabilities: it is
55
+ * offered only the jobs it can actually run, and load balancing still hands
56
+ * each such job to exactly one matching worker.
57
+ *
58
+ * Passing an empty array clears filtering and restores the wildcard
59
+ * subscription, which receives every job on the queue.
60
+ *
61
+ * Not to be confused with `getJobs(filter)`, which filters the local cache
62
+ * by status/type and does not change what the server sends.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * queue.setFilters(['gpu', 'render']); // gpu OR render jobs
67
+ * queue.setFilters([['gpu', 'eu-west']]); // gpu AND eu-west
68
+ * queue.setFilters([]); // every job
69
+ * ```
70
+ */
71
+ setFilters(values: FilterValue[]): void;
72
+ /** Add filter values to the existing set. Existing AND groups are kept. */
73
+ addFilters(values: string[]): void;
74
+ /**
75
+ * Remove filter values from the existing set. Removing the last value
76
+ * restores the wildcard subscription.
77
+ */
78
+ removeFilters(values: string[]): void;
48
79
  /**
49
80
  * Get a single job by ID.
50
81
  */
@@ -70,7 +101,7 @@ export declare class QueueRoom extends EventEmitter<QueueRoomEvents> {
70
101
  */
71
102
  getWorkers(): QueueWorker[];
72
103
  /** @internal Subscribe to jobs and progress topics, attach listeners */
73
- _subscribe(): void;
104
+ _subscribe(filters?: FilterValue[]): void;
74
105
  /** @internal Set presence and fetch room members */
75
106
  _activate(): void;
76
107
  /** @internal Re-set presence after reconnect */
package/dist/browser.js CHANGED
@@ -1,2 +1,2 @@
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};
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)=>{}}function c(e){return e?.filter?{filter:e.filter}:e?.filters&&e.filters.length>0?{filters:e.filters}:{}}function h(e){return e?e.includes("|")?{filters:e.split("|")}:{filter:e}:{}}function a(e){return e?.filter?e.filter:e?.filters&&e.filters.length>0?(t=e.filters,[...t].map(e=>e.toLowerCase()).sort().join("|")):void 0;var t}const l=new WeakMap;const _="jobs",d="_progress";class u extends e{constructor(e,t,i,n,c,h){super(),this._onJobsRef=null,this._onProgressRef=null,this._filters=[],this.name=e,this._roomContext=t,this._localWorkerId=i,this._options=n,this._log=c,this._isConnected=h,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,filter:a(e),isReplay:!1};return this._jobStore.add(o),this._log("Job added:",o.id,o.type),this._roomContext.emit(_,{event:"jobAdded",job:o},{echo:!0,...c(e)}),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(_,{event:"jobClaimed",job:t},{echo:!0,...h(t.filter)}),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(d,r,{echo:!0,...h(o.filter)}),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(_,{event:"jobCompleted",job:r},{echo:!0,...h(r.filter)}),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(_,{event:"jobFailed",job:s},{echo:!0,...h(s.filter)}),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(_,{event:"jobRetrying",job:t},{echo:!0,...h(t.filter)}),this.emit("jobRetrying",t))}return s}get filters(){return[...this._filters]}setFilters(e){this._filters=[...e];for(const e of[_,d])this._roomContext.setFilters(e,this._filters)}addFilters(e){this.setFilters(function(e,t){const o=new Set,r=[];for(const t of e)"string"==typeof t?o.add(t):r.push(t);for(const e of t)o.add(e);return[...o,...r]}(this._filters,e))}removeFilters(e){this.setFilters(function(e,t){const o=new Set(t);return e.filter(e=>"string"!=typeof e||!o.has(e))}(this._filters,e))}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(e){this._log("Room subscribe:",this.name),this._filters=e?[...e]:[];const t=this._filters.length>0?{filters:this._filters}:{};if("worker"===this._options.role){const e=this._options.loadBalanceGroup??`queue-workers-${this.name}`;this._log("Subscribing with load balance, group:",e),this._roomContext.subscribe(_,{loadBalance:!0,loadBalanceGroup:e,...t})}else this._filters.length>0?this._roomContext.subscribe(_,t):this._roomContext.subscribe(_);this._filters.length>0?this._roomContext.subscribe(d,t):this._roomContext.subscribe(d),this._onJobsRef=e=>{this._handleJobMessage(e)},this._roomContext.on(_,this._onJobsRef),this._onProgressRef=e=>{this._handleProgressMessage(e)},this._roomContext.on(d,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(_),this._roomContext.unsubscribe(d)),this._onJobsRef&&this._roomContext.off(_,this._onJobsRef),this._onProgressRef&&this._roomContext.off(d,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 f 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=l.get(e);r||(r=new Map,l.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,l.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,t){this._assertUsable();let o=this._queues.get(e);return o?t?.filters&&o.setFilters(t.filters):(o=this._subscribeQueue(e,t?.filters),o._activate()),o}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,t){this._log("Subscribing queue:",e);const o=this._client.setApp(this._options.appName).setRoom(e),r=new u(e,o,this._workerId,this._options,n(`QueueRoom:${e}`,this._options.debug),()=>this._client.connected);return r._setLocalActorId(this._localWorker.actorTokenId),this._queues.set(e,r),r._subscribe(t),r}_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,f as NoLagQueue,s as PresenceManager,u 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","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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"}
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","filterEmitOptions","opts","filters","length","inheritFilter","split","recordedFilter","map","v","toLowerCase","sort","join","wrapperRegistry","WeakMap","TOPIC_JOBS","TOPIC_PROGRESS","QueueRoom","name","roomContext","localWorkerId","options","isConnected","super","_onJobsRef","_onProgressRef","_filters","_roomContext","_localWorkerId","_options","_log","_isConnected","_jobStore","maxJobCache","_workerManager","_presenceManager","_setLocalActorId","actorId","addJob","payload","attempts","maxAttempts","createdBy","createdAt","isReplay","echo","claimJob","jobId","claimedBy","reportProgress","progressEvent","timestamp","completeJob","result","completed","failJob","nextAttempts","retried","setFilters","topic","addFilters","simple","groups","f","push","mergeFilters","removeFilters","remove","drop","withoutFilters","getJob","getJobs","getWorkers","_subscribe","filterOpts","group","loadBalanceGroup","subscribe","loadBalance","_handleJobMessage","_handleProgressMessage","_activate","_setPresence","fetchPresence","then","actors","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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"}
package/dist/index.cjs CHANGED
@@ -356,6 +356,78 @@ function createLogger(prefix, enabled) {
356
356
  console.log(`[${prefix}]`, ...args);
357
357
  };
358
358
  }
359
+ // ============ Filters ============
360
+ /**
361
+ * Build the filter fragment of an emit options object.
362
+ *
363
+ * `filter` wins over `filters`: a publish is routed to exactly one topic, so
364
+ * honouring both would silently drop one of them.
365
+ */
366
+ function filterEmitOptions(opts) {
367
+ if (opts?.filter)
368
+ return { filter: opts.filter };
369
+ if (opts?.filters && opts.filters.length > 0)
370
+ return { filters: opts.filters };
371
+ return {};
372
+ }
373
+ /**
374
+ * Rebuild publish options from the filter a message arrived with, so a reply
375
+ * to it reaches the same audience the original did.
376
+ *
377
+ * The server joins AND groups into one composite value with '|', which is not
378
+ * a legal character in a plain filter, so split those back apart.
379
+ */
380
+ function inheritFilter(filter) {
381
+ if (!filter)
382
+ return {};
383
+ if (filter.includes('|'))
384
+ return { filters: filter.split('|') };
385
+ return { filter };
386
+ }
387
+ /**
388
+ * Merge OR terms into an existing filter set. AND groups (nested arrays) are
389
+ * preserved as-is — only plain string terms are deduplicated.
390
+ */
391
+ function mergeFilters(existing, add) {
392
+ const simple = new Set();
393
+ const groups = [];
394
+ for (const f of existing) {
395
+ if (typeof f === 'string')
396
+ simple.add(f);
397
+ else
398
+ groups.push(f);
399
+ }
400
+ for (const v of add)
401
+ simple.add(v);
402
+ return [...simple, ...groups];
403
+ }
404
+ /**
405
+ * Drop OR terms from a filter set. AND groups are left untouched — remove
406
+ * those by calling `setFilters` with the set you want.
407
+ */
408
+ function withoutFilters(existing, remove) {
409
+ const drop = new Set(remove);
410
+ return existing.filter((f) => typeof f !== 'string' || !drop.has(f));
411
+ }
412
+ /**
413
+ * The composite key the server derives from an AND filter group: values are
414
+ * lowercased, sorted, and joined with '|'. Mirrored here so an item created
415
+ * locally carries the same filter string as one arriving off the wire.
416
+ */
417
+ function compositeFilterKey(values) {
418
+ return [...values].map((v) => v.toLowerCase()).sort().join('|');
419
+ }
420
+ /**
421
+ * The single string form of whatever filter a publish used, for recording on
422
+ * the local copy of an item. Round-trips through `inheritFilter`.
423
+ */
424
+ function recordedFilter(opts) {
425
+ if (opts?.filter)
426
+ return opts.filter;
427
+ if (opts?.filters && opts.filters.length > 0)
428
+ return compositeFilterKey(opts.filters);
429
+ return undefined;
430
+ }
359
431
  // ============ Wrapper registry ============
360
432
  // One wrapper instance per (client, appName): two wrappers sharing an app on
361
433
  // one connection would collide on topics, presence and the online lobby.
@@ -408,6 +480,8 @@ class QueueRoom extends EventEmitter {
408
480
  // handlers for a topic (the client may be shared with other consumers).
409
481
  this._onJobsRef = null;
410
482
  this._onProgressRef = null;
483
+ /** Filter values applied to the jobs subscription. */
484
+ this._filters = [];
411
485
  this.name = name;
412
486
  this._roomContext = roomContext;
413
487
  this._localWorkerId = localWorkerId;
@@ -440,11 +514,12 @@ class QueueRoom extends EventEmitter {
440
514
  createdBy: this._localWorkerId,
441
515
  createdAt: now,
442
516
  updatedAt: now,
517
+ filter: recordedFilter(opts),
443
518
  isReplay: false,
444
519
  };
445
520
  this._jobStore.add(job);
446
521
  this._log('Job added:', job.id, job.type);
447
- this._roomContext.emit(TOPIC_JOBS, { event: 'jobAdded', job }, { echo: true });
522
+ this._roomContext.emit(TOPIC_JOBS, { event: 'jobAdded', job }, { echo: true, ...filterEmitOptions(opts) });
448
523
  this.emit('jobAdded', job);
449
524
  return job;
450
525
  }
@@ -459,7 +534,7 @@ class QueueRoom extends EventEmitter {
459
534
  if (!updated)
460
535
  return null;
461
536
  this._log('Job claimed:', jobId, 'by', this._localWorkerId);
462
- this._roomContext.emit(TOPIC_JOBS, { event: 'jobClaimed', job: updated }, { echo: true });
537
+ this._roomContext.emit(TOPIC_JOBS, { event: 'jobClaimed', job: updated }, { echo: true, ...inheritFilter(updated.filter) });
463
538
  this.emit('jobClaimed', updated);
464
539
  return updated;
465
540
  }
@@ -477,7 +552,7 @@ class QueueRoom extends EventEmitter {
477
552
  timestamp: Date.now(),
478
553
  };
479
554
  this._log('Job progress:', jobId, job.progress + '%');
480
- this._roomContext.emit(TOPIC_PROGRESS, progressEvent, { echo: true });
555
+ this._roomContext.emit(TOPIC_PROGRESS, progressEvent, { echo: true, ...inheritFilter(job.filter) });
481
556
  this.emit('jobProgress', progressEvent);
482
557
  }
483
558
  /**
@@ -496,7 +571,7 @@ class QueueRoom extends EventEmitter {
496
571
  if (!completed)
497
572
  return null;
498
573
  this._log('Job completed:', jobId);
499
- this._roomContext.emit(TOPIC_JOBS, { event: 'jobCompleted', job: completed }, { echo: true });
574
+ this._roomContext.emit(TOPIC_JOBS, { event: 'jobCompleted', job: completed }, { echo: true, ...inheritFilter(completed.filter) });
500
575
  this.emit('jobCompleted', completed);
501
576
  return completed;
502
577
  }
@@ -520,19 +595,62 @@ class QueueRoom extends EventEmitter {
520
595
  if (!failed)
521
596
  return null;
522
597
  this._log('Job failed:', jobId, 'attempts:', nextAttempts, '/', failed.maxAttempts);
523
- this._roomContext.emit(TOPIC_JOBS, { event: 'jobFailed', job: failed }, { echo: true });
598
+ this._roomContext.emit(TOPIC_JOBS, { event: 'jobFailed', job: failed }, { echo: true, ...inheritFilter(failed.filter) });
524
599
  this.emit('jobFailed', failed);
525
600
  // Auto-retry if under maxAttempts
526
601
  if (nextAttempts < failed.maxAttempts) {
527
602
  const retried = this._jobStore.updateStatus(jobId, 'pending');
528
603
  if (retried) {
529
604
  this._log('Job retrying:', jobId, 'attempt', nextAttempts + 1);
530
- this._roomContext.emit(TOPIC_JOBS, { event: 'jobRetrying', job: retried }, { echo: true });
605
+ this._roomContext.emit(TOPIC_JOBS, { event: 'jobRetrying', job: retried }, { echo: true, ...inheritFilter(retried.filter) });
531
606
  this.emit('jobRetrying', retried);
532
607
  }
533
608
  }
534
609
  return failed;
535
610
  }
611
+ // ============ Filters ============
612
+ /** The filter values currently applied to this queue's subscription. */
613
+ get filters() {
614
+ return [...this._filters];
615
+ }
616
+ /**
617
+ * Replace this queue's filters — only jobs published with one of these
618
+ * values are delivered. For a worker this declares its capabilities: it is
619
+ * offered only the jobs it can actually run, and load balancing still hands
620
+ * each such job to exactly one matching worker.
621
+ *
622
+ * Passing an empty array clears filtering and restores the wildcard
623
+ * subscription, which receives every job on the queue.
624
+ *
625
+ * Not to be confused with `getJobs(filter)`, which filters the local cache
626
+ * by status/type and does not change what the server sends.
627
+ *
628
+ * @example
629
+ * ```ts
630
+ * queue.setFilters(['gpu', 'render']); // gpu OR render jobs
631
+ * queue.setFilters([['gpu', 'eu-west']]); // gpu AND eu-west
632
+ * queue.setFilters([]); // every job
633
+ * ```
634
+ */
635
+ setFilters(values) {
636
+ this._filters = [...values];
637
+ for (const topic of [TOPIC_JOBS, TOPIC_PROGRESS]) {
638
+ // The core types filters as `string[]`, but both its implementation and
639
+ // the wire protocol accept AND groups (nested arrays).
640
+ this._roomContext.setFilters(topic, this._filters);
641
+ }
642
+ }
643
+ /** Add filter values to the existing set. Existing AND groups are kept. */
644
+ addFilters(values) {
645
+ this.setFilters(mergeFilters(this._filters, values));
646
+ }
647
+ /**
648
+ * Remove filter values from the existing set. Removing the last value
649
+ * restores the wildcard subscription.
650
+ */
651
+ removeFilters(values) {
652
+ this.setFilters(withoutFilters(this._filters, values));
653
+ }
536
654
  // ============ Monitor / Query Methods ============
537
655
  /**
538
656
  * Get a single job by ID.
@@ -572,20 +690,34 @@ class QueueRoom extends EventEmitter {
572
690
  }
573
691
  // ============ Internal (called by NoLagQueue) ============
574
692
  /** @internal Subscribe to jobs and progress topics, attach listeners */
575
- _subscribe() {
693
+ _subscribe(filters) {
576
694
  this._log('Room subscribe:', this.name);
695
+ this._filters = filters ? [...filters] : [];
696
+ // Filters and load balancing compose: the server shares each filtered
697
+ // sub-topic across the group, so one matching worker claims each job.
698
+ const filterOpts = this._filters.length > 0 ? { filters: this._filters } : {};
577
699
  // Workers use load balancing so each job event is delivered to only ONE worker
578
700
  // (round-robin across all workers in the same group). Producers and monitors
579
701
  // receive all messages so they can track full queue state.
580
702
  if (this._options.role === 'worker') {
581
703
  const group = this._options.loadBalanceGroup ?? `queue-workers-${this.name}`;
582
704
  this._log('Subscribing with load balance, group:', group);
583
- this._roomContext.subscribe(TOPIC_JOBS, { loadBalance: true, loadBalanceGroup: group });
705
+ this._roomContext.subscribe(TOPIC_JOBS, { loadBalance: true, loadBalanceGroup: group, ...filterOpts });
706
+ }
707
+ else if (this._filters.length > 0) {
708
+ this._roomContext.subscribe(TOPIC_JOBS, filterOpts);
584
709
  }
585
710
  else {
586
711
  this._roomContext.subscribe(TOPIC_JOBS);
587
712
  }
588
- this._roomContext.subscribe(TOPIC_PROGRESS);
713
+ // Progress is never load balanced — every monitor wants every update —
714
+ // but it carries the job's filter so it tracks the jobs topic.
715
+ if (this._filters.length > 0) {
716
+ this._roomContext.subscribe(TOPIC_PROGRESS, filterOpts);
717
+ }
718
+ else {
719
+ this._roomContext.subscribe(TOPIC_PROGRESS);
720
+ }
589
721
  // Listen for job lifecycle messages (refs stored for handler-specific removal)
590
722
  this._onJobsRef = (data) => {
591
723
  this._handleJobMessage(data);
@@ -1032,13 +1164,17 @@ class NoLagQueue extends EventEmitter {
1032
1164
  * Join a queue room. Creates, subscribes, and activates it.
1033
1165
  * Returns an existing room if already joined.
1034
1166
  */
1035
- joinQueue(name) {
1167
+ joinQueue(name, opts) {
1036
1168
  this._assertUsable();
1037
1169
  let room = this._queues.get(name);
1038
1170
  if (!room) {
1039
- room = this._subscribeQueue(name);
1171
+ room = this._subscribeQueue(name, opts?.filters);
1040
1172
  room._activate();
1041
1173
  }
1174
+ else if (opts?.filters) {
1175
+ // Already joined — re-point its filters rather than ignoring them.
1176
+ room.setFilters(opts.filters);
1177
+ }
1042
1178
  return room;
1043
1179
  }
1044
1180
  /**
@@ -1075,13 +1211,13 @@ class NoLagQueue extends EventEmitter {
1075
1211
  }
1076
1212
  }
1077
1213
  // ============ Private: Queue Setup ============
1078
- _subscribeQueue(name) {
1214
+ _subscribeQueue(name, filters) {
1079
1215
  this._log('Subscribing queue:', name);
1080
1216
  const roomContext = this._client.setApp(this._options.appName).setRoom(name);
1081
1217
  const room = new QueueRoom(name, roomContext, this._workerId, this._options, createLogger(`QueueRoom:${name}`, this._options.debug), () => this._client.connected);
1082
1218
  room._setLocalActorId(this._localWorker.actorTokenId);
1083
1219
  this._queues.set(name, room);
1084
- room._subscribe();
1220
+ room._subscribe(filters);
1085
1221
  return room;
1086
1222
  }
1087
1223
  // ============ Private: Scope Filtering ============