@motherbase/client 2.2.0 → 2.2.3
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/COMPATIBILITY.md +157 -0
- package/LICENSE +21 -21
- package/README.md +53 -5
- package/dist/admin/auth-admin-client.d.ts +43 -0
- package/dist/admin/auth-admin-client.d.ts.map +1 -0
- package/dist/admin/auth-admin-client.js +62 -0
- package/dist/admin/auth-admin-client.js.map +1 -0
- package/dist/admin/auth-admin-mfa-client.d.ts +22 -0
- package/dist/admin/auth-admin-mfa-client.d.ts.map +1 -0
- package/dist/admin/auth-admin-mfa-client.js +17 -0
- package/dist/admin/auth-admin-mfa-client.js.map +1 -0
- package/dist/admin/types.d.ts +85 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +3 -0
- package/dist/admin/types.js.map +1 -0
- package/dist/auth/constants.d.ts +21 -0
- package/dist/auth/constants.d.ts.map +1 -0
- package/dist/auth/constants.js +34 -0
- package/dist/auth/constants.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +34 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/motherbase-plugin.d.ts +6 -0
- package/dist/auth/motherbase-plugin.d.ts.map +1 -0
- package/dist/auth/motherbase-plugin.js +80 -0
- package/dist/auth/motherbase-plugin.js.map +1 -0
- package/dist/auth/pkce.d.ts +19 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +89 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/session-utils.d.ts +29 -0
- package/dist/auth/session-utils.d.ts.map +1 -0
- package/dist/auth/session-utils.js +123 -0
- package/dist/auth/session-utils.js.map +1 -0
- package/dist/auth/session.d.ts +51 -0
- package/dist/auth/session.d.ts.map +1 -0
- package/dist/auth/session.js +161 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/types.d.ts +341 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/utils.d.ts +28 -0
- package/dist/auth/utils.d.ts.map +1 -0
- package/dist/auth/utils.js +70 -0
- package/dist/auth/utils.js.map +1 -0
- package/dist/auth.d.ts +3 -2
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +27 -11
- package/dist/auth.js.map +1 -1
- package/dist/channel.d.ts +11 -0
- package/dist/channel.d.ts.map +1 -1
- package/dist/channel.js +26 -2
- package/dist/channel.js.map +1 -1
- package/dist/cookies/cookie-storage.d.ts +12 -0
- package/dist/cookies/cookie-storage.d.ts.map +1 -0
- package/dist/cookies/cookie-storage.js +35 -0
- package/dist/cookies/cookie-storage.js.map +1 -0
- package/dist/cookies/index.d.ts +5 -0
- package/dist/cookies/index.d.ts.map +1 -0
- package/dist/cookies/index.js +5 -0
- package/dist/cookies/index.js.map +1 -0
- package/dist/cookies/server-cookie-storage.d.ts +20 -0
- package/dist/cookies/server-cookie-storage.d.ts.map +1 -0
- package/dist/cookies/server-cookie-storage.js +60 -0
- package/dist/cookies/server-cookie-storage.js.map +1 -0
- package/dist/cookies/types.d.ts +33 -0
- package/dist/cookies/types.d.ts.map +1 -0
- package/dist/cookies/types.js +8 -0
- package/dist/cookies/types.js.map +1 -0
- package/dist/cookies/utils.d.ts +23 -0
- package/dist/cookies/utils.d.ts.map +1 -0
- package/dist/cookies/utils.js +67 -0
- package/dist/cookies/utils.js.map +1 -0
- package/dist/database/database.d.ts +197 -0
- package/dist/database/database.d.ts.map +1 -0
- package/dist/database/database.js +2 -0
- package/dist/database/database.js.map +1 -0
- package/dist/database/facade.d.ts +144 -0
- package/dist/database/facade.d.ts.map +1 -0
- package/dist/database/facade.js +147 -0
- package/dist/database/facade.js.map +1 -0
- package/dist/database/query.d.ts +97 -0
- package/dist/database/query.d.ts.map +1 -0
- package/dist/database/query.js +94 -0
- package/dist/database/query.js.map +1 -0
- package/dist/database/types.d.ts +314 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +2 -0
- package/dist/database/types.js.map +1 -0
- package/dist/functions/errors.d.ts +28 -0
- package/dist/functions/errors.d.ts.map +1 -0
- package/dist/functions/errors.js +37 -0
- package/dist/functions/errors.js.map +1 -0
- package/dist/functions/index.d.ts +9 -0
- package/dist/functions/index.d.ts.map +1 -0
- package/dist/functions/index.js +40 -0
- package/dist/functions/index.js.map +1 -0
- package/dist/functions/types.d.ts +25 -0
- package/dist/functions/types.d.ts.map +1 -0
- package/dist/functions/types.js +2 -0
- package/dist/functions/types.js.map +1 -0
- package/dist/http/backend-error.d.ts +17 -0
- package/dist/http/backend-error.d.ts.map +1 -0
- package/dist/http/backend-error.js +11 -0
- package/dist/http/backend-error.js.map +1 -0
- package/dist/http/index.d.ts +59 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +175 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/types.d.ts +45 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +2 -0
- package/dist/http/types.js.map +1 -0
- package/dist/http/utils.d.ts +14 -0
- package/dist/http/utils.d.ts.map +1 -0
- package/dist/http/utils.js +37 -0
- package/dist/http/utils.js.map +1 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +2 -1
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +47 -77
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -73
- package/dist/index.js.map +1 -1
- package/dist/pkce.js +4 -4
- package/dist/postgrest/index.d.ts +4 -0
- package/dist/postgrest/index.d.ts.map +1 -0
- package/dist/postgrest/index.js +4 -0
- package/dist/postgrest/index.js.map +1 -0
- package/dist/postgrest/query-builder.d.ts +224 -0
- package/dist/postgrest/query-builder.d.ts.map +1 -0
- package/dist/postgrest/query-builder.js +544 -0
- package/dist/postgrest/query-builder.js.map +1 -0
- package/dist/postgrest/rpc.d.ts +12 -0
- package/dist/postgrest/rpc.d.ts.map +1 -0
- package/dist/postgrest/rpc.js +42 -0
- package/dist/postgrest/rpc.js.map +1 -0
- package/dist/postgrest/types.d.ts +88 -0
- package/dist/postgrest/types.d.ts.map +1 -0
- package/dist/postgrest/types.js +2 -0
- package/dist/postgrest/types.js.map +1 -0
- package/dist/postgrest/utils.d.ts +23 -0
- package/dist/postgrest/utils.d.ts.map +1 -0
- package/dist/postgrest/utils.js +87 -0
- package/dist/postgrest/utils.js.map +1 -0
- package/dist/postgrest.d.ts +5 -1
- package/dist/postgrest.d.ts.map +1 -1
- package/dist/postgrest.js +17 -10
- package/dist/postgrest.js.map +1 -1
- package/dist/realtime/channel.d.ts +83 -0
- package/dist/realtime/channel.d.ts.map +1 -0
- package/dist/realtime/channel.js +240 -0
- package/dist/realtime/channel.js.map +1 -0
- package/dist/realtime/index.d.ts +94 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +455 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/types.d.ts +120 -0
- package/dist/realtime/types.d.ts.map +1 -0
- package/dist/realtime/types.js +2 -0
- package/dist/realtime/types.js.map +1 -0
- package/dist/realtime.d.ts +1 -0
- package/dist/realtime.d.ts.map +1 -1
- package/dist/realtime.js +26 -1
- package/dist/realtime.js.map +1 -1
- package/dist/runtime.d.ts +13 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +15 -0
- package/dist/runtime.js.map +1 -0
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +11 -2
- package/dist/session.js.map +1 -1
- package/dist/storage/bucket.d.ts +166 -0
- package/dist/storage/bucket.d.ts.map +1 -0
- package/dist/storage/bucket.js +294 -0
- package/dist/storage/bucket.js.map +1 -0
- package/dist/storage/index.d.ts +45 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +55 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/types.d.ts +131 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/storage/utils.d.ts +27 -0
- package/dist/storage/utils.d.ts.map +1 -0
- package/dist/storage/utils.js +43 -0
- package/dist/storage/utils.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +3 -0
- package/dist/test.js.map +1 -0
- package/dist/types.d.ts +14 -249
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/compat.d.ts +40 -0
- package/dist/utils/compat.d.ts.map +1 -0
- package/dist/utils/compat.js +100 -0
- package/dist/utils/compat.js.map +1 -0
- package/dist/utils/runtime.d.ts +13 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/utils/runtime.js +15 -0
- package/dist/utils/runtime.js.map +1 -0
- package/dist/utils/testing.d.ts +38 -0
- package/dist/utils/testing.d.ts.map +1 -0
- package/dist/utils/testing.js +50 -0
- package/dist/utils/testing.js.map +1 -0
- package/dist/utils/warn.d.ts +2 -0
- package/dist/utils/warn.d.ts.map +1 -0
- package/dist/utils/warn.js +23 -0
- package/dist/utils/warn.js.map +1 -0
- package/package.json +13 -11
- package/dist/devices.d.ts +0 -13
- package/dist/devices.d.ts.map +0 -1
- package/dist/devices.js +0 -13
- package/dist/devices.js.map +0 -1
- package/dist/profile.d.ts +0 -16
- package/dist/profile.d.ts.map +0 -1
- package/dist/profile.js +0 -26
- package/dist/profile.js.map +0 -1
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
import { normalizeRealtimeModel, contractPath, REALTIME_TOPIC_EVENTS, REALTIME_SOCKET_EVENTS } from '@motherbase/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* Lazy wrapper over socket.io-client. The dependency is optional: it is only
|
|
4
|
+
* imported when `connect()` is called, so apps that never use realtime do not
|
|
5
|
+
* need to install it.
|
|
6
|
+
*/
|
|
7
|
+
export class RealtimeModule {
|
|
8
|
+
constructor(baseUrl, store, fetchImpl = globalThis.fetch?.bind(globalThis),
|
|
9
|
+
/** Inject a socket factory (tests / custom transports). Falls back to socket.io-client. */
|
|
10
|
+
ioFactory) {
|
|
11
|
+
this.baseUrl = baseUrl;
|
|
12
|
+
this.store = store;
|
|
13
|
+
this.fetchImpl = fetchImpl;
|
|
14
|
+
this.ioFactory = ioFactory;
|
|
15
|
+
this.socket = null;
|
|
16
|
+
this.status = 'idle';
|
|
17
|
+
this.statusListeners = new Set();
|
|
18
|
+
this.pollers = new Map();
|
|
19
|
+
this.tableSubscriptionRefs = new Map();
|
|
20
|
+
this.pollerSeq = 0;
|
|
21
|
+
this.channelsByTopic = new Map();
|
|
22
|
+
/** Topics joined on the current socket, replayed as-is after a reconnect. */
|
|
23
|
+
this.joinedTopics = new Map();
|
|
24
|
+
this.topicRouterBound = false;
|
|
25
|
+
this.connecting = null;
|
|
26
|
+
this.pendingJoins = new Map();
|
|
27
|
+
// The server reads the session once, in the handshake. A socket opened
|
|
28
|
+
// signed out would otherwise stay anonymous after a sign-in (and RLS then
|
|
29
|
+
// filters every row out of its channels), and one opened signed in would
|
|
30
|
+
// keep the old user after a sign-out. supabase-js re-auths its socket on
|
|
31
|
+
// these events too.
|
|
32
|
+
this.store.subscribe(() => {
|
|
33
|
+
if (this.socket && this.store.get()?.accessToken !== this.handshakeToken)
|
|
34
|
+
void this.reauthenticate();
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Reopen the socket under the current session. Joined topics are kept, so
|
|
39
|
+
* the `connect` handler replays them on the new socket and each channel
|
|
40
|
+
* reports SUBSCRIBED (or CHANNEL_ERROR) again through its status callback.
|
|
41
|
+
*/
|
|
42
|
+
async reauthenticate() {
|
|
43
|
+
const previous = this.socket;
|
|
44
|
+
if (!previous)
|
|
45
|
+
return;
|
|
46
|
+
previous.disconnect();
|
|
47
|
+
if (this.socket !== previous)
|
|
48
|
+
return;
|
|
49
|
+
this.socket = null;
|
|
50
|
+
this.topicRouterBound = false;
|
|
51
|
+
try {
|
|
52
|
+
await this.connect();
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// connect() has already reported the failure through the status listeners.
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** True once a socket is connected. */
|
|
59
|
+
get connected() {
|
|
60
|
+
return Boolean(this.socket?.connected);
|
|
61
|
+
}
|
|
62
|
+
/** The connection state right now. */
|
|
63
|
+
getStatus() {
|
|
64
|
+
return this.status;
|
|
65
|
+
}
|
|
66
|
+
/** Call `listener` now and on every connection state change. Returns the unsubscribe function. */
|
|
67
|
+
onStatusChange(listener) {
|
|
68
|
+
this.statusListeners.add(listener);
|
|
69
|
+
listener(this.status);
|
|
70
|
+
return () => this.statusListeners.delete(listener);
|
|
71
|
+
}
|
|
72
|
+
/** Concurrent callers (several channels subscribing at once) share one attempt, not one socket each. */
|
|
73
|
+
connect(options = {}) {
|
|
74
|
+
if (this.socket?.connected)
|
|
75
|
+
return Promise.resolve();
|
|
76
|
+
this.connecting ?? (this.connecting = this.open(options).finally(() => {
|
|
77
|
+
this.connecting = null;
|
|
78
|
+
}));
|
|
79
|
+
return this.connecting;
|
|
80
|
+
}
|
|
81
|
+
async open(options) {
|
|
82
|
+
this.setStatus('connecting');
|
|
83
|
+
let io;
|
|
84
|
+
if (this.ioFactory) {
|
|
85
|
+
io = this.ioFactory;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
try {
|
|
89
|
+
// socket.io-client is an optional peer dependency; resolved at runtime only.
|
|
90
|
+
// ts-ignore rather than ts-expect-error: whether its types resolve depends
|
|
91
|
+
// on whether a sibling workspace installed it (apps/server does, for its
|
|
92
|
+
// realtime integration test), and an unused expect-error fails the build.
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
94
|
+
// @ts-ignore -- optional peer dependency resolved only when realtime connects
|
|
95
|
+
({ io } = (await import('socket.io-client')));
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
if (options.fallbackPolling) {
|
|
99
|
+
this.setStatus('polling');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.setStatus('error', 'socket.io-client is not installed');
|
|
103
|
+
throw new Error('Realtime requires the optional dependency "socket.io-client". Install it: npm i socket.io-client');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// The session may not be in memory yet (http.ts hydrates before every
|
|
107
|
+
// request; nothing hydrates before a channel subscribe). Without this the
|
|
108
|
+
// socket connects anonymously on a cold page load.
|
|
109
|
+
await this.store.hydrate();
|
|
110
|
+
// What the handshake is about to send; the auth callback below keeps it
|
|
111
|
+
// current across socket.io's own reconnects.
|
|
112
|
+
this.handshakeToken = this.store.get()?.accessToken;
|
|
113
|
+
const socket = io(this.baseUrl, {
|
|
114
|
+
path: '/ws',
|
|
115
|
+
transports: ['websocket'],
|
|
116
|
+
reconnection: true,
|
|
117
|
+
// Read as a callback, not a snapshot: socket.io replays the auth payload
|
|
118
|
+
// on every reconnect, so a fixed object would pin the socket to whatever
|
|
119
|
+
// token existed at connect() time (or to none) for the whole session.
|
|
120
|
+
auth: (cb) => {
|
|
121
|
+
const token = this.store.get()?.accessToken;
|
|
122
|
+
this.handshakeToken = token;
|
|
123
|
+
cb(token ? { token } : {});
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
this.socket = socket;
|
|
127
|
+
this.bindSocketStatus(socket);
|
|
128
|
+
this.topicRouterBound = false;
|
|
129
|
+
this.bindTopicRouter();
|
|
130
|
+
try {
|
|
131
|
+
await this.waitForConnect(socket, options.timeoutMs ?? 5000, Boolean(options.fallbackPolling));
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
// A failed attempt must not leave a socket retrying in the background.
|
|
135
|
+
socket.disconnect();
|
|
136
|
+
if (this.socket === socket)
|
|
137
|
+
this.socket = null;
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
on(event, cb) {
|
|
142
|
+
this.socket?.on(event, cb);
|
|
143
|
+
}
|
|
144
|
+
off(event, cb) {
|
|
145
|
+
this.socket?.off(event, cb);
|
|
146
|
+
}
|
|
147
|
+
emit(event, ...args) {
|
|
148
|
+
this.socket?.emit(event, ...args);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* @deprecated Legacy low-level table watcher. Prefer the Supabase-shaped
|
|
152
|
+
* `client.channel(topic).on('postgres_changes', { event, schema, table, filter }, cb)`.
|
|
153
|
+
* Kept for backwards compatibility; scheduled for removal.
|
|
154
|
+
*
|
|
155
|
+
* Subscribe to create/update/delete events for a model table.
|
|
156
|
+
*
|
|
157
|
+
* Events are filtered server-side: you will only receive events for rows
|
|
158
|
+
* your session is authorized to see (based on REST API SELECT policies).
|
|
159
|
+
* Anonymous sessions receive only public rows; authenticated sessions receive
|
|
160
|
+
* rows matching their access policies (e.g. owner-only rows they own).
|
|
161
|
+
*
|
|
162
|
+
* Falls back to polling the REST endpoint at subscribe time if the WebSocket
|
|
163
|
+
* is not yet connected (polling does not auto-start on later disconnects).
|
|
164
|
+
*/
|
|
165
|
+
watchTable(model, cb, options = {}) {
|
|
166
|
+
const normalizedModel = normalizeRealtimeModel(model);
|
|
167
|
+
if (!normalizedModel)
|
|
168
|
+
throw new Error('Invalid realtime model: ' + model);
|
|
169
|
+
const handlers = [];
|
|
170
|
+
const baseEvent = normalizedModel;
|
|
171
|
+
for (const type of ['created', 'updated', 'deleted']) {
|
|
172
|
+
const event = contractPath.realtime(baseEvent, type);
|
|
173
|
+
const handler = (payload) => cb({ type, source: 'socket', payload: payload });
|
|
174
|
+
handlers.push({ event, handler });
|
|
175
|
+
this.socket?.on(event, handler);
|
|
176
|
+
}
|
|
177
|
+
this.retainTableSubscription(normalizedModel);
|
|
178
|
+
const shouldPoll = options.polling !== false && (!this.socket?.connected || this.status === 'polling');
|
|
179
|
+
const pollerId = shouldPoll ? this.startPolling(model, cb, options) : null;
|
|
180
|
+
return () => {
|
|
181
|
+
for (const item of handlers)
|
|
182
|
+
this.socket?.off(item.event, item.handler);
|
|
183
|
+
this.releaseTableSubscription(normalizedModel);
|
|
184
|
+
if (pollerId !== null)
|
|
185
|
+
this.stopPolling(pollerId);
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/** Close the socket and stop every poller. */
|
|
189
|
+
disconnect() {
|
|
190
|
+
this.pendingJoins.clear();
|
|
191
|
+
for (const id of Array.from(this.pollers.keys()))
|
|
192
|
+
this.stopPolling(id);
|
|
193
|
+
this.socket?.disconnect();
|
|
194
|
+
this.socket = null;
|
|
195
|
+
this.topicRouterBound = false;
|
|
196
|
+
this.setStatus('disconnected');
|
|
197
|
+
}
|
|
198
|
+
/** Register a channel so incoming rt:msg envelopes for its topic are routed to it. */
|
|
199
|
+
registerChannel(topic, channel) {
|
|
200
|
+
this.channelsByTopic.set(topic, channel);
|
|
201
|
+
this.bindTopicRouter();
|
|
202
|
+
}
|
|
203
|
+
unregisterChannel(topic) {
|
|
204
|
+
this.pendingJoins.delete(topic);
|
|
205
|
+
this.channelsByTopic.delete(topic);
|
|
206
|
+
// Drop the rejoin memo too, or removeChannel()/removeAllChannels() would
|
|
207
|
+
// resurrect the topic on the next reconnect.
|
|
208
|
+
this.joinedTopics.delete(topic);
|
|
209
|
+
}
|
|
210
|
+
/** Emit rt:join and resolve the server ack (or a timeout/error ack). */
|
|
211
|
+
joinTopic(topic, config, timeoutMs = 10000) {
|
|
212
|
+
if (!this.socket?.connected)
|
|
213
|
+
return Promise.resolve({ status: 'error', error: 'not-connected' });
|
|
214
|
+
const socket = this.socket;
|
|
215
|
+
const attempt = Symbol(topic);
|
|
216
|
+
this.pendingJoins.set(topic, attempt);
|
|
217
|
+
return new Promise(resolve => {
|
|
218
|
+
let settled = false;
|
|
219
|
+
const timer = setTimeout(() => {
|
|
220
|
+
if (settled)
|
|
221
|
+
return;
|
|
222
|
+
settled = true;
|
|
223
|
+
if (this.pendingJoins.get(topic) === attempt)
|
|
224
|
+
this.leaveTopic(topic);
|
|
225
|
+
resolve({ status: 'error', error: 'timeout' });
|
|
226
|
+
}, timeoutMs);
|
|
227
|
+
socket.emit(REALTIME_TOPIC_EVENTS.join, { topic, config }, (ack) => {
|
|
228
|
+
// The server's join can itself be asynchronous. A leave sent while
|
|
229
|
+
// it was authorizing may arrive too early, so clean up its late ack
|
|
230
|
+
// unless a newer subscription now owns this topic.
|
|
231
|
+
const cleanupCancelledJoin = () => {
|
|
232
|
+
if (ack?.status === 'ok' && this.socket === socket
|
|
233
|
+
&& !this.pendingJoins.has(topic) && !this.joinedTopics.has(topic)) {
|
|
234
|
+
socket.emit(REALTIME_TOPIC_EVENTS.leave, { topic });
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
if (settled) {
|
|
238
|
+
cleanupCancelledJoin();
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
settled = true;
|
|
242
|
+
clearTimeout(timer);
|
|
243
|
+
if (this.pendingJoins.get(topic) !== attempt || this.socket !== socket) {
|
|
244
|
+
cleanupCancelledJoin();
|
|
245
|
+
resolve({ status: 'error', error: 'cancelled' });
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
this.pendingJoins.delete(topic);
|
|
249
|
+
const result = ack ?? { status: 'error', error: 'no-ack' };
|
|
250
|
+
// Server-side topic state (rtTopics, postgres_changes bindings, presence)
|
|
251
|
+
// dies with the socket, so remember what to replay after a reconnect.
|
|
252
|
+
if (result.status === 'ok')
|
|
253
|
+
this.joinedTopics.set(topic, config);
|
|
254
|
+
resolve(result);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
leaveTopic(topic) {
|
|
259
|
+
this.pendingJoins.delete(topic);
|
|
260
|
+
this.joinedTopics.delete(topic);
|
|
261
|
+
this.socket?.emit(REALTIME_TOPIC_EVENTS.leave, { topic });
|
|
262
|
+
}
|
|
263
|
+
sendTopic(topic, type, event, payload) {
|
|
264
|
+
this.socket?.emit(REALTIME_TOPIC_EVENTS.message, { topic, type, event, payload });
|
|
265
|
+
}
|
|
266
|
+
/** Emit an rt:msg and wait for the server ack (or resolve 'timed out'/'error'). */
|
|
267
|
+
sendTopicWithAck(topic, type, event, payload, timeoutMs = 10000) {
|
|
268
|
+
if (!this.socket?.connected)
|
|
269
|
+
return Promise.resolve('error');
|
|
270
|
+
const socket = this.socket;
|
|
271
|
+
return new Promise(resolve => {
|
|
272
|
+
let settled = false;
|
|
273
|
+
const timer = setTimeout(() => {
|
|
274
|
+
if (settled)
|
|
275
|
+
return;
|
|
276
|
+
settled = true;
|
|
277
|
+
resolve('timed out');
|
|
278
|
+
}, timeoutMs);
|
|
279
|
+
socket.emit(REALTIME_TOPIC_EVENTS.message, { topic, type, event, payload }, (result) => {
|
|
280
|
+
if (settled)
|
|
281
|
+
return;
|
|
282
|
+
settled = true;
|
|
283
|
+
clearTimeout(timer);
|
|
284
|
+
resolve(result === 'ok' ? 'ok' : 'error');
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
bindTopicRouter() {
|
|
289
|
+
if (this.topicRouterBound || !this.socket)
|
|
290
|
+
return;
|
|
291
|
+
this.topicRouterBound = true;
|
|
292
|
+
this.socket.on(REALTIME_TOPIC_EVENTS.message, (env) => {
|
|
293
|
+
const envelope = env;
|
|
294
|
+
if (!envelope || typeof envelope.topic !== 'string')
|
|
295
|
+
return;
|
|
296
|
+
this.channelsByTopic.get(envelope.topic)?._receive(envelope);
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
retainTableSubscription(model) {
|
|
300
|
+
const refs = this.tableSubscriptionRefs.get(model) ?? 0;
|
|
301
|
+
this.tableSubscriptionRefs.set(model, refs + 1);
|
|
302
|
+
if (refs === 0 && this.socket?.connected)
|
|
303
|
+
this.socket.emit(REALTIME_SOCKET_EVENTS.subscribe, model);
|
|
304
|
+
}
|
|
305
|
+
releaseTableSubscription(model) {
|
|
306
|
+
const refs = this.tableSubscriptionRefs.get(model) ?? 0;
|
|
307
|
+
if (refs > 1) {
|
|
308
|
+
this.tableSubscriptionRefs.set(model, refs - 1);
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
this.tableSubscriptionRefs.delete(model);
|
|
312
|
+
if (refs === 1 && this.socket?.connected)
|
|
313
|
+
this.socket.emit(REALTIME_SOCKET_EVENTS.unsubscribe, model);
|
|
314
|
+
}
|
|
315
|
+
resubscribeTables() {
|
|
316
|
+
if (!this.socket?.connected)
|
|
317
|
+
return;
|
|
318
|
+
for (const model of this.tableSubscriptionRefs.keys()) {
|
|
319
|
+
this.socket.emit(REALTIME_SOCKET_EVENTS.subscribe, model);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Replay every joined topic on a fresh socket. The server keeps topic state on
|
|
324
|
+
* the socket, so without this a reconnected channel still reports SUBSCRIBED
|
|
325
|
+
* and receives nothing at all.
|
|
326
|
+
*/
|
|
327
|
+
async rejoinTopics() {
|
|
328
|
+
for (const [topic, config] of Array.from(this.joinedTopics)) {
|
|
329
|
+
const ack = await this.joinTopic(topic, config);
|
|
330
|
+
this.channelsByTopic.get(topic)?._rejoined?.(ack.status === 'ok');
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
bindSocketStatus(socket) {
|
|
334
|
+
socket.on('connect', () => {
|
|
335
|
+
this.setStatus('connected');
|
|
336
|
+
this.resubscribeTables();
|
|
337
|
+
void this.rejoinTopics();
|
|
338
|
+
});
|
|
339
|
+
socket.on('disconnect', () => this.setStatus(this.pollers.size ? 'polling' : 'disconnected'));
|
|
340
|
+
socket.on('connect_error', error => this.setStatus('error', error));
|
|
341
|
+
socket.on('reconnect_attempt', () => this.setStatus('reconnecting'));
|
|
342
|
+
socket.on('reconnect', () => this.setStatus('connected'));
|
|
343
|
+
}
|
|
344
|
+
waitForConnect(socket, timeoutMs, fallbackPolling) {
|
|
345
|
+
if (socket.connected) {
|
|
346
|
+
this.setStatus('connected');
|
|
347
|
+
this.resubscribeTables();
|
|
348
|
+
return Promise.resolve();
|
|
349
|
+
}
|
|
350
|
+
return new Promise((resolve, reject) => {
|
|
351
|
+
let settled = false;
|
|
352
|
+
const cleanup = () => {
|
|
353
|
+
socket.off('connect', onConnect);
|
|
354
|
+
socket.off('connect_error', onError);
|
|
355
|
+
clearTimeout(timer);
|
|
356
|
+
};
|
|
357
|
+
const settle = (fn) => {
|
|
358
|
+
if (settled)
|
|
359
|
+
return;
|
|
360
|
+
settled = true;
|
|
361
|
+
cleanup();
|
|
362
|
+
fn();
|
|
363
|
+
};
|
|
364
|
+
const onConnect = () => settle(() => {
|
|
365
|
+
this.setStatus('connected');
|
|
366
|
+
resolve();
|
|
367
|
+
});
|
|
368
|
+
const onError = (error) => {
|
|
369
|
+
if (fallbackPolling) {
|
|
370
|
+
settle(() => {
|
|
371
|
+
this.setStatus('polling', error);
|
|
372
|
+
resolve();
|
|
373
|
+
});
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
settle(() => {
|
|
377
|
+
this.setStatus('error', error);
|
|
378
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
379
|
+
});
|
|
380
|
+
};
|
|
381
|
+
const timer = setTimeout(() => {
|
|
382
|
+
if (fallbackPolling) {
|
|
383
|
+
settle(() => {
|
|
384
|
+
this.setStatus('polling');
|
|
385
|
+
resolve();
|
|
386
|
+
});
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
settle(() => {
|
|
390
|
+
const error = new Error('Realtime connection timeout');
|
|
391
|
+
this.setStatus('error', error);
|
|
392
|
+
reject(error);
|
|
393
|
+
});
|
|
394
|
+
}, timeoutMs);
|
|
395
|
+
socket.on('connect', onConnect);
|
|
396
|
+
socket.on('connect_error', onError);
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
startPolling(model, cb, options) {
|
|
400
|
+
if (!this.fetchImpl)
|
|
401
|
+
throw new Error('Realtime polling requires a fetch implementation.');
|
|
402
|
+
const id = ++this.pollerSeq;
|
|
403
|
+
let last = '';
|
|
404
|
+
let stopped = false;
|
|
405
|
+
const run = async () => {
|
|
406
|
+
if (stopped)
|
|
407
|
+
return;
|
|
408
|
+
const rows = await this.fetchRows(model, options.query);
|
|
409
|
+
const snapshot = JSON.stringify(rows);
|
|
410
|
+
if (snapshot !== last) {
|
|
411
|
+
last = snapshot;
|
|
412
|
+
cb({ type: 'snapshot', source: 'polling', rows });
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
const timer = setInterval(() => {
|
|
416
|
+
run().catch(error => this.setStatus('error', error));
|
|
417
|
+
}, options.intervalMs ?? 5000);
|
|
418
|
+
this.pollers.set(id, {
|
|
419
|
+
timer,
|
|
420
|
+
stop: () => {
|
|
421
|
+
stopped = true;
|
|
422
|
+
clearInterval(timer);
|
|
423
|
+
},
|
|
424
|
+
});
|
|
425
|
+
this.setStatus(this.socket?.connected ? 'connected' : 'polling');
|
|
426
|
+
run().catch(error => this.setStatus('error', error));
|
|
427
|
+
return id;
|
|
428
|
+
}
|
|
429
|
+
stopPolling(id) {
|
|
430
|
+
const poller = this.pollers.get(id);
|
|
431
|
+
if (!poller)
|
|
432
|
+
return;
|
|
433
|
+
poller.stop();
|
|
434
|
+
this.pollers.delete(id);
|
|
435
|
+
if (!this.socket?.connected && this.pollers.size === 0)
|
|
436
|
+
this.setStatus('disconnected');
|
|
437
|
+
}
|
|
438
|
+
async fetchRows(model, query) {
|
|
439
|
+
const path = `${contractPath.rest(model)}${query ? (query.startsWith('?') ? query : `?${query}`) : ''}`;
|
|
440
|
+
const headers = {};
|
|
441
|
+
const token = this.store.get()?.accessToken;
|
|
442
|
+
if (token)
|
|
443
|
+
headers.Authorization = `Bearer ${token}`;
|
|
444
|
+
const res = await this.fetchImpl(`${this.baseUrl}${path}`, { headers });
|
|
445
|
+
if (!res.ok)
|
|
446
|
+
throw new Error(`Realtime polling failed with ${res.status}`);
|
|
447
|
+
return (await res.json());
|
|
448
|
+
}
|
|
449
|
+
setStatus(status, detail) {
|
|
450
|
+
this.status = status;
|
|
451
|
+
for (const listener of this.statusListeners)
|
|
452
|
+
listener(status, detail);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { RealtimePostgresChangeConfig, RealtimeTopicEnvelope } from "@motherbase/contracts";
|
|
2
|
+
export type RealtimeStatus = 'idle' | 'connecting' | 'connected' | 'reconnecting' | 'polling' | 'disconnected' | 'error';
|
|
3
|
+
export type RealtimeStatusListener = (status: RealtimeStatus, detail?: unknown) => void;
|
|
4
|
+
export interface RealtimeConnectOptions {
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
fallbackPolling?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface RealtimeWatchOptions {
|
|
9
|
+
intervalMs?: number;
|
|
10
|
+
query?: string;
|
|
11
|
+
polling?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Events received are pre-filtered by server-side REST policies for the current session. */
|
|
14
|
+
export type RealtimeWatchEvent<T> = {
|
|
15
|
+
type: 'created' | 'updated' | 'deleted';
|
|
16
|
+
source: 'socket';
|
|
17
|
+
payload: T;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'snapshot';
|
|
20
|
+
source: 'polling';
|
|
21
|
+
rows: T[];
|
|
22
|
+
};
|
|
23
|
+
/** Minimal shape we rely on from socket.io-client's Socket. */
|
|
24
|
+
export interface SocketLike {
|
|
25
|
+
on(event: string, cb: (...args: unknown[]) => void): void;
|
|
26
|
+
off(event: string, cb?: (...args: unknown[]) => void): void;
|
|
27
|
+
emit(event: string, ...args: unknown[]): void;
|
|
28
|
+
disconnect(): void;
|
|
29
|
+
connected: boolean;
|
|
30
|
+
}
|
|
31
|
+
export type IoFactory = (url: string, opts: Record<string, unknown>) => SocketLike;
|
|
32
|
+
export interface Poller {
|
|
33
|
+
timer: ReturnType<typeof setInterval>;
|
|
34
|
+
stop: () => void;
|
|
35
|
+
}
|
|
36
|
+
/** What RealtimeModule needs from a RealtimeChannel (avoids a circular import). */
|
|
37
|
+
export interface ChannelHandle {
|
|
38
|
+
_receive(envelope: RealtimeTopicEnvelope): void;
|
|
39
|
+
/** Called after a reconnect replayed (or failed to replay) this topic's join. */
|
|
40
|
+
_rejoined?(ok: boolean): void;
|
|
41
|
+
}
|
|
42
|
+
/** Which table changes to receive. `filter` is a PostgREST-style column filter, e.g. `room_id=eq.42`. */
|
|
43
|
+
export type PostgresChangeFilter = RealtimePostgresChangeConfig;
|
|
44
|
+
export type PostgresChangeEvent = PostgresChangeFilter['event'];
|
|
45
|
+
export interface PostgresChangePayload<T = Record<string, unknown>> {
|
|
46
|
+
schema: string;
|
|
47
|
+
table: string;
|
|
48
|
+
eventType: 'INSERT' | 'UPDATE' | 'DELETE';
|
|
49
|
+
new: T | Record<string, never>;
|
|
50
|
+
old: T | Record<string, never>;
|
|
51
|
+
commit_timestamp: string;
|
|
52
|
+
}
|
|
53
|
+
export interface BroadcastFilter {
|
|
54
|
+
event: string;
|
|
55
|
+
}
|
|
56
|
+
export interface PresenceFilter {
|
|
57
|
+
event: 'sync' | 'join' | 'leave';
|
|
58
|
+
}
|
|
59
|
+
export interface BroadcastMessage {
|
|
60
|
+
type: 'broadcast';
|
|
61
|
+
event: string;
|
|
62
|
+
payload?: Record<string, unknown>;
|
|
63
|
+
}
|
|
64
|
+
export interface BroadcastReceived {
|
|
65
|
+
type: 'broadcast';
|
|
66
|
+
event: string;
|
|
67
|
+
payload: unknown;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* One tracked presence: whatever the peer passed to `track()`, plus the ref the
|
|
71
|
+
* server stamps on it. Generic so a caller that knows its own payload gets it
|
|
72
|
+
* typed (`channel.presenceState<{ name: string }>()`); the default stays open
|
|
73
|
+
* because presence payloads are defined by the application, not by the SDK.
|
|
74
|
+
*/
|
|
75
|
+
export type PresenceEntry<T extends Record<string, unknown> = Record<string, unknown>> = T & {
|
|
76
|
+
presence_ref: string;
|
|
77
|
+
};
|
|
78
|
+
export type PresenceState<T extends Record<string, unknown> = Record<string, unknown>> = Record<string, PresenceEntry<T>[]>;
|
|
79
|
+
export interface PresenceJoinPayload<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
80
|
+
key: string;
|
|
81
|
+
newPresences: PresenceEntry<T>[];
|
|
82
|
+
currentPresences: PresenceEntry<T>[];
|
|
83
|
+
}
|
|
84
|
+
export interface PresenceLeavePayload<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
85
|
+
key: string;
|
|
86
|
+
leftPresences: PresenceEntry<T>[];
|
|
87
|
+
currentPresences: PresenceEntry<T>[];
|
|
88
|
+
}
|
|
89
|
+
export type ChannelStatus = 'SUBSCRIBED' | 'TIMED_OUT' | 'CLOSED' | 'CHANNEL_ERROR';
|
|
90
|
+
export interface RealtimeChannelOptions {
|
|
91
|
+
config?: {
|
|
92
|
+
broadcast?: {
|
|
93
|
+
self?: boolean;
|
|
94
|
+
ack?: boolean;
|
|
95
|
+
};
|
|
96
|
+
presence?: {
|
|
97
|
+
key?: string;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Join the private channel of this topic (Realtime Authorization). The
|
|
101
|
+
* server checks the RLS policies on `realtime.messages` at join time:
|
|
102
|
+
* SELECT to receive, INSERT to send or track. Without a readable policy the
|
|
103
|
+
* subscribe ends in CHANNEL_ERROR ("Unauthorized: ...").
|
|
104
|
+
*/
|
|
105
|
+
private?: boolean;
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export interface PgBinding {
|
|
109
|
+
filter: PostgresChangeFilter;
|
|
110
|
+
callback: (payload: PostgresChangePayload) => void;
|
|
111
|
+
}
|
|
112
|
+
export interface BroadcastBinding {
|
|
113
|
+
event: string;
|
|
114
|
+
callback: (payload: BroadcastReceived) => void;
|
|
115
|
+
}
|
|
116
|
+
export interface PresenceBinding {
|
|
117
|
+
event: 'sync' | 'join' | 'leave';
|
|
118
|
+
callback: (payload: unknown) => void;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":""}
|
package/dist/realtime.d.ts
CHANGED
|
@@ -58,6 +58,7 @@ export declare class RealtimeModule {
|
|
|
58
58
|
private readonly joinedTopics;
|
|
59
59
|
private topicRouterBound;
|
|
60
60
|
private connecting;
|
|
61
|
+
private readonly pendingJoins;
|
|
61
62
|
constructor(baseUrl: string, store: SessionStore, fetchImpl?: typeof fetch,
|
|
62
63
|
/** Inject a socket factory (tests / custom transports). Falls back to socket.io-client. */
|
|
63
64
|
ioFactory?: IoFactory | undefined);
|
package/dist/realtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,YAAY,GACZ,WAAW,GACX,cAAc,GACd,SAAS,GACT,cAAc,GACd,OAAO,CAAC;AACZ,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAExF,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,6FAA6F;AAC7F,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAC5B;IAAE,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,CAAC,EAAE,CAAA;CAAE,CAAC;AAEvD,+DAA+D;AAC/D,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC9C,UAAU,IAAI,IAAI,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,UAAU,CAAC;AAOnF,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAChD,iFAAiF;IACjF,SAAS,CAAC,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/B;AAED;;;;GAIG;AACH,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
|