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

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 (62) hide show
  1. package/README.md +4 -4
  2. package/dist/src/auto_upgrade.d.ts +39 -0
  3. package/dist/src/auto_upgrade.d.ts.map +1 -0
  4. package/dist/src/auto_upgrade.js +229 -0
  5. package/dist/src/auto_upgrade.js.map +1 -0
  6. package/dist/src/cockroach.d.ts +10 -0
  7. package/dist/src/cockroach.d.ts.map +1 -0
  8. package/dist/src/cockroach.js +28 -0
  9. package/dist/src/cockroach.js.map +1 -0
  10. package/dist/src/conductor/conductor.d.ts +42 -0
  11. package/dist/src/conductor/conductor.d.ts.map +1 -0
  12. package/dist/src/conductor/conductor.js +978 -0
  13. package/dist/src/conductor/conductor.js.map +1 -0
  14. package/dist/src/conductor/protocol.d.ts +618 -0
  15. package/dist/src/conductor/protocol.d.ts.map +1 -0
  16. package/dist/src/conductor/protocol.js +514 -0
  17. package/dist/src/conductor/protocol.js.map +1 -0
  18. package/dist/src/export.d.ts +19 -0
  19. package/dist/src/export.d.ts.map +1 -0
  20. package/dist/src/export.js +184 -0
  21. package/dist/src/export.js.map +1 -0
  22. package/dist/src/fork.d.ts +18 -0
  23. package/dist/src/fork.d.ts.map +1 -0
  24. package/dist/src/fork.js +71 -0
  25. package/dist/src/fork.js.map +1 -0
  26. package/dist/src/index.d.ts +10 -1
  27. package/dist/src/index.d.ts.map +1 -1
  28. package/dist/src/index.js +14 -3
  29. package/dist/src/index.js.map +1 -1
  30. package/dist/src/locks.d.ts +20 -0
  31. package/dist/src/locks.d.ts.map +1 -0
  32. package/dist/src/locks.js +47 -0
  33. package/dist/src/locks.js.map +1 -0
  34. package/dist/src/observability.d.ts +90 -0
  35. package/dist/src/observability.d.ts.map +1 -0
  36. package/dist/src/observability.js +398 -0
  37. package/dist/src/observability.js.map +1 -0
  38. package/dist/src/retention.d.ts +31 -0
  39. package/dist/src/retention.d.ts.map +1 -0
  40. package/dist/src/retention.js +408 -0
  41. package/dist/src/retention.js.map +1 -0
  42. package/dist/src/sharding/index.d.ts +9 -0
  43. package/dist/src/sharding/index.d.ts.map +1 -0
  44. package/dist/src/sharding/index.js +13 -0
  45. package/dist/src/sharding/index.js.map +1 -0
  46. package/dist/src/sharding/migrations.d.ts +20 -0
  47. package/dist/src/sharding/migrations.d.ts.map +1 -0
  48. package/dist/src/sharding/migrations.js +486 -0
  49. package/dist/src/sharding/migrations.js.map +1 -0
  50. package/dist/src/sharding/schema.d.ts +9 -0
  51. package/dist/src/sharding/schema.d.ts.map +1 -0
  52. package/dist/src/sharding/schema.js +12 -0
  53. package/dist/src/sharding/schema.js.map +1 -0
  54. package/dist/src/sharding/sys_db.d.ts +101 -0
  55. package/dist/src/sharding/sys_db.d.ts.map +1 -0
  56. package/dist/src/sharding/sys_db.js +717 -0
  57. package/dist/src/sharding/sys_db.js.map +1 -0
  58. package/package.json +14 -6
  59. package/dist/src/scratch.d.ts +0 -9
  60. package/dist/src/scratch.d.ts.map +0 -1
  61. package/dist/src/scratch.js +0 -15
  62. package/dist/src/scratch.js.map +0 -1
package/README.md CHANGED
@@ -1,11 +1,11 @@
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
  ```
8
10
  npm install @dbos-inc/dbos-sdk @dbos-inc/dbos-enterprise
9
11
  ```
10
-
11
- See [DEVELOPING.md](./DEVELOPING.md) to work on this repo.
@@ -0,0 +1,39 @@
1
+ // Copyright (c) 2026 DBOS, Inc. All rights reserved.
2
+ //
3
+ // This file is part of Transact Enterprise, proprietary software licensed under the
4
+ // DBOS Conductor Software License: https://www.dbos.dev/conductor-license
5
+ // You may not use, copy, modify, or distribute this file except as that license permits.
6
+ // Disabling or circumventing the entitlement checks in @dbos-inc/dbos-sdk's src/enterprise.ts
7
+ // that gate it is a material breach of that license.
8
+ import type { EnrolledWorkflow } from '@dbos-inc/dbos-sdk/internal/auto_upgrade';
9
+ import type { DBOSExecutor } from '@dbos-inc/dbos-sdk/internal/dbos-executor';
10
+ import type { AutoUpgradeOptions, AutoUpgradePass as AutoUpgradePassContract } from '@dbos-inc/dbos-sdk/internal/enterprise';
11
+ import { type SystemDatabase, type VersionInfo } from '@dbos-inc/dbos-sdk/internal/system_database';
12
+ export declare const DEFAULT_CHUNK_SIZE = 1000;
13
+ export declare function autoUpgradeLockKey(schemaName: string, appName: string): bigint;
14
+ export declare class AutoUpgradeLease {
15
+ #private;
16
+ readonly sysdb: SystemDatabase;
17
+ readonly key: string;
18
+ held: boolean;
19
+ constructor(sysdb: SystemDatabase, appName: string);
20
+ acquire(): Promise<boolean>;
21
+ release(): Promise<void>;
22
+ }
23
+ export declare const chunkHooks: {
24
+ afterChunk: (() => void) | undefined;
25
+ };
26
+ export interface UpgradePassOptions {
27
+ chunkSize?: number;
28
+ graceMs?: number;
29
+ }
30
+ export declare function upgradePass(sysdb: SystemDatabase, workflows: readonly EnrolledWorkflow[], latestVersion: VersionInfo, signal: AbortSignal, options?: UpgradePassOptions): Promise<number>;
31
+ export declare class AutoUpgradePass implements AutoUpgradePassContract {
32
+ readonly executor: DBOSExecutor;
33
+ readonly lease: AutoUpgradeLease;
34
+ readonly graceMs: number;
35
+ constructor(executor: DBOSExecutor, options: AutoUpgradeOptions);
36
+ close(): Promise<void>;
37
+ run(signal: AbortSignal): Promise<number>;
38
+ }
39
+ //# 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;AAQvC,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9E;AAOD,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;AAyED,eAAO,MAAM,UAAU;uBACW,IAAI;CACrC,CAAC;AAyDF,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD,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;AAGD,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,229 @@
1
+ // Copyright (c) 2026 DBOS, Inc. All rights reserved.
2
+ //
3
+ // This file is part of Transact Enterprise, proprietary software licensed under the
4
+ // DBOS Conductor Software License: https://www.dbos.dev/conductor-license
5
+ // You may not use, copy, modify, or distribute this file except as that license permits.
6
+ // Disabling or circumventing the entitlement checks in @dbos-inc/dbos-sdk's src/enterprise.ts
7
+ // that gate it is a material breach of that license.
8
+ "use strict";
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.AutoUpgradePass = exports.upgradePass = exports.chunkHooks = exports.AutoUpgradeLease = exports.autoUpgradeLockKey = exports.DEFAULT_CHUNK_SIZE = void 0;
11
+ const cockroach_1 = require("./cockroach");
12
+ const error_1 = require("@dbos-inc/dbos-sdk/internal/error");
13
+ const context_1 = require("@dbos-inc/dbos-sdk/internal/context");
14
+ const system_database_1 = require("@dbos-inc/dbos-sdk/internal/system_database");
15
+ const utils_1 = require("@dbos-inc/dbos-sdk/internal/utils");
16
+ const workflow_1 = require("@dbos-inc/dbos-sdk/internal/workflow");
17
+ exports.DEFAULT_CHUNK_SIZE = 1000;
18
+ function autoUpgradeLockKey(schemaName, appName) {
19
+ return (0, system_database_1.advisoryLockKey)(`dbos.auto_upgrade.${schemaName}.${appName}`);
20
+ }
21
+ exports.autoUpgradeLockKey = autoUpgradeLockKey;
22
+ class AutoUpgradeLease {
23
+ sysdb;
24
+ key;
25
+ #client = undefined;
26
+ held = false;
27
+ constructor(sysdb, appName) {
28
+ this.sysdb = sysdb;
29
+ this.key = autoUpgradeLockKey(sysdb.schemaName, appName).toString();
30
+ }
31
+ async acquire() {
32
+ if (await (0, cockroach_1.isCockroach)(this.sysdb)) {
33
+ this.held = true;
34
+ return true;
35
+ }
36
+ if (this.held && this.#client && this.sysdb.retentionClients.has(this.#client)) {
37
+ return true;
38
+ }
39
+ await this.release();
40
+ if (this.sysdb.destroyed) {
41
+ return false;
42
+ }
43
+ const client = await this.sysdb.connect();
44
+ this.sysdb.retentionClients.add(client);
45
+ this.#client = client;
46
+ try {
47
+ const { rows } = await client.query('SELECT pg_try_advisory_lock($1) AS locked', [this.key]);
48
+ this.held = rows[0]?.locked === true;
49
+ }
50
+ catch (e) {
51
+ await this.release();
52
+ throw e;
53
+ }
54
+ if (!this.held) {
55
+ await this.release();
56
+ }
57
+ return this.held;
58
+ }
59
+ async release() {
60
+ const client = this.#client;
61
+ const held = this.held;
62
+ this.#client = undefined;
63
+ this.held = false;
64
+ if (!client) {
65
+ return;
66
+ }
67
+ if (!this.sysdb.retentionClients.delete(client)) {
68
+ return;
69
+ }
70
+ try {
71
+ if (held) {
72
+ const { rows } = await client.query('SELECT pg_advisory_unlock($1) AS released', [
73
+ this.key,
74
+ ]);
75
+ if (rows[0]?.released !== true) {
76
+ this.sysdb.logger.warn('Could not release the auto-upgrade lock: this session no longer holds it.');
77
+ }
78
+ }
79
+ }
80
+ catch (e) {
81
+ this.sysdb.logger.warn(`Could not release the auto-upgrade lock: ${e.message}`);
82
+ }
83
+ finally {
84
+ client.release();
85
+ }
86
+ }
87
+ }
88
+ exports.AutoUpgradeLease = AutoUpgradeLease;
89
+ function scopePredicate(sysdb, workflows, params) {
90
+ const app = sysdb.appNameFilter('application_name', sysdb.appName, params);
91
+ params.push(workflows.map((w) => (w.className === '' ? null : w.className)));
92
+ const classNames = `$${params.length}::text[]`;
93
+ params.push(workflows.map((w) => w.name));
94
+ const names = `$${params.length}::text[]`;
95
+ return `${app} AND EXISTS (
96
+ SELECT 1 FROM unnest(${classNames}, ${names}) AS enrolled(class_name, name)
97
+ WHERE enrolled.name = ws.name AND enrolled.class_name IS NOT DISTINCT FROM ws.class_name)`;
98
+ }
99
+ function queuedPredicate(sysdb, workflows, latest, status) {
100
+ const params = [latest];
101
+ const sql = `ws.status = '${status}'
102
+ AND ${scopePredicate(sysdb, workflows, params)}
103
+ AND ws.application_version IS NOT NULL AND ws.application_version <> $1`;
104
+ return { sql, params };
105
+ }
106
+ function pendingPredicate(sysdb, workflows, latest) {
107
+ const params = [latest];
108
+ const sql = `ws.status = '${workflow_1.StatusString.PENDING}'
109
+ AND ${scopePredicate(sysdb, workflows, params)}
110
+ AND ws.application_version IS DISTINCT FROM $1`;
111
+ return { sql, params };
112
+ }
113
+ async function collect(sysdb, predicate) {
114
+ 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));
115
+ return rows.map((r) => r.workflow_uuid);
116
+ }
117
+ const UNPIN = { set: 'application_version = NULL', params: [] };
118
+ const RECOVER = {
119
+ set: `status = '${workflow_1.StatusString.ENQUEUED}', application_version = NULL, owner_xid = NULL, started_at_epoch_ms = NULL,
120
+ updated_at = (EXTRACT(EPOCH FROM now()) * 1000)::bigint, queue_name = COALESCE(queue_name, $1)`,
121
+ params: [utils_1.INTERNAL_QUEUE_NAME],
122
+ };
123
+ exports.chunkHooks = {
124
+ afterChunk: undefined,
125
+ };
126
+ async function moveChunk(sysdb, ids, predicate, move) {
127
+ const params = [...move.params];
128
+ const shift = params.length;
129
+ const where = predicate.sql.replace(/\$(\d+)/g, (_, n) => `$${Number(n) + shift}`);
130
+ params.push(...predicate.params);
131
+ params.push(ids);
132
+ const result = await (0, system_database_1.withDbRetry)(() => sysdb.pool.query(`UPDATE "${sysdb.schemaName}".workflow_status
133
+ SET ${move.set}
134
+ WHERE workflow_uuid IN (
135
+ SELECT ws.workflow_uuid FROM "${sysdb.schemaName}".workflow_status ws
136
+ WHERE ws.workflow_uuid = ANY($${params.length}) AND ${where}
137
+ FOR UPDATE SKIP LOCKED)`, params));
138
+ exports.chunkHooks.afterChunk?.();
139
+ return result.rowCount ?? 0;
140
+ }
141
+ async function moveAll(sysdb, what, predicate, move, signal, chunkSize) {
142
+ return (0, context_1.runWithAbortableDbRetries)(signal, async () => {
143
+ const ids = await collect(sysdb, predicate);
144
+ let moved = 0;
145
+ for (let start = 0; start < ids.length; start += chunkSize) {
146
+ if (signal.aborted)
147
+ break;
148
+ const rows = await moveChunk(sysdb, ids.slice(start, start + chunkSize), predicate, move);
149
+ moved += rows;
150
+ sysdb.logger.debug(`Auto-upgrade moved ${rows} ${what} workflows (chunk)`);
151
+ }
152
+ return moved;
153
+ });
154
+ }
155
+ async function upgradePass(sysdb, workflows, latestVersion, signal, options = {}) {
156
+ const chunkSize = options.chunkSize ?? exports.DEFAULT_CHUNK_SIZE;
157
+ const graceMs = options.graceMs ?? 0;
158
+ const latest = latestVersion.versionName;
159
+ let moved = 0;
160
+ for (const [what, status] of [
161
+ ['enqueued', workflow_1.StatusString.ENQUEUED],
162
+ ['delayed', workflow_1.StatusString.DELAYED],
163
+ ]) {
164
+ if (signal.aborted)
165
+ break;
166
+ moved += await moveAll(sysdb, what, queuedPredicate(sysdb, workflows, latest, status), UNPIN, signal, chunkSize);
167
+ }
168
+ const settledForMs = Date.now() - latestVersion.versionTimestamp;
169
+ if (settledForMs < graceMs) {
170
+ sysdb.logger.debug(`Auto-upgrade: version ${latest} became the latest ${Math.round(settledForMs / 1000)}s ago, ` +
171
+ `PENDING workflows wait out the ${graceMs}ms grace period`);
172
+ return moved;
173
+ }
174
+ if (!signal.aborted) {
175
+ moved += await moveAll(sysdb, 'pending', pendingPredicate(sysdb, workflows, latest), RECOVER, signal, chunkSize);
176
+ }
177
+ return moved;
178
+ }
179
+ exports.upgradePass = upgradePass;
180
+ class AutoUpgradePass {
181
+ executor;
182
+ lease;
183
+ graceMs;
184
+ constructor(executor, options) {
185
+ this.executor = executor;
186
+ const appName = executor.systemDatabase.appName;
187
+ if (appName === undefined) {
188
+ throw new error_1.DBOSInitializationError('Auto-upgrading workflows requires an application name');
189
+ }
190
+ this.lease = new AutoUpgradeLease(executor.systemDatabase, appName);
191
+ this.graceMs = options.graceMs;
192
+ }
193
+ async close() {
194
+ await this.lease.release();
195
+ }
196
+ async run(signal) {
197
+ const sysdb = this.executor.systemDatabase;
198
+ sysdb.logger.debug('Starting auto-upgrade pass');
199
+ const workflows = this.executor.autoUpgradableWorkflows();
200
+ if (workflows.length === 0) {
201
+ return 0;
202
+ }
203
+ let latestVersion;
204
+ try {
205
+ latestVersion = await sysdb.getLatestApplicationVersion();
206
+ }
207
+ catch (e) {
208
+ if (e instanceof error_1.DBOSInitializationError)
209
+ return 0;
210
+ throw e;
211
+ }
212
+ if (latestVersion.versionName !== utils_1.globalParams.appVersion) {
213
+ sysdb.logger.debug(`Auto-upgrade: skipping the pass, this executor runs version ${utils_1.globalParams.appVersion} ` +
214
+ `and the latest is ${latestVersion.versionName}`);
215
+ await this.lease.release();
216
+ return 0;
217
+ }
218
+ if (!(await this.lease.acquire())) {
219
+ return 0;
220
+ }
221
+ const moved = await upgradePass(sysdb, workflows, latestVersion, signal, { graceMs: this.graceMs });
222
+ if (moved > 0) {
223
+ sysdb.logger.info(`Auto-upgrade moved ${moved} workflows to the latest application version`);
224
+ }
225
+ return moved;
226
+ }
227
+ }
228
+ exports.AutoUpgradePass = AutoUpgradePass;
229
+ //# 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,10 @@
1
+ // Copyright (c) 2026 DBOS, Inc. All rights reserved.
2
+ //
3
+ // This file is part of Transact Enterprise, proprietary software licensed under the
4
+ // DBOS Conductor Software License: https://www.dbos.dev/conductor-license
5
+ // You may not use, copy, modify, or distribute this file except as that license permits.
6
+ // Disabling or circumventing the entitlement checks in @dbos-inc/dbos-sdk's src/enterprise.ts
7
+ // that gate it is a material breach of that license.
8
+ import { SystemDatabase } from '@dbos-inc/dbos-sdk/internal/system_database';
9
+ export declare function isCockroach(sysdb: SystemDatabase): Promise<boolean>;
10
+ //# 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;AAK5F,wBAAsB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAYzE"}
@@ -0,0 +1,28 @@
1
+ // Copyright (c) 2026 DBOS, Inc. All rights reserved.
2
+ //
3
+ // This file is part of Transact Enterprise, proprietary software licensed under the
4
+ // DBOS Conductor Software License: https://www.dbos.dev/conductor-license
5
+ // You may not use, copy, modify, or distribute this file except as that license permits.
6
+ // Disabling or circumventing the entitlement checks in @dbos-inc/dbos-sdk's src/enterprise.ts
7
+ // that gate it is a material breach of that license.
8
+ "use strict";
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.isCockroach = void 0;
11
+ const system_database_1 = require("@dbos-inc/dbos-sdk/internal/system_database");
12
+ const cockroachBySysDb = new WeakMap();
13
+ async function isCockroach(sysdb) {
14
+ let cockroach = cockroachBySysDb.get(sysdb);
15
+ if (cockroach === undefined) {
16
+ const client = await sysdb.connect();
17
+ try {
18
+ cockroach = await (0, system_database_1.isCockroachDB)(client);
19
+ }
20
+ finally {
21
+ client.release();
22
+ }
23
+ cockroachBySysDb.set(sysdb, cockroach);
24
+ }
25
+ return cockroach;
26
+ }
27
+ exports.isCockroach = isCockroach;
28
+ //# 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;AAGzD,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,42 @@
1
+ // Copyright (c) 2026 DBOS, Inc. All rights reserved.
2
+ //
3
+ // This file is part of Transact Enterprise, proprietary software licensed under the
4
+ // DBOS Conductor Software License: https://www.dbos.dev/conductor-license
5
+ // You may not use, copy, modify, or distribute this file except as that license permits.
6
+ // Disabling or circumventing the entitlement checks in @dbos-inc/dbos-sdk's src/enterprise.ts
7
+ // that gate it is a material breach of that license.
8
+ /// <reference types="node" />
9
+ /// <reference types="node" />
10
+ import { DBOSExecutor } from '@dbos-inc/dbos-sdk/internal/dbos-executor';
11
+ import WebSocket from 'ws';
12
+ import type { ConductorConnection, ConductorOptions } from '@dbos-inc/dbos-sdk/internal/enterprise';
13
+ interface IntervalTimeout {
14
+ interval: NodeJS.Timeout | undefined;
15
+ timeout: NodeJS.Timeout | undefined;
16
+ }
17
+ export declare class ConductorWebsocket implements ConductorConnection {
18
+ #private;
19
+ readonly dbosExec: DBOSExecutor;
20
+ url: string;
21
+ websocket: WebSocket | undefined;
22
+ isShuttingDown: boolean;
23
+ pingPeriodMs: number;
24
+ pingTimeoutMs: number;
25
+ pingIntervalTimeout: IntervalTimeout | undefined;
26
+ reconnectDelayMs: number;
27
+ reconnectTimeout: NodeJS.Timeout | undefined;
28
+ retentionRound: Promise<void> | undefined;
29
+ readonly appName: string;
30
+ readonly executorMetadata?: Record<string, unknown>;
31
+ readonly metadataOnlyMode: boolean;
32
+ constructor(dbosExec: DBOSExecutor, options: ConductorOptions);
33
+ start(): void;
34
+ reportException(context: string, e: unknown): string;
35
+ resetWebsocket(currWebsocket?: WebSocket, currPing?: IntervalTimeout): void;
36
+ setPingInterval(currWebsocket: WebSocket, currPing: IntervalTimeout): void;
37
+ dispatchLoop(): void;
38
+ awaitRetention(timeoutMs?: number): Promise<void>;
39
+ stop(): Promise<void>;
40
+ }
41
+ export {};
42
+ //# 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;AAwCpG,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;IAKL,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM;IAUpD,cAAc,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,eAAe;IAm1BpE,eAAe,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe;IAuBnE,YAAY;IAqGN,cAAc,CAAC,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAW5B"}