@somewhere-cloud/sdk 0.0.0-stage → 0.13.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/LICENSE +21 -0
- package/README.md +191 -2
- package/dist/cjs/auth/client.js +1059 -0
- package/dist/cjs/auth/client.js.map +1 -0
- package/dist/cjs/auth/continuation.js +27 -0
- package/dist/cjs/auth/continuation.js.map +1 -0
- package/dist/cjs/auth/index.js +21 -0
- package/dist/cjs/auth/index.js.map +1 -0
- package/dist/cjs/auth/react.js +295 -0
- package/dist/cjs/auth/react.js.map +1 -0
- package/dist/cjs/auth/server.js +368 -0
- package/dist/cjs/auth/server.js.map +1 -0
- package/dist/cjs/client.js +392 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.js +16 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.cjs +215 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/query-cache.js +91 -0
- package/dist/cjs/query-cache.js.map +1 -0
- package/dist/cjs/resources/auth.js +875 -0
- package/dist/cjs/resources/auth.js.map +1 -0
- package/dist/cjs/resources/calls.js +42 -0
- package/dist/cjs/resources/calls.js.map +1 -0
- package/dist/cjs/resources/chat.js +82 -0
- package/dist/cjs/resources/chat.js.map +1 -0
- package/dist/cjs/resources/db.js +124 -0
- package/dist/cjs/resources/db.js.map +1 -0
- package/dist/cjs/resources/emails.js +39 -0
- package/dist/cjs/resources/emails.js.map +1 -0
- package/dist/cjs/resources/fs.js +141 -0
- package/dist/cjs/resources/fs.js.map +1 -0
- package/dist/cjs/resources/functions.js +145 -0
- package/dist/cjs/resources/functions.js.map +1 -0
- package/dist/cjs/resources/inbox.js +76 -0
- package/dist/cjs/resources/inbox.js.map +1 -0
- package/dist/cjs/resources/payments.js +68 -0
- package/dist/cjs/resources/payments.js.map +1 -0
- package/dist/cjs/resources/postgrest.js +391 -0
- package/dist/cjs/resources/postgrest.js.map +1 -0
- package/dist/cjs/resources/projects.js +71 -0
- package/dist/cjs/resources/projects.js.map +1 -0
- package/dist/cjs/resources/storage.js +191 -0
- package/dist/cjs/resources/storage.js.map +1 -0
- package/dist/cjs/resources/tasks.js +99 -0
- package/dist/cjs/resources/tasks.js.map +1 -0
- package/dist/cjs/resources/video.js +50 -0
- package/dist/cjs/resources/video.js.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/auth/client.js +1054 -0
- package/dist/esm/auth/client.js.map +1 -0
- package/dist/esm/auth/continuation.js +22 -0
- package/dist/esm/auth/continuation.js.map +1 -0
- package/dist/esm/auth/index.js +5 -0
- package/dist/esm/auth/index.js.map +1 -0
- package/dist/esm/auth/react.js +279 -0
- package/dist/esm/auth/react.js.map +1 -0
- package/dist/esm/auth/server.js +365 -0
- package/dist/esm/auth/server.js.map +1 -0
- package/dist/esm/client.js +388 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/errors.js +12 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +188 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/query-cache.js +87 -0
- package/dist/esm/query-cache.js.map +1 -0
- package/dist/esm/resources/auth.js +871 -0
- package/dist/esm/resources/auth.js.map +1 -0
- package/dist/esm/resources/calls.js +38 -0
- package/dist/esm/resources/calls.js.map +1 -0
- package/dist/esm/resources/chat.js +77 -0
- package/dist/esm/resources/chat.js.map +1 -0
- package/dist/esm/resources/db.js +120 -0
- package/dist/esm/resources/db.js.map +1 -0
- package/dist/esm/resources/emails.js +35 -0
- package/dist/esm/resources/emails.js.map +1 -0
- package/dist/esm/resources/fs.js +137 -0
- package/dist/esm/resources/fs.js.map +1 -0
- package/dist/esm/resources/functions.js +141 -0
- package/dist/esm/resources/functions.js.map +1 -0
- package/dist/esm/resources/inbox.js +70 -0
- package/dist/esm/resources/inbox.js.map +1 -0
- package/dist/esm/resources/payments.js +64 -0
- package/dist/esm/resources/payments.js.map +1 -0
- package/dist/esm/resources/postgrest.js +386 -0
- package/dist/esm/resources/postgrest.js.map +1 -0
- package/dist/esm/resources/projects.js +67 -0
- package/dist/esm/resources/projects.js.map +1 -0
- package/dist/esm/resources/storage.js +186 -0
- package/dist/esm/resources/storage.js.map +1 -0
- package/dist/esm/resources/tasks.js +95 -0
- package/dist/esm/resources/tasks.js.map +1 -0
- package/dist/esm/resources/video.js +46 -0
- package/dist/esm/resources/video.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/auth/client.d.ts +272 -0
- package/dist/types/auth/client.d.ts.map +1 -0
- package/dist/types/auth/continuation.d.ts +10 -0
- package/dist/types/auth/continuation.d.ts.map +1 -0
- package/dist/types/auth/index.d.ts +2 -0
- package/dist/types/auth/index.d.ts.map +1 -0
- package/dist/types/auth/react.d.ts +140 -0
- package/dist/types/auth/react.d.ts.map +1 -0
- package/dist/types/auth/server.d.ts +124 -0
- package/dist/types/auth/server.d.ts.map +1 -0
- package/dist/types/client.d.ts +128 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/errors.d.ts +17 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/query-cache.d.ts +59 -0
- package/dist/types/query-cache.d.ts.map +1 -0
- package/dist/types/resources/auth.d.ts +188 -0
- package/dist/types/resources/auth.d.ts.map +1 -0
- package/dist/types/resources/calls.d.ts +27 -0
- package/dist/types/resources/calls.d.ts.map +1 -0
- package/dist/types/resources/chat.d.ts +24 -0
- package/dist/types/resources/chat.d.ts.map +1 -0
- package/dist/types/resources/db.d.ts +81 -0
- package/dist/types/resources/db.d.ts.map +1 -0
- package/dist/types/resources/emails.d.ts +20 -0
- package/dist/types/resources/emails.d.ts.map +1 -0
- package/dist/types/resources/fs.d.ts +68 -0
- package/dist/types/resources/fs.d.ts.map +1 -0
- package/dist/types/resources/functions.d.ts +30 -0
- package/dist/types/resources/functions.d.ts.map +1 -0
- package/dist/types/resources/inbox.d.ts +52 -0
- package/dist/types/resources/inbox.d.ts.map +1 -0
- package/dist/types/resources/payments.d.ts +31 -0
- package/dist/types/resources/payments.d.ts.map +1 -0
- package/dist/types/resources/postgrest.d.ts +121 -0
- package/dist/types/resources/postgrest.d.ts.map +1 -0
- package/dist/types/resources/projects.d.ts +79 -0
- package/dist/types/resources/projects.d.ts.map +1 -0
- package/dist/types/resources/storage.d.ts +63 -0
- package/dist/types/resources/storage.d.ts.map +1 -0
- package/dist/types/resources/tasks.d.ts +87 -0
- package/dist/types/resources/tasks.d.ts.map +1 -0
- package/dist/types/resources/video.d.ts +30 -0
- package/dist/types/resources/video.d.ts.map +1 -0
- package/dist/types/types.d.ts +379 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +86 -4
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
import { SomewhereError } from './errors.js';
|
|
2
|
+
import { QueryCache } from './query-cache.js';
|
|
3
|
+
const DEFAULT_BASE_URL = 'https://api.somewhere.cloud/v1';
|
|
4
|
+
function isBinaryBody(body) {
|
|
5
|
+
if (typeof FormData !== 'undefined' && body instanceof FormData)
|
|
6
|
+
return true;
|
|
7
|
+
if (typeof Blob !== 'undefined' && body instanceof Blob)
|
|
8
|
+
return true;
|
|
9
|
+
if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer)
|
|
10
|
+
return true;
|
|
11
|
+
if (ArrayBuffer.isView(body))
|
|
12
|
+
return true;
|
|
13
|
+
if (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream)
|
|
14
|
+
return true;
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Internal HTTP client. Not exported from the SDK surface — the
|
|
19
|
+
* `Somewhere` facade owns a single Client instance and passes it to
|
|
20
|
+
* every resource. Handles auth mode resolution, envelope unwrapping,
|
|
21
|
+
* typed error materialization, binary round-trips, and the `safeCall`
|
|
22
|
+
* helper that converts `call` into a `Result<T>` envelope for the
|
|
23
|
+
* result-envelope surfaces.
|
|
24
|
+
*/
|
|
25
|
+
export class Client {
|
|
26
|
+
constructor(opts) {
|
|
27
|
+
/**
|
|
28
|
+
* Set by `auth.signInWithPassword` / `auth.signUp` on success.
|
|
29
|
+
* Cleared by `auth.signOut`. Used by `dual` and `session` auth modes;
|
|
30
|
+
* NEVER overrides `developer` mode (developer-only endpoints always
|
|
31
|
+
* use the initial `smt_` key — the server rejects JWTs on them).
|
|
32
|
+
*/
|
|
33
|
+
this.sessionAuthHeader = null;
|
|
34
|
+
/** Surfaces already warned about. Direct browser database and file API calls are disabled;
|
|
35
|
+
* each surface warns once. */
|
|
36
|
+
this.browserDataWarnings = new Set();
|
|
37
|
+
if (opts.key && opts.token) {
|
|
38
|
+
throw new Error('Somewhere: pass `key` OR `token`, not both.');
|
|
39
|
+
}
|
|
40
|
+
this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
41
|
+
this.authMode =
|
|
42
|
+
opts.authMode ?? (typeof document !== 'undefined' ? 'cookie' : 'header');
|
|
43
|
+
if (!opts.key && !opts.token && this.authMode !== 'cookie') {
|
|
44
|
+
throw new Error('Somewhere: bearer mode requires either `key` (smt_...) or `token` (app-user JWT).');
|
|
45
|
+
}
|
|
46
|
+
this.authPath = (opts.authPath ?? '/api/auth').replace(/\/$/, '');
|
|
47
|
+
this.functionsUrl = opts.functionsUrl
|
|
48
|
+
? opts.functionsUrl.replace(/\/$/, '').replace(/\/v1$/, '')
|
|
49
|
+
: undefined;
|
|
50
|
+
this.defaultProjectId = opts.projectId;
|
|
51
|
+
const initialCredential = opts.key ?? opts.token;
|
|
52
|
+
this.initialAuthHeader = initialCredential ? `Bearer ${initialCredential}` : null;
|
|
53
|
+
this.initialAuthKind = opts.key ? 'key' : opts.token ? 'token' : 'none';
|
|
54
|
+
this.extraHeaders = opts.headers ?? {};
|
|
55
|
+
const f = opts.fetch ?? globalThis.fetch;
|
|
56
|
+
if (!f) {
|
|
57
|
+
throw new Error('Somewhere: no fetch implementation found. Pass `fetch` explicitly.');
|
|
58
|
+
}
|
|
59
|
+
this.fetchImpl = f;
|
|
60
|
+
const cacheOpt = opts.cache;
|
|
61
|
+
this.cache =
|
|
62
|
+
cacheOpt === false
|
|
63
|
+
? null
|
|
64
|
+
: new QueryCache(cacheOpt === true || cacheOpt === undefined ? {} : cacheOpt);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Drop cached `from().select()` reads for a table. Invoked automatically
|
|
68
|
+
* after a write to the table (read-your-own-writes); also the public seam
|
|
69
|
+
* for event-driven invalidation. No-op when the cache is disabled.
|
|
70
|
+
*/
|
|
71
|
+
invalidateTable(table) {
|
|
72
|
+
this.cache?.invalidate(table);
|
|
73
|
+
}
|
|
74
|
+
/** True when the client was constructed with a developer `smt_` key. */
|
|
75
|
+
get hasDeveloperKey() {
|
|
76
|
+
return this.initialAuthKind === 'key';
|
|
77
|
+
}
|
|
78
|
+
/** True when a user session is currently active. */
|
|
79
|
+
get hasSession() {
|
|
80
|
+
return this.sessionAuthHeader !== null;
|
|
81
|
+
}
|
|
82
|
+
resolveProjectId(explicit) {
|
|
83
|
+
return explicit ?? this.defaultProjectId;
|
|
84
|
+
}
|
|
85
|
+
requireProjectId(explicit, what = 'this call') {
|
|
86
|
+
const pid = this.resolveProjectId(explicit);
|
|
87
|
+
if (!pid) {
|
|
88
|
+
throw new Error(`Somewhere: ${what} requires a projectId (pass one in the constructor).`);
|
|
89
|
+
}
|
|
90
|
+
return pid;
|
|
91
|
+
}
|
|
92
|
+
setSessionToken(accessToken) {
|
|
93
|
+
const header = `Bearer ${accessToken}`;
|
|
94
|
+
if (header !== this.sessionAuthHeader)
|
|
95
|
+
this.cache?.clear();
|
|
96
|
+
this.sessionAuthHeader = header;
|
|
97
|
+
}
|
|
98
|
+
clearSession() {
|
|
99
|
+
this.cache?.clear();
|
|
100
|
+
this.sessionAuthHeader = null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The `Authorization` value a project-function call should carry: the
|
|
104
|
+
* active user session if signed in, else the construction key/token.
|
|
105
|
+
* Same precedence as `dual` mode.
|
|
106
|
+
*/
|
|
107
|
+
get sessionOrInitialBearer() {
|
|
108
|
+
const header = this.sessionAuthHeader ?? this.initialAuthHeader;
|
|
109
|
+
if (!header) {
|
|
110
|
+
throw new SomewhereError({
|
|
111
|
+
code: 'BROWSER_SERVER_FUNCTION_REQUIRED',
|
|
112
|
+
message: 'This browser cookie client has no bearer credential. Call a same-origin server function ' +
|
|
113
|
+
'with `functions.invoke`; use sw.auth.fromRequest and sw.* inside that function.',
|
|
114
|
+
statusCode: 400,
|
|
115
|
+
retry: false,
|
|
116
|
+
retryAfterMs: null,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return header;
|
|
120
|
+
}
|
|
121
|
+
/** Low-level fetch passthrough for absolute URLs (project function hosts). */
|
|
122
|
+
rawFetch(url, init) {
|
|
123
|
+
return this.fetchImpl(url, init);
|
|
124
|
+
}
|
|
125
|
+
authHeader(mode = 'dual') {
|
|
126
|
+
if (mode === 'developer') {
|
|
127
|
+
if (this.initialAuthKind !== 'key') {
|
|
128
|
+
throw new SomewhereError({
|
|
129
|
+
code: 'INVALID_API_KEY',
|
|
130
|
+
message: 'This call requires a developer `smt_` API key. ' +
|
|
131
|
+
'Create the client with `{ key: "smt_..." }` (server-side only).',
|
|
132
|
+
statusCode: 401,
|
|
133
|
+
retry: false,
|
|
134
|
+
retryAfterMs: null,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return this.initialAuthHeader;
|
|
138
|
+
}
|
|
139
|
+
if (mode === 'session') {
|
|
140
|
+
if (!this.sessionAuthHeader) {
|
|
141
|
+
throw new SomewhereError({
|
|
142
|
+
code: 'AUTH_INVALID_CREDS',
|
|
143
|
+
message: 'This call requires an active user session. Sign in with ' +
|
|
144
|
+
'`sw.auth.signInWithPassword({ email, password })` first.',
|
|
145
|
+
statusCode: 401,
|
|
146
|
+
retry: false,
|
|
147
|
+
retryAfterMs: null,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return this.sessionAuthHeader;
|
|
151
|
+
}
|
|
152
|
+
// dual
|
|
153
|
+
const header = this.sessionAuthHeader ?? this.initialAuthHeader;
|
|
154
|
+
if (!header) {
|
|
155
|
+
throw new SomewhereError({
|
|
156
|
+
code: 'BROWSER_SERVER_FUNCTION_REQUIRED',
|
|
157
|
+
message: 'This browser cookie client has no bearer credential. Move the operation into a ' +
|
|
158
|
+
'same-origin server function and call it with `functions.invoke`.',
|
|
159
|
+
statusCode: 400,
|
|
160
|
+
retry: false,
|
|
161
|
+
retryAfterMs: null,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return header;
|
|
165
|
+
}
|
|
166
|
+
/** JSON request → JSON response. Unwraps `{ok, data}` → `data`, throws on error. */
|
|
167
|
+
async call(method, path, opts = {}) {
|
|
168
|
+
if (opts.sessionBearer !== undefined && opts.auth !== 'session') {
|
|
169
|
+
throw new Error('A per-request session bearer requires session auth.');
|
|
170
|
+
}
|
|
171
|
+
this.warnOnDirectBrowserDataAccess(path);
|
|
172
|
+
const url = this.buildUrl(path, opts.query);
|
|
173
|
+
const headers = {
|
|
174
|
+
Authorization: opts.sessionBearer === undefined ? this.authHeader(opts.auth ?? 'dual') : `Bearer ${opts.sessionBearer}`,
|
|
175
|
+
Accept: 'application/json',
|
|
176
|
+
...this.extraHeaders,
|
|
177
|
+
};
|
|
178
|
+
let body;
|
|
179
|
+
if (opts.body !== undefined) {
|
|
180
|
+
if (isBinaryBody(opts.body)) {
|
|
181
|
+
body = opts.body;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
headers['Content-Type'] = 'application/json';
|
|
185
|
+
body = JSON.stringify(opts.body);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
let res;
|
|
189
|
+
try {
|
|
190
|
+
res = await this.fetchImpl(url, { method, headers, body, ...(opts.signal ? { signal: opts.signal } : {}) });
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
throw new SomewhereError({
|
|
194
|
+
code: 'NETWORK_ERROR',
|
|
195
|
+
message: err instanceof Error ? err.message : 'Network error reaching the platform.',
|
|
196
|
+
statusCode: 0,
|
|
197
|
+
retry: true,
|
|
198
|
+
retryAfterMs: null,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const parsed = await this.parseJson(res);
|
|
202
|
+
return this.unwrap(parsed, res.status);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Same as `call` but never throws — always returns a `Result<T>`.
|
|
206
|
+
* Used by result-envelope surfaces where the caller branches
|
|
207
|
+
* on `.error` instead of catching.
|
|
208
|
+
*/
|
|
209
|
+
async safeCall(method, path, opts = {}) {
|
|
210
|
+
try {
|
|
211
|
+
const data = await this.call(method, path, opts);
|
|
212
|
+
return { data, error: null, status: 200 };
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
if (err instanceof SomewhereError) {
|
|
216
|
+
return { data: null, error: err, status: err.statusCode };
|
|
217
|
+
}
|
|
218
|
+
throw err;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** Raw binary download. */
|
|
222
|
+
async getBytes(path, query, auth = 'dual') {
|
|
223
|
+
this.warnOnDirectBrowserDataAccess(path);
|
|
224
|
+
const url = this.buildUrl(path, query);
|
|
225
|
+
let res;
|
|
226
|
+
try {
|
|
227
|
+
res = await this.fetchImpl(url, {
|
|
228
|
+
method: 'GET',
|
|
229
|
+
headers: { Authorization: this.authHeader(auth), ...this.extraHeaders },
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
throw new SomewhereError({
|
|
234
|
+
code: 'NETWORK_ERROR',
|
|
235
|
+
message: err instanceof Error ? err.message : 'Network error reaching the platform.',
|
|
236
|
+
statusCode: 0,
|
|
237
|
+
retry: true,
|
|
238
|
+
retryAfterMs: null,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
if (!res.ok) {
|
|
242
|
+
const parsed = await this.parseJson(res).catch(() => null);
|
|
243
|
+
throw this.toError(parsed, res.status);
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
body: await res.arrayBuffer(),
|
|
247
|
+
contentType: res.headers.get('content-type') ?? 'application/octet-stream',
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/** Raw binary upload. */
|
|
251
|
+
async putBytes(path, body, contentType, auth = 'dual') {
|
|
252
|
+
this.warnOnDirectBrowserDataAccess(path);
|
|
253
|
+
const url = this.buildUrl(path);
|
|
254
|
+
let res;
|
|
255
|
+
try {
|
|
256
|
+
res = await this.fetchImpl(url, {
|
|
257
|
+
method: 'PUT',
|
|
258
|
+
headers: {
|
|
259
|
+
Authorization: this.authHeader(auth),
|
|
260
|
+
'Content-Type': contentType,
|
|
261
|
+
Accept: 'application/json',
|
|
262
|
+
...this.extraHeaders,
|
|
263
|
+
},
|
|
264
|
+
body,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
throw new SomewhereError({
|
|
269
|
+
code: 'NETWORK_ERROR',
|
|
270
|
+
message: err instanceof Error ? err.message : 'Network error reaching the platform.',
|
|
271
|
+
statusCode: 0,
|
|
272
|
+
retry: true,
|
|
273
|
+
retryAfterMs: null,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
const parsed = await this.parseJson(res);
|
|
277
|
+
return this.unwrap(parsed, res.status);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Direct browser calls to the platform's database and file APIs are
|
|
281
|
+
* disabled; browser code uses declared data/file collections or a server
|
|
282
|
+
* function. This one-time warning says so. It does not block or alter the
|
|
283
|
+
* request: the server decides, and the caller gets that answer as a normal
|
|
284
|
+
* Result. Server-side use of these APIs is unaffected.
|
|
285
|
+
*/
|
|
286
|
+
warnOnDirectBrowserDataAccess(path) {
|
|
287
|
+
if (typeof document === 'undefined')
|
|
288
|
+
return;
|
|
289
|
+
const surface = path === '/db' || path.startsWith('/db/')
|
|
290
|
+
? 'database'
|
|
291
|
+
: path === '/fs' || path.startsWith('/fs/') || path === '/storage' || path.startsWith('/storage/')
|
|
292
|
+
? 'files'
|
|
293
|
+
: null;
|
|
294
|
+
if (!surface || this.browserDataWarnings.has(surface))
|
|
295
|
+
return;
|
|
296
|
+
this.browserDataWarnings.add(surface);
|
|
297
|
+
globalThis.console?.warn?.(surface === 'database'
|
|
298
|
+
? '[@somewhere-cloud/sdk] Direct browser database API calls are disabled. ' +
|
|
299
|
+
'Use the generated somewhere:data client for operations allowed by your declared data rules, ' +
|
|
300
|
+
'or call a server function that uses sw.db.'
|
|
301
|
+
: '[@somewhere-cloud/sdk] Direct browser file API calls are disabled. ' +
|
|
302
|
+
'Use a declared somewhere:files collection, or call a server function that uses sw.fs.');
|
|
303
|
+
}
|
|
304
|
+
buildUrl(path, query) {
|
|
305
|
+
const suffix = path.startsWith('/') ? path : `/${path}`;
|
|
306
|
+
const base = `${this.baseUrl}${suffix}`;
|
|
307
|
+
if (!query)
|
|
308
|
+
return base;
|
|
309
|
+
const params = new URLSearchParams();
|
|
310
|
+
for (const [k, v] of Object.entries(query)) {
|
|
311
|
+
if (v === undefined || v === null)
|
|
312
|
+
continue;
|
|
313
|
+
params.append(k, String(v));
|
|
314
|
+
}
|
|
315
|
+
const qs = params.toString();
|
|
316
|
+
return qs ? `${base}?${qs}` : base;
|
|
317
|
+
}
|
|
318
|
+
async parseJson(res) {
|
|
319
|
+
const text = await res.text();
|
|
320
|
+
if (!text)
|
|
321
|
+
return null;
|
|
322
|
+
try {
|
|
323
|
+
return JSON.parse(text);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// Non-JSON body (typically an HTML error page from a 5xx upstream
|
|
327
|
+
// or a CF-level block). Turn it into a typed error rather than
|
|
328
|
+
// letting the raw JSON.parse fault bubble up.
|
|
329
|
+
if (res.ok) {
|
|
330
|
+
throw new SomewhereError({
|
|
331
|
+
code: 'INVALID_RESPONSE',
|
|
332
|
+
message: `The platform returned a non-JSON response (HTTP ${res.status}), so the operation's result could not be confirmed. ` +
|
|
333
|
+
'Inspect the resulting state before repeating a write.',
|
|
334
|
+
statusCode: res.status,
|
|
335
|
+
retry: false,
|
|
336
|
+
retryAfterMs: null,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
throw new SomewhereError({
|
|
340
|
+
code: 'INVALID_RESPONSE',
|
|
341
|
+
message: `Non-JSON response (status ${res.status}): ${text.slice(0, 200)}`,
|
|
342
|
+
statusCode: res.status,
|
|
343
|
+
retry: res.status >= 500,
|
|
344
|
+
retryAfterMs: null,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
unwrap(parsed, statusCode) {
|
|
349
|
+
// Empty-body success (204 No Content, or a proxy returning an empty
|
|
350
|
+
// body with a 200). Treat as `{data: null}` instead of throwing.
|
|
351
|
+
if (parsed === null && statusCode >= 200 && statusCode < 300) {
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
if (parsed && typeof parsed === 'object' && 'ok' in parsed) {
|
|
355
|
+
const envelope = parsed;
|
|
356
|
+
if (envelope.ok === true) {
|
|
357
|
+
return envelope.data;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
throw this.toError(parsed, statusCode);
|
|
361
|
+
}
|
|
362
|
+
toError(parsed, statusCode) {
|
|
363
|
+
if (parsed &&
|
|
364
|
+
typeof parsed === 'object' &&
|
|
365
|
+
'ok' in parsed &&
|
|
366
|
+
parsed.ok === false) {
|
|
367
|
+
const body = parsed;
|
|
368
|
+
const retryAfterMs = typeof body.retry_after_ms === 'number' ? body.retry_after_ms : null;
|
|
369
|
+
return new SomewhereError({
|
|
370
|
+
code: body.error ?? 'UNKNOWN_ERROR',
|
|
371
|
+
message: body.message ?? 'Unknown error',
|
|
372
|
+
statusCode,
|
|
373
|
+
retry: body.retry === true,
|
|
374
|
+
retryAfterMs,
|
|
375
|
+
body,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
return new SomewhereError({
|
|
379
|
+
code: 'INVALID_RESPONSE',
|
|
380
|
+
message: `Unexpected response shape (status ${statusCode})`,
|
|
381
|
+
statusCode,
|
|
382
|
+
retry: statusCode >= 500,
|
|
383
|
+
retryAfterMs: null,
|
|
384
|
+
body: parsed,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export class SomewhereError extends Error {
|
|
2
|
+
constructor(init) {
|
|
3
|
+
super(init.message);
|
|
4
|
+
this.name = 'SomewhereError';
|
|
5
|
+
this.code = init.code;
|
|
6
|
+
this.statusCode = init.statusCode;
|
|
7
|
+
this.retry = init.retry;
|
|
8
|
+
this.retryAfterMs = init.retryAfterMs;
|
|
9
|
+
this.body = init.body;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAOvC,YAAY,IAAwB;QAClC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { Client } from './client.js';
|
|
2
|
+
import { AuthClient } from './resources/auth.js';
|
|
3
|
+
import { CallsClient } from './resources/calls.js';
|
|
4
|
+
import { ChatClient } from './resources/chat.js';
|
|
5
|
+
import { DbClient } from './resources/db.js';
|
|
6
|
+
import { EmailsClient } from './resources/emails.js';
|
|
7
|
+
import { FsClient } from './resources/fs.js';
|
|
8
|
+
import { FunctionsClient } from './resources/functions.js';
|
|
9
|
+
import { InboxClient } from './resources/inbox.js';
|
|
10
|
+
import { PaymentsClient } from './resources/payments.js';
|
|
11
|
+
import { SomewhereQueryBuilder, } from './resources/postgrest.js';
|
|
12
|
+
import { StorageClient } from './resources/storage.js';
|
|
13
|
+
import { TasksClient } from './resources/tasks.js';
|
|
14
|
+
import { ProjectsClient } from './resources/projects.js';
|
|
15
|
+
import { VideoClient } from './resources/video.js';
|
|
16
|
+
export { SomewhereError } from './errors.js';
|
|
17
|
+
export { PostgrestFilterBuilder, SomewhereQueryBuilder } from './resources/postgrest.js';
|
|
18
|
+
export { QueryCache } from './query-cache.js';
|
|
19
|
+
export { StorageClient, StorageFileApi } from './resources/storage.js';
|
|
20
|
+
export { AuthClient } from './resources/auth.js';
|
|
21
|
+
export { DbClient } from './resources/db.js';
|
|
22
|
+
export { EmailsClient } from './resources/emails.js';
|
|
23
|
+
export { FsClient } from './resources/fs.js';
|
|
24
|
+
export { FunctionsClient } from './resources/functions.js';
|
|
25
|
+
export { ChatClient, ChatCompletionsClient } from './resources/chat.js';
|
|
26
|
+
export { PaymentsClient } from './resources/payments.js';
|
|
27
|
+
export { VideoClient } from './resources/video.js';
|
|
28
|
+
export { InboxClient, InboxAddressesClient, InboxMessagesClient } from './resources/inbox.js';
|
|
29
|
+
export { CallsClient } from './resources/calls.js';
|
|
30
|
+
export { TasksClient } from './resources/tasks.js';
|
|
31
|
+
export { ProjectsClient } from './resources/projects.js';
|
|
32
|
+
/**
|
|
33
|
+
* The somewhere.tech client for explicit server and non-browser access, plus
|
|
34
|
+
* browser auth and application-function conveniences:
|
|
35
|
+
*
|
|
36
|
+
* - `sw.db.query(sql, params)` — raw SQL
|
|
37
|
+
* - `sw.db.from(table)` / `sw.from(table)` — fluent query builder
|
|
38
|
+
* - `sw.fs.read(path)` / `sw.fs.write(path, body)` — raw filesystem
|
|
39
|
+
* - `sw.storage.from(bucket)` — prefix-oriented file API
|
|
40
|
+
* - `sw.auth` — application auth
|
|
41
|
+
* - `sw.emails.send(...)` — Resend email
|
|
42
|
+
* - `sw.inbox.messages.list(...)` — inbound email
|
|
43
|
+
* - `sw.chat.completions.create()` — OpenAI chat completions
|
|
44
|
+
* - `sw.payments.checkout(...)` — Stripe Connect (zero platform fee)
|
|
45
|
+
* - `sw.video.createUploadUrl()` — direct-upload video pipeline
|
|
46
|
+
* - `sw.calls.createSession()` — WebRTC SFU sessions
|
|
47
|
+
* - `sw.tasks.create(...)` — per-project ticketing
|
|
48
|
+
*
|
|
49
|
+
* import { Somewhere } from '@somewhere-cloud/sdk'
|
|
50
|
+
* const sw = new Somewhere({ key: process.env.SOMEWHERE_API_KEY, projectId: 'booking-app' })
|
|
51
|
+
*
|
|
52
|
+
* const { data } = await sw.from('users').select('*').eq('id', 1)
|
|
53
|
+
*/
|
|
54
|
+
export class Somewhere {
|
|
55
|
+
constructor(opts) {
|
|
56
|
+
this.client = new Client(opts);
|
|
57
|
+
this.auth = new AuthClient(this.client);
|
|
58
|
+
this.db = new DbClient(this.client);
|
|
59
|
+
this.fs = new FsClient(this.client);
|
|
60
|
+
this.storage = new StorageClient(this.client);
|
|
61
|
+
this.emails = new EmailsClient(this.client);
|
|
62
|
+
this.inbox = new InboxClient(this.client);
|
|
63
|
+
this.chat = new ChatClient(this.client);
|
|
64
|
+
this.payments = new PaymentsClient(this.client);
|
|
65
|
+
this.functions = new FunctionsClient(this.client);
|
|
66
|
+
this.video = new VideoClient(this.client);
|
|
67
|
+
this.calls = new CallsClient(this.client);
|
|
68
|
+
this.tasks = new TasksClient(this.client);
|
|
69
|
+
this.projects = new ProjectsClient(this.client);
|
|
70
|
+
}
|
|
71
|
+
/** Fluent query builder entry point. Alias of `sw.db.from(table)`. */
|
|
72
|
+
from(table) {
|
|
73
|
+
return new SomewhereQueryBuilder(this.client, table);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Warm the client cache for a query ahead of need — hover-prefetch, route
|
|
77
|
+
* preload, "load the next page while they read this one". Just runs the
|
|
78
|
+
* query (populating the instance cache); a later identical `.select()`
|
|
79
|
+
* within the staleTime window is then served instantly from cache.
|
|
80
|
+
*
|
|
81
|
+
* sw.prefetch(sw.from('posts').select('*').eq('id', hoveredId))
|
|
82
|
+
* // …on click, this is a cache hit, no network round-trip:
|
|
83
|
+
* const { data } = await sw.from('posts').select('*').eq('id', hoveredId)
|
|
84
|
+
*
|
|
85
|
+
* No-op for cache effects when the client was created with `{ cache: false }`.
|
|
86
|
+
*/
|
|
87
|
+
prefetch(query) {
|
|
88
|
+
return Promise.resolve(query);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Drop cached `from().select()` reads for a table. Read-your-own-writes is
|
|
92
|
+
* already automatic (writes self-invalidate); reach for this to invalidate
|
|
93
|
+
* by hand — e.g. from whatever tells your app a row changed:
|
|
94
|
+
*
|
|
95
|
+
* onRowChanged('posts', () => sw.invalidate('posts'))
|
|
96
|
+
*/
|
|
97
|
+
invalidate(table) {
|
|
98
|
+
this.client.invalidateTable(table);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* `rpc(name, args)` convenience method. On somewhere there are no SQL stored
|
|
102
|
+
* procedures — a "database function" is one of your deployed `api/<name>`
|
|
103
|
+
* functions. `rpc('foo', args)` therefore calls `POST {projectUrl}/api/foo`
|
|
104
|
+
* with `args` as the JSON body and returns `{ data, error }`. Identical to
|
|
105
|
+
* `functions.invoke(name, { body: args })`; provided so existing `rpc(...)`
|
|
106
|
+
* call sites port unchanged.
|
|
107
|
+
*/
|
|
108
|
+
rpc(name, args) {
|
|
109
|
+
return this.functions.invoke(name, args === undefined ? {} : { body: args });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export default Somewhere;
|
|
113
|
+
/* ─── createClient factory ───────────────────────────────────── */
|
|
114
|
+
/**
|
|
115
|
+
* Derive the project id from a legacy `*.somewhere.tech` application URL's
|
|
116
|
+
* subdomain. Current `*.somewhere.site` URLs, custom domains, API hosts, and
|
|
117
|
+
* bare hosts return `undefined`; pass `projectId` explicitly for project
|
|
118
|
+
* resources. The seam is loud: an unresolved project id surfaces as a clear
|
|
119
|
+
* error on the first call that needs one.
|
|
120
|
+
*/
|
|
121
|
+
export function projectIdFromUrl(url) {
|
|
122
|
+
let host;
|
|
123
|
+
try {
|
|
124
|
+
host = new URL(url).hostname;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
if (!host.endsWith('.somewhere.tech'))
|
|
130
|
+
return undefined;
|
|
131
|
+
const sub = host.slice(0, -'.somewhere.tech'.length);
|
|
132
|
+
// `api.somewhere.tech`, `www.`, or a deeper path aren't project subdomains.
|
|
133
|
+
if (!sub || sub.includes('.') || sub === 'api' || sub === 'www')
|
|
134
|
+
return undefined;
|
|
135
|
+
return sub;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Create a somewhere.tech client from an application URL:
|
|
139
|
+
*
|
|
140
|
+
* import { createClient } from '@somewhere-cloud/sdk'
|
|
141
|
+
* const client = createClient('https://booking-app.somewhere.site', undefined, {
|
|
142
|
+
* projectId: 'booking-app',
|
|
143
|
+
* })
|
|
144
|
+
*
|
|
145
|
+
* await client.auth.signInWithPassword({ email, password })
|
|
146
|
+
* await client.functions.invoke('checkout', { body: { plan: 'pro' } })
|
|
147
|
+
*
|
|
148
|
+
* - `somewhereUrl` — your application's URL. Used as the `functions.invoke`
|
|
149
|
+
* host. Pass `{ projectId }` for current `*.somewhere.site` URLs and custom
|
|
150
|
+
* domains; automatic inference is retained for legacy `*.somewhere.tech`
|
|
151
|
+
* application URLs only.
|
|
152
|
+
* - `somewhereKey` — omit in a browser cookie app. For non-browser use, pass
|
|
153
|
+
* an app-user JWT or a developer `smt_` key
|
|
154
|
+
* (server-only). Detected by the `smt_` prefix.
|
|
155
|
+
*
|
|
156
|
+
* Database / auth / storage calls go to the platform REST base
|
|
157
|
+
* (`https://api.somewhere.cloud/v1`, override with `options.apiUrl`).
|
|
158
|
+
*/
|
|
159
|
+
export function createClient(somewhereUrl, somewhereKey, options = {}) {
|
|
160
|
+
const projectId = options.projectId ?? projectIdFromUrl(somewhereUrl);
|
|
161
|
+
const isDeveloperKey = somewhereKey?.startsWith('smt_') ?? false;
|
|
162
|
+
const functionsUrl = options.functionsUrl ?? (isLikelyHttpUrl(somewhereUrl) ? somewhereUrl : undefined);
|
|
163
|
+
return new Somewhere({
|
|
164
|
+
...(somewhereKey
|
|
165
|
+
? isDeveloperKey
|
|
166
|
+
? { key: somewhereKey }
|
|
167
|
+
: { token: somewhereKey }
|
|
168
|
+
: {}),
|
|
169
|
+
projectId,
|
|
170
|
+
baseUrl: options.apiUrl,
|
|
171
|
+
functionsUrl,
|
|
172
|
+
fetch: options.fetch,
|
|
173
|
+
headers: options.headers,
|
|
174
|
+
authMode: options.authMode,
|
|
175
|
+
authPath: options.authPath,
|
|
176
|
+
cache: options.cache,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function isLikelyHttpUrl(value) {
|
|
180
|
+
try {
|
|
181
|
+
const u = new URL(value);
|
|
182
|
+
return u.protocol === 'http:' || u.protocol === 'https:';
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|