@rebasepro/server 0.24.0 → 0.24.1-canary.g19596ef

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 (240) hide show
  1. package/README.md +27 -2
  2. package/dist/GCSStorageController-DEga1ULx.js +402 -0
  3. package/dist/GCSStorageController-DEga1ULx.js.map +1 -0
  4. package/dist/S3StorageController-Btx-6bJ5.js +480 -0
  5. package/dist/S3StorageController-Btx-6bJ5.js.map +1 -0
  6. package/dist/api/errors.d.ts +32 -0
  7. package/dist/api/live-schema-routes.d.ts +27 -3
  8. package/dist/api/mount-path.d.ts +30 -0
  9. package/dist/api/mount.d.ts +6 -13
  10. package/dist/api/rest/api-generator.d.ts +53 -1
  11. package/dist/api/rest/auth-collection-writes.d.ts +28 -21
  12. package/dist/api/rest/field-access-query.d.ts +28 -8
  13. package/dist/api/rest/field-ops.d.ts +19 -7
  14. package/dist/api/rest/query-body.d.ts +10 -0
  15. package/dist/api/rest/write-validation.d.ts +7 -5
  16. package/dist/api/schema-editor-routes.d.ts +10 -1
  17. package/dist/api/sql-export-routes.d.ts +8 -0
  18. package/dist/api/types.d.ts +35 -0
  19. package/dist/{ast-schema-editor-CWqS_sLJ.js → ast-schema-editor-mCeSC03x.js} +3 -3
  20. package/dist/{ast-schema-editor-CWqS_sLJ.js.map → ast-schema-editor-mCeSC03x.js.map} +1 -1
  21. package/dist/auth/access.d.ts +62 -11
  22. package/dist/auth/admin-user-ops.d.ts +24 -2
  23. package/dist/auth/admin-users-route.d.ts +1 -0
  24. package/dist/auth/api-keys/api-key-middleware.d.ts +10 -3
  25. package/dist/auth/api-keys/api-key-routes.d.ts +4 -1
  26. package/dist/auth/builtin-auth-adapter.d.ts +13 -0
  27. package/dist/auth/email-change-routes.d.ts +3 -0
  28. package/dist/auth/expired-token-sweep.d.ts +5 -1
  29. package/dist/auth/interfaces.d.ts +10 -0
  30. package/dist/auth/jwks-routes.d.ts +5 -1
  31. package/dist/auth/jwt-crypto.d.ts +7 -0
  32. package/dist/auth/jwt-keys.d.ts +4 -0
  33. package/dist/auth/jwt.d.ts +282 -166
  34. package/dist/auth/magic-link-routes.d.ts +3 -0
  35. package/dist/auth/mfa-crypto.d.ts +9 -3
  36. package/dist/auth/mfa-gate.d.ts +4 -2
  37. package/dist/auth/mfa-routes.d.ts +6 -0
  38. package/dist/auth/middleware.d.ts +9 -2
  39. package/dist/auth/otp-routes.d.ts +3 -0
  40. package/dist/auth/rate-limiter.d.ts +61 -34
  41. package/dist/auth/registration-policy.d.ts +17 -0
  42. package/dist/auth/require-auth.d.ts +1 -1
  43. package/dist/auth/routes.d.ts +16 -0
  44. package/dist/auth/session-routes.d.ts +6 -0
  45. package/dist/auth/token-revocation.d.ts +6 -0
  46. package/dist/auth/user-picking.d.ts +37 -0
  47. package/dist/auth/verify-credential.d.ts +25 -4
  48. package/dist/{auth-DMLngxn_.js → auth-CSBky1mt.js} +2927 -1882
  49. package/dist/auth-CSBky1mt.js.map +1 -0
  50. package/dist/auth_adapter-CIItCTc8.js +21 -0
  51. package/dist/auth_adapter-CIItCTc8.js.map +1 -0
  52. package/dist/backend/create-backend.d.ts +281 -0
  53. package/dist/backend/default-backend.d.ts +35 -0
  54. package/dist/backend/no-collections.d.ts +19 -0
  55. package/dist/backend/options.d.ts +912 -0
  56. package/dist/backend/scope.d.ts +23 -0
  57. package/dist/backend/services.d.ts +54 -0
  58. package/dist/backend-DTAOsLQc.js.map +1 -1
  59. package/dist/backup/backup-common.d.ts +14 -3
  60. package/dist/backup/backup-routes.d.ts +23 -2
  61. package/dist/backup/backup-storage.d.ts +3 -1
  62. package/dist/backup/index.d.ts +3 -1
  63. package/dist/{backup-CN0s50D2.js → backup-DBGRUVTS.js} +178 -37
  64. package/dist/backup-DBGRUVTS.js.map +1 -0
  65. package/dist/boot/boot.d.ts +2 -2
  66. package/dist/boot/driver.d.ts +3 -0
  67. package/dist/boot/env.d.ts +9 -2
  68. package/dist/boot/http-server.d.ts +22 -0
  69. package/dist/boot/options.d.ts +16 -1
  70. package/dist/boot/provision.d.ts +4 -2
  71. package/dist/boot/resource-adapters.d.ts +11 -14
  72. package/dist/boot/runtime-cors.d.ts +17 -0
  73. package/dist/boot/sources.d.ts +9 -0
  74. package/dist/boot/static-routing.d.ts +9 -0
  75. package/dist/{contract-routes-fz8i4pxs.js → contract-routes-DiFwiLg2.js} +5 -21
  76. package/dist/contract-routes-DiFwiLg2.js.map +1 -0
  77. package/dist/cron/cron-loader.d.ts +77 -18
  78. package/dist/cron/cron-routes.d.ts +1 -1
  79. package/dist/cron/cron-scheduler.d.ts +69 -3
  80. package/dist/cron/cron-store.d.ts +33 -5
  81. package/dist/cron/define-cron.d.ts +6 -2
  82. package/dist/cron/index.d.ts +3 -3
  83. package/dist/cron-loader-NHqRfKF0.js +202 -0
  84. package/dist/cron-loader-NHqRfKF0.js.map +1 -0
  85. package/dist/{cron-routes-Bc-SB0Se.js → cron-routes-DsH8Jwn5.js} +29 -6
  86. package/dist/cron-routes-DsH8Jwn5.js.map +1 -0
  87. package/dist/{cron-scheduler-CYQgco86.js → cron-scheduler-D1DT0nw5.js} +300 -34
  88. package/dist/cron-scheduler-D1DT0nw5.js.map +1 -0
  89. package/dist/cron-store-DEpVstUU.js +577 -0
  90. package/dist/cron-store-DEpVstUU.js.map +1 -0
  91. package/dist/{ddl-bootstrap-BaqMSa4Y.js → ddl-bootstrap-BNqi2NZe.js} +2 -2
  92. package/dist/{ddl-bootstrap-BaqMSa4Y.js.map → ddl-bootstrap-BNqi2NZe.js.map} +1 -1
  93. package/dist/email/smtp-email-service.d.ts +23 -0
  94. package/dist/email/types.d.ts +18 -0
  95. package/dist/env.d.ts +0 -37
  96. package/dist/{errors-D6_y86c5.js → errors-Cqp86KnA.js} +166 -7
  97. package/dist/errors-Cqp86KnA.js.map +1 -0
  98. package/dist/filter-dialect-O1HK6Nvr.js +1628 -0
  99. package/dist/filter-dialect-O1HK6Nvr.js.map +1 -0
  100. package/dist/{function-loader-D7o5Epjj.js → function-loader-DbCSoNJj.js} +69 -39
  101. package/dist/function-loader-DbCSoNJj.js.map +1 -0
  102. package/dist/{function-routes-CaNG4waN.js → function-routes-BSTClQNa.js} +6 -5
  103. package/dist/function-routes-BSTClQNa.js.map +1 -0
  104. package/dist/functions/context.d.ts +9 -0
  105. package/dist/functions/define-function.d.ts +10 -6
  106. package/dist/functions/function-loader.d.ts +75 -18
  107. package/dist/functions/function-routes.d.ts +2 -1
  108. package/dist/functions/index.d.ts +5 -4
  109. package/dist/functions/index.js +59 -15
  110. package/dist/functions/index.js.map +1 -1
  111. package/dist/functions/internal.d.ts +2 -2
  112. package/dist/functions/proxy.d.ts +6 -2
  113. package/dist/functions/request-timeout.d.ts +7 -5
  114. package/dist/history/history-routes.d.ts +9 -0
  115. package/dist/history/retention-sweep.d.ts +81 -0
  116. package/dist/{history-recorder-Nr8zLvoU.js → history-recorder-RZ1Ow4YY.js} +4 -4
  117. package/dist/{history-recorder-Nr8zLvoU.js.map → history-recorder-RZ1Ow4YY.js.map} +1 -1
  118. package/dist/{history-store-rcAm_xFR.js → history-store-DPofGVDp.js} +2 -2
  119. package/dist/{history-store-rcAm_xFR.js.map → history-store-DPofGVDp.js.map} +1 -1
  120. package/dist/index.d.ts +24 -11
  121. package/dist/index.es.js +24758 -20153
  122. package/dist/index.es.js.map +1 -1
  123. package/dist/init/docs.d.ts +35 -10
  124. package/dist/init/process-safety.d.ts +7 -2
  125. package/dist/init/shutdown.d.ts +18 -3
  126. package/dist/init.d.ts +49 -865
  127. package/dist/internal-tables-L2t39RdT.js +136 -0
  128. package/dist/internal-tables-L2t39RdT.js.map +1 -0
  129. package/dist/jobs/job-queue.d.ts +8 -0
  130. package/dist/jobs/job-store.d.ts +24 -0
  131. package/dist/jobs/types.d.ts +25 -4
  132. package/dist/{jobs-DqYNfquG.js → jobs-8G-_agld.js} +235 -25
  133. package/dist/jobs-8G-_agld.js.map +1 -0
  134. package/dist/{jwt-R6bSPMjk.js → jwt-CBaFc34Y.js} +530 -455
  135. package/dist/jwt-CBaFc34Y.js.map +1 -0
  136. package/dist/{keys-GAVZqbqx.js → keys-COzQ2aE8.js} +2 -2
  137. package/dist/{keys-GAVZqbqx.js.map → keys-COzQ2aE8.js.map} +1 -1
  138. package/dist/load-failure-L5hvfDoG.js +80 -0
  139. package/dist/load-failure-L5hvfDoG.js.map +1 -0
  140. package/dist/{logger-D-S-hO5e.js → logger-Bt32sHFw.js} +17 -4
  141. package/dist/logger-Bt32sHFw.js.map +1 -0
  142. package/dist/{logs-routes-DAdv37GI.js → logs-routes-DQJhrf-b.js} +3 -3
  143. package/dist/{logs-routes-DAdv37GI.js.map → logs-routes-DQJhrf-b.js.map} +1 -1
  144. package/dist/mcp/mcp-routes.d.ts +6 -0
  145. package/dist/mcp/mcp-tools.d.ts +8 -0
  146. package/dist/mcp/oauth-routes.d.ts +7 -0
  147. package/dist/metrics/index.d.ts +18 -0
  148. package/dist/metrics/pool-wait.d.ts +50 -0
  149. package/dist/offline-QNQgsPOq-B2yGeXkn.js +3305 -0
  150. package/dist/offline-QNQgsPOq-B2yGeXkn.js.map +1 -0
  151. package/dist/offline-store-Cm5sAX81-CALiO4Gn.js +1915 -0
  152. package/dist/offline-store-Cm5sAX81-CALiO4Gn.js.map +1 -0
  153. package/dist/{openapi-generator-DAq_XVDu.js → openapi-generator-CeGW2dLC.js} +366 -82
  154. package/dist/openapi-generator-CeGW2dLC.js.map +1 -0
  155. package/dist/policy-PdzX-Opd.js +121 -0
  156. package/dist/policy-PdzX-Opd.js.map +1 -0
  157. package/dist/project_manifest-R6y_KHms.js +59 -0
  158. package/dist/project_manifest-R6y_KHms.js.map +1 -0
  159. package/dist/{proxy-qRlqeUmO.js → proxy-BEKbsil6.js} +5 -4
  160. package/dist/proxy-BEKbsil6.js.map +1 -0
  161. package/dist/{query-parser-BgiKJKvc.js → query-parser-ECxP0nDw.js} +511 -16
  162. package/dist/query-parser-ECxP0nDw.js.map +1 -0
  163. package/dist/{request-timeout-DgH7j8qO.js → request-timeout-BiRelY-U.js} +17 -10
  164. package/dist/request-timeout-BiRelY-U.js.map +1 -0
  165. package/dist/resumable-upload-threshold-CKv-Ry0l.js +24 -0
  166. package/dist/resumable-upload-threshold-CKv-Ry0l.js.map +1 -0
  167. package/dist/schema-edit/apply-schema-change.d.ts +10 -0
  168. package/dist/schema-edit/local-source.d.ts +29 -0
  169. package/dist/schema-edit/remote-source.d.ts +13 -3
  170. package/dist/schema-edit/source-editor.d.ts +28 -0
  171. package/dist/{schema-editor-routes-oIyuWl3L.js → schema-editor-routes-DRXBAbZy.js} +55 -11
  172. package/dist/schema-editor-routes-DRXBAbZy.js.map +1 -0
  173. package/dist/services/outbound-post.d.ts +50 -0
  174. package/dist/services/outbound-url-guard.d.ts +34 -5
  175. package/dist/services/routed-realtime-service.d.ts +5 -0
  176. package/dist/services/webhook-service.d.ts +66 -14
  177. package/dist/singleton.d.ts +9 -5
  178. package/dist/soft-delete-params-CBryZXMq.js +668 -0
  179. package/dist/soft-delete-params-CBryZXMq.js.map +1 -0
  180. package/dist/sql-export-routes-D8ZaRvoR.js +240 -0
  181. package/dist/sql-export-routes-D8ZaRvoR.js.map +1 -0
  182. package/dist/{src-CatHFUym.js → src-D5Y3N-S4.js} +2 -1
  183. package/dist/{src-CatHFUym.js.map → src-D5Y3N-S4.js.map} +1 -1
  184. package/dist/storage/GCSStorageController.d.ts +46 -2
  185. package/dist/storage/LocalStorageController.d.ts +67 -2
  186. package/dist/storage/S3StorageController.d.ts +37 -3
  187. package/dist/storage/image-transform.d.ts +15 -0
  188. package/dist/storage/maintenance-routes.d.ts +23 -0
  189. package/dist/storage/maintenance.d.ts +126 -0
  190. package/dist/storage/rendition-cache.d.ts +9 -11
  191. package/dist/storage/request-principals.d.ts +30 -0
  192. package/dist/storage/routes.d.ts +20 -0
  193. package/dist/storage/source-variables.d.ts +10 -0
  194. package/dist/storage/streams.d.ts +42 -0
  195. package/dist/storage/tus-handler.d.ts +46 -2
  196. package/dist/storage/types.d.ts +82 -7
  197. package/dist/storage/upload-validation.d.ts +13 -0
  198. package/dist/storage-resumable-VO-cMpse-C_YX71pO.js +125 -0
  199. package/dist/storage-resumable-VO-cMpse-C_YX71pO.js.map +1 -0
  200. package/dist/strings.es-BeZWAodn.js +256 -0
  201. package/dist/strings.es-BeZWAodn.js.map +1 -0
  202. package/dist/upload-validation-CVobI5xO.js +172 -0
  203. package/dist/upload-validation-CVobI5xO.js.map +1 -0
  204. package/dist/utils/byte-size.d.ts +10 -0
  205. package/dist/utils/compression.d.ts +6 -0
  206. package/dist/utils/load-failure.d.ts +14 -0
  207. package/dist/utils/logger.d.ts +9 -0
  208. package/package.json +5 -5
  209. package/dist/GCSStorageController-BSiP1c-f.js +0 -256
  210. package/dist/GCSStorageController-BSiP1c-f.js.map +0 -1
  211. package/dist/S3StorageController-CAwFRgjV.js +0 -276
  212. package/dist/S3StorageController-CAwFRgjV.js.map +0 -1
  213. package/dist/auth-DMLngxn_.js.map +0 -1
  214. package/dist/backup-CN0s50D2.js.map +0 -1
  215. package/dist/contract-routes-fz8i4pxs.js.map +0 -1
  216. package/dist/cron-loader-CwaANlOG.js +0 -118
  217. package/dist/cron-loader-CwaANlOG.js.map +0 -1
  218. package/dist/cron-routes-Bc-SB0Se.js.map +0 -1
  219. package/dist/cron-scheduler-CYQgco86.js.map +0 -1
  220. package/dist/cron-store-D2Q9-Aco.js +0 -300
  221. package/dist/cron-store-D2Q9-Aco.js.map +0 -1
  222. package/dist/dynamic-import-X40pTZUQ.js +0 -23
  223. package/dist/dynamic-import-X40pTZUQ.js.map +0 -1
  224. package/dist/errors-D6_y86c5.js.map +0 -1
  225. package/dist/function-loader-D7o5Epjj.js.map +0 -1
  226. package/dist/function-routes-CaNG4waN.js.map +0 -1
  227. package/dist/jobs-DqYNfquG.js.map +0 -1
  228. package/dist/jwt-R6bSPMjk.js.map +0 -1
  229. package/dist/logger-D-S-hO5e.js.map +0 -1
  230. package/dist/openapi-generator-DAq_XVDu.js.map +0 -1
  231. package/dist/proxy-qRlqeUmO.js.map +0 -1
  232. package/dist/query-parser-BgiKJKvc.js.map +0 -1
  233. package/dist/request-timeout-DgH7j8qO.js.map +0 -1
  234. package/dist/schema-editor-routes-oIyuWl3L.js.map +0 -1
  235. package/dist/soft-delete-params-BWPilMPF.js +0 -59
  236. package/dist/soft-delete-params-BWPilMPF.js.map +0 -1
  237. package/dist/src-I3aG1PcY.js +0 -6870
  238. package/dist/src-I3aG1PcY.js.map +0 -1
  239. package/dist/types-BfKcm9do.js +0 -39
  240. package/dist/types-BfKcm9do.js.map +0 -1
@@ -96,13 +96,15 @@ var INSTANCE_SLOT = Symbol.for("@rebasepro/server:singleton-instance");
96
96
  * A *function* that answers "which client is this call for", for hosts where
97
97
  * one answer per process is the wrong shape.
98
98
  *
99
- * A Node server boots once and serves every request from the same client, so
100
- * {@link INSTANCE_SLOT} is the whole story. An isolate-based host is different
101
- * in a way that matters: the environment arrives attached to the **request**,
102
- * not to the module, so there is nothing to publish at import time, and an
103
- * isolate can be reused across requests that must not share state. Such a host
104
- * registers a resolver — typically reading an `AsyncLocalStorage` populated per
105
- * request — and it is consulted first.
99
+ * {@link INSTANCE_SLOT} is one answer per process: the default backend's. A
100
+ * Node process can hold several backends, and the code each one runs — a
101
+ * function, a cron job, a hook — must see that one, so the server registers a
102
+ * resolver reading the backend scope it enters per request (an
103
+ * `AsyncLocalStorage`, host-side, in `backend/scope.ts`). An isolate-based
104
+ * host is different in the same way: the environment arrives attached to the
105
+ * **request**, not to the module, so there is nothing to publish at import
106
+ * time, and an isolate can be reused across requests that must not share
107
+ * state. The resolver is consulted first.
106
108
  *
107
109
  * This exists now, before there is a host that needs it, because of what it
108
110
  * protects: `rebase` is a lazy Proxy, so every property access already goes
@@ -123,10 +125,13 @@ function getInstance() {
123
125
  return global[INSTANCE_SLOT] ?? null;
124
126
  }
125
127
  /**
126
- * The server-side Rebase singleton.
128
+ * The server-side Rebase client, as a module-level handle.
127
129
  *
128
- * Initialized automatically during server startup. Provides access to all
129
- * app-scoped services: **data**, **auth**, **storage**, and **email**.
130
+ * Inside a request, cron run or job a backend serves, it is that backend's
131
+ * client (`backend.rebase`) — so with two backends in one process, each one's
132
+ * functions see their own. Anywhere else it is the process default's, which
133
+ * `initializeRebaseBackend` (or `setDefaultBackend`) installs. Provides access
134
+ * to all app-scoped services: **data**, **auth**, **storage**, and **email**.
130
135
  *
131
136
  * **Admin data plane** (`rebase.dataAsAdmin`):
132
137
  * Backed by the native DataDriver — calls go directly to the database without
@@ -185,12 +190,25 @@ var rebase = new Proxy({}, {
185
190
  return instance[prop];
186
191
  },
187
192
  set(_, prop) {
188
- throw new Error(`Cannot set rebase.${String(prop)} directly. The singleton is read-only. Use _initRebase() during server startup.`);
193
+ throw new Error(`Cannot set rebase.${String(prop)} directly. The singleton is read-only. Install a backend with setDefaultBackend(backend), or use backend.rebase.`);
189
194
  }
190
195
  });
191
196
  //#endregion
192
197
  //#region src/functions/define-function.ts
193
198
  /**
199
+ * The `rebase` handle, seen through the `Database` a function names.
200
+ *
201
+ * One object serves every function; `DB` only describes it. It resolves, per
202
+ * call, to the backend serving the request — the same answer the imported
203
+ * `rebase` gives. Each collection accessor on `dataAsAdmin` is resolved by
204
+ * name at call time, so a generated `Database` adds compile-time checks and
205
+ * changes nothing the object does — the same reason the browser client's
206
+ * `createRebaseClient<Database>()` is one implementation for every `Database`.
207
+ */
208
+ function typedSingleton() {
209
+ return rebase;
210
+ }
211
+ /**
194
212
  * Typed authoring contract for a custom backend function.
195
213
  *
196
214
  * A custom function is a file in the `functionsDir` that default-exports a
@@ -227,7 +245,7 @@ var rebase = new Proxy({}, {
227
245
  */
228
246
  function defineFunction(definition) {
229
247
  const app = new Hono();
230
- const returned = definition(app, { rebase });
248
+ const returned = definition(app, { rebase: typedSingleton() });
231
249
  return returned instanceof Hono ? returned : app;
232
250
  }
233
251
  //#endregion
@@ -393,6 +411,17 @@ function getRequestId(c) {
393
411
  return read(c, "requestId");
394
412
  }
395
413
  /**
414
+ * The signal aborted when this request outlasts the functions timeout and is
415
+ * answered `504 FUNCTION_TIMEOUT`. Pass it to `fetch` and anything else that
416
+ * takes one, so the work stops with the request instead of running on after
417
+ * the caller was told it failed.
418
+ *
419
+ * Never aborts when the timeout is off, or outside the functions router.
420
+ */
421
+ function getSignal(c) {
422
+ return read(c, "functionSignal") ?? new AbortController().signal;
423
+ }
424
+ /**
396
425
  * Whether a Rebase auth middleware has run on this request.
397
426
  *
398
427
  * Both middlewares populate `driver` for *every* outcome, anonymous included,
@@ -686,6 +715,8 @@ function isProduction() {
686
715
  * not be undone, because the originals were gone.
687
716
  */
688
717
  var configuredLevel;
718
+ /** Every line to stderr, when a command's stdout is its result. See {@link setLogOutput}. */
719
+ var everyLineToStderr = false;
689
720
  function getMinLevel() {
690
721
  if (configuredLevel) return configuredLevel;
691
722
  const env = (hostEnv().LOG_LEVEL || "info").trim().toLowerCase();
@@ -907,13 +938,13 @@ function createLogger(rawDefaultFields = {}) {
907
938
  ...merged
908
939
  };
909
940
  const line = JSON.stringify(entry);
910
- if (level === "error") writeLine("err", line);
941
+ if (level === "error" || everyLineToStderr) writeLine("err", line);
911
942
  else writeLine("out", line);
912
943
  } else {
913
944
  const prefix = level === "error" ? "❌" : level === "warn" ? "⚠️" : level === "info" ? "ℹ️" : "🐛";
914
945
  const extra = Object.keys(merged).length > 0 ? ` ${JSON.stringify(merged)}` : "";
915
946
  const out = `${prefix} [${level.toUpperCase()}] ${safeMessage}${extra}`;
916
- if (level === "error") console.error(out);
947
+ if (level === "error" || everyLineToStderr) console.error(out);
917
948
  else if (level === "warn") console.warn(out);
918
949
  else console.log(out);
919
950
  }
@@ -1004,6 +1035,8 @@ function logBackgroundFailure(c, error) {
1004
1035
  }
1005
1036
  //#endregion
1006
1037
  //#region src/api/errors.ts
1038
+ /** What a caller is told when the database cannot be reached. Retryable, and not about them. */
1039
+ var DATABASE_UNAVAILABLE_MESSAGE = "The database could not be reached, so this request was not served. Retry shortly; if it keeps happening, the server's database is down or unreachable from it.";
1007
1040
  /**
1008
1041
  * Standardized API error class.
1009
1042
  * Throw this from any route handler — the errorHandler middleware
@@ -1076,8 +1109,19 @@ var ApiError = class ApiError extends Error {
1076
1109
  static serviceUnavailable(message, code = "SERVICE_UNAVAILABLE") {
1077
1110
  return new ApiError(503, code, message);
1078
1111
  }
1112
+ /**
1113
+ * `503 DATABASE_UNAVAILABLE`: the database could not be reached. What
1114
+ * every door answers then — the data API, sign-in, the admin routes and
1115
+ * the realtime socket — so a client sees one retryable answer, sent with
1116
+ * `Retry-After`, rather than a permission failure or a crash.
1117
+ *
1118
+ * @see isDatabaseUnreachable
1119
+ */
1120
+ static databaseUnavailable(message = DATABASE_UNAVAILABLE_MESSAGE) {
1121
+ return new ApiError(503, "DATABASE_UNAVAILABLE", message);
1122
+ }
1079
1123
  };
1080
1124
  //#endregion
1081
- export { ApiError, defineFunction, env, getApiKey, getDriver, getEnv, getRequestId, getRoles, getScopes, getUser, getUserId, hasRole, hasScope, identityResolved, isAdmin, isAuthenticated, isNodeRuntime, lazyResource, rebase, requireAdmin, requireAuth, requireDriver, requireEnv, requireRole, requireScope, runtimeKey, waitUntil };
1125
+ export { ApiError, defineFunction, env, getApiKey, getDriver, getEnv, getRequestId, getRoles, getScopes, getSignal, getUser, getUserId, hasRole, hasScope, identityResolved, isAdmin, isAuthenticated, isNodeRuntime, lazyResource, rebase, requireAdmin, requireAuth, requireDriver, requireEnv, requireRole, requireScope, runtimeKey, waitUntil };
1082
1126
 
1083
1127
  //# sourceMappingURL=index.js.map