@motherbase/client 1.3.1 → 1.5.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 +127 -13
- package/package.json +10 -2
- package/dist/admin.d.ts +0 -81
- package/dist/admin.d.ts.map +0 -1
- package/dist/admin.js +0 -85
- package/dist/admin.js.map +0 -1
- package/dist/auth.d.ts +0 -233
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -418
- package/dist/auth.js.map +0 -1
- package/dist/channel.d.ts +0 -119
- package/dist/channel.d.ts.map +0 -1
- package/dist/channel.js +0 -213
- package/dist/channel.js.map +0 -1
- package/dist/cookie.d.ts +0 -60
- package/dist/cookie.d.ts.map +0 -1
- package/dist/cookie.js +0 -144
- package/dist/cookie.js.map +0 -1
- package/dist/database.d.ts +0 -169
- package/dist/database.d.ts.map +0 -1
- package/dist/database.js +0 -2
- package/dist/database.js.map +0 -1
- 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/edge.d.ts +0 -7
- package/dist/edge.d.ts.map +0 -1
- package/dist/edge.js +0 -13
- package/dist/edge.js.map +0 -1
- package/dist/functions.d.ts +0 -24
- package/dist/functions.d.ts.map +0 -1
- package/dist/functions.js +0 -24
- package/dist/functions.js.map +0 -1
- package/dist/http.d.ts +0 -96
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -157
- package/dist/http.js.map +0 -1
- package/dist/index.d.ts +0 -118
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -180
- package/dist/index.js.map +0 -1
- package/dist/mfa.d.ts +0 -109
- package/dist/mfa.d.ts.map +0 -1
- package/dist/mfa.js +0 -134
- package/dist/mfa.js.map +0 -1
- package/dist/postgrest.d.ts +0 -239
- package/dist/postgrest.d.ts.map +0 -1
- package/dist/postgrest.js +0 -467
- package/dist/postgrest.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
- package/dist/realtime.d.ts +0 -114
- package/dist/realtime.d.ts.map +0 -1
- package/dist/realtime.js +0 -372
- package/dist/realtime.js.map +0 -1
- package/dist/rest.d.ts +0 -50
- package/dist/rest.d.ts.map +0 -1
- package/dist/rest.js +0 -75
- package/dist/rest.js.map +0 -1
- package/dist/session.d.ts +0 -36
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js +0 -90
- package/dist/session.js.map +0 -1
- package/dist/storage.d.ts +0 -72
- package/dist/storage.d.ts.map +0 -1
- package/dist/storage.js +0 -148
- package/dist/storage.js.map +0 -1
- package/dist/types.d.ts +0 -106
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
package/dist/realtime.js
DELETED
|
@@ -1,372 +0,0 @@
|
|
|
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-expect-error -- optional peer dependency resolved only when realtime connects
|
|
50
|
-
({ io } = (await import('socket.io-client')));
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
if (options.fallbackPolling) {
|
|
54
|
-
this.setStatus('polling');
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
this.setStatus('error', 'socket.io-client is not installed');
|
|
58
|
-
throw new Error('Realtime requires the optional dependency "socket.io-client". Install it: npm i socket.io-client');
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
// The session may not be in memory yet (http.ts hydrates before every
|
|
62
|
-
// request; nothing hydrates before a channel subscribe). Without this the
|
|
63
|
-
// socket connects anonymously on a cold page load.
|
|
64
|
-
await this.store.hydrate();
|
|
65
|
-
const socket = io(this.baseUrl, {
|
|
66
|
-
path: '/ws',
|
|
67
|
-
transports: ['websocket'],
|
|
68
|
-
reconnection: true,
|
|
69
|
-
// Read as a callback, not a snapshot: socket.io replays the auth payload
|
|
70
|
-
// on every reconnect, so a fixed object would pin the socket to whatever
|
|
71
|
-
// token existed at connect() time (or to none) for the whole session.
|
|
72
|
-
auth: (cb) => {
|
|
73
|
-
const token = this.store.get()?.accessToken;
|
|
74
|
-
cb(token ? { token } : {});
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
this.socket = socket;
|
|
78
|
-
this.bindSocketStatus(socket);
|
|
79
|
-
this.topicRouterBound = false;
|
|
80
|
-
this.bindTopicRouter();
|
|
81
|
-
await this.waitForConnect(socket, options.timeoutMs ?? 5000, Boolean(options.fallbackPolling));
|
|
82
|
-
}
|
|
83
|
-
on(event, cb) {
|
|
84
|
-
this.socket?.on(event, cb);
|
|
85
|
-
}
|
|
86
|
-
off(event, cb) {
|
|
87
|
-
this.socket?.off(event, cb);
|
|
88
|
-
}
|
|
89
|
-
emit(event, ...args) {
|
|
90
|
-
this.socket?.emit(event, ...args);
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* @deprecated Legacy low-level table watcher. Prefer the Supabase-shaped
|
|
94
|
-
* `client.channel(topic).on('postgres_changes', { event, schema, table, filter }, cb)`.
|
|
95
|
-
* Kept for backwards compatibility; scheduled for removal.
|
|
96
|
-
*
|
|
97
|
-
* Subscribe to create/update/delete events for a model table.
|
|
98
|
-
*
|
|
99
|
-
* Events are filtered server-side: you will only receive events for rows
|
|
100
|
-
* your session is authorized to see (based on REST API SELECT policies).
|
|
101
|
-
* Anonymous sessions receive only public rows; authenticated sessions receive
|
|
102
|
-
* rows matching their access policies (e.g. owner-only rows they own).
|
|
103
|
-
*
|
|
104
|
-
* Falls back to polling the REST endpoint at subscribe time if the WebSocket
|
|
105
|
-
* is not yet connected (polling does not auto-start on later disconnects).
|
|
106
|
-
*/
|
|
107
|
-
watchTable(model, cb, options = {}) {
|
|
108
|
-
const normalizedModel = normalizeRealtimeModel(model);
|
|
109
|
-
if (!normalizedModel)
|
|
110
|
-
throw new Error('Invalid realtime model: ' + model);
|
|
111
|
-
const handlers = [];
|
|
112
|
-
const baseEvent = normalizedModel;
|
|
113
|
-
for (const type of ['created', 'updated', 'deleted']) {
|
|
114
|
-
const event = contractPath.realtime(baseEvent, type);
|
|
115
|
-
const handler = (payload) => cb({ type, source: 'socket', payload: payload });
|
|
116
|
-
handlers.push({ event, handler });
|
|
117
|
-
this.socket?.on(event, handler);
|
|
118
|
-
}
|
|
119
|
-
this.retainTableSubscription(normalizedModel);
|
|
120
|
-
const shouldPoll = options.polling !== false && (!this.socket?.connected || this.status === 'polling');
|
|
121
|
-
const pollerId = shouldPoll ? this.startPolling(model, cb, options) : null;
|
|
122
|
-
return () => {
|
|
123
|
-
for (const item of handlers)
|
|
124
|
-
this.socket?.off(item.event, item.handler);
|
|
125
|
-
this.releaseTableSubscription(normalizedModel);
|
|
126
|
-
if (pollerId !== null)
|
|
127
|
-
this.stopPolling(pollerId);
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
disconnect() {
|
|
131
|
-
for (const id of Array.from(this.pollers.keys()))
|
|
132
|
-
this.stopPolling(id);
|
|
133
|
-
this.socket?.disconnect();
|
|
134
|
-
this.socket = null;
|
|
135
|
-
this.topicRouterBound = false;
|
|
136
|
-
this.setStatus('disconnected');
|
|
137
|
-
}
|
|
138
|
-
/** Register a channel so incoming rt:msg envelopes for its topic are routed to it. */
|
|
139
|
-
registerChannel(topic, channel) {
|
|
140
|
-
this.channelsByTopic.set(topic, channel);
|
|
141
|
-
this.bindTopicRouter();
|
|
142
|
-
}
|
|
143
|
-
unregisterChannel(topic) {
|
|
144
|
-
this.channelsByTopic.delete(topic);
|
|
145
|
-
// Drop the rejoin memo too, or removeChannel()/removeAllChannels() would
|
|
146
|
-
// resurrect the topic on the next reconnect.
|
|
147
|
-
this.joinedTopics.delete(topic);
|
|
148
|
-
}
|
|
149
|
-
/** Emit rt:join and resolve the server ack (or a timeout/error ack). */
|
|
150
|
-
joinTopic(topic, config, timeoutMs = 10000) {
|
|
151
|
-
if (!this.socket?.connected)
|
|
152
|
-
return Promise.resolve({ status: 'error', error: 'not-connected' });
|
|
153
|
-
const socket = this.socket;
|
|
154
|
-
return new Promise(resolve => {
|
|
155
|
-
let settled = false;
|
|
156
|
-
const timer = setTimeout(() => {
|
|
157
|
-
if (settled)
|
|
158
|
-
return;
|
|
159
|
-
settled = true;
|
|
160
|
-
resolve({ status: 'error', error: 'timeout' });
|
|
161
|
-
}, timeoutMs);
|
|
162
|
-
socket.emit(REALTIME_TOPIC_EVENTS.join, { topic, config }, (ack) => {
|
|
163
|
-
if (settled)
|
|
164
|
-
return;
|
|
165
|
-
settled = true;
|
|
166
|
-
clearTimeout(timer);
|
|
167
|
-
const result = ack ?? { status: 'error', error: 'no-ack' };
|
|
168
|
-
// Server-side topic state (rtTopics, postgres_changes bindings, presence)
|
|
169
|
-
// dies with the socket, so remember what to replay after a reconnect.
|
|
170
|
-
if (result.status === 'ok')
|
|
171
|
-
this.joinedTopics.set(topic, config);
|
|
172
|
-
resolve(result);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
leaveTopic(topic) {
|
|
177
|
-
this.joinedTopics.delete(topic);
|
|
178
|
-
this.socket?.emit(REALTIME_TOPIC_EVENTS.leave, { topic });
|
|
179
|
-
}
|
|
180
|
-
sendTopic(topic, type, event, payload) {
|
|
181
|
-
this.socket?.emit(REALTIME_TOPIC_EVENTS.message, { topic, type, event, payload });
|
|
182
|
-
}
|
|
183
|
-
/** Emit an rt:msg and wait for the server ack (or resolve 'timed out'/'error'). */
|
|
184
|
-
sendTopicWithAck(topic, type, event, payload, timeoutMs = 10000) {
|
|
185
|
-
if (!this.socket?.connected)
|
|
186
|
-
return Promise.resolve('error');
|
|
187
|
-
const socket = this.socket;
|
|
188
|
-
return new Promise(resolve => {
|
|
189
|
-
let settled = false;
|
|
190
|
-
const timer = setTimeout(() => {
|
|
191
|
-
if (settled)
|
|
192
|
-
return;
|
|
193
|
-
settled = true;
|
|
194
|
-
resolve('timed out');
|
|
195
|
-
}, timeoutMs);
|
|
196
|
-
socket.emit(REALTIME_TOPIC_EVENTS.message, { topic, type, event, payload }, (result) => {
|
|
197
|
-
if (settled)
|
|
198
|
-
return;
|
|
199
|
-
settled = true;
|
|
200
|
-
clearTimeout(timer);
|
|
201
|
-
resolve(result === 'ok' ? 'ok' : 'error');
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
bindTopicRouter() {
|
|
206
|
-
if (this.topicRouterBound || !this.socket)
|
|
207
|
-
return;
|
|
208
|
-
this.topicRouterBound = true;
|
|
209
|
-
this.socket.on(REALTIME_TOPIC_EVENTS.message, (env) => {
|
|
210
|
-
const envelope = env;
|
|
211
|
-
if (!envelope || typeof envelope.topic !== 'string')
|
|
212
|
-
return;
|
|
213
|
-
this.channelsByTopic.get(envelope.topic)?._receive(envelope);
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
retainTableSubscription(model) {
|
|
217
|
-
const refs = this.tableSubscriptionRefs.get(model) ?? 0;
|
|
218
|
-
this.tableSubscriptionRefs.set(model, refs + 1);
|
|
219
|
-
if (refs === 0 && this.socket?.connected)
|
|
220
|
-
this.socket.emit(REALTIME_SOCKET_EVENTS.subscribe, model);
|
|
221
|
-
}
|
|
222
|
-
releaseTableSubscription(model) {
|
|
223
|
-
const refs = this.tableSubscriptionRefs.get(model) ?? 0;
|
|
224
|
-
if (refs > 1) {
|
|
225
|
-
this.tableSubscriptionRefs.set(model, refs - 1);
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
this.tableSubscriptionRefs.delete(model);
|
|
229
|
-
if (refs === 1 && this.socket?.connected)
|
|
230
|
-
this.socket.emit(REALTIME_SOCKET_EVENTS.unsubscribe, model);
|
|
231
|
-
}
|
|
232
|
-
resubscribeTables() {
|
|
233
|
-
if (!this.socket?.connected)
|
|
234
|
-
return;
|
|
235
|
-
for (const model of this.tableSubscriptionRefs.keys()) {
|
|
236
|
-
this.socket.emit(REALTIME_SOCKET_EVENTS.subscribe, model);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Replay every joined topic on a fresh socket. The server keeps topic state on
|
|
241
|
-
* the socket, so without this a reconnected channel still reports SUBSCRIBED
|
|
242
|
-
* and receives nothing at all.
|
|
243
|
-
*/
|
|
244
|
-
async rejoinTopics() {
|
|
245
|
-
for (const [topic, config] of Array.from(this.joinedTopics)) {
|
|
246
|
-
const ack = await this.joinTopic(topic, config);
|
|
247
|
-
this.channelsByTopic.get(topic)?._rejoined?.(ack.status === 'ok');
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
bindSocketStatus(socket) {
|
|
251
|
-
socket.on('connect', () => {
|
|
252
|
-
this.setStatus('connected');
|
|
253
|
-
this.resubscribeTables();
|
|
254
|
-
void this.rejoinTopics();
|
|
255
|
-
});
|
|
256
|
-
socket.on('disconnect', () => this.setStatus(this.pollers.size ? 'polling' : 'disconnected'));
|
|
257
|
-
socket.on('connect_error', error => this.setStatus('error', error));
|
|
258
|
-
socket.on('reconnect_attempt', () => this.setStatus('reconnecting'));
|
|
259
|
-
socket.on('reconnect', () => this.setStatus('connected'));
|
|
260
|
-
}
|
|
261
|
-
waitForConnect(socket, timeoutMs, fallbackPolling) {
|
|
262
|
-
if (socket.connected) {
|
|
263
|
-
this.setStatus('connected');
|
|
264
|
-
this.resubscribeTables();
|
|
265
|
-
return Promise.resolve();
|
|
266
|
-
}
|
|
267
|
-
return new Promise((resolve, reject) => {
|
|
268
|
-
let settled = false;
|
|
269
|
-
const cleanup = () => {
|
|
270
|
-
socket.off('connect', onConnect);
|
|
271
|
-
socket.off('connect_error', onError);
|
|
272
|
-
clearTimeout(timer);
|
|
273
|
-
};
|
|
274
|
-
const settle = (fn) => {
|
|
275
|
-
if (settled)
|
|
276
|
-
return;
|
|
277
|
-
settled = true;
|
|
278
|
-
cleanup();
|
|
279
|
-
fn();
|
|
280
|
-
};
|
|
281
|
-
const onConnect = () => settle(() => {
|
|
282
|
-
this.setStatus('connected');
|
|
283
|
-
resolve();
|
|
284
|
-
});
|
|
285
|
-
const onError = (error) => {
|
|
286
|
-
if (fallbackPolling) {
|
|
287
|
-
settle(() => {
|
|
288
|
-
this.setStatus('polling', error);
|
|
289
|
-
resolve();
|
|
290
|
-
});
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
settle(() => {
|
|
294
|
-
this.setStatus('error', error);
|
|
295
|
-
reject(error instanceof Error ? error : new Error(String(error)));
|
|
296
|
-
});
|
|
297
|
-
};
|
|
298
|
-
const timer = setTimeout(() => {
|
|
299
|
-
if (fallbackPolling) {
|
|
300
|
-
settle(() => {
|
|
301
|
-
this.setStatus('polling');
|
|
302
|
-
resolve();
|
|
303
|
-
});
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
settle(() => {
|
|
307
|
-
const error = new Error('Realtime connection timeout');
|
|
308
|
-
this.setStatus('error', error);
|
|
309
|
-
reject(error);
|
|
310
|
-
});
|
|
311
|
-
}, timeoutMs);
|
|
312
|
-
socket.on('connect', onConnect);
|
|
313
|
-
socket.on('connect_error', onError);
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
startPolling(model, cb, options) {
|
|
317
|
-
if (!this.fetchImpl)
|
|
318
|
-
throw new Error('Realtime polling requires a fetch implementation.');
|
|
319
|
-
const id = ++this.pollerSeq;
|
|
320
|
-
let last = '';
|
|
321
|
-
let stopped = false;
|
|
322
|
-
const run = async () => {
|
|
323
|
-
if (stopped)
|
|
324
|
-
return;
|
|
325
|
-
const rows = await this.fetchRows(model, options.query);
|
|
326
|
-
const snapshot = JSON.stringify(rows);
|
|
327
|
-
if (snapshot !== last) {
|
|
328
|
-
last = snapshot;
|
|
329
|
-
cb({ type: 'snapshot', source: 'polling', rows });
|
|
330
|
-
}
|
|
331
|
-
};
|
|
332
|
-
const timer = setInterval(() => {
|
|
333
|
-
run().catch(error => this.setStatus('error', error));
|
|
334
|
-
}, options.intervalMs ?? 5000);
|
|
335
|
-
this.pollers.set(id, {
|
|
336
|
-
timer,
|
|
337
|
-
stop: () => {
|
|
338
|
-
stopped = true;
|
|
339
|
-
clearInterval(timer);
|
|
340
|
-
},
|
|
341
|
-
});
|
|
342
|
-
this.setStatus(this.socket?.connected ? 'connected' : 'polling');
|
|
343
|
-
run().catch(error => this.setStatus('error', error));
|
|
344
|
-
return id;
|
|
345
|
-
}
|
|
346
|
-
stopPolling(id) {
|
|
347
|
-
const poller = this.pollers.get(id);
|
|
348
|
-
if (!poller)
|
|
349
|
-
return;
|
|
350
|
-
poller.stop();
|
|
351
|
-
this.pollers.delete(id);
|
|
352
|
-
if (!this.socket?.connected && this.pollers.size === 0)
|
|
353
|
-
this.setStatus('disconnected');
|
|
354
|
-
}
|
|
355
|
-
async fetchRows(model, query) {
|
|
356
|
-
const path = `${contractPath.rest(model)}${query ? (query.startsWith('?') ? query : `?${query}`) : ''}`;
|
|
357
|
-
const headers = {};
|
|
358
|
-
const token = this.store.get()?.accessToken;
|
|
359
|
-
if (token)
|
|
360
|
-
headers.Authorization = `Bearer ${token}`;
|
|
361
|
-
const res = await this.fetchImpl(`${this.baseUrl}${path}`, { headers });
|
|
362
|
-
if (!res.ok)
|
|
363
|
-
throw new Error(`Realtime polling failed with ${res.status}`);
|
|
364
|
-
return (await res.json());
|
|
365
|
-
}
|
|
366
|
-
setStatus(status, detail) {
|
|
367
|
-
this.status = status;
|
|
368
|
-
for (const listener of this.statusListeners)
|
|
369
|
-
listener(status, detail);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
//# sourceMappingURL=realtime.js.map
|
package/dist/realtime.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"realtime.js","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
|
package/dist/rest.d.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import type { HttpClient } from './http.js';
|
|
2
|
-
type Primitive = string | number | boolean | null;
|
|
3
|
-
export type RestOperator = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'like' | 'ilike' | 'in' | 'is';
|
|
4
|
-
export type OrderDirection = 'asc' | 'desc';
|
|
5
|
-
export type RestFilterValue = Primitive | {
|
|
6
|
-
op: RestOperator;
|
|
7
|
-
value: Primitive | Primitive[];
|
|
8
|
-
};
|
|
9
|
-
export type RestFilters = Record<string, RestFilterValue>;
|
|
10
|
-
export interface RestListOptions {
|
|
11
|
-
select?: string[];
|
|
12
|
-
filters?: RestFilters;
|
|
13
|
-
order?: Array<{
|
|
14
|
-
field: string;
|
|
15
|
-
direction?: OrderDirection;
|
|
16
|
-
}>;
|
|
17
|
-
limit?: number;
|
|
18
|
-
offset?: number;
|
|
19
|
-
}
|
|
20
|
-
export interface RestMutationOptions {
|
|
21
|
-
filters?: RestFilters;
|
|
22
|
-
}
|
|
23
|
-
export declare class RestTable<Row extends object = Record<string, unknown>> {
|
|
24
|
-
private readonly http;
|
|
25
|
-
private readonly model;
|
|
26
|
-
constructor(http: HttpClient, model: string);
|
|
27
|
-
list(options?: RestListOptions): Promise<Row[]>;
|
|
28
|
-
insert(data: Partial<Row>): Promise<Row[]>;
|
|
29
|
-
update(data: Partial<Row>, options?: RestMutationOptions): Promise<Row[] | {
|
|
30
|
-
count: number;
|
|
31
|
-
}>;
|
|
32
|
-
remove(options?: RestMutationOptions): Promise<Row[] | {
|
|
33
|
-
count: number;
|
|
34
|
-
}>;
|
|
35
|
-
}
|
|
36
|
-
export declare class RestModule {
|
|
37
|
-
private readonly http;
|
|
38
|
-
constructor(http: HttpClient);
|
|
39
|
-
from<Row extends object = Record<string, unknown>>(model: string): RestTable<Row>;
|
|
40
|
-
list<Row extends object = Record<string, unknown>>(model: string, options?: RestListOptions): Promise<Row[]>;
|
|
41
|
-
insert<Row extends object = Record<string, unknown>>(model: string, data: Partial<Row>): Promise<Row[]>;
|
|
42
|
-
update<Row extends object = Record<string, unknown>>(model: string, data: Partial<Row>, options?: RestMutationOptions): Promise<Row[] | {
|
|
43
|
-
count: number;
|
|
44
|
-
}>;
|
|
45
|
-
remove<Row extends object = Record<string, unknown>>(model: string, options?: RestMutationOptions): Promise<Row[] | {
|
|
46
|
-
count: number;
|
|
47
|
-
}>;
|
|
48
|
-
}
|
|
49
|
-
export {};
|
|
50
|
-
//# sourceMappingURL=rest.d.ts.map
|
package/dist/rest.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../src/rest.ts"],"names":[],"mappings":"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"}
|
package/dist/rest.js
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
function encodeValue(value) {
|
|
2
|
-
if (Array.isArray(value))
|
|
3
|
-
return `(${value.map(encodeValue).join(',')})`;
|
|
4
|
-
if (value === null)
|
|
5
|
-
return 'null';
|
|
6
|
-
return String(value);
|
|
7
|
-
}
|
|
8
|
-
function encodeFilter(value) {
|
|
9
|
-
if (value && typeof value === 'object' && 'op' in value) {
|
|
10
|
-
return `${value.op}.${encodeValue(value.value)}`;
|
|
11
|
-
}
|
|
12
|
-
return encodeValue(value);
|
|
13
|
-
}
|
|
14
|
-
function toQuery(options = {}) {
|
|
15
|
-
const params = new URLSearchParams();
|
|
16
|
-
const listOptions = options;
|
|
17
|
-
if (listOptions.select?.length)
|
|
18
|
-
params.set('select', listOptions.select.join(','));
|
|
19
|
-
if (listOptions.order?.length) {
|
|
20
|
-
params.set('order', listOptions.order.map(({ field, direction = 'asc' }) => `${field}.${direction}`).join(','));
|
|
21
|
-
}
|
|
22
|
-
if (typeof listOptions.limit === 'number')
|
|
23
|
-
params.set('limit', String(listOptions.limit));
|
|
24
|
-
if (typeof listOptions.offset === 'number')
|
|
25
|
-
params.set('offset', String(listOptions.offset));
|
|
26
|
-
for (const [field, value] of Object.entries(options.filters ?? {})) {
|
|
27
|
-
params.set(field, encodeFilter(value));
|
|
28
|
-
}
|
|
29
|
-
const query = params.toString();
|
|
30
|
-
return query ? `?${query}` : '';
|
|
31
|
-
}
|
|
32
|
-
export class RestTable {
|
|
33
|
-
constructor(http, model) {
|
|
34
|
-
this.http = http;
|
|
35
|
-
this.model = model;
|
|
36
|
-
}
|
|
37
|
-
list(options = {}) {
|
|
38
|
-
return this.http.request(`/rest/v1/${encodeURIComponent(this.model)}${toQuery(options)}`);
|
|
39
|
-
}
|
|
40
|
-
insert(data) {
|
|
41
|
-
return this.http.request(`/rest/v1/${encodeURIComponent(this.model)}`, { method: 'POST', body: data });
|
|
42
|
-
}
|
|
43
|
-
update(data, options = {}) {
|
|
44
|
-
return this.http.request(`/rest/v1/${encodeURIComponent(this.model)}${toQuery(options)}`, {
|
|
45
|
-
method: 'PATCH',
|
|
46
|
-
body: data,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
remove(options = {}) {
|
|
50
|
-
return this.http.request(`/rest/v1/${encodeURIComponent(this.model)}${toQuery(options)}`, {
|
|
51
|
-
method: 'DELETE',
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export class RestModule {
|
|
56
|
-
constructor(http) {
|
|
57
|
-
this.http = http;
|
|
58
|
-
}
|
|
59
|
-
from(model) {
|
|
60
|
-
return new RestTable(this.http, model);
|
|
61
|
-
}
|
|
62
|
-
list(model, options = {}) {
|
|
63
|
-
return this.from(model).list(options);
|
|
64
|
-
}
|
|
65
|
-
insert(model, data) {
|
|
66
|
-
return this.from(model).insert(data);
|
|
67
|
-
}
|
|
68
|
-
update(model, data, options = {}) {
|
|
69
|
-
return this.from(model).update(data, options);
|
|
70
|
-
}
|
|
71
|
-
remove(model, options = {}) {
|
|
72
|
-
return this.from(model).remove(options);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=rest.js.map
|
package/dist/rest.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../src/rest.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { Session, SessionStorageAdapter, AuthEvent, AuthListener } 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
|
-
* Holds the live session in memory, mirrors it to a storage adapter, and
|
|
18
|
-
* notifies listeners of auth changes. The in-memory copy is the source of truth
|
|
19
|
-
* for synchronous reads (e.g. attaching the bearer header).
|
|
20
|
-
*/
|
|
21
|
-
export declare class SessionStore {
|
|
22
|
-
private readonly storage;
|
|
23
|
-
private current;
|
|
24
|
-
private readonly listeners;
|
|
25
|
-
private hydrated;
|
|
26
|
-
constructor(storage: SessionStorageAdapter);
|
|
27
|
-
/** Load the persisted session once. Idempotent. */
|
|
28
|
-
hydrate(): Promise<Session | null>;
|
|
29
|
-
get(): Session | null;
|
|
30
|
-
set(session: Session | null, event: AuthEvent): Promise<void>;
|
|
31
|
-
/** Replace only the tokens, keeping the existing user (used after refresh). */
|
|
32
|
-
setTokens(accessToken: string, refreshToken: string): Promise<void>;
|
|
33
|
-
subscribe(listener: AuthListener): () => void;
|
|
34
|
-
private emit;
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1F;;;;;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;;;;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;IAOxC,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"}
|
package/dist/session.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The key every built-in storage adapter defaults to, for both the cookie and
|
|
3
|
-
* localStorage. Defined once: it is a contract between the browser half of an
|
|
4
|
-
* app and the server half, and a second copy of the literal is how the two
|
|
5
|
-
* drift apart. Re-exported from `cookie.ts` and from the package root.
|
|
6
|
-
*/
|
|
7
|
-
export const SESSION_COOKIE_KEY = 'motherbase.session';
|
|
8
|
-
/** In-memory adapter. Safe everywhere (SSR, tests); does not survive reloads. */
|
|
9
|
-
export function memoryStorage() {
|
|
10
|
-
let current = null;
|
|
11
|
-
return {
|
|
12
|
-
get: () => current,
|
|
13
|
-
set: (s) => {
|
|
14
|
-
current = s;
|
|
15
|
-
},
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Browser localStorage adapter. Falls back to memory when localStorage is
|
|
20
|
-
* unavailable (SSR, private mode), so it never throws on import or use.
|
|
21
|
-
*/
|
|
22
|
-
export function localStorageStorage(key = SESSION_COOKIE_KEY) {
|
|
23
|
-
const ls = typeof globalThis !== 'undefined' ? globalThis.localStorage : undefined;
|
|
24
|
-
if (!ls)
|
|
25
|
-
return memoryStorage();
|
|
26
|
-
return {
|
|
27
|
-
get: () => {
|
|
28
|
-
const raw = ls.getItem(key);
|
|
29
|
-
if (!raw)
|
|
30
|
-
return null;
|
|
31
|
-
try {
|
|
32
|
-
return JSON.parse(raw);
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
set: (s) => {
|
|
39
|
-
if (s)
|
|
40
|
-
ls.setItem(key, JSON.stringify(s));
|
|
41
|
-
else
|
|
42
|
-
ls.removeItem(key);
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Holds the live session in memory, mirrors it to a storage adapter, and
|
|
48
|
-
* notifies listeners of auth changes. The in-memory copy is the source of truth
|
|
49
|
-
* for synchronous reads (e.g. attaching the bearer header).
|
|
50
|
-
*/
|
|
51
|
-
export class SessionStore {
|
|
52
|
-
constructor(storage) {
|
|
53
|
-
this.storage = storage;
|
|
54
|
-
this.current = null;
|
|
55
|
-
this.listeners = new Set();
|
|
56
|
-
this.hydrated = false;
|
|
57
|
-
}
|
|
58
|
-
/** Load the persisted session once. Idempotent. */
|
|
59
|
-
async hydrate() {
|
|
60
|
-
if (this.hydrated)
|
|
61
|
-
return this.current;
|
|
62
|
-
this.current = (await this.storage.get()) ?? null;
|
|
63
|
-
this.hydrated = true;
|
|
64
|
-
return this.current;
|
|
65
|
-
}
|
|
66
|
-
get() {
|
|
67
|
-
return this.current;
|
|
68
|
-
}
|
|
69
|
-
async set(session, event) {
|
|
70
|
-
this.current = session;
|
|
71
|
-
this.hydrated = true;
|
|
72
|
-
await this.storage.set(session);
|
|
73
|
-
this.emit(event);
|
|
74
|
-
}
|
|
75
|
-
/** Replace only the tokens, keeping the existing user (used after refresh). */
|
|
76
|
-
async setTokens(accessToken, refreshToken) {
|
|
77
|
-
if (!this.current)
|
|
78
|
-
return;
|
|
79
|
-
await this.set({ ...this.current, accessToken, refreshToken }, 'tokenRefreshed');
|
|
80
|
-
}
|
|
81
|
-
subscribe(listener) {
|
|
82
|
-
this.listeners.add(listener);
|
|
83
|
-
return () => this.listeners.delete(listener);
|
|
84
|
-
}
|
|
85
|
-
emit(event) {
|
|
86
|
-
for (const l of this.listeners)
|
|
87
|
-
l(event, this.current);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=session.js.map
|