@cardano-sdk/projection-typeorm 0.5.2 → 0.6.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/dist/cjs/TypeormStabilityWindowBuffer.d.ts +6 -7
- package/dist/cjs/TypeormStabilityWindowBuffer.d.ts.map +1 -1
- package/dist/cjs/TypeormStabilityWindowBuffer.js +40 -108
- package/dist/cjs/TypeormStabilityWindowBuffer.js.map +1 -1
- package/dist/cjs/createDataSource.d.ts +13 -0
- package/dist/cjs/createDataSource.d.ts.map +1 -1
- package/dist/cjs/createDataSource.js +53 -2
- package/dist/cjs/createDataSource.js.map +1 -1
- package/dist/cjs/createTypeormTipTracker.d.ts +16 -0
- package/dist/cjs/createTypeormTipTracker.d.ts.map +1 -0
- package/dist/cjs/createTypeormTipTracker.js +55 -0
- package/dist/cjs/createTypeormTipTracker.js.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/operators/withTypeormTransaction.d.ts +10 -11
- package/dist/cjs/operators/withTypeormTransaction.d.ts.map +1 -1
- package/dist/cjs/operators/withTypeormTransaction.js +4 -33
- package/dist/cjs/operators/withTypeormTransaction.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/TypeormStabilityWindowBuffer.d.ts +6 -7
- package/dist/esm/TypeormStabilityWindowBuffer.d.ts.map +1 -1
- package/dist/esm/TypeormStabilityWindowBuffer.js +41 -109
- package/dist/esm/TypeormStabilityWindowBuffer.js.map +1 -1
- package/dist/esm/createDataSource.d.ts +13 -0
- package/dist/esm/createDataSource.d.ts.map +1 -1
- package/dist/esm/createDataSource.js +49 -1
- package/dist/esm/createDataSource.js.map +1 -1
- package/dist/esm/createTypeormTipTracker.d.ts +16 -0
- package/dist/esm/createTypeormTipTracker.d.ts.map +1 -0
- package/dist/esm/createTypeormTipTracker.js +51 -0
- package/dist/esm/createTypeormTipTracker.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/operators/withTypeormTransaction.d.ts +10 -11
- package/dist/esm/operators/withTypeormTransaction.d.ts.map +1 -1
- package/dist/esm/operators/withTypeormTransaction.js +5 -34
- package/dist/esm/operators/withTypeormTransaction.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -5
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
import { Cardano } from '@cardano-sdk/core';
|
|
2
|
-
import { QueryRunner } from 'typeorm';
|
|
3
2
|
import { Observable } from 'rxjs';
|
|
4
3
|
import { ProjectionEvent, StabilityWindowBuffer } from '@cardano-sdk/projection';
|
|
4
|
+
import { ReconnectionConfig } from '@cardano-sdk/util-rxjs';
|
|
5
|
+
import { TypeormConnection } from './createDataSource';
|
|
5
6
|
import { WithLogger } from '@cardano-sdk/util';
|
|
6
7
|
import { WithTypeormContext } from './operators';
|
|
7
8
|
export interface TypeormStabilityWindowBufferProps extends WithLogger {
|
|
8
9
|
compactBufferEveryNBlocks?: number;
|
|
9
|
-
|
|
10
|
+
connection$: Observable<TypeormConnection>;
|
|
11
|
+
reconnectionConfig: ReconnectionConfig;
|
|
10
12
|
}
|
|
11
13
|
export declare class TypeormStabilityWindowBuffer implements StabilityWindowBuffer {
|
|
12
14
|
#private;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
constructor({ allowNonSequentialBlockHeights, compactBufferEveryNBlocks, logger }: TypeormStabilityWindowBufferProps);
|
|
15
|
+
constructor({ compactBufferEveryNBlocks, connection$, logger, reconnectionConfig }: TypeormStabilityWindowBufferProps);
|
|
16
|
+
getBlock(id: Cardano.BlockId): Observable<Cardano.Block | null>;
|
|
16
17
|
storeBlockData<T extends ProjectionEvent<WithTypeormContext>>(): (evt$: Observable<T>) => Observable<T>;
|
|
17
|
-
initialize(queryRunner: QueryRunner): Promise<void>;
|
|
18
|
-
shutdown(): void;
|
|
19
18
|
}
|
|
20
19
|
//# sourceMappingURL=TypeormStabilityWindowBuffer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypeormStabilityWindowBuffer.d.ts","sourceRoot":"","sources":["../../src/TypeormStabilityWindowBuffer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAsB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"TypeormStabilityWindowBuffer.d.ts","sourceRoot":"","sources":["../../src/TypeormStabilityWindowBuffer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAsB,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAyD,MAAM,MAAM,CAAC;AACzF,OAAO,EAAE,eAAe,EAAoB,qBAAqB,EAAmB,MAAM,yBAAyB,CAAC;AACpH,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,iCAAkC,SAAQ,UAAU;IAInE,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAInC,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAI3C,kBAAkB,EAAE,kBAAkB,CAAC;CACxC;AAED,qBAAa,4BAA6B,YAAW,qBAAqB;;gBAM5D,EACV,yBAA+B,EAC/B,WAAW,EACX,MAAM,EACN,kBAAkB,EACnB,EAAE,iCAAiC;IAUpC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAuB/D,cAAc,CAAC,CAAC,SAAS,eAAe,CAAC,kBAAkB,CAAC,YAC5C,WAAW,CAAC,CAAC;CAgD9B"}
|
|
@@ -9,69 +9,56 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _TypeormStabilityWindowBuffer_instances,
|
|
12
|
+
var _TypeormStabilityWindowBuffer_instances, _TypeormStabilityWindowBuffer_queryRunner$, _TypeormStabilityWindowBuffer_retryBackoffConfig, _TypeormStabilityWindowBuffer_logger, _TypeormStabilityWindowBuffer_compactEvery, _TypeormStabilityWindowBuffer_rollForward, _TypeormStabilityWindowBuffer_deleteOldBlockData;
|
|
13
13
|
import { BlockDataEntity } from './entity';
|
|
14
14
|
import { ChainSyncEventType } from '@cardano-sdk/core';
|
|
15
15
|
import { LessThan } from 'typeorm';
|
|
16
|
-
import {
|
|
16
|
+
import { catchError, concatMap, from, map, of, switchMap, take } from 'rxjs';
|
|
17
|
+
import { retryBackoff } from 'backoff-rxjs';
|
|
17
18
|
import { contextLogger } from '@cardano-sdk/util';
|
|
18
|
-
|
|
19
|
-
if (typeof point1 !== 'object') {
|
|
20
|
-
return point1 === point2;
|
|
21
|
-
}
|
|
22
|
-
if (typeof point2 !== 'object') {
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
return point1.header.hash === point2.header.hash;
|
|
26
|
-
};
|
|
27
|
-
const blockDataSelect = {
|
|
28
|
-
data: true
|
|
29
|
-
};
|
|
19
|
+
import { isRecoverableTypeormError } from './isRecoverableTypeormError';
|
|
30
20
|
export class TypeormStabilityWindowBuffer {
|
|
31
|
-
constructor({
|
|
21
|
+
constructor({ compactBufferEveryNBlocks = 100, connection$, logger, reconnectionConfig }) {
|
|
32
22
|
_TypeormStabilityWindowBuffer_instances.add(this);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
_TypeormStabilityWindowBuffer_tip$.set(this, new ReplaySubject(1));
|
|
36
|
-
_TypeormStabilityWindowBuffer_tail$.set(this, new ReplaySubject(1));
|
|
23
|
+
_TypeormStabilityWindowBuffer_queryRunner$.set(this, void 0);
|
|
24
|
+
_TypeormStabilityWindowBuffer_retryBackoffConfig.set(this, void 0);
|
|
37
25
|
_TypeormStabilityWindowBuffer_logger.set(this, void 0);
|
|
38
26
|
_TypeormStabilityWindowBuffer_compactEvery.set(this, void 0);
|
|
39
|
-
_TypeormStabilityWindowBuffer_allowNonSequentialBlockHeights.set(this, void 0);
|
|
40
27
|
__classPrivateFieldSet(this, _TypeormStabilityWindowBuffer_compactEvery, compactBufferEveryNBlocks, "f");
|
|
41
|
-
__classPrivateFieldSet(this, _TypeormStabilityWindowBuffer_allowNonSequentialBlockHeights, allowNonSequentialBlockHeights, "f");
|
|
42
28
|
__classPrivateFieldSet(this, _TypeormStabilityWindowBuffer_logger, contextLogger(logger, 'TypeormStabilityWindowBuffer'), "f");
|
|
43
|
-
this
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
29
|
+
__classPrivateFieldSet(this, _TypeormStabilityWindowBuffer_queryRunner$, connection$.pipe(map(({ queryRunner }) => queryRunner)), "f");
|
|
30
|
+
__classPrivateFieldSet(this, _TypeormStabilityWindowBuffer_retryBackoffConfig, {
|
|
31
|
+
...reconnectionConfig,
|
|
32
|
+
shouldRetry: isRecoverableTypeormError
|
|
33
|
+
}, "f");
|
|
48
34
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
35
|
+
getBlock(id) {
|
|
36
|
+
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_logger, "f").debug('getBlock', id);
|
|
37
|
+
return __classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_queryRunner$, "f").pipe(switchMap((queryRunner) => {
|
|
38
|
+
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_logger, "f").debug('getBlock query runner');
|
|
39
|
+
const repository = queryRunner.manager.getRepository(BlockDataEntity);
|
|
40
|
+
return from((async () => {
|
|
41
|
+
const blockDataEntity = await repository.findOne({ where: { block: { hash: id } } });
|
|
42
|
+
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_logger, "f").debug('getBlock found', blockDataEntity);
|
|
43
|
+
return blockDataEntity?.data || null;
|
|
44
|
+
})());
|
|
45
|
+
}), take(1), catchError((err) => {
|
|
46
|
+
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_logger, "f").error(err);
|
|
47
|
+
throw err;
|
|
48
|
+
}), retryBackoff(__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_retryBackoffConfig, "f")));
|
|
61
49
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
50
|
+
storeBlockData() {
|
|
51
|
+
return (evt$) => evt$.pipe(concatMap((evt) => {
|
|
52
|
+
if (evt.eventType === ChainSyncEventType.RollForward &&
|
|
53
|
+
evt.block.header.blockNo >= evt.tip.blockNo - evt.genesisParameters.securityParameter) {
|
|
54
|
+
return from(__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_instances, "m", _TypeormStabilityWindowBuffer_rollForward).call(this, evt)).pipe(map(() => evt));
|
|
55
|
+
}
|
|
56
|
+
return of(evt);
|
|
57
|
+
}));
|
|
65
58
|
}
|
|
66
59
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
order: { blockHeight: 'ASC' },
|
|
70
|
-
select: blockDataSelect,
|
|
71
|
-
take: 1
|
|
72
|
-
});
|
|
73
|
-
}, _TypeormStabilityWindowBuffer_rollForward = async function _TypeormStabilityWindowBuffer_rollForward(evt) {
|
|
74
|
-
const { eventType, transactionCommitted$, queryRunner, block } = evt;
|
|
60
|
+
_TypeormStabilityWindowBuffer_queryRunner$ = new WeakMap(), _TypeormStabilityWindowBuffer_retryBackoffConfig = new WeakMap(), _TypeormStabilityWindowBuffer_logger = new WeakMap(), _TypeormStabilityWindowBuffer_compactEvery = new WeakMap(), _TypeormStabilityWindowBuffer_instances = new WeakSet(), _TypeormStabilityWindowBuffer_rollForward = async function _TypeormStabilityWindowBuffer_rollForward(evt) {
|
|
61
|
+
const { eventType, queryRunner, block } = evt;
|
|
75
62
|
const { header: { blockNo } } = block;
|
|
76
63
|
const repository = queryRunner.manager.getRepository(BlockDataEntity);
|
|
77
64
|
if (eventType === ChainSyncEventType.RollForward) {
|
|
@@ -83,70 +70,15 @@ _TypeormStabilityWindowBuffer_tail = new WeakMap(), _TypeormStabilityWindowBuffe
|
|
|
83
70
|
data: block
|
|
84
71
|
});
|
|
85
72
|
await Promise.all([repository.insert(blockData), __classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_instances, "m", _TypeormStabilityWindowBuffer_deleteOldBlockData).call(this, evt)]);
|
|
86
|
-
transactionCommitted$.subscribe(() => {
|
|
87
|
-
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_instances, "m", _TypeormStabilityWindowBuffer_setTip).call(this, block);
|
|
88
|
-
if (__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_tail, "f") === 'origin') {
|
|
89
|
-
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_instances, "m", _TypeormStabilityWindowBuffer_setTail).call(this, block);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
73
|
}
|
|
93
|
-
},
|
|
94
|
-
|
|
95
|
-
const prevTip = await repository.findOne({
|
|
96
|
-
order: {
|
|
97
|
-
blockHeight: 'DESC'
|
|
98
|
-
},
|
|
99
|
-
select: blockDataSelect,
|
|
100
|
-
where: {
|
|
101
|
-
blockHeight: LessThan(blockNo)
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
if (!__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_allowNonSequentialBlockHeights, "f") && prevTip?.data && blockNo !== prevTip?.data.header.blockNo + 1) {
|
|
105
|
-
throw new Error('Assert: inconsistent PgStabilityWindowBuffer at rollBackward');
|
|
106
|
-
}
|
|
107
|
-
transactionCommitted$.subscribe(() => {
|
|
108
|
-
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_instances, "m", _TypeormStabilityWindowBuffer_setTip).call(this, prevTip?.data || 'origin');
|
|
109
|
-
if (!prevTip?.data) {
|
|
110
|
-
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_instances, "m", _TypeormStabilityWindowBuffer_setTail).call(this, 'origin');
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
}, _TypeormStabilityWindowBuffer_deleteOldBlockData = async function _TypeormStabilityWindowBuffer_deleteOldBlockData({ genesisParameters: { securityParameter }, block: { header: { blockNo } }, queryRunner, transactionCommitted$ }) {
|
|
114
|
-
if (blockNo < securityParameter || blockNo % __classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_compactEvery, "f") !== 0) {
|
|
74
|
+
}, _TypeormStabilityWindowBuffer_deleteOldBlockData = async function _TypeormStabilityWindowBuffer_deleteOldBlockData({ genesisParameters: { securityParameter }, block: { header: { blockNo } }, queryRunner }) {
|
|
75
|
+
if (blockNo % __classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_compactEvery, "f") !== 0) {
|
|
115
76
|
return;
|
|
116
77
|
}
|
|
117
78
|
const repository = queryRunner.manager.getRepository(BlockDataEntity);
|
|
118
79
|
const nextTailBlockHeight = blockNo - securityParameter;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
data: true
|
|
123
|
-
},
|
|
124
|
-
where: {
|
|
125
|
-
blockHeight: nextTailBlockHeight
|
|
126
|
-
}
|
|
127
|
-
}),
|
|
128
|
-
repository.delete({
|
|
129
|
-
blockHeight: LessThan(nextTailBlockHeight)
|
|
130
|
-
})
|
|
131
|
-
]);
|
|
132
|
-
if (!nextTailEntity) {
|
|
133
|
-
if (__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_allowNonSequentialBlockHeights, "f")) {
|
|
134
|
-
[nextTailEntity] = await __classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_instances, "m", _TypeormStabilityWindowBuffer_findTail).call(this, repository);
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
throw new Error('Assert: inconsistent PgStabilityWindowBuffer at #deleteOldBlockData');
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
transactionCommitted$.subscribe(() => __classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_instances, "m", _TypeormStabilityWindowBuffer_setTail).call(this, nextTailEntity.data));
|
|
141
|
-
}, _TypeormStabilityWindowBuffer_setTail = function _TypeormStabilityWindowBuffer_setTail(tail) {
|
|
142
|
-
if (!pointEquals(tail, __classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_tail, "f"))) {
|
|
143
|
-
__classPrivateFieldSet(this, _TypeormStabilityWindowBuffer_tail, tail, "f");
|
|
144
|
-
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_tail$, "f").next(tail);
|
|
145
|
-
}
|
|
146
|
-
}, _TypeormStabilityWindowBuffer_setTip = function _TypeormStabilityWindowBuffer_setTip(tip) {
|
|
147
|
-
if (!pointEquals(tip, __classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_tip, "f"))) {
|
|
148
|
-
__classPrivateFieldSet(this, _TypeormStabilityWindowBuffer_tip, tip, "f");
|
|
149
|
-
__classPrivateFieldGet(this, _TypeormStabilityWindowBuffer_tip$, "f").next(tip);
|
|
150
|
-
}
|
|
80
|
+
await repository.delete({
|
|
81
|
+
blockHeight: LessThan(nextTailBlockHeight)
|
|
82
|
+
});
|
|
151
83
|
};
|
|
152
84
|
//# sourceMappingURL=TypeormStabilityWindowBuffer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypeormStabilityWindowBuffer.js","sourceRoot":"","sources":["../../src/TypeormStabilityWindowBuffer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAW,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"TypeormStabilityWindowBuffer.js","sourceRoot":"","sources":["../../src/TypeormStabilityWindowBuffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import { DataSource, DataSourceOptions, QueryRunner } from 'typeorm';
|
|
3
3
|
import { Logger } from 'ts-log';
|
|
4
|
+
import { Observable } from 'rxjs';
|
|
5
|
+
import { PgBossExtension } from './pgBoss';
|
|
4
6
|
export interface DataSourceExtensions {
|
|
5
7
|
pgBoss?: boolean;
|
|
6
8
|
}
|
|
@@ -20,5 +22,16 @@ export interface CreateDataSourceProps {
|
|
|
20
22
|
}
|
|
21
23
|
export declare const pgBossSchemaExists: (queryRunner: QueryRunner) => Promise<boolean>;
|
|
22
24
|
export declare const createDataSource: ({ connectionConfig, devOptions, options, entities, extensions, logger }: CreateDataSourceProps) => DataSource;
|
|
25
|
+
export declare type CreateObservableDataSourceProps = Omit<CreateDataSourceProps, 'connectionConfig'> & {
|
|
26
|
+
connectionConfig$: Observable<PgConnectionConfig>;
|
|
27
|
+
};
|
|
28
|
+
export declare const createObservableDataSource: ({ connectionConfig$, ...rest }: CreateObservableDataSourceProps) => Observable<DataSource>;
|
|
29
|
+
export interface TypeormConnection {
|
|
30
|
+
queryRunner: QueryRunner;
|
|
31
|
+
pgBoss?: PgBossExtension;
|
|
32
|
+
}
|
|
33
|
+
export declare type ConnectProps = Pick<CreateObservableDataSourceProps, 'extensions' | 'logger'>;
|
|
34
|
+
export declare const connect: ({ logger, extensions }: ConnectProps) => (dataSource$: Observable<DataSource>) => Observable<TypeormConnection>;
|
|
35
|
+
export declare const createObservableConnection: (props: CreateObservableDataSourceProps) => Observable<TypeormConnection>;
|
|
23
36
|
export {};
|
|
24
37
|
//# sourceMappingURL=createDataSource.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createDataSource.d.ts","sourceRoot":"","sources":["../../src/createDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAkD,WAAW,EAAE,MAAM,SAAS,CAAC;AACrH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"createDataSource.d.ts","sourceRoot":"","sources":["../../src/createDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAkD,WAAW,EAAE,MAAM,SAAS,CAAC;AACrH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAS,UAAU,EAA2B,MAAM,MAAM,CAAC;AAClE,OAAO,EAAE,eAAe,EAAuC,MAAM,UAAU,CAAC;AAMhF,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,aAAK,yBAAyB,GAAG,iBAAiB,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1E,oBAAY,kBAAkB,GAAG,IAAI,CACnC,yBAAyB,EACzB,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAC/D,CAAC;AAEF,oBAAY,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC;AAE9F,oBAAY,cAAc,GAAG,IAAI,CAC/B,yBAAyB,EACvB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GACnB,OAAO,GACP,uBAAuB,GACvB,UAAU,GACV,OAAO,GACP,eAAe,GACf,YAAY,CACf,GAAG,EAAE,CAAC;AAEP,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,gBAAgB,EAAE,kBAAkB,CAAC;IACrC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB;AAoDD,eAAO,MAAM,kBAAkB,gBAAuB,WAAW,qBAKhE,CAAC;AA8BF,eAAO,MAAM,gBAAgB,4EAO1B,qBAAqB,eAuBvB,CAAC;AAEF,oBAAY,+BAA+B,GAAG,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,GAAG;IAC9F,iBAAiB,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,0BAA0B,mCAAoC,+BAA+B,2BAyBvG,CAAC;AAEJ,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAsBD,oBAAY,YAAY,GAAG,IAAI,CAAC,+BAA+B,EAAE,YAAY,GAAG,QAAQ,CAAC,CAAC;AAY1F,eAAO,MAAM,OAAO,2BACO,YAAY,mBACvB,WAAW,UAAU,CAAC,kCAOjC,CAAC;AAEN,eAAO,MAAM,0BAA0B,UAAW,+BAA+B,KAAG,WAAW,iBAAiB,CACxD,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import { DataSource, DefaultNamingStrategy } from 'typeorm';
|
|
3
|
+
import { NEVER, concat, from, switchMap } from 'rxjs';
|
|
4
|
+
import { createPgBoss, createPgBossExtension } from './pgBoss';
|
|
3
5
|
import { contextLogger, patchObject } from '@cardano-sdk/util';
|
|
4
|
-
import {
|
|
6
|
+
import { finalizeWithLatest } from '@cardano-sdk/util-rxjs';
|
|
5
7
|
import { typeormLogger } from './logger';
|
|
6
8
|
import snakeCase from 'lodash/snakeCase';
|
|
7
9
|
const toTableName = (tableOrName) => (typeof tableOrName === 'string' ? tableOrName : tableOrName.name).replace('_entity', '');
|
|
@@ -102,4 +104,50 @@ export const createDataSource = ({ connectionConfig, devOptions, options, entiti
|
|
|
102
104
|
}
|
|
103
105
|
});
|
|
104
106
|
};
|
|
107
|
+
export const createObservableDataSource = ({ connectionConfig$, ...rest }) => connectionConfig$.pipe(switchMap((connectionConfig) => concat(from((async () => {
|
|
108
|
+
const dataSource = createDataSource({
|
|
109
|
+
connectionConfig,
|
|
110
|
+
...rest
|
|
111
|
+
});
|
|
112
|
+
await dataSource.initialize();
|
|
113
|
+
return dataSource;
|
|
114
|
+
})()), NEVER).pipe(finalizeWithLatest(async (dataSource) => {
|
|
115
|
+
try {
|
|
116
|
+
await dataSource?.destroy();
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
rest.logger.error('Failed to destroy data source', error);
|
|
120
|
+
}
|
|
121
|
+
}))));
|
|
122
|
+
const releaseConnection = ({ logger }) => async (connection) => {
|
|
123
|
+
if (!connection)
|
|
124
|
+
return;
|
|
125
|
+
if (connection.queryRunner.isTransactionActive) {
|
|
126
|
+
try {
|
|
127
|
+
await connection.queryRunner.rollbackTransaction();
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
logger.warn('Failed to rollback transaction', error);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (!connection.queryRunner.isReleased) {
|
|
134
|
+
try {
|
|
135
|
+
await connection.queryRunner.release();
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
logger.warn('Failed to "release" query runner', error);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const createConnection = async (dataSource, { logger, extensions }) => {
|
|
143
|
+
const queryRunner = dataSource.createQueryRunner('master');
|
|
144
|
+
await queryRunner.connect();
|
|
145
|
+
if (extensions?.pgBoss) {
|
|
146
|
+
const pgBoss = createPgBossExtension(queryRunner, logger);
|
|
147
|
+
return { pgBoss, queryRunner };
|
|
148
|
+
}
|
|
149
|
+
return { queryRunner };
|
|
150
|
+
};
|
|
151
|
+
export const connect = ({ logger, extensions }) => (dataSource$) => dataSource$.pipe(switchMap((dataSource) => concat(from(createConnection(dataSource, { extensions, logger })), NEVER).pipe(finalizeWithLatest(releaseConnection({ logger })))));
|
|
152
|
+
export const createObservableConnection = (props) => createObservableDataSource(props).pipe(connect(props));
|
|
105
153
|
//# sourceMappingURL=createDataSource.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createDataSource.js","sourceRoot":"","sources":["../../src/createDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAqB,qBAAqB,EAAwC,MAAM,SAAS,CAAC;AAErH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"createDataSource.js","sourceRoot":"","sources":["../../src/createDataSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseProjectionEvent } from '@cardano-sdk/projection';
|
|
2
|
+
import { TipOrOrigin } from '@cardano-sdk/core';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import { ReconnectionConfig } from '@cardano-sdk/util-rxjs';
|
|
5
|
+
import { TypeormConnection } from './createDataSource';
|
|
6
|
+
export interface CreateTypeormTipTrackerProps {
|
|
7
|
+
connection$: Observable<TypeormConnection>;
|
|
8
|
+
reconnectionConfig: ReconnectionConfig;
|
|
9
|
+
}
|
|
10
|
+
export declare const createTypeormTipTracker: ({ connection$, reconnectionConfig }: CreateTypeormTipTrackerProps) => {
|
|
11
|
+
shutdown: () => void;
|
|
12
|
+
tip$: Observable<TipOrOrigin>;
|
|
13
|
+
trackProjectedTip: <T extends BaseProjectionEvent>() => (evt$: Observable<T>) => Observable<T>;
|
|
14
|
+
};
|
|
15
|
+
export declare type TypeormTipTracker = ReturnType<typeof createTypeormTipTracker>;
|
|
16
|
+
//# sourceMappingURL=createTypeormTipTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTypeormTipTracker.d.ts","sourceRoot":"","sources":["../../src/createTypeormTipTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAsB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAsD,MAAM,MAAM,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAI3C,kBAAkB,EAAE,kBAAkB,CAAC;CACxC;AAED,eAAO,MAAM,uBAAuB,wCAAyC,4BAA4B;;;;CA8DxG,CAAC;AAEF,oBAAY,iBAAiB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { BlockEntity } from './entity';
|
|
2
|
+
import { ChainSyncEventType } from '@cardano-sdk/core';
|
|
3
|
+
import { Observable, ReplaySubject, from, map, of, switchMap, take, tap } from 'rxjs';
|
|
4
|
+
import { retryBackoff } from 'backoff-rxjs';
|
|
5
|
+
import { isRecoverableTypeormError } from './isRecoverableTypeormError';
|
|
6
|
+
export const createTypeormTipTracker = ({ connection$, reconnectionConfig }) => {
|
|
7
|
+
const retryBackoffConfig = {
|
|
8
|
+
...reconnectionConfig,
|
|
9
|
+
shouldRetry: isRecoverableTypeormError
|
|
10
|
+
};
|
|
11
|
+
const queryLocalTip$ = connection$.pipe(switchMap(({ queryRunner }) => {
|
|
12
|
+
const blockRepo = queryRunner.manager.getRepository(BlockEntity);
|
|
13
|
+
return from((async () => {
|
|
14
|
+
const tipQueryResult = await blockRepo.find({
|
|
15
|
+
order: { slot: 'DESC' },
|
|
16
|
+
take: 1
|
|
17
|
+
});
|
|
18
|
+
if (tipQueryResult.length === 0) {
|
|
19
|
+
return 'origin';
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
blockNo: tipQueryResult[0].height,
|
|
23
|
+
hash: tipQueryResult[0].hash,
|
|
24
|
+
slot: tipQueryResult[0].slot
|
|
25
|
+
};
|
|
26
|
+
})());
|
|
27
|
+
}), take(1), retryBackoff(retryBackoffConfig));
|
|
28
|
+
const tip$ = new ReplaySubject(1);
|
|
29
|
+
const trackProjectedTip = () => (evt$) => evt$.pipe(switchMap((evt) => {
|
|
30
|
+
if (evt.eventType === ChainSyncEventType.RollForward) {
|
|
31
|
+
tip$.next(evt.block.header);
|
|
32
|
+
return of(evt);
|
|
33
|
+
}
|
|
34
|
+
return queryLocalTip$.pipe(tap((tip) => tip$.next(tip)), map(() => evt));
|
|
35
|
+
}));
|
|
36
|
+
return {
|
|
37
|
+
shutdown: tip$.complete.bind(tip$),
|
|
38
|
+
tip$: (() => {
|
|
39
|
+
let initialized = false;
|
|
40
|
+
return new Observable((subscriber) => {
|
|
41
|
+
if (!initialized) {
|
|
42
|
+
queryLocalTip$.subscribe((next) => tip$.next(next));
|
|
43
|
+
initialized = true;
|
|
44
|
+
}
|
|
45
|
+
return tip$.subscribe(subscriber);
|
|
46
|
+
});
|
|
47
|
+
})(),
|
|
48
|
+
trackProjectedTip
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=createTypeormTipTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTypeormTipTracker.js","sourceRoot":"","sources":["../../src/createTypeormTipTracker.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -5,5 +5,6 @@ export * from './entity';
|
|
|
5
5
|
export * from './operators';
|
|
6
6
|
export * from './TypeormStabilityWindowBuffer';
|
|
7
7
|
export * from './isRecoverableTypeormError';
|
|
8
|
+
export * from './createTypeormTipTracker';
|
|
8
9
|
export { STAKE_POOL_METADATA_QUEUE, STAKE_POOL_METRICS_UPDATE, StakePoolMetadataJob, StakePoolMetricsUpdateJob, createPgBoss, createPgBossExtension } from './pgBoss';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,YAAY,EACZ,qBAAqB,EACtB,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,YAAY,EACZ,qBAAqB,EACtB,MAAM,UAAU,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -5,5 +5,6 @@ export * from './entity';
|
|
|
5
5
|
export * from './operators';
|
|
6
6
|
export * from './TypeormStabilityWindowBuffer';
|
|
7
7
|
export * from './isRecoverableTypeormError';
|
|
8
|
+
export * from './createTypeormTipTracker';
|
|
8
9
|
export { STAKE_POOL_METADATA_QUEUE, STAKE_POOL_METRICS_UPDATE, createPgBoss, createPgBossExtension } from './pgBoss';
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EAGzB,YAAY,EACZ,qBAAqB,EACtB,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EAGzB,YAAY,EACZ,qBAAqB,EACtB,MAAM,UAAU,CAAC"}
|
|
@@ -1,25 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DataSourceExtensions } from '../createDataSource';
|
|
3
|
-
import { Observable, Subject } from 'rxjs';
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
4
2
|
import { PgBossExtension } from '../pgBoss';
|
|
5
3
|
import { ProjectionEvent, UnifiedExtChainSyncOperator } from '@cardano-sdk/projection';
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
import { QueryRunner } from 'typeorm';
|
|
5
|
+
import { TypeormConnection } from '../createDataSource';
|
|
6
|
+
export interface WithTypeormTransactionDependencies {
|
|
7
|
+
connection$: Observable<TypeormConnection>;
|
|
9
8
|
}
|
|
10
9
|
export interface WithTypeormContext {
|
|
11
10
|
queryRunner: QueryRunner;
|
|
12
|
-
transactionCommitted$: Subject<void>;
|
|
13
11
|
}
|
|
14
12
|
export interface WithPgBoss {
|
|
15
13
|
pgBoss: PgBossExtension;
|
|
16
14
|
}
|
|
17
15
|
declare type TypeormContextProp = keyof (WithTypeormContext & WithPgBoss);
|
|
18
|
-
export declare function withTypeormTransaction<Props>(dependencies: WithTypeormTransactionDependencies
|
|
19
|
-
|
|
16
|
+
export declare function withTypeormTransaction<Props>(dependencies: WithTypeormTransactionDependencies & {
|
|
17
|
+
pgBoss?: false;
|
|
18
|
+
}): UnifiedExtChainSyncOperator<Props, Props & WithTypeormContext>;
|
|
19
|
+
export declare function withTypeormTransaction<Props>(dependencies: WithTypeormTransactionDependencies & {
|
|
20
20
|
pgBoss: true;
|
|
21
21
|
}): UnifiedExtChainSyncOperator<Props, Props & WithTypeormContext & WithPgBoss>;
|
|
22
|
-
export declare
|
|
23
|
-
export declare const typeormTransactionCommit: <T extends WithTypeormContext>() => (evt$: Observable<ProjectionEvent<T>>) => Observable<ProjectionEvent<Omit<T, keyof WithTypeormContext | "pgBoss">>>;
|
|
22
|
+
export declare const typeormTransactionCommit: <T extends WithTypeormContext>() => (evt$: Observable<ProjectionEvent<T>>) => Observable<ProjectionEvent<Omit<T, "pgBoss" | "queryRunner">>>;
|
|
24
23
|
export {};
|
|
25
24
|
//# sourceMappingURL=withTypeormTransaction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withTypeormTransaction.d.ts","sourceRoot":"","sources":["../../../src/operators/withTypeormTransaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"withTypeormTransaction.d.ts","sourceRoot":"","sources":["../../../src/operators/withTypeormTransaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAuC,MAAM,MAAM,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EACL,eAAe,EAEf,2BAA2B,EAG5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,kCAAkC;IACjD,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,aAAK,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,GAAG,UAAU,CAAC,CAAC;AAGlE,wBAAgB,sBAAsB,CAAC,KAAK,EAC1C,YAAY,EAAE,kCAAkC,GAAG;IAAE,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,GACpE,2BAA2B,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB,CAAC,CAAC;AAElE,wBAAgB,sBAAsB,CAAC,KAAK,EAC1C,YAAY,EAAE,kCAAkC,GAAG;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,GAClE,2BAA2B,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB,GAAG,UAAU,CAAC,CAAC;AAkC/E,eAAO,MAAM,wBAAwB,8IAchC,CAAC"}
|
|
@@ -1,40 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createPgBossExtension } from '../pgBoss';
|
|
1
|
+
import { Subject, defer, from, map, mergeMap } from 'rxjs';
|
|
3
2
|
import { withEventContext, withStaticContext } from '@cardano-sdk/projection';
|
|
4
|
-
import { finalizeWithLatest } from '@cardano-sdk/util-rxjs';
|
|
5
3
|
import omit from 'lodash/omit';
|
|
6
|
-
const WithTypeormTransactionProps = ['queryRunner', '
|
|
7
|
-
export function withTypeormTransaction({
|
|
8
|
-
return (evt$) => evt$.pipe(withStaticContext(defer(() =>
|
|
9
|
-
const queryRunner = dataSource.createQueryRunner('master');
|
|
10
|
-
await queryRunner.connect();
|
|
11
|
-
if (extensions?.pgBoss) {
|
|
12
|
-
const pgBoss = createPgBossExtension(queryRunner, logger);
|
|
13
|
-
return { pgBoss, queryRunner };
|
|
14
|
-
}
|
|
15
|
-
return { queryRunner };
|
|
16
|
-
})()), NEVER).pipe(finalizeWithLatest(async (evt) => {
|
|
17
|
-
if (!evt)
|
|
18
|
-
return;
|
|
19
|
-
if (evt.queryRunner.isTransactionActive) {
|
|
20
|
-
try {
|
|
21
|
-
await evt.queryRunner.rollbackTransaction();
|
|
22
|
-
}
|
|
23
|
-
catch (error) {
|
|
24
|
-
logger.error('Failed to rollback transaction', error);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
if (!evt.queryRunner.isReleased) {
|
|
28
|
-
try {
|
|
29
|
-
await evt.queryRunner.release();
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
logger.error('Failed to "release" query runner', error);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
})))))), withEventContext(({ queryRunner }) => from(queryRunner.startTransaction('SERIALIZABLE').then(() => ({ transactionCommitted$: new Subject() })))));
|
|
4
|
+
const WithTypeormTransactionProps = ['queryRunner', 'pgBoss'];
|
|
5
|
+
export function withTypeormTransaction({ connection$ }) {
|
|
6
|
+
return (evt$) => evt$.pipe(withStaticContext(defer(() => connection$)), withEventContext(({ queryRunner }) => from(queryRunner.startTransaction('SERIALIZABLE').then(() => ({ transactionCommitted$: new Subject() })))));
|
|
36
7
|
}
|
|
37
|
-
export const typeormTransactionCommit = () => (evt$) => evt$.pipe(mergeMap((evt) => from(evt.queryRunner.commitTransaction()).pipe(
|
|
8
|
+
export const typeormTransactionCommit = () => (evt$) => evt$.pipe(mergeMap((evt) => from(evt.queryRunner.commitTransaction()).pipe(map(() => {
|
|
38
9
|
const result = omit(evt, WithTypeormTransactionProps);
|
|
39
10
|
return result;
|
|
40
11
|
}))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withTypeormTransaction.js","sourceRoot":"","sources":["../../../src/operators/withTypeormTransaction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"withTypeormTransaction.js","sourceRoot":"","sources":["../../../src/operators/withTypeormTransaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEvE,OAAO,EAIL,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,IAAI,MAAM,aAAa,CAAC;AAe/B,MAAM,2BAA2B,GAA8B,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAezF,MAAM,UAAU,sBAAsB,CAAQ,EAC5C,WAAW,EAC+C;IAK1D,OAAO,CAAC,IAA0C,EAAE,EAAE,CACpD,IAAI,CAAC,IAAI,CACP,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,EAC3C,gBAAgB,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CACnC,IAAI,CAMF,WAAW,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,qBAAqB,EAAE,IAAI,OAAO,EAAQ,EAAE,CAAC,CAAC,CAC1G,CACF,CACF,CAAC;AACN,CAAC;AAMD,MAAM,CAAC,MAAM,wBAAwB,GACnC,GAAiC,EAAE,CACnC,CAAC,IAAoC,EAA4D,EAAE,CACjG,IAAI,CAAC,IAAI,CACP,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAC5C,GAAG,CAAC,GAAG,EAAE;IAGP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC;IACtD,OAAO,MAAsD,CAAC;AAChE,CAAC,CAAC,CACH,CACF,CACF,CAAC"}
|