@nolag/notify 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 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
- const notify = new NoLagNotify("YOUR_ACTOR_TOKEN", {
31
- channels: ["alerts", "updates"],
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 notify.connect();
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(token: string, options?: NoLagNotifyOptions);
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
- | `connect()` | `Promise<void>` | Connect to NoLag |
89
- | `disconnect()` | `void` | Disconnect |
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 |
@@ -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 notify = new NoLagNotify(token);
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 notify.connect();
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
- constructor(token: string, options?: NoLagNotifyOptions);
37
- /** Whether the underlying connection is established */
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
- * Connect to NoLag and set up global presence.
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
- connect(): Promise<void>;
84
+ detach(): void;
85
+ private _onConnect;
45
86
  /**
46
- * Disconnect from NoLag and clean up all channels.
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
- disconnect(): void;
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
- private _hydratePresence;
76
- private _restoreChannels;
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
  }
@@ -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
@@ -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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"}
@@ -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;