@sera4/essentia 3.0.11 → 3.0.13-rc.1
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/cache/index.d.ts +22 -0
- package/dist/cache/index.js +166 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/constants/index.d.ts +6 -0
- package/dist/constants/index.js +9 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/formatter/index.d.ts +37 -0
- package/dist/formatter/index.js +75 -0
- package/dist/formatter/index.js.map +1 -0
- package/dist/hal/index.d.ts +5 -0
- package/dist/hal/index.js +69 -0
- package/dist/hal/index.js.map +1 -0
- package/dist/health/health-logger.d.ts +9 -0
- package/dist/health/health-logger.js +34 -0
- package/dist/health/health-logger.js.map +1 -0
- package/dist/health/index.d.ts +19 -0
- package/dist/health/index.js +175 -0
- package/dist/health/index.js.map +1 -0
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.js +2 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/test-server-wrapper.d.ts +120 -0
- package/dist/helpers/test-server-wrapper.js +165 -0
- package/dist/helpers/test-server-wrapper.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/last-commit.d.ts +1 -0
- package/dist/last-commit.js.map +1 -0
- package/dist/last_commit/index.d.ts +7 -0
- package/dist/last_commit/index.js +83 -0
- package/dist/last_commit/index.js.map +1 -0
- package/dist/paginator/s4-pagination.d.ts +9 -0
- package/dist/paginator/s4-pagination.js +49 -0
- package/dist/paginator/s4-pagination.js.map +1 -0
- package/dist/paginator/sql-pagination.d.ts +27 -0
- package/dist/paginator/sql-pagination.js +166 -0
- package/dist/paginator/sql-pagination.js.map +1 -0
- package/dist/paper-trail/helpers.d.ts +11 -0
- package/dist/paper-trail/helpers.js +74 -0
- package/dist/paper-trail/helpers.js.map +1 -0
- package/dist/paper-trail/index.d.ts +13 -0
- package/dist/paper-trail/index.js +662 -0
- package/dist/paper-trail/index.js.map +1 -0
- package/dist/prompts/index.d.ts +14 -0
- package/dist/prompts/index.js +63 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/queue/index.d.ts +166 -0
- package/dist/queue/index.js +371 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/publisher.d.ts +31 -0
- package/dist/queue/publisher.js +84 -0
- package/dist/queue/publisher.js.map +1 -0
- package/dist/queue/queue-logger.d.ts +9 -0
- package/dist/queue/queue-logger.js +35 -0
- package/dist/queue/queue-logger.js.map +1 -0
- package/dist/queue/subscriber.d.ts +39 -0
- package/dist/queue/subscriber.js +97 -0
- package/dist/queue/subscriber.js.map +1 -0
- package/dist/safe_proxy/index.d.ts +13 -0
- package/dist/safe_proxy/index.js +54 -0
- package/dist/safe_proxy/index.js.map +1 -0
- package/dist/serializer/index.d.ts +5 -0
- package/dist/serializer/index.js +83 -0
- package/dist/serializer/index.js.map +1 -0
- package/dist/ts/logger/s4-logger.js +2 -0
- package/dist/ts/logger/s4-logger.js.map +1 -1
- package/dist/ts/queue/index.js +54 -65
- package/dist/ts/queue/index.js.map +1 -1
- package/dist/ts/task-scheduler/index.d.ts +130 -0
- package/dist/ts/task-scheduler/index.js +259 -0
- package/dist/ts/task-scheduler/index.js.map +1 -0
- package/package.json +9 -3
- package/scripts/publish.sh +46 -0
- package/package.tar.gz +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export default function _default(config: any, servicePrefix: any): Cache;
|
|
2
|
+
declare class Cache {
|
|
3
|
+
constructor(config: any, servicePrefix: any);
|
|
4
|
+
redisClient: any;
|
|
5
|
+
servicePrefix: any;
|
|
6
|
+
ping(): any;
|
|
7
|
+
properKey(key: any, path: any): any;
|
|
8
|
+
writeHash(path: any, key: any, value: any): any;
|
|
9
|
+
writeHashBlocking(path: any, key: any, value: any): any;
|
|
10
|
+
writeMultiHash(path: any, j: any): any;
|
|
11
|
+
readHashKey(obj: any, key: any, autoConvert?: boolean): Promise<any>;
|
|
12
|
+
readHash(path: any): Promise<any>;
|
|
13
|
+
deleteHashKey(hash: any, key: any): Promise<any>;
|
|
14
|
+
get(key: any): any;
|
|
15
|
+
getAsync(key: any): any;
|
|
16
|
+
writeKey(key: any, value: any, expiry: any): any;
|
|
17
|
+
deleteKey(key: any): any;
|
|
18
|
+
expire(path: any, expiry: any): any;
|
|
19
|
+
exists(path: any): any;
|
|
20
|
+
deleteAllKeys(): Promise<any>;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
const isEmpty = obj => [Object, Array].includes((obj || {}).constructor) && !Object.entries((obj || {})).length;
|
|
4
|
+
class CacheConfigError extends Error {
|
|
5
|
+
constructor(m) {
|
|
6
|
+
super(m);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/* Redis cache helper
|
|
10
|
+
* Example use: Place the following code in your project to setup redis use
|
|
11
|
+
*
|
|
12
|
+
* import { cache } from "@sera4/essentia";
|
|
13
|
+
* const cacheHelper = cache({ password: .., database: .., host: .., port: .. }, "service:"));
|
|
14
|
+
*
|
|
15
|
+
*/
|
|
16
|
+
const convertRedisKeyValueToJson = (v) => {
|
|
17
|
+
return (v && v.length > 0 && v[0] !== null) ? JSON.parse(v) : null;
|
|
18
|
+
};
|
|
19
|
+
const convertRedisHashToJson = (v) => {
|
|
20
|
+
if (v) {
|
|
21
|
+
var result = {};
|
|
22
|
+
for (var k in v) {
|
|
23
|
+
if (v.hasOwnProperty(k)) {
|
|
24
|
+
result[k] = JSON.parse(v[k]);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
function convertJsonToRedisValue(j) {
|
|
34
|
+
var result = {};
|
|
35
|
+
for (var key in j) {
|
|
36
|
+
if (j.hasOwnProperty(key)) {
|
|
37
|
+
result[key] = JSON.stringify(j[key]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
class Cache {
|
|
43
|
+
constructor(config, servicePrefix) {
|
|
44
|
+
if ((config == undefined) || isEmpty(config)) {
|
|
45
|
+
throw new CacheConfigError("Invalid cache configuration");
|
|
46
|
+
}
|
|
47
|
+
if (servicePrefix == null) {
|
|
48
|
+
throw new CacheConfigError("Invalid service prefix");
|
|
49
|
+
}
|
|
50
|
+
if (config.fake) {
|
|
51
|
+
// used in testing
|
|
52
|
+
this.redisClient = require("fakeredis").createClient("fake backend");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.redisClient = require("redis").createClient(config);
|
|
56
|
+
}
|
|
57
|
+
this.redisClient.on("error", (err) => {
|
|
58
|
+
logger.error("Cache/Redis error: ", err);
|
|
59
|
+
});
|
|
60
|
+
this.servicePrefix = servicePrefix;
|
|
61
|
+
}
|
|
62
|
+
ping() {
|
|
63
|
+
return this.redisClient.ping();
|
|
64
|
+
}
|
|
65
|
+
properKey(key, path) {
|
|
66
|
+
let p = this.servicePrefix + key;
|
|
67
|
+
if (path)
|
|
68
|
+
p += path;
|
|
69
|
+
return p;
|
|
70
|
+
}
|
|
71
|
+
writeHash(path, key, value) {
|
|
72
|
+
return this.redisClient.hsetAsync(properKey(key), key, value);
|
|
73
|
+
}
|
|
74
|
+
writeHashBlocking(path, key, value) {
|
|
75
|
+
return this.redisClient.hset(properKey(key), key, value);
|
|
76
|
+
}
|
|
77
|
+
// write multiple hash keys and stringify every value
|
|
78
|
+
writeMultiHash(path, j) {
|
|
79
|
+
return this.redisClient.hmsetAsync(properKey(key), convertJsonToRedisValue(j));
|
|
80
|
+
}
|
|
81
|
+
readHashKey(obj, key, autoConvert = true) {
|
|
82
|
+
var k = autoConvert;
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
this.redisClient.hget(properKey(key, obj), key, (e, r) => {
|
|
85
|
+
if (e) {
|
|
86
|
+
logger.error("Redis hmget error:", e);
|
|
87
|
+
reject(e);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
resolve(k ? convertRedisKeyValueToJson(r) : r);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
readHash(path) {
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
this.redisClient.hgetall(properKey(key, path), (e, r) => {
|
|
98
|
+
if (e) {
|
|
99
|
+
console.log("Redis hget error:", e);
|
|
100
|
+
reject(e);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
resolve(convertRedisHashToJson(r));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
deleteHashKey(hash, key) {
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
this.redisClient.hdel(properKey(key, hash), key, (err) => {
|
|
111
|
+
if (err) {
|
|
112
|
+
logger.error("Redis hdel error:", err);
|
|
113
|
+
reject(err);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
resolve();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
get(key) {
|
|
122
|
+
return this.redisClient.getAsync(properKey(key));
|
|
123
|
+
}
|
|
124
|
+
getAsync(key) {
|
|
125
|
+
return promisify(this.redisClient.get(key)).bind(this.redisClient);
|
|
126
|
+
}
|
|
127
|
+
/* a single key write with optional expiry */
|
|
128
|
+
// returns bluebird promise
|
|
129
|
+
writeKey(key, value, expiry) {
|
|
130
|
+
key = this.servicePrefix + key;
|
|
131
|
+
if (expiry) {
|
|
132
|
+
return this.redisClient.setAsync(key, value, "EX", expiry);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
return this.redisClient.setAsync(key, value);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
deleteKey(key) {
|
|
139
|
+
return redisClient.delAsync(properKey(key));
|
|
140
|
+
}
|
|
141
|
+
expire(path, expiry) {
|
|
142
|
+
return this.redisClient.expire(path, expiry);
|
|
143
|
+
}
|
|
144
|
+
exists(path) {
|
|
145
|
+
return this.redisClient.exists(path);
|
|
146
|
+
}
|
|
147
|
+
deleteAllKeys() {
|
|
148
|
+
return new Promise((resolve, reject) => {
|
|
149
|
+
if (process.env.NODE_ENV === "production") {
|
|
150
|
+
throw new Error("Clearing system cache is not permitted in production");
|
|
151
|
+
}
|
|
152
|
+
this.redisClient.flushdb((err, res) => {
|
|
153
|
+
if (err) {
|
|
154
|
+
reject(err);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
resolve(res);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export default function (config, servicePrefix) {
|
|
164
|
+
return new Cache(config, servicePrefix);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../cache/index.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../constants/index.js"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,kDAAkD;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;CACX,CAAC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export default formatter;
|
|
2
|
+
declare const formatter: S4Formatter;
|
|
3
|
+
declare class S4Formatter {
|
|
4
|
+
defaults: {
|
|
5
|
+
status: number;
|
|
6
|
+
errors: {};
|
|
7
|
+
};
|
|
8
|
+
_isArray(value: any): boolean;
|
|
9
|
+
_fromHash(error: any): {
|
|
10
|
+
status: number;
|
|
11
|
+
errors: {};
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Desired Response format
|
|
15
|
+
*{
|
|
16
|
+
* "error": {
|
|
17
|
+
* "status": 422,
|
|
18
|
+
* "errors": {
|
|
19
|
+
* "password": {
|
|
20
|
+
* "location": "body",
|
|
21
|
+
* "param": "password",
|
|
22
|
+
* "value": "mypassword",
|
|
23
|
+
* "msg": "weak"
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
* },
|
|
27
|
+
* "error_id": "a2ddf895-2aaf-4189-88a2-8e11f6843f91"
|
|
28
|
+
*}
|
|
29
|
+
*/
|
|
30
|
+
formatError(error: any): FormatError | {
|
|
31
|
+
status: number;
|
|
32
|
+
errors: {};
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
declare class FormatError extends Error {
|
|
36
|
+
constructor(m: any);
|
|
37
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
class FormatError extends Error {
|
|
3
|
+
constructor(m) {
|
|
4
|
+
super(m);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
// helps to clean up response formats for services responding to rest requests
|
|
8
|
+
class S4Formatter {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.defaults = {
|
|
11
|
+
status: 422,
|
|
12
|
+
errors: {}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
_isArray(value) {
|
|
16
|
+
return value && typeof value === 'object' && value.constructor === Array;
|
|
17
|
+
}
|
|
18
|
+
_fromHash(error) {
|
|
19
|
+
let response = Object.assign({}, this.defaults);
|
|
20
|
+
if (error.status) {
|
|
21
|
+
let errorStatus = parseInt(error.status);
|
|
22
|
+
if ((errorStatus >= 200) && (errorStatus < 522)) {
|
|
23
|
+
response.status = errorStatus;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (error.error && (typeof (error.error) === "string")) {
|
|
27
|
+
response.errors["generic"] = { msg: error.error };
|
|
28
|
+
}
|
|
29
|
+
else if (error.errors) {
|
|
30
|
+
if (this._isArray(error.errors)) {
|
|
31
|
+
// many legacy responses which are errors: ["error_name"]
|
|
32
|
+
error.errors.forEach(function (el, index) {
|
|
33
|
+
response.errors[`generic_${index}`] = { msg: el };
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else if (typeof (error.errors) === "object") {
|
|
37
|
+
response.errors = error.errors;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return response;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Desired Response format
|
|
44
|
+
*{
|
|
45
|
+
* "error": {
|
|
46
|
+
* "status": 422,
|
|
47
|
+
* "errors": {
|
|
48
|
+
* "password": {
|
|
49
|
+
* "location": "body",
|
|
50
|
+
* "param": "password",
|
|
51
|
+
* "value": "mypassword",
|
|
52
|
+
* "msg": "weak"
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* },
|
|
56
|
+
* "error_id": "a2ddf895-2aaf-4189-88a2-8e11f6843f91"
|
|
57
|
+
*}
|
|
58
|
+
*/
|
|
59
|
+
formatError(error) {
|
|
60
|
+
let response;
|
|
61
|
+
if (error === null) {
|
|
62
|
+
response = this.defaults;
|
|
63
|
+
}
|
|
64
|
+
else if (typeof (error) === "object") {
|
|
65
|
+
response = this._fromHash(error);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
return new FormatError("invalid_error_format");
|
|
69
|
+
}
|
|
70
|
+
return response;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const formatter = new S4Formatter();
|
|
74
|
+
export default formatter;
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../formatter/index.js"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,WAAY,SAAQ,KAAK;IAC7B,YAAY,CAAC;QACX,KAAK,CAAC,CAAC,CAAC,CAAC;IACX,CAAC;CACF;AAED,8EAA8E;AAC9E,MAAM,WAAW;IACf;QACE,IAAI,CAAC,QAAQ,GAAG;YACd,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,QAAQ,CAAE,KAAK;QACb,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC;IAC3E,CAAC;IAED,SAAS,CAAC,KAAK;QACb,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEzC,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC;gBAChD,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,OAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YACtD,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,CAAA;QACnD,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChC,yDAAyD;gBACzD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAS,EAAE,EAAE,KAAK;oBACrC,QAAQ,CAAC,MAAM,CAAC,WAAW,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;gBACnD,CAAC,CAAC,CAAA;YACJ,CAAC;iBAAM,IAAI,OAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC7C,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;YAChC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;;;;;;;;;;MAgBE;IACF,WAAW,CAAC,KAAK;QACf,IAAI,QAAQ,CAAC;QACb,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,CAAC;aAAM,IAAI,OAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAG,CAAC;YACvC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,WAAW,CAAC,sBAAsB,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC;AACpC,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
function lastElement(arr) {
|
|
3
|
+
if (arr && arr.length) {
|
|
4
|
+
return arr[arr.length - 1];
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
class HalDecorator {
|
|
11
|
+
decorate(Model, options) {
|
|
12
|
+
const model = Model.instance || Model;
|
|
13
|
+
const resource = (options && options.resource) ? options.resource : "";
|
|
14
|
+
const exclude = (options && options.exclude) ? options.exclude : [];
|
|
15
|
+
const links = (options && options.links) ? options.links : {};
|
|
16
|
+
const linksTag = (options && options.linksTag) ? options.linksTag : "_links";
|
|
17
|
+
const resourceTag = (options && options.resourceTag) ? options.resourceTag : "_resource";
|
|
18
|
+
const link = (name, method, l) => {
|
|
19
|
+
if (name && method && l) {
|
|
20
|
+
var aLink = {};
|
|
21
|
+
alink[method] = l;
|
|
22
|
+
links[name] = aLink;
|
|
23
|
+
}
|
|
24
|
+
return model;
|
|
25
|
+
};
|
|
26
|
+
const getLinkData = (values) => {
|
|
27
|
+
var linkData = {};
|
|
28
|
+
if (links) {
|
|
29
|
+
for (const key in links) {
|
|
30
|
+
if (links.hasOwnProperty(key)) {
|
|
31
|
+
const link = links[key];
|
|
32
|
+
const method = lastElement(Object.keys(link));
|
|
33
|
+
var url = link[method];
|
|
34
|
+
const paramPattern = /\:([a-zA-z_0-9]*)/;
|
|
35
|
+
const arr = paramPattern.exec(url);
|
|
36
|
+
if (arr) {
|
|
37
|
+
// Replace parameters
|
|
38
|
+
url = `/${resource}/${url.split(arr[0]).join(values[arr[1]])}`;
|
|
39
|
+
// Remove extra slashes that may have been added
|
|
40
|
+
url = url.replace(/\/\/*/g, "/");
|
|
41
|
+
linkData[key] = {};
|
|
42
|
+
linkData[key][method] = url;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return Object.keys(linkData).length > 0 ? linkData : null;
|
|
48
|
+
};
|
|
49
|
+
model.link = link;
|
|
50
|
+
Model.prototype.toJSON = function () {
|
|
51
|
+
var values = Object.assign({}, this.get());
|
|
52
|
+
if (exclude) {
|
|
53
|
+
exclude.forEach(element => {
|
|
54
|
+
delete values[element];
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const links = getLinkData(values);
|
|
58
|
+
const result = {};
|
|
59
|
+
if (links) {
|
|
60
|
+
result[linksTag] = links;
|
|
61
|
+
}
|
|
62
|
+
result[resourceTag] = values;
|
|
63
|
+
return result;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const halDecorator = new HalDecorator();
|
|
68
|
+
export default halDecorator;
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../hal/index.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export default helpers;
|
|
2
|
+
declare namespace helpers {
|
|
3
|
+
function debug(...args: any[]): void;
|
|
4
|
+
function log(...args: any[]): void;
|
|
5
|
+
function warn(...args: any[]): void;
|
|
6
|
+
function info(...args: any[]): void;
|
|
7
|
+
function error(...args: any[]): void;
|
|
8
|
+
function setEnabled(e: any): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import logger from "../logger/s4-logger.js";
|
|
2
|
+
let enabled = false;
|
|
3
|
+
const helpers = {
|
|
4
|
+
debug(...args) {
|
|
5
|
+
if (enabled) {
|
|
6
|
+
logger.debug(":: HealthCheck ::", args);
|
|
7
|
+
}
|
|
8
|
+
},
|
|
9
|
+
log(...args) {
|
|
10
|
+
if (enabled) {
|
|
11
|
+
logger.debug(":: HealthCheck ::", args);
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
warn(...args) {
|
|
15
|
+
if (enabled) {
|
|
16
|
+
logger.warn(":: HealthCheck ::", args);
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
info(...args) {
|
|
20
|
+
if (enabled) {
|
|
21
|
+
logger.info(":: HealthCheck ::", args);
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
error(...args) {
|
|
25
|
+
if (enabled) {
|
|
26
|
+
logger.error(":: HealthCheck ::", args);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
setEnabled(e) {
|
|
30
|
+
enabled = e;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
export default helpers;
|
|
34
|
+
//# sourceMappingURL=health-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-logger.js","sourceRoot":"","sources":["../../health/health-logger.js"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,wBAAwB,CAAC;AAC5C,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB,MAAM,OAAO,GAAG;IACd,KAAK,CAAC,GAAG,IAAI;QACX,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAG,IAAI;QACT,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,IAAI;QACV,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,IAAI;QACV,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,IAAI;QACX,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,UAAU,CAAC,CAAC;QACV,OAAO,GAAG,CAAC,CAAC;IACd,CAAC;CACF,CAAA;AAED,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class HealthCheck {
|
|
2
|
+
constructor(appendData?: {}, enableLogging?: boolean);
|
|
3
|
+
defaultResponse: {
|
|
4
|
+
status: number;
|
|
5
|
+
errors: {};
|
|
6
|
+
};
|
|
7
|
+
defaultPathRoute: string;
|
|
8
|
+
suppressLogs: boolean;
|
|
9
|
+
lastCallId: number;
|
|
10
|
+
pathPrefix: string;
|
|
11
|
+
healthChecks: any[];
|
|
12
|
+
addCheck(fcn: any): void;
|
|
13
|
+
setPrefix(prefix: any): void;
|
|
14
|
+
defaultPath(prefix?: string): string;
|
|
15
|
+
routes(router: any): any;
|
|
16
|
+
suppressHealthCheckLog(app: any): void;
|
|
17
|
+
setupCheck(config: any): void;
|
|
18
|
+
checkHealth(req: any, res: any): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import pathHelper from "path";
|
|
3
|
+
import logger from "./health-logger.js";
|
|
4
|
+
import morgan from "morgan";
|
|
5
|
+
class HealthCheckError extends Error {
|
|
6
|
+
}
|
|
7
|
+
/* Health Checking router + controller for use in all of our modules
|
|
8
|
+
* Example use: Place the following code in your routes file
|
|
9
|
+
*
|
|
10
|
+
* import { healthCheck } from "@sera4/essentia";
|
|
11
|
+
* const router = require('express').Router();
|
|
12
|
+
*
|
|
13
|
+
* ....
|
|
14
|
+
*
|
|
15
|
+
* const checkRedis = async () => { await cache.ping(); }
|
|
16
|
+
* hc.setupCheck({ name: "redis", checkResult: false, critical: true, healthFunction: checkRedis });
|
|
17
|
+
* app.use(hc.defaultPath(serverConfigs.api_prefix), hc.routes(router));
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
class HealthCheck {
|
|
21
|
+
constructor(appendData = {}, enableLogging = true) {
|
|
22
|
+
logger.setEnabled(enableLogging);
|
|
23
|
+
this.defaultResponse = {
|
|
24
|
+
...appendData,
|
|
25
|
+
status: 200,
|
|
26
|
+
errors: {}
|
|
27
|
+
};
|
|
28
|
+
this.defaultPathRoute = `health_check\(.*\)?`;
|
|
29
|
+
this.suppressLogs = false;
|
|
30
|
+
this.lastCallId = 0; // default start point/integer
|
|
31
|
+
this.pathPrefix = "";
|
|
32
|
+
this.healthChecks = [];
|
|
33
|
+
}
|
|
34
|
+
/* Deprecated and replaced by setupCheck
|
|
35
|
+
* call this with an async function, must support wait capability
|
|
36
|
+
*
|
|
37
|
+
* const dbCheck = async () => {
|
|
38
|
+
* return { name: "db", "result": "success", critical: false };
|
|
39
|
+
* }
|
|
40
|
+
*/
|
|
41
|
+
addCheck(fcn) {
|
|
42
|
+
this.healthChecks.push(fcn);
|
|
43
|
+
}
|
|
44
|
+
setPrefix(prefix) {
|
|
45
|
+
this.pathPrefix = prefix;
|
|
46
|
+
}
|
|
47
|
+
defaultPath(prefix = "") {
|
|
48
|
+
if (prefix === "") {
|
|
49
|
+
prefix = this.pathPrefix; // maybe setup manually
|
|
50
|
+
}
|
|
51
|
+
return `${prefix}/${this.defaultPathRoute}`;
|
|
52
|
+
}
|
|
53
|
+
routes(router) {
|
|
54
|
+
if (!router) {
|
|
55
|
+
throw new HealthCheckError("missing_express_router");
|
|
56
|
+
}
|
|
57
|
+
/* definition of all routes, rooted at defaultPath */
|
|
58
|
+
router.get('/', (req, res) => {
|
|
59
|
+
this.checkHealth(req, res);
|
|
60
|
+
});
|
|
61
|
+
return router;
|
|
62
|
+
}
|
|
63
|
+
suppressHealthCheckLog(app) {
|
|
64
|
+
// Custom morgan skip function to ignore health check logging
|
|
65
|
+
console.log("skip: ", this.defaultPath());
|
|
66
|
+
app.use(morgan('combined', {
|
|
67
|
+
skip: (req) => req.path === defaultPath()
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
// v2 version of health check, replaced addCheck
|
|
71
|
+
// example:
|
|
72
|
+
// const checkRedisFcn = async () => { await cache.ping().then(() => true) }
|
|
73
|
+
// setupCheck({ name: "redis", checkResult: false, critical: false, healthFunction: checkRedisFcn });
|
|
74
|
+
setupCheck(config) {
|
|
75
|
+
this.healthChecks.push(config);
|
|
76
|
+
}
|
|
77
|
+
/* performs health checks and returns 200 if true and 500 if not */
|
|
78
|
+
async checkHealth(req, res) {
|
|
79
|
+
const checkFormat = pathHelper.extname(req.baseUrl);
|
|
80
|
+
const result = await Promise.all(this.healthChecks.map(async (hc) => {
|
|
81
|
+
if (typeof (hc) === "function") {
|
|
82
|
+
try {
|
|
83
|
+
return await hc();
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
return { name: "unknown", result: 'fail', status: e.status };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
let res = { name: hc.name, critical: hc.critical };
|
|
91
|
+
try {
|
|
92
|
+
const result = await hc.healthFunction();
|
|
93
|
+
if (typeof (result) === "boolean") {
|
|
94
|
+
if (result === false) {
|
|
95
|
+
res = { "result": "fail", ...res };
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
res = { "result": "success", ...res };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
res = { "result": "success", ...res };
|
|
103
|
+
}
|
|
104
|
+
return res;
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
const appendStatus = e.status ? ` (${e.status})` : "";
|
|
108
|
+
logger.warn(`${hc.name} service failed${appendStatus}`);
|
|
109
|
+
return { ...res, "result": "fail", status: e.status };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}));
|
|
113
|
+
try {
|
|
114
|
+
let callId = ++this.lastCallId;
|
|
115
|
+
// start the counter over
|
|
116
|
+
if ((callId % (1 << 30)) === 0) {
|
|
117
|
+
callId = this.lastCallId = 1;
|
|
118
|
+
}
|
|
119
|
+
let status = this.defaultResponse.status;
|
|
120
|
+
let nonCriticalFail = false;
|
|
121
|
+
let criticalFail = false;
|
|
122
|
+
result.some(e => {
|
|
123
|
+
if (e.result.match(/fail/)) {
|
|
124
|
+
if (e.critical === false) {
|
|
125
|
+
nonCriticalFail = true;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
criticalFail = true;
|
|
129
|
+
status = 500;
|
|
130
|
+
return true; // break
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
// set this in the header no matter what
|
|
135
|
+
res.setHeader('check', callId);
|
|
136
|
+
if (checkFormat === ".json") {
|
|
137
|
+
const payload = { "check": callId, healthy: "true", message: "success" };
|
|
138
|
+
if (criticalFail) {
|
|
139
|
+
res.status(status).json({
|
|
140
|
+
...payload,
|
|
141
|
+
"healthy": false,
|
|
142
|
+
"message": "fail",
|
|
143
|
+
"services": result
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else if (nonCriticalFail) {
|
|
147
|
+
res.status(status).json({
|
|
148
|
+
...payload,
|
|
149
|
+
"message": "fail",
|
|
150
|
+
"services": result
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else if (status === 200) {
|
|
154
|
+
res.status(status).json(payload);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
let status_message;
|
|
159
|
+
if (criticalFail) {
|
|
160
|
+
status_message = "fail";
|
|
161
|
+
}
|
|
162
|
+
else if ((status === 200) || nonCriticalFail) {
|
|
163
|
+
status_message = "success";
|
|
164
|
+
}
|
|
165
|
+
res.status(status).send(status_message);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.warn("error: ", error);
|
|
170
|
+
res.status(500).send();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
export { HealthCheck };
|
|
175
|
+
//# sourceMappingURL=index.js.map
|