@supacloud/lite 0.5.3 → 0.5.5

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,23 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.5.5](https://github.com/zuohuadong/supacloud/compare/supacloud-lite-v0.5.4...supacloud-lite-v0.5.5) (2026-08-03)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **lite:** exit Windows CLI after cleanup ([579a714](https://github.com/zuohuadong/supacloud/commit/579a7147a2007885ddcaaabc0123ba10866187a5))
9
+ * **lite:** exit Windows CLI after cleanup ([17fe71e](https://github.com/zuohuadong/supacloud/commit/17fe71e23bdd2b1c79de3fbc7ec54fe3432981d1))
10
+ * **lite:** keep Windows CLI alive through cleanup ([2032834](https://github.com/zuohuadong/supacloud/commit/20328342240321c1f9267b307d9e546849fed85a))
11
+
12
+ ## [0.5.4](https://github.com/zuohuadong/supacloud/compare/supacloud-lite-v0.5.3...supacloud-lite-v0.5.4) (2026-08-02)
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * **lite:** await realtime listener shutdown ([797699b](https://github.com/zuohuadong/supacloud/commit/797699bcc8b0fcaafccf076acec3c8a49a7ee447))
18
+ * **lite:** ignore stale background timer callbacks ([004ba74](https://github.com/zuohuadong/supacloud/commit/004ba74bf3f7970377fc743368d45cf4b6837da4))
19
+ * **lite:** skip runtime services for utility commands ([050576e](https://github.com/zuohuadong/supacloud/commit/050576ebcf0a25a0ddd28db020eca759c2521753))
20
+
3
21
  ## [0.5.3](https://github.com/zuohuadong/supacloud/compare/supacloud-lite-v0.5.2...supacloud-lite-v0.5.3) (2026-08-02)
4
22
 
5
23
 
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.3",
11
+ version: "0.5.5",
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,6 +6997,7 @@ class NetService {
6950
6997
  tickMs;
6951
6998
  onDeliver;
6952
6999
  timer = null;
7000
+ timerGeneration = 0;
6953
7001
  inFlight = null;
6954
7002
  constructor(db, fetchImpl = fetch, tickMs = 500, onDeliver) {
6955
7003
  this.db = db;
@@ -6958,18 +7006,26 @@ class NetService {
6958
7006
  this.onDeliver = onDeliver;
6959
7007
  }
6960
7008
  start() {
6961
- if (this.timer)
7009
+ if (this.timer !== null)
6962
7010
  return;
6963
- this.timer = setInterval(() => void this.tick(), this.tickMs);
6964
- if (typeof this.timer === "object" && "unref" in this.timer)
6965
- this.timer.unref();
7011
+ const generation = ++this.timerGeneration;
7012
+ let timer;
7013
+ timer = setInterval(() => {
7014
+ if (this.timer === timer && this.timerGeneration === generation)
7015
+ this.tick();
7016
+ }, this.tickMs);
7017
+ this.timer = timer;
7018
+ if (typeof timer === "object" && "unref" in timer)
7019
+ timer.unref();
6966
7020
  }
6967
7021
  async stop() {
6968
- if (this.timer)
6969
- clearInterval(this.timer);
7022
+ const timer = this.timer;
6970
7023
  this.timer = null;
6971
- await this.inFlight?.catch(() => {});
6972
- this.inFlight = null;
7024
+ this.timerGeneration += 1;
7025
+ if (timer !== null)
7026
+ clearInterval(timer);
7027
+ const inFlight = this.inFlight;
7028
+ await inFlight?.catch(() => {});
6973
7029
  }
6974
7030
  tick() {
6975
7031
  if (this.inFlight)
@@ -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,18 +7231,26 @@ 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(() => void this.tick(), this.tickMs);
7179
- if (typeof this.timer === "object" && "unref" in this.timer)
7180
- this.timer.unref();
7236
+ const generation = ++this.timerGeneration;
7237
+ let timer;
7238
+ timer = setInterval(() => {
7239
+ if (this.timer === timer && this.timerGeneration === generation)
7240
+ this.tick();
7241
+ }, this.tickMs);
7242
+ this.timer = timer;
7243
+ if (typeof timer === "object" && "unref" in timer)
7244
+ timer.unref();
7181
7245
  }
7182
7246
  async stop() {
7183
- if (this.timer)
7184
- clearInterval(this.timer);
7247
+ const timer = this.timer;
7185
7248
  this.timer = null;
7186
- await this.inFlight?.catch(() => {});
7187
- this.inFlight = null;
7249
+ this.timerGeneration += 1;
7250
+ if (timer !== null)
7251
+ clearInterval(timer);
7252
+ const inFlight = this.inFlight;
7253
+ await inFlight?.catch(() => {});
7188
7254
  }
7189
7255
  tick() {
7190
7256
  if (this.inFlight)
@@ -7301,6 +7367,7 @@ class RetentionService {
7301
7367
  db;
7302
7368
  now;
7303
7369
  timer = null;
7370
+ timerGeneration = 0;
7304
7371
  inFlight = null;
7305
7372
  intervalMs;
7306
7373
  auditLogDays;
@@ -7313,18 +7380,27 @@ class RetentionService {
7313
7380
  this.refreshTokenDays = config.refreshTokenDays ?? 30;
7314
7381
  }
7315
7382
  start() {
7316
- if (this.timer)
7383
+ if (this.timer !== null)
7317
7384
  return;
7318
7385
  this.sweep();
7319
- this.timer = setInterval(() => void this.sweep(), this.intervalMs);
7320
- if (typeof this.timer === "object" && "unref" in this.timer)
7321
- this.timer.unref();
7386
+ const generation = ++this.timerGeneration;
7387
+ let timer;
7388
+ timer = setInterval(() => {
7389
+ if (this.timer === timer && this.timerGeneration === generation)
7390
+ this.sweep();
7391
+ }, this.intervalMs);
7392
+ this.timer = timer;
7393
+ if (typeof timer === "object" && "unref" in timer)
7394
+ timer.unref();
7322
7395
  }
7323
7396
  async stop() {
7324
- if (this.timer)
7325
- clearInterval(this.timer);
7397
+ const timer = this.timer;
7326
7398
  this.timer = null;
7327
- await this.inFlight?.catch(() => {});
7399
+ this.timerGeneration += 1;
7400
+ if (timer !== null)
7401
+ clearInterval(timer);
7402
+ const inFlight = this.inFlight;
7403
+ await inFlight?.catch(() => {});
7328
7404
  }
7329
7405
  sweep() {
7330
7406
  if (this.inFlight)
@@ -7869,20 +7945,22 @@ ${msg.text}` : `[mail] to=${msg.to} subject="${msg.subject}"`));
7869
7945
  const cron = new CronService(db);
7870
7946
  const retention = new RetentionService(db, config.retention);
7871
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}`));
7872
- try {
7873
- await realtime.start();
7874
- cleanup.push(() => realtime.stop());
7875
- if (config.webhooks?.length)
7876
- await webhooks.start(config.webhooks);
7877
- cleanup.push(() => webhooks.stopService());
7878
- cron.start();
7879
- cleanup.push(() => cron.stop());
7880
- retention.start();
7881
- cleanup.push(() => retention.stop());
7882
- net.start();
7883
- cleanup.push(() => net.stop());
7884
- } catch (e) {
7885
- 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
+ }
7886
7964
  }
7887
7965
  const fnMap = config.functions instanceof Map ? config.functions : new Map(Object.entries(config.functions ?? {}));
7888
7966
  const fnEnv = {
@@ -8077,7 +8155,8 @@ async function computeDbDiff(opts) {
8077
8155
  const schema = opts.schema ?? "public";
8078
8156
  const shadow = await createBackend({
8079
8157
  engine: opts.makeShadowEngine ? await opts.makeShadowEngine() : undefined,
8080
- migrations: opts.migrations
8158
+ migrations: opts.migrations,
8159
+ startRuntimeServices: false
8081
8160
  });
8082
8161
  let live;
8083
8162
  let operationFailed = false;
@@ -8085,7 +8164,8 @@ async function computeDbDiff(opts) {
8085
8164
  live = await createBackend({
8086
8165
  engine: opts.liveEngine,
8087
8166
  dataDir: opts.liveEngine ? undefined : opts.liveDataDir,
8088
- migrations: opts.migrations
8167
+ migrations: opts.migrations,
8168
+ startRuntimeServices: false
8089
8169
  });
8090
8170
  const shadowSnap = await snapshotSchema(shadow.db, schema);
8091
8171
  const liveSnap = await snapshotSchema(live.db, schema);
@@ -8106,7 +8186,8 @@ async function pullSchema(opts) {
8106
8186
  const schema = opts.schema ?? "public";
8107
8187
  const shadow = await createBackend({
8108
8188
  engine: opts.makeShadowEngine ? await opts.makeShadowEngine() : undefined,
8109
- migrations: opts.migrations
8189
+ migrations: opts.migrations,
8190
+ startRuntimeServices: false
8110
8191
  });
8111
8192
  let live;
8112
8193
  let operationFailed = false;
@@ -8114,7 +8195,8 @@ async function pullSchema(opts) {
8114
8195
  live = await createBackend({
8115
8196
  engine: opts.liveEngine,
8116
8197
  dataDir: opts.liveEngine ? undefined : opts.liveDataDir,
8117
- migrations: opts.migrations
8198
+ migrations: opts.migrations,
8199
+ startRuntimeServices: false
8118
8200
  });
8119
8201
  const ddl = diffSchemas(await snapshotSchema(shadow.db, schema), await snapshotSchema(live.db, schema), schema);
8120
8202
  if (ddl.length === 0)
@@ -9084,6 +9166,7 @@ async function createProjectBackend(options = {}) {
9084
9166
  functionVerifyJwt: Object.fromEntries(Object.entries(config.functions).map(([name, functionOptions]) => [name, functionOptions.verifyJwt !== false])),
9085
9167
  functionEnv,
9086
9168
  webhooks,
9169
+ startRuntimeServices: options.startRuntimeServices,
9087
9170
  storageDriver: options.storageDriver ?? createStorageDriver(configuredStorageBackend, paths.storageDir, options.s3),
9088
9171
  log: options.log
9089
9172
  });
@@ -9119,7 +9202,7 @@ function createStorageDriver(backend, storageDir, s3Options) {
9119
9202
  }
9120
9203
  async function startProjectServer(options = {}) {
9121
9204
  const resolvedOptions = options.port === 0 ? { ...options, port: await findEphemeralPort(options.host) } : options;
9122
- const project = await createProjectBackend(resolvedOptions);
9205
+ const project = await createProjectBackend({ ...resolvedOptions, startRuntimeServices: true });
9123
9206
  try {
9124
9207
  const server = await serveBun(project.backend, { host: project.host, port: project.port });
9125
9208
  let closePromise = null;
@@ -9671,21 +9754,21 @@ async function main() {
9671
9754
  const options = parseArgs(process.argv.slice(2));
9672
9755
  const paths = resolveProjectPaths(options);
9673
9756
  if (options.command === "version" || options.command === "--version") {
9674
- console.log(package_default.version);
9757
+ await writeStandardOutput(`${package_default.version}
9758
+ `);
9675
9759
  return;
9676
9760
  }
9677
9761
  if (options.command === "keys") {
9678
9762
  const secrets = await ensureProjectSecrets(paths);
9679
9763
  const keys = await mintProjectKeys(secrets.jwtSecret);
9680
- console.log(`anon key:
9681
- ${keys.anonKey}`);
9682
- if (options.serviceRole)
9683
- console.log(`
9764
+ const privilegedKey = options.serviceRole ? `
9684
9765
  service_role key:
9685
- ${keys.serviceRoleKey}`);
9686
- else
9687
- console.log(`
9688
- Use --service-role to print the privileged key.`);
9766
+ ${keys.serviceRoleKey}` : `
9767
+ Use --service-role to print the privileged key.`;
9768
+ await writeStandardOutput(`anon key:
9769
+ ${keys.anonKey}
9770
+ ${privilegedKey}
9771
+ `);
9689
9772
  return;
9690
9773
  }
9691
9774
  if (options.command === "db") {
@@ -9704,24 +9787,37 @@ Use --service-role to print the privileged key.`);
9704
9787
  if (options.positionals[0] && options.positionals[0] !== "types" && options.positionals[0] !== "typescript") {
9705
9788
  throw new Error(`unknown gen subcommand: ${options.positionals[0]}`);
9706
9789
  }
9707
- 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
+ });
9708
9797
  try {
9709
9798
  const source = await generateTypes(project2.backend.db, "public");
9710
9799
  if (options.output) {
9711
9800
  await mkdir7(dirname5(options.output), { recursive: true });
9712
9801
  await writeFile6(options.output, source);
9713
- console.log(`Wrote ${options.output}`);
9802
+ await writeStandardOutput(`Wrote ${options.output}
9803
+ `);
9714
9804
  } else
9715
- process.stdout.write(source);
9805
+ await writeStandardOutput(source);
9716
9806
  } finally {
9717
9807
  await project2.backend.close();
9718
9808
  }
9719
9809
  return;
9720
9810
  }
9721
9811
  if (options.command === "inspect") {
9722
- const project2 = await createProjectBackend({ ...options, includeFunctions: false, includeWebhooks: false, log: quietLog });
9812
+ const project2 = await createProjectBackend({
9813
+ ...options,
9814
+ includeFunctions: false,
9815
+ includeWebhooks: false,
9816
+ startRuntimeServices: false,
9817
+ log: quietLog
9818
+ });
9723
9819
  try {
9724
- printInspection(await inspectDb(project2.backend.db, "public"));
9820
+ await printInspection(await inspectDb(project2.backend.db, "public"));
9725
9821
  } finally {
9726
9822
  await project2.backend.close();
9727
9823
  }
@@ -9734,17 +9830,15 @@ Use --service-role to print the privileged key.`);
9734
9830
  includeFunctions: false,
9735
9831
  includeWebhooks: false,
9736
9832
  includeSeed: options.command === "migrate",
9833
+ startRuntimeServices: false,
9737
9834
  log: quietLog
9738
9835
  });
9739
9836
  try {
9740
9837
  const applied = await project2.backend.db.listAppliedMigrations();
9741
- if (options.command === "migrate")
9742
- console.log(`${applied.length} migration(s) applied.`);
9743
- else if (applied.length === 0)
9744
- console.log("no migrations applied");
9745
- else
9746
- for (const migration of applied)
9747
- console.log(`${migration.version} ${migration.name ?? ""}`);
9838
+ const output = options.command === "migrate" ? `${applied.length} migration(s) applied.` : applied.length === 0 ? "no migrations applied" : applied.map((migration) => `${migration.version} ${migration.name ?? ""}`).join(`
9839
+ `);
9840
+ await writeStandardOutput(`${output}
9841
+ `);
9748
9842
  } finally {
9749
9843
  await project2.backend.close();
9750
9844
  }
@@ -9753,7 +9847,8 @@ Use --service-role to print the privileged key.`);
9753
9847
  if (options.command !== "start")
9754
9848
  throw new Error(`unknown command: ${options.command}`);
9755
9849
  const project = await startProjectServer({ ...options, log: (message) => console.log(` ${message}`) });
9756
- console.log(`
9850
+ const shutdown = waitForShutdown(() => project.close());
9851
+ await writeStandardOutput(`
9757
9852
  SupaCloud Lite running
9758
9853
 
9759
9854
  API URL: ${project.url}
@@ -9766,8 +9861,9 @@ Use --service-role to print the privileged key.`);
9766
9861
 
9767
9862
  Run "supacloud-lite keys" for the anon key.
9768
9863
  Run "supacloud-lite keys --service-role" only when privileged access is required.
9864
+
9769
9865
  `);
9770
- await waitForShutdown(() => project.close());
9866
+ await shutdown;
9771
9867
  process.exitCode = 0;
9772
9868
  }
9773
9869
  async function runDbCommand(options) {
@@ -9781,10 +9877,17 @@ async function runDbCommand(options) {
9781
9877
  if (paths.dataDir)
9782
9878
  await rm4(paths.dataDir, { recursive: true, force: true });
9783
9879
  await rm4(paths.storageDir, { recursive: true, force: true });
9784
- 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
+ });
9785
9887
  try {
9786
9888
  const applied = await project2.backend.db.listAppliedMigrations();
9787
- console.log(`reset complete: ${applied.length} migration(s) applied`);
9889
+ await writeStandardOutput(`reset complete: ${applied.length} migration(s) applied
9890
+ `);
9788
9891
  } finally {
9789
9892
  await project2.backend.close();
9790
9893
  }
@@ -9794,7 +9897,8 @@ async function runDbCommand(options) {
9794
9897
  if (subcommand === "diff") {
9795
9898
  const ddl = await computeDbDiff({ liveDataDir: paths.dataDir, migrations: project.migrations });
9796
9899
  if (ddl.length === 0) {
9797
- console.error("No schema changes found.");
9900
+ await writeStandardError(`No schema changes found.
9901
+ `);
9798
9902
  return;
9799
9903
  }
9800
9904
  const source = `${ddl.join(`
@@ -9806,9 +9910,10 @@ async function runDbCommand(options) {
9806
9910
  const output = join9(paths.projectDir, "supabase", "migrations", `${stamp}_${options.diffFile}.sql`);
9807
9911
  await mkdir7(join9(paths.projectDir, "supabase", "migrations"), { recursive: true });
9808
9912
  await writeFile6(output, source);
9809
- console.log(`Wrote ${output}`);
9913
+ await writeStandardOutput(`Wrote ${output}
9914
+ `);
9810
9915
  } else
9811
- process.stdout.write(source);
9916
+ await writeStandardOutput(source);
9812
9917
  return;
9813
9918
  }
9814
9919
  if (subcommand === "pull") {
@@ -9819,9 +9924,11 @@ async function runDbCommand(options) {
9819
9924
  name: options.positionals[1] ?? "remote_schema"
9820
9925
  });
9821
9926
  if (!result.path)
9822
- console.error("No schema changes to pull.");
9927
+ await writeStandardError(`No schema changes to pull.
9928
+ `);
9823
9929
  else
9824
- console.log(`Wrote ${result.path} and recorded version ${result.version} as applied.`);
9930
+ await writeStandardOutput(`Wrote ${result.path} and recorded version ${result.version} as applied.
9931
+ `);
9825
9932
  return;
9826
9933
  }
9827
9934
  throw new Error(`unknown db subcommand: ${subcommand ?? "(none)"}`);
@@ -9836,9 +9943,12 @@ async function runSnapshotCommand(options) {
9836
9943
  await ensureProjectSecrets(paths);
9837
9944
  const output = options.output ?? join9(paths.stateDir, "backups", `snapshot-${timestamp()}.tar.gz`);
9838
9945
  const manifest = await createSnapshot({ paths, packageVersion: package_default.version, storageBackend, output });
9839
- console.log(`Snapshot created: ${output}`);
9840
- if (manifest.storageBackend === "s3")
9841
- console.log("S3 objects were not copied; the snapshot contains database metadata and secrets only.");
9946
+ await writeStandardOutput(`Snapshot created: ${output}
9947
+ `);
9948
+ if (manifest.storageBackend === "s3") {
9949
+ await writeStandardOutput(`S3 objects were not copied; the snapshot contains database metadata and secrets only.
9950
+ `);
9951
+ }
9842
9952
  return;
9843
9953
  }
9844
9954
  if (subcommand === "restore") {
@@ -9846,11 +9956,15 @@ async function runSnapshotCommand(options) {
9846
9956
  if (!input)
9847
9957
  throw new Error("snapshot restore requires a snapshot file");
9848
9958
  const result = await restoreSnapshot({ paths, storageBackend, input, force: options.force });
9849
- console.log(`Snapshot restored from ${resolve4(input)}`);
9850
- for (const rollbackPath of result.rollbackPaths)
9851
- console.log(`Previous state retained at ${rollbackPath}`);
9852
- if (result.manifest.storageBackend === "s3")
9853
- console.log("Reconnect the original S3 bucket/prefix before starting Lite.");
9959
+ const rollbackLines = result.rollbackPaths.map((rollbackPath) => `Previous state retained at ${rollbackPath}`);
9960
+ const reconnectLine = result.manifest.storageBackend === "s3" ? ["Reconnect the original S3 bucket/prefix before starting Lite."] : [];
9961
+ await writeStandardOutput([
9962
+ `Snapshot restored from ${resolve4(input)}`,
9963
+ ...rollbackLines,
9964
+ ...reconnectLine
9965
+ ].join(`
9966
+ `) + `
9967
+ `);
9854
9968
  return;
9855
9969
  }
9856
9970
  throw new Error(`unknown snapshot subcommand: ${subcommand ?? "(none)"}`);
@@ -9863,7 +9977,8 @@ async function runUpgradeCommand(options) {
9863
9977
  await ensureProjectSecrets(paths);
9864
9978
  const output = options.output ?? join9(paths.stateDir, "backups", `pre-upgrade-${timestamp()}.tar.gz`);
9865
9979
  await createSnapshot({ paths, packageVersion: package_default.version, storageBackend, output });
9866
- console.log(`Pre-upgrade snapshot: ${output}`);
9980
+ await writeStandardOutput(`Pre-upgrade snapshot: ${output}
9981
+ `);
9867
9982
  try {
9868
9983
  const project = await createProjectBackend({
9869
9984
  ...options,
@@ -9871,11 +9986,13 @@ async function runUpgradeCommand(options) {
9871
9986
  includeFunctions: false,
9872
9987
  includeWebhooks: false,
9873
9988
  includeSeed: true,
9989
+ startRuntimeServices: false,
9874
9990
  log: quietLog
9875
9991
  });
9876
9992
  try {
9877
9993
  const applied = await project.backend.db.listAppliedMigrations();
9878
- console.log(`Upgrade complete on @supacloud/lite ${package_default.version}: ${applied.length} migration(s) recorded.`);
9994
+ await writeStandardOutput(`Upgrade complete on @supacloud/lite ${package_default.version}: ${applied.length} migration(s) recorded.
9995
+ `);
9879
9996
  } finally {
9880
9997
  await project.backend.close();
9881
9998
  }
@@ -9883,15 +10000,26 @@ async function runUpgradeCommand(options) {
9883
10000
  throw new Error(`upgrade failed; snapshot retained at ${output}. Restore it with ` + `"supacloud-lite snapshot restore ${output} --force". ${error instanceof Error ? error.message : String(error)}`);
9884
10001
  }
9885
10002
  }
9886
- function printInspection(rows) {
10003
+ async function printInspection(rows) {
9887
10004
  if (rows.length === 0) {
9888
- console.log('No tables in schema "public".');
10005
+ await writeStandardOutput(`No tables in schema "public".
10006
+ `);
9889
10007
  return;
9890
10008
  }
9891
10009
  const width = Math.max(5, ...rows.map((row) => row.table.length));
9892
- console.log(`${"table".padEnd(width)} ${"rows".padStart(10)} size`);
9893
- for (const row of rows)
9894
- console.log(`${row.table.padEnd(width)} ${String(row.rows).padStart(10)} ${row.size}`);
10010
+ const output = [
10011
+ `${"table".padEnd(width)} ${"rows".padStart(10)} size`,
10012
+ ...rows.map((row) => `${row.table.padEnd(width)} ${String(row.rows).padStart(10)} ${row.size}`)
10013
+ ];
10014
+ await writeStandardOutput(`${output.join(`
10015
+ `)}
10016
+ `);
10017
+ }
10018
+ async function writeStandardOutput(output) {
10019
+ await Bun.write(Bun.stdout, output);
10020
+ }
10021
+ async function writeStandardError(output) {
10022
+ await Bun.write(Bun.stderr, output);
9895
10023
  }
9896
10024
  function timestamp() {
9897
10025
  return new Date().toISOString().replace(/[-:T]/g, "").slice(0, 14);
@@ -9944,7 +10072,16 @@ function formatStorage(backend, storageDir) {
9944
10072
  return "custom driver";
9945
10073
  return storageDir;
9946
10074
  }
9947
- main().catch((error) => {
9948
- console.error(error instanceof Error ? error.message : String(error));
9949
- process.exitCode = 1;
9950
- });
10075
+ var windowsLifecycleRef = process.platform === "win32" ? setInterval(() => {}, 1000) : null;
10076
+ var exitCode = 0;
10077
+ try {
10078
+ await main();
10079
+ } catch (error) {
10080
+ await writeStandardError(`${error instanceof Error ? error.message : String(error)}
10081
+ `);
10082
+ exitCode = 1;
10083
+ } finally {
10084
+ if (windowsLifecycleRef !== null)
10085
+ clearInterval(windowsLifecycleRef);
10086
+ }
10087
+ process.exit(exitCode);
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.3",
74
+ version: "0.5.5",
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,6 +7002,7 @@ class NetService {
6955
7002
  tickMs;
6956
7003
  onDeliver;
6957
7004
  timer = null;
7005
+ timerGeneration = 0;
6958
7006
  inFlight = null;
6959
7007
  constructor(db, fetchImpl = fetch, tickMs = 500, onDeliver) {
6960
7008
  this.db = db;
@@ -6963,18 +7011,26 @@ class NetService {
6963
7011
  this.onDeliver = onDeliver;
6964
7012
  }
6965
7013
  start() {
6966
- if (this.timer)
7014
+ if (this.timer !== null)
6967
7015
  return;
6968
- this.timer = setInterval(() => void this.tick(), this.tickMs);
6969
- if (typeof this.timer === "object" && "unref" in this.timer)
6970
- this.timer.unref();
7016
+ const generation = ++this.timerGeneration;
7017
+ let timer;
7018
+ timer = setInterval(() => {
7019
+ if (this.timer === timer && this.timerGeneration === generation)
7020
+ this.tick();
7021
+ }, this.tickMs);
7022
+ this.timer = timer;
7023
+ if (typeof timer === "object" && "unref" in timer)
7024
+ timer.unref();
6971
7025
  }
6972
7026
  async stop() {
6973
- if (this.timer)
6974
- clearInterval(this.timer);
7027
+ const timer = this.timer;
6975
7028
  this.timer = null;
6976
- await this.inFlight?.catch(() => {});
6977
- this.inFlight = null;
7029
+ this.timerGeneration += 1;
7030
+ if (timer !== null)
7031
+ clearInterval(timer);
7032
+ const inFlight = this.inFlight;
7033
+ await inFlight?.catch(() => {});
6978
7034
  }
6979
7035
  tick() {
6980
7036
  if (this.inFlight)
@@ -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,18 +7236,26 @@ 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(() => void this.tick(), this.tickMs);
7184
- if (typeof this.timer === "object" && "unref" in this.timer)
7185
- this.timer.unref();
7241
+ const generation = ++this.timerGeneration;
7242
+ let timer;
7243
+ timer = setInterval(() => {
7244
+ if (this.timer === timer && this.timerGeneration === generation)
7245
+ this.tick();
7246
+ }, this.tickMs);
7247
+ this.timer = timer;
7248
+ if (typeof timer === "object" && "unref" in timer)
7249
+ timer.unref();
7186
7250
  }
7187
7251
  async stop() {
7188
- if (this.timer)
7189
- clearInterval(this.timer);
7252
+ const timer = this.timer;
7190
7253
  this.timer = null;
7191
- await this.inFlight?.catch(() => {});
7192
- this.inFlight = null;
7254
+ this.timerGeneration += 1;
7255
+ if (timer !== null)
7256
+ clearInterval(timer);
7257
+ const inFlight = this.inFlight;
7258
+ await inFlight?.catch(() => {});
7193
7259
  }
7194
7260
  tick() {
7195
7261
  if (this.inFlight)
@@ -7306,6 +7372,7 @@ class RetentionService {
7306
7372
  db;
7307
7373
  now;
7308
7374
  timer = null;
7375
+ timerGeneration = 0;
7309
7376
  inFlight = null;
7310
7377
  intervalMs;
7311
7378
  auditLogDays;
@@ -7318,18 +7385,27 @@ class RetentionService {
7318
7385
  this.refreshTokenDays = config.refreshTokenDays ?? 30;
7319
7386
  }
7320
7387
  start() {
7321
- if (this.timer)
7388
+ if (this.timer !== null)
7322
7389
  return;
7323
7390
  this.sweep();
7324
- this.timer = setInterval(() => void this.sweep(), this.intervalMs);
7325
- if (typeof this.timer === "object" && "unref" in this.timer)
7326
- this.timer.unref();
7391
+ const generation = ++this.timerGeneration;
7392
+ let timer;
7393
+ timer = setInterval(() => {
7394
+ if (this.timer === timer && this.timerGeneration === generation)
7395
+ this.sweep();
7396
+ }, this.intervalMs);
7397
+ this.timer = timer;
7398
+ if (typeof timer === "object" && "unref" in timer)
7399
+ timer.unref();
7327
7400
  }
7328
7401
  async stop() {
7329
- if (this.timer)
7330
- clearInterval(this.timer);
7402
+ const timer = this.timer;
7331
7403
  this.timer = null;
7332
- await this.inFlight?.catch(() => {});
7404
+ this.timerGeneration += 1;
7405
+ if (timer !== null)
7406
+ clearInterval(timer);
7407
+ const inFlight = this.inFlight;
7408
+ await inFlight?.catch(() => {});
7333
7409
  }
7334
7410
  sweep() {
7335
7411
  if (this.inFlight)
@@ -7713,20 +7789,22 @@ ${msg.text}` : `[mail] to=${msg.to} subject="${msg.subject}"`));
7713
7789
  const cron = new CronService(db);
7714
7790
  const retention = new RetentionService(db, config.retention);
7715
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}`));
7716
- try {
7717
- await realtime.start();
7718
- cleanup.push(() => realtime.stop());
7719
- if (config.webhooks?.length)
7720
- await webhooks.start(config.webhooks);
7721
- cleanup.push(() => webhooks.stopService());
7722
- cron.start();
7723
- cleanup.push(() => cron.stop());
7724
- retention.start();
7725
- cleanup.push(() => retention.stop());
7726
- net.start();
7727
- cleanup.push(() => net.stop());
7728
- } catch (e) {
7729
- 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
+ }
7730
7808
  }
7731
7809
  const fnMap = config.functions instanceof Map ? config.functions : new Map(Object.entries(config.functions ?? {}));
7732
7810
  const fnEnv = {
@@ -8772,6 +8850,7 @@ async function createProjectBackend(options = {}) {
8772
8850
  functionVerifyJwt: Object.fromEntries(Object.entries(config.functions).map(([name, functionOptions]) => [name, functionOptions.verifyJwt !== false])),
8773
8851
  functionEnv,
8774
8852
  webhooks,
8853
+ startRuntimeServices: options.startRuntimeServices,
8775
8854
  storageDriver: options.storageDriver ?? createStorageDriver(configuredStorageBackend, paths.storageDir, options.s3),
8776
8855
  log: options.log
8777
8856
  });
@@ -8807,7 +8886,7 @@ function createStorageDriver(backend, storageDir, s3Options) {
8807
8886
  }
8808
8887
  async function startProjectServer(options = {}) {
8809
8888
  const resolvedOptions = options.port === 0 ? { ...options, port: await findEphemeralPort(options.host) } : options;
8810
- const project = await createProjectBackend(resolvedOptions);
8889
+ const project = await createProjectBackend({ ...resolvedOptions, startRuntimeServices: true });
8811
8890
  try {
8812
8891
  const server = await serveBun(project.backend, { host: project.host, port: project.port });
8813
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(). */
@@ -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;IAMb;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,+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"}
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,6 +49,7 @@ export declare class NetService {
49
49
  private tickMs;
50
50
  private onDeliver?;
51
51
  private timer;
52
+ private timerGeneration;
52
53
  /** The in-flight tick, tracked so stop() can drain it before db.close(). */
53
54
  private inFlight;
54
55
  constructor(db: Database, fetchImpl?: typeof fetch,
@@ -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;IAMnB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;IACjB,wCAAwC;IACxC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS,CAAC;IATpB,OAAO,CAAC,KAAK,CAA8C;IAC3D,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;IAMb;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,wEAAwE;IACxE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAWP,UAAU;YAwBV,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;
@@ -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,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;IAOb;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAWR,QAAQ;YAgBR,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":"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"}
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.3",
3
+ "version": "0.5.5",
4
4
  "description": "Bun-native, single-project Supabase-compatible backend powered by PGlite",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",