hotpipe 0.1.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.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Hotpipe
2
+
3
+ Check out the docs at [docs.hotpipe.dev](https://docs.hotpipe.dev)
@@ -1,32 +1,102 @@
1
1
  export type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';
2
- export type ChannelListener = (event: string, data: unknown) => void;
2
+ export interface PipeEventMetadata {
3
+ sender: string | null;
4
+ ts: number;
5
+ }
6
+ export type PipeListener = (event: string, data: unknown, metadata: PipeEventMetadata) => void;
7
+ export type ServerMessage = {
8
+ type: 'error';
9
+ message: string;
10
+ code?: string;
11
+ limit?: number;
12
+ current?: number;
13
+ upgradeUrl?: string;
14
+ } | {
15
+ type: 'system';
16
+ code: string;
17
+ message: string;
18
+ pipe?: string;
19
+ limit?: number;
20
+ current?: number;
21
+ upgradeUrl?: string;
22
+ } | {
23
+ type: 'authenticated';
24
+ } | {
25
+ type: 'subscribed';
26
+ pipe: string;
27
+ } | {
28
+ type: 'unsubscribed';
29
+ pipe: string;
30
+ } | {
31
+ type: 'pong';
32
+ } | {
33
+ type: 'token_updated';
34
+ };
35
+ export type ServerMessageListener = (msg: ServerMessage) => void;
3
36
  interface ConnectionConfig {
4
- brokerUrl: string;
37
+ apiUrl: string;
5
38
  authEndpoint: string;
39
+ authHeaders?: () => Promise<Record<string, string>>;
40
+ onPipeRevoked?: (pipe: string) => void;
41
+ onAllPipesRevoked?: () => void;
6
42
  }
7
43
  export declare class ConnectionManager {
8
44
  private config;
9
45
  private ws;
10
46
  private status;
11
47
  private statusListeners;
12
- private channelListeners;
13
- private channelRefs;
48
+ private pipeListeners;
49
+ private serverListeners;
50
+ private pipeRefs;
14
51
  private reconnectAttempts;
15
52
  private maxReconnectDelay;
16
53
  private pingInterval;
17
54
  private reconnectTimer;
55
+ private releaseTimer;
18
56
  private intentionalClose;
57
+ private eventQueue;
58
+ private providerRefCount;
59
+ private refreshPromise;
19
60
  constructor(config: ConnectionConfig);
61
+ /**
62
+ * Called by PipeProvider on mount. Ref-counts providers and connects
63
+ * on the first mount. Cancels any pending delayed disconnect from a
64
+ * prior release (e.g., during HMR remount).
65
+ */
66
+ retain(): void;
67
+ /**
68
+ * Called by PipeProvider on unmount. Decrements ref count and schedules
69
+ * a delayed disconnect when the last provider unmounts. The delay
70
+ * absorbs HMR unmount/remount cycles so the connection stays alive.
71
+ */
72
+ release(): void;
73
+ getProviderRefCount(): number;
74
+ updateConfig(config: ConnectionConfig): void;
20
75
  connect(): Promise<void>;
21
76
  disconnect(): void;
22
- subscribe(channel: string): void;
23
- unsubscribe(channel: string): void;
24
- publish(channel: string, event: string, data: unknown): void;
25
- addChannelListener(channel: string, listener: ChannelListener): void;
26
- removeChannelListener(channel: string, listener: ChannelListener): void;
77
+ /**
78
+ * Fetches a fresh token from the auth endpoint and sends it to the API
79
+ * for mid-session permission updates. Fire-and-forget — if the token is
80
+ * valid, the API updates permissions immediately. If invalid, the API
81
+ * sends an error through the existing onServerMessage path.
82
+ *
83
+ * No-op if the WebSocket is not connected. Concurrent calls collapse
84
+ * into a single auth request.
85
+ */
86
+ refreshToken(): Promise<void>;
87
+ private doRefreshToken;
88
+ subscribe(pipe: string): void;
89
+ unsubscribe(pipe: string): void;
90
+ publish(pipe: string, event: string, data: unknown): boolean;
91
+ addPipeListener(pipe: string, listener: PipeListener): void;
92
+ removePipeListener(pipe: string, listener: PipeListener): void;
27
93
  getStatus(): ConnectionStatus;
28
94
  onStatusChange(listener: (status: ConnectionStatus) => void): () => void;
95
+ onServerMessage(listener: ServerMessageListener): () => void;
96
+ private flushQueue;
29
97
  private dispatch;
98
+ private dispatchServerMessage;
99
+ private handleRevocationEvent;
30
100
  private setStatus;
31
101
  private wsSend;
32
102
  private cleanup;
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/client/connection.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAE5F,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;AAErE,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,iBAAiB;IAYhB,OAAO,CAAC,MAAM;IAX1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,eAAe,CAAiD;IACxE,OAAO,CAAC,gBAAgB,CAA2C;IACnE,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAS;gBAEb,MAAM,EAAE,gBAAgB;IAEtC,OAAO;IAqEb,UAAU;IAcV,SAAS,CAAC,OAAO,EAAE,MAAM;IASzB,WAAW,CAAC,OAAO,EAAE,MAAM;IAc3B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;IAMrD,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe;IAQ7D,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe;IAQhE,SAAS,IAAI,gBAAgB;IAI7B,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAKxE,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,iBAAiB;CAW1B"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/client/connection.ts"],"names":[],"mappings":"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"}
@@ -1,55 +1,121 @@
1
+ import { SDK_VERSION } from '../version';
2
+ const MAX_QUEUE_SIZE = 100;
3
+ const QUEUE_TTL = 30_000;
4
+ const RELEASE_DELAY = 500;
5
+ const AUTH_TIMEOUT_MS = 10_000;
1
6
  export class ConnectionManager {
2
7
  config;
3
8
  ws = null;
4
9
  status = 'disconnected';
5
10
  statusListeners = new Set();
6
- channelListeners = new Map();
7
- channelRefs = new Map();
11
+ pipeListeners = new Map();
12
+ serverListeners = new Set();
13
+ pipeRefs = new Map();
8
14
  reconnectAttempts = 0;
9
15
  maxReconnectDelay = 30_000;
10
16
  pingInterval = null;
11
17
  reconnectTimer = null;
18
+ releaseTimer = null;
12
19
  intentionalClose = false;
20
+ eventQueue = [];
21
+ providerRefCount = 0;
22
+ refreshPromise = null;
13
23
  constructor(config) {
14
24
  this.config = config;
15
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
+ }
16
59
  async connect() {
17
60
  if (this.status === 'connecting' || this.status === 'connected')
18
61
  return;
19
62
  this.intentionalClose = false;
20
63
  this.setStatus(this.reconnectAttempts > 0 ? 'reconnecting' : 'connecting');
21
64
  try {
65
+ const headers = this.config.authHeaders ? await this.config.authHeaders() : undefined;
22
66
  const res = await fetch(this.config.authEndpoint, {
23
67
  method: 'POST',
24
68
  credentials: 'include',
69
+ headers,
70
+ signal: AbortSignal.timeout(AUTH_TIMEOUT_MS),
25
71
  });
26
72
  if (!res.ok) {
27
73
  throw new Error(`Auth failed: ${res.status}`);
28
74
  }
29
- const { token } = await res.json();
30
- const wsUrl = `${this.config.brokerUrl}/ws?token=${encodeURIComponent(token)}`;
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}`;
31
81
  this.ws = new WebSocket(wsUrl);
32
82
  this.ws.onopen = () => {
33
- this.setStatus('connected');
34
- this.reconnectAttempts = 0;
35
- // Resubscribe to all active channels
36
- for (const channel of this.channelRefs.keys()) {
37
- this.wsSend({ type: 'subscribe', channel });
38
- }
39
- // Keepalive ping every 30s
40
- this.pingInterval = setInterval(() => {
41
- this.wsSend({ type: 'ping' });
42
- }, 30_000);
83
+ // Send auth token as first message (token never appears in URL)
84
+ this.wsSend({ type: 'auth', token });
43
85
  };
44
86
  this.ws.onmessage = (event) => {
45
87
  try {
46
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
+ }
47
106
  if (msg.type === 'event') {
48
- this.dispatch(msg.channel, 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);
49
115
  }
50
116
  }
51
- catch {
52
- // Ignore malformed messages
117
+ catch (err) {
118
+ console.warn('[hotpipe] Failed to parse server message:', err);
53
119
  }
54
120
  };
55
121
  this.ws.onclose = () => {
@@ -79,42 +145,98 @@ export class ConnectionManager {
79
145
  }
80
146
  this.ws?.close();
81
147
  this.ws = null;
148
+ this.eventQueue = [];
82
149
  this.setStatus('disconnected');
83
150
  }
84
- subscribe(channel) {
85
- const count = this.channelRefs.get(channel) || 0;
86
- this.channelRefs.set(channel, count + 1);
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
+ }
195
+ subscribe(pipe) {
196
+ const count = this.pipeRefs.get(pipe) || 0;
197
+ this.pipeRefs.set(pipe, count + 1);
87
198
  if (count === 0 && this.ws?.readyState === WebSocket.OPEN) {
88
- this.wsSend({ type: 'subscribe', channel });
199
+ this.wsSend({ type: 'subscribe', pipe });
89
200
  }
90
201
  }
91
- unsubscribe(channel) {
92
- const count = this.channelRefs.get(channel) || 0;
202
+ unsubscribe(pipe) {
203
+ const count = this.pipeRefs.get(pipe) || 0;
204
+ if (count === 0)
205
+ return;
93
206
  if (count <= 1) {
94
- this.channelRefs.delete(channel);
207
+ this.pipeRefs.delete(pipe);
95
208
  if (this.ws?.readyState === WebSocket.OPEN) {
96
- this.wsSend({ type: 'unsubscribe', channel });
209
+ this.wsSend({ type: 'unsubscribe', pipe });
97
210
  }
98
211
  }
99
212
  else {
100
- this.channelRefs.set(channel, count - 1);
213
+ this.pipeRefs.set(pipe, count - 1);
101
214
  }
102
215
  }
103
- publish(channel, event, data) {
216
+ publish(pipe, event, data) {
104
217
  if (this.ws?.readyState === WebSocket.OPEN) {
105
- this.wsSend({ type: 'publish', channel, event, data });
218
+ this.wsSend({ type: 'publish', pipe, event, data });
219
+ return true;
220
+ }
221
+ if (this.intentionalClose) {
222
+ return false;
106
223
  }
224
+ if (this.eventQueue.length >= MAX_QUEUE_SIZE) {
225
+ return false;
226
+ }
227
+ this.eventQueue.push({ pipe, event, data, timestamp: Date.now() });
228
+ return true;
107
229
  }
108
- addChannelListener(channel, listener) {
109
- if (!this.channelListeners.has(channel)) {
110
- this.channelListeners.set(channel, new Set());
230
+ addPipeListener(pipe, listener) {
231
+ if (!this.pipeListeners.has(pipe)) {
232
+ this.pipeListeners.set(pipe, new Set());
111
233
  }
112
- this.channelListeners.get(channel).add(listener);
234
+ this.pipeListeners.get(pipe).add(listener);
113
235
  }
114
- removeChannelListener(channel, listener) {
115
- this.channelListeners.get(channel)?.delete(listener);
116
- if (this.channelListeners.get(channel)?.size === 0) {
117
- this.channelListeners.delete(channel);
236
+ removePipeListener(pipe, listener) {
237
+ this.pipeListeners.get(pipe)?.delete(listener);
238
+ if (this.pipeListeners.get(pipe)?.size === 0) {
239
+ this.pipeListeners.delete(pipe);
118
240
  }
119
241
  }
120
242
  getStatus() {
@@ -124,12 +246,42 @@ export class ConnectionManager {
124
246
  this.statusListeners.add(listener);
125
247
  return () => this.statusListeners.delete(listener);
126
248
  }
127
- dispatch(channel, event, data) {
128
- const listeners = this.channelListeners.get(channel);
249
+ onServerMessage(listener) {
250
+ this.serverListeners.add(listener);
251
+ return () => this.serverListeners.delete(listener);
252
+ }
253
+ flushQueue() {
254
+ const now = Date.now();
255
+ const pending = this.eventQueue.filter((e) => now - e.timestamp < QUEUE_TTL);
256
+ this.eventQueue = [];
257
+ for (const { pipe, event, data } of pending) {
258
+ this.wsSend({ type: 'publish', pipe, event, data });
259
+ }
260
+ }
261
+ dispatch(pipe, event, data, metadata) {
262
+ const listeners = this.pipeListeners.get(pipe);
129
263
  if (!listeners)
130
264
  return;
131
265
  for (const listener of listeners) {
132
- 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?.();
133
285
  }
134
286
  }
135
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":"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"}
@@ -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
  */
@@ -13,40 +13,44 @@ type EventName<T extends EventMap> = keyof T & string;
13
13
  */
14
14
  type EventData<T extends EventMap, E extends EventName<T>> = z.infer<T[E]>;
15
15
  /**
16
- * Handler map for useChannel — a partial record of event handlers.
16
+ * Handler map for usePipe — a partial record of event handlers.
17
17
  */
18
- type ChannelHandlers<T extends EventMap> = {
19
- [E in EventName<T>]?: (data: EventData<T, E>) => void;
18
+ type PipeHandlers<T extends EventMap> = {
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.
23
23
  *
24
24
  * Usage:
25
25
  * ```ts
26
- * const { RealtimeProvider, useChannel, useEvent } = createRealtimeClient({
26
+ * const { PipeProvider, usePipe } = createPipeClient({
27
27
  * events: realtimeEvents,
28
- * auth: { endpoint: '/api/realtime/auth' },
29
28
  * });
30
29
  * ```
31
30
  */
32
- export declare function createRealtimeClient<T extends EventMap>(config: {
31
+ export declare function createPipeClient<T extends EventMap>(config: {
33
32
  events: T;
34
- auth: {
35
- endpoint: string;
36
- };
37
- /** Override the broker URL. Defaults to `wss://api.hotpipe.dev`. */
38
- brokerUrl?: string;
33
+ /** Override the base path where your handler is mounted. Defaults to `/api/realtime`. */
34
+ basePath?: string;
35
+ /** @internal Override the API URL for local development. */
36
+ apiUrl?: string;
37
+ /** Provide custom headers for the auth request (e.g., a Bearer token). */
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
- RealtimeProvider: ({ children }: {
44
+ PipeProvider: ({ children }: {
41
45
  children: React.ReactNode;
42
46
  }) => import("react/jsx-runtime").JSX.Element;
43
- useChannel: (channel: string, handlers: Partial<ChannelHandlers<T>>) => {
44
- status: ConnectionStatus;
45
- publish: <E extends EventName<T>>(event: E, data: EventData<T, E>) => void;
46
- };
47
- useEvent: <E extends EventName<T>>(channel: string, event: E, handler: (data: EventData<T, E>) => void) => {
47
+ usePipe: (pipe: string, handlers?: Partial<PipeHandlers<T>>, options?: {
48
+ onServerMessage?: (msg: ServerMessage) => void;
49
+ }) => {
48
50
  status: ConnectionStatus;
51
+ publish: <E extends EventName<T>>(event: E, data: EventData<T, E>) => boolean;
49
52
  };
53
+ refreshPipeAuth: () => Promise<void>;
50
54
  };
51
- export type { ConnectionStatus, EventMap };
55
+ export type { ConnectionStatus, EventMap, PipeEventMetadata, ServerMessage };
52
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,eAAe,CAAC,CAAC,SAAS,QAAQ,IAAI;KACxC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI;CACtD,CAAC;AAIF;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE;IAC/D,MAAM,EAAE,CAAC,CAAC;IACV,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;qCAiByC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;0BA+B1D,MAAM,YACL,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KACpC;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,IAAI,CAAC;KAC5E;eA6DiB,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,WAC7B,MAAM,SACR,CAAC,WACC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,KACvC;QAAE,MAAM,EAAE,gBAAgB,CAAA;KAAE;EA+BhC;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"}