@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 +16 -0
- package/dist/cli.js +208 -89
- package/dist/index.js +177 -82
- package/dist/project-runtime.d.ts +1 -0
- package/dist/project-runtime.d.ts.map +1 -1
- package/dist/vendor/tinbase/cron/service.d.ts +2 -0
- package/dist/vendor/tinbase/cron/service.d.ts.map +1 -1
- package/dist/vendor/tinbase/db/database.d.ts +7 -2
- package/dist/vendor/tinbase/db/database.d.ts.map +1 -1
- package/dist/vendor/tinbase/db/engine.d.ts +3 -1
- package/dist/vendor/tinbase/db/engine.d.ts.map +1 -1
- package/dist/vendor/tinbase/db/pglite-engine.d.ts.map +1 -1
- package/dist/vendor/tinbase/index.d.ts.map +1 -1
- package/dist/vendor/tinbase/net/service.d.ts +2 -1
- package/dist/vendor/tinbase/net/service.d.ts.map +1 -1
- package/dist/vendor/tinbase/realtime/engine.d.ts +1 -1
- package/dist/vendor/tinbase/realtime/engine.d.ts.map +1 -1
- package/dist/vendor/tinbase/retention/service.d.ts +2 -0
- package/dist/vendor/tinbase/retention/service.d.ts.map +1 -1
- package/dist/vendor/tinbase/types.d.ts +2 -0
- package/dist/vendor/tinbase/types.d.ts.map +1 -1
- package/dist/vendor/tinbase/webhooks/service.d.ts +1 -1
- package/dist/vendor/tinbase/webhooks/service.d.ts.map +1 -1
- package/package.json +1 -1
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.
|
|
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
|
-
|
|
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
|
-
|
|
3778
|
-
this.
|
|
3779
|
-
|
|
3780
|
-
|
|
3781
|
-
|
|
3782
|
-
|
|
3783
|
-
|
|
3784
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6965
|
-
|
|
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
|
-
|
|
6968
|
-
|
|
7017
|
+
this.timer = timer;
|
|
7018
|
+
if (typeof timer === "object" && "unref" in timer)
|
|
7019
|
+
timer.unref();
|
|
6969
7020
|
}
|
|
6970
7021
|
async stop() {
|
|
6971
|
-
|
|
6972
|
-
clearInterval(this.timer);
|
|
7022
|
+
const timer = this.timer;
|
|
6973
7023
|
this.timer = null;
|
|
6974
|
-
|
|
6975
|
-
|
|
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
|
|
6978
|
-
|
|
6979
|
-
return;
|
|
6980
|
-
this.draining = true;
|
|
7040
|
+
async drainQueue() {
|
|
7041
|
+
let rows;
|
|
6981
7042
|
try {
|
|
6982
|
-
|
|
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
|
-
|
|
6985
|
-
} catch {
|
|
6986
|
-
|
|
6987
|
-
|
|
6988
|
-
|
|
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
|
-
|
|
7179
|
-
|
|
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
|
-
|
|
7182
|
-
|
|
7242
|
+
this.timer = timer;
|
|
7243
|
+
if (typeof timer === "object" && "unref" in timer)
|
|
7244
|
+
timer.unref();
|
|
7183
7245
|
}
|
|
7184
7246
|
async stop() {
|
|
7185
|
-
|
|
7186
|
-
clearInterval(this.timer);
|
|
7247
|
+
const timer = this.timer;
|
|
7187
7248
|
this.timer = null;
|
|
7188
|
-
|
|
7189
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
7311
|
-
|
|
7312
|
-
|
|
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
|
-
|
|
7315
|
-
|
|
7392
|
+
this.timer = timer;
|
|
7393
|
+
if (typeof timer === "object" && "unref" in timer)
|
|
7394
|
+
timer.unref();
|
|
7316
7395
|
}
|
|
7317
7396
|
async stop() {
|
|
7318
|
-
|
|
7319
|
-
clearInterval(this.timer);
|
|
7397
|
+
const timer = this.timer;
|
|
7320
7398
|
this.timer = null;
|
|
7321
|
-
|
|
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
|
|
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
|
-
|
|
7857
|
-
|
|
7858
|
-
|
|
7859
|
-
|
|
7860
|
-
|
|
7861
|
-
|
|
7862
|
-
|
|
7863
|
-
|
|
7864
|
-
|
|
7865
|
-
|
|
7866
|
-
|
|
7867
|
-
|
|
7868
|
-
|
|
7869
|
-
|
|
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({
|
|
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({
|
|
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({
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
3783
|
-
this.
|
|
3784
|
-
|
|
3785
|
-
|
|
3786
|
-
|
|
3787
|
-
|
|
3788
|
-
|
|
3789
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6970
|
-
|
|
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
|
-
|
|
6973
|
-
|
|
7022
|
+
this.timer = timer;
|
|
7023
|
+
if (typeof timer === "object" && "unref" in timer)
|
|
7024
|
+
timer.unref();
|
|
6974
7025
|
}
|
|
6975
7026
|
async stop() {
|
|
6976
|
-
|
|
6977
|
-
clearInterval(this.timer);
|
|
7027
|
+
const timer = this.timer;
|
|
6978
7028
|
this.timer = null;
|
|
6979
|
-
|
|
6980
|
-
|
|
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
|
|
6983
|
-
|
|
6984
|
-
return;
|
|
6985
|
-
this.draining = true;
|
|
7045
|
+
async drainQueue() {
|
|
7046
|
+
let rows;
|
|
6986
7047
|
try {
|
|
6987
|
-
|
|
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
|
-
|
|
6990
|
-
} catch {
|
|
6991
|
-
|
|
6992
|
-
|
|
6993
|
-
|
|
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
|
-
|
|
7184
|
-
|
|
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
|
-
|
|
7187
|
-
|
|
7247
|
+
this.timer = timer;
|
|
7248
|
+
if (typeof timer === "object" && "unref" in timer)
|
|
7249
|
+
timer.unref();
|
|
7188
7250
|
}
|
|
7189
7251
|
async stop() {
|
|
7190
|
-
|
|
7191
|
-
clearInterval(this.timer);
|
|
7252
|
+
const timer = this.timer;
|
|
7192
7253
|
this.timer = null;
|
|
7193
|
-
|
|
7194
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
7316
|
-
|
|
7317
|
-
|
|
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
|
-
|
|
7320
|
-
|
|
7397
|
+
this.timer = timer;
|
|
7398
|
+
if (typeof timer === "object" && "unref" in timer)
|
|
7399
|
+
timer.unref();
|
|
7321
7400
|
}
|
|
7322
7401
|
async stop() {
|
|
7323
|
-
|
|
7324
|
-
clearInterval(this.timer);
|
|
7402
|
+
const timer = this.timer;
|
|
7325
7403
|
this.timer = null;
|
|
7326
|
-
|
|
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
|
|
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
|
-
|
|
7701
|
-
|
|
7702
|
-
|
|
7703
|
-
|
|
7704
|
-
|
|
7705
|
-
|
|
7706
|
-
|
|
7707
|
-
|
|
7708
|
-
|
|
7709
|
-
|
|
7710
|
-
|
|
7711
|
-
|
|
7712
|
-
|
|
7713
|
-
|
|
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;
|
|
@@ -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;
|
|
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
|
|
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":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,
|
|
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<
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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;
|
|
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;
|
|
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;
|
|
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"}
|