@nolag/queue 1.1.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.
- package/dist/NoLagQueue.d.ts +2 -2
- package/dist/QueueRoom.d.ts +33 -2
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/index.cjs +149 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +149 -13
- package/dist/index.mjs.map +1 -1
- package/dist/react-native.js +149 -13
- package/dist/react-native.js.map +1 -1
- package/dist/types.d.ts +38 -0
- package/dist/utils.d.ts +49 -0
- package/package.json +1 -1
package/dist/NoLagQueue.d.ts
CHANGED
|
@@ -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
|
*/
|
package/dist/QueueRoom.d.ts
CHANGED
|
@@ -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
|
package/dist/browser.js.map
CHANGED
|
@@ -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
|
-
|
|
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 ============
|