@nolag/notify 0.1.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -8
- package/dist/NoLagNotify.d.ts +68 -14
- package/dist/NotifyChannel.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 +319 -157
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +319 -157
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.ts +9 -6
- package/dist/utils.d.ts +4 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -24,14 +24,21 @@ npm install @nolag/js-sdk @nolag/notify
|
|
|
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 (notify, chat, dash, ...) 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 { NoLagNotify } from "@nolag/notify";
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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);
|
|
38
|
+
const notify = new NoLagNotify({ client, channels: ["alerts", "updates"] });
|
|
33
39
|
|
|
34
|
-
await
|
|
40
|
+
await client.connect(); // the app owns the connection
|
|
41
|
+
await notify.ready(); // wrapper setup done (identity, presence, channels)
|
|
35
42
|
|
|
36
43
|
// Listen for notifications
|
|
37
44
|
notify.on("notification", (n) => {
|
|
@@ -59,8 +66,32 @@ console.log(`Total unread: ${badges.total}`);
|
|
|
59
66
|
// Mark as read
|
|
60
67
|
channel.markRead(notificationId);
|
|
61
68
|
channel.markAllRead();
|
|
69
|
+
|
|
70
|
+
// Teardown: the wrapper releases its handlers and topics; the app closes
|
|
71
|
+
// the socket (never the other way around).
|
|
72
|
+
notify.detach();
|
|
73
|
+
client.disconnect();
|
|
62
74
|
```
|
|
63
75
|
|
|
76
|
+
## Lifecycle
|
|
77
|
+
|
|
78
|
+
- **Construction = attach.** The wrapper wires its handlers onto the injected
|
|
79
|
+
client immediately. If the client is already connected, setup runs on the
|
|
80
|
+
next microtask; otherwise it runs when the client's `connect` event fires.
|
|
81
|
+
- **`ready()`** resolves once the first setup completed (identity, online
|
|
82
|
+
lobby, configured channels). Auth failures surface via your own
|
|
83
|
+
`await client.connect()`, not via `ready()`.
|
|
84
|
+
- **Reconnects are automatic.** The wrapper reconciles the online presence
|
|
85
|
+
list and channels restore transparently.
|
|
86
|
+
- **`detach()`** removes exactly this wrapper's handlers and topics and never
|
|
87
|
+
touches the socket. It is terminal: construct a new instance to re-attach.
|
|
88
|
+
Detach while the client is still connected so server-side unsubscribes go
|
|
89
|
+
through. In frameworks, call it from your dispose hook (`onUnmounted`,
|
|
90
|
+
HMR dispose).
|
|
91
|
+
- **One wrapper per (client, app).** Sharing a client across wrappers of
|
|
92
|
+
DIFFERENT apps is the intended pattern; two wrappers on the same app would
|
|
93
|
+
collide on topics and presence (the SDK warns if you do this).
|
|
94
|
+
|
|
64
95
|
## API Reference
|
|
65
96
|
|
|
66
97
|
### `NoLagNotify`
|
|
@@ -68,25 +99,26 @@ channel.markAllRead();
|
|
|
68
99
|
#### Constructor
|
|
69
100
|
|
|
70
101
|
```typescript
|
|
71
|
-
const notify = new NoLagNotify(
|
|
102
|
+
const notify = new NoLagNotify(options: NoLagNotifyOptions);
|
|
72
103
|
```
|
|
73
104
|
|
|
74
105
|
**Options:**
|
|
75
106
|
|
|
76
107
|
| Option | Type | Default | Description |
|
|
77
108
|
|--------|------|---------|-------------|
|
|
109
|
+
| `client` | `NoLagSocket` | *required* | The injected core NoLag client |
|
|
78
110
|
| `channels` | `string[]` | — | Auto-subscribe to these channels on connect |
|
|
79
111
|
| `metadata` | `Record<string, unknown>` | — | Custom metadata |
|
|
112
|
+
| `appName` | `string` | `'notify'` | NoLag app for topic prefixes |
|
|
80
113
|
| `maxNotificationCache` | `number` | `500` | Max notifications kept in memory per channel |
|
|
81
114
|
| `debug` | `boolean` | `false` | Enable debug logging |
|
|
82
|
-
| `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
|
|
83
115
|
|
|
84
116
|
#### Methods
|
|
85
117
|
|
|
86
118
|
| Method | Returns | Description |
|
|
87
119
|
|--------|---------|-------------|
|
|
88
|
-
| `
|
|
89
|
-
| `
|
|
120
|
+
| `ready()` | `Promise<void>` | Resolves when wrapper setup completed |
|
|
121
|
+
| `detach()` | `void` | Release handlers and topics (terminal; never closes the socket) |
|
|
90
122
|
| `subscribe(channelName)` | `NotifyChannel` | Subscribe to a notification channel |
|
|
91
123
|
| `unsubscribe(channelName)` | `void` | Unsubscribe from a channel |
|
|
92
124
|
| `getBadgeCounts()` | `BadgeCounts` | Get unread counts (total + per channel) |
|
|
@@ -98,6 +130,7 @@ const notify = new NoLagNotify(token: string, options?: NoLagNotifyOptions);
|
|
|
98
130
|
|-------|---------|-------------|
|
|
99
131
|
| `connected` | — | Connected to NoLag |
|
|
100
132
|
| `disconnected` | — | Disconnected |
|
|
133
|
+
| `reconnecting` | — | Reconnect attempt started |
|
|
101
134
|
| `reconnected` | — | Reconnected after disconnect |
|
|
102
135
|
| `error` | `Error` | Connection or protocol error |
|
|
103
136
|
| `notification` | `Notification` | Notification received on any channel |
|
package/dist/NoLagNotify.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NoLagSocket } from '@nolag/js-sdk';
|
|
1
2
|
import { EventEmitter } from './EventEmitter';
|
|
2
3
|
import { NotifyChannel } from './NotifyChannel';
|
|
3
4
|
import type { NoLagNotifyOptions, NotifyClientEvents, BadgeCounts } from './types';
|
|
@@ -7,25 +8,33 @@ import type { NoLagNotifyOptions, NotifyClientEvents, BadgeCounts } from './type
|
|
|
7
8
|
* Provides multi-channel notifications, read/unread tracking, badge counts,
|
|
8
9
|
* message replay, and global presence — 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 { NoLagNotify } from '@nolag/notify';
|
|
13
19
|
*
|
|
14
|
-
* const
|
|
20
|
+
* const client = NoLag(async () => (await (await fetch('/api/nolag-token')).json()).token);
|
|
21
|
+
* const notify = new NoLagNotify({ client, appName: 'my-notify' });
|
|
15
22
|
*
|
|
16
|
-
* notify.on('connected', () => console.log('Connected!'));
|
|
17
23
|
* notify.on('notification', (n) => console.log('New notification:', n.title));
|
|
18
24
|
*
|
|
19
|
-
* await
|
|
25
|
+
* await client.connect(); // the app owns the connection
|
|
26
|
+
* await notify.ready(); // wrapper setup done (identity, lobby, channels)
|
|
20
27
|
*
|
|
21
28
|
* const alerts = notify.subscribe('alerts');
|
|
22
29
|
* alerts.on('notification', (n) => console.log(n.title));
|
|
30
|
+
*
|
|
31
|
+
* notify.detach(); // wrapper releases its handlers and topics
|
|
32
|
+
* client.disconnect(); // the app closes the socket
|
|
23
33
|
* ```
|
|
24
34
|
*/
|
|
25
35
|
export declare class NoLagNotify extends EventEmitter<NotifyClientEvents> {
|
|
26
|
-
private _token;
|
|
27
|
-
private _options;
|
|
28
36
|
private _client;
|
|
37
|
+
private _options;
|
|
29
38
|
private _channels;
|
|
30
39
|
private _lobby;
|
|
31
40
|
private _badgeManager;
|
|
@@ -33,19 +42,54 @@ export declare class NoLagNotify extends EventEmitter<NotifyClientEvents> {
|
|
|
33
42
|
private _actorToUserId;
|
|
34
43
|
private _userId;
|
|
35
44
|
private _log;
|
|
36
|
-
|
|
37
|
-
|
|
45
|
+
private _epoch;
|
|
46
|
+
private _detached;
|
|
47
|
+
private _isReady;
|
|
48
|
+
private _readyResolve;
|
|
49
|
+
private _readyReject;
|
|
50
|
+
private _readyPromise;
|
|
51
|
+
private _lobbyRefreshTimer;
|
|
52
|
+
private _onConnectRef;
|
|
53
|
+
private _onDisconnectRef;
|
|
54
|
+
private _onReconnectRef;
|
|
55
|
+
private _onErrorRef;
|
|
56
|
+
private _onReplayStartRef;
|
|
57
|
+
private _onReplayEndRef;
|
|
58
|
+
private _onPresenceJoinRef;
|
|
59
|
+
private _onPresenceLeaveRef;
|
|
60
|
+
private _onPresenceUpdateRef;
|
|
61
|
+
private _onLobbyJoinRef;
|
|
62
|
+
private _onLobbyLeaveRef;
|
|
63
|
+
private _onLobbyUpdateRef;
|
|
64
|
+
constructor(options: NoLagNotifyOptions);
|
|
65
|
+
/** Whether the underlying connection is established (connected ≠ ready) */
|
|
38
66
|
get connected(): boolean;
|
|
67
|
+
/** The injected core client (owned by the app, not the wrapper) */
|
|
68
|
+
get client(): NoLagSocket;
|
|
39
69
|
/** All currently subscribed channels */
|
|
40
70
|
get channels(): Map<string, NotifyChannel>;
|
|
41
71
|
/**
|
|
42
|
-
*
|
|
72
|
+
* Resolves once the wrapper's first setup completed (identity, lobby and
|
|
73
|
+
* configured channels ready — equivalently, once 'connected' has fired).
|
|
74
|
+
* Rejects only if detach() is called before that. Client auth failures
|
|
75
|
+
* surface via the app's own `await client.connect()`, not here.
|
|
76
|
+
*/
|
|
77
|
+
ready(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Detach from the client: remove every handler this wrapper added,
|
|
80
|
+
* unsubscribe its topics and lobby (when connected), clear state.
|
|
81
|
+
* Terminal and idempotent; never touches the socket. To use notify again,
|
|
82
|
+
* construct a new instance.
|
|
43
83
|
*/
|
|
44
|
-
|
|
84
|
+
detach(): void;
|
|
85
|
+
private _onConnect;
|
|
45
86
|
/**
|
|
46
|
-
*
|
|
87
|
+
* One setup pass per connection epoch. Serves both initial setup (epoch 1)
|
|
88
|
+
* and reconnect restore (epoch > 1). Aborts silently whenever a newer
|
|
89
|
+
* epoch started or the wrapper detached — checked after every await.
|
|
47
90
|
*/
|
|
48
|
-
|
|
91
|
+
private _runSetup;
|
|
92
|
+
private _scheduleLobbyRefresh;
|
|
49
93
|
/**
|
|
50
94
|
* Subscribe to a notification channel (idempotent).
|
|
51
95
|
* Returns the NotifyChannel instance.
|
|
@@ -63,15 +107,25 @@ export declare class NoLagNotify extends EventEmitter<NotifyClientEvents> {
|
|
|
63
107
|
* Mark all notifications as read across all channels.
|
|
64
108
|
*/
|
|
65
109
|
markAllRead(): void;
|
|
110
|
+
private _assertUsable;
|
|
66
111
|
private _subscribeChannel;
|
|
67
112
|
private _emitBadgeUpdated;
|
|
113
|
+
/**
|
|
114
|
+
* On a shared client, presence events from other apps' wrappers arrive on
|
|
115
|
+
* the same connection-level events. Wrappers stamp their presence with a
|
|
116
|
+
* `__scope` (their appName); a mismatched tag means another app's data.
|
|
117
|
+
* Untagged presence is accepted (older peers in this same app).
|
|
118
|
+
*/
|
|
119
|
+
private _foreignScope;
|
|
68
120
|
private _handleRoomPresenceJoin;
|
|
69
121
|
private _handleRoomPresenceLeave;
|
|
70
122
|
private _handleRoomPresenceUpdate;
|
|
71
|
-
private _setupLobby;
|
|
72
123
|
private _handleLobbyJoin;
|
|
73
124
|
private _handleLobbyLeave;
|
|
74
125
|
private _handleLobbyUpdate;
|
|
75
|
-
|
|
76
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Reconcile tracked presence against a fresh lobby snapshot. One path for
|
|
128
|
+
* initial hydration, reconnect restore, and the deferred refetch.
|
|
129
|
+
*/
|
|
130
|
+
private _diffHydratePresence;
|
|
77
131
|
}
|
package/dist/NotifyChannel.d.ts
CHANGED
|
@@ -13,9 +13,12 @@ export declare class NotifyChannel extends EventEmitter<NotifyChannelEvents> {
|
|
|
13
13
|
private _options;
|
|
14
14
|
private _store;
|
|
15
15
|
private _log;
|
|
16
|
+
private _isConnected;
|
|
16
17
|
private _active;
|
|
18
|
+
private _onNotificationsRef;
|
|
19
|
+
private _onReadRef;
|
|
17
20
|
/** @internal */
|
|
18
|
-
constructor(name: string, roomContext: RoomContext, options: ResolvedNotifyOptions, log: (...args: unknown[]) => void);
|
|
21
|
+
constructor(name: string, roomContext: RoomContext, options: ResolvedNotifyOptions, log: (...args: unknown[]) => void, isConnected: () => boolean);
|
|
19
22
|
/** All notifications in this channel (timestamp order) */
|
|
20
23
|
get notifications(): Notification[];
|
|
21
24
|
/** Number of unread notifications */
|
package/dist/browser.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{NoLag as t}from"@nolag/js-sdk";class e{constructor(){this._handlers=new Map}on(t,e){return this._handlers.has(t)||this._handlers.set(t,new Set),this._handlers.get(t).add(e),this}off(t,e){return e?this._handlers.get(t)?.delete(e):this._handlers.delete(t),this}removeAllListeners(){return this._handlers.clear(),this}emit(t,...e){const s=this._handlers.get(t);if(s)for(const n of s)try{n(...e)}catch(e){console.error(`Error in ${String(t)} handler:`,e)}}listenerCount(t){return this._handlers.get(t)?.size??0}}class s{constructor(t){this._notifications=[],this._ids=new Set,this._maxSize=t}add(t){if(this._ids.has(t.id))return!1;for(this._ids.add(t.id),this._notifications.push(t),this._notifications.length>1&&t.timestamp<this._notifications[this._notifications.length-2].timestamp&&this._notifications.sort((t,e)=>t.timestamp-e.timestamp);this._notifications.length>this._maxSize;){const t=this._notifications.shift();this._ids.delete(t.id)}return!0}markRead(t){const e=this._notifications.find(e=>e.id===t);return!!e&&(e.read=!0,!0)}markAllRead(){for(const t of this._notifications)t.read=!0}getAll(){return[...this._notifications]}getUnread(){return this._notifications.filter(t=>!t.read)}get unreadCount(){return this._notifications.filter(t=>!t.read).length}get size(){return this._notifications.length}has(t){return this._ids.has(t)}clear(){this._notifications=[],this._ids.clear()}}function n(){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 i(t,e){return e?(...e)=>{console.log(`[${t}]`,...e)}:(...t)=>{}}const o="notifications",r="_read";class a extends e{constructor(t,e,n,i){super(),this._active=!1,this.name=t,this._roomContext=e,this._options=n,this._store=new s(n.maxNotificationCache),this._log=i}get notifications(){return this._store.getAll()}get unreadCount(){return this._store.unreadCount}get active(){return this._active}send(t,e){const s={id:n(),channel:this.name,title:t,body:e?.body,icon:e?.icon,data:e?.data,timestamp:Date.now()};this._roomContext.emit(o,{id:s.id,channel:s.channel,title:s.title,body:s.body,icon:s.icon,data:s.data,timestamp:s.timestamp})}markRead(t){this._store.markRead(t)&&(this._log("Mark read:",t),this._roomContext.emit(r,{id:t,channel:this.name}),this.emit("read",t))}markAllRead(){this._store.markAllRead(),this._log("Mark all read:",this.name),this._roomContext.emit(r,{all:!0,channel:this.name}),this.emit("readAll")}getNotifications(){return this._store.getAll()}getUnread(){return this._store.getUnread()}_subscribe(){this._log("Channel subscribe:",this.name),this._roomContext.subscribe(o),this._roomContext.subscribe(r),this._roomContext.on(o,(t,e)=>{this._handleIncomingNotification(t,e)}),this._roomContext.on(r,t=>{this._handleIncomingRead(t)})}_activate(){this._log("Channel activate:",this.name),this._active=!0}_deactivate(){this._log("Channel deactivate:",this.name),this._active=!1}_handleReplayStart(t){this.emit("replayStart",{count:t})}_handleReplayEnd(t){this.emit("replayEnd",{replayed:t})}_cleanup(){this._log("Channel cleanup:",this.name),this._roomContext.unsubscribe(o),this._roomContext.unsubscribe(r),this._roomContext.off(o),this._roomContext.off(r),this._store.clear(),this.removeAllListeners()}_handleIncomingNotification(t,e){const s=t,i={id:s.id||n(),channel:this.name,title:s.title,body:s.body,icon:s.icon,data:s.data,timestamp:s.timestamp||Date.now(),read:!1,isReplay:e.isReplay??!1};this._store.add(i)&&(this._log("Notification received:",i.id,i.title),this.emit("notification",i))}_handleIncomingRead(t){const e=t;!0===e.all?(this._store.markAllRead(),this.emit("readAll")):"string"==typeof e.id&&this._store.markRead(e.id)&&this.emit("read",e.id)}}class c{constructor(){this._counts=new Map}update(t,e){this._counts.set(t,e)}get(t){return this._counts.get(t)??0}getAll(){const t={};let e=0;for(const[s,n]of this._counts)t[s]=n,e+=n;return{total:e,byChannel:t}}clear(){this._counts.clear()}}class h{constructor(){this._users=new Map,this._actorToUserId=new Map}addFromPresence(t,e,s){if(!e?.userId)return null;const n=this._actorToUserId.get(t),i=e.userId||n||t,o={userId:i,actorTokenId:t,metadata:e.metadata,joinedAt:s||Date.now()};return this._users.set(i,o),this._actorToUserId.set(t,i),o}removeByActorId(t){const e=this._actorToUserId.get(t);if(!e)return null;const s=this._users.get(e)||null;return this._users.delete(e),this._actorToUserId.delete(t),s}getUser(t){return this._users.get(t)}getUserByActorId(t){const e=this._actorToUserId.get(t);return e?this._users.get(e):void 0}getAll(){return Array.from(this._users.values())}clear(){this._users.clear(),this._actorToUserId.clear()}}class l extends e{constructor(t,e={}){super(),this._client=null,this._channels=new Map,this._lobby=null,this._badgeManager=new c,this._presenceManager=new h,this._actorToUserId=new Map,this._token=t,this._userId=n(),this._options={metadata:e.metadata,appName:e.appName??"notify",url:e.url,maxNotificationCache:e.maxNotificationCache??500,debug:e.debug??!1,reconnect:e.reconnect??!0,channels:e.channels??[]},this._log=i("NoLagNotify",this._options.debug)}get connected(){return this._client?.connected??!1}get channels(){return this._channels}async connect(){this._log("Connecting...");const e={debug:this._options.debug,reconnect:this._options.reconnect};this._options.url&&(e.url=this._options.url),this._client=t(this._token,e),this._client.on("connect",()=>{this._log("Connected"),this._channels.size>0&&(this._log("Reconnected — restoring channels..."),this._restoreChannels(),this.emit("reconnected"))}),this._client.on("disconnect",t=>{this._log("Disconnected:",t),this.emit("disconnected",t)}),this._client.on("reconnect",()=>{this._log("Reconnecting...")}),this._client.on("error",t=>{this._log("Error:",t),this.emit("error",t)}),this._client.on("replay:start",t=>{const e=t;for(const t of this._channels.values())t._handleReplayStart(e.count)}),this._client.on("replay:end",t=>{const e=t;for(const t of this._channels.values())t._handleReplayEnd(e.replayed)}),await this._client.connect(),this._client.on("presence:join",t=>{this._handleRoomPresenceJoin(t)}),this._client.on("presence:leave",t=>{this._handleRoomPresenceLeave(t)}),this._client.on("presence:update",t=>{this._handleRoomPresenceUpdate(t)}),this._log("Local userId:",this._userId,"→ actorId:",this._client.actorId),await this._setupLobby();for(const t of this._options.channels)this._subscribeChannel(t);this.emit("connected"),setTimeout(()=>{this._lobby&&this._client?.connected&&this._lobby.fetchPresence().then(t=>{this._hydratePresence(t)}).catch(()=>{})},2e3)}disconnect(){this._log("Disconnecting...");for(const t of[...this._channels.keys()])this.unsubscribe(t);this._lobby?.unsubscribe(),this._lobby=null,this._client?.disconnect(),this._client=null,this._badgeManager.clear(),this._presenceManager.clear(),this._actorToUserId.clear()}subscribe(t){if(!this._client)throw new Error("Not connected — call connect() first");const e=this._channels.get(t);if(e)return e;const s=this._subscribeChannel(t);return s._activate(),s}unsubscribe(t){const e=this._channels.get(t);e&&(this._log("Unsubscribing channel:",t),e._cleanup(),this._channels.delete(t),this._badgeManager.update(t,0),this._emitBadgeUpdated())}getBadgeCounts(){return this._badgeManager.getAll()}markAllRead(){for(const t of this._channels.values())t.markAllRead()}_subscribeChannel(t){if(!this._client)throw new Error("Not connected — call connect() first");this._log("Subscribing channel:",t);const e=this._client.setApp(this._options.appName).setRoom(t),s=new a(t,e,this._options,i(`NotifyChannel:${t}`,this._options.debug));return this._channels.set(t,s),s._subscribe(),s.on("notification",e=>{this._badgeManager.update(t,s.unreadCount),this._emitBadgeUpdated(),this.emit("notification",e)}),s.on("read",()=>{this._badgeManager.update(t,s.unreadCount),this._emitBadgeUpdated()}),s.on("readAll",()=>{this._badgeManager.update(t,0),this._emitBadgeUpdated()}),s}_emitBadgeUpdated(){this.emit("badgeUpdated",this._badgeManager.getAll())}_handleRoomPresenceJoin(t){if(t.actorTokenId===this._client?.actorId)return;const e=t.presence;if(!e?.userId)return;const s=this._presenceManager.addFromPresence(t.actorTokenId,e);s&&this._actorToUserId.set(t.actorTokenId,s.userId)}_handleRoomPresenceLeave(t){t.actorTokenId!==this._client?.actorId&&this._presenceManager.removeByActorId(t.actorTokenId)}_handleRoomPresenceUpdate(t){if(t.actorTokenId===this._client?.actorId)return;const e=t.presence;e?.userId&&this._presenceManager.addFromPresence(t.actorTokenId,e)}async _setupLobby(){if(!this._client)return;this._lobby=this._client.setApp(this._options.appName).setLobby("online");const t=t=>e=>{const s=e;"join"===t?this._handleLobbyJoin(s):"leave"===t?this._handleLobbyLeave(s):this._handleLobbyUpdate(s)};this._client.on("lobbyPresence:join",t("join")),this._client.on("lobbyPresence:leave",t("leave")),this._client.on("lobbyPresence:update",t("update"));try{const t=await this._lobby.subscribe();this._hydratePresence(t),this._log("Lobby subscribed")}catch(t){this._log("Lobby subscription failed:",t)}}_handleLobbyJoin(t){const{actorId:e,data:s}=t;if(e===this._client?.actorId)return;const n=s;if(!n?.userId)return;const i=this._presenceManager.addFromPresence(e,n);i&&this._actorToUserId.set(e,i.userId)}_handleLobbyLeave(t){const{actorId:e}=t;e!==this._client?.actorId&&(this._presenceManager.removeByActorId(e),this._actorToUserId.delete(e))}_handleLobbyUpdate(t){const{actorId:e,data:s}=t;if(e===this._client?.actorId)return;const n=s;n?.userId&&this._presenceManager.addFromPresence(e,n)}_hydratePresence(t){for(const e of Object.keys(t)){const s=t[e];for(const t of Object.keys(s)){if(t===this._client?.actorId)continue;const e=s[t],n=e?.presence??e;if(n?.userId){const e=this._presenceManager.addFromPresence(t,n);e&&this._actorToUserId.set(t,e.userId)}}}}_restoreChannels(){this._lobby?.fetchPresence().then(t=>{this._presenceManager.clear(),this._actorToUserId.clear(),this._hydratePresence(t)}).catch(t=>{this._log("Failed to re-fetch lobby presence:",t)})}}export{e as EventEmitter,l as NoLagNotify,a as NotifyChannel};
|
|
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 s=this._handlers.get(e);if(s)for(const i of s)try{i(...t)}catch(t){console.error(`Error in ${String(e)} handler:`,t)}}listenerCount(e){return this._handlers.get(e)?.size??0}}class t{constructor(e){this._notifications=[],this._ids=new Set,this._maxSize=e}add(e){if(this._ids.has(e.id))return!1;for(this._ids.add(e.id),this._notifications.push(e),this._notifications.length>1&&e.timestamp<this._notifications[this._notifications.length-2].timestamp&&this._notifications.sort((e,t)=>e.timestamp-t.timestamp);this._notifications.length>this._maxSize;){const e=this._notifications.shift();this._ids.delete(e.id)}return!0}markRead(e){const t=this._notifications.find(t=>t.id===e);return!!t&&(t.read=!0,!0)}markAllRead(){for(const e of this._notifications)e.read=!0}getAll(){return[...this._notifications]}getUnread(){return this._notifications.filter(e=>!e.read)}get unreadCount(){return this._notifications.filter(e=>!e.read).length}get size(){return this._notifications.length}has(e){return this._ids.has(e)}clear(){this._notifications=[],this._ids.clear()}}function s(){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 i(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const n=new WeakMap;const o="notifications",r="_read";class a extends e{constructor(e,s,i,n,o){super(),this._active=!1,this._onNotificationsRef=null,this._onReadRef=null,this.name=e,this._roomContext=s,this._options=i,this._store=new t(i.maxNotificationCache),this._log=n,this._isConnected=o}get notifications(){return this._store.getAll()}get unreadCount(){return this._store.unreadCount}get active(){return this._active}send(e,t){const i={id:s(),channel:this.name,title:e,body:t?.body,icon:t?.icon,data:t?.data,timestamp:Date.now()};this._roomContext.emit(o,{id:i.id,channel:i.channel,title:i.title,body:i.body,icon:i.icon,data:i.data,timestamp:i.timestamp})}markRead(e){this._store.markRead(e)&&(this._log("Mark read:",e),this._roomContext.emit(r,{id:e,channel:this.name}),this.emit("read",e))}markAllRead(){this._store.markAllRead(),this._log("Mark all read:",this.name),this._roomContext.emit(r,{all:!0,channel:this.name}),this.emit("readAll")}getNotifications(){return this._store.getAll()}getUnread(){return this._store.getUnread()}_subscribe(){this._log("Channel subscribe:",this.name),this._roomContext.subscribe(o),this._roomContext.subscribe(r),this._onNotificationsRef=(e,t)=>{this._handleIncomingNotification(e,t)},this._roomContext.on(o,this._onNotificationsRef),this._onReadRef=e=>{this._handleIncomingRead(e)},this._roomContext.on(r,this._onReadRef)}_activate(){this._log("Channel activate:",this.name),this._active=!0}_deactivate(){this._log("Channel deactivate:",this.name),this._active=!1}_handleReplayStart(e){this.emit("replayStart",{count:e})}_handleReplayEnd(e){this.emit("replayEnd",{replayed:e})}_cleanup(){this._log("Channel cleanup:",this.name),this._isConnected()&&(this._roomContext.unsubscribe(o),this._roomContext.unsubscribe(r)),this._onNotificationsRef&&this._roomContext.off(o,this._onNotificationsRef),this._onReadRef&&this._roomContext.off(r,this._onReadRef),this._onNotificationsRef=null,this._onReadRef=null,this._store.clear(),this.removeAllListeners()}_handleIncomingNotification(e,t){const i=e,n={id:i.id||s(),channel:this.name,title:i.title,body:i.body,icon:i.icon,data:i.data,timestamp:i.timestamp||Date.now(),read:!1,isReplay:t.isReplay??!1};this._store.add(n)&&(this._log("Notification received:",n.id,n.title),this.emit("notification",n))}_handleIncomingRead(e){const t=e;!0===t.all?(this._store.markAllRead(),this.emit("readAll")):"string"==typeof t.id&&this._store.markRead(t.id)&&this.emit("read",t.id)}}class h{constructor(){this._counts=new Map}update(e,t){this._counts.set(e,t)}get(e){return this._counts.get(e)??0}getAll(){const e={};let t=0;for(const[s,i]of this._counts)e[s]=i,t+=i;return{total:t,byChannel:e}}clear(){this._counts.clear()}}class c{constructor(){this._users=new Map,this._actorToUserId=new Map}addFromPresence(e,t,s){if(!t?.userId)return null;const i=this._actorToUserId.get(e),n=t.userId||i||e,o={userId:n,actorTokenId:e,metadata:t.metadata,joinedAt:s||Date.now()};return this._users.set(n,o),this._actorToUserId.set(e,n),o}removeByActorId(e){const t=this._actorToUserId.get(e);if(!t)return null;const s=this._users.get(t)||null;return this._users.delete(t),this._actorToUserId.delete(e),s}getUser(e){return this._users.get(e)}getUserByActorId(e){const t=this._actorToUserId.get(e);return t?this._users.get(t):void 0}getAll(){return Array.from(this._users.values())}clear(){this._users.clear(),this._actorToUserId.clear()}}class _ extends e{constructor(e){if(super(),this._channels=new Map,this._lobby=null,this._badgeManager=new h,this._presenceManager=new c,this._actorToUserId=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._onReplayStartRef=e=>{const t=e;for(const e of this._channels.values())e._handleReplayStart(t.count)},this._onReplayEndRef=e=>{const t=e;for(const e of this._channels.values())e._handleReplayEnd(t.replayed)},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("NoLagNotify requires an injected NoLag client: new NoLagNotify({ client, ... })");this._client=e.client,this._userId=s(),this._options={metadata:e.metadata,appName:e.appName??"notify",maxNotificationCache:e.maxNotificationCache??500,debug:e.debug??!1,channels:e.channels??[]},this._log=i("NoLagNotify",this._options.debug),this._readyPromise=new Promise((e,t)=>{this._readyResolve=e,this._readyReject=t}),this._readyPromise.catch(()=>{}),function(e,t,s){let i=n.get(e);i||(i=new Map,n.set(e,i));const o=i.get(t);o&&console.warn(`[${s}] Another wrapper (${o}) is already attached to this client for app "${t}". Use one wrapper per (client, app) — detach the other instance first.`),i.set(t,s)}(this._client,this._options.appName,"NoLagNotify"),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("replay:start",this._onReplayStartRef),this._client.on("replay:end",this._onReplayEndRef),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 channels(){return this._channels}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("replay:start",this._onReplayStartRef),this._client.off("replay:end",this._onReplayEndRef),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._channels.keys()])this._channels.get(e)._cleanup(),this._channels.delete(e);if(this._lobby&&this._client.connected)try{this._lobby.unsubscribe()}catch{}var e,t;this._lobby=null,this._badgeManager.clear(),this._presenceManager.clear(),this._actorToUserId.clear(),e=this._client,t=this._options.appName,n.get(e)?.delete(t),this._isReady||this._readyReject(new Error("NoLagNotify 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._log("Local userId:",this._userId,"→ actorId:",this._client.actorId),this._lobby||(this._lobby=this._client.setApp(this._options.appName).setLobby("online"));try{const e=await this._lobby.subscribe();if(t())return;this._diffHydratePresence(e),this._log("Lobby subscribed")}catch(e){if(t())return;this._log("Lobby subscription failed:",e)}if(!this._isReady)for(const e of this._options.channels)this._subscribeChannel(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._diffHydratePresence(t)}).catch(()=>{})},2e3)}subscribe(e){this._assertUsable();const t=this._channels.get(e);if(t)return t;const s=this._subscribeChannel(e);return s._activate(),s}unsubscribe(e){const t=this._channels.get(e);t&&(this._log("Unsubscribing channel:",e),t._cleanup(),this._channels.delete(e),this._badgeManager.update(e,0),this._emitBadgeUpdated())}getBadgeCounts(){return this._badgeManager.getAll()}markAllRead(){for(const e of this._channels.values())e.markAllRead()}_assertUsable(){if(this._detached)throw new Error("NoLagNotify has been detached — construct a new instance");if(!this._isReady)throw new Error('NoLagNotify not ready — await ready() or the "connected" event')}_subscribeChannel(e){this._log("Subscribing channel:",e);const t=this._client.setApp(this._options.appName).setRoom(e),s=new a(e,t,this._options,i(`NotifyChannel:${e}`,this._options.debug),()=>this._client.connected);return this._channels.set(e,s),s._subscribe(),s.on("notification",t=>{this._badgeManager.update(e,s.unreadCount),this._emitBadgeUpdated(),this.emit("notification",t)}),s.on("read",()=>{this._badgeManager.update(e,s.unreadCount),this._emitBadgeUpdated()}),s.on("readAll",()=>{this._badgeManager.update(e,0),this._emitBadgeUpdated()}),s}_emitBadgeUpdated(){this.emit("badgeUpdated",this._badgeManager.getAll())}_foreignScope(e){const t=e?.__scope;return"string"==typeof t&&t!==this._options.appName}_handleRoomPresenceJoin(e){if(e.actorTokenId===this._client.actorId)return;const t=e.presence;if(!t?.userId||this._foreignScope(t))return;const s=this._presenceManager.addFromPresence(e.actorTokenId,t);s&&this._actorToUserId.set(e.actorTokenId,s.userId)}_handleRoomPresenceLeave(e){e.actorTokenId!==this._client.actorId&&this._presenceManager.removeByActorId(e.actorTokenId)}_handleRoomPresenceUpdate(e){if(e.actorTokenId===this._client.actorId)return;const t=e.presence;t?.userId&&!this._foreignScope(t)&&this._presenceManager.addFromPresence(e.actorTokenId,t)}_handleLobbyJoin(e){const{actorId:t,data:s}=e;if(t===this._client.actorId)return;const i=s;if(!i?.userId||this._foreignScope(i))return;const n=this._presenceManager.addFromPresence(t,i);n&&this._actorToUserId.set(t,n.userId)}_handleLobbyLeave(e){const{actorId:t,data:s}=e;if(t===this._client.actorId)return;const i=s;this._foreignScope(i)||(this._presenceManager.removeByActorId(t),this._actorToUserId.delete(t))}_handleLobbyUpdate(e){const{actorId:t,data:s}=e;if(t===this._client.actorId)return;const i=s;i?.userId&&!this._foreignScope(i)&&this._presenceManager.addFromPresence(t,i)}_diffHydratePresence(e){const t=new Set;for(const s of Object.keys(e)){const i=e[s];for(const e of Object.keys(i)){if(e===this._client.actorId)continue;const s=i[e],n=s?.presence??s;if(n?.userId&&!this._foreignScope(n)){t.add(e);const s=this._presenceManager.addFromPresence(e,n);s&&this._actorToUserId.set(e,s.userId)}}}for(const[e]of[...this._actorToUserId])t.has(e)||(this._presenceManager.removeByActorId(e),this._actorToUserId.delete(e))}}export{e as EventEmitter,_ as NoLagNotify,a as NotifyChannel};
|
|
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/NotificationStore.ts","../src/utils.ts","../src/constants.ts","../src/NotifyChannel.ts","../src/BadgeManager.ts","../src/PresenceManager.ts","../src/NoLagNotify.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","NotificationStore","maxSize","_notifications","_ids","_maxSize","notification","id","push","length","timestamp","sort","a","b","removed","shift","markRead","find","n","read","markAllRead","getAll","getUnread","filter","unreadCount","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","TOPIC_NOTIFICATIONS","TOPIC_READ","NotifyChannel","name","roomContext","options","super","_active","_roomContext","_options","_store","maxNotificationCache","_log","notifications","active","send","title","opts","channel","body","icon","data","Date","now","all","getNotifications","_subscribe","subscribe","meta","_handleIncomingNotification","_handleIncomingRead","_activate","_deactivate","_handleReplayStart","count","_handleReplayEnd","replayed","_cleanup","unsubscribe","raw","isReplay","BadgeManager","_counts","update","byChannel","total","PresenceManager","_users","_actorToUserId","addFromPresence","actorTokenId","presenceData","joinedAt","userId","existing","user","metadata","removeByActorId","getUser","getUserByActorId","undefined","Array","from","values","NoLagNotify","token","_client","_channels","_lobby","_badgeManager","_presenceManager","_token","_userId","appName","url","debug","reconnect","channels","connected","connect","clientOptions","NoLag","_restoreChannels","reason","_handleRoomPresenceJoin","_handleRoomPresenceLeave","_handleRoomPresenceUpdate","actorId","_setupLobby","channelName","_subscribeChannel","setTimeout","fetchPresence","then","state","_hydratePresence","catch","disconnect","keys","Error","_emitBadgeUpdated","getBadgeCounts","setApp","setRoom","presence","setLobby","lobbyHandler","type","_handleLobbyJoin","_handleLobbyLeave","_handleLobbyUpdate","initialState","err","roomId","Object","roomPresence"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/NotificationStore.ts","../src/utils.ts","../src/constants.ts","../src/NotifyChannel.ts","../src/BadgeManager.ts","../src/PresenceManager.ts","../src/NoLagNotify.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","NotificationStore","maxSize","_notifications","_ids","_maxSize","notification","id","push","length","timestamp","sort","a","b","removed","shift","markRead","find","n","read","markAllRead","getAll","getUnread","filter","unreadCount","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","wrapperRegistry","WeakMap","TOPIC_NOTIFICATIONS","TOPIC_READ","NotifyChannel","name","roomContext","options","isConnected","super","_active","_onNotificationsRef","_onReadRef","_roomContext","_options","_store","maxNotificationCache","_log","_isConnected","notifications","active","send","title","opts","channel","body","icon","data","Date","now","all","getNotifications","_subscribe","subscribe","meta","_handleIncomingNotification","_handleIncomingRead","_activate","_deactivate","_handleReplayStart","count","_handleReplayEnd","replayed","_cleanup","unsubscribe","raw","isReplay","BadgeManager","_counts","update","byChannel","total","PresenceManager","_users","_actorToUserId","addFromPresence","actorTokenId","presenceData","joinedAt","userId","existing","user","metadata","removeByActorId","getUser","getUserByActorId","undefined","Array","from","values","NoLagNotify","_channels","_lobby","_badgeManager","_presenceManager","_epoch","_detached","_isReady","_lobbyRefreshTimer","_onConnectRef","_onConnect","_onDisconnectRef","reason","_onReconnectRef","_onErrorRef","_onReplayStartRef","_onReplayEndRef","_onPresenceJoinRef","_handleRoomPresenceJoin","_onPresenceLeaveRef","_handleRoomPresenceLeave","_onPresenceUpdateRef","_handleRoomPresenceUpdate","_onLobbyJoinRef","_handleLobbyJoin","_onLobbyLeaveRef","_handleLobbyLeave","_onLobbyUpdateRef","_handleLobbyUpdate","client","TypeError","_client","_userId","appName","debug","channels","_readyPromise","Promise","resolve","reject","_readyResolve","_readyReject","catch","wrapperName","apps","warn","registerWrapper","queueMicrotask","connected","ready","detach","clearTimeout","keys","Error","_runSetup","epoch","stale","actorId","setApp","setLobby","state","_diffHydratePresence","err","channelName","_subscribeChannel","_scheduleLobbyRefresh","setTimeout","fetchPresence","then","_assertUsable","_emitBadgeUpdated","getBadgeCounts","setRoom","_foreignScope","scope","__scope","presence","freshActors","roomId","Object","roomPresence"],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -8,3 +8,5 @@ export declare const TOPIC_NOTIFICATIONS = "notifications";
|
|
|
8
8
|
export declare const TOPIC_READ = "_read";
|
|
9
9
|
/** Lobby ID for global online presence */
|
|
10
10
|
export declare const LOBBY_ID = "online";
|
|
11
|
+
/** Delay before the post-setup lobby presence refetch (catches simultaneous joiners) */
|
|
12
|
+
export declare const LOBBY_REFRESH_DELAY_MS = 2000;
|