@dbos-inc/drizzle-datasource 3.0.7-preview.gfe77addda7 → 3.0.8-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.
@@ -0,0 +1,26 @@
1
+ import { ClientConfig, PoolConfig } from 'pg';
2
+ import { DBOSDataSource } from '@dbos-inc/dbos-sdk/datasource';
3
+ import { NodePgDatabase } from 'drizzle-orm/node-postgres';
4
+ import { PgTransactionConfig } from 'drizzle-orm/pg-core';
5
+ export type TransactionConfig = Pick<PgTransactionConfig, 'isolationLevel' | 'accessMode'>;
6
+ export interface transaction_completion {
7
+ workflow_id: string;
8
+ function_num: number;
9
+ output: string | null;
10
+ error: string | null;
11
+ }
12
+ export declare class DrizzleDataSource implements DBOSDataSource<TransactionConfig> {
13
+ #private;
14
+ readonly name: string;
15
+ static get client(): NodePgDatabase<{
16
+ [key: string]: object;
17
+ }>;
18
+ static initializeInternalSchema(config: ClientConfig): Promise<void>;
19
+ constructor(name: string, config: PoolConfig, entities?: {
20
+ [key: string]: object;
21
+ });
22
+ runTransaction<T>(callback: () => Promise<T>, funcName: string, config?: TransactionConfig): Promise<T>;
23
+ registerTransaction<This, Args extends unknown[], Return>(func: (this: This, ...args: Args) => Promise<Return>, config?: TransactionConfig, name?: string): (this: This, ...args: Args) => Promise<Return>;
24
+ transaction(config?: TransactionConfig): <This, Args extends unknown[], Return>(_target: object, propertyKey: PropertyKey, descriptor: TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>) => TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>;
25
+ }
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAQ,UAAU,EAAE,MAAM,IAAI,CAAC;AAE5D,OAAO,EAQL,cAAc,EAEf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAW,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAO1D,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,GAAG,YAAY,CAAC,CAAC;AAI3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAwKD,qBAAa,iBAAkB,YAAW,cAAc,CAAC,iBAAiB,CAAC;;IA2BvE,QAAQ,CAAC,IAAI,EAAE,MAAM;IAzBvB,MAAM,KAAK,MAAM,IAAI,cAAc,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAS7D;WAEY,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;gBAc/D,IAAI,EAAE,MAAM,EACrB,MAAM,EAAE,UAAU,EAClB,QAAQ,GAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAO;IAMpC,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB;IAIhG,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,MAAM,CAAC,EAAE,iBAAiB,EAC1B,IAAI,CAAC,EAAE,MAAM,GACZ,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC;IAKjD,WAAW,CAAC,MAAM,CAAC,EAAE,iBAAiB,mDAIzB,MAAM,eACF,WAAW,cACZ,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,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DrizzleDataSource = void 0;
4
+ const pg_1 = require("pg");
5
+ const dbos_sdk_1 = require("@dbos-inc/dbos-sdk");
6
+ const datasource_1 = require("@dbos-inc/dbos-sdk/datasource");
7
+ const node_postgres_1 = require("drizzle-orm/node-postgres");
8
+ const async_hooks_1 = require("async_hooks");
9
+ const superjson_1 = require("superjson");
10
+ const drizzle_orm_1 = require("drizzle-orm");
11
+ const asyncLocalCtx = new async_hooks_1.AsyncLocalStorage();
12
+ class DrizzleTransactionHandler {
13
+ name;
14
+ config;
15
+ entities;
16
+ dsType = 'drizzle';
17
+ #connection;
18
+ constructor(name, config, entities = {}) {
19
+ this.name = name;
20
+ this.config = config;
21
+ this.entities = entities;
22
+ }
23
+ async initialize() {
24
+ const conn = this.#connection;
25
+ const driver = new pg_1.Pool(this.config);
26
+ const db = (0, node_postgres_1.drizzle)(driver, { schema: this.entities });
27
+ this.#connection = { db, end: () => driver.end() };
28
+ await conn?.end();
29
+ }
30
+ async destroy() {
31
+ const conn = this.#connection;
32
+ this.#connection = undefined;
33
+ await conn?.end();
34
+ }
35
+ get #drizzle() {
36
+ if (!this.#connection) {
37
+ throw new Error(`DataSource ${this.name} is not initialized.`);
38
+ }
39
+ return this.#connection.db;
40
+ }
41
+ async #checkExecution(workflowID, stepID) {
42
+ const statement = (0, drizzle_orm_1.sql) `
43
+ SELECT output, error FROM dbos.transaction_completion
44
+ WHERE workflow_id = ${workflowID} AND function_num = ${stepID}`;
45
+ const result = await this.#drizzle.execute(statement);
46
+ if (result.rows.length !== 1) {
47
+ return undefined;
48
+ }
49
+ const { output, error } = result.rows[0];
50
+ return error !== null ? { error } : { output };
51
+ }
52
+ static async #recordOutput(client, workflowID, stepID, output) {
53
+ try {
54
+ const statement = (0, drizzle_orm_1.sql) `
55
+ INSERT INTO dbos.transaction_completion (workflow_id, function_num, output)
56
+ VALUES (${workflowID}, ${stepID}, ${output})`;
57
+ await client.execute(statement);
58
+ }
59
+ catch (error) {
60
+ if ((0, datasource_1.isPGKeyConflictError)(error)) {
61
+ throw new dbos_sdk_1.DBOSWorkflowConflictError(workflowID);
62
+ }
63
+ else {
64
+ throw error;
65
+ }
66
+ }
67
+ }
68
+ async #recordError(workflowID, stepID, error) {
69
+ try {
70
+ const statement = (0, drizzle_orm_1.sql) `
71
+ INSERT INTO dbos.transaction_completion (workflow_id, function_num, error)
72
+ VALUES (${workflowID}, ${stepID}, ${error})`;
73
+ await this.#drizzle.execute(statement);
74
+ }
75
+ catch (error) {
76
+ if ((0, datasource_1.isPGKeyConflictError)(error)) {
77
+ throw new dbos_sdk_1.DBOSWorkflowConflictError(workflowID);
78
+ }
79
+ else {
80
+ throw error;
81
+ }
82
+ }
83
+ }
84
+ /* Invoke a transaction function, called by the framework */
85
+ async invokeTransactionFunction(config, target, func, ...args) {
86
+ const workflowID = dbos_sdk_1.DBOS.workflowID;
87
+ const stepID = dbos_sdk_1.DBOS.stepID;
88
+ if (workflowID !== undefined && stepID === undefined) {
89
+ throw new Error('DBOS.stepID is undefined inside a workflow.');
90
+ }
91
+ const readOnly = config?.accessMode === 'read only' ? true : false;
92
+ const saveResults = !readOnly && workflowID !== undefined;
93
+ // Retry loop if appropriate
94
+ let retryWaitMS = 1;
95
+ const backoffFactor = 1.5;
96
+ const maxRetryWaitMS = 2000; // Maximum wait 2 seconds.
97
+ while (true) {
98
+ // Check to see if this tx has already been executed
99
+ const previousResult = saveResults ? await this.#checkExecution(workflowID, stepID) : undefined;
100
+ if (previousResult) {
101
+ dbos_sdk_1.DBOS.span?.setAttribute('cached', true);
102
+ if ('error' in previousResult) {
103
+ throw superjson_1.SuperJSON.parse(previousResult.error);
104
+ }
105
+ return (previousResult.output ? superjson_1.SuperJSON.parse(previousResult.output) : null);
106
+ }
107
+ try {
108
+ const result = await this.#drizzle.transaction(async (client) => {
109
+ // execute user's transaction function
110
+ const result = await asyncLocalCtx.run({ client }, async () => {
111
+ return await func.call(target, ...args);
112
+ });
113
+ // save the output of read/write transactions
114
+ if (saveResults) {
115
+ await DrizzleTransactionHandler.#recordOutput(client, workflowID, stepID, superjson_1.SuperJSON.stringify(result));
116
+ }
117
+ return result;
118
+ }, { accessMode: config?.accessMode, isolationLevel: config?.isolationLevel });
119
+ return result;
120
+ }
121
+ catch (error) {
122
+ if ((0, datasource_1.isPGRetriableTransactionError)(error)) {
123
+ dbos_sdk_1.DBOS.span?.addEvent('TXN SERIALIZATION FAILURE', { retryWaitMillis: retryWaitMS }, performance.now());
124
+ // Retry serialization failures.
125
+ await new Promise((resolve) => setTimeout(resolve, retryWaitMS));
126
+ retryWaitMS = Math.min(retryWaitMS * backoffFactor, maxRetryWaitMS);
127
+ continue;
128
+ }
129
+ else {
130
+ if (saveResults) {
131
+ const message = superjson_1.SuperJSON.stringify(error);
132
+ await this.#recordError(workflowID, stepID, message);
133
+ }
134
+ throw error;
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ class DrizzleDataSource {
141
+ name;
142
+ // User calls this... DBOS not directly involved...
143
+ static get client() {
144
+ if (!dbos_sdk_1.DBOS.isInTransaction()) {
145
+ throw new Error('Invalid use of DrizzleDataSource.client outside of a DBOS transaction');
146
+ }
147
+ const ctx = asyncLocalCtx.getStore();
148
+ if (!ctx) {
149
+ throw new Error('Invalid use of DrizzleDataSource.client outside of a DBOS transaction');
150
+ }
151
+ return ctx.client;
152
+ }
153
+ static async initializeInternalSchema(config) {
154
+ const client = new pg_1.Client(config);
155
+ try {
156
+ await client.connect();
157
+ await client.query(datasource_1.createTransactionCompletionSchemaPG);
158
+ await client.query(datasource_1.createTransactionCompletionTablePG);
159
+ }
160
+ finally {
161
+ await client.end();
162
+ }
163
+ }
164
+ #provider;
165
+ constructor(name, config, entities = {}) {
166
+ this.name = name;
167
+ this.#provider = new DrizzleTransactionHandler(name, config, entities);
168
+ (0, datasource_1.registerDataSource)(this.#provider);
169
+ }
170
+ async runTransaction(callback, funcName, config) {
171
+ return await (0, datasource_1.runTransaction)(callback, funcName, { dsName: this.name, config });
172
+ }
173
+ registerTransaction(func, config, name) {
174
+ return (0, datasource_1.registerTransaction)(this.name, func, { name: name ?? func.name }, config);
175
+ }
176
+ // decorator
177
+ transaction(config) {
178
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
179
+ const ds = this;
180
+ return function decorator(_target, propertyKey, descriptor) {
181
+ if (!descriptor.value) {
182
+ throw new Error('Use of decorator when original method is undefined');
183
+ }
184
+ descriptor.value = ds.registerTransaction(descriptor.value, config, String(propertyKey));
185
+ return descriptor;
186
+ };
187
+ }
188
+ }
189
+ exports.DrizzleDataSource = DrizzleDataSource;
190
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}