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.
@@ -0,0 +1,3 @@
1
+ {
2
+ "typescript.tsdk": "node_modules\\typescript\\lib"
3
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "anote-server-libs",
3
- "version": "0.8.2",
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.6",
21
- "@types/pg": "8.11.10",
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": "11.0.1",
25
- "pg": "8.13.1"
24
+ "mssql": "12.1.1",
25
+ "pg": "8.16.3"
26
26
  },
27
27
  "peerDependencies": {
28
- "express": "4.21.2",
29
- "winston": "3.17.0"
28
+ "express": "5.1.0",
29
+ "winston": "3.18.3"
30
30
  },
31
31
  "devDependencies": {
32
- "@types/express": "5.0.0",
33
- "@types/node": "22.10.7",
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
- dbClient.removeListener('error', utils_1.utils.clientErrorHandler);
36
- dbClient.on('error', utils_1.utils.clientErrorHandler);
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
- dbClient.removeListener('error', utils.clientErrorHandler);
42
- dbClient.on('error', utils.clientErrorHandler);
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 or acquiring transaction, restarting worker after the timeout as well...
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('Error on DB client: %j', err);
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('Error on DB client: %j', err);
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