@dbos-inc/typeorm-datasource 3.0.13-preview → 3.0.17-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 +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -11
- package/dist/index.js.map +1 -1
- package/index.ts +32 -14
- package/package.json +1 -1
- package/tests/config.test.ts +1 -1
- package/tests/datasource.test.ts +5 -5
- package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { PoolConfig } from 'pg';
|
|
2
2
|
import { DBOSDataSource, PGTransactionConfig } from '@dbos-inc/dbos-sdk/datasource';
|
|
3
3
|
import { EntityManager } from 'typeorm';
|
|
4
|
-
export
|
|
4
|
+
export interface TypeORMTransactionConfig extends PGTransactionConfig {
|
|
5
|
+
name?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class TypeOrmDataSource implements DBOSDataSource<TypeORMTransactionConfig> {
|
|
5
8
|
#private;
|
|
6
9
|
readonly name: string;
|
|
7
10
|
static get entityManager(): EntityManager;
|
|
8
|
-
|
|
11
|
+
get entityManager(): EntityManager;
|
|
12
|
+
static initializeDBOSSchema(config: PoolConfig): Promise<void>;
|
|
9
13
|
constructor(name: string, config: PoolConfig, entities: Function[]);
|
|
10
14
|
/**
|
|
11
|
-
* Run `
|
|
12
|
-
* @param
|
|
15
|
+
* Run `func` as a transaction against this DataSource
|
|
16
|
+
* @param func Function to run within a transactional context
|
|
13
17
|
* @param funcName Name to record for the transaction
|
|
14
18
|
* @param config Transaction configuration (isolation, etc)
|
|
15
|
-
* @returns Return value from `
|
|
19
|
+
* @returns Return value from `func`
|
|
16
20
|
*/
|
|
17
|
-
runTransaction<T>(
|
|
21
|
+
runTransaction<T>(func: () => Promise<T>, config?: TypeORMTransactionConfig): Promise<T>;
|
|
18
22
|
/**
|
|
19
23
|
* Register function as DBOS transaction, to be called within the context
|
|
20
24
|
* of a transaction on this data source.
|
|
@@ -24,10 +28,10 @@ export declare class TypeOrmDataSource implements DBOSDataSource<PGTransactionCo
|
|
|
24
28
|
* @param config Transaction settings
|
|
25
29
|
* @returns Wrapped function, to be called instead of `func`
|
|
26
30
|
*/
|
|
27
|
-
registerTransaction<This, Args extends unknown[], Return>(func: (this: This, ...args: Args) => Promise<Return>, config?:
|
|
31
|
+
registerTransaction<This, Args extends unknown[], Return>(func: (this: This, ...args: Args) => Promise<Return>, config?: TypeORMTransactionConfig): (this: This, ...args: Args) => Promise<Return>;
|
|
28
32
|
/**
|
|
29
33
|
* Decorator establishing function as a transaction
|
|
30
34
|
*/
|
|
31
|
-
transaction(config?:
|
|
35
|
+
transaction(config?: TypeORMTransactionConfig): <This, Args extends unknown[], Return>(_target: object, propertyKey: PropertyKey, descriptor: TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>) => TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>;
|
|
32
36
|
}
|
|
33
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAQL,cAAc,EAEd,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAc,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAQL,cAAc,EAEd,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAc,aAAa,EAAE,MAAM,SAAS,CAAC;AAIpD,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA8MD,qBAAa,iBAAkB,YAAW,cAAc,CAAC,wBAAwB,CAAC;;IAsC9E,QAAQ,CAAC,IAAI,EAAE,MAAM;IArBvB,MAAM,KAAK,aAAa,kBAEvB;IAED,IAAI,aAAa,kBAEhB;WAEY,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;gBAazD,IAAI,EAAE,MAAM,EACrB,MAAM,EAAE,UAAU,EAElB,QAAQ,EAAE,QAAQ,EAAE;IAMtB;;;;;;OAMG;IACG,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,wBAAwB;IAIjF;;;;;;;;OAQG;IACH,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,wBAAwB,GAChC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC;IAIjD;;OAEG;IACH,WAAW,CAAC,MAAM,CAAC,EAAE,wBAAwB,mDAIhC,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;CAcvF"}
|
package/dist/index.js
CHANGED
|
@@ -124,7 +124,7 @@ class TypeOrmTransactionHandler {
|
|
|
124
124
|
if (readOnly) {
|
|
125
125
|
await entityManager.query('SET TRANSACTION READ ONLY');
|
|
126
126
|
}
|
|
127
|
-
const result = await asyncLocalCtx.run({ entityManager:
|
|
127
|
+
const result = await asyncLocalCtx.run({ entityManager, owner: this }, async () => {
|
|
128
128
|
return await func.call(target, ...args);
|
|
129
129
|
});
|
|
130
130
|
// save the output of read/write transactions
|
|
@@ -157,7 +157,7 @@ class TypeOrmTransactionHandler {
|
|
|
157
157
|
class TypeOrmDataSource {
|
|
158
158
|
name;
|
|
159
159
|
// User calls this... DBOS not directly involved...
|
|
160
|
-
static
|
|
160
|
+
static #getEntityManager(p) {
|
|
161
161
|
if (!dbos_sdk_1.DBOS.isInTransaction()) {
|
|
162
162
|
throw new Error('Invalid use of TypeOrmDataSource.entityManager outside of a DBOS transaction');
|
|
163
163
|
}
|
|
@@ -165,9 +165,18 @@ class TypeOrmDataSource {
|
|
|
165
165
|
if (!ctx) {
|
|
166
166
|
throw new Error('Invalid use of TypeOrmDataSource.entityManager outside of a DBOS transaction');
|
|
167
167
|
}
|
|
168
|
+
if (p && p !== ctx.owner) {
|
|
169
|
+
throw new Error('Invalid retrieval of `TypeOrmDataSource.entityManager` from the wrong instance');
|
|
170
|
+
}
|
|
168
171
|
return ctx.entityManager;
|
|
169
172
|
}
|
|
170
|
-
static
|
|
173
|
+
static get entityManager() {
|
|
174
|
+
return TypeOrmDataSource.#getEntityManager(undefined);
|
|
175
|
+
}
|
|
176
|
+
get entityManager() {
|
|
177
|
+
return TypeOrmDataSource.#getEntityManager(this.#provider);
|
|
178
|
+
}
|
|
179
|
+
static async initializeDBOSSchema(config) {
|
|
171
180
|
const ds = await TypeOrmTransactionHandler.createInstance(config, []);
|
|
172
181
|
try {
|
|
173
182
|
await ds.query(datasource_1.createTransactionCompletionSchemaPG);
|
|
@@ -186,14 +195,14 @@ class TypeOrmDataSource {
|
|
|
186
195
|
(0, datasource_1.registerDataSource)(this.#provider);
|
|
187
196
|
}
|
|
188
197
|
/**
|
|
189
|
-
* Run `
|
|
190
|
-
* @param
|
|
198
|
+
* Run `func` as a transaction against this DataSource
|
|
199
|
+
* @param func Function to run within a transactional context
|
|
191
200
|
* @param funcName Name to record for the transaction
|
|
192
201
|
* @param config Transaction configuration (isolation, etc)
|
|
193
|
-
* @returns Return value from `
|
|
202
|
+
* @returns Return value from `func`
|
|
194
203
|
*/
|
|
195
|
-
async runTransaction(
|
|
196
|
-
return await (0, datasource_1.runTransaction)(
|
|
204
|
+
async runTransaction(func, config) {
|
|
205
|
+
return await (0, datasource_1.runTransaction)(func, config?.name ?? func.name, { dsName: this.name, config });
|
|
197
206
|
}
|
|
198
207
|
/**
|
|
199
208
|
* Register function as DBOS transaction, to be called within the context
|
|
@@ -204,8 +213,8 @@ class TypeOrmDataSource {
|
|
|
204
213
|
* @param config Transaction settings
|
|
205
214
|
* @returns Wrapped function, to be called instead of `func`
|
|
206
215
|
*/
|
|
207
|
-
registerTransaction(func, config
|
|
208
|
-
return (0, datasource_1.registerTransaction)(this.name, func, { name: name ?? func.name }, config);
|
|
216
|
+
registerTransaction(func, config) {
|
|
217
|
+
return (0, datasource_1.registerTransaction)(this.name, func, { name: config?.name ?? func.name }, config);
|
|
209
218
|
}
|
|
210
219
|
/**
|
|
211
220
|
* Decorator establishing function as a transaction
|
|
@@ -217,7 +226,10 @@ class TypeOrmDataSource {
|
|
|
217
226
|
if (!descriptor.value) {
|
|
218
227
|
throw new Error('Use of decorator when original method is undefined');
|
|
219
228
|
}
|
|
220
|
-
descriptor.value = ds.registerTransaction(descriptor.value,
|
|
229
|
+
descriptor.value = ds.registerTransaction(descriptor.value, {
|
|
230
|
+
...config,
|
|
231
|
+
name: config?.name ?? String(propertyKey),
|
|
232
|
+
});
|
|
221
233
|
return descriptor;
|
|
222
234
|
};
|
|
223
235
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;AACA,iDAAqE;AACrE,8DAWuC;AACvC,qCAAoD;AACpD,6CAAgD;AAChD,yCAAsC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/index.ts
CHANGED
|
@@ -16,8 +16,13 @@ import { DataSource, EntityManager } from 'typeorm';
|
|
|
16
16
|
import { AsyncLocalStorage } from 'async_hooks';
|
|
17
17
|
import { SuperJSON } from 'superjson';
|
|
18
18
|
|
|
19
|
+
export interface TypeORMTransactionConfig extends PGTransactionConfig {
|
|
20
|
+
name?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
19
23
|
interface DBOSTypeOrmLocalCtx {
|
|
20
24
|
entityManager: EntityManager;
|
|
25
|
+
owner: TypeOrmTransactionHandler;
|
|
21
26
|
}
|
|
22
27
|
|
|
23
28
|
const asyncLocalCtx = new AsyncLocalStorage<DBOSTypeOrmLocalCtx>();
|
|
@@ -181,7 +186,7 @@ class TypeOrmTransactionHandler implements DataSourceTransactionHandler {
|
|
|
181
186
|
await entityManager.query('SET TRANSACTION READ ONLY');
|
|
182
187
|
}
|
|
183
188
|
|
|
184
|
-
const result = await asyncLocalCtx.run({ entityManager:
|
|
189
|
+
const result = await asyncLocalCtx.run({ entityManager, owner: this }, async () => {
|
|
185
190
|
return await func.call(target, ...args);
|
|
186
191
|
});
|
|
187
192
|
|
|
@@ -219,9 +224,9 @@ class TypeOrmTransactionHandler implements DataSourceTransactionHandler {
|
|
|
219
224
|
}
|
|
220
225
|
}
|
|
221
226
|
|
|
222
|
-
export class TypeOrmDataSource implements DBOSDataSource<
|
|
227
|
+
export class TypeOrmDataSource implements DBOSDataSource<TypeORMTransactionConfig> {
|
|
223
228
|
// User calls this... DBOS not directly involved...
|
|
224
|
-
static
|
|
229
|
+
static #getEntityManager(p?: TypeOrmTransactionHandler): EntityManager {
|
|
225
230
|
if (!DBOS.isInTransaction()) {
|
|
226
231
|
throw new Error('Invalid use of TypeOrmDataSource.entityManager outside of a DBOS transaction');
|
|
227
232
|
}
|
|
@@ -229,11 +234,22 @@ export class TypeOrmDataSource implements DBOSDataSource<PGTransactionConfig> {
|
|
|
229
234
|
if (!ctx) {
|
|
230
235
|
throw new Error('Invalid use of TypeOrmDataSource.entityManager outside of a DBOS transaction');
|
|
231
236
|
}
|
|
237
|
+
if (p && p !== ctx.owner) {
|
|
238
|
+
throw new Error('Invalid retrieval of `TypeOrmDataSource.entityManager` from the wrong instance');
|
|
239
|
+
}
|
|
232
240
|
|
|
233
241
|
return ctx.entityManager;
|
|
234
242
|
}
|
|
235
243
|
|
|
236
|
-
static
|
|
244
|
+
static get entityManager() {
|
|
245
|
+
return TypeOrmDataSource.#getEntityManager(undefined);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
get entityManager() {
|
|
249
|
+
return TypeOrmDataSource.#getEntityManager(this.#provider);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
static async initializeDBOSSchema(config: PoolConfig): Promise<void> {
|
|
237
253
|
const ds = await TypeOrmTransactionHandler.createInstance(config, []);
|
|
238
254
|
try {
|
|
239
255
|
await ds.query(createTransactionCompletionSchemaPG);
|
|
@@ -256,14 +272,14 @@ export class TypeOrmDataSource implements DBOSDataSource<PGTransactionConfig> {
|
|
|
256
272
|
}
|
|
257
273
|
|
|
258
274
|
/**
|
|
259
|
-
* Run `
|
|
260
|
-
* @param
|
|
275
|
+
* Run `func` as a transaction against this DataSource
|
|
276
|
+
* @param func Function to run within a transactional context
|
|
261
277
|
* @param funcName Name to record for the transaction
|
|
262
278
|
* @param config Transaction configuration (isolation, etc)
|
|
263
|
-
* @returns Return value from `
|
|
279
|
+
* @returns Return value from `func`
|
|
264
280
|
*/
|
|
265
|
-
async runTransaction<T>(
|
|
266
|
-
return await runTransaction(
|
|
281
|
+
async runTransaction<T>(func: () => Promise<T>, config?: TypeORMTransactionConfig) {
|
|
282
|
+
return await runTransaction(func, config?.name ?? func.name, { dsName: this.name, config });
|
|
267
283
|
}
|
|
268
284
|
|
|
269
285
|
/**
|
|
@@ -277,16 +293,15 @@ export class TypeOrmDataSource implements DBOSDataSource<PGTransactionConfig> {
|
|
|
277
293
|
*/
|
|
278
294
|
registerTransaction<This, Args extends unknown[], Return>(
|
|
279
295
|
func: (this: This, ...args: Args) => Promise<Return>,
|
|
280
|
-
config?:
|
|
281
|
-
name?: string,
|
|
296
|
+
config?: TypeORMTransactionConfig,
|
|
282
297
|
): (this: This, ...args: Args) => Promise<Return> {
|
|
283
|
-
return registerTransaction(this.name, func, { name: name ?? func.name }, config);
|
|
298
|
+
return registerTransaction(this.name, func, { name: config?.name ?? func.name }, config);
|
|
284
299
|
}
|
|
285
300
|
|
|
286
301
|
/**
|
|
287
302
|
* Decorator establishing function as a transaction
|
|
288
303
|
*/
|
|
289
|
-
transaction(config?:
|
|
304
|
+
transaction(config?: TypeORMTransactionConfig) {
|
|
290
305
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
291
306
|
const ds = this;
|
|
292
307
|
return function decorator<This, Args extends unknown[], Return>(
|
|
@@ -298,7 +313,10 @@ export class TypeOrmDataSource implements DBOSDataSource<PGTransactionConfig> {
|
|
|
298
313
|
throw new Error('Use of decorator when original method is undefined');
|
|
299
314
|
}
|
|
300
315
|
|
|
301
|
-
descriptor.value = ds.registerTransaction(descriptor.value,
|
|
316
|
+
descriptor.value = ds.registerTransaction(descriptor.value, {
|
|
317
|
+
...config,
|
|
318
|
+
name: config?.name ?? String(propertyKey),
|
|
319
|
+
});
|
|
302
320
|
|
|
303
321
|
return descriptor;
|
|
304
322
|
};
|
package/package.json
CHANGED
package/tests/config.test.ts
CHANGED
|
@@ -17,7 +17,7 @@ describe('TypeOrmDataSource.configure', () => {
|
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
test('configure creates tx outputs table', async () => {
|
|
20
|
-
await TypeOrmDataSource.
|
|
20
|
+
await TypeOrmDataSource.initializeDBOSSchema(config);
|
|
21
21
|
|
|
22
22
|
const client = new Client(config);
|
|
23
23
|
try {
|
package/tests/datasource.test.ts
CHANGED
|
@@ -42,7 +42,7 @@ describe('TypeOrmDataSource', () => {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
await TypeOrmDataSource.
|
|
45
|
+
await TypeOrmDataSource.initializeDBOSSchema(config);
|
|
46
46
|
|
|
47
47
|
{
|
|
48
48
|
const ds = new DataSource({
|
|
@@ -356,7 +356,7 @@ async function errorFunction(user: string) {
|
|
|
356
356
|
}
|
|
357
357
|
|
|
358
358
|
async function readFunction(user: string) {
|
|
359
|
-
const result = await
|
|
359
|
+
const result = await dataSource.entityManager.findOneBy(Greeting, { name: user });
|
|
360
360
|
|
|
361
361
|
return { user, greet_count: result?.greet_count, now: Date.now() };
|
|
362
362
|
}
|
|
@@ -403,7 +403,7 @@ async function insertWorkflowReg(user: string) {
|
|
|
403
403
|
}
|
|
404
404
|
|
|
405
405
|
async function insertWorkflowRunTx(user: string) {
|
|
406
|
-
return await dataSource.runTransaction(() => insertFunction(user), 'insertFunction');
|
|
406
|
+
return await dataSource.runTransaction(() => insertFunction(user), { name: 'insertFunction' });
|
|
407
407
|
}
|
|
408
408
|
|
|
409
409
|
async function errorWorkflowReg(user: string) {
|
|
@@ -411,7 +411,7 @@ async function errorWorkflowReg(user: string) {
|
|
|
411
411
|
}
|
|
412
412
|
|
|
413
413
|
async function errorWorkflowRunTx(user: string) {
|
|
414
|
-
return await dataSource.runTransaction(() => errorFunction(user), 'errorFunction');
|
|
414
|
+
return await dataSource.runTransaction(() => errorFunction(user), { name: 'errorFunction' });
|
|
415
415
|
}
|
|
416
416
|
|
|
417
417
|
async function readWorkflowReg(user: string) {
|
|
@@ -419,7 +419,7 @@ async function readWorkflowReg(user: string) {
|
|
|
419
419
|
}
|
|
420
420
|
|
|
421
421
|
async function readWorkflowRunTx(user: string) {
|
|
422
|
-
return await dataSource.runTransaction(() => readFunction(user), 'readFunction',
|
|
422
|
+
return await dataSource.runTransaction(() => readFunction(user), { name: 'readFunction', readOnly: true });
|
|
423
423
|
}
|
|
424
424
|
|
|
425
425
|
async function staticWorkflow(user: string) {
|