@solidactions/sdk 0.1.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.
- package/.claude/settings.local.json +7 -0
- package/.clavix/outputs/dbos-http-sdk/full-prd.md +142 -0
- package/.clavix/outputs/dbos-http-sdk/quick-prd.md +12 -0
- package/.clavix/outputs/dbos-http-sdk/tasks.md +630 -0
- package/.clavix/outputs/prompts/dbos-http-api-20260110-033219.md +91 -0
- package/.husky/pre-commit +1 -0
- package/.prettierignore +3 -0
- package/.prettierrc +9 -0
- package/CODE_OF_CONDUCT.md +49 -0
- package/CONTRIBUTING.md +47 -0
- package/LICENSE +21 -0
- package/README.md +172 -0
- package/dist/dbos-config.schema.json +132 -0
- package/dist/schemas/system_db_schema.d.ts +73 -0
- package/dist/schemas/system_db_schema.d.ts.map +1 -0
- package/dist/schemas/system_db_schema.js +3 -0
- package/dist/schemas/system_db_schema.js.map +1 -0
- package/dist/src/adminserver.d.ts +79 -0
- package/dist/src/adminserver.d.ts.map +1 -0
- package/dist/src/adminserver.js +495 -0
- package/dist/src/adminserver.js.map +1 -0
- package/dist/src/authdecorators.d.ts +2 -0
- package/dist/src/authdecorators.d.ts.map +1 -0
- package/dist/src/authdecorators.js +48 -0
- package/dist/src/authdecorators.js.map +1 -0
- package/dist/src/cli/cli.d.ts +9 -0
- package/dist/src/cli/cli.d.ts.map +1 -0
- package/dist/src/cli/cli.js +116 -0
- package/dist/src/cli/cli.js.map +1 -0
- package/dist/src/cli/commands.d.ts +3 -0
- package/dist/src/cli/commands.d.ts.map +1 -0
- package/dist/src/cli/commands.js +46 -0
- package/dist/src/cli/commands.js.map +1 -0
- package/dist/src/client.d.ts +85 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +186 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/conductor/conductor.d.ts +28 -0
- package/dist/src/conductor/conductor.d.ts.map +1 -0
- package/dist/src/conductor/conductor.js +376 -0
- package/dist/src/conductor/conductor.js.map +1 -0
- package/dist/src/conductor/protocol.d.ts +238 -0
- package/dist/src/conductor/protocol.d.ts.map +1 -0
- package/dist/src/conductor/protocol.js +353 -0
- package/dist/src/conductor/protocol.js.map +1 -0
- package/dist/src/config.d.ts +91 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +199 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context.d.ts +62 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +118 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/database_utils.d.ts +17 -0
- package/dist/src/database_utils.d.ts.map +1 -0
- package/dist/src/database_utils.js +53 -0
- package/dist/src/database_utils.js.map +1 -0
- package/dist/src/datasource.d.ts +109 -0
- package/dist/src/datasource.d.ts.map +1 -0
- package/dist/src/datasource.js +204 -0
- package/dist/src/datasource.js.map +1 -0
- package/dist/src/dbos-executor.d.ts +189 -0
- package/dist/src/dbos-executor.d.ts.map +1 -0
- package/dist/src/dbos-executor.js +817 -0
- package/dist/src/dbos-executor.js.map +1 -0
- package/dist/src/dbos.d.ts +519 -0
- package/dist/src/dbos.d.ts.map +1 -0
- package/dist/src/dbos.js +1282 -0
- package/dist/src/dbos.js.map +1 -0
- package/dist/src/debouncer.d.ts +33 -0
- package/dist/src/debouncer.d.ts.map +1 -0
- package/dist/src/debouncer.js +170 -0
- package/dist/src/debouncer.js.map +1 -0
- package/dist/src/debugpoint.d.ts +26 -0
- package/dist/src/debugpoint.d.ts.map +1 -0
- package/dist/src/debugpoint.js +65 -0
- package/dist/src/debugpoint.js.map +1 -0
- package/dist/src/decorators.d.ts +219 -0
- package/dist/src/decorators.d.ts.map +1 -0
- package/dist/src/decorators.js +873 -0
- package/dist/src/decorators.js.map +1 -0
- package/dist/src/error.d.ts +130 -0
- package/dist/src/error.d.ts.map +1 -0
- package/dist/src/error.js +290 -0
- package/dist/src/error.js.map +1 -0
- package/dist/src/http_client.d.ts +82 -0
- package/dist/src/http_client.d.ts.map +1 -0
- package/dist/src/http_client.js +286 -0
- package/dist/src/http_client.js.map +1 -0
- package/dist/src/http_system_database.d.ts +84 -0
- package/dist/src/http_system_database.d.ts.map +1 -0
- package/dist/src/http_system_database.js +429 -0
- package/dist/src/http_system_database.js.map +1 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +53 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/scheduler/crontab.d.ts +14 -0
- package/dist/src/scheduler/crontab.d.ts.map +1 -0
- package/dist/src/scheduler/crontab.js +308 -0
- package/dist/src/scheduler/crontab.js.map +1 -0
- package/dist/src/scheduler/scheduler.d.ts +41 -0
- package/dist/src/scheduler/scheduler.d.ts.map +1 -0
- package/dist/src/scheduler/scheduler.js +165 -0
- package/dist/src/scheduler/scheduler.js.map +1 -0
- package/dist/src/serialization.d.ts +57 -0
- package/dist/src/serialization.d.ts.map +1 -0
- package/dist/src/serialization.js +306 -0
- package/dist/src/serialization.js.map +1 -0
- package/dist/src/solidactions-executor.d.ts +177 -0
- package/dist/src/solidactions-executor.d.ts.map +1 -0
- package/dist/src/solidactions-executor.js +817 -0
- package/dist/src/solidactions-executor.js.map +1 -0
- package/dist/src/solidactions.d.ts +519 -0
- package/dist/src/solidactions.d.ts.map +1 -0
- package/dist/src/solidactions.js +1284 -0
- package/dist/src/solidactions.js.map +1 -0
- package/dist/src/step.d.ts +16 -0
- package/dist/src/step.d.ts.map +1 -0
- package/dist/src/step.js +3 -0
- package/dist/src/step.js.map +1 -0
- package/dist/src/system_database.d.ts +141 -0
- package/dist/src/system_database.d.ts.map +1 -0
- package/dist/src/system_database.js +25 -0
- package/dist/src/system_database.js.map +1 -0
- package/dist/src/telemetry/collector.d.ts +13 -0
- package/dist/src/telemetry/collector.d.ts.map +1 -0
- package/dist/src/telemetry/collector.js +63 -0
- package/dist/src/telemetry/collector.js.map +1 -0
- package/dist/src/telemetry/exporters.d.ts +13 -0
- package/dist/src/telemetry/exporters.d.ts.map +1 -0
- package/dist/src/telemetry/exporters.js +101 -0
- package/dist/src/telemetry/exporters.js.map +1 -0
- package/dist/src/telemetry/logs.d.ts +52 -0
- package/dist/src/telemetry/logs.d.ts.map +1 -0
- package/dist/src/telemetry/logs.js +287 -0
- package/dist/src/telemetry/logs.js.map +1 -0
- package/dist/src/telemetry/traces.d.ts +52 -0
- package/dist/src/telemetry/traces.d.ts.map +1 -0
- package/dist/src/telemetry/traces.js +150 -0
- package/dist/src/telemetry/traces.js.map +1 -0
- package/dist/src/utils.d.ts +26 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +136 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/wfqueue.d.ts +64 -0
- package/dist/src/wfqueue.d.ts.map +1 -0
- package/dist/src/wfqueue.js +147 -0
- package/dist/src/wfqueue.js.map +1 -0
- package/dist/src/workflow.d.ts +154 -0
- package/dist/src/workflow.d.ts.map +1 -0
- package/dist/src/workflow.js +99 -0
- package/dist/src/workflow.js.map +1 -0
- package/dist/src/workflow_management.d.ts +15 -0
- package/dist/src/workflow_management.d.ts.map +1 -0
- package/dist/src/workflow_management.js +87 -0
- package/dist/src/workflow_management.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/api-schema.md +1441 -0
- package/docs/migration-guide.md +460 -0
- package/docs/phase-14-changes.md +156 -0
- package/docs/solidsteps-ai-prompt.md +534 -0
- package/eslint.config.cjs +50 -0
- package/package.json +84 -0
- package/solidactions-ai-prompt.md +1504 -0
- package/solidactions-config.schema.json +132 -0
- package/solidactions-test-config.yaml +15 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { SolidActionsContextualLogger } from './telemetry/logs';
|
|
4
|
+
import { IncomingHttpHeaders } from 'http';
|
|
5
|
+
import { ParsedUrlQuery } from 'querystring';
|
|
6
|
+
import Koa from 'koa';
|
|
7
|
+
export interface StepStatus {
|
|
8
|
+
stepID: number;
|
|
9
|
+
currentAttempt?: number;
|
|
10
|
+
maxAttempts?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface SolidActionsContextOptions {
|
|
13
|
+
idAssignedForNextWorkflow?: string;
|
|
14
|
+
queueAssignedForWorkflows?: string;
|
|
15
|
+
logger?: SolidActionsContextualLogger;
|
|
16
|
+
authenticatedUser?: string;
|
|
17
|
+
authenticatedRoles?: string[];
|
|
18
|
+
assumedRole?: string;
|
|
19
|
+
request?: object;
|
|
20
|
+
operationType?: string;
|
|
21
|
+
operationCaller?: string;
|
|
22
|
+
workflowTimeoutMS?: number | null;
|
|
23
|
+
}
|
|
24
|
+
export interface SolidActionsLocalCtx extends SolidActionsContextOptions {
|
|
25
|
+
parentCtx?: SolidActionsLocalCtx;
|
|
26
|
+
workflowId?: string;
|
|
27
|
+
curWFFunctionId?: number;
|
|
28
|
+
presetID?: boolean;
|
|
29
|
+
deadlineEpochMS?: number;
|
|
30
|
+
inRecovery?: boolean;
|
|
31
|
+
curStepFunctionId?: number;
|
|
32
|
+
stepStatus?: StepStatus;
|
|
33
|
+
curTxFunctionId?: number;
|
|
34
|
+
koaContext?: Koa.Context;
|
|
35
|
+
}
|
|
36
|
+
export declare function isInWorkflowCtx(ctx: SolidActionsLocalCtx): boolean;
|
|
37
|
+
export declare function getCurrentContextStore(): SolidActionsLocalCtx | undefined;
|
|
38
|
+
export declare function getNextWFID(assignedID?: string): string | undefined;
|
|
39
|
+
export declare function functionIDGetIncrement(): number;
|
|
40
|
+
export declare function functionIDGet(): number;
|
|
41
|
+
export declare function runWithTopContext<R>(ctx: SolidActionsLocalCtx, callback: () => Promise<R>): Promise<R>;
|
|
42
|
+
export declare function runWithParentContext<R>(pctx: SolidActionsLocalCtx | undefined, ctx: SolidActionsLocalCtx, callback: () => Promise<R>): Promise<R>;
|
|
43
|
+
export declare function runInStepContext<R>(pctx: SolidActionsLocalCtx, stepID: number, maxAttempts: number | undefined, currentAttempt: number | undefined, callback: () => Promise<R>): Promise<R>;
|
|
44
|
+
/**
|
|
45
|
+
* HTTPRequest includes useful information from http.IncomingMessage and parsed body,
|
|
46
|
+
* URL parameters, and parsed query string.
|
|
47
|
+
* In essence, it is the serializable part of the request.
|
|
48
|
+
*/
|
|
49
|
+
export interface HTTPRequest {
|
|
50
|
+
readonly headers?: IncomingHttpHeaders;
|
|
51
|
+
readonly rawHeaders?: string[];
|
|
52
|
+
readonly params?: unknown;
|
|
53
|
+
readonly body?: unknown;
|
|
54
|
+
readonly rawBody?: string;
|
|
55
|
+
readonly query?: ParsedUrlQuery;
|
|
56
|
+
readonly querystring?: string;
|
|
57
|
+
readonly url?: string;
|
|
58
|
+
readonly method?: string;
|
|
59
|
+
readonly ip?: string;
|
|
60
|
+
readonly requestID?: string;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runInStepContext = exports.runWithParentContext = exports.runWithTopContext = exports.functionIDGet = exports.functionIDGetIncrement = exports.getNextWFID = exports.getCurrentContextStore = exports.isInWorkflowCtx = void 0;
|
|
4
|
+
const async_hooks_1 = require("async_hooks");
|
|
5
|
+
const error_1 = require("./error");
|
|
6
|
+
const solidactions_executor_1 = require("./solidactions-executor");
|
|
7
|
+
function isWithinWorkflowCtx(ctx) {
|
|
8
|
+
if (ctx.workflowId === undefined)
|
|
9
|
+
return false;
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
function isInStepCtx(ctx) {
|
|
13
|
+
if (ctx.workflowId === undefined)
|
|
14
|
+
return false;
|
|
15
|
+
if (ctx.curStepFunctionId)
|
|
16
|
+
return true;
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
function isInTxnCtx(ctx) {
|
|
20
|
+
if (ctx.workflowId === undefined)
|
|
21
|
+
return false;
|
|
22
|
+
if (ctx.curTxFunctionId)
|
|
23
|
+
return true;
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
function isInWorkflowCtx(ctx) {
|
|
27
|
+
if (!isWithinWorkflowCtx(ctx))
|
|
28
|
+
return false;
|
|
29
|
+
if (isInStepCtx(ctx))
|
|
30
|
+
return false;
|
|
31
|
+
if (isInTxnCtx(ctx))
|
|
32
|
+
return false;
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
exports.isInWorkflowCtx = isInWorkflowCtx;
|
|
36
|
+
const asyncLocalCtx = new async_hooks_1.AsyncLocalStorage();
|
|
37
|
+
function getCurrentContextStore() {
|
|
38
|
+
return asyncLocalCtx.getStore();
|
|
39
|
+
}
|
|
40
|
+
exports.getCurrentContextStore = getCurrentContextStore;
|
|
41
|
+
// Track if we've used the SolidActions_RUN_ID env var
|
|
42
|
+
let envRunIdUsed = false;
|
|
43
|
+
function getNextWFID(assignedID) {
|
|
44
|
+
let wfId = assignedID;
|
|
45
|
+
if (!wfId) {
|
|
46
|
+
const pctx = getCurrentContextStore();
|
|
47
|
+
const nextID = pctx?.idAssignedForNextWorkflow;
|
|
48
|
+
if (nextID) {
|
|
49
|
+
wfId = nextID;
|
|
50
|
+
pctx.idAssignedForNextWorkflow = undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// If still no ID and this is the first top-level workflow, use SOLIDACTIONS_RUN_ID env var
|
|
54
|
+
// This allows the runner to assign a specific UUID that links to run_triggers table
|
|
55
|
+
if (!wfId && !envRunIdUsed) {
|
|
56
|
+
const envRunId = process.env.SOLIDACTIONS_RUN_ID;
|
|
57
|
+
if (envRunId) {
|
|
58
|
+
wfId = envRunId;
|
|
59
|
+
envRunIdUsed = true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return wfId;
|
|
63
|
+
}
|
|
64
|
+
exports.getNextWFID = getNextWFID;
|
|
65
|
+
function functionIDGetIncrement() {
|
|
66
|
+
const pctx = getCurrentContextStore();
|
|
67
|
+
if (!pctx)
|
|
68
|
+
throw new error_1.SolidActionsInvalidWorkflowTransitionError(`Attempt to get a call ID number outside of a workflow`);
|
|
69
|
+
if (!isInWorkflowCtx(pctx))
|
|
70
|
+
throw new error_1.SolidActionsInvalidWorkflowTransitionError(`Attempt to get a call ID number in a workflow that is already in a call`);
|
|
71
|
+
if (pctx.curWFFunctionId === undefined)
|
|
72
|
+
pctx.curWFFunctionId = 0;
|
|
73
|
+
return pctx.curWFFunctionId++;
|
|
74
|
+
}
|
|
75
|
+
exports.functionIDGetIncrement = functionIDGetIncrement;
|
|
76
|
+
function functionIDGet() {
|
|
77
|
+
const pctx = getCurrentContextStore();
|
|
78
|
+
if (!pctx)
|
|
79
|
+
throw new error_1.SolidActionsInvalidWorkflowTransitionError(`Attempt to get a call ID number outside of a workflow`);
|
|
80
|
+
if (!isInWorkflowCtx(pctx))
|
|
81
|
+
throw new error_1.SolidActionsInvalidWorkflowTransitionError(`Attempt to get a call ID number in a workflow that is already in a call`);
|
|
82
|
+
if (pctx.curWFFunctionId === undefined)
|
|
83
|
+
pctx.curWFFunctionId = 0;
|
|
84
|
+
return pctx.curWFFunctionId;
|
|
85
|
+
}
|
|
86
|
+
exports.functionIDGet = functionIDGet;
|
|
87
|
+
async function runWithTopContext(ctx, callback) {
|
|
88
|
+
return await asyncLocalCtx.run(ctx, callback);
|
|
89
|
+
}
|
|
90
|
+
exports.runWithTopContext = runWithTopContext;
|
|
91
|
+
async function runWithParentContext(pctx, ctx, callback) {
|
|
92
|
+
return await asyncLocalCtx.run({
|
|
93
|
+
...pctx,
|
|
94
|
+
...ctx,
|
|
95
|
+
parentCtx: pctx,
|
|
96
|
+
}, callback);
|
|
97
|
+
}
|
|
98
|
+
exports.runWithParentContext = runWithParentContext;
|
|
99
|
+
async function runInStepContext(pctx, stepID, maxAttempts, currentAttempt, callback) {
|
|
100
|
+
// Check we are in a workflow context and not in a step / transaction already
|
|
101
|
+
if (!pctx)
|
|
102
|
+
throw new error_1.SolidActionsInvalidWorkflowTransitionError();
|
|
103
|
+
if (!isInWorkflowCtx(pctx))
|
|
104
|
+
throw new error_1.SolidActionsInvalidWorkflowTransitionError();
|
|
105
|
+
const stepStatus = {
|
|
106
|
+
stepID: stepID,
|
|
107
|
+
currentAttempt: currentAttempt,
|
|
108
|
+
maxAttempts: currentAttempt ? maxAttempts : undefined,
|
|
109
|
+
};
|
|
110
|
+
return await runWithParentContext(pctx, {
|
|
111
|
+
stepStatus: stepStatus,
|
|
112
|
+
curStepFunctionId: stepID,
|
|
113
|
+
parentCtx: pctx,
|
|
114
|
+
logger: solidactions_executor_1.SolidActionsExecutor.globalInstance.ctxLogger,
|
|
115
|
+
}, callback);
|
|
116
|
+
}
|
|
117
|
+
exports.runInStepContext = runInStepContext;
|
|
118
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL utilities for database connection strings.
|
|
3
|
+
* These are kept for backwards compatibility with configuration parsing.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Derive a new database URL with a different database name.
|
|
7
|
+
*/
|
|
8
|
+
export declare function deriveDatabaseUrl(urlStr: string, otherDbName: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Extract the database name from a PostgreSQL URL.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getDatabaseNameFromUrl(urlStr: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Mask the password in a database URL for safe logging.
|
|
15
|
+
*/
|
|
16
|
+
export declare function maskDatabaseUrl(urlStr: string): string;
|
|
17
|
+
//# sourceMappingURL=database_utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database_utils.d.ts","sourceRoot":"","sources":["../../src/database_utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAQ7E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYtD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* URL utilities for database connection strings.
|
|
4
|
+
* These are kept for backwards compatibility with configuration parsing.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.maskDatabaseUrl = exports.getDatabaseNameFromUrl = exports.deriveDatabaseUrl = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Derive a new database URL with a different database name.
|
|
10
|
+
*/
|
|
11
|
+
function deriveDatabaseUrl(urlStr, otherDbName) {
|
|
12
|
+
try {
|
|
13
|
+
const u = new URL(urlStr);
|
|
14
|
+
u.pathname = `/${otherDbName}`;
|
|
15
|
+
return u.toString();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return urlStr;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.deriveDatabaseUrl = deriveDatabaseUrl;
|
|
22
|
+
/**
|
|
23
|
+
* Extract the database name from a PostgreSQL URL.
|
|
24
|
+
*/
|
|
25
|
+
function getDatabaseNameFromUrl(urlStr) {
|
|
26
|
+
try {
|
|
27
|
+
const u = new URL(urlStr);
|
|
28
|
+
return u.pathname?.replace(/^\//, '') || '';
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return '';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.getDatabaseNameFromUrl = getDatabaseNameFromUrl;
|
|
35
|
+
/**
|
|
36
|
+
* Mask the password in a database URL for safe logging.
|
|
37
|
+
*/
|
|
38
|
+
function maskDatabaseUrl(urlStr) {
|
|
39
|
+
try {
|
|
40
|
+
const u = new URL(urlStr);
|
|
41
|
+
if (u.password) {
|
|
42
|
+
const p = decodeURIComponent(u.password);
|
|
43
|
+
const masked = p.length <= 2 ? p : `${p[0]}${'*'.repeat(p.length - 2)}${p[p.length - 1]}`;
|
|
44
|
+
u.password = encodeURIComponent(masked);
|
|
45
|
+
}
|
|
46
|
+
return u.toString();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return urlStr;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.maskDatabaseUrl = maskDatabaseUrl;
|
|
53
|
+
//# sourceMappingURL=database_utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database_utils.js","sourceRoot":"","sources":["../../src/database_utils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;GAEG;AACH,SAAgB,iBAAiB,CAAC,MAAc,EAAE,WAAmB;IACnE,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AARD,8CAQC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,MAAc;IACnD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAPD,wDAOC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,MAAc;IAC5C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YAC1F,CAAC,CAAC,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAZD,0CAYC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { FunctionName } from './decorators';
|
|
2
|
+
/**
|
|
3
|
+
* This interface is to be used for implementers of transactional data sources
|
|
4
|
+
* This is what gets registered for the transaction control framework
|
|
5
|
+
*/
|
|
6
|
+
export interface DataSourceTransactionHandler {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly dsType: string;
|
|
9
|
+
/**
|
|
10
|
+
* Will be called by DBOS during launch.
|
|
11
|
+
* This may be a no-op if the DS is initialized before telling DBOS about the DS at all.
|
|
12
|
+
*/
|
|
13
|
+
initialize(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Will be called by DBOS during attempt at clean shutdown (generally in testing scenarios).
|
|
16
|
+
*/
|
|
17
|
+
destroy(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Invoke a transaction function
|
|
20
|
+
*/
|
|
21
|
+
invokeTransactionFunction<This, Args extends unknown[], Return>(config: unknown, target: This, func: (this: This, ...args: Args) => Promise<Return>, ...args: Args): Promise<Return>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* This is the suggested interface guideline for presenting to the end user, but not
|
|
25
|
+
* strictly required.
|
|
26
|
+
*/
|
|
27
|
+
export interface DBOSDataSource<Config extends {
|
|
28
|
+
name?: string;
|
|
29
|
+
}> {
|
|
30
|
+
readonly name: string;
|
|
31
|
+
/**
|
|
32
|
+
* Run the code transactionally within this data source
|
|
33
|
+
* Implementers should strongly type the config
|
|
34
|
+
* @param callback - Function to run within a transactional context
|
|
35
|
+
* @param name - Step name to show in the system database, traces, etc.
|
|
36
|
+
* @param config - Transaction configuration options
|
|
37
|
+
*/
|
|
38
|
+
runTransaction<T>(callback: () => Promise<T>, config?: Config): Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Register function as DBOS transaction, to be called within the context
|
|
41
|
+
* of a transaction on this data source.
|
|
42
|
+
*
|
|
43
|
+
* Providing a static version of this functionality is optional.
|
|
44
|
+
*
|
|
45
|
+
* @param func - Function to wrap
|
|
46
|
+
* @param config - Transaction settings, including function `name`
|
|
47
|
+
* @param target - Class name, or class ctor/prototype
|
|
48
|
+
* @returns Wrapped function, to be called instead of `func`
|
|
49
|
+
*/
|
|
50
|
+
registerTransaction<This, Args extends unknown[], Return>(func: (this: This, ...args: Args) => Promise<Return>, config?: Config & FunctionName): (this: This, ...args: Args) => Promise<Return>;
|
|
51
|
+
/**
|
|
52
|
+
* Produce a Stage 2 method decorator
|
|
53
|
+
* @param config - Configuration to apply to the decorated method
|
|
54
|
+
*/
|
|
55
|
+
transaction(config?: Config): <This, Args extends unknown[], Return>(target: object, propertyKey: string, descriptor: TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>) => TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* This function is to be called by `DataSourceTransactionHandler` instances,
|
|
59
|
+
* with bits of user code to be run as transactions.
|
|
60
|
+
* 1. The DS validates the type of config and provides the name
|
|
61
|
+
* 2. The transaction will be started inside here, with a durable sysdb checkpoint.
|
|
62
|
+
* 3. The DS will in turn be called upon to run the callback in a transaction context
|
|
63
|
+
* @param callback - User callback function
|
|
64
|
+
* @param funcName - Function name, for recording in system DB
|
|
65
|
+
* @param options - Data source name and configuration
|
|
66
|
+
* @returns the return from `callback`
|
|
67
|
+
*/
|
|
68
|
+
export declare function runTransaction<T>(callback: () => Promise<T>, funcName: string, options?: {
|
|
69
|
+
dsName?: string;
|
|
70
|
+
config?: unknown;
|
|
71
|
+
}): Promise<T>;
|
|
72
|
+
export declare function registerTransaction<This, Args extends unknown[], Return, Config extends FunctionName>(dsName: string, func: (this: This, ...args: Args) => Promise<Return>, config?: Config): (this: This, ...args: Args) => Promise<Return>;
|
|
73
|
+
/**
|
|
74
|
+
* Register a transactional data source, that helps DBOS provide
|
|
75
|
+
* transactional access to user databases
|
|
76
|
+
* @param name - Registered name for the data source
|
|
77
|
+
* @param ds - Transactional data source provider
|
|
78
|
+
*/
|
|
79
|
+
export declare function registerDataSource(ds: DataSourceTransactionHandler): void;
|
|
80
|
+
/** Isolation typically supported by application databases */
|
|
81
|
+
export declare const PGIsolationLevel: Readonly<{
|
|
82
|
+
readonly ReadUncommitted: "READ UNCOMMITTED";
|
|
83
|
+
readonly ReadCommitted: "READ COMMITTED";
|
|
84
|
+
readonly RepeatableRead: "REPEATABLE READ";
|
|
85
|
+
readonly Serializable: "SERIALIZABLE";
|
|
86
|
+
}>;
|
|
87
|
+
type ValuesOf<T> = T[keyof T];
|
|
88
|
+
export type PGIsolationLevel = ValuesOf<typeof PGIsolationLevel>;
|
|
89
|
+
/**
|
|
90
|
+
* Configuration for Postgres-like transactions
|
|
91
|
+
*/
|
|
92
|
+
export interface PGTransactionConfig {
|
|
93
|
+
/** Isolation level to request from underlying app database */
|
|
94
|
+
isolationLevel?: PGIsolationLevel;
|
|
95
|
+
/** If set, request read-only transaction from underlying app database */
|
|
96
|
+
readOnly?: boolean;
|
|
97
|
+
}
|
|
98
|
+
export interface CheckSchemaInstallationReturn {
|
|
99
|
+
schema_exists: number;
|
|
100
|
+
table_exists: number;
|
|
101
|
+
}
|
|
102
|
+
export declare function checkSchemaInstallationPG(schemaName?: string): string;
|
|
103
|
+
export declare function createTransactionCompletionSchemaPG(schemaName?: string): string;
|
|
104
|
+
export declare function createTransactionCompletionTablePG(schemaName?: string): string;
|
|
105
|
+
export declare function isPGRetriableTransactionError(error: unknown): boolean;
|
|
106
|
+
export declare function isPGKeyConflictError(error: unknown): boolean;
|
|
107
|
+
export declare function isPGFailedSqlTransactionError(error: unknown): boolean;
|
|
108
|
+
export { maskDatabaseUrl, getDatabaseNameFromUrl, deriveDatabaseUrl } from './database_utils';
|
|
109
|
+
//# sourceMappingURL=datasource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasource.d.ts","sourceRoot":"","sources":["../../src/datasource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deriveDatabaseUrl = exports.getDatabaseNameFromUrl = exports.maskDatabaseUrl = exports.isPGFailedSqlTransactionError = exports.isPGKeyConflictError = exports.isPGRetriableTransactionError = exports.createTransactionCompletionTablePG = exports.createTransactionCompletionSchemaPG = exports.checkSchemaInstallationPG = exports.PGIsolationLevel = exports.registerDataSource = exports.registerTransaction = exports.runTransaction = void 0;
|
|
4
|
+
const context_1 = require("./context");
|
|
5
|
+
const dbos_1 = require("./dbos");
|
|
6
|
+
const dbos_executor_1 = require("./dbos-executor");
|
|
7
|
+
const decorators_1 = require("./decorators");
|
|
8
|
+
const error_1 = require("./error");
|
|
9
|
+
const traces_1 = require("./telemetry/traces");
|
|
10
|
+
/// Calling into DBOS
|
|
11
|
+
/**
|
|
12
|
+
* This function is to be called by `DataSourceTransactionHandler` instances,
|
|
13
|
+
* with bits of user code to be run as transactions.
|
|
14
|
+
* 1. The DS validates the type of config and provides the name
|
|
15
|
+
* 2. The transaction will be started inside here, with a durable sysdb checkpoint.
|
|
16
|
+
* 3. The DS will in turn be called upon to run the callback in a transaction context
|
|
17
|
+
* @param callback - User callback function
|
|
18
|
+
* @param funcName - Function name, for recording in system DB
|
|
19
|
+
* @param options - Data source name and configuration
|
|
20
|
+
* @returns the return from `callback`
|
|
21
|
+
*/
|
|
22
|
+
async function runTransaction(callback, funcName, options = {}) {
|
|
23
|
+
(0, decorators_1.ensureDBOSIsLaunched)('transactions');
|
|
24
|
+
const dsn = options.dsName ?? '<default>';
|
|
25
|
+
const ds = (0, decorators_1.getTransactionalDataSource)(dsn);
|
|
26
|
+
if (!dbos_1.DBOS.isWithinWorkflow()) {
|
|
27
|
+
if ((0, context_1.getNextWFID)(undefined)) {
|
|
28
|
+
throw new error_1.DBOSInvalidWorkflowTransitionError(`Invalid call to transaction '${funcName}' outside of a workflow; with directive to start a workflow.`);
|
|
29
|
+
}
|
|
30
|
+
return await (0, context_1.runWithDataSourceContext)(0, async () => {
|
|
31
|
+
return await ds.invokeTransactionFunction(options.config ?? {}, undefined, callback);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (!dbos_1.DBOS.isInWorkflow()) {
|
|
35
|
+
throw new error_1.DBOSInvalidWorkflowTransitionError(`Invalid call to \`${funcName}\` inside a \`step\`, \`transaction\`, or \`procedure\``);
|
|
36
|
+
}
|
|
37
|
+
const callnum = (0, context_1.functionIDGetIncrement)();
|
|
38
|
+
const span = dbos_executor_1.DBOSExecutor.globalInstance.tracer.startSpan(funcName, {
|
|
39
|
+
operationUUID: dbos_1.DBOS.workflowID,
|
|
40
|
+
operationType: dbos_executor_1.OperationType.TRANSACTION,
|
|
41
|
+
operationName: funcName,
|
|
42
|
+
authenticatedUser: dbos_1.DBOS.authenticatedUser ?? '',
|
|
43
|
+
assumedRole: dbos_1.DBOS.assumedRole ?? '',
|
|
44
|
+
authenticatedRoles: dbos_1.DBOS.authenticatedRoles ?? [],
|
|
45
|
+
// isolationLevel: txnInfo.config.isolationLevel, // TODO: Pluggable
|
|
46
|
+
}, dbos_1.DBOS.span);
|
|
47
|
+
try {
|
|
48
|
+
const res = await (0, traces_1.runWithTrace)(span, async () => {
|
|
49
|
+
return await dbos_executor_1.DBOSExecutor.globalInstance.runInternalStep(async () => {
|
|
50
|
+
return await (0, context_1.runWithDataSourceContext)(callnum, async () => {
|
|
51
|
+
return await ds.invokeTransactionFunction(options.config ?? {}, undefined, callback);
|
|
52
|
+
});
|
|
53
|
+
}, funcName,
|
|
54
|
+
// we can be sure workflowID is set because of previous call to assertCurrentWorkflowContext
|
|
55
|
+
dbos_1.DBOS.workflowID, callnum);
|
|
56
|
+
});
|
|
57
|
+
span.setStatus({ code: traces_1.SpanStatusCode.OK });
|
|
58
|
+
dbos_executor_1.DBOSExecutor.globalInstance.tracer.endSpan(span);
|
|
59
|
+
return res;
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
const e = err;
|
|
63
|
+
span.setStatus({ code: traces_1.SpanStatusCode.ERROR, message: e.message });
|
|
64
|
+
dbos_executor_1.DBOSExecutor.globalInstance.tracer.endSpan(span);
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.runTransaction = runTransaction;
|
|
69
|
+
// Transaction wrapper
|
|
70
|
+
function registerTransaction(dsName, func, config) {
|
|
71
|
+
const dsn = dsName ?? '<default>';
|
|
72
|
+
const funcName = config?.name ?? func.name;
|
|
73
|
+
const reg = (0, decorators_1.wrapDBOSFunctionAndRegister)(config?.ctorOrProto, config?.className, funcName, funcName, func);
|
|
74
|
+
const invokeWrapper = async function (...rawArgs) {
|
|
75
|
+
(0, decorators_1.ensureDBOSIsLaunched)('transactions');
|
|
76
|
+
const ds = (0, decorators_1.getTransactionalDataSource)(dsn);
|
|
77
|
+
const callFunc = reg.registeredFunction ?? reg.origFunction;
|
|
78
|
+
if (!dbos_1.DBOS.isWithinWorkflow()) {
|
|
79
|
+
if ((0, context_1.getNextWFID)(undefined)) {
|
|
80
|
+
throw new error_1.DBOSInvalidWorkflowTransitionError(`Call to transaction '${funcName}' made without starting workflow`);
|
|
81
|
+
}
|
|
82
|
+
return await (0, context_1.runWithDataSourceContext)(0, async () => {
|
|
83
|
+
return await ds.invokeTransactionFunction(config, this, callFunc, ...rawArgs);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (dbos_1.DBOS.isInTransaction() || dbos_1.DBOS.isInStep()) {
|
|
87
|
+
throw new error_1.DBOSInvalidWorkflowTransitionError('Invalid call to a `transaction` function from within a `step` or `transaction`');
|
|
88
|
+
}
|
|
89
|
+
const span = dbos_executor_1.DBOSExecutor.globalInstance.tracer.startSpan(funcName, {
|
|
90
|
+
operationUUID: dbos_1.DBOS.workflowID,
|
|
91
|
+
operationType: dbos_executor_1.OperationType.TRANSACTION,
|
|
92
|
+
operationName: funcName,
|
|
93
|
+
authenticatedUser: dbos_1.DBOS.authenticatedUser ?? '',
|
|
94
|
+
assumedRole: dbos_1.DBOS.assumedRole ?? '',
|
|
95
|
+
authenticatedRoles: dbos_1.DBOS.authenticatedRoles ?? [],
|
|
96
|
+
// isolationLevel: txnInfo.config.isolationLevel, // TODO: Pluggable
|
|
97
|
+
}, dbos_1.DBOS.span);
|
|
98
|
+
const callnum = (0, context_1.functionIDGetIncrement)();
|
|
99
|
+
try {
|
|
100
|
+
const res = await (0, traces_1.runWithTrace)(span, async () => {
|
|
101
|
+
return await dbos_executor_1.DBOSExecutor.globalInstance.runInternalStep(async () => {
|
|
102
|
+
return await (0, context_1.runWithDataSourceContext)(callnum, async () => {
|
|
103
|
+
return await ds.invokeTransactionFunction(config, this, callFunc, ...rawArgs);
|
|
104
|
+
});
|
|
105
|
+
}, funcName, dbos_1.DBOS.workflowID, callnum);
|
|
106
|
+
});
|
|
107
|
+
span.setStatus({ code: traces_1.SpanStatusCode.OK });
|
|
108
|
+
dbos_executor_1.DBOSExecutor.globalInstance.tracer.endSpan(span);
|
|
109
|
+
return res;
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const e = err;
|
|
113
|
+
span.setStatus({ code: traces_1.SpanStatusCode.ERROR, message: e.message });
|
|
114
|
+
dbos_executor_1.DBOSExecutor.globalInstance.tracer.endSpan(span);
|
|
115
|
+
throw err;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
(0, decorators_1.registerFunctionWrapper)(invokeWrapper, reg);
|
|
119
|
+
Object.defineProperty(invokeWrapper, 'name', {
|
|
120
|
+
value: funcName,
|
|
121
|
+
});
|
|
122
|
+
return invokeWrapper;
|
|
123
|
+
}
|
|
124
|
+
exports.registerTransaction = registerTransaction;
|
|
125
|
+
/**
|
|
126
|
+
* Register a transactional data source, that helps DBOS provide
|
|
127
|
+
* transactional access to user databases
|
|
128
|
+
* @param name - Registered name for the data source
|
|
129
|
+
* @param ds - Transactional data source provider
|
|
130
|
+
*/
|
|
131
|
+
function registerDataSource(ds) {
|
|
132
|
+
(0, decorators_1.registerTransactionalDataSource)(ds.name, ds);
|
|
133
|
+
}
|
|
134
|
+
exports.registerDataSource = registerDataSource;
|
|
135
|
+
/// Postgres helper routines
|
|
136
|
+
/** Isolation typically supported by application databases */
|
|
137
|
+
exports.PGIsolationLevel = Object.freeze({
|
|
138
|
+
ReadUncommitted: 'READ UNCOMMITTED',
|
|
139
|
+
ReadCommitted: 'READ COMMITTED',
|
|
140
|
+
RepeatableRead: 'REPEATABLE READ',
|
|
141
|
+
Serializable: 'SERIALIZABLE',
|
|
142
|
+
});
|
|
143
|
+
function checkSchemaInstallationPG(schemaName = 'dbos') {
|
|
144
|
+
return `
|
|
145
|
+
SELECT
|
|
146
|
+
EXISTS (
|
|
147
|
+
SELECT 1
|
|
148
|
+
FROM information_schema.schemata
|
|
149
|
+
WHERE schema_name = '${schemaName}'
|
|
150
|
+
) AS schema_exists,
|
|
151
|
+
EXISTS (
|
|
152
|
+
SELECT 1
|
|
153
|
+
FROM information_schema.tables
|
|
154
|
+
WHERE table_schema = '${schemaName}'
|
|
155
|
+
AND table_name = 'transaction_completion'
|
|
156
|
+
) AS table_exists;
|
|
157
|
+
`;
|
|
158
|
+
}
|
|
159
|
+
exports.checkSchemaInstallationPG = checkSchemaInstallationPG;
|
|
160
|
+
function createTransactionCompletionSchemaPG(schemaName = 'dbos') {
|
|
161
|
+
return `CREATE SCHEMA IF NOT EXISTS "${schemaName}";`;
|
|
162
|
+
}
|
|
163
|
+
exports.createTransactionCompletionSchemaPG = createTransactionCompletionSchemaPG;
|
|
164
|
+
function createTransactionCompletionTablePG(schemaName = 'dbos') {
|
|
165
|
+
return `
|
|
166
|
+
CREATE TABLE IF NOT EXISTS "${schemaName}".transaction_completion (
|
|
167
|
+
workflow_id TEXT NOT NULL,
|
|
168
|
+
function_num INT NOT NULL,
|
|
169
|
+
output TEXT,
|
|
170
|
+
error TEXT,
|
|
171
|
+
created_at BIGINT NOT NULL DEFAULT (EXTRACT(EPOCH FROM now())*1000)::bigint,
|
|
172
|
+
PRIMARY KEY (workflow_id, function_num)
|
|
173
|
+
);
|
|
174
|
+
`;
|
|
175
|
+
}
|
|
176
|
+
exports.createTransactionCompletionTablePG = createTransactionCompletionTablePG;
|
|
177
|
+
function getPGErrorCode(error) {
|
|
178
|
+
return error && typeof error === 'object' && 'code' in error ? error.code : undefined;
|
|
179
|
+
}
|
|
180
|
+
function isPGRetriableTransactionError(error) {
|
|
181
|
+
return getPGErrorCode(error) === '40001';
|
|
182
|
+
}
|
|
183
|
+
exports.isPGRetriableTransactionError = isPGRetriableTransactionError;
|
|
184
|
+
function isPGKeyConflictError(error) {
|
|
185
|
+
return getPGErrorCode(error) === '23505';
|
|
186
|
+
}
|
|
187
|
+
exports.isPGKeyConflictError = isPGKeyConflictError;
|
|
188
|
+
function isPGFailedSqlTransactionError(error) {
|
|
189
|
+
return getPGErrorCode(error) === '25P02';
|
|
190
|
+
}
|
|
191
|
+
exports.isPGFailedSqlTransactionError = isPGFailedSqlTransactionError;
|
|
192
|
+
// URL utilities retained for configuration parsing
|
|
193
|
+
var database_utils_1 = require("./database_utils");
|
|
194
|
+
Object.defineProperty(exports, "maskDatabaseUrl", { enumerable: true, get: function () { return database_utils_1.maskDatabaseUrl; } });
|
|
195
|
+
Object.defineProperty(exports, "getDatabaseNameFromUrl", { enumerable: true, get: function () { return database_utils_1.getDatabaseNameFromUrl; } });
|
|
196
|
+
Object.defineProperty(exports, "deriveDatabaseUrl", { enumerable: true, get: function () { return database_utils_1.deriveDatabaseUrl; } });
|
|
197
|
+
// Note: PostgreSQL-specific functions were removed in the HTTP SDK migration.
|
|
198
|
+
// The following functions are no longer available:
|
|
199
|
+
// - getPGClientConfig
|
|
200
|
+
// - connectToPGDatabase
|
|
201
|
+
// - connectToPGAndReportOutcome
|
|
202
|
+
// - dropPGDatabase
|
|
203
|
+
// - ensurePGDatabase
|
|
204
|
+
//# sourceMappingURL=datasource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../src/datasource.ts"],"names":[],"mappings":"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"}
|