@motherbase/client 1.5.0 → 1.5.2

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.
Files changed (94) hide show
  1. package/README.md +25 -1
  2. package/dist/admin.d.ts +131 -0
  3. package/dist/admin.d.ts.map +1 -0
  4. package/dist/admin.js +121 -0
  5. package/dist/admin.js.map +1 -0
  6. package/dist/auth.d.ts +463 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +884 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/channel.d.ts +129 -0
  11. package/dist/channel.d.ts.map +1 -0
  12. package/dist/channel.js +215 -0
  13. package/dist/channel.js.map +1 -0
  14. package/dist/compat.d.ts +40 -0
  15. package/dist/compat.d.ts.map +1 -0
  16. package/dist/compat.js +100 -0
  17. package/dist/compat.js.map +1 -0
  18. package/dist/cookie.d.ts +68 -0
  19. package/dist/cookie.d.ts.map +1 -0
  20. package/dist/cookie.js +152 -0
  21. package/dist/cookie.js.map +1 -0
  22. package/dist/database.d.ts +188 -0
  23. package/dist/database.d.ts.map +1 -0
  24. package/dist/database.js +2 -0
  25. package/dist/database.js.map +1 -0
  26. package/dist/functions.d.ts +60 -0
  27. package/dist/functions.d.ts.map +1 -0
  28. package/dist/functions.js +75 -0
  29. package/dist/functions.js.map +1 -0
  30. package/dist/http.d.ts +122 -0
  31. package/dist/http.d.ts.map +1 -0
  32. package/dist/http.js +206 -0
  33. package/dist/http.js.map +1 -0
  34. package/dist/index.d.ts +215 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +365 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mfa.d.ts +126 -0
  39. package/dist/mfa.d.ts.map +1 -0
  40. package/dist/mfa.js +167 -0
  41. package/dist/mfa.js.map +1 -0
  42. package/dist/organization.d.ts +234 -0
  43. package/dist/organization.d.ts.map +1 -0
  44. package/dist/organization.js +157 -0
  45. package/dist/organization.js.map +1 -0
  46. package/dist/passkey.d.ts +59 -0
  47. package/dist/passkey.d.ts.map +1 -0
  48. package/dist/passkey.js +87 -0
  49. package/dist/passkey.js.map +1 -0
  50. package/dist/pkce.d.ts +13 -0
  51. package/dist/pkce.d.ts.map +1 -0
  52. package/dist/pkce.js +52 -0
  53. package/dist/pkce.js.map +1 -0
  54. package/dist/plugin-endpoint.d.ts +20 -0
  55. package/dist/plugin-endpoint.d.ts.map +1 -0
  56. package/dist/plugin-endpoint.js +24 -0
  57. package/dist/plugin-endpoint.js.map +1 -0
  58. package/dist/postgrest.d.ts +326 -0
  59. package/dist/postgrest.d.ts.map +1 -0
  60. package/dist/postgrest.js +625 -0
  61. package/dist/postgrest.js.map +1 -0
  62. package/dist/query.d.ts +97 -0
  63. package/dist/query.d.ts.map +1 -0
  64. package/dist/query.js +94 -0
  65. package/dist/query.js.map +1 -0
  66. package/dist/realtime.d.ts +114 -0
  67. package/dist/realtime.d.ts.map +1 -0
  68. package/dist/realtime.js +376 -0
  69. package/dist/realtime.js.map +1 -0
  70. package/dist/session.d.ts +47 -0
  71. package/dist/session.d.ts.map +1 -0
  72. package/dist/session.js +136 -0
  73. package/dist/session.js.map +1 -0
  74. package/dist/sso.d.ts +147 -0
  75. package/dist/sso.d.ts.map +1 -0
  76. package/dist/sso.js +35 -0
  77. package/dist/sso.js.map +1 -0
  78. package/dist/storage.d.ts +268 -0
  79. package/dist/storage.d.ts.map +1 -0
  80. package/dist/storage.js +441 -0
  81. package/dist/storage.js.map +1 -0
  82. package/dist/testing.d.ts +38 -0
  83. package/dist/testing.d.ts.map +1 -0
  84. package/dist/testing.js +50 -0
  85. package/dist/testing.js.map +1 -0
  86. package/dist/types.d.ts +353 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +2 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/warn.d.ts +2 -0
  91. package/dist/warn.d.ts.map +1 -0
  92. package/dist/warn.js +23 -0
  93. package/dist/warn.js.map +1 -0
  94. package/package.json +4 -2
@@ -0,0 +1,376 @@
1
+ import { contractPath, normalizeRealtimeModel, REALTIME_SOCKET_EVENTS, REALTIME_TOPIC_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
+ }
26
+ /** True once a socket is connected. */
27
+ get connected() {
28
+ return Boolean(this.socket?.connected);
29
+ }
30
+ getStatus() {
31
+ return this.status;
32
+ }
33
+ onStatusChange(listener) {
34
+ this.statusListeners.add(listener);
35
+ listener(this.status);
36
+ return () => this.statusListeners.delete(listener);
37
+ }
38
+ async connect(options = {}) {
39
+ if (this.socket?.connected)
40
+ return;
41
+ this.setStatus('connecting');
42
+ let io;
43
+ if (this.ioFactory) {
44
+ io = this.ioFactory;
45
+ }
46
+ else {
47
+ try {
48
+ // socket.io-client is an optional peer dependency; resolved at runtime only.
49
+ // ts-ignore rather than ts-expect-error: whether its types resolve depends
50
+ // on whether a sibling workspace installed it (apps/server does, for its
51
+ // realtime integration test), and an unused expect-error fails the build.
52
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
53
+ // @ts-ignore -- optional peer dependency resolved only when realtime connects
54
+ ({ io } = (await import('socket.io-client')));
55
+ }
56
+ catch {
57
+ if (options.fallbackPolling) {
58
+ this.setStatus('polling');
59
+ return;
60
+ }
61
+ this.setStatus('error', 'socket.io-client is not installed');
62
+ throw new Error('Realtime requires the optional dependency "socket.io-client". Install it: npm i socket.io-client');
63
+ }
64
+ }
65
+ // The session may not be in memory yet (http.ts hydrates before every
66
+ // request; nothing hydrates before a channel subscribe). Without this the
67
+ // socket connects anonymously on a cold page load.
68
+ await this.store.hydrate();
69
+ const socket = io(this.baseUrl, {
70
+ path: '/ws',
71
+ transports: ['websocket'],
72
+ reconnection: true,
73
+ // Read as a callback, not a snapshot: socket.io replays the auth payload
74
+ // on every reconnect, so a fixed object would pin the socket to whatever
75
+ // token existed at connect() time (or to none) for the whole session.
76
+ auth: (cb) => {
77
+ const token = this.store.get()?.accessToken;
78
+ cb(token ? { token } : {});
79
+ },
80
+ });
81
+ this.socket = socket;
82
+ this.bindSocketStatus(socket);
83
+ this.topicRouterBound = false;
84
+ this.bindTopicRouter();
85
+ await this.waitForConnect(socket, options.timeoutMs ?? 5000, Boolean(options.fallbackPolling));
86
+ }
87
+ on(event, cb) {
88
+ this.socket?.on(event, cb);
89
+ }
90
+ off(event, cb) {
91
+ this.socket?.off(event, cb);
92
+ }
93
+ emit(event, ...args) {
94
+ this.socket?.emit(event, ...args);
95
+ }
96
+ /**
97
+ * @deprecated Legacy low-level table watcher. Prefer the Supabase-shaped
98
+ * `client.channel(topic).on('postgres_changes', { event, schema, table, filter }, cb)`.
99
+ * Kept for backwards compatibility; scheduled for removal.
100
+ *
101
+ * Subscribe to create/update/delete events for a model table.
102
+ *
103
+ * Events are filtered server-side: you will only receive events for rows
104
+ * your session is authorized to see (based on REST API SELECT policies).
105
+ * Anonymous sessions receive only public rows; authenticated sessions receive
106
+ * rows matching their access policies (e.g. owner-only rows they own).
107
+ *
108
+ * Falls back to polling the REST endpoint at subscribe time if the WebSocket
109
+ * is not yet connected (polling does not auto-start on later disconnects).
110
+ */
111
+ watchTable(model, cb, options = {}) {
112
+ const normalizedModel = normalizeRealtimeModel(model);
113
+ if (!normalizedModel)
114
+ throw new Error('Invalid realtime model: ' + model);
115
+ const handlers = [];
116
+ const baseEvent = normalizedModel;
117
+ for (const type of ['created', 'updated', 'deleted']) {
118
+ const event = contractPath.realtime(baseEvent, type);
119
+ const handler = (payload) => cb({ type, source: 'socket', payload: payload });
120
+ handlers.push({ event, handler });
121
+ this.socket?.on(event, handler);
122
+ }
123
+ this.retainTableSubscription(normalizedModel);
124
+ const shouldPoll = options.polling !== false && (!this.socket?.connected || this.status === 'polling');
125
+ const pollerId = shouldPoll ? this.startPolling(model, cb, options) : null;
126
+ return () => {
127
+ for (const item of handlers)
128
+ this.socket?.off(item.event, item.handler);
129
+ this.releaseTableSubscription(normalizedModel);
130
+ if (pollerId !== null)
131
+ this.stopPolling(pollerId);
132
+ };
133
+ }
134
+ disconnect() {
135
+ for (const id of Array.from(this.pollers.keys()))
136
+ this.stopPolling(id);
137
+ this.socket?.disconnect();
138
+ this.socket = null;
139
+ this.topicRouterBound = false;
140
+ this.setStatus('disconnected');
141
+ }
142
+ /** Register a channel so incoming rt:msg envelopes for its topic are routed to it. */
143
+ registerChannel(topic, channel) {
144
+ this.channelsByTopic.set(topic, channel);
145
+ this.bindTopicRouter();
146
+ }
147
+ unregisterChannel(topic) {
148
+ this.channelsByTopic.delete(topic);
149
+ // Drop the rejoin memo too, or removeChannel()/removeAllChannels() would
150
+ // resurrect the topic on the next reconnect.
151
+ this.joinedTopics.delete(topic);
152
+ }
153
+ /** Emit rt:join and resolve the server ack (or a timeout/error ack). */
154
+ joinTopic(topic, config, timeoutMs = 10000) {
155
+ if (!this.socket?.connected)
156
+ return Promise.resolve({ status: 'error', error: 'not-connected' });
157
+ const socket = this.socket;
158
+ return new Promise(resolve => {
159
+ let settled = false;
160
+ const timer = setTimeout(() => {
161
+ if (settled)
162
+ return;
163
+ settled = true;
164
+ resolve({ status: 'error', error: 'timeout' });
165
+ }, timeoutMs);
166
+ socket.emit(REALTIME_TOPIC_EVENTS.join, { topic, config }, (ack) => {
167
+ if (settled)
168
+ return;
169
+ settled = true;
170
+ clearTimeout(timer);
171
+ const result = ack ?? { status: 'error', error: 'no-ack' };
172
+ // Server-side topic state (rtTopics, postgres_changes bindings, presence)
173
+ // dies with the socket, so remember what to replay after a reconnect.
174
+ if (result.status === 'ok')
175
+ this.joinedTopics.set(topic, config);
176
+ resolve(result);
177
+ });
178
+ });
179
+ }
180
+ leaveTopic(topic) {
181
+ this.joinedTopics.delete(topic);
182
+ this.socket?.emit(REALTIME_TOPIC_EVENTS.leave, { topic });
183
+ }
184
+ sendTopic(topic, type, event, payload) {
185
+ this.socket?.emit(REALTIME_TOPIC_EVENTS.message, { topic, type, event, payload });
186
+ }
187
+ /** Emit an rt:msg and wait for the server ack (or resolve 'timed out'/'error'). */
188
+ sendTopicWithAck(topic, type, event, payload, timeoutMs = 10000) {
189
+ if (!this.socket?.connected)
190
+ return Promise.resolve('error');
191
+ const socket = this.socket;
192
+ return new Promise(resolve => {
193
+ let settled = false;
194
+ const timer = setTimeout(() => {
195
+ if (settled)
196
+ return;
197
+ settled = true;
198
+ resolve('timed out');
199
+ }, timeoutMs);
200
+ socket.emit(REALTIME_TOPIC_EVENTS.message, { topic, type, event, payload }, (result) => {
201
+ if (settled)
202
+ return;
203
+ settled = true;
204
+ clearTimeout(timer);
205
+ resolve(result === 'ok' ? 'ok' : 'error');
206
+ });
207
+ });
208
+ }
209
+ bindTopicRouter() {
210
+ if (this.topicRouterBound || !this.socket)
211
+ return;
212
+ this.topicRouterBound = true;
213
+ this.socket.on(REALTIME_TOPIC_EVENTS.message, (env) => {
214
+ const envelope = env;
215
+ if (!envelope || typeof envelope.topic !== 'string')
216
+ return;
217
+ this.channelsByTopic.get(envelope.topic)?._receive(envelope);
218
+ });
219
+ }
220
+ retainTableSubscription(model) {
221
+ const refs = this.tableSubscriptionRefs.get(model) ?? 0;
222
+ this.tableSubscriptionRefs.set(model, refs + 1);
223
+ if (refs === 0 && this.socket?.connected)
224
+ this.socket.emit(REALTIME_SOCKET_EVENTS.subscribe, model);
225
+ }
226
+ releaseTableSubscription(model) {
227
+ const refs = this.tableSubscriptionRefs.get(model) ?? 0;
228
+ if (refs > 1) {
229
+ this.tableSubscriptionRefs.set(model, refs - 1);
230
+ return;
231
+ }
232
+ this.tableSubscriptionRefs.delete(model);
233
+ if (refs === 1 && this.socket?.connected)
234
+ this.socket.emit(REALTIME_SOCKET_EVENTS.unsubscribe, model);
235
+ }
236
+ resubscribeTables() {
237
+ if (!this.socket?.connected)
238
+ return;
239
+ for (const model of this.tableSubscriptionRefs.keys()) {
240
+ this.socket.emit(REALTIME_SOCKET_EVENTS.subscribe, model);
241
+ }
242
+ }
243
+ /**
244
+ * Replay every joined topic on a fresh socket. The server keeps topic state on
245
+ * the socket, so without this a reconnected channel still reports SUBSCRIBED
246
+ * and receives nothing at all.
247
+ */
248
+ async rejoinTopics() {
249
+ for (const [topic, config] of Array.from(this.joinedTopics)) {
250
+ const ack = await this.joinTopic(topic, config);
251
+ this.channelsByTopic.get(topic)?._rejoined?.(ack.status === 'ok');
252
+ }
253
+ }
254
+ bindSocketStatus(socket) {
255
+ socket.on('connect', () => {
256
+ this.setStatus('connected');
257
+ this.resubscribeTables();
258
+ void this.rejoinTopics();
259
+ });
260
+ socket.on('disconnect', () => this.setStatus(this.pollers.size ? 'polling' : 'disconnected'));
261
+ socket.on('connect_error', error => this.setStatus('error', error));
262
+ socket.on('reconnect_attempt', () => this.setStatus('reconnecting'));
263
+ socket.on('reconnect', () => this.setStatus('connected'));
264
+ }
265
+ waitForConnect(socket, timeoutMs, fallbackPolling) {
266
+ if (socket.connected) {
267
+ this.setStatus('connected');
268
+ this.resubscribeTables();
269
+ return Promise.resolve();
270
+ }
271
+ return new Promise((resolve, reject) => {
272
+ let settled = false;
273
+ const cleanup = () => {
274
+ socket.off('connect', onConnect);
275
+ socket.off('connect_error', onError);
276
+ clearTimeout(timer);
277
+ };
278
+ const settle = (fn) => {
279
+ if (settled)
280
+ return;
281
+ settled = true;
282
+ cleanup();
283
+ fn();
284
+ };
285
+ const onConnect = () => settle(() => {
286
+ this.setStatus('connected');
287
+ resolve();
288
+ });
289
+ const onError = (error) => {
290
+ if (fallbackPolling) {
291
+ settle(() => {
292
+ this.setStatus('polling', error);
293
+ resolve();
294
+ });
295
+ return;
296
+ }
297
+ settle(() => {
298
+ this.setStatus('error', error);
299
+ reject(error instanceof Error ? error : new Error(String(error)));
300
+ });
301
+ };
302
+ const timer = setTimeout(() => {
303
+ if (fallbackPolling) {
304
+ settle(() => {
305
+ this.setStatus('polling');
306
+ resolve();
307
+ });
308
+ return;
309
+ }
310
+ settle(() => {
311
+ const error = new Error('Realtime connection timeout');
312
+ this.setStatus('error', error);
313
+ reject(error);
314
+ });
315
+ }, timeoutMs);
316
+ socket.on('connect', onConnect);
317
+ socket.on('connect_error', onError);
318
+ });
319
+ }
320
+ startPolling(model, cb, options) {
321
+ if (!this.fetchImpl)
322
+ throw new Error('Realtime polling requires a fetch implementation.');
323
+ const id = ++this.pollerSeq;
324
+ let last = '';
325
+ let stopped = false;
326
+ const run = async () => {
327
+ if (stopped)
328
+ return;
329
+ const rows = await this.fetchRows(model, options.query);
330
+ const snapshot = JSON.stringify(rows);
331
+ if (snapshot !== last) {
332
+ last = snapshot;
333
+ cb({ type: 'snapshot', source: 'polling', rows });
334
+ }
335
+ };
336
+ const timer = setInterval(() => {
337
+ run().catch(error => this.setStatus('error', error));
338
+ }, options.intervalMs ?? 5000);
339
+ this.pollers.set(id, {
340
+ timer,
341
+ stop: () => {
342
+ stopped = true;
343
+ clearInterval(timer);
344
+ },
345
+ });
346
+ this.setStatus(this.socket?.connected ? 'connected' : 'polling');
347
+ run().catch(error => this.setStatus('error', error));
348
+ return id;
349
+ }
350
+ stopPolling(id) {
351
+ const poller = this.pollers.get(id);
352
+ if (!poller)
353
+ return;
354
+ poller.stop();
355
+ this.pollers.delete(id);
356
+ if (!this.socket?.connected && this.pollers.size === 0)
357
+ this.setStatus('disconnected');
358
+ }
359
+ async fetchRows(model, query) {
360
+ const path = `${contractPath.rest(model)}${query ? (query.startsWith('?') ? query : `?${query}`) : ''}`;
361
+ const headers = {};
362
+ const token = this.store.get()?.accessToken;
363
+ if (token)
364
+ headers.Authorization = `Bearer ${token}`;
365
+ const res = await this.fetchImpl(`${this.baseUrl}${path}`, { headers });
366
+ if (!res.ok)
367
+ throw new Error(`Realtime polling failed with ${res.status}`);
368
+ return (await res.json());
369
+ }
370
+ setStatus(status, detail) {
371
+ this.status = status;
372
+ for (const listener of this.statusListeners)
373
+ listener(status, detail);
374
+ }
375
+ }
376
+ //# sourceMappingURL=realtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { AuthEvent, AuthListener, KeyValueStorageAdapter, Session, SessionStorageAdapter } from './types.js';
2
+ /**
3
+ * The key every built-in storage adapter defaults to, for both the cookie and
4
+ * localStorage. Defined once: it is a contract between the browser half of an
5
+ * app and the server half, and a second copy of the literal is how the two
6
+ * drift apart. Re-exported from `cookie.ts` and from the package root.
7
+ */
8
+ export declare const SESSION_COOKIE_KEY = "motherbase.session";
9
+ /** In-memory adapter. Safe everywhere (SSR, tests); does not survive reloads. */
10
+ export declare function memoryStorage(): SessionStorageAdapter;
11
+ /**
12
+ * Browser localStorage adapter. Falls back to memory when localStorage is
13
+ * unavailable (SSR, private mode), so it never throws on import or use.
14
+ */
15
+ export declare function localStorageStorage(key?: string): SessionStorageAdapter;
16
+ /**
17
+ * Wrap a supabase-js style key/value store (localStorage, React Native's
18
+ * AsyncStorage, a cookie shim) as a session adapter.
19
+ *
20
+ * This is what lets `createClient(url, key, { auth: { storage: AsyncStorage } })`
21
+ * work verbatim on a ported app. A value that will not parse is treated as no
22
+ * session rather than thrown: a corrupt entry must not brick every launch.
23
+ */
24
+ export declare function keyValueStorage(store: KeyValueStorageAdapter, key?: string): SessionStorageAdapter;
25
+ /** Tell the two adapter shapes apart: supabase-js's is a key/value store. */
26
+ export declare function isKeyValueStorage(value: KeyValueStorageAdapter | SessionStorageAdapter): value is KeyValueStorageAdapter;
27
+ /**
28
+ * Holds the live session in memory, mirrors it to a storage adapter, and
29
+ * notifies listeners of auth changes. The in-memory copy is the source of truth
30
+ * for synchronous reads (e.g. attaching the bearer header).
31
+ */
32
+ export declare class SessionStore {
33
+ private readonly storage;
34
+ private current;
35
+ private readonly listeners;
36
+ private hydrated;
37
+ constructor(storage: SessionStorageAdapter);
38
+ /** Load the persisted session once. Idempotent. */
39
+ hydrate(): Promise<Session | null>;
40
+ get(): Session | null;
41
+ set(session: Session | null, event: AuthEvent): Promise<void>;
42
+ /** Replace only the tokens, keeping the existing user (used after refresh). */
43
+ setTokens(accessToken: string, refreshToken: string): Promise<void>;
44
+ subscribe(listener: AuthListener): () => void;
45
+ private emit;
46
+ }
47
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,OAAO,EACP,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAEvD,iFAAiF;AACjF,wBAAgB,aAAa,IAAI,qBAAqB,CAQrD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,SAAqB,GAAG,qBAAqB,CAkBnF;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,sBAAsB,EAAE,GAAG,SAAqB,GAAG,qBAAqB,CAgB9G;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,sBAAsB,GAAG,qBAAqB,GACpD,KAAK,IAAI,sBAAsB,CAEjC;AAED;;;;GAIG;AACH,qBAAa,YAAY;IAKX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,QAAQ,CAAS;gBAEI,OAAO,EAAE,qBAAqB;IAE3D,mDAAmD;IAC7C,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAoBxC,GAAG,IAAI,OAAO,GAAG,IAAI;IAIf,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnE,+EAA+E;IACzE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzE,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,IAAI;IAK7C,OAAO,CAAC,IAAI;CAGb"}
@@ -0,0 +1,136 @@
1
+ import { normalizeSession } from './compat.js';
2
+ /**
3
+ * The key every built-in storage adapter defaults to, for both the cookie and
4
+ * localStorage. Defined once: it is a contract between the browser half of an
5
+ * app and the server half, and a second copy of the literal is how the two
6
+ * drift apart. Re-exported from `cookie.ts` and from the package root.
7
+ */
8
+ export const SESSION_COOKIE_KEY = 'motherbase.session';
9
+ /** In-memory adapter. Safe everywhere (SSR, tests); does not survive reloads. */
10
+ export function memoryStorage() {
11
+ let current = null;
12
+ return {
13
+ get: () => current,
14
+ set: (s) => {
15
+ current = s;
16
+ },
17
+ };
18
+ }
19
+ /**
20
+ * Browser localStorage adapter. Falls back to memory when localStorage is
21
+ * unavailable (SSR, private mode), so it never throws on import or use.
22
+ */
23
+ export function localStorageStorage(key = SESSION_COOKIE_KEY) {
24
+ const ls = typeof globalThis !== 'undefined' ? globalThis.localStorage : undefined;
25
+ if (!ls)
26
+ return memoryStorage();
27
+ return {
28
+ get: () => {
29
+ const raw = ls.getItem(key);
30
+ if (!raw)
31
+ return null;
32
+ try {
33
+ return JSON.parse(raw);
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ },
39
+ set: (s) => {
40
+ if (s)
41
+ ls.setItem(key, JSON.stringify(s));
42
+ else
43
+ ls.removeItem(key);
44
+ },
45
+ };
46
+ }
47
+ /**
48
+ * Wrap a supabase-js style key/value store (localStorage, React Native's
49
+ * AsyncStorage, a cookie shim) as a session adapter.
50
+ *
51
+ * This is what lets `createClient(url, key, { auth: { storage: AsyncStorage } })`
52
+ * work verbatim on a ported app. A value that will not parse is treated as no
53
+ * session rather than thrown: a corrupt entry must not brick every launch.
54
+ */
55
+ export function keyValueStorage(store, key = SESSION_COOKIE_KEY) {
56
+ return {
57
+ get: async () => {
58
+ const raw = await store.getItem(key);
59
+ if (!raw)
60
+ return null;
61
+ try {
62
+ return JSON.parse(raw);
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ },
68
+ set: async (s) => {
69
+ if (s)
70
+ await store.setItem(key, JSON.stringify(s));
71
+ else
72
+ await store.removeItem(key);
73
+ },
74
+ };
75
+ }
76
+ /** Tell the two adapter shapes apart: supabase-js's is a key/value store. */
77
+ export function isKeyValueStorage(value) {
78
+ return typeof value.getItem === 'function';
79
+ }
80
+ /**
81
+ * Holds the live session in memory, mirrors it to a storage adapter, and
82
+ * notifies listeners of auth changes. The in-memory copy is the source of truth
83
+ * for synchronous reads (e.g. attaching the bearer header).
84
+ */
85
+ export class SessionStore {
86
+ constructor(storage) {
87
+ this.storage = storage;
88
+ this.current = null;
89
+ this.listeners = new Set();
90
+ this.hydrated = false;
91
+ }
92
+ /** Load the persisted session once. Idempotent. */
93
+ async hydrate() {
94
+ if (this.hydrated)
95
+ return this.current;
96
+ // A session read back from storage was written by an older version (or by
97
+ // the server half of an SSR app), so it is normalised on the way in too:
98
+ // the aliases must not depend on which code path produced the session.
99
+ const loaded = await this.storage.get();
100
+ // Re-check AFTER the await. `hydrate()` is started but not awaited by
101
+ // `onAuthStateChange`, so a `set()` can land while this one is still
102
+ // reading storage, and `loaded` is then a snapshot from before that write.
103
+ // Assigning it anyway is a lost update, and it presents as the opposite of
104
+ // a storage bug: `setSession()` resolves with "Invalid session" because the
105
+ // token it just stored was wiped out from under the request that used it.
106
+ if (this.hydrated)
107
+ return this.current;
108
+ this.current = normalizeSession(loaded);
109
+ this.hydrated = true;
110
+ return this.current;
111
+ }
112
+ get() {
113
+ return this.current;
114
+ }
115
+ async set(session, event) {
116
+ this.current = normalizeSession(session);
117
+ this.hydrated = true;
118
+ await this.storage.set(this.current);
119
+ this.emit(event);
120
+ }
121
+ /** Replace only the tokens, keeping the existing user (used after refresh). */
122
+ async setTokens(accessToken, refreshToken) {
123
+ if (!this.current)
124
+ return;
125
+ await this.set({ ...this.current, accessToken, refreshToken }, 'tokenRefreshed');
126
+ }
127
+ subscribe(listener) {
128
+ this.listeners.add(listener);
129
+ return () => this.listeners.delete(listener);
130
+ }
131
+ emit(event) {
132
+ for (const l of this.listeners)
133
+ l(event, this.current);
134
+ }
135
+ }
136
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}