@cryptexlabs/codex-nodejs-common 0.14.6 → 0.15.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/lib/package.json +2 -2
- package/lib/src/context/context.builder.d.ts +1 -0
- package/lib/src/context/context.builder.js +6 -0
- package/lib/src/context/context.builder.js.map +1 -1
- package/lib/src/context/context.d.ts +3 -0
- package/lib/src/context/context.js +6 -0
- package/lib/src/context/context.js.map +1 -1
- package/lib/src/decorator/api-meta-headers.js +24 -10
- package/lib/src/decorator/api-meta-headers.js.map +1 -1
- package/lib/src/middleware/api-headers-validation.middleware.js +15 -2
- package/lib/src/middleware/api-headers-validation.middleware.js.map +1 -1
- package/lib/src/util/string.util.d.ts +1 -0
- package/lib/src/util/string.util.js +5 -2
- package/lib/src/util/string.util.js.map +1 -1
- package/package.json +2 -2
- package/src/context/context.builder.ts +8 -0
- package/src/context/context.ts +9 -0
- package/src/decorator/api-meta-headers.ts +25 -10
- package/src/middleware/api-headers-validation.middleware.ts +23 -2
- package/src/util/string.util.ts +6 -2
package/lib/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cryptexlabs/codex-nodejs-common",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.1",
|
|
4
4
|
"description": "Common code for Codex framework",
|
|
5
5
|
"main": "lib/src/index.js",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@types/i18n": "0.12.0",
|
|
41
41
|
"@types/joi": "14.3.4",
|
|
42
42
|
"@types/jsonwebtoken": "8.5.5",
|
|
43
|
-
"@types/node": "20
|
|
43
|
+
"@types/node": "20",
|
|
44
44
|
"@types/watch": "^1.0.6",
|
|
45
45
|
"dotenv": "8.2.0",
|
|
46
46
|
"express": "4.17.1",
|
|
@@ -13,6 +13,7 @@ export declare class ContextBuilder {
|
|
|
13
13
|
private started;
|
|
14
14
|
private _path?;
|
|
15
15
|
private _now?;
|
|
16
|
+
private _timezone?;
|
|
16
17
|
constructor(logger: LoggerService, config: DefaultConfig, client: ClientInterface, messageContext: MessageContextInterface, i18nData?: i18nAPI);
|
|
17
18
|
now(): Date;
|
|
18
19
|
setNow(now: Date): void;
|
|
@@ -70,6 +70,9 @@ let ContextBuilder = ContextBuilder_1 = class ContextBuilder {
|
|
|
70
70
|
if (headers["x-now"]) {
|
|
71
71
|
this._now = new Date(headers["x-now"]);
|
|
72
72
|
}
|
|
73
|
+
if (headers["x-timezone"]) {
|
|
74
|
+
this._timezone = headers["x-timezone"];
|
|
75
|
+
}
|
|
73
76
|
return this;
|
|
74
77
|
}
|
|
75
78
|
setMetaFromHeadersForNewMessage(headers) {
|
|
@@ -131,6 +134,9 @@ let ContextBuilder = ContextBuilder_1 = class ContextBuilder {
|
|
|
131
134
|
if (this._now) {
|
|
132
135
|
context.setNow(this._now);
|
|
133
136
|
}
|
|
137
|
+
if (this._timezone) {
|
|
138
|
+
context.setTimezone(this._timezone);
|
|
139
|
+
}
|
|
134
140
|
return context;
|
|
135
141
|
}
|
|
136
142
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.builder.js","sourceRoot":"","sources":["../../../src/context/context.builder.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA2D;AAC3D,oEAQuC;AACvC,sCAA0C;AAC1C,uCAAoC;AACpC,+BAAoC;AACpC,kCAAqC;AACrC,+BAA4B;AAGrB,IAAM,cAAc,sBAApB,MAAM,cAAc;
|
|
1
|
+
{"version":3,"file":"context.builder.js","sourceRoot":"","sources":["../../../src/context/context.builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,11 @@ export declare class Context {
|
|
|
14
14
|
readonly logger: ContextLogger;
|
|
15
15
|
started: Date;
|
|
16
16
|
private _now;
|
|
17
|
+
private _timezone;
|
|
17
18
|
constructor(correlationId: string, logger: LoggerService, config: DefaultConfig, client: ClientInterface, locale: LocaleI18nInterface, messageContext: MessageContextInterface, started?: Date, i18n?: I18n, path?: string);
|
|
18
19
|
now(): Date;
|
|
19
20
|
setNow(now: Date): void;
|
|
21
|
+
setTimezone(timezone: string): void;
|
|
22
|
+
get timezone(): string;
|
|
20
23
|
getMessageMeta(type: string): MessageMetaInterface;
|
|
21
24
|
}
|
|
@@ -24,6 +24,12 @@ class Context {
|
|
|
24
24
|
setNow(now) {
|
|
25
25
|
this._now = now;
|
|
26
26
|
}
|
|
27
|
+
setTimezone(timezone) {
|
|
28
|
+
this._timezone = timezone;
|
|
29
|
+
}
|
|
30
|
+
get timezone() {
|
|
31
|
+
return this._timezone;
|
|
32
|
+
}
|
|
27
33
|
getMessageMeta(type) {
|
|
28
34
|
return new message_1.MessageMeta(type, this.locale, this.config, this.correlationId, this.started);
|
|
29
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/context/context.ts"],"names":[],"mappings":";;;AAQA,sCAA0C;AAC1C,wCAAyC;AAGzC,MAAa,OAAO;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/context/context.ts"],"names":[],"mappings":";;;AAQA,sCAA0C;AAC1C,wCAAyC;AAGzC,MAAa,OAAO;IAMlB,YACS,aAAqB,EAC5B,MAAqB,EACd,MAAqB,EACrB,MAAuB,EACd,MAA2B,EAC3B,cAAuC,EACvD,OAAc,EACE,IAAW,EACX,IAAa;QARtB,kBAAa,GAAb,aAAa,CAAQ;QAErB,WAAM,GAAN,MAAM,CAAe;QACrB,WAAM,GAAN,MAAM,CAAiB;QACd,WAAM,GAAN,MAAM,CAAqB;QAC3B,mBAAc,GAAd,cAAc,CAAyB;QAEvC,SAAI,GAAJ,IAAI,CAAO;QACX,SAAI,GAAJ,IAAI,CAAS;QAE7B,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAa,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IAEM,GAAG;QACR,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IAEM,MAAM,CAAC,GAAS;QACrB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IAEM,WAAW,CAAC,QAAgB;QACjC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,OAAO,IAAI,qBAAW,CACpB,IAAI,EACJ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,OAAO,CACb,CAAC;IACJ,CAAC;CACF;AAjDD,0BAiDC"}
|
|
@@ -23,7 +23,7 @@ function ApiMetaHeaders() {
|
|
|
23
23
|
(0, swagger_1.ApiHeader)({
|
|
24
24
|
name: "X-Started",
|
|
25
25
|
description: "The time that the very first user initiated or time initiated event that eventually lead to this api being called was created",
|
|
26
|
-
required:
|
|
26
|
+
required: true,
|
|
27
27
|
schema: {
|
|
28
28
|
example: new Date().toISOString(),
|
|
29
29
|
},
|
|
@@ -31,7 +31,7 @@ function ApiMetaHeaders() {
|
|
|
31
31
|
(0, swagger_1.ApiHeader)({
|
|
32
32
|
name: "X-Context-Category",
|
|
33
33
|
description: "A category for the context of the request. For example 'test' or 'performance test'",
|
|
34
|
-
required:
|
|
34
|
+
required: true,
|
|
35
35
|
schema: {
|
|
36
36
|
example: "default",
|
|
37
37
|
},
|
|
@@ -39,7 +39,7 @@ function ApiMetaHeaders() {
|
|
|
39
39
|
(0, swagger_1.ApiHeader)({
|
|
40
40
|
name: "X-Context-Id",
|
|
41
41
|
description: "A unique context identifier used for correlating logs and metrics usually for performance or experimental testing",
|
|
42
|
-
required:
|
|
42
|
+
required: true,
|
|
43
43
|
schema: {
|
|
44
44
|
example: "none",
|
|
45
45
|
},
|
|
@@ -47,15 +47,21 @@ function ApiMetaHeaders() {
|
|
|
47
47
|
(0, swagger_1.ApiHeader)({
|
|
48
48
|
name: "X-Client-Id",
|
|
49
49
|
description: "A unique identifier for the client to help identify exactly which application or third party is making the requests",
|
|
50
|
-
required:
|
|
51
|
-
schema: {
|
|
52
|
-
|
|
50
|
+
required: true,
|
|
51
|
+
schema: {},
|
|
52
|
+
examples: {
|
|
53
|
+
UUIDV4: {
|
|
54
|
+
value: "dafae812-6a07-4e4f-8ac5-d5a81bb32cab",
|
|
55
|
+
},
|
|
56
|
+
Integer: {
|
|
57
|
+
value: 1,
|
|
58
|
+
},
|
|
53
59
|
},
|
|
54
60
|
}),
|
|
55
61
|
(0, swagger_1.ApiHeader)({
|
|
56
62
|
name: "X-Client-Name",
|
|
57
63
|
description: "The name of the client",
|
|
58
|
-
required:
|
|
64
|
+
required: true,
|
|
59
65
|
schema: {
|
|
60
66
|
example: "swagger",
|
|
61
67
|
},
|
|
@@ -64,7 +70,7 @@ function ApiMetaHeaders() {
|
|
|
64
70
|
name: "X-Client-Version",
|
|
65
71
|
description: "The version of the client. If the client is making bad requests this helps " +
|
|
66
72
|
"identify which version of the client is making the bad requests",
|
|
67
|
-
required:
|
|
73
|
+
required: true,
|
|
68
74
|
schema: {
|
|
69
75
|
example: "0.3.6",
|
|
70
76
|
},
|
|
@@ -72,7 +78,7 @@ function ApiMetaHeaders() {
|
|
|
72
78
|
(0, swagger_1.ApiHeader)({
|
|
73
79
|
name: "X-Client-Variant",
|
|
74
80
|
description: "Usually an environment or build type such as dev, test, or prod",
|
|
75
|
-
required:
|
|
81
|
+
required: true,
|
|
76
82
|
schema: {
|
|
77
83
|
example: "dev",
|
|
78
84
|
},
|
|
@@ -80,7 +86,7 @@ function ApiMetaHeaders() {
|
|
|
80
86
|
(0, swagger_1.ApiHeader)({
|
|
81
87
|
name: "X-Created",
|
|
82
88
|
description: "The time the client initiated the http request",
|
|
83
|
-
required:
|
|
89
|
+
required: true,
|
|
84
90
|
schema: {
|
|
85
91
|
example: new Date().toISOString(),
|
|
86
92
|
},
|
|
@@ -93,6 +99,14 @@ function ApiMetaHeaders() {
|
|
|
93
99
|
example: new Date().toISOString(),
|
|
94
100
|
},
|
|
95
101
|
}),
|
|
102
|
+
(0, swagger_1.ApiHeader)({
|
|
103
|
+
name: "X-Timezone",
|
|
104
|
+
description: "The client's timezone eg 'America/Los_Angeles', 'America/New_York', etc",
|
|
105
|
+
required: false,
|
|
106
|
+
schema: {
|
|
107
|
+
example: "America/Chicago",
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
96
110
|
]);
|
|
97
111
|
}
|
|
98
112
|
//# sourceMappingURL=api-meta-headers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-meta-headers.js","sourceRoot":"","sources":["../../../src/decorator/api-meta-headers.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"api-meta-headers.js","sourceRoot":"","sources":["../../../src/decorator/api-meta-headers.ts"],"names":[],"mappings":";;AAIA,wCAiHC;AArHD,6CAA4C;AAC5C,2CAAiD;AACjD,+BAAoC;AAEpC,SAAgB,cAAc;IAC5B,OAAO,IAAA,wBAAe,EACpB,GAAG;QACD,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,IAAA,SAAM,GAAE;aAClB;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,OAAO;aACjB;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,WAAW;YACjB,WAAW,EACT,+HAA+H;YACjI,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EACT,qFAAqF;YACvF,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,SAAS;aACnB;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,cAAc;YACpB,WAAW,EACT,mHAAmH;YACrH,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,MAAM;aAChB;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,aAAa;YACnB,WAAW,EACT,qHAAqH;YACvH,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE;gBACR,MAAM,EAAE;oBACN,KAAK,EAAE,sCAAsC;iBAC9C;gBACD,OAAO,EAAE;oBACP,KAAK,EAAE,CAAC;iBACT;aACF;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,wBAAwB;YACrC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,SAAS;aACnB;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACT,6EAA6E;gBAC7E,iEAAiE;YACnE,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,OAAO;aACjB;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACT,iEAAiE;YACnE,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,KAAK;aACf;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,gDAAgD;YAC7D,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,gDAAgD;YAC7D,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE;gBACN,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC;SACF,CAAC;QACF,IAAA,mBAAS,EAAC;YACR,IAAI,EAAE,YAAY;YAClB,WAAW,EACT,yEAAyE;YAC3E,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE;gBACN,OAAO,EAAE,iBAAiB;aAC3B;SACF,CAAC;KACH,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -75,8 +75,9 @@ let ApiHeadersValidationMiddleware = class ApiHeadersValidationMiddleware {
|
|
|
75
75
|
if (clientId.trim() === "") {
|
|
76
76
|
throw new common_1.BadRequestException(`X-Client-Id header is empty. A unique identifier for the client to help identify exactly which application or third party is making the requests. Should be identical for every client. Used to uniquely identify projects. You can hard code this string in your project. Its not a secret. Should NOT be different for every request.`);
|
|
77
77
|
}
|
|
78
|
-
if (!util_1.StringUtil.isValidUUIDv4(clientId)
|
|
79
|
-
|
|
78
|
+
if (!util_1.StringUtil.isValidUUIDv4(clientId) &&
|
|
79
|
+
!util_1.StringUtil.isInteger(clientId)) {
|
|
80
|
+
throw new common_1.BadRequestException(`Invalid X-Client-Id header. Must be UUID V4 format or integer`);
|
|
80
81
|
}
|
|
81
82
|
},
|
|
82
83
|
"x-client-name": (context, clientName) => {
|
|
@@ -106,6 +107,18 @@ let ApiHeadersValidationMiddleware = class ApiHeadersValidationMiddleware {
|
|
|
106
107
|
throw new common_1.BadRequestException(`X-Now header is invalid: '${now}'`);
|
|
107
108
|
}
|
|
108
109
|
},
|
|
110
|
+
"x-timezone": (context, timezone) => {
|
|
111
|
+
if (timezone) {
|
|
112
|
+
if (Intl.supportedValuesOf) {
|
|
113
|
+
if (!Intl.supportedValuesOf("timeZone").includes(timezone)) {
|
|
114
|
+
throw new common_1.BadRequestException(`X-Timezone header is invalid: '${timezone}'`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
context.logger.warn("Cannot validate timezone because Intl.supportedValuesOf does not exist");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
109
122
|
};
|
|
110
123
|
if (this.config.apiPrefixes.some((prefix) => {
|
|
111
124
|
return req.path.startsWith(`/${prefix}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-headers-validation.middleware.js","sourceRoot":"","sources":["../../../src/middleware/api-headers-validation.middleware.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api-headers-validation.middleware.js","sourceRoot":"","sources":["../../../src/middleware/api-headers-validation.middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ const crypto = require("crypto");
|
|
|
5
5
|
class StringUtil {
|
|
6
6
|
constructor() { }
|
|
7
7
|
static isRegexString(str) {
|
|
8
|
-
return str.
|
|
8
|
+
return str.substring(0, 1) === "/" && str.substring(str.length - 1) === "/";
|
|
9
9
|
}
|
|
10
10
|
static stringMatches(test, str) {
|
|
11
11
|
const testTrimmed = test.trim();
|
|
@@ -14,7 +14,7 @@ class StringUtil {
|
|
|
14
14
|
return true;
|
|
15
15
|
}
|
|
16
16
|
if (this.isRegexString(testTrimmed)) {
|
|
17
|
-
if (new RegExp(testTrimmed.
|
|
17
|
+
if (new RegExp(testTrimmed.substring(1, testTrimmed.length - 2)).test(strTrimmed)) {
|
|
18
18
|
return true;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
@@ -39,6 +39,9 @@ class StringUtil {
|
|
|
39
39
|
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
40
40
|
return regex.test(uuid);
|
|
41
41
|
}
|
|
42
|
+
static isInteger(str) {
|
|
43
|
+
return Number.isInteger(Number(str));
|
|
44
|
+
}
|
|
42
45
|
}
|
|
43
46
|
exports.StringUtil = StringUtil;
|
|
44
47
|
//# sourceMappingURL=string.util.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.util.js","sourceRoot":"","sources":["../../../src/util/string.util.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAEjC,MAAa,UAAU;IACrB,gBAAuB,CAAC;IACjB,MAAM,CAAC,aAAa,CAAC,GAAW;QACrC,OAAO,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"string.util.js","sourceRoot":"","sources":["../../../src/util/string.util.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAEjC,MAAa,UAAU;IACrB,gBAAuB,CAAC;IACjB,MAAM,CAAC,aAAa,CAAC,GAAW;QACrC,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;IAC9E,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,IAAY,EAAE,GAAW;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,IACE,IAAI,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAC/D,UAAU,CACX,EACD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,GAAW;QACnC,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,GAAW;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,GAAW;QAC9B,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,GAAW;QAC9B,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAEM,MAAM,CAAC,SAAS,CAAC,GAAW;QACjC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,IAAI;QAC9B,MAAM,KAAK,GAAG,wEAAwE,CAAC;QACvF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAC,SAAS,CAAC,GAAW;QACjC,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;CACF;AApDD,gCAoDC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cryptexlabs/codex-nodejs-common",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.1",
|
|
4
4
|
"description": "Common code for Codex framework",
|
|
5
5
|
"main": "lib/src/index.js",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@types/i18n": "0.12.0",
|
|
41
41
|
"@types/joi": "14.3.4",
|
|
42
42
|
"@types/jsonwebtoken": "8.5.5",
|
|
43
|
-
"@types/node": "20
|
|
43
|
+
"@types/node": "20",
|
|
44
44
|
"@types/watch": "^1.0.6",
|
|
45
45
|
"dotenv": "8.2.0",
|
|
46
46
|
"express": "4.17.1",
|
|
@@ -21,6 +21,7 @@ export class ContextBuilder {
|
|
|
21
21
|
private started: Date;
|
|
22
22
|
private _path?: string;
|
|
23
23
|
private _now?: Date;
|
|
24
|
+
private _timezone?: string;
|
|
24
25
|
|
|
25
26
|
constructor(
|
|
26
27
|
private readonly logger: LoggerService,
|
|
@@ -86,6 +87,9 @@ export class ContextBuilder {
|
|
|
86
87
|
if (headers["x-now"]) {
|
|
87
88
|
this._now = new Date(headers["x-now"]);
|
|
88
89
|
}
|
|
90
|
+
if (headers["x-timezone"]) {
|
|
91
|
+
this._timezone = headers["x-timezone"];
|
|
92
|
+
}
|
|
89
93
|
|
|
90
94
|
return this;
|
|
91
95
|
}
|
|
@@ -171,6 +175,10 @@ export class ContextBuilder {
|
|
|
171
175
|
context.setNow(this._now);
|
|
172
176
|
}
|
|
173
177
|
|
|
178
|
+
if (this._timezone) {
|
|
179
|
+
context.setTimezone(this._timezone);
|
|
180
|
+
}
|
|
181
|
+
|
|
174
182
|
return context;
|
|
175
183
|
}
|
|
176
184
|
}
|
package/src/context/context.ts
CHANGED
|
@@ -14,6 +14,7 @@ export class Context {
|
|
|
14
14
|
public readonly logger: ContextLogger;
|
|
15
15
|
public started: Date;
|
|
16
16
|
private _now: Date;
|
|
17
|
+
private _timezone: string;
|
|
17
18
|
|
|
18
19
|
constructor(
|
|
19
20
|
public correlationId: string,
|
|
@@ -41,6 +42,14 @@ export class Context {
|
|
|
41
42
|
this._now = now;
|
|
42
43
|
}
|
|
43
44
|
|
|
45
|
+
public setTimezone(timezone: string) {
|
|
46
|
+
this._timezone = timezone;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public get timezone(): string {
|
|
50
|
+
return this._timezone;
|
|
51
|
+
}
|
|
52
|
+
|
|
44
53
|
getMessageMeta(type: string): MessageMetaInterface {
|
|
45
54
|
return new MessageMeta(
|
|
46
55
|
type,
|
|
@@ -23,7 +23,7 @@ export function ApiMetaHeaders() {
|
|
|
23
23
|
name: "X-Started",
|
|
24
24
|
description:
|
|
25
25
|
"The time that the very first user initiated or time initiated event that eventually lead to this api being called was created",
|
|
26
|
-
required:
|
|
26
|
+
required: true,
|
|
27
27
|
schema: {
|
|
28
28
|
example: new Date().toISOString(),
|
|
29
29
|
},
|
|
@@ -32,7 +32,7 @@ export function ApiMetaHeaders() {
|
|
|
32
32
|
name: "X-Context-Category",
|
|
33
33
|
description:
|
|
34
34
|
"A category for the context of the request. For example 'test' or 'performance test'",
|
|
35
|
-
required:
|
|
35
|
+
required: true,
|
|
36
36
|
schema: {
|
|
37
37
|
example: "default",
|
|
38
38
|
},
|
|
@@ -41,7 +41,7 @@ export function ApiMetaHeaders() {
|
|
|
41
41
|
name: "X-Context-Id",
|
|
42
42
|
description:
|
|
43
43
|
"A unique context identifier used for correlating logs and metrics usually for performance or experimental testing",
|
|
44
|
-
required:
|
|
44
|
+
required: true,
|
|
45
45
|
schema: {
|
|
46
46
|
example: "none",
|
|
47
47
|
},
|
|
@@ -50,15 +50,21 @@ export function ApiMetaHeaders() {
|
|
|
50
50
|
name: "X-Client-Id",
|
|
51
51
|
description:
|
|
52
52
|
"A unique identifier for the client to help identify exactly which application or third party is making the requests",
|
|
53
|
-
required:
|
|
54
|
-
schema: {
|
|
55
|
-
|
|
53
|
+
required: true,
|
|
54
|
+
schema: {},
|
|
55
|
+
examples: {
|
|
56
|
+
UUIDV4: {
|
|
57
|
+
value: "dafae812-6a07-4e4f-8ac5-d5a81bb32cab",
|
|
58
|
+
},
|
|
59
|
+
Integer: {
|
|
60
|
+
value: 1,
|
|
61
|
+
},
|
|
56
62
|
},
|
|
57
63
|
}),
|
|
58
64
|
ApiHeader({
|
|
59
65
|
name: "X-Client-Name",
|
|
60
66
|
description: "The name of the client",
|
|
61
|
-
required:
|
|
67
|
+
required: true,
|
|
62
68
|
schema: {
|
|
63
69
|
example: "swagger",
|
|
64
70
|
},
|
|
@@ -68,7 +74,7 @@ export function ApiMetaHeaders() {
|
|
|
68
74
|
description:
|
|
69
75
|
"The version of the client. If the client is making bad requests this helps " +
|
|
70
76
|
"identify which version of the client is making the bad requests",
|
|
71
|
-
required:
|
|
77
|
+
required: true,
|
|
72
78
|
schema: {
|
|
73
79
|
example: "0.3.6",
|
|
74
80
|
},
|
|
@@ -77,7 +83,7 @@ export function ApiMetaHeaders() {
|
|
|
77
83
|
name: "X-Client-Variant",
|
|
78
84
|
description:
|
|
79
85
|
"Usually an environment or build type such as dev, test, or prod",
|
|
80
|
-
required:
|
|
86
|
+
required: true,
|
|
81
87
|
schema: {
|
|
82
88
|
example: "dev",
|
|
83
89
|
},
|
|
@@ -85,7 +91,7 @@ export function ApiMetaHeaders() {
|
|
|
85
91
|
ApiHeader({
|
|
86
92
|
name: "X-Created",
|
|
87
93
|
description: "The time the client initiated the http request",
|
|
88
|
-
required:
|
|
94
|
+
required: true,
|
|
89
95
|
schema: {
|
|
90
96
|
example: new Date().toISOString(),
|
|
91
97
|
},
|
|
@@ -98,6 +104,15 @@ export function ApiMetaHeaders() {
|
|
|
98
104
|
example: new Date().toISOString(),
|
|
99
105
|
},
|
|
100
106
|
}),
|
|
107
|
+
ApiHeader({
|
|
108
|
+
name: "X-Timezone",
|
|
109
|
+
description:
|
|
110
|
+
"The client's timezone eg 'America/Los_Angeles', 'America/New_York', etc",
|
|
111
|
+
required: false,
|
|
112
|
+
schema: {
|
|
113
|
+
example: "America/Chicago",
|
|
114
|
+
},
|
|
115
|
+
}),
|
|
101
116
|
]
|
|
102
117
|
);
|
|
103
118
|
}
|
|
@@ -126,9 +126,12 @@ export class ApiHeadersValidationMiddleware implements NestMiddleware {
|
|
|
126
126
|
`X-Client-Id header is empty. A unique identifier for the client to help identify exactly which application or third party is making the requests. Should be identical for every client. Used to uniquely identify projects. You can hard code this string in your project. Its not a secret. Should NOT be different for every request.`
|
|
127
127
|
);
|
|
128
128
|
}
|
|
129
|
-
if (
|
|
129
|
+
if (
|
|
130
|
+
!StringUtil.isValidUUIDv4(clientId) &&
|
|
131
|
+
!StringUtil.isInteger(clientId)
|
|
132
|
+
) {
|
|
130
133
|
throw new BadRequestException(
|
|
131
|
-
`Invalid X-Client-Id header. Must be UUID V4 format`
|
|
134
|
+
`Invalid X-Client-Id header. Must be UUID V4 format or integer`
|
|
132
135
|
);
|
|
133
136
|
}
|
|
134
137
|
},
|
|
@@ -182,6 +185,24 @@ export class ApiHeadersValidationMiddleware implements NestMiddleware {
|
|
|
182
185
|
throw new BadRequestException(`X-Now header is invalid: '${now}'`);
|
|
183
186
|
}
|
|
184
187
|
},
|
|
188
|
+
"x-timezone": (context: Context, timezone: string): void => {
|
|
189
|
+
// TODO figure out compiler issue with Intl.supportedValuesOf
|
|
190
|
+
if (timezone) {
|
|
191
|
+
if ((Intl as any).supportedValuesOf) {
|
|
192
|
+
if (
|
|
193
|
+
!(Intl as any).supportedValuesOf("timeZone").includes(timezone)
|
|
194
|
+
) {
|
|
195
|
+
throw new BadRequestException(
|
|
196
|
+
`X-Timezone header is invalid: '${timezone}'`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
} else {
|
|
200
|
+
context.logger.warn(
|
|
201
|
+
"Cannot validate timezone because Intl.supportedValuesOf does not exist"
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
},
|
|
185
206
|
};
|
|
186
207
|
|
|
187
208
|
if (
|
package/src/util/string.util.ts
CHANGED
|
@@ -3,7 +3,7 @@ import * as crypto from "crypto";
|
|
|
3
3
|
export class StringUtil {
|
|
4
4
|
private constructor() {}
|
|
5
5
|
public static isRegexString(str: string) {
|
|
6
|
-
return str.
|
|
6
|
+
return str.substring(0, 1) === "/" && str.substring(str.length - 1) === "/";
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
public static stringMatches(test: string, str: string) {
|
|
@@ -14,7 +14,7 @@ export class StringUtil {
|
|
|
14
14
|
}
|
|
15
15
|
if (this.isRegexString(testTrimmed)) {
|
|
16
16
|
if (
|
|
17
|
-
new RegExp(testTrimmed.
|
|
17
|
+
new RegExp(testTrimmed.substring(1, testTrimmed.length - 2)).test(
|
|
18
18
|
strTrimmed
|
|
19
19
|
)
|
|
20
20
|
) {
|
|
@@ -48,4 +48,8 @@ export class StringUtil {
|
|
|
48
48
|
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
49
49
|
return regex.test(uuid);
|
|
50
50
|
}
|
|
51
|
+
|
|
52
|
+
public static isInteger(str: string): boolean {
|
|
53
|
+
return Number.isInteger(Number(str));
|
|
54
|
+
}
|
|
51
55
|
}
|