anote-server-libs 0.8.2 → 0.9.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/.vscode/settings.json +3 -0
- package/package.json +9 -9
- package/services/WithTransaction.js +13 -2
- package/services/WithTransaction.ts +16 -4
- package/services/utils.js +2 -2
- package/services/utils.ts +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "anote-server-libs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "Helpers for express-TS servers",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
@@ -17,19 +17,19 @@
|
|
|
17
17
|
"license": "MIT",
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@types/memcached": "2.2.10",
|
|
20
|
-
"@types/mssql": "9.1.
|
|
21
|
-
"@types/pg": "8.
|
|
20
|
+
"@types/mssql": "9.1.8",
|
|
21
|
+
"@types/pg": "8.15.6",
|
|
22
22
|
"ajv": "8.17.1",
|
|
23
23
|
"memcached": "2.2.2",
|
|
24
|
-
"mssql": "
|
|
25
|
-
"pg": "8.
|
|
24
|
+
"mssql": "12.1.1",
|
|
25
|
+
"pg": "8.16.3"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"express": "
|
|
29
|
-
"winston": "3.
|
|
28
|
+
"express": "5.1.0",
|
|
29
|
+
"winston": "3.18.3"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@types/express": "5.0.
|
|
33
|
-
"@types/node": "22.
|
|
32
|
+
"@types/express": "5.0.5",
|
|
33
|
+
"@types/node": "22.12.0",
|
|
34
34
|
"typescript": "5.7.3" }
|
|
35
35
|
}
|
|
@@ -32,8 +32,12 @@ function withTransaction(repo, logger, previousMethod, lock, commitIfLost = true
|
|
|
32
32
|
const dbClient = c1 || c2;
|
|
33
33
|
clearTimeout(connectTimeoutHandler);
|
|
34
34
|
utils_1.utils.logger = logger;
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
if (logger.level === 'debug') {
|
|
36
|
+
dbClient.removeAllListeners('query');
|
|
37
|
+
dbClient.on('query', (q) => logger.debug('SQL [Client %d] QUERY: %s', dbClient.processID, q.text));
|
|
38
|
+
}
|
|
39
|
+
dbClient.removeAllListeners('error');
|
|
40
|
+
dbClient.on('error', (err) => utils_1.utils.clientErrorHandler(err, dbClient));
|
|
37
41
|
res.locals.dbClient = dbClient;
|
|
38
42
|
res.locals.dbClientCommited = false;
|
|
39
43
|
res.locals.dbClientCommit = (cb) => {
|
|
@@ -57,6 +61,9 @@ function withTransaction(repo, logger, previousMethod, lock, commitIfLost = true
|
|
|
57
61
|
res.locals.dbClientOnCommit = [];
|
|
58
62
|
return (repo.db ? dbClient.query('BEGIN') : dbClient.begin()).then(() => {
|
|
59
63
|
const finish = () => {
|
|
64
|
+
res.send = () => {
|
|
65
|
+
throw new Error('res.send() should not be used within transactions. Use res.json() instead.');
|
|
66
|
+
};
|
|
60
67
|
res.json = (obj) => {
|
|
61
68
|
if (res.statusCode > 303 && res.statusCode !== 412) {
|
|
62
69
|
if (logger) {
|
|
@@ -134,8 +141,12 @@ function withTransaction(repo, logger, previousMethod, lock, commitIfLost = true
|
|
|
134
141
|
else {
|
|
135
142
|
finish();
|
|
136
143
|
}
|
|
144
|
+
}).catch((err) => {
|
|
145
|
+
dbClient.release();
|
|
146
|
+
throw err;
|
|
137
147
|
});
|
|
138
148
|
}).catch(err => {
|
|
149
|
+
clearTimeout(connectTimeoutHandler);
|
|
139
150
|
res.status(500).json({
|
|
140
151
|
error: {
|
|
141
152
|
errorKey: 'internal.db',
|
|
@@ -38,8 +38,12 @@ export function withTransaction(repo: BaseModelRepository, logger: Logger, previ
|
|
|
38
38
|
clearTimeout(connectTimeoutHandler);
|
|
39
39
|
// On error, will rollback...
|
|
40
40
|
utils.logger = logger;
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
if(logger.level === 'debug') {
|
|
42
|
+
dbClient.removeAllListeners('query');
|
|
43
|
+
dbClient.on('query', (q: any) => logger.debug('SQL [Client %d] QUERY: %s', dbClient.processID, q.text));
|
|
44
|
+
}
|
|
45
|
+
dbClient.removeAllListeners('error');
|
|
46
|
+
dbClient.on('error', (err: any) => utils.clientErrorHandler(err, dbClient));
|
|
43
47
|
|
|
44
48
|
res.locals.dbClient = dbClient;
|
|
45
49
|
res.locals.dbClientCommited = false;
|
|
@@ -62,6 +66,9 @@ export function withTransaction(repo: BaseModelRepository, logger: Logger, previ
|
|
|
62
66
|
res.locals.dbClientOnCommit = [];
|
|
63
67
|
return (repo.db ? dbClient.query('BEGIN') : dbClient.begin()).then(() => {
|
|
64
68
|
const finish = () => {
|
|
69
|
+
res.send = () => {
|
|
70
|
+
throw new Error('res.send() should not be used within transactions. Use res.json() instead.');
|
|
71
|
+
};
|
|
65
72
|
res.json = (obj: any) => {
|
|
66
73
|
if(res.statusCode > 303 && res.statusCode !== 412) {
|
|
67
74
|
if(logger) {
|
|
@@ -125,14 +132,19 @@ export function withTransaction(repo: BaseModelRepository, logger: Logger, previ
|
|
|
125
132
|
additionalInfo: {message: err.message}
|
|
126
133
|
}
|
|
127
134
|
});
|
|
128
|
-
dbClient.release();
|
|
135
|
+
dbClient.release(); // Lock acquisition failed, release will also rollback
|
|
129
136
|
});
|
|
130
137
|
} else {
|
|
131
138
|
finish();
|
|
132
139
|
}
|
|
140
|
+
}).catch((err: any) => {
|
|
141
|
+
// Error beginning transaction
|
|
142
|
+
dbClient.release();
|
|
143
|
+
throw err;
|
|
133
144
|
});
|
|
134
145
|
}).catch(err => {
|
|
135
|
-
// Error connecting to database
|
|
146
|
+
// Error connecting to database for other reason than timeout or beginning transaction
|
|
147
|
+
clearTimeout(connectTimeoutHandler);
|
|
136
148
|
res.status(500).json({
|
|
137
149
|
error: {
|
|
138
150
|
errorKey: 'internal.db',
|
package/services/utils.js
CHANGED
|
@@ -17,8 +17,8 @@ function atob(str) {
|
|
|
17
17
|
function btoa(str) {
|
|
18
18
|
return Buffer.from(str).toString('base64');
|
|
19
19
|
}
|
|
20
|
-
function clientErrorHandle(err) {
|
|
21
|
-
this.error('
|
|
20
|
+
function clientErrorHandle(err, dbClient) {
|
|
21
|
+
this.error('SQL [Client %d] ERROR: %j', dbClient.processID, err);
|
|
22
22
|
}
|
|
23
23
|
exports.utils = {
|
|
24
24
|
clientErrorHandler: undefined
|
package/services/utils.ts
CHANGED
|
@@ -10,8 +10,8 @@ export function btoa(str: string): string {
|
|
|
10
10
|
return Buffer.from(str).toString('base64');
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export function clientErrorHandle(this: Logger, err: any) {
|
|
14
|
-
this.error('
|
|
13
|
+
export function clientErrorHandle(this: Logger, err: any, dbClient: any) {
|
|
14
|
+
this.error('SQL [Client %d] ERROR: %j', dbClient.processID, err);
|
|
15
15
|
}
|
|
16
16
|
export const utils: {[id: string]: any} = {
|
|
17
17
|
clientErrorHandler: undefined
|