@rsdk/db.typeorm 4.0.1-next.1 → 4.0.1-next.2
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/CHANGELOG.md +6 -0
- package/dist/internal/context.js +16 -0
- package/dist/internal/context.js.map +1 -1
- package/dist/internal/test/concurrency.test.e2e.d.ts +5 -0
- package/dist/internal/test/concurrency.test.e2e.js +83 -0
- package/dist/internal/test/concurrency.test.e2e.js.map +1 -0
- package/jest.config.e2e.js +4 -1
- package/jest.config.js +4 -1
- package/package.json +11 -8
- package/src/internal/context.ts +2 -0
- package/src/internal/test/concurrency.test.e2e.ts +77 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [4.0.1-next.2](https://github.com/R-Vision/rsdk/compare/v4.0.1-next.1...v4.0.1-next.2) (2023-12-07)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **db:** added queued initialization db context ([#169](https://github.com/R-Vision/rsdk/issues/169)) ([ea481ed](https://github.com/R-Vision/rsdk/commit/ea481edce9bbc7bd702fc046a37fb5a5580a88dd))
|
|
11
|
+
|
|
6
12
|
## [4.0.1-next.1](https://github.com/R-Vision/rsdk/compare/v4.0.0...v4.0.1-next.1) (2023-12-06)
|
|
7
13
|
|
|
8
14
|
**Note:** Version bump only for package @rsdk/db.typeorm
|
package/dist/internal/context.js
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.TypeOrmContext = void 0;
|
|
13
|
+
const common_node_1 = require("@rsdk/common.node");
|
|
4
14
|
const db_1 = require("@rsdk/db");
|
|
5
15
|
const types_1 = require("../types");
|
|
6
16
|
const exceptions_1 = require("./exceptions");
|
|
@@ -120,4 +130,10 @@ class TypeOrmContext extends db_1.BaseContext {
|
|
|
120
130
|
}
|
|
121
131
|
}
|
|
122
132
|
exports.TypeOrmContext = TypeOrmContext;
|
|
133
|
+
__decorate([
|
|
134
|
+
(0, common_node_1.Concurrency)(),
|
|
135
|
+
__metadata("design:type", Function),
|
|
136
|
+
__metadata("design:paramtypes", []),
|
|
137
|
+
__metadata("design:returntype", Promise)
|
|
138
|
+
], TypeOrmContext.prototype, "initialize", null);
|
|
123
139
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.pingDatabase = exports.createSecondCat = exports.createCat = exports.fetchCats = void 0;
|
|
27
|
+
/* eslint-disable unicorn/consistent-function-scoping,unicorn/catch-error-name */
|
|
28
|
+
const db_1 = require("@rsdk/db");
|
|
29
|
+
const process = __importStar(require("node:process"));
|
|
30
|
+
const pg_1 = require("pg");
|
|
31
|
+
const typeorm_1 = require("typeorm");
|
|
32
|
+
const initializer_1 = require("../initializer");
|
|
33
|
+
const strategy_1 = require("../strategy");
|
|
34
|
+
const util_1 = require("./util");
|
|
35
|
+
const fetchCats = async () => dataSource.manager.find(util_1.Cat);
|
|
36
|
+
exports.fetchCats = fetchCats;
|
|
37
|
+
const createCat = async () => dataSource.manager.getRepository(util_1.Cat).save(util_1.cat);
|
|
38
|
+
exports.createCat = createCat;
|
|
39
|
+
const createSecondCat = async () => {
|
|
40
|
+
const catRepo = dataSource.manager.getRepository(util_1.Cat);
|
|
41
|
+
return await catRepo.save(catRepo.create(util_1.secondCat));
|
|
42
|
+
};
|
|
43
|
+
exports.createSecondCat = createSecondCat;
|
|
44
|
+
const runner = new db_1.TransactionRunner(new strategy_1.TypeOrmTransactionalStrategy());
|
|
45
|
+
let dataSource;
|
|
46
|
+
const pingDatabase = async () => await dataSource.query('select 1 + 1');
|
|
47
|
+
exports.pingDatabase = pingDatabase;
|
|
48
|
+
const schemaName = `typeorm`;
|
|
49
|
+
const setupSchema = async () => {
|
|
50
|
+
const dbUrl = process.env.DB_URL;
|
|
51
|
+
const client = new pg_1.Client(dbUrl);
|
|
52
|
+
await client.connect();
|
|
53
|
+
await client.query(`CREATE SCHEMA IF NOT EXISTS ${schemaName}`);
|
|
54
|
+
await client.end();
|
|
55
|
+
};
|
|
56
|
+
beforeAll(setupSchema);
|
|
57
|
+
beforeAll(async () => {
|
|
58
|
+
initializer_1.Initializer.initialize();
|
|
59
|
+
dataSource = new typeorm_1.DataSource({
|
|
60
|
+
url: process.env.DB_URL,
|
|
61
|
+
type: process.env.DB_TYPE ?? 'postgres',
|
|
62
|
+
entities: [util_1.Cat, util_1.Account],
|
|
63
|
+
schema: schemaName,
|
|
64
|
+
logging: process.env.DB_LOGGING,
|
|
65
|
+
});
|
|
66
|
+
await dataSource.initialize();
|
|
67
|
+
});
|
|
68
|
+
beforeEach(async () => {
|
|
69
|
+
await dataSource.synchronize(true);
|
|
70
|
+
});
|
|
71
|
+
afterAll(async () => {
|
|
72
|
+
await dataSource.destroy();
|
|
73
|
+
});
|
|
74
|
+
it('correct run transaction', async () => {
|
|
75
|
+
const testedFunc = async () => {
|
|
76
|
+
(0, util_1.contextTransactionMustNotInitialized)();
|
|
77
|
+
const r = await Promise.all([(0, exports.fetchCats)(), (0, exports.fetchCats)()]);
|
|
78
|
+
expect(r).toEqual([[], []]);
|
|
79
|
+
(0, util_1.contextTransactionMustBeInitialized)();
|
|
80
|
+
};
|
|
81
|
+
await runner.transactional(testedFunc);
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=concurrency.test.e2e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.test.e2e.js","sourceRoot":"","sources":["../../../src/internal/test/concurrency.test.e2e.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iFAAiF;AACjF,iCAA6C;AAC7C,sDAAwC;AACxC,2BAA4B;AAC5B,qCAAqC;AAErC,gDAA6C;AAC7C,0CAA2D;AAE3D,iCAOgB;AAET,MAAM,SAAS,GAAG,KAAK,IAAoB,EAAE,CAClD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAG,CAAC,CAAC;AADlB,QAAA,SAAS,aACS;AACxB,MAAM,SAAS,GAAG,KAAK,IAAkB,EAAE,CAChD,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,UAAG,CAAC,CAAC,IAAI,CAAC,UAAG,CAAC,CAAC;AADrC,QAAA,SAAS,aAC4B;AAC3C,MAAM,eAAe,GAAG,KAAK,IAAkB,EAAE;IACtD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,UAAG,CAAC,CAAC;IAEtD,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC;AAJW,QAAA,eAAe,mBAI1B;AAEF,MAAM,MAAM,GAAG,IAAI,sBAAiB,CAAC,IAAI,uCAA4B,EAAE,CAAC,CAAC;AACzE,IAAI,UAAsB,CAAC;AAEpB,MAAM,YAAY,GAAG,KAAK,IAAmB,EAAE,CACpD,MAAM,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AAD5B,QAAA,YAAY,gBACgB;AAEzC,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IAC5C,MAAM,KAAK,GAAW,OAAO,CAAC,GAAG,CAAC,MAAgB,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,WAAM,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,MAAM,MAAM,CAAC,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;IAChE,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;AACrB,CAAC,CAAC;AAEF,SAAS,CAAC,WAAW,CAAC,CAAC;AAEvB,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,yBAAW,CAAC,UAAU,EAAE,CAAC;IACzB,UAAU,GAAG,IAAI,oBAAU,CAAC;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,MAAgB;QACjC,IAAI,EAAG,OAAO,CAAC,GAAG,CAAC,OAAsB,IAAI,UAAU;QACvD,QAAQ,EAAE,CAAC,UAAG,EAAE,cAAO,CAAC;QACxB,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAmB;KACzC,CAAC,CAAC;IACH,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;IACvC,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;QAC3C,IAAA,2CAAoC,GAAE,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAA,iBAAS,GAAE,EAAE,IAAA,iBAAS,GAAE,CAAC,CAAC,CAAC;QAExD,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAA,0CAAmC,GAAE,CAAC;IACxC,CAAC,CAAC;IAEF,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC"}
|
package/jest.config.e2e.js
CHANGED
package/jest.config.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/db.typeorm",
|
|
3
|
-
"version": "4.0.1-next.
|
|
3
|
+
"version": "4.0.1-next.2",
|
|
4
4
|
"description": "TypeOrm module for platform",
|
|
5
5
|
"license": "Apache License 2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -13,19 +13,22 @@
|
|
|
13
13
|
"scripts": {
|
|
14
14
|
"prepublishOnly": "npm run build"
|
|
15
15
|
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@rsdk/common.node": "^4.0.1-next.2"
|
|
18
|
+
},
|
|
16
19
|
"peerDependencies": {
|
|
17
20
|
"@nestjs/common": "^10.0.0",
|
|
18
21
|
"@nestjs/core": "^10.0.0",
|
|
19
22
|
"@nestjs/typeorm": "^10.0.0",
|
|
20
|
-
"@rsdk/common": "^4.0.1-next.
|
|
21
|
-
"@rsdk/common.nestjs": "^4.0.1-next.
|
|
22
|
-
"@rsdk/core": "^4.0.1-next.
|
|
23
|
-
"@rsdk/db": "^4.0.1-next.
|
|
24
|
-
"@rsdk/logging": "^4.0.1-next.
|
|
25
|
-
"@rsdk/nest-tools": "^4.0.1-next.
|
|
23
|
+
"@rsdk/common": "^4.0.1-next.2",
|
|
24
|
+
"@rsdk/common.nestjs": "^4.0.1-next.2",
|
|
25
|
+
"@rsdk/core": "^4.0.1-next.2",
|
|
26
|
+
"@rsdk/db": "^4.0.1-next.2",
|
|
27
|
+
"@rsdk/logging": "^4.0.1-next.2",
|
|
28
|
+
"@rsdk/nest-tools": "^4.0.1-next.2",
|
|
26
29
|
"reflect-metadata": "^0.1.13",
|
|
27
30
|
"rxjs": "^7.0.0",
|
|
28
31
|
"typeorm": "^0.3.12"
|
|
29
32
|
},
|
|
30
|
-
"gitHead": "
|
|
33
|
+
"gitHead": "f48f893ffc6bccdfd5a0b703cc377a3a770581ff"
|
|
31
34
|
}
|
package/src/internal/context.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Concurrency } from '@rsdk/common.node';
|
|
1
2
|
import { BaseContext } from '@rsdk/db';
|
|
2
3
|
import type { QueryRunner } from 'typeorm';
|
|
3
4
|
|
|
@@ -86,6 +87,7 @@ export class TypeOrmContext extends BaseContext<IsolationLevel> {
|
|
|
86
87
|
this._queryRunner = queryRunner;
|
|
87
88
|
}
|
|
88
89
|
|
|
90
|
+
@Concurrency()
|
|
89
91
|
async initialize(): Promise<void> {
|
|
90
92
|
if (this.suspended) {
|
|
91
93
|
return;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* eslint-disable unicorn/consistent-function-scoping,unicorn/catch-error-name */
|
|
2
|
+
import { TransactionRunner } from '@rsdk/db';
|
|
3
|
+
import * as process from 'node:process';
|
|
4
|
+
import { Client } from 'pg';
|
|
5
|
+
import { DataSource } from 'typeorm';
|
|
6
|
+
|
|
7
|
+
import { Initializer } from '../initializer';
|
|
8
|
+
import { TypeOrmTransactionalStrategy } from '../strategy';
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
Account,
|
|
12
|
+
Cat,
|
|
13
|
+
cat,
|
|
14
|
+
contextTransactionMustBeInitialized,
|
|
15
|
+
contextTransactionMustNotInitialized,
|
|
16
|
+
secondCat,
|
|
17
|
+
} from './util';
|
|
18
|
+
|
|
19
|
+
export const fetchCats = async (): Promise<Cat[]> =>
|
|
20
|
+
dataSource.manager.find(Cat);
|
|
21
|
+
export const createCat = async (): Promise<Cat> =>
|
|
22
|
+
dataSource.manager.getRepository(Cat).save(cat);
|
|
23
|
+
export const createSecondCat = async (): Promise<Cat> => {
|
|
24
|
+
const catRepo = dataSource.manager.getRepository(Cat);
|
|
25
|
+
|
|
26
|
+
return await catRepo.save(catRepo.create(secondCat));
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const runner = new TransactionRunner(new TypeOrmTransactionalStrategy());
|
|
30
|
+
let dataSource: DataSource;
|
|
31
|
+
|
|
32
|
+
export const pingDatabase = async (): Promise<void> =>
|
|
33
|
+
await dataSource.query('select 1 + 1');
|
|
34
|
+
|
|
35
|
+
const schemaName = `typeorm`;
|
|
36
|
+
const setupSchema = async (): Promise<void> => {
|
|
37
|
+
const dbUrl: string = process.env.DB_URL as string;
|
|
38
|
+
const client = new Client(dbUrl);
|
|
39
|
+
|
|
40
|
+
await client.connect();
|
|
41
|
+
await client.query(`CREATE SCHEMA IF NOT EXISTS ${schemaName}`);
|
|
42
|
+
await client.end();
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
beforeAll(setupSchema);
|
|
46
|
+
|
|
47
|
+
beforeAll(async () => {
|
|
48
|
+
Initializer.initialize();
|
|
49
|
+
dataSource = new DataSource({
|
|
50
|
+
url: process.env.DB_URL as string,
|
|
51
|
+
type: (process.env.DB_TYPE as 'postgres') ?? 'postgres',
|
|
52
|
+
entities: [Cat, Account],
|
|
53
|
+
schema: schemaName,
|
|
54
|
+
logging: process.env.DB_LOGGING as 'all',
|
|
55
|
+
});
|
|
56
|
+
await dataSource.initialize();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
beforeEach(async () => {
|
|
60
|
+
await dataSource.synchronize(true);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
afterAll(async () => {
|
|
64
|
+
await dataSource.destroy();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('correct run transaction', async () => {
|
|
68
|
+
const testedFunc = async (): Promise<void> => {
|
|
69
|
+
contextTransactionMustNotInitialized();
|
|
70
|
+
const r = await Promise.all([fetchCats(), fetchCats()]);
|
|
71
|
+
|
|
72
|
+
expect(r).toEqual([[], []]);
|
|
73
|
+
contextTransactionMustBeInitialized();
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
await runner.transactional(testedFunc);
|
|
77
|
+
});
|