@dbos-inc/dbos-enterprise 5.3.1-preview → 5.4.1-preview

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +4 -2
  2. package/dist/src/auto_upgrade.d.ts +52 -0
  3. package/dist/src/auto_upgrade.d.ts.map +1 -0
  4. package/dist/src/auto_upgrade.js +273 -0
  5. package/dist/src/auto_upgrade.js.map +1 -0
  6. package/dist/src/cockroach.d.ts +4 -0
  7. package/dist/src/cockroach.d.ts.map +1 -0
  8. package/dist/src/cockroach.js +22 -0
  9. package/dist/src/cockroach.js.map +1 -0
  10. package/dist/src/conductor/conductor.d.ts +39 -0
  11. package/dist/src/conductor/conductor.d.ts.map +1 -0
  12. package/dist/src/conductor/conductor.js +948 -0
  13. package/dist/src/conductor/conductor.js.map +1 -0
  14. package/dist/src/conductor/protocol.d.ts +594 -0
  15. package/dist/src/conductor/protocol.d.ts.map +1 -0
  16. package/dist/src/conductor/protocol.js +447 -0
  17. package/dist/src/conductor/protocol.js.map +1 -0
  18. package/dist/src/export.d.ts +12 -0
  19. package/dist/src/export.d.ts.map +1 -0
  20. package/dist/src/export.js +190 -0
  21. package/dist/src/export.js.map +1 -0
  22. package/dist/src/fork.d.ts +11 -0
  23. package/dist/src/fork.d.ts.map +1 -0
  24. package/dist/src/fork.js +63 -0
  25. package/dist/src/fork.js.map +1 -0
  26. package/dist/src/index.d.ts +2 -1
  27. package/dist/src/index.d.ts.map +1 -1
  28. package/dist/src/index.js +5 -3
  29. package/dist/src/index.js.map +1 -1
  30. package/dist/src/observability.d.ts +82 -0
  31. package/dist/src/observability.d.ts.map +1 -0
  32. package/dist/src/observability.js +378 -0
  33. package/dist/src/observability.js.map +1 -0
  34. package/dist/src/retention.d.ts +49 -0
  35. package/dist/src/retention.d.ts.map +1 -0
  36. package/dist/src/retention.js +436 -0
  37. package/dist/src/retention.js.map +1 -0
  38. package/package.json +11 -3
  39. package/dist/src/scratch.d.ts +0 -9
  40. package/dist/src/scratch.d.ts.map +0 -1
  41. package/dist/src/scratch.js +0 -15
  42. package/dist/src/scratch.js.map +0 -1
package/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # DBOS Enterprise for TypeScript
2
2
 
3
- Closed-source extension of [DBOS Transact](https://github.com/dbos-inc/dbos-transact-ts).
4
- Requires a DBOS Conductor API key.
3
+ Closed-source extension of [DBOS Transact](https://github.com/dbos-inc/dbos-transact-ts)
4
+ that connects applications to DBOS Conductor. Requires a DBOS Conductor API key.
5
+ DBOS loads it automatically when you pass `conductorKey` to `DBOS.launch`, or
6
+ when running in DBOS Cloud.
5
7
  Licensed under the [DBOS Conductor Software License](https://www.dbos.dev/conductor-license).
6
8
 
7
9
  ```
@@ -0,0 +1,52 @@
1
+ import type { EnrolledWorkflow } from '@dbos-inc/dbos-sdk/internal/auto_upgrade';
2
+ import type { DBOSExecutor } from '@dbos-inc/dbos-sdk/internal/dbos-executor';
3
+ import type { AutoUpgradeOptions, AutoUpgradePass as AutoUpgradePassContract } from '@dbos-inc/dbos-sdk/internal/enterprise';
4
+ import { type SystemDatabase, type VersionInfo } from '@dbos-inc/dbos-sdk/internal/system_database';
5
+ export declare const DEFAULT_CHUNK_SIZE = 1000;
6
+ /**
7
+ * The pg_try_advisory_lock argument for one application's auto-upgrade: the leading 8 bytes of
8
+ * SHA-256 over a fixed string, read as a signed big-endian 64-bit integer. Every DBOS SDK derives
9
+ * the key this way, so passes in different languages against one system database contend for the
10
+ * same lock; changing it here changes it everywhere.
11
+ */
12
+ export declare function autoUpgradeLockKey(schemaName: string, appName: string): bigint;
13
+ /**
14
+ * A session-scoped advisory lock on one dedicated connection, held across passes. The connection
15
+ * is registered with the system database so its destroy() cuts it, lock included. CockroachDB
16
+ * has no advisory locks and always takes it, so it upgrades unprotected rather than not at all.
17
+ */
18
+ export declare class AutoUpgradeLease {
19
+ #private;
20
+ readonly sysdb: SystemDatabase;
21
+ readonly key: string;
22
+ held: boolean;
23
+ constructor(sysdb: SystemDatabase, appName: string);
24
+ acquire(): Promise<boolean>;
25
+ release(): Promise<void>;
26
+ }
27
+ /** The hook tests use to stop a pass while a chunk is in flight. */
28
+ export declare const chunkHooks: {
29
+ afterChunk: (() => void) | undefined;
30
+ };
31
+ export interface UpgradePassOptions {
32
+ chunkSize?: number;
33
+ graceMs?: number;
34
+ }
35
+ /**
36
+ * Upgrade the enrolled workflows' work from previous application versions to `latestVersion`.
37
+ *
38
+ * Three phases, each collecting the rows to move and then moving them in chunks: the
39
+ * ENQUEUED rows, the DELAYED rows, then the PENDING rows. The PENDING phase is skipped until
40
+ * the latest version has been the latest for `graceMs`. Returns how many rows moved.
41
+ */
42
+ export declare function upgradePass(sysdb: SystemDatabase, workflows: readonly EnrolledWorkflow[], latestVersion: VersionInfo, signal: AbortSignal, options?: UpgradePassOptions): Promise<number>;
43
+ /** Satisfies core's AutoUpgradePass contract: core's loop calls run() on a timer and close() when it stops. */
44
+ export declare class AutoUpgradePass implements AutoUpgradePassContract {
45
+ readonly executor: DBOSExecutor;
46
+ readonly lease: AutoUpgradeLease;
47
+ readonly graceMs: number;
48
+ constructor(executor: DBOSExecutor, options: AutoUpgradeOptions);
49
+ close(): Promise<void>;
50
+ run(signal: AbortSignal): Promise<number>;
51
+ }
52
+ //# sourceMappingURL=auto_upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto_upgrade.d.ts","sourceRoot":"","sources":["../../src/auto_upgrade.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,IAAI,uBAAuB,EAC3C,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,6CAA6C,CAAC;AAKrD,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;GAIG;AACH,qBAAa,gBAAgB;;IAMzB,QAAQ,CAAC,KAAK,EAAE,cAAc;IALhC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,IAAI,UAAS;gBAGF,KAAK,EAAE,cAAc,EAC9B,OAAO,EAAE,MAAM;IAKX,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IA8B3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B/B;AAwED,oEAAoE;AACpE,eAAO,MAAM,UAAU;uBACW,IAAI;CACrC,CAAC;AAyDF,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,aAAa,EAAE,WAAW,EAC1B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED,+GAA+G;AAC/G,qBAAa,eAAgB,YAAW,uBAAuB;IAK3D,QAAQ,CAAC,QAAQ,EAAE,YAAY;IAJjC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAGd,QAAQ,EAAE,YAAY,EAC/B,OAAO,EAAE,kBAAkB;IAUvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAkChD"}
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ // Auto-upgrade: hand work left on an older application version to the latest one.
3
+ //
4
+ // This file declares the logic for one auto-upgrade pass. Core owns the loop that calls it.
5
+ //
6
+ // Each pass:
7
+ // - skips unless this executor runs the latest application version;
8
+ // - takes a session advisory lock, so only one pass runs at a time per application;
9
+ // - moves the rows.
10
+ //
11
+ // PENDING workflows get a grace period of `graceMs` before the pass moves them.
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AutoUpgradePass = exports.upgradePass = exports.chunkHooks = exports.AutoUpgradeLease = exports.autoUpgradeLockKey = exports.DEFAULT_CHUNK_SIZE = void 0;
14
+ const cockroach_1 = require("./cockroach");
15
+ const error_1 = require("@dbos-inc/dbos-sdk/internal/error");
16
+ const context_1 = require("@dbos-inc/dbos-sdk/internal/context");
17
+ const system_database_1 = require("@dbos-inc/dbos-sdk/internal/system_database");
18
+ const utils_1 = require("@dbos-inc/dbos-sdk/internal/utils");
19
+ const workflow_1 = require("@dbos-inc/dbos-sdk/internal/workflow");
20
+ exports.DEFAULT_CHUNK_SIZE = 1000;
21
+ /**
22
+ * The pg_try_advisory_lock argument for one application's auto-upgrade: the leading 8 bytes of
23
+ * SHA-256 over a fixed string, read as a signed big-endian 64-bit integer. Every DBOS SDK derives
24
+ * the key this way, so passes in different languages against one system database contend for the
25
+ * same lock; changing it here changes it everywhere.
26
+ */
27
+ function autoUpgradeLockKey(schemaName, appName) {
28
+ return (0, system_database_1.advisoryLockKey)(`dbos.auto_upgrade.${schemaName}.${appName}`);
29
+ }
30
+ exports.autoUpgradeLockKey = autoUpgradeLockKey;
31
+ /**
32
+ * A session-scoped advisory lock on one dedicated connection, held across passes. The connection
33
+ * is registered with the system database so its destroy() cuts it, lock included. CockroachDB
34
+ * has no advisory locks and always takes it, so it upgrades unprotected rather than not at all.
35
+ */
36
+ class AutoUpgradeLease {
37
+ sysdb;
38
+ key;
39
+ #client = undefined;
40
+ held = false;
41
+ constructor(sysdb, appName) {
42
+ this.sysdb = sysdb;
43
+ this.key = autoUpgradeLockKey(sysdb.schemaName, appName).toString();
44
+ }
45
+ async acquire() {
46
+ if (await (0, cockroach_1.isCockroach)(this.sysdb)) {
47
+ this.held = true;
48
+ return true;
49
+ }
50
+ // Held on a valid connection.
51
+ if (this.held && this.#client && this.sysdb.retentionClients.has(this.#client)) {
52
+ return true;
53
+ }
54
+ // Otherwise, let go of whatever is left and take it afresh.
55
+ await this.release();
56
+ if (this.sysdb.destroyed) {
57
+ return false;
58
+ }
59
+ const client = await this.sysdb.connect();
60
+ this.sysdb.retentionClients.add(client);
61
+ this.#client = client;
62
+ try {
63
+ const { rows } = await client.query('SELECT pg_try_advisory_lock($1) AS locked', [this.key]);
64
+ this.held = rows[0]?.locked === true;
65
+ }
66
+ catch (e) {
67
+ await this.release();
68
+ throw e;
69
+ }
70
+ if (!this.held) {
71
+ await this.release();
72
+ }
73
+ return this.held;
74
+ }
75
+ async release() {
76
+ const client = this.#client;
77
+ const held = this.held;
78
+ this.#client = undefined;
79
+ this.held = false;
80
+ if (!client) {
81
+ return;
82
+ }
83
+ if (!this.sysdb.retentionClients.delete(client)) {
84
+ return;
85
+ }
86
+ try {
87
+ if (held) {
88
+ const { rows } = await client.query('SELECT pg_advisory_unlock($1) AS released', [
89
+ this.key,
90
+ ]);
91
+ if (rows[0]?.released !== true) {
92
+ this.sysdb.logger.warn('Could not release the auto-upgrade lock: this session no longer holds it.');
93
+ }
94
+ }
95
+ }
96
+ catch (e) {
97
+ this.sysdb.logger.warn(`Could not release the auto-upgrade lock: ${e.message}`);
98
+ }
99
+ finally {
100
+ client.release();
101
+ }
102
+ }
103
+ }
104
+ exports.AutoUpgradeLease = AutoUpgradeLease;
105
+ /** Rows of this application, under an enrolled workflow's name. */
106
+ function scopePredicate(sysdb, workflows, params) {
107
+ const app = sysdb.appNameFilter('application_name', sysdb.appName, params);
108
+ // A free function's class name is stored as NULL, which '' names in the registry.
109
+ params.push(workflows.map((w) => (w.className === '' ? null : w.className)));
110
+ const classNames = `$${params.length}::text[]`;
111
+ params.push(workflows.map((w) => w.name));
112
+ const names = `$${params.length}::text[]`;
113
+ return `${app} AND EXISTS (
114
+ SELECT 1 FROM unnest(${classNames}, ${names}) AS enrolled(class_name, name)
115
+ WHERE enrolled.name = ws.name AND enrolled.class_name IS NOT DISTINCT FROM ws.class_name)`;
116
+ }
117
+ /** Rows of one queued status, ENQUEUED or DELAYED, pinned to a version other than the latest. */
118
+ function queuedPredicate(sysdb, workflows, latest, status) {
119
+ const params = [latest];
120
+ const sql = `ws.status = '${status}'
121
+ AND ${scopePredicate(sysdb, workflows, params)}
122
+ AND ws.application_version IS NOT NULL AND ws.application_version <> $1`;
123
+ return { sql, params };
124
+ }
125
+ /** PENDING rows on any version but the latest, none included. */
126
+ function pendingPredicate(sysdb, workflows, latest) {
127
+ const params = [latest];
128
+ const sql = `ws.status = '${workflow_1.StatusString.PENDING}'
129
+ AND ${scopePredicate(sysdb, workflows, params)}
130
+ AND ws.application_version IS DISTINCT FROM $1`;
131
+ return { sql, params };
132
+ }
133
+ async function collect(sysdb, predicate) {
134
+ const { rows } = await (0, system_database_1.withDbRetry)(() => sysdb.pool.query(`SELECT ws.workflow_uuid FROM "${sysdb.schemaName}".workflow_status ws WHERE ${predicate.sql}`, predicate.params));
135
+ return rows.map((r) => r.workflow_uuid);
136
+ }
137
+ // Dropping the application-version: the row then runs on whatever version dequeues it, which only the latest one will.
138
+ const UNPIN = { set: 'application_version = NULL', params: [] };
139
+ // Upgrading a PENDING workflow is a bit like recovery: clear the ownership and re-enqueue with no version.
140
+ const RECOVER = {
141
+ set: `status = '${workflow_1.StatusString.ENQUEUED}', application_version = NULL, owner_xid = NULL, started_at_epoch_ms = NULL,
142
+ updated_at = (EXTRACT(EPOCH FROM now()) * 1000)::bigint, queue_name = COALESCE(queue_name, $1)`,
143
+ params: [utils_1.INTERNAL_QUEUE_NAME],
144
+ };
145
+ /** The hook tests use to stop a pass while a chunk is in flight. */
146
+ exports.chunkHooks = {
147
+ afterChunk: undefined,
148
+ };
149
+ async function moveChunk(sysdb, ids, predicate, move) {
150
+ // Move params first, so the predicate's placeholders can be shifted by a fixed amount.
151
+ const params = [...move.params];
152
+ const shift = params.length;
153
+ const where = predicate.sql.replace(/\$(\d+)/g, (_, n) => `$${Number(n) + shift}`);
154
+ params.push(...predicate.params);
155
+ params.push(ids);
156
+ // SKIP LOCKED: upgrading ENQUEUED/DELAYED rows competes with queue workers flipping them to PENDING,
157
+ // which the PENDING phase then resolves; upgrading PENDING rows competes with their executors, and
158
+ // either they win and make progress, or we win and clear ownership.
159
+ const result = await (0, system_database_1.withDbRetry)(() => sysdb.pool.query(`UPDATE "${sysdb.schemaName}".workflow_status
160
+ SET ${move.set}
161
+ WHERE workflow_uuid IN (
162
+ SELECT ws.workflow_uuid FROM "${sysdb.schemaName}".workflow_status ws
163
+ WHERE ws.workflow_uuid = ANY($${params.length}) AND ${where}
164
+ FOR UPDATE SKIP LOCKED)`, params));
165
+ exports.chunkHooks.afterChunk?.();
166
+ return result.rowCount ?? 0;
167
+ }
168
+ async function moveAll(sysdb, what, predicate, move, signal, chunkSize) {
169
+ // The collect and the chunks retry transient database failures, until the pass is stopped.
170
+ return (0, context_1.runWithAbortableDbRetries)(signal, async () => {
171
+ // Collect the IDs first: the application version is not indexed, so every chunk would
172
+ // otherwise walk the rows it already upgraded.
173
+ const ids = await collect(sysdb, predicate);
174
+ let moved = 0;
175
+ for (let start = 0; start < ids.length; start += chunkSize) {
176
+ if (signal.aborted)
177
+ break;
178
+ // Each chunk is its own transaction.
179
+ const rows = await moveChunk(sysdb, ids.slice(start, start + chunkSize), predicate, move);
180
+ moved += rows;
181
+ sysdb.logger.debug(`Auto-upgrade moved ${rows} ${what} workflows (chunk)`);
182
+ }
183
+ return moved;
184
+ });
185
+ }
186
+ /**
187
+ * Upgrade the enrolled workflows' work from previous application versions to `latestVersion`.
188
+ *
189
+ * Three phases, each collecting the rows to move and then moving them in chunks: the
190
+ * ENQUEUED rows, the DELAYED rows, then the PENDING rows. The PENDING phase is skipped until
191
+ * the latest version has been the latest for `graceMs`. Returns how many rows moved.
192
+ */
193
+ async function upgradePass(sysdb, workflows, latestVersion, signal, options = {}) {
194
+ const chunkSize = options.chunkSize ?? exports.DEFAULT_CHUNK_SIZE;
195
+ const graceMs = options.graceMs ?? 0;
196
+ const latest = latestVersion.versionName;
197
+ // One collect per queued status so the query can use their partial index.
198
+ let moved = 0;
199
+ for (const [what, status] of [
200
+ ['enqueued', workflow_1.StatusString.ENQUEUED],
201
+ ['delayed', workflow_1.StatusString.DELAYED],
202
+ ]) {
203
+ if (signal.aborted)
204
+ break;
205
+ moved += await moveAll(sysdb, what, queuedPredicate(sysdb, workflows, latest, status), UNPIN, signal, chunkSize);
206
+ }
207
+ // PENDING rows wait out the grace period, measured from when the version became the latest.
208
+ const settledForMs = Date.now() - latestVersion.versionTimestamp;
209
+ if (settledForMs < graceMs) {
210
+ sysdb.logger.debug(`Auto-upgrade: version ${latest} became the latest ${Math.round(settledForMs / 1000)}s ago, ` +
211
+ `PENDING workflows wait out the ${graceMs}ms grace period`);
212
+ return moved;
213
+ }
214
+ if (!signal.aborted) {
215
+ moved += await moveAll(sysdb, 'pending', pendingPredicate(sysdb, workflows, latest), RECOVER, signal, chunkSize);
216
+ }
217
+ return moved;
218
+ }
219
+ exports.upgradePass = upgradePass;
220
+ /** Satisfies core's AutoUpgradePass contract: core's loop calls run() on a timer and close() when it stops. */
221
+ class AutoUpgradePass {
222
+ executor;
223
+ lease;
224
+ graceMs;
225
+ constructor(executor, options) {
226
+ this.executor = executor;
227
+ const appName = executor.systemDatabase.appName;
228
+ if (appName === undefined) {
229
+ throw new error_1.DBOSInitializationError('Auto-upgrading workflows requires an application name');
230
+ }
231
+ this.lease = new AutoUpgradeLease(executor.systemDatabase, appName);
232
+ this.graceMs = options.graceMs;
233
+ }
234
+ async close() {
235
+ await this.lease.release();
236
+ }
237
+ async run(signal) {
238
+ const sysdb = this.executor.systemDatabase;
239
+ sysdb.logger.debug('Starting auto-upgrade pass');
240
+ const workflows = this.executor.autoUpgradableWorkflows();
241
+ if (workflows.length === 0) {
242
+ return 0;
243
+ }
244
+ let latestVersion;
245
+ try {
246
+ latestVersion = await sysdb.getLatestApplicationVersion();
247
+ }
248
+ catch (e) {
249
+ // Nothing registered yet: there is no latest version to move work to.
250
+ if (e instanceof error_1.DBOSInitializationError)
251
+ return 0;
252
+ throw e;
253
+ }
254
+ if (latestVersion.versionName !== utils_1.globalParams.appVersion) {
255
+ // Only the latest version moves work. Let go of the lease if we hold it, so an executor
256
+ // on the latest version can take it.
257
+ sysdb.logger.debug(`Auto-upgrade: skipping the pass, this executor runs version ${utils_1.globalParams.appVersion} ` +
258
+ `and the latest is ${latestVersion.versionName}`);
259
+ await this.lease.release();
260
+ return 0;
261
+ }
262
+ if (!(await this.lease.acquire())) {
263
+ return 0;
264
+ }
265
+ const moved = await upgradePass(sysdb, workflows, latestVersion, signal, { graceMs: this.graceMs });
266
+ if (moved > 0) {
267
+ sysdb.logger.info(`Auto-upgrade moved ${moved} workflows to the latest application version`);
268
+ }
269
+ return moved;
270
+ }
271
+ }
272
+ exports.AutoUpgradePass = AutoUpgradePass;
273
+ //# sourceMappingURL=auto_upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto_upgrade.js","sourceRoot":"","sources":["../../src/auto_upgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { SystemDatabase } from '@dbos-inc/dbos-sdk/internal/system_database';
2
+ /** Whether the system database is CockroachDB, asked once per system database. */
3
+ export declare function isCockroach(sysdb: SystemDatabase): Promise<boolean>;
4
+ //# sourceMappingURL=cockroach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cockroach.d.ts","sourceRoot":"","sources":["../../src/cockroach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAI5F,kFAAkF;AAClF,wBAAsB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAYzE"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCockroach = void 0;
4
+ const system_database_1 = require("@dbos-inc/dbos-sdk/internal/system_database");
5
+ const cockroachBySysDb = new WeakMap();
6
+ /** Whether the system database is CockroachDB, asked once per system database. */
7
+ async function isCockroach(sysdb) {
8
+ let cockroach = cockroachBySysDb.get(sysdb);
9
+ if (cockroach === undefined) {
10
+ const client = await sysdb.connect();
11
+ try {
12
+ cockroach = await (0, system_database_1.isCockroachDB)(client);
13
+ }
14
+ finally {
15
+ client.release();
16
+ }
17
+ cockroachBySysDb.set(sysdb, cockroach);
18
+ }
19
+ return cockroach;
20
+ }
21
+ exports.isCockroach = isCockroach;
22
+ //# sourceMappingURL=cockroach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cockroach.js","sourceRoot":"","sources":["../../src/cockroach.ts"],"names":[],"mappings":";;;AAAA,iFAA4F;AAE5F,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAA2B,CAAC;AAEhE,kFAAkF;AAC3E,KAAK,UAAU,WAAW,CAAC,KAAqB;IACrD,IAAI,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,IAAA,+BAAa,EAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAZD,kCAYC"}
@@ -0,0 +1,39 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { DBOSExecutor } from '@dbos-inc/dbos-sdk/internal/dbos-executor';
4
+ import WebSocket from 'ws';
5
+ import type { ConductorConnection, ConductorOptions } from '@dbos-inc/dbos-sdk/internal/enterprise';
6
+ interface IntervalTimeout {
7
+ interval: NodeJS.Timeout | undefined;
8
+ timeout: NodeJS.Timeout | undefined;
9
+ }
10
+ export declare class ConductorWebsocket implements ConductorConnection {
11
+ readonly dbosExec: DBOSExecutor;
12
+ url: string;
13
+ websocket: WebSocket | undefined;
14
+ isShuttingDown: boolean;
15
+ pingPeriodMs: number;
16
+ pingTimeoutMs: number;
17
+ pingIntervalTimeout: IntervalTimeout | undefined;
18
+ reconnectDelayMs: number;
19
+ reconnectTimeout: NodeJS.Timeout | undefined;
20
+ retentionRound: Promise<void> | undefined;
21
+ readonly appName: string;
22
+ readonly executorMetadata?: Record<string, unknown>;
23
+ readonly metadataOnlyMode: boolean;
24
+ constructor(dbosExec: DBOSExecutor, options: ConductorOptions);
25
+ start(): void;
26
+ /** Logs a command's exception in full and returns the error message Conductor may see. */
27
+ reportException(context: string, e: unknown): string;
28
+ resetWebsocket(currWebsocket?: WebSocket, currPing?: IntervalTimeout): void;
29
+ setPingInterval(currWebsocket: WebSocket, currPing: IntervalTimeout): void;
30
+ dispatchLoop(): void;
31
+ /**
32
+ * Give a round in flight a bounded chance to finish before shutdown takes the system
33
+ * database away from it.
34
+ */
35
+ awaitRetention(timeoutMs?: number): Promise<void>;
36
+ stop(): Promise<void>;
37
+ }
38
+ export {};
39
+ //# sourceMappingURL=conductor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conductor.d.ts","sourceRoot":"","sources":["../../../src/conductor/conductor.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAGzE,OAAO,SAAS,MAAM,IAAI,CAAC;AAO3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AA2BpG,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;CACrC;AAED,qBAAa,kBAAmB,YAAW,mBAAmB;IAiB1D,QAAQ,CAAC,QAAQ,EAAE,YAAY;IAhBjC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,SAAS,GAAG,SAAS,CAAa;IAC7C,cAAc,UAAS;IACvB,YAAY,SAAS;IACrB,aAAa,SAAS;IACtB,mBAAmB,EAAE,eAAe,GAAG,SAAS,CAAa;IAC7D,gBAAgB,SAAQ;IACxB,gBAAgB,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAa;IAEzD,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAa;IAEtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;gBAGxB,QAAQ,EAAE,YAAY,EAC/B,OAAO,EAAE,gBAAgB;IAU3B,KAAK;IAIL,0FAA0F;IAC1F,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM;IAUpD,cAAc,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,eAAe;IAoBpE,eAAe,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe;IAuBnE,YAAY;IAk5BZ;;;OAGG;IACG,cAAc,CAAC,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAW5B"}