orez 0.5.13 → 0.5.16
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/dist/pg-proxy-do-backend.d.ts +10 -0
- package/dist/pg-proxy-do-backend.d.ts.map +1 -1
- package/dist/pg-proxy-do-backend.js +154 -31
- package/dist/pg-proxy-do-backend.js.map +1 -1
- package/dist/worker/cf-instance-runtime.d.ts +4 -0
- package/dist/worker/cf-instance-runtime.d.ts.map +1 -1
- package/dist/worker/cf-instance-runtime.js +67 -0
- package/dist/worker/cf-instance-runtime.js.map +1 -1
- package/dist/worker/cf-patches.d.ts +8 -7
- package/dist/worker/cf-patches.d.ts.map +1 -1
- package/dist/worker/cf-patches.js +204 -14
- package/dist/worker/cf-patches.js.map +1 -1
- package/dist/worker/shims/sqlite.d.ts +29 -0
- package/dist/worker/shims/sqlite.d.ts.map +1 -1
- package/dist/worker/shims/sqlite.js +56 -14
- package/dist/worker/shims/sqlite.js.map +1 -1
- package/dist/worker/zero-cache-do-sqlite.d.ts +18 -4
- package/dist/worker/zero-cache-do-sqlite.d.ts.map +1 -1
- package/dist/worker/zero-cache-do-sqlite.js +23 -1
- package/dist/worker/zero-cache-do-sqlite.js.map +1 -1
- package/dist/worker/zero-cache-embed-cf.d.ts +1 -1
- package/dist/worker/zero-cache-embed-cf.d.ts.map +1 -1
- package/dist/worker/zero-cache-embed-cf.js +275 -34
- package/dist/worker/zero-cache-embed-cf.js.map +1 -1
- package/dist/worker/zero-cache-run-worker.d.ts +2 -1
- package/dist/worker/zero-cache-run-worker.d.ts.map +1 -1
- package/dist/worker/zero-cache-run-worker.js +16 -1
- package/dist/worker/zero-cache-run-worker.js.map +1 -1
- package/package.json +2 -2
|
@@ -18,6 +18,7 @@ export declare class DoBackend {
|
|
|
18
18
|
private doUrl;
|
|
19
19
|
private dbName;
|
|
20
20
|
private httpClient;
|
|
21
|
+
private cleanupHttpClient;
|
|
21
22
|
private namespace;
|
|
22
23
|
private skippedFunctionNames;
|
|
23
24
|
private triggerFunctions;
|
|
@@ -30,10 +31,14 @@ export declare class DoBackend {
|
|
|
30
31
|
private publicationTableInfoCache;
|
|
31
32
|
private cdcRegistrationDirty;
|
|
32
33
|
private readyPromise;
|
|
34
|
+
private closePromise;
|
|
35
|
+
private lifecycleAbort;
|
|
36
|
+
private removeExternalAbortListener;
|
|
33
37
|
private operationMutex;
|
|
34
38
|
private instanceId;
|
|
35
39
|
private allowTransactionalDDL;
|
|
36
40
|
private signalReplication;
|
|
41
|
+
private log?;
|
|
37
42
|
private inTransaction;
|
|
38
43
|
private txID;
|
|
39
44
|
private txSnapshot;
|
|
@@ -48,11 +53,16 @@ export declare class DoBackend {
|
|
|
48
53
|
allowTransactionalDDL?: boolean;
|
|
49
54
|
fetch?: typeof fetch;
|
|
50
55
|
instanceId?: string;
|
|
56
|
+
log?: (event: Record<string, unknown>) => void;
|
|
57
|
+
signal?: AbortSignal;
|
|
51
58
|
signalReplication?: () => void;
|
|
52
59
|
txOwner?: string;
|
|
53
60
|
});
|
|
54
61
|
get waitReady(): Promise<void>;
|
|
55
62
|
private ensureReady;
|
|
63
|
+
private assertOpen;
|
|
64
|
+
private emitInitEvent;
|
|
65
|
+
private runInitPhase;
|
|
56
66
|
private init;
|
|
57
67
|
private ensureChangeTrackingTables;
|
|
58
68
|
private ensureMetadataTable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-proxy-do-backend.d.ts","sourceRoot":"","sources":["../src/pg-proxy-do-backend.ts"],"names":[],"mappings":"AAuiIA,wBAAsB,+BAA+B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CACzE,KAAK,CAAC;IACJ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,kBAAkB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACtD,mBAAmB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACxD,CAAC,CACH,CAkDA;AA+kCD,6EAA6E;AAC7E,wBAAgB,8BAA8B,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAQvE;AAID,qBAAa,SAAS;IACpB,KAAK,UAAQ;IACb,MAAM,UAAQ;IACd,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,oBAAoB,CAAa;IACzC,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAoC;IAGxD,OAAO,CAAC,4BAA4B,CAAoB;IACxD,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,kBAAkB,CAAuC;IACjE,OAAO,CAAC,OAAO,CAAiC;IAOhD,OAAO,CAAC,yBAAyB,CAAsC;IACvE,OAAO,CAAC,oBAAoB,CAAQ;IACpC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,iBAAiB,CAAY;
|
|
1
|
+
{"version":3,"file":"pg-proxy-do-backend.d.ts","sourceRoot":"","sources":["../src/pg-proxy-do-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -4750,6 +4750,7 @@ export class DoBackend {
|
|
|
4750
4750
|
doUrl;
|
|
4751
4751
|
dbName;
|
|
4752
4752
|
httpClient;
|
|
4753
|
+
cleanupHttpClient;
|
|
4753
4754
|
namespace;
|
|
4754
4755
|
skippedFunctionNames;
|
|
4755
4756
|
triggerFunctions;
|
|
@@ -4770,10 +4771,14 @@ export class DoBackend {
|
|
|
4770
4771
|
publicationTableInfoCache = null;
|
|
4771
4772
|
cdcRegistrationDirty = false;
|
|
4772
4773
|
readyPromise = null;
|
|
4774
|
+
closePromise = null;
|
|
4775
|
+
lifecycleAbort = new AbortController();
|
|
4776
|
+
removeExternalAbortListener = null;
|
|
4773
4777
|
operationMutex = new Mutex();
|
|
4774
4778
|
instanceId;
|
|
4775
4779
|
allowTransactionalDDL;
|
|
4776
4780
|
signalReplication;
|
|
4781
|
+
log;
|
|
4777
4782
|
// Transaction state. The Durable Object refuses raw SQL BEGIN/COMMIT/SAVEPOINT
|
|
4778
4783
|
// (Cloudflare requires ctx.storage.transaction()), so PG-style multi-call
|
|
4779
4784
|
// transactions can't ride on SQLite's own transaction machinery. Instead we
|
|
@@ -4810,9 +4815,25 @@ export class DoBackend {
|
|
|
4810
4815
|
this.namespace = namespace;
|
|
4811
4816
|
this.instanceId = opts?.instanceId ?? '';
|
|
4812
4817
|
this.allowTransactionalDDL = opts?.allowTransactionalDDL === true;
|
|
4818
|
+
this.log = opts?.log;
|
|
4813
4819
|
this.txOwner = opts?.txOwner || 'default';
|
|
4814
4820
|
this.signalReplication = opts?.signalReplication ?? signalReplicationChange;
|
|
4815
|
-
|
|
4821
|
+
if (opts?.signal) {
|
|
4822
|
+
const externalSignal = opts.signal;
|
|
4823
|
+
const abort = () => this.lifecycleAbort.abort(externalSignal.reason);
|
|
4824
|
+
if (externalSignal.aborted) {
|
|
4825
|
+
abort();
|
|
4826
|
+
}
|
|
4827
|
+
else {
|
|
4828
|
+
externalSignal.addEventListener('abort', abort, { once: true });
|
|
4829
|
+
this.removeExternalAbortListener = () => externalSignal.removeEventListener('abort', abort);
|
|
4830
|
+
}
|
|
4831
|
+
}
|
|
4832
|
+
this.httpClient = new HttpClient(opts?.fetch, this.lifecycleAbort.signal);
|
|
4833
|
+
// transaction rollback is part of close itself. it must remain usable after
|
|
4834
|
+
// lifecycleAbort stops ordinary queries, and close joins this request before
|
|
4835
|
+
// allowing the owning runtime generation to be released.
|
|
4836
|
+
this.cleanupHttpClient = new HttpClient(opts?.fetch);
|
|
4816
4837
|
this.skippedFunctionNames = getSkippedFunctionNames(dbName, namespace, this.instanceId);
|
|
4817
4838
|
this.triggerFunctions = new Map();
|
|
4818
4839
|
this.schemaMetadata = new Map();
|
|
@@ -4824,6 +4845,12 @@ export class DoBackend {
|
|
|
4824
4845
|
return this.ensureReady();
|
|
4825
4846
|
}
|
|
4826
4847
|
ensureReady() {
|
|
4848
|
+
try {
|
|
4849
|
+
this.assertOpen();
|
|
4850
|
+
}
|
|
4851
|
+
catch (error) {
|
|
4852
|
+
return Promise.reject(error);
|
|
4853
|
+
}
|
|
4827
4854
|
if (this.ready)
|
|
4828
4855
|
return Promise.resolve();
|
|
4829
4856
|
if (!this.readyPromise) {
|
|
@@ -4834,25 +4861,97 @@ export class DoBackend {
|
|
|
4834
4861
|
}
|
|
4835
4862
|
return this.readyPromise;
|
|
4836
4863
|
}
|
|
4864
|
+
assertOpen() {
|
|
4865
|
+
if (this.closed)
|
|
4866
|
+
throw new Error('DoBackend closed');
|
|
4867
|
+
this.lifecycleAbort.signal.throwIfAborted();
|
|
4868
|
+
}
|
|
4869
|
+
emitInitEvent(event) {
|
|
4870
|
+
try {
|
|
4871
|
+
this.log?.({
|
|
4872
|
+
component: 'do-backend',
|
|
4873
|
+
database: this.dbName,
|
|
4874
|
+
instanceId: this.instanceId,
|
|
4875
|
+
namespace: this.namespace,
|
|
4876
|
+
...event,
|
|
4877
|
+
});
|
|
4878
|
+
}
|
|
4879
|
+
catch {
|
|
4880
|
+
// diagnostics cannot break initialization
|
|
4881
|
+
}
|
|
4882
|
+
}
|
|
4883
|
+
async runInitPhase(phase, run) {
|
|
4884
|
+
const startedAt = Date.now();
|
|
4885
|
+
this.emitInitEvent({ event: 'do-backend-init-phase-start', phase });
|
|
4886
|
+
try {
|
|
4887
|
+
const result = await run();
|
|
4888
|
+
this.emitInitEvent({
|
|
4889
|
+
event: 'do-backend-init-phase-complete',
|
|
4890
|
+
phase,
|
|
4891
|
+
phaseElapsedMs: Date.now() - startedAt,
|
|
4892
|
+
});
|
|
4893
|
+
return result;
|
|
4894
|
+
}
|
|
4895
|
+
catch (error) {
|
|
4896
|
+
this.emitInitEvent({
|
|
4897
|
+
error: error instanceof Error ? error.message : String(error),
|
|
4898
|
+
event: 'do-backend-init-phase-failed',
|
|
4899
|
+
phase,
|
|
4900
|
+
phaseElapsedMs: Date.now() - startedAt,
|
|
4901
|
+
});
|
|
4902
|
+
throw error;
|
|
4903
|
+
}
|
|
4904
|
+
}
|
|
4837
4905
|
async init() {
|
|
4838
|
-
|
|
4906
|
+
this.assertOpen();
|
|
4907
|
+
await this.runInitPhase('module-load', loadModule);
|
|
4908
|
+
this.assertOpen();
|
|
4839
4909
|
try {
|
|
4840
|
-
await this.httpClient.post(this.url('/exec'), JSON.stringify({ sql: 'SELECT 1' }));
|
|
4910
|
+
await this.runInitPhase('connection-probe', () => this.httpClient.post(this.url('/exec'), JSON.stringify({ sql: 'SELECT 1' })));
|
|
4841
4911
|
}
|
|
4842
4912
|
catch { }
|
|
4913
|
+
this.assertOpen();
|
|
4843
4914
|
if (this.dbName === 'postgres')
|
|
4844
4915
|
await this.ensureChangeTrackingTables();
|
|
4916
|
+
this.assertOpen();
|
|
4845
4917
|
await this.loadDurableMetadata();
|
|
4918
|
+
this.assertOpen();
|
|
4846
4919
|
this.ready = true;
|
|
4847
4920
|
}
|
|
4848
4921
|
async ensureChangeTrackingTables() {
|
|
4849
|
-
|
|
4850
|
-
|
|
4851
|
-
|
|
4852
|
-
|
|
4853
|
-
|
|
4854
|
-
|
|
4855
|
-
|
|
4922
|
+
const statements = [
|
|
4923
|
+
[
|
|
4924
|
+
'change-tracking-log-table',
|
|
4925
|
+
"CREATE TABLE IF NOT EXISTS \"_zero_changes\" (watermark INTEGER PRIMARY KEY AUTOINCREMENT, table_name TEXT NOT NULL, op TEXT NOT NULL CHECK (op IN ('INSERT', 'UPDATE', 'DELETE')), row_data TEXT, old_data TEXT, created_at INTEGER NOT NULL DEFAULT (unixepoch()))",
|
|
4926
|
+
],
|
|
4927
|
+
[
|
|
4928
|
+
'change-tracking-state-table',
|
|
4929
|
+
'CREATE TABLE IF NOT EXISTS "_zero_change_state" (id INTEGER PRIMARY KEY CHECK (id = 1), last_value INTEGER NOT NULL DEFAULT 0)',
|
|
4930
|
+
],
|
|
4931
|
+
[
|
|
4932
|
+
'change-tracking-state-seed',
|
|
4933
|
+
'INSERT OR IGNORE INTO "_zero_change_state" (id, last_value) VALUES (1, 0)',
|
|
4934
|
+
],
|
|
4935
|
+
[
|
|
4936
|
+
'change-tracking-watermark-table',
|
|
4937
|
+
'CREATE TABLE IF NOT EXISTS "_orez___zero_watermark" (dummy INTEGER PRIMARY KEY DEFAULT 1, last_value INTEGER NOT NULL DEFAULT 1, is_called INTEGER NOT NULL DEFAULT 0)',
|
|
4938
|
+
],
|
|
4939
|
+
[
|
|
4940
|
+
'change-tracking-watermark-seed',
|
|
4941
|
+
'INSERT OR IGNORE INTO "_orez___zero_watermark" (dummy, last_value, is_called) VALUES (1, 1, 0)',
|
|
4942
|
+
],
|
|
4943
|
+
[
|
|
4944
|
+
'change-tracking-replication-slots-table',
|
|
4945
|
+
"CREATE TABLE IF NOT EXISTS \"_orez__zero_replication_slots\" (slot_name TEXT PRIMARY KEY, restart_lsn TEXT NOT NULL DEFAULT '0/1000000', confirmed_flush_lsn TEXT NOT NULL DEFAULT '0/1000000', wal_status TEXT NOT NULL DEFAULT 'reserved', plugin TEXT NOT NULL DEFAULT 'pgoutput', slot_type TEXT NOT NULL DEFAULT 'logical', active INTEGER NOT NULL DEFAULT 0, active_pid INTEGER DEFAULT NULL, created_at INTEGER NOT NULL DEFAULT (unixepoch()))",
|
|
4946
|
+
],
|
|
4947
|
+
[
|
|
4948
|
+
'change-tracking-streamed-batches-table',
|
|
4949
|
+
'CREATE TABLE IF NOT EXISTS "_orez___zero_streamed_batches" (batch_lsn INTEGER PRIMARY KEY, batch_end INTEGER NOT NULL)',
|
|
4950
|
+
],
|
|
4951
|
+
];
|
|
4952
|
+
for (const [phase, sql] of statements) {
|
|
4953
|
+
await this.runInitPhase(phase, () => this.doExecResult(sql));
|
|
4954
|
+
}
|
|
4856
4955
|
}
|
|
4857
4956
|
async ensureMetadataTable() {
|
|
4858
4957
|
await this.doExecResult(metadataTableDDL());
|
|
@@ -4901,8 +5000,8 @@ export class DoBackend {
|
|
|
4901
5000
|
}
|
|
4902
5001
|
async loadDurableMetadata() {
|
|
4903
5002
|
try {
|
|
4904
|
-
await this.ensureMetadataTable();
|
|
4905
|
-
const result = await this.doExecResult(`SELECT kind, key, subkey, value FROM ${quoteIdentifier(METADATA_TABLE)}`);
|
|
5003
|
+
await this.runInitPhase('durable-metadata-table', () => this.ensureMetadataTable());
|
|
5004
|
+
const result = await this.runInitPhase('durable-metadata-read', () => this.doExecResult(`SELECT kind, key, subkey, value FROM ${quoteIdentifier(METADATA_TABLE)}`));
|
|
4906
5005
|
this.lastPersistedMetadata = new Map();
|
|
4907
5006
|
for (const row of result.rows) {
|
|
4908
5007
|
const kind = String(row.kind ?? '');
|
|
@@ -4922,8 +5021,9 @@ export class DoBackend {
|
|
|
4922
5021
|
this.fkRegistry.add(key, JSON.parse(value));
|
|
4923
5022
|
}
|
|
4924
5023
|
}
|
|
4925
|
-
|
|
4926
|
-
|
|
5024
|
+
const repaired = await this.runInitPhase('shard-metadata-repair', () => this.repairShardMetadataPublications());
|
|
5025
|
+
if (repaired) {
|
|
5026
|
+
await this.runInitPhase('durable-metadata-persist', () => this.persistDurableMetadata());
|
|
4927
5027
|
}
|
|
4928
5028
|
}
|
|
4929
5029
|
catch { }
|
|
@@ -5090,18 +5190,29 @@ export class DoBackend {
|
|
|
5090
5190
|
this.operationMutex.release();
|
|
5091
5191
|
}
|
|
5092
5192
|
}
|
|
5093
|
-
|
|
5094
|
-
|
|
5095
|
-
|
|
5096
|
-
|
|
5097
|
-
|
|
5098
|
-
|
|
5099
|
-
|
|
5100
|
-
|
|
5101
|
-
|
|
5193
|
+
close() {
|
|
5194
|
+
if (this.closePromise)
|
|
5195
|
+
return this.closePromise;
|
|
5196
|
+
this.closed = true;
|
|
5197
|
+
if (!this.lifecycleAbort.signal.aborted) {
|
|
5198
|
+
this.lifecycleAbort.abort(new Error('DoBackend closed'));
|
|
5199
|
+
}
|
|
5200
|
+
const initialization = this.readyPromise;
|
|
5201
|
+
this.closePromise = (async () => {
|
|
5202
|
+
try {
|
|
5203
|
+
await initialization?.catch(() => { });
|
|
5204
|
+
await this.runExclusive(async () => {
|
|
5205
|
+
if (this.inTransaction) {
|
|
5206
|
+
await this.rollbackTransaction(this.cleanupHttpClient, true);
|
|
5207
|
+
}
|
|
5208
|
+
});
|
|
5102
5209
|
}
|
|
5103
|
-
|
|
5104
|
-
|
|
5210
|
+
finally {
|
|
5211
|
+
this.removeExternalAbortListener?.();
|
|
5212
|
+
this.removeExternalAbortListener = null;
|
|
5213
|
+
}
|
|
5214
|
+
})();
|
|
5215
|
+
return this.closePromise;
|
|
5105
5216
|
}
|
|
5106
5217
|
readyForQuery() {
|
|
5107
5218
|
return buildReadyForQuery(this.inTransaction ? STATUS_TRANSACTION : STATUS_IDLE);
|
|
@@ -5223,7 +5334,7 @@ export class DoBackend {
|
|
|
5223
5334
|
if (shouldSignal)
|
|
5224
5335
|
this.signalReplication();
|
|
5225
5336
|
}
|
|
5226
|
-
async rollbackTransaction() {
|
|
5337
|
+
async rollbackTransaction(httpClient = this.httpClient, closing = false) {
|
|
5227
5338
|
if (!this.inTransaction) {
|
|
5228
5339
|
this.clearTransactionState();
|
|
5229
5340
|
return;
|
|
@@ -5237,15 +5348,19 @@ export class DoBackend {
|
|
|
5237
5348
|
(this.txHasTrackedWrite ||
|
|
5238
5349
|
this.txDataSnapshots.size > 0 ||
|
|
5239
5350
|
this.txSchemaSnapshotted)) {
|
|
5240
|
-
await
|
|
5351
|
+
await httpClient.post(this.url('/rollback-tx'), JSON.stringify({ transactionID: txID }), { 'Content-Type': 'application/json' });
|
|
5241
5352
|
}
|
|
5242
5353
|
}
|
|
5243
5354
|
finally {
|
|
5244
5355
|
if (snapshot)
|
|
5245
5356
|
this.restoreTransactionMetadataSnapshot(snapshot);
|
|
5246
|
-
|
|
5357
|
+
// a closing backend is being discarded. the atomic remote rollback above
|
|
5358
|
+
// is the required cleanup; post-rollback metadata/cache refreshes are only
|
|
5359
|
+
// useful to a backend that will continue serving queries.
|
|
5360
|
+
if (!closing)
|
|
5361
|
+
await this.persistDurableMetadata();
|
|
5247
5362
|
this.clearTransactionState();
|
|
5248
|
-
if (snapshot)
|
|
5363
|
+
if (snapshot && !closing)
|
|
5249
5364
|
await this.ensureCdcRegistration();
|
|
5250
5365
|
}
|
|
5251
5366
|
}
|
|
@@ -7742,20 +7857,28 @@ export class DoBackend {
|
|
|
7742
7857
|
}
|
|
7743
7858
|
class HttpClient {
|
|
7744
7859
|
fetcher;
|
|
7745
|
-
|
|
7860
|
+
signal;
|
|
7861
|
+
constructor(fetcher = fetch, signal) {
|
|
7746
7862
|
this.fetcher = fetcher;
|
|
7863
|
+
this.signal = signal;
|
|
7747
7864
|
}
|
|
7748
7865
|
async post(url, body, headers) {
|
|
7866
|
+
this.signal?.throwIfAborted();
|
|
7749
7867
|
const resp = await this.fetcher(url, {
|
|
7750
7868
|
method: 'POST',
|
|
7751
7869
|
headers: headers ?? { 'Content-Type': 'application/json' },
|
|
7752
7870
|
body,
|
|
7871
|
+
signal: this.signal,
|
|
7753
7872
|
});
|
|
7873
|
+
this.signal?.throwIfAborted();
|
|
7754
7874
|
if (!resp.ok) {
|
|
7755
7875
|
const text = await resp.text().catch(() => '');
|
|
7876
|
+
this.signal?.throwIfAborted();
|
|
7756
7877
|
throw new Error(`HTTP ${resp.status}: ${text.slice(0, 5000)}`);
|
|
7757
7878
|
}
|
|
7758
|
-
|
|
7879
|
+
const text = await resp.text();
|
|
7880
|
+
this.signal?.throwIfAborted();
|
|
7881
|
+
return text;
|
|
7759
7882
|
}
|
|
7760
7883
|
}
|
|
7761
7884
|
//# sourceMappingURL=pg-proxy-do-backend.js.map
|