hotpipe 0.2.0 → 0.10.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.
@@ -1,22 +1,61 @@
1
1
  import { SDK_VERSION } from '../version';
2
2
  const MAX_QUEUE_SIZE = 100;
3
3
  const QUEUE_TTL = 30_000;
4
+ const RELEASE_DELAY = 500;
5
+ const AUTH_TIMEOUT_MS = 10_000;
4
6
  export class ConnectionManager {
5
7
  config;
6
8
  ws = null;
7
9
  status = 'disconnected';
8
10
  statusListeners = new Set();
9
11
  pipeListeners = new Map();
12
+ serverListeners = new Set();
10
13
  pipeRefs = new Map();
11
14
  reconnectAttempts = 0;
12
15
  maxReconnectDelay = 30_000;
13
16
  pingInterval = null;
14
17
  reconnectTimer = null;
18
+ releaseTimer = null;
15
19
  intentionalClose = false;
16
20
  eventQueue = [];
21
+ providerRefCount = 0;
22
+ refreshPromise = null;
17
23
  constructor(config) {
18
24
  this.config = config;
19
25
  }
26
+ /**
27
+ * Called by PipeProvider on mount. Ref-counts providers and connects
28
+ * on the first mount. Cancels any pending delayed disconnect from a
29
+ * prior release (e.g., during HMR remount).
30
+ */
31
+ retain() {
32
+ this.providerRefCount++;
33
+ if (this.releaseTimer) {
34
+ clearTimeout(this.releaseTimer);
35
+ this.releaseTimer = null;
36
+ }
37
+ this.connect();
38
+ }
39
+ /**
40
+ * Called by PipeProvider on unmount. Decrements ref count and schedules
41
+ * a delayed disconnect when the last provider unmounts. The delay
42
+ * absorbs HMR unmount/remount cycles so the connection stays alive.
43
+ */
44
+ release() {
45
+ this.providerRefCount = Math.max(0, this.providerRefCount - 1);
46
+ if (this.providerRefCount === 0) {
47
+ this.releaseTimer = setTimeout(() => {
48
+ this.releaseTimer = null;
49
+ this.disconnect();
50
+ }, RELEASE_DELAY);
51
+ }
52
+ }
53
+ getProviderRefCount() {
54
+ return this.providerRefCount;
55
+ }
56
+ updateConfig(config) {
57
+ this.config = config;
58
+ }
20
59
  async connect() {
21
60
  if (this.status === 'connecting' || this.status === 'connected')
22
61
  return;
@@ -28,36 +67,55 @@ export class ConnectionManager {
28
67
  method: 'POST',
29
68
  credentials: 'include',
30
69
  headers,
70
+ signal: AbortSignal.timeout(AUTH_TIMEOUT_MS),
31
71
  });
32
72
  if (!res.ok) {
33
73
  throw new Error(`Auth failed: ${res.status}`);
34
74
  }
35
- const { token } = await res.json();
36
- const wsUrl = `${this.config.brokerUrl}/ws?token=${encodeURIComponent(token)}&v=${SDK_VERSION}`;
75
+ const body = await res.json();
76
+ const token = body?.token;
77
+ if (typeof token !== 'string' || token.length === 0) {
78
+ throw new Error('Auth endpoint did not return a valid token');
79
+ }
80
+ const wsUrl = `${this.config.apiUrl}/ws?v=${SDK_VERSION}`;
37
81
  this.ws = new WebSocket(wsUrl);
38
82
  this.ws.onopen = () => {
39
- this.setStatus('connected');
40
- this.reconnectAttempts = 0;
41
- // Resubscribe to all active pipes
42
- for (const pipe of this.pipeRefs.keys()) {
43
- this.wsSend({ type: 'subscribe', pipe });
44
- }
45
- // Flush queued events
46
- this.flushQueue();
47
- // Keepalive ping every 30s
48
- this.pingInterval = setInterval(() => {
49
- this.wsSend({ type: 'ping' });
50
- }, 30_000);
83
+ // Send auth token as first message (token never appears in URL)
84
+ this.wsSend({ type: 'auth', token });
51
85
  };
52
86
  this.ws.onmessage = (event) => {
53
87
  try {
54
88
  const msg = JSON.parse(event.data);
89
+ // Handle auth confirmation — transition to connected state
90
+ if (msg.type === 'authenticated') {
91
+ this.setStatus('connected');
92
+ this.reconnectAttempts = 0;
93
+ // Resubscribe to all active pipes
94
+ for (const pipe of this.pipeRefs.keys()) {
95
+ this.wsSend({ type: 'subscribe', pipe });
96
+ }
97
+ // Flush queued events
98
+ this.flushQueue();
99
+ // Keepalive ping every 30s
100
+ this.pingInterval = setInterval(() => {
101
+ this.wsSend({ type: 'ping' });
102
+ }, 30_000);
103
+ this.dispatchServerMessage(msg);
104
+ return;
105
+ }
55
106
  if (msg.type === 'event') {
56
- this.dispatch(msg.pipe, msg.event, msg.data);
107
+ this.dispatch(msg.pipe, msg.event, msg.data, {
108
+ sender: msg.sender ?? null,
109
+ ts: msg.ts ?? 0,
110
+ });
111
+ }
112
+ else {
113
+ this.dispatchServerMessage(msg);
114
+ this.handleRevocationEvent(msg);
57
115
  }
58
116
  }
59
- catch {
60
- // Ignore malformed messages
117
+ catch (err) {
118
+ console.warn('[hotpipe] Failed to parse server message:', err);
61
119
  }
62
120
  };
63
121
  this.ws.onclose = () => {
@@ -90,6 +148,50 @@ export class ConnectionManager {
90
148
  this.eventQueue = [];
91
149
  this.setStatus('disconnected');
92
150
  }
151
+ /**
152
+ * Fetches a fresh token from the auth endpoint and sends it to the API
153
+ * for mid-session permission updates. Fire-and-forget — if the token is
154
+ * valid, the API updates permissions immediately. If invalid, the API
155
+ * sends an error through the existing onServerMessage path.
156
+ *
157
+ * No-op if the WebSocket is not connected. Concurrent calls collapse
158
+ * into a single auth request.
159
+ */
160
+ async refreshToken() {
161
+ if (this.refreshPromise) {
162
+ return this.refreshPromise;
163
+ }
164
+ if (this.ws?.readyState !== WebSocket.OPEN) {
165
+ return;
166
+ }
167
+ this.refreshPromise = this.doRefreshToken();
168
+ try {
169
+ await this.refreshPromise;
170
+ }
171
+ finally {
172
+ this.refreshPromise = null;
173
+ }
174
+ }
175
+ async doRefreshToken() {
176
+ const headers = this.config.authHeaders ? await this.config.authHeaders() : undefined;
177
+ const res = await fetch(this.config.authEndpoint, {
178
+ method: 'POST',
179
+ credentials: 'include',
180
+ headers,
181
+ signal: AbortSignal.timeout(AUTH_TIMEOUT_MS),
182
+ });
183
+ if (!res.ok) {
184
+ throw new Error(`Auth refresh failed: ${res.status}`);
185
+ }
186
+ const body = await res.json();
187
+ const token = body?.token;
188
+ if (typeof token !== 'string' || token.length === 0) {
189
+ throw new Error('Auth endpoint did not return a valid token');
190
+ }
191
+ if (this.ws?.readyState === WebSocket.OPEN) {
192
+ this.wsSend({ type: 'token', token });
193
+ }
194
+ }
93
195
  subscribe(pipe) {
94
196
  const count = this.pipeRefs.get(pipe) || 0;
95
197
  this.pipeRefs.set(pipe, count + 1);
@@ -99,6 +201,8 @@ export class ConnectionManager {
99
201
  }
100
202
  unsubscribe(pipe) {
101
203
  const count = this.pipeRefs.get(pipe) || 0;
204
+ if (count === 0)
205
+ return;
102
206
  if (count <= 1) {
103
207
  this.pipeRefs.delete(pipe);
104
208
  if (this.ws?.readyState === WebSocket.OPEN) {
@@ -142,6 +246,10 @@ export class ConnectionManager {
142
246
  this.statusListeners.add(listener);
143
247
  return () => this.statusListeners.delete(listener);
144
248
  }
249
+ onServerMessage(listener) {
250
+ this.serverListeners.add(listener);
251
+ return () => this.serverListeners.delete(listener);
252
+ }
145
253
  flushQueue() {
146
254
  const now = Date.now();
147
255
  const pending = this.eventQueue.filter((e) => now - e.timestamp < QUEUE_TTL);
@@ -150,12 +258,30 @@ export class ConnectionManager {
150
258
  this.wsSend({ type: 'publish', pipe, event, data });
151
259
  }
152
260
  }
153
- dispatch(pipe, event, data) {
261
+ dispatch(pipe, event, data, metadata) {
154
262
  const listeners = this.pipeListeners.get(pipe);
155
263
  if (!listeners)
156
264
  return;
157
265
  for (const listener of listeners) {
158
- listener(event, data);
266
+ listener(event, data, metadata);
267
+ }
268
+ }
269
+ dispatchServerMessage(msg) {
270
+ for (const listener of this.serverListeners) {
271
+ listener(msg);
272
+ }
273
+ }
274
+ handleRevocationEvent(msg) {
275
+ if (msg.type !== 'system')
276
+ return;
277
+ const code = msg.code;
278
+ if (code === 'PIPE_REVOKED') {
279
+ this.refreshToken().catch(() => { });
280
+ this.config.onPipeRevoked?.(msg.pipe);
281
+ }
282
+ else if (code === 'ALL_PIPES_REVOKED') {
283
+ this.refreshToken().catch(() => { });
284
+ this.config.onAllPipesRevoked?.();
159
285
  }
160
286
  }
161
287
  setStatus(status) {
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/client/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/client/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAoDzC,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,OAAO,iBAAiB;IAiBR;IAhBZ,EAAE,GAAqB,IAAI,CAAC;IAC5B,MAAM,GAAqB,cAAc,CAAC;IAC1C,eAAe,GAAG,IAAI,GAAG,EAAsC,CAAC;IAChE,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,eAAe,GAAG,IAAI,GAAG,EAAyB,CAAC;IACnD,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,iBAAiB,GAAG,CAAC,CAAC;IACtB,iBAAiB,GAAG,MAAM,CAAC;IAC3B,YAAY,GAA0C,IAAI,CAAC;IAC3D,cAAc,GAAyC,IAAI,CAAC;IAC5D,YAAY,GAAyC,IAAI,CAAC;IAC1D,gBAAgB,GAAG,KAAK,CAAC;IACzB,UAAU,GAAkB,EAAE,CAAC;IAC/B,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAAyB,IAAI,CAAC;IAEpD,YAAoB,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAEhD;;;;OAIG;IACH,MAAM;QACJ,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,OAAO;QACL,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAE/D,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC,EAAE,aAAa,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,YAAY,CAAC,MAAwB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO;QAExE,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAE3E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAEtF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;gBAChD,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,SAAS;gBACtB,OAAO;gBACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;aAC7C,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC;YAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,SAAS,WAAW,EAAE,CAAC;YAE1D,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;YAE/B,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE;gBACpB,gEAAgE;gBAChE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,CAAC,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;gBAC5B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAEnC,2DAA2D;oBAC3D,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;wBACjC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;wBAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;wBAE3B,kCAAkC;wBAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;4BACxC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC3C,CAAC;wBAED,sBAAsB;wBACtB,IAAI,CAAC,UAAU,EAAE,CAAC;wBAElB,2BAA2B;wBAC3B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;4BACnC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;wBAChC,CAAC,EAAE,MAAM,CAAC,CAAC;wBAEX,IAAI,CAAC,qBAAqB,CAAC,GAAoB,CAAC,CAAC;wBACjD,OAAO;oBACT,CAAC;oBAED,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;4BAC3C,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI;4BAC1B,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC;yBAChB,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,qBAAqB,CAAC,GAAoB,CAAC,CAAC;wBACjD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;gBACrB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;gBAE/B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;gBACrB,wDAAwD;YAC1D,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAE/B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,cAAc,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAEtF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,SAAS;YACtB,OAAO;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;SAC7C,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC;QAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAEnC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3C,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO;QAExB,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE3B,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,IAAa;QAChD,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,QAAsB;QAClD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,kBAAkB,CAAC,IAAY,EAAE,QAAsB;QACrD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,cAAc,CAAC,QAA4C;QACzD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,eAAe,CAAC,QAA+B;QAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAEO,UAAU;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;QAC7E,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QAErB,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,IAAY,EAAE,KAAa,EAAE,IAAa,EAAE,QAA2B;QACtF,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,GAAkB;QAC9C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,GAA4B;QACxD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAElC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAc,CAAC;QAEhC,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACxC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,MAAwB;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,GAA4B;QACzC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,EACjE,IAAI,CAAC,iBAAiB,CACvB,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import type { z } from 'zod';
2
- import { type ConnectionStatus } from './connection';
2
+ import { type ConnectionStatus, type PipeEventMetadata, type ServerMessage } from './connection';
3
3
  /**
4
4
  * A record mapping event names to Zod schemas.
5
5
  */
@@ -16,7 +16,7 @@ type EventData<T extends EventMap, E extends EventName<T>> = z.infer<T[E]>;
16
16
  * Handler map for usePipe — a partial record of event handlers.
17
17
  */
18
18
  type PipeHandlers<T extends EventMap> = {
19
- [E in EventName<T>]?: (data: EventData<T, E>) => void;
19
+ [E in EventName<T>]?: (data: EventData<T, E>, metadata: PipeEventMetadata) => void;
20
20
  };
21
21
  /**
22
22
  * Creates a typed real-time client bound to your event schemas.
@@ -32,18 +32,25 @@ export declare function createPipeClient<T extends EventMap>(config: {
32
32
  events: T;
33
33
  /** Override the base path where your handler is mounted. Defaults to `/api/realtime`. */
34
34
  basePath?: string;
35
- /** @internal Override the broker URL for local development. */
36
- brokerUrl?: string;
35
+ /** @internal Override the API URL for local development. */
36
+ apiUrl?: string;
37
37
  /** Provide custom headers for the auth request (e.g., a Bearer token). */
38
38
  authHeaders?: () => Promise<Record<string, string>>;
39
+ /** Called when access to a specific pipe is revoked. */
40
+ onPipeRevoked?: (pipe: string) => void;
41
+ /** Called when all pipe access is revoked (e.g., account suspension). */
42
+ onAllPipesRevoked?: () => void;
39
43
  }): {
40
44
  PipeProvider: ({ children }: {
41
45
  children: React.ReactNode;
42
46
  }) => import("react/jsx-runtime").JSX.Element;
43
- usePipe: (pipe: string, handlers?: Partial<PipeHandlers<T>>) => {
47
+ usePipe: (pipe: string, handlers?: Partial<PipeHandlers<T>>, options?: {
48
+ onServerMessage?: (msg: ServerMessage) => void;
49
+ }) => {
44
50
  status: ConnectionStatus;
45
51
  publish: <E extends EventName<T>>(event: E, data: EventData<T, E>) => boolean;
46
52
  };
53
+ refreshPipeAuth: () => Promise<void>;
47
54
  };
48
- export type { ConnectionStatus, EventMap };
55
+ export type { ConnectionStatus, EventMap, PipeEventMetadata, ServerMessage };
49
56
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAExE;;GAEG;AACH,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAE1C;;GAEG;AACH,KAAK,SAAS,CAAC,CAAC,SAAS,QAAQ,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC;AAEtD;;GAEG;AACH,KAAK,SAAS,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3E;;GAEG;AACH,KAAK,YAAY,CAAC,CAAC,SAAS,QAAQ,IAAI;KACrC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI;CACtD,CAAC;AAKF;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE;IAC3D,MAAM,EAAE,CAAC,CAAC;IACV,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;iCAiBqC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;oBAgCzD,MAAM,aACD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAClC;QACD,MAAM,EAAE,gBAAgB,CAAC;QACzB,OAAO,EAAE,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC;KAC/E;EAoDF;AAED,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAE1C;;GAEG;AACH,KAAK,SAAS,CAAC,CAAC,SAAS,QAAQ,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC;AAEtD;;GAEG;AACH,KAAK,SAAS,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3E;;GAEG;AACH,KAAK,YAAY,CAAC,CAAC,SAAS,QAAQ,IAAI;KACrC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,KAAK,IAAI;CACnF,CAAC;AAOF;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE;IAC3D,MAAM,EAAE,CAAC,CAAC;IACV,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,wDAAwD;IACxD,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC;iCA2CqC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;oBA4BzD,MAAM,aACD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YACzB;QAAE,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAA;KAAE,KAC3D;QACD,MAAM,EAAE,gBAAgB,CAAC;QACzB,OAAO,EAAE,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC;KAC/E;2BA4E2B,OAAO,CAAC,IAAI,CAAC;EAK1C;AAED,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC"}
@@ -1,9 +1,10 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';
4
- import { ConnectionManager } from './connection';
5
- const DEFAULT_BROKER_URL = 'wss://api.hotpipe.dev';
4
+ import { ConnectionManager, } from './connection';
5
+ const DEFAULT_API_URL = 'wss://api.hotpipe.dev';
6
6
  const DEFAULT_BASE_PATH = '/api/realtime';
7
+ const globalCache = globalThis;
7
8
  /**
8
9
  * Creates a typed real-time client bound to your event schemas.
9
10
  *
@@ -15,32 +16,50 @@ const DEFAULT_BASE_PATH = '/api/realtime';
15
16
  * ```
16
17
  */
17
18
  export function createPipeClient(config) {
19
+ const apiUrl = config.apiUrl ?? DEFAULT_API_URL;
20
+ const authEndpoint = `${config.basePath ?? DEFAULT_BASE_PATH}/auth`;
21
+ const connectionConfig = {
22
+ apiUrl,
23
+ authEndpoint,
24
+ authHeaders: config.authHeaders,
25
+ onPipeRevoked: config.onPipeRevoked,
26
+ onAllPipesRevoked: config.onAllPipesRevoked,
27
+ };
28
+ // Reuse existing manager in dev to survive HMR module re-evaluation
29
+ const cacheKey = `__hotpipe_${apiUrl}_${authEndpoint}`;
30
+ let manager;
31
+ if (globalCache[cacheKey]) {
32
+ manager = globalCache[cacheKey];
33
+ manager.updateConfig(connectionConfig);
34
+ }
35
+ else {
36
+ manager = new ConnectionManager(connectionConfig);
37
+ }
38
+ if (process.env.NODE_ENV !== 'production') {
39
+ globalCache[cacheKey] = manager;
40
+ }
18
41
  const PipeContext = createContext(null);
19
42
  function useManager() {
20
- const manager = useContext(PipeContext);
21
- if (!manager) {
43
+ const ctx = useContext(PipeContext);
44
+ if (!ctx) {
22
45
  throw new Error('hotpipe: usePipe must be used within <PipeProvider>');
23
46
  }
24
- return manager;
47
+ return ctx;
25
48
  }
26
49
  /**
27
50
  * Wrap your app (or a subtree) with this provider to establish the
28
- * WebSocket connection to the broker.
51
+ * WebSocket connection to the hotpipe API.
29
52
  */
30
53
  function PipeProvider({ children }) {
31
- const managerRef = useRef(null);
32
- if (!managerRef.current) {
33
- managerRef.current = new ConnectionManager({
34
- brokerUrl: config.brokerUrl ?? DEFAULT_BROKER_URL,
35
- authEndpoint: `${config.basePath ?? DEFAULT_BASE_PATH}/auth`,
36
- authHeaders: config.authHeaders,
37
- });
38
- }
39
54
  useEffect(() => {
40
- managerRef.current?.connect();
41
- return () => managerRef.current?.disconnect();
55
+ manager.retain();
56
+ if (process.env.NODE_ENV !== 'production' && manager.getProviderRefCount() > 1) {
57
+ console.warn('[hotpipe] Multiple <PipeProvider> instances detected. ' +
58
+ 'Use a single provider at the root of your app to avoid redundant connections.');
59
+ }
60
+ return () => manager.release();
42
61
  }, []);
43
- return (_jsx(PipeContext.Provider, { value: managerRef.current, children: children }));
62
+ return _jsx(PipeContext.Provider, { value: manager, children: children });
44
63
  }
45
64
  /**
46
65
  * Subscribe to events on a pipe. Returns connection status and a
@@ -52,20 +71,35 @@ export function createPipeClient(config) {
52
71
  * });
53
72
  * ```
54
73
  */
55
- function usePipe(pipe, handlers) {
74
+ function usePipe(pipe, handlers, options) {
56
75
  const manager = useManager();
57
76
  const handlersRef = useRef(handlers);
58
77
  handlersRef.current = handlers;
78
+ const serverMsgRef = useRef(options?.onServerMessage);
79
+ serverMsgRef.current = options?.onServerMessage;
59
80
  const [status, setStatus] = useState(manager.getStatus());
60
81
  useEffect(() => {
61
82
  return manager.onStatusChange(setStatus);
62
83
  }, [manager]);
63
84
  useEffect(() => {
64
- const listener = (event, data) => {
85
+ if (!serverMsgRef.current)
86
+ return;
87
+ return manager.onServerMessage((msg) => {
88
+ serverMsgRef.current?.(msg);
89
+ });
90
+ }, [manager]);
91
+ useEffect(() => {
92
+ const listener = (event, data, metadata) => {
65
93
  const handler = handlersRef.current?.[event];
66
- if (handler) {
67
- handler(data);
94
+ if (!handler)
95
+ return;
96
+ const schema = config.events[event];
97
+ if (schema) {
98
+ const result = schema.safeParse(data);
99
+ if (!result.success)
100
+ return;
68
101
  }
102
+ handler(data, metadata);
69
103
  };
70
104
  manager.addPipeListener(pipe, listener);
71
105
  manager.subscribe(pipe);
@@ -86,6 +120,17 @@ export function createPipeClient(config) {
86
120
  }, [pipe, manager]);
87
121
  return { status, publish };
88
122
  }
89
- return { PipeProvider, usePipe };
123
+ /**
124
+ * Trigger a mid-session token refresh. Call this when a user's permissions
125
+ * change (e.g., they join a new chat room) and the connection should update
126
+ * in place without disconnecting.
127
+ *
128
+ * Callable from anywhere — event handlers, server action callbacks, etc.
129
+ * Does not require React context.
130
+ */
131
+ function refreshPipeAuth() {
132
+ return manager.refreshToken();
133
+ }
134
+ return { PipeProvider, usePipe, refreshPipeAuth };
90
135
  }
91
136
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG5F,OAAO,EACL,iBAAiB,GAIlB,MAAM,cAAc,CAAC;AAwBtB,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAChD,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAE1C,MAAM,WAAW,GAAG,UAA0D,CAAC;AAE/E;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAqB,MAYpD;IACC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC;IAChD,MAAM,YAAY,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,iBAAiB,OAAO,CAAC;IAEpE,MAAM,gBAAgB,GAAG;QACvB,MAAM;QACN,YAAY;QACZ,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;KAC5C,CAAC;IAEF,oEAAoE;IACpE,MAAM,QAAQ,GAAG,aAAa,MAAM,IAAI,YAAY,EAAE,CAAC;IACvD,IAAI,OAA0B,CAAC;IAE/B,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,IAAI,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,WAAW,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IAClC,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAA2B,IAAI,CAAC,CAAC;IAElE,SAAS,UAAU;QACjB,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;QAEpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;OAGG;IACH,SAAS,YAAY,CAAC,EAAE,QAAQ,EAAiC;QAC/D,SAAS,CAAC,GAAG,EAAE;YACb,OAAO,CAAC,MAAM,EAAE,CAAC;YAEjB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC/E,OAAO,CAAC,IAAI,CACV,wDAAwD;oBACtD,+EAA+E,CAClF,CAAC;YACJ,CAAC;YAED,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,YAAG,QAAQ,GAAwB,CAAC;IACjF,CAAC;IAED;;;;;;;;;OASG;IACH,SAAS,OAAO,CACd,IAAY,EACZ,QAAmC,EACnC,OAA4D;QAK5D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;QAE/B,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACtD,YAAY,CAAC,OAAO,GAAG,OAAO,EAAE,eAAe,CAAC;QAEhD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAmB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAE5E,SAAS,CAAC,GAAG,EAAE;YACb,OAAO,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAEd,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,YAAY,CAAC,OAAO;gBAAE,OAAO;YAElC,OAAO,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrC,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAEd,SAAS,CAAC,GAAG,EAAE;YACb,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,IAAa,EAAE,QAA2B,EAAE,EAAE;gBAC7E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,KAAqB,CAAC,CAAC;gBAC7D,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAErB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAEpC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAO;gBAC9B,CAAC;gBAEA,OAAsD,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC1E,CAAC,CAAC;YAEF,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACxC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAExB,OAAO,GAAG,EAAE;gBACV,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7C,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAEpB,MAAM,OAAO,GAAG,WAAW,CACzB,CAAyB,KAAQ,EAAE,IAAqB,EAAW,EAAE;YACnE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEpC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAEtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAClF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC,EACD,CAAC,IAAI,EAAE,OAAO,CAAC,CAChB,CAAC;QAEF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;;;OAOG;IACH,SAAS,eAAe;QACtB,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Default JWT token expiry in seconds. Used by createPipeHandler for token
3
+ * generation and by createPipeAdmin for revocation TTL defaults.
4
+ *
5
+ * Must stay in sync with the API-side constant (apps/hotpipe-api/src/constants.ts).
6
+ */
7
+ export declare const DEFAULT_TOKEN_EXPIRY_SECONDS = 3600;
8
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,OAAO,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Default JWT token expiry in seconds. Used by createPipeHandler for token
3
+ * generation and by createPipeAdmin for revocation TTL defaults.
4
+ *
5
+ * Must stay in sync with the API-side constant (apps/hotpipe-api/src/constants.ts).
6
+ */
7
+ export const DEFAULT_TOKEN_EXPIRY_SECONDS = 3600;
8
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC"}
@@ -15,7 +15,18 @@ interface AuthResult {
15
15
  pipes: Record<string, PipePermissions>;
16
16
  }
17
17
  /**
18
- * Creates a typed server-side publisher for emitting events to the broker
18
+ * Options for server-side publish calls.
19
+ */
20
+ interface PublishOptions {
21
+ /**
22
+ * An optional sender identity to attach to this event. Receiving clients
23
+ * see this in `metadata.sender`. When omitted, `sender` is `null`,
24
+ * indicating the event originated from the server with no specific user.
25
+ */
26
+ sender?: string;
27
+ }
28
+ /**
29
+ * Creates a typed server-side publisher for emitting events to the hotpipe API
19
30
  * from API routes, server actions, webhooks, cron jobs, etc.
20
31
  *
21
32
  * ```ts
@@ -31,8 +42,8 @@ interface AuthResult {
31
42
  export declare function createPipePublisher<T extends EventMap>(config: {
32
43
  secret: string;
33
44
  events: T;
34
- /** @internal Override the broker URL for local development. */
35
- brokerUrl?: string;
45
+ /** @internal Override the API URL for local development. */
46
+ apiUrl?: string;
36
47
  }): {
37
48
  /**
38
49
  * Get a reference to a pipe. Returns a `{ publish }` object with
@@ -44,7 +55,7 @@ export declare function createPipePublisher<T extends EventMap>(config: {
44
55
  * ```
45
56
  */
46
57
  pipe(pipe: string): {
47
- publish<E extends keyof T & string>(event: E, data: z.infer<T[E]>): Promise<void>;
58
+ publish<E extends keyof T & string>(event: E, data: z.infer<T[E]>, options?: PublishOptions): Promise<void>;
48
59
  };
49
60
  };
50
61
  /**
@@ -77,5 +88,65 @@ export declare function createPipeHandler(handlerConfig: {
77
88
  }): {
78
89
  POST: (req: Request) => Promise<Response>;
79
90
  };
80
- export type { AuthResult, EventMap, PipePermissions };
91
+ /**
92
+ * Options for revocation methods.
93
+ */
94
+ interface RevokeOptions {
95
+ /** TTL in seconds for the revocation entry. Defaults to the API's token expiry. */
96
+ ttl?: number;
97
+ }
98
+ /**
99
+ * A single revocation target for batch operations.
100
+ */
101
+ interface RevocationEntry {
102
+ userId: string;
103
+ pipe: string;
104
+ }
105
+ /**
106
+ * Creates a server-side admin client for revoking pipe access.
107
+ *
108
+ * ```ts
109
+ * const pipeAdmin = createPipeAdmin({
110
+ * secret: process.env.HOTPIPE_SECRET!,
111
+ * });
112
+ *
113
+ * await pipeAdmin.revoke('user-123', 'room-xyz');
114
+ * await pipeAdmin.revokeAll('user-123');
115
+ * ```
116
+ */
117
+ export declare function createPipeAdmin(config: {
118
+ secret: string;
119
+ /** @internal Override the API URL for local development. */
120
+ apiUrl?: string;
121
+ }): {
122
+ /**
123
+ * Revoke access to one or more pipes for a user.
124
+ *
125
+ * ```ts
126
+ * await pipeAdmin.revoke('user-123', 'room-xyz');
127
+ * await pipeAdmin.revoke('user-123', ['room-xyz', 'room-abc']);
128
+ * ```
129
+ */
130
+ revoke(userId: string, pipe: string | string[], options?: RevokeOptions): Promise<void>;
131
+ /**
132
+ * Revoke all pipe access for a user (e.g., account suspension).
133
+ *
134
+ * ```ts
135
+ * await pipeAdmin.revokeAll('user-123');
136
+ * ```
137
+ */
138
+ revokeAll(userId: string, options?: RevokeOptions): Promise<void>;
139
+ /**
140
+ * Batch-revoke access for multiple user/pipe combinations.
141
+ *
142
+ * ```ts
143
+ * await pipeAdmin.revokeBatch([
144
+ * { userId: 'user-123', pipe: 'room-xyz' },
145
+ * { userId: 'user-456', pipe: 'room-xyz' },
146
+ * ]);
147
+ * ```
148
+ */
149
+ revokeBatch(revocations: RevocationEntry[], options?: RevokeOptions): Promise<void>;
150
+ };
151
+ export type { AuthResult, EventMap, PipePermissions, PublishOptions, RevokeOptions };
81
152
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAE1C;;GAEG;AACH,UAAU,eAAe;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACxC;AAwBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,CAAC;IACV,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;IAwCG;;;;;;;;OAQG;eACQ,MAAM;gBAEC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,SAC/B,CAAC,QACF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAClB,OAAO,CAAC,IAAI,CAAC;;EAMvB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;gBAuC6B,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;EAWxD;AAED,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAM7B,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAE1C;;GAEG;AACH,UAAU,eAAe;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,UAAU,cAAc;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAwBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,CAAC;IACV,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;IAgDG;;;;;;;;OAQG;eACQ,MAAM;gBAEC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,SAC/B,CAAC,QACF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YACT,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;;EAMvB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;gBAyC6B,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;EAWxD;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;IA2CG;;;;;;;OAOG;mBACkB,MAAM,QAAQ,MAAM,GAAG,MAAM,EAAE,YAAY,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7F;;;;;;OAMG;sBACqB,MAAM,YAAY,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE;;;;;;;;;OASG;6BAC4B,eAAe,EAAE,YAAY,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;EAI5F;AAED,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}