@nolag/dash 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DashboardPanel.d.ts +45 -6
- package/dist/NoLagDash.d.ts +2 -4
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/index.cjs +131 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +131 -19
- package/dist/index.mjs.map +1 -1
- package/dist/react-native.js +131 -19
- package/dist/react-native.js.map +1 -1
- package/dist/types.d.ts +35 -0
- package/dist/utils.d.ts +49 -0
- package/package.json +1 -1
package/dist/DashboardPanel.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RoomContext } from '@nolag/js-sdk';
|
|
2
2
|
import { EventEmitter } from './EventEmitter';
|
|
3
|
-
import type { DashPanelEvents, MetricPoint, WidgetUpdate, WidgetType, Aggregation, DashboardViewer, DashPresenceData, ResolvedDashOptions } from './types';
|
|
3
|
+
import type { DashPanelEvents, MetricPoint, WidgetUpdate, WidgetType, Aggregation, DashboardViewer, DashPresenceData, ResolvedDashOptions, FilterValue, DashFilterOptions, DashFilterTopic } from './types';
|
|
4
4
|
export declare class DashboardPanel extends EventEmitter<DashPanelEvents> {
|
|
5
5
|
readonly name: string;
|
|
6
6
|
private _roomContext;
|
|
@@ -13,26 +13,65 @@ export declare class DashboardPanel extends EventEmitter<DashPanelEvents> {
|
|
|
13
13
|
private _isConnected;
|
|
14
14
|
private _onMetricsRef;
|
|
15
15
|
private _onWidgetsRef;
|
|
16
|
+
/**
|
|
17
|
+
* Filter values applied per topic. Mirrors what was actually sent to the
|
|
18
|
+
* server, including the `__none__` placeholder, so add/remove merge against
|
|
19
|
+
* the real subscription rather than a cleaner-looking copy of it.
|
|
20
|
+
*/
|
|
21
|
+
private _filters;
|
|
16
22
|
/** @internal */
|
|
17
23
|
constructor(name: string, roomContext: RoomContext, localViewerId: string, localActorId: string, options: ResolvedDashOptions, log: (...args: unknown[]) => void, isConnected: () => boolean);
|
|
18
24
|
publishMetric(streamId: string, value: number, opts?: {
|
|
19
25
|
unit?: string;
|
|
20
26
|
tags?: Record<string, string>;
|
|
21
27
|
filter?: string;
|
|
28
|
+
filters?: string[];
|
|
22
29
|
}): MetricPoint;
|
|
23
|
-
/**
|
|
30
|
+
/** The filter values currently applied to this panel, by topic. */
|
|
31
|
+
get filters(): Record<DashFilterTopic, FilterValue[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Replace this panel's filters — only data published with one of these
|
|
34
|
+
* values is delivered. Applies to metrics and widgets unless you scope the
|
|
35
|
+
* call to one with `{ topic }`.
|
|
36
|
+
*
|
|
37
|
+
* Passing an empty array clears filtering and restores the wildcard
|
|
38
|
+
* subscription, which receives everything.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* panel.setFilters(['cpu', 'mem']); // both topics
|
|
43
|
+
* panel.setFilters(['cpu'], { topic: 'metrics' }); // metrics only
|
|
44
|
+
* panel.setFilters([['cpu', 'prod']]); // cpu AND prod
|
|
45
|
+
* panel.setFilters([]); // everything
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
setFilters(values: FilterValue[], opts?: DashFilterOptions): void;
|
|
49
|
+
/** Add filter values to the existing set. Existing AND groups are kept. */
|
|
50
|
+
addFilters(values: string[], opts?: DashFilterOptions): void;
|
|
51
|
+
/**
|
|
52
|
+
* Remove filter values from the existing set. Removing the last value
|
|
53
|
+
* restores the wildcard subscription.
|
|
54
|
+
*/
|
|
55
|
+
removeFilters(values: string[], opts?: DashFilterOptions): void;
|
|
56
|
+
private _targetTopics;
|
|
57
|
+
/** Replace all metric filters — alias for `setFilters(values, { topic: 'metrics' })`. */
|
|
24
58
|
setMetricFilters(filters: string[]): void;
|
|
25
|
-
/** Add filter values to the existing metric filter set */
|
|
59
|
+
/** Add filter values to the existing metric filter set. */
|
|
26
60
|
addMetricFilters(filters: string[]): void;
|
|
27
|
-
/** Remove specific filter values from the metric filter set */
|
|
61
|
+
/** Remove specific filter values from the metric filter set. */
|
|
28
62
|
removeMetricFilters(filters: string[]): void;
|
|
29
|
-
publishWidget(widgetId: string, type: WidgetType, data: Record<string, unknown>, label?: string
|
|
63
|
+
publishWidget(widgetId: string, type: WidgetType, data: Record<string, unknown>, label?: string, opts?: {
|
|
64
|
+
filter?: string;
|
|
65
|
+
filters?: string[];
|
|
66
|
+
}): WidgetUpdate;
|
|
30
67
|
getMetrics(streamId?: string): MetricPoint[];
|
|
31
68
|
getAggregation(streamId: string, windowMs?: number): Aggregation;
|
|
32
69
|
getWidget(widgetId: string): WidgetUpdate | undefined;
|
|
33
70
|
getWidgets(): WidgetUpdate[];
|
|
34
71
|
getViewers(): DashboardViewer[];
|
|
35
|
-
_subscribe(metricFilters?: string[]): void;
|
|
72
|
+
_subscribe(metricFilters?: string[], filters?: FilterValue[]): void;
|
|
73
|
+
/** @internal Attach the metric and widget listeners. */
|
|
74
|
+
private _attachHandlers;
|
|
36
75
|
_activate(): void;
|
|
37
76
|
_deactivate(): void;
|
|
38
77
|
_handlePresenceJoin(actorTokenId: string, pd: DashPresenceData): void;
|
package/dist/NoLagDash.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { NoLagSocket } from '@nolag/js-sdk';
|
|
2
2
|
import { EventEmitter } from './EventEmitter';
|
|
3
3
|
import { DashboardPanel } from './DashboardPanel';
|
|
4
|
-
import type { NoLagDashOptions, DashClientEvents, DashboardViewer } from './types';
|
|
4
|
+
import type { NoLagDashOptions, DashClientEvents, DashboardViewer, JoinPanelOptions } from './types';
|
|
5
5
|
/**
|
|
6
6
|
* NoLagDash — high-level live dashboard SDK built on @nolag/js-sdk.
|
|
7
7
|
*
|
|
@@ -98,9 +98,7 @@ export declare class NoLagDash extends EventEmitter<DashClientEvents> {
|
|
|
98
98
|
* Join a dashboard panel. If the panel was pre-subscribed via the `panels`
|
|
99
99
|
* option, activates it. Otherwise creates, subscribes, and activates it.
|
|
100
100
|
*/
|
|
101
|
-
joinPanel(name: string, opts?:
|
|
102
|
-
metricFilters?: string[];
|
|
103
|
-
}): DashboardPanel;
|
|
101
|
+
joinPanel(name: string, opts?: JoinPanelOptions): DashboardPanel;
|
|
104
102
|
/**
|
|
105
103
|
* Leave a dashboard panel. Fully unsubscribes and removes it.
|
|
106
104
|
*/
|
package/dist/browser.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
class e{constructor(){this._handlers=new Map}on(e,t){return this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t),this}off(e,t){return t?this._handlers.get(e)?.delete(t):this._handlers.delete(e),this}removeAllListeners(){return this._handlers.clear(),this}emit(e,...t){const 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._streams=new Map,this._ids=new Set,this._maxPerStream=e}add(e){if(this._ids.has(e.id))return!1;this._ids.add(e.id),this._streams.has(e.streamId)||this._streams.set(e.streamId,[]);const t=this._streams.get(e.streamId);for(t.push(e),t.length>1&&e.timestamp<t[t.length-2].timestamp&&t.sort((e,t)=>e.timestamp-t.timestamp);t.length>this._maxPerStream;){const e=t.shift();this._ids.delete(e.id)}return!0}getAll(e){if(e)return[...this._streams.get(e)??[]];const t=[];for(const e of this._streams.values())t.push(...e);return t.sort((e,t)=>e.timestamp-t.timestamp)}getAggregation(e,t){const s=this._streams.get(e)??[],i=Date.now(),n=t??6e4,r=s.filter(e=>e.timestamp>=i-n);if(0===r.length)return{streamId:e,min:0,max:0,avg:0,sum:0,count:0,last:0,windowMs:n};let o=1/0,a=-1/0,h=0;for(const e of r)e.value<o&&(o=e.value),e.value>a&&(a=e.value),h+=e.value;return{streamId:e,min:o,max:a,avg:h/r.length,sum:h,count:r.length,last:r[r.length-1].value,windowMs:n}}has(e){return this._ids.has(e)}get size(){return this._ids.size}clear(){this._streams.clear(),this._ids.clear()}}class s{constructor(){this._widgets=new Map}update(e){this._widgets.set(e.widgetId,e)}get(e){return this._widgets.get(e)}getAll(){return Array.from(this._widgets.values())}clear(){this._widgets.clear()}}class i{constructor(e){this._users=new Map,this._actorToViewerId=new Map,this._localActorId=e}addFromPresence(e,t,s){if(e===this._localActorId)return null;const i=t.viewerId||this._actorToViewerId.get(e)||e,n={viewerId:i,actorTokenId:e,username:t.username,metadata:t.metadata,joinedAt:s||Date.now(),isLocal:!1};return this._users.set(i,n),this._actorToViewerId.set(e,i),n}removeByActorId(e){if(e===this._localActorId)return null;const t=this._actorToViewerId.get(e);if(!t)return null;const s=this._users.get(t)||null;return this._users.delete(t),this._actorToViewerId.delete(e),s}getAll(){return Array.from(this._users.values())}get users(){return this._users}clear(){this._users.clear(),this._actorToViewerId.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 r(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const o=new WeakMap;const a="metrics",h="widgets";class c extends e{constructor(e,n,r,o,a,h,c){super(),this._onMetricsRef=null,this._onWidgetsRef=null,this.name=e,this._roomContext=n,this._localViewerId=r,this._options=a,this._log=h,this._isConnected=c,this._presenceManager=new i(o),this._metricStore=new t(a.maxMetricPoints),this._widgetManager=new s}publishMetric(e,t,s){const i={id:n(),streamId:e,value:t,unit:s?.unit,tags:s?.tags,timestamp:Date.now(),isReplay:!1};this._metricStore.add(i);const r={echo:!1};return s?.filter&&(r.filter=s.filter),this._roomContext.emit(a,{id:i.id,streamId:e,value:t,unit:i.unit,tags:i.tags,timestamp:i.timestamp},r),i}setMetricFilters(e){this._roomContext.setFilters(a,e)}addMetricFilters(e){this._roomContext.addFilters(a,e)}removeMetricFilters(e){this._roomContext.removeFilters(a,e)}publishWidget(e,t,s,i){const r={id:n(),widgetId:e,type:t,data:s,label:i,timestamp:Date.now(),isReplay:!1};return this._widgetManager.update(r),this._roomContext.emit(h,{id:r.id,widgetId:e,type:t,data:s,label:i,timestamp:r.timestamp},{echo:!1}),r}getMetrics(e){return this._metricStore.getAll(e)}getAggregation(e,t){return this._metricStore.getAggregation(e,t)}getWidget(e){return this._widgetManager.get(e)}getWidgets(){return this._widgetManager.getAll()}getViewers(){return this._presenceManager.getAll()}_subscribe(e){if(void 0!==e){const t=e.length>0?e:["__none__"];this._roomContext.subscribe(a,{filters:t})}else this._roomContext.subscribe(a);this._roomContext.subscribe(h),this._onMetricsRef=(e,t)=>{const s=e,i={id:s.id,streamId:s.streamId,value:s.value,unit:s.unit,tags:s.tags,timestamp:s.timestamp,isReplay:t.isReplay??!1};this._metricStore.add(i)&&this.emit("metric",i)},this._roomContext.on(a,this._onMetricsRef),this._onWidgetsRef=(e,t)=>{const s=e,i={id:s.id,widgetId:s.widgetId,type:s.type,data:s.data,label:s.label,timestamp:s.timestamp,isReplay:t.isReplay??!1};this._widgetManager.update(i),this.emit("widgetUpdate",i)},this._roomContext.on(h,this._onWidgetsRef)}_activate(){this._setPresence(),this._roomContext.fetchPresence().then(e=>{for(const t of e)if(t.presence){const e=this._presenceManager.addFromPresence(t.actorTokenId,t.presence,t.joinedAt);e&&this.emit("viewerJoined",e)}}).catch(()=>{})}_deactivate(){this._presenceManager.clear()}_handlePresenceJoin(e,t){const s=this._presenceManager.addFromPresence(e,t);s&&this.emit("viewerJoined",s)}_handlePresenceLeave(e){const t=this._presenceManager.removeByActorId(e);t&&this.emit("viewerLeft",t)}_handlePresenceUpdate(e,t){this._presenceManager.addFromPresence(e,t)}_handleReplayStart(e){this.emit("replayStart",{count:e})}_handleReplayEnd(e){this.emit("replayEnd",{replayed:e})}_updateLocalPresence(){this._setPresence()}_cleanup(){this._log("Panel cleanup:",this.name),this._isConnected()&&(this._roomContext.unsubscribe(a),this._roomContext.unsubscribe(h)),this._onMetricsRef&&this._roomContext.off(a,this._onMetricsRef),this._onWidgetsRef&&this._roomContext.off(h,this._onWidgetsRef),this._onMetricsRef=null,this._onWidgetsRef=null,this._metricStore.clear(),this._widgetManager.clear(),this._presenceManager.clear(),this.removeAllListeners()}_setPresence(){this._roomContext.setPresence({viewerId:this._localViewerId,username:this._options.username,metadata:this._options.metadata,__scope:this._options.appName})}}class l extends e{constructor(e){if(super(),this._localViewer=null,this._panels=new Map,this._lobby=null,this._onlineViewers=new Map,this._actorToViewerId=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._panels.values())e._handleReplayStart(t.count)},this._onReplayEndRef=e=>{const t=e;for(const e of this._panels.values())e._handleReplayEnd(t.replayed)},this._onPresenceJoinRef=e=>this._handlePresenceJoin(e),this._onPresenceLeaveRef=e=>this._handlePresenceLeave(e),this._onPresenceUpdateRef=e=>this._handlePresenceUpdate(e),this._onLobbyJoinRef=e=>this._handleLobbyJoin(e),this._onLobbyLeaveRef=e=>this._handleLobbyLeave(e),this._onLobbyUpdateRef=e=>this._handleLobbyUpdate(e),!e?.client)throw new TypeError("NoLagDash requires an injected NoLag client: new NoLagDash({ client, appName, ... })");this._client=e.client,this._viewerId=n(),this._options={username:e.username,metadata:e.metadata,appName:e.appName??"dash",maxMetricPoints:e.maxMetricPoints??1e3,aggregationWindow:e.aggregationWindow??6e4,debug:e.debug??!1,panels:e.panels??[]},this._log=r("NoLagDash",this._options.debug),this._readyPromise=new Promise((e,t)=>{this._readyResolve=e,this._readyReject=t}),this._readyPromise.catch(()=>{}),function(e,t,s){let i=o.get(e);i||(i=new Map,o.set(e,i));const n=i.get(t);n&&console.warn(`[${s}] Another wrapper (${n}) 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,"NoLagDash"),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 localViewer(){return this._localViewer}get panels(){return this._panels}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._panels.keys()])this._panels.get(e)._cleanup(),this._panels.delete(e);if(this._lobby&&this._client.connected)try{this._lobby.unsubscribe()}catch{}var e,t;this._lobby=null,this._onlineViewers.clear(),this._actorToViewerId.clear(),this._localViewer=null,e=this._client,t=this._options.appName,o.get(e)?.delete(t),this._isReady||this._readyReject(new Error("NoLagDash 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._localViewer?this._localViewer.actorTokenId=this._client.actorId:(this._localViewer={viewerId:this._viewerId,actorTokenId:this._client.actorId,username:this._options.username,metadata:this._options.metadata,joinedAt:Date.now(),isLocal:!0},this._log("Local viewer:",this._localViewer.viewerId,"→",this._localViewer.actorTokenId)),this._lobby||(this._lobby=this._client.setApp(this._options.appName).setLobby("online"));try{const e=await this._lobby.subscribe();if(t())return;this._diffHydrateOnlineViewers(e),this._log("Lobby subscribed, online viewers:",this._onlineViewers.size)}catch(e){if(t())return;this._log("Lobby subscription failed:",e)}if(this._isReady)for(const e of this._panels.values())e._updateLocalPresence();else for(const e of this._options.panels)this._subscribePanelInternal(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._diffHydrateOnlineViewers(t)}).catch(()=>{})},2e3)}joinPanel(e,t){this._assertUsable();let s=this._panels.get(e);return s||(s=this._subscribePanelInternal(e,t?.metricFilters)),s._activate(),s}leavePanel(e){const t=this._panels.get(e);t&&(this._log("Leaving panel:",e),t._cleanup(),this._panels.delete(e))}getPanels(){return Array.from(this._panels.values())}getOnlineViewers(){return Array.from(this._onlineViewers.values())}_assertUsable(){if(this._detached)throw new Error("NoLagDash has been detached — construct a new instance");if(!this._isReady||!this._localViewer)throw new Error('NoLagDash not ready — await ready() or the "connected" event')}_subscribePanelInternal(e,t){this._log("Subscribing panel:",e);const s=this._client.setApp(this._options.appName).setRoom(e),i=new c(e,s,this._viewerId,this._client.actorId,this._options,r(`DashPanel:${e}`,this._options.debug),()=>this._client.connected);return this._panels.set(e,i),i._subscribe(t),i}_foreignScope(e){const t=e?.__scope;return"string"==typeof t&&t!==this._options.appName}_handlePresenceJoin(e){if(e.actorTokenId===this._localViewer?.actorTokenId)return;const t=e.presence;if(!t?.viewerId||this._foreignScope(t))return;const s=this._toViewer(e.actorTokenId,t);this._actorToViewerId.set(e.actorTokenId,s.viewerId),this._onlineViewers.has(s.viewerId)||(this._onlineViewers.set(s.viewerId,s),this.emit("viewerOnline",s));for(const s of this._panels.values())s._handlePresenceJoin(e.actorTokenId,t)}_handlePresenceLeave(e){if(e.actorTokenId!==this._localViewer?.actorTokenId)for(const t of this._panels.values())t._handlePresenceLeave(e.actorTokenId)}_handlePresenceUpdate(e){if(e.actorTokenId===this._localViewer?.actorTokenId)return;const t=e.presence;if(t?.viewerId&&!this._foreignScope(t))for(const s of this._panels.values())s._handlePresenceUpdate(e.actorTokenId,t)}_handleLobbyJoin(e){const{actorId:t,data:s}=e;if(t===this._localViewer?.actorTokenId)return;const i=s;if(!i?.viewerId||this._foreignScope(i))return;const n=this._toViewer(t,i);this._actorToViewerId.set(t,n.viewerId),this._onlineViewers.has(n.viewerId)||(this._onlineViewers.set(n.viewerId,n),this.emit("viewerOnline",n))}_handleLobbyLeave(e){const{actorId:t,data:s}=e;if(t===this._localViewer?.actorTokenId)return;const i=s;if(this._foreignScope(i))return;const n=i?.viewerId||this._actorToViewerId.get(t)||this._findViewerIdByActorId(t);if(n){const e=this._onlineViewers.get(n);e&&(this._onlineViewers.delete(n),this._actorToViewerId.delete(t),this.emit("viewerOffline",e))}}_handleLobbyUpdate(e){const{actorId:t,data:s}=e;if(t===this._localViewer?.actorTokenId)return;const i=s;if(!i?.viewerId||this._foreignScope(i))return;const n=this._toViewer(t,i);this._onlineViewers.set(n.viewerId,n)}_diffHydrateOnlineViewers(e){const t=new Map,s=new Map;for(const i of Object.keys(e)){const n=e[i];for(const e of Object.keys(n)){if(e===this._localViewer?.actorTokenId)continue;const i=n[e],r=i?.presence??i;r?.viewerId&&!this._foreignScope(r)&&(t.has(r.viewerId)||t.set(r.viewerId,this._toViewer(e,r)),s.set(e,r.viewerId))}}for(const[e,s]of[...this._onlineViewers])if(!t.has(e)){this._onlineViewers.delete(e);for(const[t,s]of[...this._actorToViewerId])s===e&&this._actorToViewerId.delete(t);this.emit("viewerOffline",s)}for(const[e,s]of t)this._onlineViewers.has(e)||(this._onlineViewers.set(e,s),this.emit("viewerOnline",s));for(const[e,t]of s)this._actorToViewerId.set(e,t)}_toViewer(e,t){return{viewerId:t.viewerId,actorTokenId:e,username:t.username,metadata:t.metadata,joinedAt:Date.now(),isLocal:!1}}_findViewerIdByActorId(e){for(const t of this._onlineViewers.values())if(t.actorTokenId===e)return t.viewerId}}export{c as DashboardPanel,e as EventEmitter,l as NoLagDash};
|
|
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._streams=new Map,this._ids=new Set,this._maxPerStream=e}add(e){if(this._ids.has(e.id))return!1;this._ids.add(e.id),this._streams.has(e.streamId)||this._streams.set(e.streamId,[]);const t=this._streams.get(e.streamId);for(t.push(e),t.length>1&&e.timestamp<t[t.length-2].timestamp&&t.sort((e,t)=>e.timestamp-t.timestamp);t.length>this._maxPerStream;){const e=t.shift();this._ids.delete(e.id)}return!0}getAll(e){if(e)return[...this._streams.get(e)??[]];const t=[];for(const e of this._streams.values())t.push(...e);return t.sort((e,t)=>e.timestamp-t.timestamp)}getAggregation(e,t){const s=this._streams.get(e)??[],i=Date.now(),n=t??6e4,r=s.filter(e=>e.timestamp>=i-n);if(0===r.length)return{streamId:e,min:0,max:0,avg:0,sum:0,count:0,last:0,windowMs:n};let o=1/0,a=-1/0,h=0;for(const e of r)e.value<o&&(o=e.value),e.value>a&&(a=e.value),h+=e.value;return{streamId:e,min:o,max:a,avg:h/r.length,sum:h,count:r.length,last:r[r.length-1].value,windowMs:n}}has(e){return this._ids.has(e)}get size(){return this._ids.size}clear(){this._streams.clear(),this._ids.clear()}}class s{constructor(){this._widgets=new Map}update(e){this._widgets.set(e.widgetId,e)}get(e){return this._widgets.get(e)}getAll(){return Array.from(this._widgets.values())}clear(){this._widgets.clear()}}class i{constructor(e){this._users=new Map,this._actorToViewerId=new Map,this._localActorId=e}addFromPresence(e,t,s){if(e===this._localActorId)return null;const i=t.viewerId||this._actorToViewerId.get(e)||e,n={viewerId:i,actorTokenId:e,username:t.username,metadata:t.metadata,joinedAt:s||Date.now(),isLocal:!1};return this._users.set(i,n),this._actorToViewerId.set(e,i),n}removeByActorId(e){if(e===this._localActorId)return null;const t=this._actorToViewerId.get(e);if(!t)return null;const s=this._users.get(t)||null;return this._users.delete(t),this._actorToViewerId.delete(e),s}getAll(){return Array.from(this._users.values())}get users(){return this._users}clear(){this._users.clear(),this._actorToViewerId.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 r(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}function o(e){return e?.filter?{filter:e.filter}:e?.filters&&e.filters.length>0?{filters:e.filters}:{}}function a(e,t){const s=new Set,i=[];for(const t of e)"string"==typeof t?s.add(t):i.push(t);for(const e of t)s.add(e);return[...s,...i]}function h(e,t){const s=new Set(t);return e.filter(e=>"string"!=typeof e||!s.has(e))}const c=new WeakMap;const l="metrics",_="widgets",d={metrics:l,widgets:_};class f extends e{constructor(e,n,r,o,a,h,c){super(),this._onMetricsRef=null,this._onWidgetsRef=null,this._filters={metrics:[],widgets:[]},this.name=e,this._roomContext=n,this._localViewerId=r,this._options=a,this._log=h,this._isConnected=c,this._presenceManager=new i(o),this._metricStore=new t(a.maxMetricPoints),this._widgetManager=new s}publishMetric(e,t,s){const i={id:n(),streamId:e,value:t,unit:s?.unit,tags:s?.tags,timestamp:Date.now(),isReplay:!1};return this._metricStore.add(i),this._roomContext.emit(l,{id:i.id,streamId:e,value:t,unit:i.unit,tags:i.tags,timestamp:i.timestamp},{echo:!1,...o(s)}),i}get filters(){return{metrics:[...this._filters.metrics],widgets:[...this._filters.widgets]}}setFilters(e,t){for(const s of this._targetTopics(t))this._filters[s]=[...e],this._roomContext.setFilters(d[s],e)}addFilters(e,t){for(const s of this._targetTopics(t))this.setFilters(a(this._filters[s],e),{topic:s})}removeFilters(e,t){for(const s of this._targetTopics(t))this.setFilters(h(this._filters[s],e),{topic:s})}_targetTopics(e){return e?.topic?[e.topic]:["metrics","widgets"]}setMetricFilters(e){this.setFilters(e,{topic:"metrics"})}addMetricFilters(e){this.addFilters(e,{topic:"metrics"})}removeMetricFilters(e){this.removeFilters(e,{topic:"metrics"})}publishWidget(e,t,s,i,r){const a={id:n(),widgetId:e,type:t,data:s,label:i,timestamp:Date.now(),isReplay:!1};return this._widgetManager.update(a),this._roomContext.emit(_,{id:a.id,widgetId:e,type:t,data:s,label:i,timestamp:a.timestamp},{echo:!1,...o(r)}),a}getMetrics(e){return this._metricStore.getAll(e)}getAggregation(e,t){return this._metricStore.getAggregation(e,t)}getWidget(e){return this._widgetManager.get(e)}getWidgets(){return this._widgetManager.getAll()}getViewers(){return this._presenceManager.getAll()}_subscribe(e,t){if(t&&t.length>0)return this._filters={metrics:[...t],widgets:[...t]},this._roomContext.subscribe(l,{filters:t}),this._roomContext.subscribe(_,{filters:t}),void this._attachHandlers();if(void 0!==e){const t=e.length>0?e:["__none__"];this._filters.metrics=[...t],this._roomContext.subscribe(l,{filters:t})}else this._roomContext.subscribe(l);this._roomContext.subscribe(_),this._attachHandlers()}_attachHandlers(){this._onMetricsRef=(e,t)=>{const s=e,i={id:s.id,streamId:s.streamId,value:s.value,unit:s.unit,tags:s.tags,timestamp:s.timestamp,isReplay:t.isReplay??!1};this._metricStore.add(i)&&this.emit("metric",i)},this._roomContext.on(l,this._onMetricsRef),this._onWidgetsRef=(e,t)=>{const s=e,i={id:s.id,widgetId:s.widgetId,type:s.type,data:s.data,label:s.label,timestamp:s.timestamp,isReplay:t.isReplay??!1};this._widgetManager.update(i),this.emit("widgetUpdate",i)},this._roomContext.on(_,this._onWidgetsRef)}_activate(){this._setPresence(),this._roomContext.fetchPresence().then(e=>{for(const t of e)if(t.presence){const e=this._presenceManager.addFromPresence(t.actorTokenId,t.presence,t.joinedAt);e&&this.emit("viewerJoined",e)}}).catch(()=>{})}_deactivate(){this._presenceManager.clear()}_handlePresenceJoin(e,t){const s=this._presenceManager.addFromPresence(e,t);s&&this.emit("viewerJoined",s)}_handlePresenceLeave(e){const t=this._presenceManager.removeByActorId(e);t&&this.emit("viewerLeft",t)}_handlePresenceUpdate(e,t){this._presenceManager.addFromPresence(e,t)}_handleReplayStart(e){this.emit("replayStart",{count:e})}_handleReplayEnd(e){this.emit("replayEnd",{replayed:e})}_updateLocalPresence(){this._setPresence()}_cleanup(){this._log("Panel cleanup:",this.name),this._isConnected()&&(this._roomContext.unsubscribe(l),this._roomContext.unsubscribe(_)),this._onMetricsRef&&this._roomContext.off(l,this._onMetricsRef),this._onWidgetsRef&&this._roomContext.off(_,this._onWidgetsRef),this._onMetricsRef=null,this._onWidgetsRef=null,this._metricStore.clear(),this._widgetManager.clear(),this._presenceManager.clear(),this.removeAllListeners()}_setPresence(){this._roomContext.setPresence({viewerId:this._localViewerId,username:this._options.username,metadata:this._options.metadata,__scope:this._options.appName})}}class p extends e{constructor(e){if(super(),this._localViewer=null,this._panels=new Map,this._lobby=null,this._onlineViewers=new Map,this._actorToViewerId=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._panels.values())e._handleReplayStart(t.count)},this._onReplayEndRef=e=>{const t=e;for(const e of this._panels.values())e._handleReplayEnd(t.replayed)},this._onPresenceJoinRef=e=>this._handlePresenceJoin(e),this._onPresenceLeaveRef=e=>this._handlePresenceLeave(e),this._onPresenceUpdateRef=e=>this._handlePresenceUpdate(e),this._onLobbyJoinRef=e=>this._handleLobbyJoin(e),this._onLobbyLeaveRef=e=>this._handleLobbyLeave(e),this._onLobbyUpdateRef=e=>this._handleLobbyUpdate(e),!e?.client)throw new TypeError("NoLagDash requires an injected NoLag client: new NoLagDash({ client, appName, ... })");this._client=e.client,this._viewerId=n(),this._options={username:e.username,metadata:e.metadata,appName:e.appName??"dash",maxMetricPoints:e.maxMetricPoints??1e3,aggregationWindow:e.aggregationWindow??6e4,debug:e.debug??!1,panels:e.panels??[]},this._log=r("NoLagDash",this._options.debug),this._readyPromise=new Promise((e,t)=>{this._readyResolve=e,this._readyReject=t}),this._readyPromise.catch(()=>{}),function(e,t,s){let i=c.get(e);i||(i=new Map,c.set(e,i));const n=i.get(t);n&&console.warn(`[${s}] Another wrapper (${n}) 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,"NoLagDash"),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 localViewer(){return this._localViewer}get panels(){return this._panels}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._panels.keys()])this._panels.get(e)._cleanup(),this._panels.delete(e);if(this._lobby&&this._client.connected)try{this._lobby.unsubscribe()}catch{}var e,t;this._lobby=null,this._onlineViewers.clear(),this._actorToViewerId.clear(),this._localViewer=null,e=this._client,t=this._options.appName,c.get(e)?.delete(t),this._isReady||this._readyReject(new Error("NoLagDash 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._localViewer?this._localViewer.actorTokenId=this._client.actorId:(this._localViewer={viewerId:this._viewerId,actorTokenId:this._client.actorId,username:this._options.username,metadata:this._options.metadata,joinedAt:Date.now(),isLocal:!0},this._log("Local viewer:",this._localViewer.viewerId,"→",this._localViewer.actorTokenId)),this._lobby||(this._lobby=this._client.setApp(this._options.appName).setLobby("online"));try{const e=await this._lobby.subscribe();if(t())return;this._diffHydrateOnlineViewers(e),this._log("Lobby subscribed, online viewers:",this._onlineViewers.size)}catch(e){if(t())return;this._log("Lobby subscription failed:",e)}if(this._isReady)for(const e of this._panels.values())e._updateLocalPresence();else for(const e of this._options.panels)this._subscribePanelInternal(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._diffHydrateOnlineViewers(t)}).catch(()=>{})},2e3)}joinPanel(e,t){this._assertUsable();let s=this._panels.get(e);return s?t?.filters&&s.setFilters(t.filters):s=this._subscribePanelInternal(e,t?.metricFilters,t?.filters),s._activate(),s}leavePanel(e){const t=this._panels.get(e);t&&(this._log("Leaving panel:",e),t._cleanup(),this._panels.delete(e))}getPanels(){return Array.from(this._panels.values())}getOnlineViewers(){return Array.from(this._onlineViewers.values())}_assertUsable(){if(this._detached)throw new Error("NoLagDash has been detached — construct a new instance");if(!this._isReady||!this._localViewer)throw new Error('NoLagDash not ready — await ready() or the "connected" event')}_subscribePanelInternal(e,t,s){this._log("Subscribing panel:",e);const i=this._client.setApp(this._options.appName).setRoom(e),n=new f(e,i,this._viewerId,this._client.actorId,this._options,r(`DashPanel:${e}`,this._options.debug),()=>this._client.connected);return this._panels.set(e,n),n._subscribe(t,s),n}_foreignScope(e){const t=e?.__scope;return"string"==typeof t&&t!==this._options.appName}_handlePresenceJoin(e){if(e.actorTokenId===this._localViewer?.actorTokenId)return;const t=e.presence;if(!t?.viewerId||this._foreignScope(t))return;const s=this._toViewer(e.actorTokenId,t);this._actorToViewerId.set(e.actorTokenId,s.viewerId),this._onlineViewers.has(s.viewerId)||(this._onlineViewers.set(s.viewerId,s),this.emit("viewerOnline",s));for(const s of this._panels.values())s._handlePresenceJoin(e.actorTokenId,t)}_handlePresenceLeave(e){if(e.actorTokenId!==this._localViewer?.actorTokenId)for(const t of this._panels.values())t._handlePresenceLeave(e.actorTokenId)}_handlePresenceUpdate(e){if(e.actorTokenId===this._localViewer?.actorTokenId)return;const t=e.presence;if(t?.viewerId&&!this._foreignScope(t))for(const s of this._panels.values())s._handlePresenceUpdate(e.actorTokenId,t)}_handleLobbyJoin(e){const{actorId:t,data:s}=e;if(t===this._localViewer?.actorTokenId)return;const i=s;if(!i?.viewerId||this._foreignScope(i))return;const n=this._toViewer(t,i);this._actorToViewerId.set(t,n.viewerId),this._onlineViewers.has(n.viewerId)||(this._onlineViewers.set(n.viewerId,n),this.emit("viewerOnline",n))}_handleLobbyLeave(e){const{actorId:t,data:s}=e;if(t===this._localViewer?.actorTokenId)return;const i=s;if(this._foreignScope(i))return;const n=i?.viewerId||this._actorToViewerId.get(t)||this._findViewerIdByActorId(t);if(n){const e=this._onlineViewers.get(n);e&&(this._onlineViewers.delete(n),this._actorToViewerId.delete(t),this.emit("viewerOffline",e))}}_handleLobbyUpdate(e){const{actorId:t,data:s}=e;if(t===this._localViewer?.actorTokenId)return;const i=s;if(!i?.viewerId||this._foreignScope(i))return;const n=this._toViewer(t,i);this._onlineViewers.set(n.viewerId,n)}_diffHydrateOnlineViewers(e){const t=new Map,s=new Map;for(const i of Object.keys(e)){const n=e[i];for(const e of Object.keys(n)){if(e===this._localViewer?.actorTokenId)continue;const i=n[e],r=i?.presence??i;r?.viewerId&&!this._foreignScope(r)&&(t.has(r.viewerId)||t.set(r.viewerId,this._toViewer(e,r)),s.set(e,r.viewerId))}}for(const[e,s]of[...this._onlineViewers])if(!t.has(e)){this._onlineViewers.delete(e);for(const[t,s]of[...this._actorToViewerId])s===e&&this._actorToViewerId.delete(t);this.emit("viewerOffline",s)}for(const[e,s]of t)this._onlineViewers.has(e)||(this._onlineViewers.set(e,s),this.emit("viewerOnline",s));for(const[e,t]of s)this._actorToViewerId.set(e,t)}_toViewer(e,t){return{viewerId:t.viewerId,actorTokenId:e,username:t.username,metadata:t.metadata,joinedAt:Date.now(),isLocal:!1}}_findViewerIdByActorId(e){for(const t of this._onlineViewers.values())if(t.actorTokenId===e)return t.viewerId}}export{f as DashboardPanel,e as EventEmitter,p as NoLagDash};
|
|
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/MetricStore.ts","../src/WidgetManager.ts","../src/PresenceManager.ts","../src/utils.ts","../src/constants.ts","../src/DashboardPanel.ts","../src/NoLagDash.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","MetricStore","maxPerStream","_streams","_ids","_maxPerStream","point","id","streamId","points","push","length","timestamp","sort","a","b","removed","shift","getAll","all","values","getAggregation","windowMs","now","Date","window","filtered","filter","p","min","max","avg","sum","count","last","Infinity","value","WidgetManager","_widgets","update","widget","widgetId","Array","from","PresenceManager","localActorId","_users","_actorToViewerId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","viewerId","viewer","username","metadata","isLocal","removeByActorId","users","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","wrapperRegistry","WeakMap","TOPIC_METRICS","TOPIC_WIDGETS","DashboardPanel","name","roomContext","localViewerId","options","isConnected","super","_onMetricsRef","_onWidgetsRef","_roomContext","_localViewerId","_options","_log","_isConnected","_presenceManager","_metricStore","maxMetricPoints","_widgetManager","publishMetric","opts","unit","tags","isReplay","emitOpts","echo","setMetricFilters","filters","setFilters","addMetricFilters","addFilters","removeMetricFilters","removeFilters","publishWidget","type","data","label","getMetrics","getWidget","getWidgets","getViewers","_subscribe","metricFilters","undefined","subscribe","meta","raw","_activate","_setPresence","fetchPresence","then","actors","actor","v","catch","_deactivate","_handlePresenceJoin","pd","_handlePresenceLeave","_handlePresenceUpdate","_handleReplayStart","_handleReplayEnd","replayed","_updateLocalPresence","_cleanup","unsubscribe","setPresence","__scope","appName","NoLagDash","_localViewer","_panels","_lobby","_onlineViewers","_epoch","_detached","_isReady","_lobbyRefreshTimer","_onConnectRef","_onConnect","_onDisconnectRef","reason","_onReconnectRef","_onErrorRef","_onReplayStartRef","panel","_onReplayEndRef","_onPresenceJoinRef","_onPresenceLeaveRef","_onPresenceUpdateRef","_onLobbyJoinRef","_handleLobbyJoin","_onLobbyLeaveRef","_handleLobbyLeave","_onLobbyUpdateRef","_handleLobbyUpdate","client","TypeError","_client","_viewerId","aggregationWindow","debug","panels","_readyPromise","Promise","resolve","reject","_readyResolve","_readyReject","wrapperName","apps","existing","warn","registerWrapper","queueMicrotask","connected","localViewer","ready","detach","clearTimeout","keys","Error","_runSetup","epoch","stale","actorId","setApp","setLobby","state","_diffHydrateOnlineViewers","err","panelName","_subscribePanelInternal","_scheduleLobbyRefresh","setTimeout","joinPanel","_assertUsable","leavePanel","getPanels","getOnlineViewers","setRoom","_foreignScope","scope","_toViewer","_findViewerIdByActorId","fresh","freshActors","roomId","Object","roomPresence","mappedViewerId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.js","sources":["../src/EventEmitter.ts","../src/MetricStore.ts","../src/WidgetManager.ts","../src/PresenceManager.ts","../src/utils.ts","../src/constants.ts","../src/DashboardPanel.ts","../src/NoLagDash.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","MetricStore","maxPerStream","_streams","_ids","_maxPerStream","point","id","streamId","points","push","length","timestamp","sort","a","b","removed","shift","getAll","all","values","getAggregation","windowMs","now","Date","window","filtered","filter","p","min","max","avg","sum","count","last","Infinity","value","WidgetManager","_widgets","update","widget","widgetId","Array","from","PresenceManager","localActorId","_users","_actorToViewerId","_localActorId","addFromPresence","actorTokenId","presence","joinedAt","viewerId","viewer","username","metadata","isLocal","removeByActorId","users","generateId","crypto","randomUUID","replace","Math","floor","random","toString","createLogger","prefix","enabled","log","_args","filterEmitOptions","opts","filters","mergeFilters","existing","simple","groups","f","v","withoutFilters","remove","drop","wrapperRegistry","WeakMap","TOPIC_METRICS","TOPIC_WIDGETS","FILTER_TOPICS","metrics","widgets","DashboardPanel","name","roomContext","localViewerId","options","isConnected","super","_onMetricsRef","_onWidgetsRef","_filters","_roomContext","_localViewerId","_options","_log","_isConnected","_presenceManager","_metricStore","maxMetricPoints","_widgetManager","publishMetric","unit","tags","isReplay","echo","setFilters","topic","_targetTopics","addFilters","removeFilters","setMetricFilters","addMetricFilters","removeMetricFilters","publishWidget","type","data","label","getMetrics","getWidget","getWidgets","getViewers","_subscribe","metricFilters","subscribe","_attachHandlers","undefined","resolved","meta","raw","_activate","_setPresence","fetchPresence","then","actors","actor","catch","_deactivate","_handlePresenceJoin","pd","_handlePresenceLeave","_handlePresenceUpdate","_handleReplayStart","_handleReplayEnd","replayed","_updateLocalPresence","_cleanup","unsubscribe","setPresence","__scope","appName","NoLagDash","_localViewer","_panels","_lobby","_onlineViewers","_epoch","_detached","_isReady","_lobbyRefreshTimer","_onConnectRef","_onConnect","_onDisconnectRef","reason","_onReconnectRef","_onErrorRef","_onReplayStartRef","panel","_onReplayEndRef","_onPresenceJoinRef","_onPresenceLeaveRef","_onPresenceUpdateRef","_onLobbyJoinRef","_handleLobbyJoin","_onLobbyLeaveRef","_handleLobbyLeave","_onLobbyUpdateRef","_handleLobbyUpdate","client","TypeError","_client","_viewerId","aggregationWindow","debug","panels","_readyPromise","Promise","resolve","reject","_readyResolve","_readyReject","wrapperName","apps","warn","registerWrapper","queueMicrotask","connected","localViewer","ready","detach","clearTimeout","keys","Error","_runSetup","epoch","stale","actorId","setApp","setLobby","state","_diffHydrateOnlineViewers","err","panelName","_subscribePanelInternal","_scheduleLobbyRefresh","setTimeout","joinPanel","_assertUsable","leavePanel","getPanels","getOnlineViewers","setRoom","_foreignScope","scope","_toViewer","_findViewerIdByActorId","fresh","freshActors","roomId","Object","roomPresence","mappedViewerId"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -160,6 +160,45 @@ function createLogger(prefix, enabled) {
|
|
|
160
160
|
}
|
|
161
161
|
return (...args) => { console.log(`[${prefix}]`, ...args); };
|
|
162
162
|
}
|
|
163
|
+
// ============ Filters ============
|
|
164
|
+
/**
|
|
165
|
+
* Build the filter fragment of an emit options object.
|
|
166
|
+
*
|
|
167
|
+
* `filter` wins over `filters`: a publish is routed to exactly one topic, so
|
|
168
|
+
* honouring both would silently drop one of them.
|
|
169
|
+
*/
|
|
170
|
+
function filterEmitOptions(opts) {
|
|
171
|
+
if (opts?.filter)
|
|
172
|
+
return { filter: opts.filter };
|
|
173
|
+
if (opts?.filters && opts.filters.length > 0)
|
|
174
|
+
return { filters: opts.filters };
|
|
175
|
+
return {};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Merge OR terms into an existing filter set. AND groups (nested arrays) are
|
|
179
|
+
* preserved as-is — only plain string terms are deduplicated.
|
|
180
|
+
*/
|
|
181
|
+
function mergeFilters(existing, add) {
|
|
182
|
+
const simple = new Set();
|
|
183
|
+
const groups = [];
|
|
184
|
+
for (const f of existing) {
|
|
185
|
+
if (typeof f === 'string')
|
|
186
|
+
simple.add(f);
|
|
187
|
+
else
|
|
188
|
+
groups.push(f);
|
|
189
|
+
}
|
|
190
|
+
for (const v of add)
|
|
191
|
+
simple.add(v);
|
|
192
|
+
return [...simple, ...groups];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Drop OR terms from a filter set. AND groups are left untouched — remove
|
|
196
|
+
* those by calling `setFilters` with the set you want.
|
|
197
|
+
*/
|
|
198
|
+
function withoutFilters(existing, remove) {
|
|
199
|
+
const drop = new Set(remove);
|
|
200
|
+
return existing.filter((f) => typeof f !== 'string' || !drop.has(f));
|
|
201
|
+
}
|
|
163
202
|
// ============ Wrapper registry ============
|
|
164
203
|
// One wrapper instance per (client, appName): two wrappers sharing an app on
|
|
165
204
|
// one connection would collide on topics, presence and the online lobby.
|
|
@@ -193,6 +232,11 @@ const LOBBY_ID = 'online';
|
|
|
193
232
|
/** Delay before the post-setup lobby presence refetch (catches simultaneous joiners) */
|
|
194
233
|
const LOBBY_REFRESH_DELAY_MS = 2000;
|
|
195
234
|
|
|
235
|
+
/** Maps the public topic names onto the wire topics. */
|
|
236
|
+
const FILTER_TOPICS = {
|
|
237
|
+
metrics: TOPIC_METRICS,
|
|
238
|
+
widgets: TOPIC_WIDGETS,
|
|
239
|
+
};
|
|
196
240
|
class DashboardPanel extends EventEmitter {
|
|
197
241
|
/** @internal */
|
|
198
242
|
constructor(name, roomContext, localViewerId, localActorId, options, log, isConnected) {
|
|
@@ -201,6 +245,12 @@ class DashboardPanel extends EventEmitter {
|
|
|
201
245
|
// handlers for a topic (the client may be shared with other consumers).
|
|
202
246
|
this._onMetricsRef = null;
|
|
203
247
|
this._onWidgetsRef = null;
|
|
248
|
+
/**
|
|
249
|
+
* Filter values applied per topic. Mirrors what was actually sent to the
|
|
250
|
+
* server, including the `__none__` placeholder, so add/remove merge against
|
|
251
|
+
* the real subscription rather than a cleaner-looking copy of it.
|
|
252
|
+
*/
|
|
253
|
+
this._filters = { metrics: [], widgets: [] };
|
|
204
254
|
this.name = name;
|
|
205
255
|
this._roomContext = roomContext;
|
|
206
256
|
this._localViewerId = localViewerId;
|
|
@@ -214,28 +264,72 @@ class DashboardPanel extends EventEmitter {
|
|
|
214
264
|
publishMetric(streamId, value, opts) {
|
|
215
265
|
const point = { id: generateId(), streamId, value, unit: opts?.unit, tags: opts?.tags, timestamp: Date.now(), isReplay: false };
|
|
216
266
|
this._metricStore.add(point);
|
|
217
|
-
|
|
218
|
-
if (opts?.filter)
|
|
219
|
-
emitOpts.filter = opts.filter;
|
|
220
|
-
this._roomContext.emit(TOPIC_METRICS, { id: point.id, streamId, value, unit: point.unit, tags: point.tags, timestamp: point.timestamp }, emitOpts);
|
|
267
|
+
this._roomContext.emit(TOPIC_METRICS, { id: point.id, streamId, value, unit: point.unit, tags: point.tags, timestamp: point.timestamp }, { echo: false, ...filterEmitOptions(opts) });
|
|
221
268
|
return point;
|
|
222
269
|
}
|
|
223
|
-
|
|
270
|
+
// ============ Filters ============
|
|
271
|
+
/** The filter values currently applied to this panel, by topic. */
|
|
272
|
+
get filters() {
|
|
273
|
+
return { metrics: [...this._filters.metrics], widgets: [...this._filters.widgets] };
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Replace this panel's filters — only data published with one of these
|
|
277
|
+
* values is delivered. Applies to metrics and widgets unless you scope the
|
|
278
|
+
* call to one with `{ topic }`.
|
|
279
|
+
*
|
|
280
|
+
* Passing an empty array clears filtering and restores the wildcard
|
|
281
|
+
* subscription, which receives everything.
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* ```ts
|
|
285
|
+
* panel.setFilters(['cpu', 'mem']); // both topics
|
|
286
|
+
* panel.setFilters(['cpu'], { topic: 'metrics' }); // metrics only
|
|
287
|
+
* panel.setFilters([['cpu', 'prod']]); // cpu AND prod
|
|
288
|
+
* panel.setFilters([]); // everything
|
|
289
|
+
* ```
|
|
290
|
+
*/
|
|
291
|
+
setFilters(values, opts) {
|
|
292
|
+
for (const topic of this._targetTopics(opts)) {
|
|
293
|
+
this._filters[topic] = [...values];
|
|
294
|
+
// The core types filters as `string[]`, but both its implementation and
|
|
295
|
+
// the wire protocol accept AND groups (nested arrays).
|
|
296
|
+
this._roomContext.setFilters(FILTER_TOPICS[topic], values);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/** Add filter values to the existing set. Existing AND groups are kept. */
|
|
300
|
+
addFilters(values, opts) {
|
|
301
|
+
for (const topic of this._targetTopics(opts)) {
|
|
302
|
+
this.setFilters(mergeFilters(this._filters[topic], values), { topic });
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Remove filter values from the existing set. Removing the last value
|
|
307
|
+
* restores the wildcard subscription.
|
|
308
|
+
*/
|
|
309
|
+
removeFilters(values, opts) {
|
|
310
|
+
for (const topic of this._targetTopics(opts)) {
|
|
311
|
+
this.setFilters(withoutFilters(this._filters[topic], values), { topic });
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
_targetTopics(opts) {
|
|
315
|
+
return opts?.topic ? [opts.topic] : ['metrics', 'widgets'];
|
|
316
|
+
}
|
|
317
|
+
/** Replace all metric filters — alias for `setFilters(values, { topic: 'metrics' })`. */
|
|
224
318
|
setMetricFilters(filters) {
|
|
225
|
-
this.
|
|
319
|
+
this.setFilters(filters, { topic: 'metrics' });
|
|
226
320
|
}
|
|
227
|
-
/** Add filter values to the existing metric filter set */
|
|
321
|
+
/** Add filter values to the existing metric filter set. */
|
|
228
322
|
addMetricFilters(filters) {
|
|
229
|
-
this.
|
|
323
|
+
this.addFilters(filters, { topic: 'metrics' });
|
|
230
324
|
}
|
|
231
|
-
/** Remove specific filter values from the metric filter set */
|
|
325
|
+
/** Remove specific filter values from the metric filter set. */
|
|
232
326
|
removeMetricFilters(filters) {
|
|
233
|
-
this.
|
|
327
|
+
this.removeFilters(filters, { topic: 'metrics' });
|
|
234
328
|
}
|
|
235
|
-
publishWidget(widgetId, type, data, label) {
|
|
329
|
+
publishWidget(widgetId, type, data, label, opts) {
|
|
236
330
|
const update = { id: generateId(), widgetId, type, data, label, timestamp: Date.now(), isReplay: false };
|
|
237
331
|
this._widgetManager.update(update);
|
|
238
|
-
this._roomContext.emit(TOPIC_WIDGETS, { id: update.id, widgetId, type, data, label, timestamp: update.timestamp }, { echo: false });
|
|
332
|
+
this._roomContext.emit(TOPIC_WIDGETS, { id: update.id, widgetId, type, data, label, timestamp: update.timestamp }, { echo: false, ...filterEmitOptions(opts) });
|
|
239
333
|
return update;
|
|
240
334
|
}
|
|
241
335
|
getMetrics(streamId) { return this._metricStore.getAll(streamId); }
|
|
@@ -243,17 +337,31 @@ class DashboardPanel extends EventEmitter {
|
|
|
243
337
|
getWidget(widgetId) { return this._widgetManager.get(widgetId); }
|
|
244
338
|
getWidgets() { return this._widgetManager.getAll(); }
|
|
245
339
|
getViewers() { return this._presenceManager.getAll(); }
|
|
246
|
-
_subscribe(metricFilters) {
|
|
340
|
+
_subscribe(metricFilters, filters) {
|
|
341
|
+
if (filters && filters.length > 0) {
|
|
342
|
+
// Uniform filter API: applies to both content topics, and an empty array
|
|
343
|
+
// means "everything" (the wildcard), matching the other blueprint SDKs.
|
|
344
|
+
this._filters = { metrics: [...filters], widgets: [...filters] };
|
|
345
|
+
this._roomContext.subscribe(TOPIC_METRICS, { filters });
|
|
346
|
+
this._roomContext.subscribe(TOPIC_WIDGETS, { filters });
|
|
347
|
+
this._attachHandlers();
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
247
350
|
if (metricFilters !== undefined) {
|
|
248
|
-
//
|
|
351
|
+
// Legacy `metricFilters` path. If empty array, use a no-match placeholder
|
|
249
352
|
// to avoid wildcard subscription (which receives everything).
|
|
250
|
-
const
|
|
251
|
-
this.
|
|
353
|
+
const resolved = metricFilters.length > 0 ? metricFilters : ['__none__'];
|
|
354
|
+
this._filters.metrics = [...resolved];
|
|
355
|
+
this._roomContext.subscribe(TOPIC_METRICS, { filters: resolved });
|
|
252
356
|
}
|
|
253
357
|
else {
|
|
254
358
|
this._roomContext.subscribe(TOPIC_METRICS);
|
|
255
359
|
}
|
|
256
360
|
this._roomContext.subscribe(TOPIC_WIDGETS);
|
|
361
|
+
this._attachHandlers();
|
|
362
|
+
}
|
|
363
|
+
/** @internal Attach the metric and widget listeners. */
|
|
364
|
+
_attachHandlers() {
|
|
257
365
|
// Listen for metrics (refs stored for handler-specific removal)
|
|
258
366
|
this._onMetricsRef = (data, meta) => {
|
|
259
367
|
const raw = data;
|
|
@@ -630,7 +738,11 @@ class NoLagDash extends EventEmitter {
|
|
|
630
738
|
this._assertUsable();
|
|
631
739
|
let panel = this._panels.get(name);
|
|
632
740
|
if (!panel) {
|
|
633
|
-
panel = this._subscribePanelInternal(name, opts?.metricFilters);
|
|
741
|
+
panel = this._subscribePanelInternal(name, opts?.metricFilters, opts?.filters);
|
|
742
|
+
}
|
|
743
|
+
else if (opts?.filters) {
|
|
744
|
+
// Already subscribed — re-point its filters rather than ignoring them.
|
|
745
|
+
panel.setFilters(opts.filters);
|
|
634
746
|
}
|
|
635
747
|
panel._activate();
|
|
636
748
|
return panel;
|
|
@@ -669,12 +781,12 @@ class NoLagDash extends EventEmitter {
|
|
|
669
781
|
}
|
|
670
782
|
}
|
|
671
783
|
// ============ Private: Panel Setup ============
|
|
672
|
-
_subscribePanelInternal(name, metricFilters) {
|
|
784
|
+
_subscribePanelInternal(name, metricFilters, filters) {
|
|
673
785
|
this._log('Subscribing panel:', name);
|
|
674
786
|
const roomContext = this._client.setApp(this._options.appName).setRoom(name);
|
|
675
787
|
const panel = new DashboardPanel(name, roomContext, this._viewerId, this._client.actorId, this._options, createLogger(`DashPanel:${name}`, this._options.debug), () => this._client.connected);
|
|
676
788
|
this._panels.set(name, panel);
|
|
677
|
-
panel._subscribe(metricFilters);
|
|
789
|
+
panel._subscribe(metricFilters, filters);
|
|
678
790
|
return panel;
|
|
679
791
|
}
|
|
680
792
|
// ============ Private: Scope Filtering ============
|