@nolag/dash 0.1.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 ADDED
@@ -0,0 +1,163 @@
1
+ # @nolag/dash
2
+
3
+ Live dashboard SDK for [NoLag](https://nolag.app) — real-time metrics, widgets, and data streams.
4
+
5
+ ## How It Works with NoLag
6
+
7
+ NoLag is a real-time messaging platform that handles WebSocket connections, message routing, persistence, and scaling. This SDK wraps the low-level [@nolag/js-sdk](https://www.npmjs.com/package/@nolag/js-sdk) and gives you a purpose-built dashboard API — publish metrics, update widgets, and get live aggregations — without managing topics or subscriptions yourself.
8
+
9
+ ### Getting Your Token
10
+
11
+ 1. Sign up at [nolag.app](https://nolag.app)
12
+ 2. Create a new **project** in the portal
13
+ 3. Choose the **Dash** blueprint when creating an app — this pre-configures the topics (`metrics`, `widgets`) and settings your dashboard needs
14
+ 4. Go to the app's **Tokens** page and generate an **actor token**
15
+ 5. Use that token when connecting with this SDK
16
+
17
+ Each token identifies a unique viewer or data source (actor) in NoLag. The blueprint handles all the infrastructure setup — you just build your dashboard UI.
18
+
19
+ ## Install
20
+
21
+ ```bash
22
+ npm install @nolag/js-sdk @nolag/dash
23
+ ```
24
+
25
+ ## Quick Start
26
+
27
+ ```typescript
28
+ import { NoLagDash } from "@nolag/dash";
29
+
30
+ const dash = new NoLagDash("YOUR_ACTOR_TOKEN");
31
+
32
+ await dash.connect();
33
+
34
+ const panel = dash.joinPanel("server-metrics");
35
+
36
+ // Publish metrics from a data source
37
+ panel.publishMetric("cpu", 72.5, { unit: "%", tags: { host: "web-01" } });
38
+ panel.publishMetric("memory", 4.2, { unit: "GB" });
39
+
40
+ // Listen for metrics on a dashboard viewer
41
+ panel.on("metric", (point) => {
42
+ updateChart(point.streamId, point.value, point.timestamp);
43
+ });
44
+
45
+ // Widget updates (gauges, counters, tables, etc.)
46
+ panel.publishWidget("active-users", "counter", { value: 1423 }, "Active Users");
47
+ panel.publishWidget("status", "gauge", { value: 98.5, max: 100 }, "Uptime %");
48
+
49
+ panel.on("widgetUpdate", (widget) => {
50
+ renderWidget(widget.widgetId, widget.type, widget.data);
51
+ });
52
+
53
+ // Aggregations
54
+ const agg = panel.getAggregation("cpu", 60_000); // last 60s
55
+ console.log(`CPU avg: ${agg.avg}%, max: ${agg.max}%`);
56
+ ```
57
+
58
+ ## API Reference
59
+
60
+ ### `NoLagDash`
61
+
62
+ #### Constructor
63
+
64
+ ```typescript
65
+ const dash = new NoLagDash(token: string, options?: NoLagDashOptions);
66
+ ```
67
+
68
+ **Options:**
69
+
70
+ | Option | Type | Default | Description |
71
+ |--------|------|---------|-------------|
72
+ | `username` | `string` | — | Display name |
73
+ | `metadata` | `Record<string, unknown>` | — | Custom data |
74
+ | `panels` | `string[]` | — | Auto-join these panels on connect |
75
+ | `maxMetricPoints` | `number` | — | Max metric points kept in memory |
76
+ | `aggregationWindow` | `number` | — | Default aggregation window (ms) |
77
+ | `debug` | `boolean` | `false` | Enable debug logging |
78
+ | `reconnect` | `boolean` | `true` | Auto-reconnect on disconnect |
79
+
80
+ #### Methods
81
+
82
+ | Method | Returns | Description |
83
+ |--------|---------|-------------|
84
+ | `connect()` | `Promise<void>` | Connect to NoLag |
85
+ | `disconnect()` | `void` | Disconnect |
86
+ | `joinPanel(name)` | `DashboardPanel` | Join a dashboard panel |
87
+ | `leavePanel(name)` | `void` | Leave a panel |
88
+
89
+ #### Events
90
+
91
+ | Event | Payload | Description |
92
+ |-------|---------|-------------|
93
+ | `connected` | — | Connected |
94
+ | `disconnected` | — | Disconnected |
95
+ | `reconnected` | — | Reconnected |
96
+ | `error` | `Error` | Error |
97
+ | `viewerOnline` | `DashboardViewer` | Viewer came online |
98
+ | `viewerOffline` | `DashboardViewer` | Viewer went offline |
99
+
100
+ ### `DashboardPanel`
101
+
102
+ #### Methods
103
+
104
+ | Method | Returns | Description |
105
+ |--------|---------|-------------|
106
+ | `publishMetric(streamId, value, opts?)` | `MetricPoint` | Publish a metric data point |
107
+ | `publishWidget(widgetId, type, data, label?)` | `WidgetUpdate` | Update a widget |
108
+ | `getMetrics(streamId?)` | `MetricPoint[]` | Get cached metrics |
109
+ | `getAggregation(streamId, windowMs?)` | `Aggregation` | Get min/max/avg/sum/count |
110
+ | `getWidget(widgetId)` | `WidgetUpdate \| undefined` | Get a widget's last state |
111
+ | `getWidgets()` | `WidgetUpdate[]` | Get all widgets |
112
+ | `getViewers()` | `DashboardViewer[]` | Get viewers on this panel |
113
+
114
+ #### Events
115
+
116
+ | Event | Payload | Description |
117
+ |-------|---------|-------------|
118
+ | `metric` | `MetricPoint` | New metric point received |
119
+ | `widgetUpdate` | `WidgetUpdate` | Widget updated |
120
+ | `viewerJoined` | `DashboardViewer` | Viewer joined panel |
121
+ | `viewerLeft` | `DashboardViewer` | Viewer left panel |
122
+ | `replayStart` / `replayEnd` | — | Data replay |
123
+
124
+ ## Types
125
+
126
+ ```typescript
127
+ interface MetricPoint {
128
+ id: string;
129
+ streamId: string;
130
+ value: number;
131
+ unit?: string;
132
+ tags?: Record<string, string>;
133
+ timestamp: number;
134
+ isReplay: boolean;
135
+ }
136
+
137
+ interface WidgetUpdate {
138
+ id: string;
139
+ widgetId: string;
140
+ type: WidgetType;
141
+ data: Record<string, unknown>;
142
+ label?: string;
143
+ timestamp: number;
144
+ isReplay: boolean;
145
+ }
146
+
147
+ type WidgetType = "gauge" | "chart" | "counter" | "table" | "text" | "custom";
148
+
149
+ interface Aggregation {
150
+ streamId: string;
151
+ min: number;
152
+ max: number;
153
+ avg: number;
154
+ sum: number;
155
+ count: number;
156
+ last: number;
157
+ windowMs: number;
158
+ }
159
+ ```
160
+
161
+ ## License
162
+
163
+ MIT
@@ -0,0 +1,42 @@
1
+ import type { RoomContext } from '@nolag/js-sdk';
2
+ import { EventEmitter } from './EventEmitter';
3
+ import type { DashPanelEvents, MetricPoint, WidgetUpdate, WidgetType, Aggregation, DashboardViewer, DashPresenceData, ResolvedDashOptions } from './types';
4
+ export declare class DashboardPanel extends EventEmitter<DashPanelEvents> {
5
+ readonly name: string;
6
+ private _roomContext;
7
+ private _options;
8
+ private _presenceManager;
9
+ private _metricStore;
10
+ private _widgetManager;
11
+ private _log;
12
+ private _localViewerId;
13
+ constructor(name: string, roomContext: RoomContext, localViewerId: string, localActorId: string, options: ResolvedDashOptions, log: (...args: unknown[]) => void);
14
+ publishMetric(streamId: string, value: number, opts?: {
15
+ unit?: string;
16
+ tags?: Record<string, string>;
17
+ filter?: string;
18
+ }): MetricPoint;
19
+ /** Replace all metric filters — only receive metrics published with these filter values */
20
+ setMetricFilters(filters: string[]): void;
21
+ /** Add filter values to the existing metric filter set */
22
+ addMetricFilters(filters: string[]): void;
23
+ /** Remove specific filter values from the metric filter set */
24
+ removeMetricFilters(filters: string[]): void;
25
+ publishWidget(widgetId: string, type: WidgetType, data: Record<string, unknown>, label?: string): WidgetUpdate;
26
+ getMetrics(streamId?: string): MetricPoint[];
27
+ getAggregation(streamId: string, windowMs?: number): Aggregation;
28
+ getWidget(widgetId: string): WidgetUpdate | undefined;
29
+ getWidgets(): WidgetUpdate[];
30
+ getViewers(): DashboardViewer[];
31
+ _subscribe(metricFilters?: string[]): void;
32
+ _activate(): void;
33
+ _deactivate(): void;
34
+ _handlePresenceJoin(actorTokenId: string, pd: DashPresenceData): void;
35
+ _handlePresenceLeave(actorTokenId: string): void;
36
+ _handlePresenceUpdate(actorTokenId: string, pd: DashPresenceData): void;
37
+ _handleReplayStart(count: number): void;
38
+ _handleReplayEnd(replayed: number): void;
39
+ _updateLocalPresence(): void;
40
+ _cleanup(): void;
41
+ private _setPresence;
42
+ }
@@ -0,0 +1,10 @@
1
+ export declare class EventEmitter<EventMap extends {
2
+ [K in keyof EventMap]: unknown[];
3
+ }> {
4
+ private _handlers;
5
+ on<K extends keyof EventMap>(event: K, handler: (...args: EventMap[K]) => void): this;
6
+ off<K extends keyof EventMap>(event: K, handler?: (...args: EventMap[K]) => void): this;
7
+ removeAllListeners(): this;
8
+ protected emit<K extends keyof EventMap>(event: K, ...args: EventMap[K]): void;
9
+ listenerCount<K extends keyof EventMap>(event: K): number;
10
+ }
@@ -0,0 +1,13 @@
1
+ import type { MetricPoint, Aggregation } from './types';
2
+ export declare class MetricStore {
3
+ private _streams;
4
+ private _ids;
5
+ private _maxPerStream;
6
+ constructor(maxPerStream: number);
7
+ add(point: MetricPoint): boolean;
8
+ getAll(streamId?: string): MetricPoint[];
9
+ getAggregation(streamId: string, windowMs?: number): Aggregation;
10
+ has(id: string): boolean;
11
+ get size(): number;
12
+ clear(): void;
13
+ }
@@ -0,0 +1,31 @@
1
+ import { EventEmitter } from './EventEmitter';
2
+ import { DashboardPanel } from './DashboardPanel';
3
+ import type { NoLagDashOptions, DashClientEvents } from './types';
4
+ export declare class NoLagDash extends EventEmitter<DashClientEvents> {
5
+ private _token;
6
+ private _options;
7
+ private _client;
8
+ private _panels;
9
+ private _lobby;
10
+ private _onlineViewers;
11
+ private _actorToViewerId;
12
+ private _viewerId;
13
+ private _log;
14
+ constructor(token: string, options?: NoLagDashOptions);
15
+ get connected(): boolean;
16
+ get panels(): Map<string, DashboardPanel>;
17
+ connect(): Promise<void>;
18
+ disconnect(): void;
19
+ joinPanel(name: string, opts?: {
20
+ metricFilters?: string[];
21
+ }): DashboardPanel;
22
+ leavePanel(name: string): void;
23
+ private _subscribePanel;
24
+ private _handlePresenceJoin;
25
+ private _handlePresenceLeave;
26
+ private _handlePresenceUpdate;
27
+ private _setupLobby;
28
+ private _hydrateViewers;
29
+ private _toViewer;
30
+ private _restorePanels;
31
+ }
@@ -0,0 +1,12 @@
1
+ import type { DashboardViewer, DashPresenceData } from './types';
2
+ export declare class PresenceManager {
3
+ private _users;
4
+ private _actorToViewerId;
5
+ private _localActorId;
6
+ constructor(localActorId: string);
7
+ addFromPresence(actorTokenId: string, presence: DashPresenceData, joinedAt?: number): DashboardViewer | null;
8
+ removeByActorId(actorTokenId: string): DashboardViewer | null;
9
+ getAll(): DashboardViewer[];
10
+ get users(): Map<string, DashboardViewer>;
11
+ clear(): void;
12
+ }
@@ -0,0 +1,8 @@
1
+ import type { WidgetUpdate } from './types';
2
+ export declare class WidgetManager {
3
+ private _widgets;
4
+ update(widget: WidgetUpdate): void;
5
+ get(widgetId: string): WidgetUpdate | undefined;
6
+ getAll(): WidgetUpdate[];
7
+ clear(): void;
8
+ }
@@ -0,0 +1,4 @@
1
+ export { NoLagDash } from './NoLagDash';
2
+ export { DashboardPanel } from './DashboardPanel';
3
+ export { EventEmitter } from './EventEmitter';
4
+ export type { NoLagDashOptions, MetricPoint, WidgetUpdate, WidgetType, Aggregation, AggregationType, DashboardViewer, DashClientEvents, DashPanelEvents, DashPresenceData, } from './types';
@@ -0,0 +1,2 @@
1
+ import{NoLag as e}from"@nolag/js-sdk";class t{constructor(){this._handlers=new Map}on(e,t){return this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t),this}off(e,t){return t?this._handlers.get(e)?.delete(t):this._handlers.delete(e),this}removeAllListeners(){return this._handlers.clear(),this}emit(e,...t){const 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 s{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(),r=t??6e4,n=s.filter(e=>e.timestamp>=i-r);if(0===n.length)return{streamId:e,min:0,max:0,avg:0,sum:0,count:0,last:0,windowMs:r};let o=1/0,a=-1/0,c=0;for(const e of n)e.value<o&&(o=e.value),e.value>a&&(a=e.value),c+=e.value;return{streamId:e,min:o,max:a,avg:c/n.length,sum:c,count:n.length,last:n[n.length-1].value,windowMs:r}}has(e){return this._ids.has(e)}get size(){return this._ids.size}clear(){this._streams.clear(),this._ids.clear()}}class i{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 r{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,r={viewerId:i,actorTokenId:e,username:t.username,metadata:t.metadata,joinedAt:s||Date.now(),isLocal:!1};return this._users.set(i,r),this._actorToViewerId.set(e,i),r}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 o(e,t){return t?(...t)=>{console.log(`[${e}]`,...t)}:(...e)=>{}}const a="metrics",c="widgets";class h extends t{constructor(e,t,n,o,a,c){super(),this.name=e,this._roomContext=t,this._localViewerId=n,this._options=a,this._log=c,this._presenceManager=new r(o),this._metricStore=new s(a.maxMetricPoints),this._widgetManager=new i}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(c,{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(c),this._roomContext.on(a,(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(c,(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)})}_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._roomContext.unsubscribe(a),this._roomContext.unsubscribe(c),this._roomContext.off(a),this._roomContext.off(c),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})}}class l extends t{constructor(e,t={}){super(),this._client=null,this._panels=new Map,this._lobby=null,this._onlineViewers=new Map,this._actorToViewerId=new Map,this._token=e,this._viewerId=n(),this._options={username:t.username,metadata:t.metadata,appName:t.appName??"dash",url:t.url,maxMetricPoints:t.maxMetricPoints??1e3,aggregationWindow:t.aggregationWindow??6e4,debug:t.debug??!1,reconnect:t.reconnect??!0,panels:t.panels??[]},this._log=o("NoLagDash",this._options.debug)}get connected(){return this._client?.connected??!1}get panels(){return this._panels}async connect(){const t={debug:this._options.debug,reconnect:this._options.reconnect};this._options.url&&(t.url=this._options.url),this._client=e(this._token,t),this._client.on("connect",()=>{this._panels.size>0&&(this._restorePanels(),this.emit("reconnected"))}),this._client.on("disconnect",e=>this.emit("disconnected",e)),this._client.on("error",e=>this.emit("error",e)),this._client.on("replay:start",e=>{for(const t of this._panels.values())t._handleReplayStart(e.count)}),this._client.on("replay:end",e=>{for(const t of this._panels.values())t._handleReplayEnd(e.replayed)}),await this._client.connect(),this._client.on("presence:join",e=>this._handlePresenceJoin(e)),this._client.on("presence:leave",e=>this._handlePresenceLeave(e)),this._client.on("presence:update",e=>this._handlePresenceUpdate(e)),await this._setupLobby();for(const e of this._options.panels)this._subscribePanel(e);this.emit("connected"),setTimeout(()=>{this._lobby&&this._client?.connected&&this._lobby.fetchPresence().then(e=>this._hydrateViewers(e)).catch(()=>{})},2e3)}disconnect(){for(const e of[...this._panels.keys()])this.leavePanel(e);this._lobby?.unsubscribe(),this._lobby=null,this._client?.disconnect(),this._client=null,this._onlineViewers.clear(),this._actorToViewerId.clear()}joinPanel(e,t){if(!this._client)throw new Error("Not connected — call connect() first");let s=this._panels.get(e);return s||(s=this._subscribePanel(e,t?.metricFilters)),s._activate(),s}leavePanel(e){const t=this._panels.get(e);t&&(t._cleanup(),this._panels.delete(e))}_subscribePanel(e,t){if(!this._client)throw new Error("Not connected");const s=this._client.setApp(this._options.appName).setRoom(e),i=new h(e,s,this._viewerId,this._client.actorId,this._options,o(`DashPanel:${e}`,this._options.debug));return this._panels.set(e,i),i._subscribe(t),i}_handlePresenceJoin(e){if(e.actorTokenId===this._client?.actorId)return;const t=e.presence;if(!t?.viewerId)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._client?.actorId)for(const t of this._panels.values())t._handlePresenceLeave(e.actorTokenId)}_handlePresenceUpdate(e){if(e.actorTokenId===this._client?.actorId)return;const t=e.presence;if(t?.viewerId)for(const s of this._panels.values())s._handlePresenceUpdate(e.actorTokenId,t)}async _setupLobby(){if(!this._client)return;this._lobby=this._client.setApp(this._options.appName).setLobby("online");const e=e=>t=>{const s=t;if("join"===e){const e=s.data;if(s.actorId!==this._client?.actorId&&e?.viewerId){const t=this._toViewer(s.actorId,e);this._actorToViewerId.set(s.actorId,t.viewerId),this._onlineViewers.has(t.viewerId)||(this._onlineViewers.set(t.viewerId,t),this.emit("viewerOnline",t))}}else if(s.actorId!==this._client?.actorId){const e=this._actorToViewerId.get(s.actorId);if(e){const t=this._onlineViewers.get(e);t&&(this._onlineViewers.delete(e),this._actorToViewerId.delete(s.actorId),this.emit("viewerOffline",t))}}};this._client.on("lobbyPresence:join",e("join")),this._client.on("lobbyPresence:leave",e("leave")),this._client.on("lobbyPresence:update",e("join"));try{const e=await this._lobby.subscribe();this._hydrateViewers(e)}catch{}}_hydrateViewers(e){for(const t of Object.keys(e))for(const s of Object.keys(e[t])){if(s===this._client?.actorId)continue;const i=e[t][s],r=i?.presence??i;if(r?.viewerId){const e=this._toViewer(s,r);this._actorToViewerId.set(s,e.viewerId),this._onlineViewers.has(e.viewerId)||(this._onlineViewers.set(e.viewerId,e),this.emit("viewerOnline",e))}}}_toViewer(e,t){return{viewerId:t.viewerId,actorTokenId:e,username:t.username,metadata:t.metadata,joinedAt:Date.now(),isLocal:!1}}_restorePanels(){for(const e of this._panels.values())e._updateLocalPresence();this._lobby?.fetchPresence().then(e=>{this._onlineViewers.clear(),this._actorToViewerId.clear(),this._hydrateViewers(e)}).catch(()=>{})}}export{h as DashboardPanel,t as EventEmitter,l as NoLagDash};
2
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +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","TOPIC_METRICS","TOPIC_WIDGETS","DashboardPanel","name","roomContext","localViewerId","options","super","_roomContext","_localViewerId","_options","_log","_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","NoLagDash","token","_client","_panels","_lobby","_onlineViewers","_token","_viewerId","appName","url","aggregationWindow","debug","reconnect","panels","connected","connect","clientOptions","NoLag","_restorePanels","reason","_setupLobby","_subscribePanel","setTimeout","s","_hydrateViewers","disconnect","keys","leavePanel","joinPanel","Error","panel","setApp","setRoom","actorId","_toViewer","setLobby","lh","vid","state","rid","Object","aid"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const DEFAULT_APP_NAME = "dash";
2
+ export declare const DEFAULT_MAX_METRIC_POINTS = 1000;
3
+ export declare const DEFAULT_AGGREGATION_WINDOW = 60000;
4
+ export declare const TOPIC_METRICS = "metrics";
5
+ export declare const TOPIC_WIDGETS = "widgets";
6
+ export declare const LOBBY_ID = "online";