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