@motherbase/client 1.0.1 → 1.1.1

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/dist/index.d.ts CHANGED
@@ -1,31 +1,65 @@
1
1
  import { memoryStorage, localStorageStorage } from './session.js';
2
- import { AuthModule } from './auth.js';
3
- import { UsersModule } from './profile.js';
4
- import { StorageModule } from './storage.js';
5
- import { DevicesModule } from './devices.js';
2
+ import { AuthClient } from './auth.js';
3
+ import { StorageClient } from './storage.js';
4
+ import { FunctionsClient } from './functions.js';
6
5
  import { RealtimeModule } from './realtime.js';
7
- import { RestModule } from './rest.js';
8
- import { EdgeModule } from './edge.js';
6
+ import { RealtimeChannel, type RealtimeChannelOptions } from './channel.js';
7
+ import { PostgrestQueryBuilder } from './postgrest.js';
9
8
  import type { ClientOptions } from './types.js';
10
- export declare class BackendClient {
11
- readonly auth: AuthModule;
12
- readonly users: UsersModule;
13
- readonly storage: StorageModule;
14
- readonly devices: DevicesModule;
9
+ /**
10
+ * Supabase-js-compatible client for a Motherbase backend.
11
+ *
12
+ * Drop-in shaped: `client.from(table).select()…`, `client.auth.signInWithPassword()`,
13
+ * `client.storage.from(bucket)`, `client.channel(name)`, `client.functions.invoke()`.
14
+ */
15
+ export declare class MotherbaseClient {
16
+ private readonly url;
17
+ /** Accepted for supabase-js signature parity; sent as an `apikey` header when set. */
18
+ readonly key?: string | undefined;
19
+ readonly auth: AuthClient;
20
+ readonly storage: StorageClient;
21
+ readonly functions: FunctionsClient;
22
+ /** Low-level realtime transport. Prefer `channel()` for the Supabase surface. */
15
23
  readonly realtime: RealtimeModule;
16
- readonly rest: RestModule;
17
- readonly edge: EdgeModule;
24
+ private readonly http;
18
25
  private readonly store;
19
- constructor(apiUrl: string, options?: ClientOptions);
26
+ private readonly channels;
27
+ constructor(url: string,
28
+ /** Accepted for supabase-js signature parity; sent as an `apikey` header when set. */
29
+ key?: string | undefined, options?: ClientOptions);
30
+ /** Start a PostgREST-style query against a table. */
31
+ from<Row extends object = Record<string, unknown>>(table: string): PostgrestQueryBuilder<Row>;
32
+ /** Create (or reuse) a realtime channel. */
33
+ channel(name: string, opts?: RealtimeChannelOptions): RealtimeChannel;
34
+ /** Unsubscribe and drop a channel. */
35
+ removeChannel(channel: RealtimeChannel): Promise<'ok'>;
36
+ /** Unsubscribe and drop every channel. */
37
+ removeAllChannels(): Promise<'ok'>;
20
38
  /** Load any persisted session before first use. Optional but recommended. */
21
39
  hydrate(): Promise<unknown>;
22
40
  }
23
- /** Create a client for the given API base URL. */
24
- export declare function createClient(apiUrl: string, options?: ClientOptions): BackendClient;
41
+ /**
42
+ * Create a Supabase-compatible Motherbase client.
43
+ *
44
+ * @param url Backend API base URL.
45
+ * @param key Anon/publishable key (optional). Sent as an `apikey` header.
46
+ * @param options Session storage, fetch override, extra headers.
47
+ */
48
+ export declare function createClient(url: string, key?: string, options?: ClientOptions): MotherbaseClient;
25
49
  export { BackendError } from './http.js';
26
50
  export { memoryStorage, localStorageStorage };
27
51
  export { cookieStorage, serverCookieStorage } from './cookie.js';
52
+ export { PostgrestQueryBuilder } from './postgrest.js';
53
+ export type { PostgrestSingleBuilder } from './postgrest.js';
54
+ export { AuthClient } from './auth.js';
55
+ export type { SignUpCredentials, SignInWithPasswordCredentials, Subscription } from './auth.js';
56
+ export { StorageClient, StorageBucket } from './storage.js';
57
+ export type { UploadOptions, UploadResult } from './storage.js';
58
+ export { FunctionsClient } from './functions.js';
59
+ export type { FunctionInvokeAuth, FunctionInvokeOptions } from './functions.js';
60
+ export { RealtimeChannel } from './channel.js';
61
+ export type { PostgresChangeEvent, PostgresChangeFilter, PostgresChangePayload, ChannelStatus, BroadcastFilter, PresenceFilter, BroadcastMessage, BroadcastReceived, RealtimeChannelOptions, PresenceEntry, PresenceState, PresenceJoinPayload, PresenceLeavePayload, } from './channel.js';
28
62
  export type { CookieAdapter, CookieOptions } from './cookie.js';
29
- export type { ApiEnvelope, User, Tokens, Session, FileObject, FileVisibility, DevicePlatform, SessionStorageAdapter, ClientOptions, AuthEvent, AuthListener, } from './types.js';
30
- export type { OrderDirection, RestFilters, RestFilterValue, RestListOptions, RestMutationOptions, RestOperator, } from './rest.js';
63
+ export type { ApiEnvelope, User, Tokens, Session, FileObject, FileVisibility, StorageUploadResponse, StorageRemoveResponse, UploadInput, SessionStorageAdapter, ClientOptions, MotherbaseResponse, MotherbaseError, AuthChangeEvent, AuthChangeListener, } from './types.js';
64
+ export type { RealtimeConnectOptions, RealtimeStatus, RealtimeStatusListener, RealtimeWatchEvent, RealtimeWatchOptions, IoFactory, SocketLike, } from './realtime.js';
31
65
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAAa,aAAa;IACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAE1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;IAwBvD,6EAA6E;IAC7E,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAG5B;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,aAAa,CAEvF;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EACV,WAAW,EACX,IAAI,EACJ,MAAM,EACN,OAAO,EACP,UAAU,EACV,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,YAAY,GACb,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,43 +1,89 @@
1
1
  import { HttpClient } from './http.js';
2
2
  import { SessionStore, memoryStorage, localStorageStorage } from './session.js';
3
- import { AuthModule } from './auth.js';
4
- import { UsersModule } from './profile.js';
5
- import { StorageModule } from './storage.js';
6
- import { DevicesModule } from './devices.js';
3
+ import { AuthClient } from './auth.js';
4
+ import { StorageClient } from './storage.js';
5
+ import { FunctionsClient } from './functions.js';
7
6
  import { RealtimeModule } from './realtime.js';
8
- import { RestModule } from './rest.js';
9
- import { EdgeModule } from './edge.js';
10
- export class BackendClient {
11
- constructor(apiUrl, options = {}) {
7
+ import { RealtimeChannel } from './channel.js';
8
+ import { PostgrestQueryBuilder } from './postgrest.js';
9
+ /**
10
+ * Supabase-js-compatible client for a Motherbase backend.
11
+ *
12
+ * Drop-in shaped: `client.from(table).select()…`, `client.auth.signInWithPassword()`,
13
+ * `client.storage.from(bucket)`, `client.channel(name)`, `client.functions.invoke()`.
14
+ */
15
+ export class MotherbaseClient {
16
+ constructor(url,
17
+ /** Accepted for supabase-js signature parity; sent as an `apikey` header when set. */
18
+ key, options = {}) {
19
+ this.url = url;
20
+ this.key = key;
21
+ this.channels = new Map();
12
22
  const fetchImpl = options.fetch ?? globalThis.fetch;
13
23
  if (!fetchImpl) {
14
24
  throw new Error('No fetch implementation found. Pass `fetch` in options for this runtime.');
15
25
  }
16
26
  const autoRefresh = options.autoRefresh ?? true;
27
+ const headers = { ...options.headers };
28
+ if (key)
29
+ headers['apikey'] = key;
17
30
  this.store = new SessionStore(options.storage ?? memoryStorage());
18
- // auth needs the http client, and http needs auth.refresh for the 401 path,
31
+ // auth needs the http client, and http needs auth._refresh for the 401 path,
19
32
  // so wire them in two steps with a late-bound refresh callback.
20
33
  let auth;
21
- const http = new HttpClient(apiUrl, this.store, { autoRefresh, fetch: fetchImpl }, () => auth.refresh());
22
- auth = new AuthModule(http, this.store);
34
+ this.http = new HttpClient(url, this.store, { autoRefresh, fetch: fetchImpl, headers }, () => auth._refresh());
35
+ auth = new AuthClient(this.http, this.store);
23
36
  this.auth = auth;
24
- this.users = new UsersModule(http);
25
- this.storage = new StorageModule(http);
26
- this.devices = new DevicesModule(http);
27
- this.realtime = new RealtimeModule(apiUrl, this.store);
28
- this.rest = new RestModule(http);
29
- this.edge = new EdgeModule(http);
37
+ this.storage = new StorageClient(this.http, url);
38
+ this.functions = new FunctionsClient(this.http);
39
+ this.realtime = new RealtimeModule(url, this.store, fetchImpl, options.realtimeIoFactory);
40
+ }
41
+ /** Start a PostgREST-style query against a table. */
42
+ from(table) {
43
+ return new PostgrestQueryBuilder(this.http, table);
44
+ }
45
+ /** Create (or reuse) a realtime channel. */
46
+ channel(name, opts = {}) {
47
+ const existing = this.channels.get(name);
48
+ if (existing)
49
+ return existing;
50
+ const channel = new RealtimeChannel(name, this.realtime, opts);
51
+ this.channels.set(name, channel);
52
+ return channel;
53
+ }
54
+ /** Unsubscribe and drop a channel. */
55
+ async removeChannel(channel) {
56
+ await channel.unsubscribe();
57
+ this.channels.delete(channel.topic);
58
+ return 'ok';
59
+ }
60
+ /** Unsubscribe and drop every channel. */
61
+ async removeAllChannels() {
62
+ await Promise.all(Array.from(this.channels.values()).map(c => c.unsubscribe()));
63
+ this.channels.clear();
64
+ return 'ok';
30
65
  }
31
66
  /** Load any persisted session before first use. Optional but recommended. */
32
67
  hydrate() {
33
68
  return this.store.hydrate();
34
69
  }
35
70
  }
36
- /** Create a client for the given API base URL. */
37
- export function createClient(apiUrl, options = {}) {
38
- return new BackendClient(apiUrl, options);
71
+ /**
72
+ * Create a Supabase-compatible Motherbase client.
73
+ *
74
+ * @param url Backend API base URL.
75
+ * @param key Anon/publishable key (optional). Sent as an `apikey` header.
76
+ * @param options Session storage, fetch override, extra headers.
77
+ */
78
+ export function createClient(url, key, options = {}) {
79
+ return new MotherbaseClient(url, key, options);
39
80
  }
40
81
  export { BackendError } from './http.js';
41
82
  export { memoryStorage, localStorageStorage };
42
83
  export { cookieStorage, serverCookieStorage } from './cookie.js';
84
+ export { PostgrestQueryBuilder } from './postgrest.js';
85
+ export { AuthClient } from './auth.js';
86
+ export { StorageClient, StorageBucket } from './storage.js';
87
+ export { FunctionsClient } from './functions.js';
88
+ export { RealtimeChannel } from './channel.js';
43
89
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,MAAM,OAAO,aAAa;IAWxB,YAAY,MAAc,EAAE,UAAyB,EAAE;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;QAEhD,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC,CAAC;QAElE,4EAA4E;QAC5E,gEAAgE;QAChE,IAAI,IAAiB,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACzG,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAExC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,6EAA6E;IAC7E,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;CACF;AAED,kDAAkD;AAClD,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,UAAyB,EAAE;IACtE,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { HttpClient } from './http.js';
2
+ import type { MotherbaseResponse } from './types.js';
3
+ type Primitive = string | number | boolean | null;
4
+ /**
5
+ * PostgREST-style, chainable, thenable query builder mapping onto the backend's
6
+ * `/rest/v1/:model` query-param dialect. Awaiting it resolves to `{ data, error }`
7
+ * and never rejects for expected API errors (only for programmer misuse).
8
+ */
9
+ export declare class PostgrestQueryBuilder<Row extends object = Record<string, unknown>> implements PromiseLike<MotherbaseResponse<Row[]>> {
10
+ private readonly http;
11
+ private readonly model;
12
+ private method;
13
+ private columns;
14
+ private readonly filters;
15
+ private readonly orderParts;
16
+ private limitValue?;
17
+ private offsetValue?;
18
+ private body?;
19
+ private rowMode;
20
+ constructor(http: HttpClient, model: string);
21
+ select(columns?: string): this;
22
+ insert(values: Partial<Row> | Array<Partial<Row>>): this;
23
+ /**
24
+ * Emulated upsert. The backend has no native upsert, so this issues an insert.
25
+ * Documented as best-effort in the README compatibility matrix.
26
+ */
27
+ upsert(values: Partial<Row> | Array<Partial<Row>>): this;
28
+ update(values: Partial<Row>): this;
29
+ delete(): this;
30
+ eq(column: string, value: Primitive): this;
31
+ neq(column: string, value: Primitive): this;
32
+ gt(column: string, value: Primitive): this;
33
+ gte(column: string, value: Primitive): this;
34
+ lt(column: string, value: Primitive): this;
35
+ lte(column: string, value: Primitive): this;
36
+ like(column: string, pattern: string): this;
37
+ ilike(column: string, pattern: string): this;
38
+ in(column: string, values: readonly Primitive[]): this;
39
+ is(column: string, value: null | boolean): this;
40
+ order(column: string, options?: {
41
+ ascending?: boolean;
42
+ }): this;
43
+ limit(count: number): this;
44
+ /** Inclusive range → offset/limit. `range(0, 9)` fetches 10 rows from offset 0. */
45
+ range(from: number, to: number): this;
46
+ single(): PostgrestSingleBuilder<Row>;
47
+ maybeSingle(): PostgrestSingleBuilder<Row>;
48
+ /** The URL path (with query string) this builder targets. Exposed for tests. */
49
+ toPath(): string;
50
+ private execute;
51
+ then<TResult1 = MotherbaseResponse<Row[]>, TResult2 = never>(onfulfilled?: ((value: MotherbaseResponse<Row[]>) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): PromiseLike<TResult1 | TResult2>;
52
+ }
53
+ /** Same builder, typed to resolve a single row (from `.single()` / `.maybeSingle()`). */
54
+ export interface PostgrestSingleBuilder<Row extends object> extends Omit<PostgrestQueryBuilder<Row>, 'then' | 'single' | 'maybeSingle'>, PromiseLike<MotherbaseResponse<Row>> {
55
+ then<TResult1 = MotherbaseResponse<Row>, TResult2 = never>(onfulfilled?: ((value: MotherbaseResponse<Row>) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): PromiseLike<TResult1 | TResult2>;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=postgrest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgrest.d.ts","sourceRoot":"","sources":["../src/postgrest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import { toError } from './http.js';
2
+ import { contractPath } from '@motherbase/contracts';
3
+ function encodeValue(value) {
4
+ if (value === null)
5
+ return 'null';
6
+ return String(value);
7
+ }
8
+ function encodeList(values) {
9
+ return `(${values.map(encodeValue).join(',')})`;
10
+ }
11
+ /**
12
+ * PostgREST-style, chainable, thenable query builder mapping onto the backend's
13
+ * `/rest/v1/:model` query-param dialect. Awaiting it resolves to `{ data, error }`
14
+ * and never rejects for expected API errors (only for programmer misuse).
15
+ */
16
+ export class PostgrestQueryBuilder {
17
+ constructor(http, model) {
18
+ this.http = http;
19
+ this.model = model;
20
+ this.method = 'GET';
21
+ this.columns = '*';
22
+ this.filters = new URLSearchParams();
23
+ this.orderParts = [];
24
+ this.rowMode = 'many';
25
+ }
26
+ // --- verbs -------------------------------------------------------------
27
+ select(columns = '*') {
28
+ if (this.method === 'GET' && this.body === undefined)
29
+ this.method = 'GET';
30
+ this.columns = columns;
31
+ return this;
32
+ }
33
+ insert(values) {
34
+ this.method = 'POST';
35
+ this.body = values;
36
+ return this;
37
+ }
38
+ /**
39
+ * Emulated upsert. The backend has no native upsert, so this issues an insert.
40
+ * Documented as best-effort in the README compatibility matrix.
41
+ */
42
+ upsert(values) {
43
+ this.method = 'POST';
44
+ this.body = values;
45
+ return this;
46
+ }
47
+ update(values) {
48
+ this.method = 'PATCH';
49
+ this.body = values;
50
+ return this;
51
+ }
52
+ delete() {
53
+ this.method = 'DELETE';
54
+ return this;
55
+ }
56
+ // --- filters -----------------------------------------------------------
57
+ eq(column, value) {
58
+ this.filters.set(column, `eq.${encodeValue(value)}`);
59
+ return this;
60
+ }
61
+ neq(column, value) {
62
+ this.filters.set(column, `neq.${encodeValue(value)}`);
63
+ return this;
64
+ }
65
+ gt(column, value) {
66
+ this.filters.set(column, `gt.${encodeValue(value)}`);
67
+ return this;
68
+ }
69
+ gte(column, value) {
70
+ this.filters.set(column, `gte.${encodeValue(value)}`);
71
+ return this;
72
+ }
73
+ lt(column, value) {
74
+ this.filters.set(column, `lt.${encodeValue(value)}`);
75
+ return this;
76
+ }
77
+ lte(column, value) {
78
+ this.filters.set(column, `lte.${encodeValue(value)}`);
79
+ return this;
80
+ }
81
+ like(column, pattern) {
82
+ this.filters.set(column, `like.${pattern}`);
83
+ return this;
84
+ }
85
+ ilike(column, pattern) {
86
+ this.filters.set(column, `ilike.${pattern}`);
87
+ return this;
88
+ }
89
+ in(column, values) {
90
+ this.filters.set(column, `in.${encodeList(values)}`);
91
+ return this;
92
+ }
93
+ is(column, value) {
94
+ this.filters.set(column, `is.${value === null ? 'null' : String(value)}`);
95
+ return this;
96
+ }
97
+ // --- modifiers ---------------------------------------------------------
98
+ order(column, options = {}) {
99
+ this.orderParts.push(`${column}.${options.ascending === false ? 'desc' : 'asc'}`);
100
+ return this;
101
+ }
102
+ limit(count) {
103
+ this.limitValue = count;
104
+ return this;
105
+ }
106
+ /** Inclusive range → offset/limit. `range(0, 9)` fetches 10 rows from offset 0. */
107
+ range(from, to) {
108
+ this.offsetValue = from;
109
+ this.limitValue = to - from + 1;
110
+ return this;
111
+ }
112
+ single() {
113
+ this.rowMode = 'single';
114
+ return this;
115
+ }
116
+ maybeSingle() {
117
+ this.rowMode = 'maybeSingle';
118
+ return this;
119
+ }
120
+ // --- execution ---------------------------------------------------------
121
+ /** The URL path (with query string) this builder targets. Exposed for tests. */
122
+ toPath() {
123
+ const params = new URLSearchParams();
124
+ if (this.columns && this.columns !== '*')
125
+ params.set('select', this.columns);
126
+ this.filters.forEach((value, key) => params.set(key, value));
127
+ if (this.orderParts.length)
128
+ params.set('order', this.orderParts.join(','));
129
+ if (typeof this.limitValue === 'number')
130
+ params.set('limit', String(this.limitValue));
131
+ if (typeof this.offsetValue === 'number')
132
+ params.set('offset', String(this.offsetValue));
133
+ const query = params.toString();
134
+ return `${contractPath.rest(this.model)}${query ? `?${query}` : ''}`;
135
+ }
136
+ async execute() {
137
+ try {
138
+ const rows = await this.http.request(this.toPath(), {
139
+ method: this.method,
140
+ body: this.body,
141
+ });
142
+ const list = Array.isArray(rows) ? rows : rows == null ? [] : [rows];
143
+ if (this.rowMode === 'single') {
144
+ if (list.length !== 1) {
145
+ const error = {
146
+ message: 'JSON object requested, multiple (or no) rows returned',
147
+ code: 'PGRST116',
148
+ };
149
+ return { data: null, error };
150
+ }
151
+ return { data: list[0], error: null };
152
+ }
153
+ if (this.rowMode === 'maybeSingle') {
154
+ return { data: list.length ? list[0] : null, error: null };
155
+ }
156
+ return { data: list, error: null };
157
+ }
158
+ catch (err) {
159
+ return { data: null, error: toError(err) };
160
+ }
161
+ }
162
+ then(onfulfilled, onrejected) {
163
+ return this.execute().then(onfulfilled, onrejected);
164
+ }
165
+ }
166
+ //# sourceMappingURL=postgrest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgrest.js","sourceRoot":"","sources":["../src/postgrest.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,35 @@
1
1
  import type { SessionStore } from './session.js';
2
+ import { type RealtimeJoinAck, type RealtimeJoinConfig, type RealtimeTopicEnvelope, type RealtimeTopicMessageType } from '@motherbase/contracts';
3
+ export type RealtimeStatus = 'idle' | 'connecting' | 'connected' | 'reconnecting' | 'polling' | 'disconnected' | 'error';
4
+ export type RealtimeStatusListener = (status: RealtimeStatus, detail?: unknown) => void;
5
+ export interface RealtimeConnectOptions {
6
+ timeoutMs?: number;
7
+ fallbackPolling?: boolean;
8
+ }
9
+ export interface RealtimeWatchOptions {
10
+ intervalMs?: number;
11
+ query?: string;
12
+ polling?: boolean;
13
+ }
14
+ /** Events received are pre-filtered by server-side REST policies for the current session. */
15
+ export type RealtimeWatchEvent<T> = {
16
+ type: 'created' | 'updated' | 'deleted';
17
+ source: 'socket';
18
+ payload: T;
19
+ } | {
20
+ type: 'snapshot';
21
+ source: 'polling';
22
+ rows: T[];
23
+ };
24
+ /** Minimal shape we rely on from socket.io-client's Socket. */
25
+ export interface SocketLike {
26
+ on(event: string, cb: (...args: unknown[]) => void): void;
27
+ off(event: string, cb?: (...args: unknown[]) => void): void;
28
+ emit(event: string, ...args: unknown[]): void;
29
+ disconnect(): void;
30
+ connected: boolean;
31
+ }
32
+ export type IoFactory = (url: string, opts: Record<string, unknown>) => SocketLike;
2
33
  /**
3
34
  * Lazy wrapper over socket.io-client. The dependency is optional: it is only
4
35
  * imported when `connect()` is called, so apps that never use realtime do not
@@ -7,12 +38,65 @@ import type { SessionStore } from './session.js';
7
38
  export declare class RealtimeModule {
8
39
  private readonly baseUrl;
9
40
  private readonly store;
41
+ private readonly fetchImpl;
42
+ /** Inject a socket factory (tests / custom transports). Falls back to socket.io-client. */
43
+ private readonly ioFactory?;
10
44
  private socket;
11
- constructor(baseUrl: string, store: SessionStore);
12
- connect(): Promise<void>;
45
+ private status;
46
+ private readonly statusListeners;
47
+ private readonly pollers;
48
+ private readonly tableSubscriptionRefs;
49
+ private pollerSeq;
50
+ private readonly channelsByTopic;
51
+ private topicRouterBound;
52
+ constructor(baseUrl: string, store: SessionStore, fetchImpl?: typeof fetch,
53
+ /** Inject a socket factory (tests / custom transports). Falls back to socket.io-client. */
54
+ ioFactory?: IoFactory | undefined);
55
+ /** True once a socket is connected. */
56
+ get connected(): boolean;
57
+ getStatus(): RealtimeStatus;
58
+ onStatusChange(listener: RealtimeStatusListener): () => void;
59
+ connect(options?: RealtimeConnectOptions): Promise<void>;
13
60
  on(event: string, cb: (...args: unknown[]) => void): void;
14
61
  off(event: string, cb?: (...args: unknown[]) => void): void;
15
62
  emit(event: string, ...args: unknown[]): void;
63
+ /**
64
+ * @deprecated Legacy low-level table watcher. Prefer the Supabase-shaped
65
+ * `client.channel(topic).on('postgres_changes', { event, schema, table, filter }, cb)`.
66
+ * Kept for backwards compatibility; scheduled for removal.
67
+ *
68
+ * Subscribe to create/update/delete events for a model table.
69
+ *
70
+ * Events are filtered server-side: you will only receive events for rows
71
+ * your session is authorized to see (based on REST API SELECT policies).
72
+ * Anonymous sessions receive only public rows; authenticated sessions receive
73
+ * rows matching their access policies (e.g. owner-only rows they own).
74
+ *
75
+ * Falls back to polling the REST endpoint at subscribe time if the WebSocket
76
+ * is not yet connected (polling does not auto-start on later disconnects).
77
+ */
78
+ watchTable<T>(model: string, cb: (event: RealtimeWatchEvent<T>) => void, options?: RealtimeWatchOptions): () => void;
16
79
  disconnect(): void;
80
+ /** Register a channel so incoming rt:msg envelopes for its topic are routed to it. */
81
+ registerChannel(topic: string, channel: {
82
+ _receive(env: RealtimeTopicEnvelope): void;
83
+ }): void;
84
+ unregisterChannel(topic: string): void;
85
+ /** Emit rt:join and resolve the server ack (or a timeout/error ack). */
86
+ joinTopic(topic: string, config: RealtimeJoinConfig, timeoutMs?: number): Promise<RealtimeJoinAck>;
87
+ leaveTopic(topic: string): void;
88
+ sendTopic(topic: string, type: RealtimeTopicMessageType, event: string, payload: unknown): void;
89
+ /** Emit an rt:msg and wait for the server ack (or resolve 'timed out'/'error'). */
90
+ sendTopicWithAck(topic: string, type: RealtimeTopicMessageType, event: string, payload: unknown, timeoutMs?: number): Promise<'ok' | 'timed out' | 'error'>;
91
+ private bindTopicRouter;
92
+ private retainTableSubscription;
93
+ private releaseTableSubscription;
94
+ private resubscribeTables;
95
+ private bindSocketStatus;
96
+ private waitForConnect;
97
+ private startPolling;
98
+ private stopPolling;
99
+ private fetchRows;
100
+ private setStatus;
17
101
  }
18
102
  //# sourceMappingURL=realtime.d.ts.map
@@ -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;AAajD;;;;GAIG;AACH,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFpE,OAAO,CAAC,MAAM,CAA2B;gBAEZ,OAAO,EAAE,MAAM,EAAmB,KAAK,EAAE,YAAY;IAE5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB9B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAIzD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAI3D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI7C,UAAU,IAAI,IAAI;CAInB"}
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}