@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.
Files changed (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -2
  3. package/dist/cjs/auth/client.js +1059 -0
  4. package/dist/cjs/auth/client.js.map +1 -0
  5. package/dist/cjs/auth/continuation.js +27 -0
  6. package/dist/cjs/auth/continuation.js.map +1 -0
  7. package/dist/cjs/auth/index.js +21 -0
  8. package/dist/cjs/auth/index.js.map +1 -0
  9. package/dist/cjs/auth/react.js +295 -0
  10. package/dist/cjs/auth/react.js.map +1 -0
  11. package/dist/cjs/auth/server.js +368 -0
  12. package/dist/cjs/auth/server.js.map +1 -0
  13. package/dist/cjs/client.js +392 -0
  14. package/dist/cjs/client.js.map +1 -0
  15. package/dist/cjs/errors.js +16 -0
  16. package/dist/cjs/errors.js.map +1 -0
  17. package/dist/cjs/index.cjs +215 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/package.json +1 -0
  20. package/dist/cjs/query-cache.js +91 -0
  21. package/dist/cjs/query-cache.js.map +1 -0
  22. package/dist/cjs/resources/auth.js +875 -0
  23. package/dist/cjs/resources/auth.js.map +1 -0
  24. package/dist/cjs/resources/calls.js +42 -0
  25. package/dist/cjs/resources/calls.js.map +1 -0
  26. package/dist/cjs/resources/chat.js +82 -0
  27. package/dist/cjs/resources/chat.js.map +1 -0
  28. package/dist/cjs/resources/db.js +124 -0
  29. package/dist/cjs/resources/db.js.map +1 -0
  30. package/dist/cjs/resources/emails.js +39 -0
  31. package/dist/cjs/resources/emails.js.map +1 -0
  32. package/dist/cjs/resources/fs.js +141 -0
  33. package/dist/cjs/resources/fs.js.map +1 -0
  34. package/dist/cjs/resources/functions.js +145 -0
  35. package/dist/cjs/resources/functions.js.map +1 -0
  36. package/dist/cjs/resources/inbox.js +76 -0
  37. package/dist/cjs/resources/inbox.js.map +1 -0
  38. package/dist/cjs/resources/payments.js +68 -0
  39. package/dist/cjs/resources/payments.js.map +1 -0
  40. package/dist/cjs/resources/postgrest.js +391 -0
  41. package/dist/cjs/resources/postgrest.js.map +1 -0
  42. package/dist/cjs/resources/projects.js +71 -0
  43. package/dist/cjs/resources/projects.js.map +1 -0
  44. package/dist/cjs/resources/storage.js +191 -0
  45. package/dist/cjs/resources/storage.js.map +1 -0
  46. package/dist/cjs/resources/tasks.js +99 -0
  47. package/dist/cjs/resources/tasks.js.map +1 -0
  48. package/dist/cjs/resources/video.js +50 -0
  49. package/dist/cjs/resources/video.js.map +1 -0
  50. package/dist/cjs/types.js +3 -0
  51. package/dist/cjs/types.js.map +1 -0
  52. package/dist/esm/auth/client.js +1054 -0
  53. package/dist/esm/auth/client.js.map +1 -0
  54. package/dist/esm/auth/continuation.js +22 -0
  55. package/dist/esm/auth/continuation.js.map +1 -0
  56. package/dist/esm/auth/index.js +5 -0
  57. package/dist/esm/auth/index.js.map +1 -0
  58. package/dist/esm/auth/react.js +279 -0
  59. package/dist/esm/auth/react.js.map +1 -0
  60. package/dist/esm/auth/server.js +365 -0
  61. package/dist/esm/auth/server.js.map +1 -0
  62. package/dist/esm/client.js +388 -0
  63. package/dist/esm/client.js.map +1 -0
  64. package/dist/esm/errors.js +12 -0
  65. package/dist/esm/errors.js.map +1 -0
  66. package/dist/esm/index.js +188 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/package.json +1 -0
  69. package/dist/esm/query-cache.js +87 -0
  70. package/dist/esm/query-cache.js.map +1 -0
  71. package/dist/esm/resources/auth.js +871 -0
  72. package/dist/esm/resources/auth.js.map +1 -0
  73. package/dist/esm/resources/calls.js +38 -0
  74. package/dist/esm/resources/calls.js.map +1 -0
  75. package/dist/esm/resources/chat.js +77 -0
  76. package/dist/esm/resources/chat.js.map +1 -0
  77. package/dist/esm/resources/db.js +120 -0
  78. package/dist/esm/resources/db.js.map +1 -0
  79. package/dist/esm/resources/emails.js +35 -0
  80. package/dist/esm/resources/emails.js.map +1 -0
  81. package/dist/esm/resources/fs.js +137 -0
  82. package/dist/esm/resources/fs.js.map +1 -0
  83. package/dist/esm/resources/functions.js +141 -0
  84. package/dist/esm/resources/functions.js.map +1 -0
  85. package/dist/esm/resources/inbox.js +70 -0
  86. package/dist/esm/resources/inbox.js.map +1 -0
  87. package/dist/esm/resources/payments.js +64 -0
  88. package/dist/esm/resources/payments.js.map +1 -0
  89. package/dist/esm/resources/postgrest.js +386 -0
  90. package/dist/esm/resources/postgrest.js.map +1 -0
  91. package/dist/esm/resources/projects.js +67 -0
  92. package/dist/esm/resources/projects.js.map +1 -0
  93. package/dist/esm/resources/storage.js +186 -0
  94. package/dist/esm/resources/storage.js.map +1 -0
  95. package/dist/esm/resources/tasks.js +95 -0
  96. package/dist/esm/resources/tasks.js.map +1 -0
  97. package/dist/esm/resources/video.js +46 -0
  98. package/dist/esm/resources/video.js.map +1 -0
  99. package/dist/esm/types.js +2 -0
  100. package/dist/esm/types.js.map +1 -0
  101. package/dist/types/auth/client.d.ts +272 -0
  102. package/dist/types/auth/client.d.ts.map +1 -0
  103. package/dist/types/auth/continuation.d.ts +10 -0
  104. package/dist/types/auth/continuation.d.ts.map +1 -0
  105. package/dist/types/auth/index.d.ts +2 -0
  106. package/dist/types/auth/index.d.ts.map +1 -0
  107. package/dist/types/auth/react.d.ts +140 -0
  108. package/dist/types/auth/react.d.ts.map +1 -0
  109. package/dist/types/auth/server.d.ts +124 -0
  110. package/dist/types/auth/server.d.ts.map +1 -0
  111. package/dist/types/client.d.ts +128 -0
  112. package/dist/types/client.d.ts.map +1 -0
  113. package/dist/types/errors.d.ts +17 -0
  114. package/dist/types/errors.d.ts.map +1 -0
  115. package/dist/types/index.d.ts +145 -0
  116. package/dist/types/index.d.ts.map +1 -0
  117. package/dist/types/query-cache.d.ts +59 -0
  118. package/dist/types/query-cache.d.ts.map +1 -0
  119. package/dist/types/resources/auth.d.ts +188 -0
  120. package/dist/types/resources/auth.d.ts.map +1 -0
  121. package/dist/types/resources/calls.d.ts +27 -0
  122. package/dist/types/resources/calls.d.ts.map +1 -0
  123. package/dist/types/resources/chat.d.ts +24 -0
  124. package/dist/types/resources/chat.d.ts.map +1 -0
  125. package/dist/types/resources/db.d.ts +81 -0
  126. package/dist/types/resources/db.d.ts.map +1 -0
  127. package/dist/types/resources/emails.d.ts +20 -0
  128. package/dist/types/resources/emails.d.ts.map +1 -0
  129. package/dist/types/resources/fs.d.ts +68 -0
  130. package/dist/types/resources/fs.d.ts.map +1 -0
  131. package/dist/types/resources/functions.d.ts +30 -0
  132. package/dist/types/resources/functions.d.ts.map +1 -0
  133. package/dist/types/resources/inbox.d.ts +52 -0
  134. package/dist/types/resources/inbox.d.ts.map +1 -0
  135. package/dist/types/resources/payments.d.ts +31 -0
  136. package/dist/types/resources/payments.d.ts.map +1 -0
  137. package/dist/types/resources/postgrest.d.ts +121 -0
  138. package/dist/types/resources/postgrest.d.ts.map +1 -0
  139. package/dist/types/resources/projects.d.ts +79 -0
  140. package/dist/types/resources/projects.d.ts.map +1 -0
  141. package/dist/types/resources/storage.d.ts +63 -0
  142. package/dist/types/resources/storage.d.ts.map +1 -0
  143. package/dist/types/resources/tasks.d.ts +87 -0
  144. package/dist/types/resources/tasks.d.ts.map +1 -0
  145. package/dist/types/resources/video.d.ts +30 -0
  146. package/dist/types/resources/video.d.ts.map +1 -0
  147. package/dist/types/types.d.ts +379 -0
  148. package/dist/types/types.d.ts.map +1 -0
  149. 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"}