@supacloud/lite 0.5.2 → 0.5.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.5.4](https://github.com/zuohuadong/supacloud/compare/supacloud-lite-v0.5.3...supacloud-lite-v0.5.4) (2026-08-02)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **lite:** await realtime listener shutdown ([797699b](https://github.com/zuohuadong/supacloud/commit/797699bcc8b0fcaafccf076acec3c8a49a7ee447))
9
+ * **lite:** ignore stale background timer callbacks ([004ba74](https://github.com/zuohuadong/supacloud/commit/004ba74bf3f7970377fc743368d45cf4b6837da4))
10
+ * **lite:** skip runtime services for utility commands ([050576e](https://github.com/zuohuadong/supacloud/commit/050576ebcf0a25a0ddd28db020eca759c2521753))
11
+
12
+ ## [0.5.3](https://github.com/zuohuadong/supacloud/compare/supacloud-lite-v0.5.2...supacloud-lite-v0.5.3) (2026-08-02)
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * **lite:** drain active background services before shutdown ([af0546d](https://github.com/zuohuadong/supacloud/commit/af0546d8b9cd15b21d61c8d953f9deed27dc9bff))
18
+
3
19
  ## [0.5.2](https://github.com/zuohuadong/supacloud/compare/supacloud-lite-v0.5.1...supacloud-lite-v0.5.2) (2026-07-30)
4
20
 
5
21
 
package/dist/cli.js CHANGED
@@ -8,7 +8,7 @@ import { dirname as dirname5, join as join9, resolve as resolve4 } from "path";
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "@supacloud/lite",
11
- version: "0.5.2",
11
+ version: "0.5.4",
12
12
  description: "Bun-native, single-project Supabase-compatible backend powered by PGlite",
13
13
  type: "module",
14
14
  license: "Apache-2.0",
@@ -3527,7 +3527,9 @@ class Database {
3527
3527
  schemaCache = new Map;
3528
3528
  fnCache = new Map;
3529
3529
  cdcListeners = new Set;
3530
- cdcStarted = false;
3530
+ cdcStarting = null;
3531
+ cdcStopping = null;
3532
+ cdcUnsubscribe = null;
3531
3533
  constructor(engine) {
3532
3534
  this.engine = engine;
3533
3535
  }
@@ -3774,17 +3776,54 @@ class Database {
3774
3776
  }
3775
3777
  async onCdcEvent(cb) {
3776
3778
  this.cdcListeners.add(cb);
3777
- if (!this.cdcStarted) {
3778
- this.cdcStarted = true;
3779
- await this.engine.listen("tinbase_cdc", (payload) => {
3780
- try {
3781
- const event = JSON.parse(payload);
3782
- for (const listener of this.cdcListeners)
3783
- listener(event);
3784
- } catch {}
3785
- });
3779
+ try {
3780
+ await this.startCdcListener();
3781
+ } catch (error) {
3782
+ this.cdcListeners.delete(cb);
3783
+ throw error;
3784
+ }
3785
+ return async () => {
3786
+ if (!this.cdcListeners.delete(cb) || this.cdcListeners.size > 0)
3787
+ return;
3788
+ await this.stopCdcListener();
3789
+ };
3790
+ }
3791
+ async startCdcListener() {
3792
+ if (this.cdcStopping)
3793
+ await this.cdcStopping;
3794
+ if (this.cdcUnsubscribe)
3795
+ return;
3796
+ const starting = this.cdcStarting ?? this.attachCdcListener();
3797
+ this.cdcStarting = starting;
3798
+ try {
3799
+ await starting;
3800
+ } finally {
3801
+ if (this.cdcStarting === starting)
3802
+ this.cdcStarting = null;
3803
+ }
3804
+ }
3805
+ async attachCdcListener() {
3806
+ this.cdcUnsubscribe = await this.engine.listen("tinbase_cdc", (payload) => {
3807
+ try {
3808
+ const event = JSON.parse(payload);
3809
+ for (const listener of this.cdcListeners)
3810
+ listener(event);
3811
+ } catch {}
3812
+ });
3813
+ }
3814
+ async stopCdcListener() {
3815
+ const unsubscribe = this.cdcUnsubscribe;
3816
+ if (!unsubscribe)
3817
+ return;
3818
+ this.cdcUnsubscribe = null;
3819
+ const stopping = Promise.resolve().then(unsubscribe);
3820
+ this.cdcStopping = stopping;
3821
+ try {
3822
+ await stopping;
3823
+ } finally {
3824
+ if (this.cdcStopping === stopping)
3825
+ this.cdcStopping = null;
3786
3826
  }
3787
- return () => this.cdcListeners.delete(cb);
3788
3827
  }
3789
3828
  get jsCdc() {
3790
3829
  return !!this.engine.minimalBootstrap;
@@ -3923,14 +3962,22 @@ class RealtimeEngine {
3923
3962
  } catch {}
3924
3963
  });
3925
3964
  }
3926
- stop() {
3927
- this.stopCdc?.();
3965
+ async stop() {
3966
+ const stopCdc = this.stopCdc;
3967
+ const stopDbBroadcast = this.stopDbBroadcast;
3928
3968
  this.stopCdc = null;
3929
- this.stopDbBroadcast?.();
3930
3969
  this.stopDbBroadcast = null;
3931
3970
  for (const conn of this.connections)
3932
3971
  conn.socket.close(1001, "server shutting down");
3933
3972
  this.connections.clear();
3973
+ const [cdcStop, broadcastStop] = await Promise.allSettled([
3974
+ Promise.resolve().then(() => stopCdc?.()),
3975
+ Promise.resolve().then(() => stopDbBroadcast?.())
3976
+ ]);
3977
+ if (cdcStop.status === "rejected")
3978
+ throw cdcStop.reason;
3979
+ if (broadcastStop.status === "rejected")
3980
+ throw broadcastStop.reason;
3934
3981
  }
3935
3982
  connect(socket, opts = {}) {
3936
3983
  const conn = { socket, channels: new Map, vsn: opts.vsn ?? "1.0.0" };
@@ -6950,7 +6997,7 @@ class NetService {
6950
6997
  tickMs;
6951
6998
  onDeliver;
6952
6999
  timer = null;
6953
- draining = false;
7000
+ timerGeneration = 0;
6954
7001
  inFlight = null;
6955
7002
  constructor(db, fetchImpl = fetch, tickMs = 500, onDeliver) {
6956
7003
  this.db = db;
@@ -6959,43 +7006,52 @@ class NetService {
6959
7006
  this.onDeliver = onDeliver;
6960
7007
  }
6961
7008
  start() {
6962
- if (this.timer)
7009
+ if (this.timer !== null)
6963
7010
  return;
6964
- this.timer = setInterval(() => {
6965
- this.inFlight = this.tick();
7011
+ const generation = ++this.timerGeneration;
7012
+ let timer;
7013
+ timer = setInterval(() => {
7014
+ if (this.timer === timer && this.timerGeneration === generation)
7015
+ this.tick();
6966
7016
  }, this.tickMs);
6967
- if (typeof this.timer === "object" && "unref" in this.timer)
6968
- this.timer.unref();
7017
+ this.timer = timer;
7018
+ if (typeof timer === "object" && "unref" in timer)
7019
+ timer.unref();
6969
7020
  }
6970
7021
  async stop() {
6971
- if (this.timer)
6972
- clearInterval(this.timer);
7022
+ const timer = this.timer;
6973
7023
  this.timer = null;
6974
- await this.inFlight?.catch(() => {});
6975
- this.inFlight = null;
7024
+ this.timerGeneration += 1;
7025
+ if (timer !== null)
7026
+ clearInterval(timer);
7027
+ const inFlight = this.inFlight;
7028
+ await inFlight?.catch(() => {});
7029
+ }
7030
+ tick() {
7031
+ if (this.inFlight)
7032
+ return this.inFlight;
7033
+ const inFlight = Promise.resolve().then(() => this.drainQueue()).finally(() => {
7034
+ if (this.inFlight === inFlight)
7035
+ this.inFlight = null;
7036
+ });
7037
+ this.inFlight = inFlight;
7038
+ return inFlight;
6976
7039
  }
6977
- async tick() {
6978
- if (this.draining)
6979
- return;
6980
- this.draining = true;
7040
+ async drainQueue() {
7041
+ let rows;
6981
7042
  try {
6982
- let rows;
7043
+ rows = (await this.db.query(`select id, method, url, headers, body, timeout_milliseconds from net.http_request_queue order by id limit 20`)).rows;
7044
+ } catch {
7045
+ return;
7046
+ }
7047
+ for (const row of rows) {
6983
7048
  try {
6984
- rows = (await this.db.query(`select id, method, url, headers, body, timeout_milliseconds from net.http_request_queue order by id limit 20`)).rows;
6985
- } catch {
6986
- return;
6987
- }
6988
- for (const row of rows) {
6989
- try {
6990
- await this.deliver(row);
6991
- } catch (e) {
6992
- const msg = e instanceof Error ? e.message : String(e);
6993
- await this.record(row.id, null, null, null, null, false, msg);
6994
- this.onDeliver?.({ id: row.id, method: row.method, url: row.url, timedOut: false, error: msg });
6995
- }
7049
+ await this.deliver(row);
7050
+ } catch (e) {
7051
+ const msg = e instanceof Error ? e.message : String(e);
7052
+ await this.record(row.id, null, null, null, null, false, msg);
7053
+ this.onDeliver?.({ id: row.id, method: row.method, url: row.url, timedOut: false, error: msg });
6996
7054
  }
6997
- } finally {
6998
- this.draining = false;
6999
7055
  }
7000
7056
  }
7001
7057
  async deliver(row) {
@@ -7108,10 +7164,11 @@ class WebhooksService {
7108
7164
  this.started = true;
7109
7165
  this.stop = await this.db.onCdcEvent((e) => this.dispatch(e));
7110
7166
  }
7111
- stopService() {
7112
- this.stop?.();
7167
+ async stopService() {
7168
+ const stop = this.stop;
7113
7169
  this.stop = null;
7114
7170
  this.started = false;
7171
+ await stop?.();
7115
7172
  }
7116
7173
  dispatch(event) {
7117
7174
  for (const hook of this.hooks) {
@@ -7164,6 +7221,7 @@ class CronService {
7164
7221
  tickMs;
7165
7222
  now;
7166
7223
  timer = null;
7224
+ timerGeneration = 0;
7167
7225
  lastRun = new Map;
7168
7226
  lastMinute = new Map;
7169
7227
  inFlight = null;
@@ -7173,22 +7231,38 @@ class CronService {
7173
7231
  this.now = now;
7174
7232
  }
7175
7233
  start() {
7176
- if (this.timer)
7234
+ if (this.timer !== null)
7177
7235
  return;
7178
- this.timer = setInterval(() => {
7179
- this.inFlight = this.tick();
7236
+ const generation = ++this.timerGeneration;
7237
+ let timer;
7238
+ timer = setInterval(() => {
7239
+ if (this.timer === timer && this.timerGeneration === generation)
7240
+ this.tick();
7180
7241
  }, this.tickMs);
7181
- if (typeof this.timer === "object" && "unref" in this.timer)
7182
- this.timer.unref();
7242
+ this.timer = timer;
7243
+ if (typeof timer === "object" && "unref" in timer)
7244
+ timer.unref();
7183
7245
  }
7184
7246
  async stop() {
7185
- if (this.timer)
7186
- clearInterval(this.timer);
7247
+ const timer = this.timer;
7187
7248
  this.timer = null;
7188
- await this.inFlight?.catch(() => {});
7189
- this.inFlight = null;
7249
+ this.timerGeneration += 1;
7250
+ if (timer !== null)
7251
+ clearInterval(timer);
7252
+ const inFlight = this.inFlight;
7253
+ await inFlight?.catch(() => {});
7254
+ }
7255
+ tick() {
7256
+ if (this.inFlight)
7257
+ return this.inFlight;
7258
+ const inFlight = Promise.resolve().then(() => this.runTick()).finally(() => {
7259
+ if (this.inFlight === inFlight)
7260
+ this.inFlight = null;
7261
+ });
7262
+ this.inFlight = inFlight;
7263
+ return inFlight;
7190
7264
  }
7191
- async tick() {
7265
+ async runTick() {
7192
7266
  let jobs;
7193
7267
  try {
7194
7268
  jobs = (await this.db.query(`select jobid, schedule, command, jobname, active from cron.job where active`)).rows;
@@ -7293,7 +7367,8 @@ class RetentionService {
7293
7367
  db;
7294
7368
  now;
7295
7369
  timer = null;
7296
- inFlight = Promise.resolve();
7370
+ timerGeneration = 0;
7371
+ inFlight = null;
7297
7372
  intervalMs;
7298
7373
  auditLogDays;
7299
7374
  refreshTokenDays;
@@ -7305,22 +7380,39 @@ class RetentionService {
7305
7380
  this.refreshTokenDays = config.refreshTokenDays ?? 30;
7306
7381
  }
7307
7382
  start() {
7308
- if (this.timer)
7383
+ if (this.timer !== null)
7309
7384
  return;
7310
- this.inFlight = this.sweep();
7311
- this.timer = setInterval(() => {
7312
- this.inFlight = this.sweep();
7385
+ this.sweep();
7386
+ const generation = ++this.timerGeneration;
7387
+ let timer;
7388
+ timer = setInterval(() => {
7389
+ if (this.timer === timer && this.timerGeneration === generation)
7390
+ this.sweep();
7313
7391
  }, this.intervalMs);
7314
- if (typeof this.timer === "object" && "unref" in this.timer)
7315
- this.timer.unref();
7392
+ this.timer = timer;
7393
+ if (typeof timer === "object" && "unref" in timer)
7394
+ timer.unref();
7316
7395
  }
7317
7396
  async stop() {
7318
- if (this.timer)
7319
- clearInterval(this.timer);
7397
+ const timer = this.timer;
7320
7398
  this.timer = null;
7321
- await this.inFlight.catch(() => {});
7399
+ this.timerGeneration += 1;
7400
+ if (timer !== null)
7401
+ clearInterval(timer);
7402
+ const inFlight = this.inFlight;
7403
+ await inFlight?.catch(() => {});
7404
+ }
7405
+ sweep() {
7406
+ if (this.inFlight)
7407
+ return this.inFlight;
7408
+ const inFlight = Promise.resolve().then(() => this.runSweep()).finally(() => {
7409
+ if (this.inFlight === inFlight)
7410
+ this.inFlight = null;
7411
+ });
7412
+ this.inFlight = inFlight;
7413
+ return inFlight;
7322
7414
  }
7323
- async sweep() {
7415
+ async runSweep() {
7324
7416
  const now = this.now();
7325
7417
  await this.run(`delete from auth.one_time_tokens where expires_at < now()`);
7326
7418
  await this.run(`delete from auth.mfa_challenges where expires_at < now()`);
@@ -7853,20 +7945,22 @@ ${msg.text}` : `[mail] to=${msg.to} subject="${msg.subject}"`));
7853
7945
  const cron = new CronService(db);
7854
7946
  const retention = new RetentionService(db, config.retention);
7855
7947
  const net = new NetService(db, config.netFetch, undefined, (d) => log(`[net] ${d.method} ${d.url} -> ${d.timedOut ? "TIMEOUT" : d.error ? "FAILED " + d.error : d.status}`));
7856
- try {
7857
- await realtime.start();
7858
- cleanup.push(() => realtime.stop());
7859
- if (config.webhooks?.length)
7860
- await webhooks.start(config.webhooks);
7861
- cleanup.push(() => webhooks.stopService());
7862
- cron.start();
7863
- cleanup.push(() => cron.stop());
7864
- retention.start();
7865
- cleanup.push(() => retention.stop());
7866
- net.start();
7867
- cleanup.push(() => net.stop());
7868
- } catch (e) {
7869
- await failStartup(e);
7948
+ if (config.startRuntimeServices !== false) {
7949
+ try {
7950
+ await realtime.start();
7951
+ cleanup.push(() => realtime.stop());
7952
+ if (config.webhooks?.length)
7953
+ await webhooks.start(config.webhooks);
7954
+ cleanup.push(() => webhooks.stopService());
7955
+ cron.start();
7956
+ cleanup.push(() => cron.stop());
7957
+ retention.start();
7958
+ cleanup.push(() => retention.stop());
7959
+ net.start();
7960
+ cleanup.push(() => net.stop());
7961
+ } catch (e) {
7962
+ await failStartup(e);
7963
+ }
7870
7964
  }
7871
7965
  const fnMap = config.functions instanceof Map ? config.functions : new Map(Object.entries(config.functions ?? {}));
7872
7966
  const fnEnv = {
@@ -8061,7 +8155,8 @@ async function computeDbDiff(opts) {
8061
8155
  const schema = opts.schema ?? "public";
8062
8156
  const shadow = await createBackend({
8063
8157
  engine: opts.makeShadowEngine ? await opts.makeShadowEngine() : undefined,
8064
- migrations: opts.migrations
8158
+ migrations: opts.migrations,
8159
+ startRuntimeServices: false
8065
8160
  });
8066
8161
  let live;
8067
8162
  let operationFailed = false;
@@ -8069,7 +8164,8 @@ async function computeDbDiff(opts) {
8069
8164
  live = await createBackend({
8070
8165
  engine: opts.liveEngine,
8071
8166
  dataDir: opts.liveEngine ? undefined : opts.liveDataDir,
8072
- migrations: opts.migrations
8167
+ migrations: opts.migrations,
8168
+ startRuntimeServices: false
8073
8169
  });
8074
8170
  const shadowSnap = await snapshotSchema(shadow.db, schema);
8075
8171
  const liveSnap = await snapshotSchema(live.db, schema);
@@ -8090,7 +8186,8 @@ async function pullSchema(opts) {
8090
8186
  const schema = opts.schema ?? "public";
8091
8187
  const shadow = await createBackend({
8092
8188
  engine: opts.makeShadowEngine ? await opts.makeShadowEngine() : undefined,
8093
- migrations: opts.migrations
8189
+ migrations: opts.migrations,
8190
+ startRuntimeServices: false
8094
8191
  });
8095
8192
  let live;
8096
8193
  let operationFailed = false;
@@ -8098,7 +8195,8 @@ async function pullSchema(opts) {
8098
8195
  live = await createBackend({
8099
8196
  engine: opts.liveEngine,
8100
8197
  dataDir: opts.liveEngine ? undefined : opts.liveDataDir,
8101
- migrations: opts.migrations
8198
+ migrations: opts.migrations,
8199
+ startRuntimeServices: false
8102
8200
  });
8103
8201
  const ddl = diffSchemas(await snapshotSchema(shadow.db, schema), await snapshotSchema(live.db, schema), schema);
8104
8202
  if (ddl.length === 0)
@@ -9068,6 +9166,7 @@ async function createProjectBackend(options = {}) {
9068
9166
  functionVerifyJwt: Object.fromEntries(Object.entries(config.functions).map(([name, functionOptions]) => [name, functionOptions.verifyJwt !== false])),
9069
9167
  functionEnv,
9070
9168
  webhooks,
9169
+ startRuntimeServices: options.startRuntimeServices,
9071
9170
  storageDriver: options.storageDriver ?? createStorageDriver(configuredStorageBackend, paths.storageDir, options.s3),
9072
9171
  log: options.log
9073
9172
  });
@@ -9103,7 +9202,7 @@ function createStorageDriver(backend, storageDir, s3Options) {
9103
9202
  }
9104
9203
  async function startProjectServer(options = {}) {
9105
9204
  const resolvedOptions = options.port === 0 ? { ...options, port: await findEphemeralPort(options.host) } : options;
9106
- const project = await createProjectBackend(resolvedOptions);
9205
+ const project = await createProjectBackend({ ...resolvedOptions, startRuntimeServices: true });
9107
9206
  try {
9108
9207
  const server = await serveBun(project.backend, { host: project.host, port: project.port });
9109
9208
  let closePromise = null;
@@ -9688,7 +9787,13 @@ Use --service-role to print the privileged key.`);
9688
9787
  if (options.positionals[0] && options.positionals[0] !== "types" && options.positionals[0] !== "typescript") {
9689
9788
  throw new Error(`unknown gen subcommand: ${options.positionals[0]}`);
9690
9789
  }
9691
- const project2 = await createProjectBackend({ ...options, includeFunctions: false, includeWebhooks: false, log: quietLog });
9790
+ const project2 = await createProjectBackend({
9791
+ ...options,
9792
+ includeFunctions: false,
9793
+ includeWebhooks: false,
9794
+ startRuntimeServices: false,
9795
+ log: quietLog
9796
+ });
9692
9797
  try {
9693
9798
  const source = await generateTypes(project2.backend.db, "public");
9694
9799
  if (options.output) {
@@ -9703,7 +9808,13 @@ Use --service-role to print the privileged key.`);
9703
9808
  return;
9704
9809
  }
9705
9810
  if (options.command === "inspect") {
9706
- const project2 = await createProjectBackend({ ...options, includeFunctions: false, includeWebhooks: false, log: quietLog });
9811
+ const project2 = await createProjectBackend({
9812
+ ...options,
9813
+ includeFunctions: false,
9814
+ includeWebhooks: false,
9815
+ startRuntimeServices: false,
9816
+ log: quietLog
9817
+ });
9707
9818
  try {
9708
9819
  printInspection(await inspectDb(project2.backend.db, "public"));
9709
9820
  } finally {
@@ -9718,6 +9829,7 @@ Use --service-role to print the privileged key.`);
9718
9829
  includeFunctions: false,
9719
9830
  includeWebhooks: false,
9720
9831
  includeSeed: options.command === "migrate",
9832
+ startRuntimeServices: false,
9721
9833
  log: quietLog
9722
9834
  });
9723
9835
  try {
@@ -9765,7 +9877,13 @@ async function runDbCommand(options) {
9765
9877
  if (paths.dataDir)
9766
9878
  await rm4(paths.dataDir, { recursive: true, force: true });
9767
9879
  await rm4(paths.storageDir, { recursive: true, force: true });
9768
- const project2 = await createProjectBackend({ ...options, includeFunctions: false, includeWebhooks: false, log: quietLog });
9880
+ const project2 = await createProjectBackend({
9881
+ ...options,
9882
+ includeFunctions: false,
9883
+ includeWebhooks: false,
9884
+ startRuntimeServices: false,
9885
+ log: quietLog
9886
+ });
9769
9887
  try {
9770
9888
  const applied = await project2.backend.db.listAppliedMigrations();
9771
9889
  console.log(`reset complete: ${applied.length} migration(s) applied`);
@@ -9855,6 +9973,7 @@ async function runUpgradeCommand(options) {
9855
9973
  includeFunctions: false,
9856
9974
  includeWebhooks: false,
9857
9975
  includeSeed: true,
9976
+ startRuntimeServices: false,
9858
9977
  log: quietLog
9859
9978
  });
9860
9979
  try {
package/dist/index.js CHANGED
@@ -71,7 +71,7 @@ function randomToken(bytes = 32) {
71
71
  // package.json
72
72
  var package_default = {
73
73
  name: "@supacloud/lite",
74
- version: "0.5.2",
74
+ version: "0.5.4",
75
75
  description: "Bun-native, single-project Supabase-compatible backend powered by PGlite",
76
76
  type: "module",
77
77
  license: "Apache-2.0",
@@ -3532,7 +3532,9 @@ class Database {
3532
3532
  schemaCache = new Map;
3533
3533
  fnCache = new Map;
3534
3534
  cdcListeners = new Set;
3535
- cdcStarted = false;
3535
+ cdcStarting = null;
3536
+ cdcStopping = null;
3537
+ cdcUnsubscribe = null;
3536
3538
  constructor(engine) {
3537
3539
  this.engine = engine;
3538
3540
  }
@@ -3779,17 +3781,54 @@ class Database {
3779
3781
  }
3780
3782
  async onCdcEvent(cb) {
3781
3783
  this.cdcListeners.add(cb);
3782
- if (!this.cdcStarted) {
3783
- this.cdcStarted = true;
3784
- await this.engine.listen("tinbase_cdc", (payload) => {
3785
- try {
3786
- const event = JSON.parse(payload);
3787
- for (const listener of this.cdcListeners)
3788
- listener(event);
3789
- } catch {}
3790
- });
3784
+ try {
3785
+ await this.startCdcListener();
3786
+ } catch (error) {
3787
+ this.cdcListeners.delete(cb);
3788
+ throw error;
3789
+ }
3790
+ return async () => {
3791
+ if (!this.cdcListeners.delete(cb) || this.cdcListeners.size > 0)
3792
+ return;
3793
+ await this.stopCdcListener();
3794
+ };
3795
+ }
3796
+ async startCdcListener() {
3797
+ if (this.cdcStopping)
3798
+ await this.cdcStopping;
3799
+ if (this.cdcUnsubscribe)
3800
+ return;
3801
+ const starting = this.cdcStarting ?? this.attachCdcListener();
3802
+ this.cdcStarting = starting;
3803
+ try {
3804
+ await starting;
3805
+ } finally {
3806
+ if (this.cdcStarting === starting)
3807
+ this.cdcStarting = null;
3808
+ }
3809
+ }
3810
+ async attachCdcListener() {
3811
+ this.cdcUnsubscribe = await this.engine.listen("tinbase_cdc", (payload) => {
3812
+ try {
3813
+ const event = JSON.parse(payload);
3814
+ for (const listener of this.cdcListeners)
3815
+ listener(event);
3816
+ } catch {}
3817
+ });
3818
+ }
3819
+ async stopCdcListener() {
3820
+ const unsubscribe = this.cdcUnsubscribe;
3821
+ if (!unsubscribe)
3822
+ return;
3823
+ this.cdcUnsubscribe = null;
3824
+ const stopping = Promise.resolve().then(unsubscribe);
3825
+ this.cdcStopping = stopping;
3826
+ try {
3827
+ await stopping;
3828
+ } finally {
3829
+ if (this.cdcStopping === stopping)
3830
+ this.cdcStopping = null;
3791
3831
  }
3792
- return () => this.cdcListeners.delete(cb);
3793
3832
  }
3794
3833
  get jsCdc() {
3795
3834
  return !!this.engine.minimalBootstrap;
@@ -3928,14 +3967,22 @@ class RealtimeEngine {
3928
3967
  } catch {}
3929
3968
  });
3930
3969
  }
3931
- stop() {
3932
- this.stopCdc?.();
3970
+ async stop() {
3971
+ const stopCdc = this.stopCdc;
3972
+ const stopDbBroadcast = this.stopDbBroadcast;
3933
3973
  this.stopCdc = null;
3934
- this.stopDbBroadcast?.();
3935
3974
  this.stopDbBroadcast = null;
3936
3975
  for (const conn of this.connections)
3937
3976
  conn.socket.close(1001, "server shutting down");
3938
3977
  this.connections.clear();
3978
+ const [cdcStop, broadcastStop] = await Promise.allSettled([
3979
+ Promise.resolve().then(() => stopCdc?.()),
3980
+ Promise.resolve().then(() => stopDbBroadcast?.())
3981
+ ]);
3982
+ if (cdcStop.status === "rejected")
3983
+ throw cdcStop.reason;
3984
+ if (broadcastStop.status === "rejected")
3985
+ throw broadcastStop.reason;
3939
3986
  }
3940
3987
  connect(socket, opts = {}) {
3941
3988
  const conn = { socket, channels: new Map, vsn: opts.vsn ?? "1.0.0" };
@@ -6955,7 +7002,7 @@ class NetService {
6955
7002
  tickMs;
6956
7003
  onDeliver;
6957
7004
  timer = null;
6958
- draining = false;
7005
+ timerGeneration = 0;
6959
7006
  inFlight = null;
6960
7007
  constructor(db, fetchImpl = fetch, tickMs = 500, onDeliver) {
6961
7008
  this.db = db;
@@ -6964,43 +7011,52 @@ class NetService {
6964
7011
  this.onDeliver = onDeliver;
6965
7012
  }
6966
7013
  start() {
6967
- if (this.timer)
7014
+ if (this.timer !== null)
6968
7015
  return;
6969
- this.timer = setInterval(() => {
6970
- this.inFlight = this.tick();
7016
+ const generation = ++this.timerGeneration;
7017
+ let timer;
7018
+ timer = setInterval(() => {
7019
+ if (this.timer === timer && this.timerGeneration === generation)
7020
+ this.tick();
6971
7021
  }, this.tickMs);
6972
- if (typeof this.timer === "object" && "unref" in this.timer)
6973
- this.timer.unref();
7022
+ this.timer = timer;
7023
+ if (typeof timer === "object" && "unref" in timer)
7024
+ timer.unref();
6974
7025
  }
6975
7026
  async stop() {
6976
- if (this.timer)
6977
- clearInterval(this.timer);
7027
+ const timer = this.timer;
6978
7028
  this.timer = null;
6979
- await this.inFlight?.catch(() => {});
6980
- this.inFlight = null;
7029
+ this.timerGeneration += 1;
7030
+ if (timer !== null)
7031
+ clearInterval(timer);
7032
+ const inFlight = this.inFlight;
7033
+ await inFlight?.catch(() => {});
7034
+ }
7035
+ tick() {
7036
+ if (this.inFlight)
7037
+ return this.inFlight;
7038
+ const inFlight = Promise.resolve().then(() => this.drainQueue()).finally(() => {
7039
+ if (this.inFlight === inFlight)
7040
+ this.inFlight = null;
7041
+ });
7042
+ this.inFlight = inFlight;
7043
+ return inFlight;
6981
7044
  }
6982
- async tick() {
6983
- if (this.draining)
6984
- return;
6985
- this.draining = true;
7045
+ async drainQueue() {
7046
+ let rows;
6986
7047
  try {
6987
- let rows;
7048
+ rows = (await this.db.query(`select id, method, url, headers, body, timeout_milliseconds from net.http_request_queue order by id limit 20`)).rows;
7049
+ } catch {
7050
+ return;
7051
+ }
7052
+ for (const row of rows) {
6988
7053
  try {
6989
- rows = (await this.db.query(`select id, method, url, headers, body, timeout_milliseconds from net.http_request_queue order by id limit 20`)).rows;
6990
- } catch {
6991
- return;
6992
- }
6993
- for (const row of rows) {
6994
- try {
6995
- await this.deliver(row);
6996
- } catch (e) {
6997
- const msg = e instanceof Error ? e.message : String(e);
6998
- await this.record(row.id, null, null, null, null, false, msg);
6999
- this.onDeliver?.({ id: row.id, method: row.method, url: row.url, timedOut: false, error: msg });
7000
- }
7054
+ await this.deliver(row);
7055
+ } catch (e) {
7056
+ const msg = e instanceof Error ? e.message : String(e);
7057
+ await this.record(row.id, null, null, null, null, false, msg);
7058
+ this.onDeliver?.({ id: row.id, method: row.method, url: row.url, timedOut: false, error: msg });
7001
7059
  }
7002
- } finally {
7003
- this.draining = false;
7004
7060
  }
7005
7061
  }
7006
7062
  async deliver(row) {
@@ -7113,10 +7169,11 @@ class WebhooksService {
7113
7169
  this.started = true;
7114
7170
  this.stop = await this.db.onCdcEvent((e) => this.dispatch(e));
7115
7171
  }
7116
- stopService() {
7117
- this.stop?.();
7172
+ async stopService() {
7173
+ const stop = this.stop;
7118
7174
  this.stop = null;
7119
7175
  this.started = false;
7176
+ await stop?.();
7120
7177
  }
7121
7178
  dispatch(event) {
7122
7179
  for (const hook of this.hooks) {
@@ -7169,6 +7226,7 @@ class CronService {
7169
7226
  tickMs;
7170
7227
  now;
7171
7228
  timer = null;
7229
+ timerGeneration = 0;
7172
7230
  lastRun = new Map;
7173
7231
  lastMinute = new Map;
7174
7232
  inFlight = null;
@@ -7178,22 +7236,38 @@ class CronService {
7178
7236
  this.now = now;
7179
7237
  }
7180
7238
  start() {
7181
- if (this.timer)
7239
+ if (this.timer !== null)
7182
7240
  return;
7183
- this.timer = setInterval(() => {
7184
- this.inFlight = this.tick();
7241
+ const generation = ++this.timerGeneration;
7242
+ let timer;
7243
+ timer = setInterval(() => {
7244
+ if (this.timer === timer && this.timerGeneration === generation)
7245
+ this.tick();
7185
7246
  }, this.tickMs);
7186
- if (typeof this.timer === "object" && "unref" in this.timer)
7187
- this.timer.unref();
7247
+ this.timer = timer;
7248
+ if (typeof timer === "object" && "unref" in timer)
7249
+ timer.unref();
7188
7250
  }
7189
7251
  async stop() {
7190
- if (this.timer)
7191
- clearInterval(this.timer);
7252
+ const timer = this.timer;
7192
7253
  this.timer = null;
7193
- await this.inFlight?.catch(() => {});
7194
- this.inFlight = null;
7254
+ this.timerGeneration += 1;
7255
+ if (timer !== null)
7256
+ clearInterval(timer);
7257
+ const inFlight = this.inFlight;
7258
+ await inFlight?.catch(() => {});
7259
+ }
7260
+ tick() {
7261
+ if (this.inFlight)
7262
+ return this.inFlight;
7263
+ const inFlight = Promise.resolve().then(() => this.runTick()).finally(() => {
7264
+ if (this.inFlight === inFlight)
7265
+ this.inFlight = null;
7266
+ });
7267
+ this.inFlight = inFlight;
7268
+ return inFlight;
7195
7269
  }
7196
- async tick() {
7270
+ async runTick() {
7197
7271
  let jobs;
7198
7272
  try {
7199
7273
  jobs = (await this.db.query(`select jobid, schedule, command, jobname, active from cron.job where active`)).rows;
@@ -7298,7 +7372,8 @@ class RetentionService {
7298
7372
  db;
7299
7373
  now;
7300
7374
  timer = null;
7301
- inFlight = Promise.resolve();
7375
+ timerGeneration = 0;
7376
+ inFlight = null;
7302
7377
  intervalMs;
7303
7378
  auditLogDays;
7304
7379
  refreshTokenDays;
@@ -7310,22 +7385,39 @@ class RetentionService {
7310
7385
  this.refreshTokenDays = config.refreshTokenDays ?? 30;
7311
7386
  }
7312
7387
  start() {
7313
- if (this.timer)
7388
+ if (this.timer !== null)
7314
7389
  return;
7315
- this.inFlight = this.sweep();
7316
- this.timer = setInterval(() => {
7317
- this.inFlight = this.sweep();
7390
+ this.sweep();
7391
+ const generation = ++this.timerGeneration;
7392
+ let timer;
7393
+ timer = setInterval(() => {
7394
+ if (this.timer === timer && this.timerGeneration === generation)
7395
+ this.sweep();
7318
7396
  }, this.intervalMs);
7319
- if (typeof this.timer === "object" && "unref" in this.timer)
7320
- this.timer.unref();
7397
+ this.timer = timer;
7398
+ if (typeof timer === "object" && "unref" in timer)
7399
+ timer.unref();
7321
7400
  }
7322
7401
  async stop() {
7323
- if (this.timer)
7324
- clearInterval(this.timer);
7402
+ const timer = this.timer;
7325
7403
  this.timer = null;
7326
- await this.inFlight.catch(() => {});
7404
+ this.timerGeneration += 1;
7405
+ if (timer !== null)
7406
+ clearInterval(timer);
7407
+ const inFlight = this.inFlight;
7408
+ await inFlight?.catch(() => {});
7409
+ }
7410
+ sweep() {
7411
+ if (this.inFlight)
7412
+ return this.inFlight;
7413
+ const inFlight = Promise.resolve().then(() => this.runSweep()).finally(() => {
7414
+ if (this.inFlight === inFlight)
7415
+ this.inFlight = null;
7416
+ });
7417
+ this.inFlight = inFlight;
7418
+ return inFlight;
7327
7419
  }
7328
- async sweep() {
7420
+ async runSweep() {
7329
7421
  const now = this.now();
7330
7422
  await this.run(`delete from auth.one_time_tokens where expires_at < now()`);
7331
7423
  await this.run(`delete from auth.mfa_challenges where expires_at < now()`);
@@ -7697,20 +7789,22 @@ ${msg.text}` : `[mail] to=${msg.to} subject="${msg.subject}"`));
7697
7789
  const cron = new CronService(db);
7698
7790
  const retention = new RetentionService(db, config.retention);
7699
7791
  const net = new NetService(db, config.netFetch, undefined, (d) => log(`[net] ${d.method} ${d.url} -> ${d.timedOut ? "TIMEOUT" : d.error ? "FAILED " + d.error : d.status}`));
7700
- try {
7701
- await realtime.start();
7702
- cleanup.push(() => realtime.stop());
7703
- if (config.webhooks?.length)
7704
- await webhooks.start(config.webhooks);
7705
- cleanup.push(() => webhooks.stopService());
7706
- cron.start();
7707
- cleanup.push(() => cron.stop());
7708
- retention.start();
7709
- cleanup.push(() => retention.stop());
7710
- net.start();
7711
- cleanup.push(() => net.stop());
7712
- } catch (e) {
7713
- await failStartup(e);
7792
+ if (config.startRuntimeServices !== false) {
7793
+ try {
7794
+ await realtime.start();
7795
+ cleanup.push(() => realtime.stop());
7796
+ if (config.webhooks?.length)
7797
+ await webhooks.start(config.webhooks);
7798
+ cleanup.push(() => webhooks.stopService());
7799
+ cron.start();
7800
+ cleanup.push(() => cron.stop());
7801
+ retention.start();
7802
+ cleanup.push(() => retention.stop());
7803
+ net.start();
7804
+ cleanup.push(() => net.stop());
7805
+ } catch (e) {
7806
+ await failStartup(e);
7807
+ }
7714
7808
  }
7715
7809
  const fnMap = config.functions instanceof Map ? config.functions : new Map(Object.entries(config.functions ?? {}));
7716
7810
  const fnEnv = {
@@ -8756,6 +8850,7 @@ async function createProjectBackend(options = {}) {
8756
8850
  functionVerifyJwt: Object.fromEntries(Object.entries(config.functions).map(([name, functionOptions]) => [name, functionOptions.verifyJwt !== false])),
8757
8851
  functionEnv,
8758
8852
  webhooks,
8853
+ startRuntimeServices: options.startRuntimeServices,
8759
8854
  storageDriver: options.storageDriver ?? createStorageDriver(configuredStorageBackend, paths.storageDir, options.s3),
8760
8855
  log: options.log
8761
8856
  });
@@ -8791,7 +8886,7 @@ function createStorageDriver(backend, storageDir, s3Options) {
8791
8886
  }
8792
8887
  async function startProjectServer(options = {}) {
8793
8888
  const resolvedOptions = options.port === 0 ? { ...options, port: await findEphemeralPort(options.host) } : options;
8794
- const project = await createProjectBackend(resolvedOptions);
8889
+ const project = await createProjectBackend({ ...resolvedOptions, startRuntimeServices: true });
8795
8890
  try {
8796
8891
  const server = await serveBun(project.backend, { host: project.host, port: project.port });
8797
8892
  let closePromise = null;
@@ -32,6 +32,7 @@ export interface ProjectRuntimeOptions {
32
32
  includeFunctions?: boolean;
33
33
  includeWebhooks?: boolean;
34
34
  includeSeed?: boolean;
35
+ startRuntimeServices?: boolean;
35
36
  log?: (message: string) => void;
36
37
  }
37
38
  export interface ProjectBackend {
@@ -1 +1 @@
1
- {"version":3,"file":"project-runtime.d.ts","sourceRoot":"","sources":["../src/project-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-runtime.d.ts","sourceRoot":"","sources":["../src/project-runtime.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ export declare class CronService {
18
18
  private tickMs;
19
19
  private now;
20
20
  private timer;
21
+ private timerGeneration;
21
22
  private lastRun;
22
23
  private lastMinute;
23
24
  /** The in-flight tick, tracked so stop() can drain it before db.close(). */
@@ -35,6 +36,7 @@ export declare class CronService {
35
36
  stop(): Promise<void>;
36
37
  /** Run any due jobs once (also callable directly in tests). */
37
38
  tick(): Promise<void>;
39
+ private runTick;
38
40
  private isDue;
39
41
  private run;
40
42
  private log;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/cron/service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAUjD;;;;GAIG;AACH,qBAAa,WAAW;IAQpB,OAAO,CAAC,EAAE;IACV,kFAAkF;IAClF,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IAVb,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAA4B;IAC9C,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAA6B;gBAGnC,EAAE,EAAE,QAAQ;IACpB,kFAAkF;IAC1E,MAAM,SAAO,EACb,GAAG,GAAE,MAAM,IAAuB;IAG5C,iFAAiF;IACjF,KAAK,IAAI,IAAI;IAQb;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,+DAA+D;IACzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,OAAO,CAAC,KAAK;YAcC,GAAG;YAYH,GAAG;CAWlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAe7D"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/cron/service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAUjD;;;;GAIG;AACH,qBAAa,WAAW;IASpB,OAAO,CAAC,EAAE;IACV,kFAAkF;IAClF,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IAXb,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAA4B;IAC9C,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAA6B;gBAGnC,EAAE,EAAE,QAAQ;IACpB,kFAAkF;IAC1E,MAAM,SAAO,EACb,GAAG,GAAE,MAAM,IAAuB;IAG5C,iFAAiF;IACjF,KAAK,IAAI,IAAI;IAWb;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,+DAA+D;IAC/D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAWP,OAAO;IAarB,OAAO,CAAC,KAAK;YAcC,GAAG;YAYH,GAAG;CAWlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAe7D"}
@@ -85,7 +85,9 @@ export declare class Database {
85
85
  private schemaCache;
86
86
  private fnCache;
87
87
  private cdcListeners;
88
- private cdcStarted;
88
+ private cdcStarting;
89
+ private cdcStopping;
90
+ private cdcUnsubscribe;
89
91
  private constructor();
90
92
  /** Create a Database on PGlite (default) or any custom DbEngine. */
91
93
  static create(dataDirOrEngine?: string | DbEngine, opts?: {
@@ -135,7 +137,10 @@ export declare class Database {
135
137
  * Register a CDC listener; the first call starts the single LISTEN on the
136
138
  * shared `tinbase_cdc` channel. Returns an unsubscribe fn.
137
139
  */
138
- onCdcEvent(cb: (e: CdcEvent) => void): Promise<() => void>;
140
+ onCdcEvent(cb: (e: CdcEvent) => void): Promise<() => Promise<void>>;
141
+ private startCdcListener;
142
+ private attachCdcListener;
143
+ private stopCdcListener;
139
144
  /**
140
145
  * True when the engine can't run the trigger + `pg_notify` CDC pipeline
141
146
  * (pg-mem has no triggers/LISTEN/NOTIFY). For those engines the REST layer
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/db/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/db/database.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@ export interface EngineTx {
18
18
  /** run one or more statements within the transaction (no params) */
19
19
  exec(sql: string): Promise<void>;
20
20
  }
21
+ /** Detach a database listener; some engines issue an asynchronous UNLISTEN. */
22
+ export type EngineUnsubscribe = () => void | Promise<void>;
21
23
  /**
22
24
  * The single database interface the rest of tinbase talks to, regardless of
23
25
  * whether it's backed by PGlite, native embedded Postgres, or the pg-mem subset.
@@ -32,7 +34,7 @@ export interface DbEngine {
32
34
  /** serialized transaction; implementations must guarantee mutual exclusion */
33
35
  transaction<T>(fn: (tx: EngineTx) => Promise<T>): Promise<T>;
34
36
  /** subscribe to pg_notify on a channel; returns an unsubscribe function */
35
- listen(channel: string, cb: (payload: string) => void): Promise<() => void>;
37
+ listen(channel: string, cb: (payload: string) => void): Promise<EngineUnsubscribe>;
36
38
  /** close the underlying connection/instance */
37
39
  close(): Promise<void>;
38
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/db/engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iFAAiF;AACjF,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG;IACpC,gCAAgC;IAChC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,uDAAuD;IACvD,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,oEAAoE;IACpE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,gCAAgC;IAChC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,8CAA8C;IAC9C,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,8EAA8E;IAC9E,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5D,2EAA2E;IAC3E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAA;IAC3E,+CAA+C;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,yEAAyE;AACzE,qBAAa,KAAK;IAChB,OAAO,CAAC,IAAI,CAAmC;IAE/C,uFAAuF;IACjF,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;IASjC,qEAAqE;IAC/D,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAQ/C"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/db/engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iFAAiF;AACjF,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG;IACpC,gCAAgC;IAChC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,uDAAuD;IACvD,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,oEAAoE;IACpE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjC;AAED,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAE1D;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,gCAAgC;IAChC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,8CAA8C;IAC9C,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,8EAA8E;IAC9E,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5D,2EAA2E;IAC3E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAClF,+CAA+C;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,yEAAyE;AACzE,qBAAa,KAAK;IAChB,OAAO,CAAC,IAAI,CAAmC;IAE/C,uFAAuF;IACjF,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;IASjC,qEAAqE;IAC/D,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAQ/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"pglite-engine.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/db/pglite-engine.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,aAAa,CAAA;AAOpE;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmG5E"}
1
+ {"version":3,"file":"pglite-engine.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/db/pglite-engine.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAA8C,MAAM,aAAa,CAAA;AAOvF;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmG5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vendor/tinbase/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vendor/tinbase/index.ts"],"names":[],"mappings":"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"}
@@ -49,7 +49,7 @@ export declare class NetService {
49
49
  private tickMs;
50
50
  private onDeliver?;
51
51
  private timer;
52
- private draining;
52
+ private timerGeneration;
53
53
  /** The in-flight tick, tracked so stop() can drain it before db.close(). */
54
54
  private inFlight;
55
55
  constructor(db: Database, fetchImpl?: typeof fetch,
@@ -65,6 +65,7 @@ export declare class NetService {
65
65
  stop(): Promise<void>;
66
66
  /** Drain any queued requests once (also callable directly in tests). */
67
67
  tick(): Promise<void>;
68
+ private drainQueue;
68
69
  private deliver;
69
70
  /** Record the response and remove the request from the queue (best-effort). */
70
71
  private record;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/net/service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAQjD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB9D;AAqBD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAWlH;AAWD,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAA;IACjB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,qBAAa,UAAU;IAOnB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;IACjB,wCAAwC;IACxC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS,CAAC;IAVpB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,QAAQ,CAAQ;IACxB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAA6B;gBAGnC,EAAE,EAAE,QAAQ,EACZ,SAAS,GAAE,OAAO,KAAa;IACvC,wCAAwC;IAChC,MAAM,SAAM,EACZ,SAAS,CAAC,GAAE,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,aAAA;IAG9C,+EAA+E;IAC/E,KAAK,IAAI,IAAI;IAQb;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,wEAAwE;IAClE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YA8Bb,OAAO;IA6CrB,+EAA+E;YACjE,MAAM;CAoBrB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/net/service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAQjD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB9D;AAqBD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAWlH;AAWD,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAA;IACjB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,qBAAa,UAAU;IAOnB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;IACjB,wCAAwC;IACxC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS,CAAC;IAVpB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,eAAe,CAAI;IAC3B,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAA6B;gBAGnC,EAAE,EAAE,QAAQ,EACZ,SAAS,GAAE,OAAO,KAAa;IACvC,wCAAwC;IAChC,MAAM,SAAM,EACZ,SAAS,CAAC,GAAE,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,aAAA;IAG9C,+EAA+E;IAC/E,KAAK,IAAI,IAAI;IAWb;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,wEAAwE;IACxE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAWP,UAAU;YAwBV,OAAO;IA6CrB,+EAA+E;YACjE,MAAM;CAoBrB"}
@@ -42,7 +42,7 @@ export declare class RealtimeEngine {
42
42
  /** Wire up the CDC and database-broadcast listeners; idempotent once started. */
43
43
  start(): Promise<void>;
44
44
  /** Detach listeners and close every open socket (server shutdown). */
45
- stop(): void;
45
+ stop(): Promise<void>;
46
46
  /** Attach a socket. Returns callbacks the transport must wire up. */
47
47
  connect(socket: RealtimeSocketLike, opts?: {
48
48
  vsn?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/realtime/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAK3D,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;IACrC,wEAAwE;IACxE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5C;AA+DD,uFAAuF;AACvF,qBAAa,cAAc;IAUvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS,CAAC;IAVpB,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,aAAa,CAAI;IACzB,0BAA0B;IAC1B,OAAO,CAAC,QAAQ,CAAgD;IAChE,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,eAAe,CAA4B;gBAGzC,EAAE,EAAE,QAAQ,EACZ,SAAS,CAAC,EAAE,MAAM,YAAA;IAG5B,oEAAoE;YACtD,gBAAgB;IAQ9B;;;;;OAKG;YACW,gBAAgB;IA0C9B,6EAA6E;IAC7E,OAAO,CAAC,mBAAmB;IAc3B,iFAAiF;IAC3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,sEAAsE;IACtE,IAAI,IAAI,IAAI;IASZ,qEAAqE;IACrE,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG;QAChE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,KAAK,IAAI,CAAA;QAC9C,OAAO,EAAE,MAAM,IAAI,CAAA;KACpB;IAcD,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,KAAK;YAUC,aAAa;YAgEb,UAAU;IAsGxB,OAAO,CAAC,YAAY;IAmBpB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,cAAc;IA+CtB,OAAO,CAAC,gBAAgB;YAQV,WAAW;IAoDzB;;;;;;;OAOG;YACW,MAAM;IA6BpB,OAAO,CAAC,cAAc;CAUvB;AAkBD,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CA2BjF"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/realtime/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAM3D,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;IACrC,wEAAwE;IACxE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5C;AA+DD,uFAAuF;AACvF,qBAAa,cAAc;IAUvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS,CAAC;IAVpB,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,aAAa,CAAI;IACzB,0BAA0B;IAC1B,OAAO,CAAC,QAAQ,CAAgD;IAChE,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,eAAe,CAAiC;gBAG9C,EAAE,EAAE,QAAQ,EACZ,SAAS,CAAC,EAAE,MAAM,YAAA;IAG5B,oEAAoE;YACtD,gBAAgB;IAQ9B;;;;;OAKG;YACW,gBAAgB;IA0C9B,6EAA6E;IAC7E,OAAO,CAAC,mBAAmB;IAc3B,iFAAiF;IAC3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,sEAAsE;IAChE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,qEAAqE;IACrE,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG;QAChE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,KAAK,IAAI,CAAA;QAC9C,OAAO,EAAE,MAAM,IAAI,CAAA;KACpB;IAcD,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,KAAK;YAUC,aAAa;YAgEb,UAAU;IAsGxB,OAAO,CAAC,YAAY;IAmBpB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,cAAc;IA+CtB,OAAO,CAAC,gBAAgB;YAQV,WAAW;IAoDzB;;;;;;;OAOG;YACW,MAAM;IA6BpB,OAAO,CAAC,cAAc;CAUvB;AAkBD,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CA2BjF"}
@@ -22,6 +22,7 @@ export declare class RetentionService {
22
22
  private db;
23
23
  private now;
24
24
  private timer;
25
+ private timerGeneration;
25
26
  private inFlight;
26
27
  private readonly intervalMs;
27
28
  private readonly auditLogDays;
@@ -36,6 +37,7 @@ export declare class RetentionService {
36
37
  stop(): Promise<void>;
37
38
  /** Run a single retention pass (also callable directly in tests). */
38
39
  sweep(): Promise<void>;
40
+ private runSweep;
39
41
  private run;
40
42
  }
41
43
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/retention/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjD,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yFAAyF;IACzF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAID,wFAAwF;AACxF,qBAAa,gBAAgB;IAYzB,OAAO,CAAC,EAAE;IAEV,OAAO,CAAC,GAAG;IAbb,OAAO,CAAC,KAAK,CAA8C;IAK3D,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAG/B,EAAE,EAAE,QAAQ,EACpB,MAAM,GAAE,eAAoB,EACpB,GAAG,GAAE,MAAM,IAAuB;IAO5C,qFAAqF;IACrF,KAAK,IAAI,IAAI;IAUb;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,qEAAqE;IAC/D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBd,GAAG;CAOlB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/retention/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjD,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yFAAyF;IACzF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAID,wFAAwF;AACxF,qBAAa,gBAAgB;IAazB,OAAO,CAAC,EAAE;IAEV,OAAO,CAAC,GAAG;IAdb,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,eAAe,CAAI;IAK3B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAG/B,EAAE,EAAE,QAAQ,EACpB,MAAM,GAAE,eAAoB,EACpB,GAAG,GAAE,MAAM,IAAuB;IAO5C,qFAAqF;IACrF,KAAK,IAAI,IAAI;IAYb;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAWR,QAAQ;YAgBR,GAAG;CAOlB"}
@@ -117,6 +117,8 @@ export interface BackendConfig {
117
117
  authRateLimits?: Record<string, import('./auth/rate-limit.js').RateLimitRule>;
118
118
  /** Mount the auth service. Default true; config.toml auth.enabled = false turns /auth/v1 off. */
119
119
  authEnabled?: boolean;
120
+ /** Start Realtime and background services. Disable for short-lived maintenance commands. Default true. */
121
+ startRuntimeServices?: boolean;
120
122
  }
121
123
  /** A rendered outbound email (OTP code, magic link, recovery, etc.). */
122
124
  export interface MailMessage {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/vendor/tinbase/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,gBAAgB,EAAE,QAAQ,CAAA;IAC1C,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,oBAAoB,EAAE,YAAY,CAAC,CAAA;IACjE;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gHAAgH;IAChH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;IAC5B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wFAAwF;IACxF,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,wBAAwB,EAAE,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,wBAAwB,EAAE,YAAY,CAAC,CAAA;IACtI,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3C,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,iBAAiB,EAAE,mBAAmB,CAAC,CAAA;IAC9E,uFAAuF;IACvF,UAAU,CAAC,EAAE,OAAO,KAAK,CAAA;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,uBAAuB,EAAE,aAAa,EAAE,CAAA;IAC1D,mEAAmE;IACnE,YAAY,CAAC,EAAE,OAAO,KAAK,CAAA;IAC3B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,OAAO,KAAK,CAAA;IACvB,gCAAgC;IAChC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,OAAO,wBAAwB,EAAE,eAAe,CAAA;IAC5D,iHAAiH;IACjH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yFAAyF;IACzF,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB,yGAAyG;IACzG,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,qGAAqG;IACrG,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,uGAAuG;IACvG,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,sBAAsB,EAAE,aAAa,CAAC,CAAA;IAC7E,iGAAiG;IACjG,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAA;CACb;AAED,4EAA4E;AAC5E,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,MAAM,EAAE,SAAS,GAAG,IAAI,CAAA;CACzB;AAED,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,CAAA;IACf,+CAA+C;IAC/C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,2CAA2C;IAC3C,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CAClC;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;CAC5C;AAED,sGAAsG;AACtG,qBAAa,QAAS,SAAQ,KAAK;IAExB,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAD7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIvC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/vendor/tinbase/types.ts"],"names":[],"mappings":"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"}
@@ -64,7 +64,7 @@ export declare class WebhooksService {
64
64
  start(initial?: WebhookConfig[]): Promise<void>;
65
65
  private ensureStarted;
66
66
  /** Unsubscribe from the CDC stream; registered hooks are retained. */
67
- stopService(): void;
67
+ stopService(): Promise<void>;
68
68
  private dispatch;
69
69
  private deliver;
70
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/webhooks/service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG3D,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,CAAC,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAA;IAC3C,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,4FAA4F;AAC5F,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,aAAa,CAAA;IACtB,iDAAiD;IACjD,KAAK,EAAE,QAAQ,CAAA;IACf,oFAAoF;IACpF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,qCAAqC;IACrC,EAAE,EAAE,OAAO,CAAA;IACX,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,oFAAoF;AACpF,qBAAa,eAAe;IAMxB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAbzB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,OAAO,CAAQ;gBAGb,EAAE,EAAE,QAAQ,EACZ,SAAS,GAAE,OAAO,KAAa,EAC/B,UAAU,CAAC,GAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,aAAA;IACjD;;;;OAIG;IACK,eAAe,UAAQ;IAGjC,yCAAyC;IACzC,IAAI,IAAI,aAAa,EAAE;IAIvB,4EAA4E;IACtE,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD,8EAA8E;IACxE,KAAK,CAAC,OAAO,GAAE,aAAa,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ3C,aAAa;IAM3B,sEAAsE;IACtE,WAAW,IAAI,IAAI;IAMnB,OAAO,CAAC,QAAQ;YAUF,OAAO;CAmCtB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/vendor/tinbase/webhooks/service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAI3D,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,CAAC,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAA;IAC3C,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,4FAA4F;AAC5F,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,aAAa,CAAA;IACtB,iDAAiD;IACjD,KAAK,EAAE,QAAQ,CAAA;IACf,oFAAoF;IACpF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,qCAAqC;IACrC,EAAE,EAAE,OAAO,CAAA;IACX,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,oFAAoF;AACpF,qBAAa,eAAe;IAMxB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAbzB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,OAAO,CAAQ;gBAGb,EAAE,EAAE,QAAQ,EACZ,SAAS,GAAE,OAAO,KAAa,EAC/B,UAAU,CAAC,GAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,aAAA;IACjD;;;;OAIG;IACK,eAAe,UAAQ;IAGjC,yCAAyC;IACzC,IAAI,IAAI,aAAa,EAAE;IAIvB,4EAA4E;IACtE,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD,8EAA8E;IACxE,KAAK,CAAC,OAAO,GAAE,aAAa,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ3C,aAAa;IAM3B,sEAAsE;IAChE,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAOlC,OAAO,CAAC,QAAQ;YAUF,OAAO;CAmCtB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supacloud/lite",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "Bun-native, single-project Supabase-compatible backend powered by PGlite",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",