@dbos-inc/postgres-datasource 3.0.6-preview
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/index.ts +238 -0
- package/jest.config.js +8 -0
- package/package.json +30 -0
- package/tests/config.test.ts +31 -0
- package/tests/datasource.test.ts +399 -0
- package/tests/test-helpers.ts +13 -0
- package/tsconfig.json +9 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import postgres from 'postgres';
|
|
2
|
+
import { PGIsolationLevel as IsolationLevel, PGTransactionConfig as PostgresTransactionOptions, DBOSDataSource } from '@dbos-inc/dbos-sdk/datasource';
|
|
3
|
+
export { IsolationLevel, PostgresTransactionOptions };
|
|
4
|
+
export declare class PostgresDataSource implements DBOSDataSource<PostgresTransactionOptions> {
|
|
5
|
+
#private;
|
|
6
|
+
static get client(): postgres.TransactionSql<{}>;
|
|
7
|
+
static initializeInternalSchema(options?: postgres.Options<{}>): Promise<void>;
|
|
8
|
+
readonly name: string;
|
|
9
|
+
constructor(name: string, options?: postgres.Options<{}>);
|
|
10
|
+
runTransaction<T>(callback: () => Promise<T>, name: string, config?: PostgresTransactionOptions): Promise<T>;
|
|
11
|
+
registerTransaction<This, Args extends unknown[], Return>(func: (this: This, ...args: Args) => Promise<Return>, name: string, config?: PostgresTransactionOptions): (this: This, ...args: Args) => Promise<Return>;
|
|
12
|
+
transaction(config?: PostgresTransactionOptions): <This, Args extends unknown[], Return>(_target: object, propertyKey: string, descriptor: TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>) => TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAEA,OAAO,QAAsB,MAAM,UAAU,CAAC;AAE9C,OAAO,EAQL,gBAAgB,IAAI,cAAc,EAClC,mBAAmB,IAAI,0BAA0B,EACjD,cAAc,EAEf,MAAM,+BAA+B,CAAC;AAIvC,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC;AA0JtD,qBAAa,kBAAmB,YAAW,cAAc,CAAC,0BAA0B,CAAC;;IAEnF,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAS/C;WAGY,wBAAwB,CAAC,OAAO,GAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAIV,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAM;IAMtD,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,0BAA0B;IAIrG,mBAAmB,CAAC,IAAI,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,MAAM,EACtD,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,EACpD,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,0BAA0B,GAClC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC;IAIjD,WAAW,CAAC,MAAM,CAAC,EAAE,0BAA0B,mDAIlC,MAAM,eACF,MAAM,cACP,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,MAAM,CAAC,CAAC,oCAAxC,IAAI,WAAW,IAAI,KAAK,QAAQ,MAAM,CAAC;CAWvF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// using https://github.com/porsager/postgres
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PostgresDataSource = exports.IsolationLevel = void 0;
|
|
8
|
+
const postgres_1 = __importDefault(require("postgres"));
|
|
9
|
+
const dbos_sdk_1 = require("@dbos-inc/dbos-sdk");
|
|
10
|
+
const datasource_1 = require("@dbos-inc/dbos-sdk/datasource");
|
|
11
|
+
Object.defineProperty(exports, "IsolationLevel", { enumerable: true, get: function () { return datasource_1.PGIsolationLevel; } });
|
|
12
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
13
|
+
const superjson_1 = require("superjson");
|
|
14
|
+
const asyncLocalCtx = new node_async_hooks_1.AsyncLocalStorage();
|
|
15
|
+
class PostgresTransactionHandler {
|
|
16
|
+
name;
|
|
17
|
+
dsType = 'PostgresDataSource';
|
|
18
|
+
#db;
|
|
19
|
+
constructor(name,
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
21
|
+
options = {}) {
|
|
22
|
+
this.name = name;
|
|
23
|
+
this.#db = (0, postgres_1.default)(options);
|
|
24
|
+
}
|
|
25
|
+
initialize() {
|
|
26
|
+
return Promise.resolve();
|
|
27
|
+
}
|
|
28
|
+
destroy() {
|
|
29
|
+
return this.#db.end();
|
|
30
|
+
}
|
|
31
|
+
async #checkExecution(workflowID, functionNum) {
|
|
32
|
+
const result = await this.#db `
|
|
33
|
+
SELECT output, error FROM dbos.transaction_completion
|
|
34
|
+
WHERE workflow_id = ${workflowID} AND function_num = ${functionNum}`;
|
|
35
|
+
if (result.length === 0) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const { output, error } = result[0];
|
|
39
|
+
return error !== null ? { error } : { output };
|
|
40
|
+
}
|
|
41
|
+
static async #recordOutput(
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
43
|
+
client, workflowID, functionNum, output) {
|
|
44
|
+
try {
|
|
45
|
+
await client /*sql*/ `
|
|
46
|
+
INSERT INTO dbos.transaction_completion (workflow_id, function_num, output)
|
|
47
|
+
VALUES (${workflowID}, ${functionNum}, ${output})`;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if ((0, datasource_1.isPGKeyConflictError)(error)) {
|
|
51
|
+
throw new dbos_sdk_1.DBOSWorkflowConflictError(workflowID);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async #recordError(workflowID, functionNum, error) {
|
|
59
|
+
try {
|
|
60
|
+
await this.#db /*sql*/ `
|
|
61
|
+
INSERT INTO dbos.transaction_completion (workflow_id, function_num, error)
|
|
62
|
+
VALUES (${workflowID}, ${functionNum}, ${error})`;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if ((0, datasource_1.isPGKeyConflictError)(error)) {
|
|
66
|
+
throw new dbos_sdk_1.DBOSWorkflowConflictError(workflowID);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async invokeTransactionFunction(config, target, func, ...args) {
|
|
74
|
+
const workflowID = dbos_sdk_1.DBOS.workflowID;
|
|
75
|
+
if (workflowID === undefined) {
|
|
76
|
+
throw new Error('Workflow ID is not set.');
|
|
77
|
+
}
|
|
78
|
+
const functionNum = dbos_sdk_1.DBOS.stepID;
|
|
79
|
+
if (functionNum === undefined) {
|
|
80
|
+
throw new Error('Function Number is not set.');
|
|
81
|
+
}
|
|
82
|
+
const isolationLevel = config?.isolationLevel ? `ISOLATION LEVEL ${config.isolationLevel}` : '';
|
|
83
|
+
const readOnly = config?.readOnly ?? false;
|
|
84
|
+
const accessMode = config?.readOnly === undefined ? '' : readOnly ? 'READ ONLY' : 'READ WRITE';
|
|
85
|
+
const saveResults = !readOnly && workflowID;
|
|
86
|
+
let retryWaitMS = 1;
|
|
87
|
+
const backoffFactor = 1.5;
|
|
88
|
+
const maxRetryWaitMS = 2000;
|
|
89
|
+
while (true) {
|
|
90
|
+
// Check to see if this tx has already been executed
|
|
91
|
+
const previousResult = saveResults ? await this.#checkExecution(workflowID, functionNum) : undefined;
|
|
92
|
+
if (previousResult) {
|
|
93
|
+
dbos_sdk_1.DBOS.span?.setAttribute('cached', true);
|
|
94
|
+
if ('error' in previousResult) {
|
|
95
|
+
throw superjson_1.SuperJSON.parse(previousResult.error);
|
|
96
|
+
}
|
|
97
|
+
return (previousResult.output ? superjson_1.SuperJSON.parse(previousResult.output) : null);
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const result = await this.#db.begin(`${isolationLevel} ${accessMode}`, async (client) => {
|
|
101
|
+
// execute user's transaction function
|
|
102
|
+
const result = await asyncLocalCtx.run({ client }, async () => {
|
|
103
|
+
return (await func.call(target, ...args));
|
|
104
|
+
});
|
|
105
|
+
// save the output of read/write transactions
|
|
106
|
+
if (saveResults) {
|
|
107
|
+
await PostgresTransactionHandler.#recordOutput(client, workflowID, functionNum, superjson_1.SuperJSON.stringify(result));
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
});
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if ((0, datasource_1.isPGRetriableTransactionError)(error)) {
|
|
115
|
+
// 400001 is a serialization failure in PostgreSQL
|
|
116
|
+
dbos_sdk_1.DBOS.span?.addEvent('TXN SERIALIZATION FAILURE', { retryWaitMillis: retryWaitMS }, performance.now());
|
|
117
|
+
await new Promise((resolve) => setTimeout(resolve, retryWaitMS));
|
|
118
|
+
retryWaitMS = Math.min(retryWaitMS * backoffFactor, maxRetryWaitMS);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
if (saveResults) {
|
|
123
|
+
const message = superjson_1.SuperJSON.stringify(error);
|
|
124
|
+
await this.#recordError(workflowID, functionNum, message);
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
class PostgresDataSource {
|
|
133
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
134
|
+
static get client() {
|
|
135
|
+
if (!dbos_sdk_1.DBOS.isInTransaction()) {
|
|
136
|
+
throw new Error('invalid use of PostgresDataSource.client outside of a DBOS transaction.');
|
|
137
|
+
}
|
|
138
|
+
const ctx = asyncLocalCtx.getStore();
|
|
139
|
+
if (!ctx) {
|
|
140
|
+
throw new Error('No async local context found.');
|
|
141
|
+
}
|
|
142
|
+
return ctx.client;
|
|
143
|
+
}
|
|
144
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
145
|
+
static async initializeInternalSchema(options = {}) {
|
|
146
|
+
const pg = (0, postgres_1.default)({ ...options, onnotice: () => { } });
|
|
147
|
+
try {
|
|
148
|
+
await pg.unsafe(datasource_1.createTransactionCompletionSchemaPG);
|
|
149
|
+
await pg.unsafe(datasource_1.createTransactionCompletionTablePG);
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
await pg.end();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
name;
|
|
156
|
+
#provider;
|
|
157
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
158
|
+
constructor(name, options = {}) {
|
|
159
|
+
this.name = name;
|
|
160
|
+
this.#provider = new PostgresTransactionHandler(name, options);
|
|
161
|
+
(0, datasource_1.registerDataSource)(this.#provider);
|
|
162
|
+
}
|
|
163
|
+
async runTransaction(callback, name, config) {
|
|
164
|
+
return await (0, datasource_1.runTransaction)(callback, name, { dsName: this.name, config });
|
|
165
|
+
}
|
|
166
|
+
registerTransaction(func, name, config) {
|
|
167
|
+
return (0, datasource_1.registerTransaction)(this.name, func, { name }, config);
|
|
168
|
+
}
|
|
169
|
+
transaction(config) {
|
|
170
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
171
|
+
const ds = this;
|
|
172
|
+
return function decorator(_target, propertyKey, descriptor) {
|
|
173
|
+
if (!descriptor.value) {
|
|
174
|
+
throw Error('Use of decorator when original method is undefined');
|
|
175
|
+
}
|
|
176
|
+
descriptor.value = ds.registerTransaction(descriptor.value, propertyKey.toString(), config);
|
|
177
|
+
return descriptor;
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.PostgresDataSource = PostgresDataSource;
|
|
182
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|