@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.
Files changed (167) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.clavix/outputs/dbos-http-sdk/full-prd.md +142 -0
  3. package/.clavix/outputs/dbos-http-sdk/quick-prd.md +12 -0
  4. package/.clavix/outputs/dbos-http-sdk/tasks.md +630 -0
  5. package/.clavix/outputs/prompts/dbos-http-api-20260110-033219.md +91 -0
  6. package/.husky/pre-commit +1 -0
  7. package/.prettierignore +3 -0
  8. package/.prettierrc +9 -0
  9. package/CODE_OF_CONDUCT.md +49 -0
  10. package/CONTRIBUTING.md +47 -0
  11. package/LICENSE +21 -0
  12. package/README.md +172 -0
  13. package/dist/dbos-config.schema.json +132 -0
  14. package/dist/schemas/system_db_schema.d.ts +73 -0
  15. package/dist/schemas/system_db_schema.d.ts.map +1 -0
  16. package/dist/schemas/system_db_schema.js +3 -0
  17. package/dist/schemas/system_db_schema.js.map +1 -0
  18. package/dist/src/adminserver.d.ts +79 -0
  19. package/dist/src/adminserver.d.ts.map +1 -0
  20. package/dist/src/adminserver.js +495 -0
  21. package/dist/src/adminserver.js.map +1 -0
  22. package/dist/src/authdecorators.d.ts +2 -0
  23. package/dist/src/authdecorators.d.ts.map +1 -0
  24. package/dist/src/authdecorators.js +48 -0
  25. package/dist/src/authdecorators.js.map +1 -0
  26. package/dist/src/cli/cli.d.ts +9 -0
  27. package/dist/src/cli/cli.d.ts.map +1 -0
  28. package/dist/src/cli/cli.js +116 -0
  29. package/dist/src/cli/cli.js.map +1 -0
  30. package/dist/src/cli/commands.d.ts +3 -0
  31. package/dist/src/cli/commands.d.ts.map +1 -0
  32. package/dist/src/cli/commands.js +46 -0
  33. package/dist/src/cli/commands.js.map +1 -0
  34. package/dist/src/client.d.ts +85 -0
  35. package/dist/src/client.d.ts.map +1 -0
  36. package/dist/src/client.js +186 -0
  37. package/dist/src/client.js.map +1 -0
  38. package/dist/src/conductor/conductor.d.ts +28 -0
  39. package/dist/src/conductor/conductor.d.ts.map +1 -0
  40. package/dist/src/conductor/conductor.js +376 -0
  41. package/dist/src/conductor/conductor.js.map +1 -0
  42. package/dist/src/conductor/protocol.d.ts +238 -0
  43. package/dist/src/conductor/protocol.d.ts.map +1 -0
  44. package/dist/src/conductor/protocol.js +353 -0
  45. package/dist/src/conductor/protocol.js.map +1 -0
  46. package/dist/src/config.d.ts +91 -0
  47. package/dist/src/config.d.ts.map +1 -0
  48. package/dist/src/config.js +199 -0
  49. package/dist/src/config.js.map +1 -0
  50. package/dist/src/context.d.ts +62 -0
  51. package/dist/src/context.d.ts.map +1 -0
  52. package/dist/src/context.js +118 -0
  53. package/dist/src/context.js.map +1 -0
  54. package/dist/src/database_utils.d.ts +17 -0
  55. package/dist/src/database_utils.d.ts.map +1 -0
  56. package/dist/src/database_utils.js +53 -0
  57. package/dist/src/database_utils.js.map +1 -0
  58. package/dist/src/datasource.d.ts +109 -0
  59. package/dist/src/datasource.d.ts.map +1 -0
  60. package/dist/src/datasource.js +204 -0
  61. package/dist/src/datasource.js.map +1 -0
  62. package/dist/src/dbos-executor.d.ts +189 -0
  63. package/dist/src/dbos-executor.d.ts.map +1 -0
  64. package/dist/src/dbos-executor.js +817 -0
  65. package/dist/src/dbos-executor.js.map +1 -0
  66. package/dist/src/dbos.d.ts +519 -0
  67. package/dist/src/dbos.d.ts.map +1 -0
  68. package/dist/src/dbos.js +1282 -0
  69. package/dist/src/dbos.js.map +1 -0
  70. package/dist/src/debouncer.d.ts +33 -0
  71. package/dist/src/debouncer.d.ts.map +1 -0
  72. package/dist/src/debouncer.js +170 -0
  73. package/dist/src/debouncer.js.map +1 -0
  74. package/dist/src/debugpoint.d.ts +26 -0
  75. package/dist/src/debugpoint.d.ts.map +1 -0
  76. package/dist/src/debugpoint.js +65 -0
  77. package/dist/src/debugpoint.js.map +1 -0
  78. package/dist/src/decorators.d.ts +219 -0
  79. package/dist/src/decorators.d.ts.map +1 -0
  80. package/dist/src/decorators.js +873 -0
  81. package/dist/src/decorators.js.map +1 -0
  82. package/dist/src/error.d.ts +130 -0
  83. package/dist/src/error.d.ts.map +1 -0
  84. package/dist/src/error.js +290 -0
  85. package/dist/src/error.js.map +1 -0
  86. package/dist/src/http_client.d.ts +82 -0
  87. package/dist/src/http_client.d.ts.map +1 -0
  88. package/dist/src/http_client.js +286 -0
  89. package/dist/src/http_client.js.map +1 -0
  90. package/dist/src/http_system_database.d.ts +84 -0
  91. package/dist/src/http_system_database.d.ts.map +1 -0
  92. package/dist/src/http_system_database.js +429 -0
  93. package/dist/src/http_system_database.js.map +1 -0
  94. package/dist/src/index.d.ts +14 -0
  95. package/dist/src/index.d.ts.map +1 -0
  96. package/dist/src/index.js +53 -0
  97. package/dist/src/index.js.map +1 -0
  98. package/dist/src/scheduler/crontab.d.ts +14 -0
  99. package/dist/src/scheduler/crontab.d.ts.map +1 -0
  100. package/dist/src/scheduler/crontab.js +308 -0
  101. package/dist/src/scheduler/crontab.js.map +1 -0
  102. package/dist/src/scheduler/scheduler.d.ts +41 -0
  103. package/dist/src/scheduler/scheduler.d.ts.map +1 -0
  104. package/dist/src/scheduler/scheduler.js +165 -0
  105. package/dist/src/scheduler/scheduler.js.map +1 -0
  106. package/dist/src/serialization.d.ts +57 -0
  107. package/dist/src/serialization.d.ts.map +1 -0
  108. package/dist/src/serialization.js +306 -0
  109. package/dist/src/serialization.js.map +1 -0
  110. package/dist/src/solidactions-executor.d.ts +177 -0
  111. package/dist/src/solidactions-executor.d.ts.map +1 -0
  112. package/dist/src/solidactions-executor.js +817 -0
  113. package/dist/src/solidactions-executor.js.map +1 -0
  114. package/dist/src/solidactions.d.ts +519 -0
  115. package/dist/src/solidactions.d.ts.map +1 -0
  116. package/dist/src/solidactions.js +1284 -0
  117. package/dist/src/solidactions.js.map +1 -0
  118. package/dist/src/step.d.ts +16 -0
  119. package/dist/src/step.d.ts.map +1 -0
  120. package/dist/src/step.js +3 -0
  121. package/dist/src/step.js.map +1 -0
  122. package/dist/src/system_database.d.ts +141 -0
  123. package/dist/src/system_database.d.ts.map +1 -0
  124. package/dist/src/system_database.js +25 -0
  125. package/dist/src/system_database.js.map +1 -0
  126. package/dist/src/telemetry/collector.d.ts +13 -0
  127. package/dist/src/telemetry/collector.d.ts.map +1 -0
  128. package/dist/src/telemetry/collector.js +63 -0
  129. package/dist/src/telemetry/collector.js.map +1 -0
  130. package/dist/src/telemetry/exporters.d.ts +13 -0
  131. package/dist/src/telemetry/exporters.d.ts.map +1 -0
  132. package/dist/src/telemetry/exporters.js +101 -0
  133. package/dist/src/telemetry/exporters.js.map +1 -0
  134. package/dist/src/telemetry/logs.d.ts +52 -0
  135. package/dist/src/telemetry/logs.d.ts.map +1 -0
  136. package/dist/src/telemetry/logs.js +287 -0
  137. package/dist/src/telemetry/logs.js.map +1 -0
  138. package/dist/src/telemetry/traces.d.ts +52 -0
  139. package/dist/src/telemetry/traces.d.ts.map +1 -0
  140. package/dist/src/telemetry/traces.js +150 -0
  141. package/dist/src/telemetry/traces.js.map +1 -0
  142. package/dist/src/utils.d.ts +26 -0
  143. package/dist/src/utils.d.ts.map +1 -0
  144. package/dist/src/utils.js +136 -0
  145. package/dist/src/utils.js.map +1 -0
  146. package/dist/src/wfqueue.d.ts +64 -0
  147. package/dist/src/wfqueue.d.ts.map +1 -0
  148. package/dist/src/wfqueue.js +147 -0
  149. package/dist/src/wfqueue.js.map +1 -0
  150. package/dist/src/workflow.d.ts +154 -0
  151. package/dist/src/workflow.d.ts.map +1 -0
  152. package/dist/src/workflow.js +99 -0
  153. package/dist/src/workflow.js.map +1 -0
  154. package/dist/src/workflow_management.d.ts +15 -0
  155. package/dist/src/workflow_management.d.ts.map +1 -0
  156. package/dist/src/workflow_management.js +87 -0
  157. package/dist/src/workflow_management.js.map +1 -0
  158. package/dist/tsconfig.tsbuildinfo +1 -0
  159. package/docs/api-schema.md +1441 -0
  160. package/docs/migration-guide.md +460 -0
  161. package/docs/phase-14-changes.md +156 -0
  162. package/docs/solidsteps-ai-prompt.md +534 -0
  163. package/eslint.config.cjs +50 -0
  164. package/package.json +84 -0
  165. package/solidactions-ai-prompt.md +1504 -0
  166. package/solidactions-config.schema.json +132 -0
  167. 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":";;AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,MAAM,CAAC,EAAE,4BAA4B,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,oBAAqB,SAAQ,0BAA0B;IACtE,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;CAC1B;AAmBD,wBAAgB,eAAe,CAAC,GAAG,EAAE,oBAAoB,WAKxD;AAID,wBAAgB,sBAAsB,IAAI,oBAAoB,GAAG,SAAS,CAEzE;AAKD,wBAAgB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,sBAoB9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAU/C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAUtC;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE5G;AAED,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,IAAI,EAAE,oBAAoB,GAAG,SAAS,EACtC,GAAG,EAAE,oBAAoB,EACzB,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,CAAC,CAAC,CASZ;AAED,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,cAsB3B;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B"}
@@ -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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"}