@rapidrest/core 1.2.0 → 1.3.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/lib/ClassLoader.js +6 -4
- package/dist/lib/ClassLoader.js.map +1 -1
- package/dist/lib/JWTUtils.js +102 -5
- package/dist/lib/JWTUtils.js.map +1 -1
- package/dist/lib/Logger.js +9 -2
- package/dist/lib/Logger.js.map +1 -1
- package/dist/lib/MessagingUtils.js +27 -22
- package/dist/lib/MessagingUtils.js.map +1 -1
- package/dist/lib/NotificationsUtils.js +4 -2
- package/dist/lib/NotificationsUtils.js.map +1 -1
- package/dist/lib/OASUtils.js +17 -3
- package/dist/lib/OASUtils.js.map +1 -1
- package/dist/lib/ObjectFactory.js +95 -77
- package/dist/lib/ObjectFactory.js.map +1 -1
- package/dist/lib/StringUtils.js +16 -12
- package/dist/lib/StringUtils.js.map +1 -1
- package/dist/lib/TelemetryUtils.js +2 -2
- package/dist/lib/TelemetryUtils.js.map +1 -1
- package/dist/lib/threads/ThreadPool.js +17 -8
- package/dist/lib/threads/ThreadPool.js.map +1 -1
- package/dist/types/JWTUtils.d.ts +22 -3
- package/dist/types/Logger.d.ts +1 -1
- package/dist/types/MessagingUtils.d.ts +4 -0
- package/dist/types/OASUtils.d.ts +2 -0
- package/dist/types/ObjectFactory.d.ts +6 -0
- package/dist/types/TelemetryUtils.d.ts +1 -1
- package/docs/reference/@rapidrest/namespaces/ObjectDecorators/functions/Config.md +1 -1
- package/docs/reference/@rapidrest/namespaces/ObjectDecorators/functions/Destroy.md +1 -1
- package/docs/reference/@rapidrest/namespaces/ObjectDecorators/functions/Init.md +1 -1
- package/docs/reference/@rapidrest/namespaces/ObjectDecorators/functions/Inject.md +1 -1
- package/docs/reference/@rapidrest/namespaces/ObjectDecorators/functions/Logger.md +1 -1
- package/docs/reference/@rapidrest/namespaces/ObjectDecorators/functions/Nullable.md +1 -1
- package/docs/reference/@rapidrest/namespaces/ObjectDecorators/functions/Validator.md +1 -1
- package/docs/reference/@rapidrest/namespaces/ObjectDecorators/type-aliases/ValidatorFunction.md +1 -1
- package/docs/reference/classes/AlertUtils.md +6 -6
- package/docs/reference/classes/ApiError.md +5 -5
- package/docs/reference/classes/ClassLoader.md +34 -34
- package/docs/reference/classes/Event.md +8 -8
- package/docs/reference/classes/EventUtils.md +6 -6
- package/docs/reference/classes/FileUtils.md +5 -5
- package/docs/reference/classes/JWTUtils.md +61 -13
- package/docs/reference/classes/MessagingUtils.md +8 -8
- package/docs/reference/classes/OASUtils.md +22 -8
- package/docs/reference/classes/ObjectFactory.md +14 -14
- package/docs/reference/classes/ObjectUtils.md +2 -2
- package/docs/reference/classes/StringUtils.md +6 -6
- package/docs/reference/classes/ThreadPool.md +11 -11
- package/docs/reference/classes/ThreadWorker.md +6 -6
- package/docs/reference/classes/UserUtils.md +6 -6
- package/docs/reference/classes/ValidationUtils.md +14 -14
- package/docs/reference/enumerations/AlertPriority.md +6 -6
- package/docs/reference/enumerations/JWTUtilsCompressionMethods.md +2 -2
- package/docs/reference/enumerations/WorkerMessageType.md +5 -5
- package/docs/reference/functions/sleep.md +1 -1
- package/docs/reference/interfaces/Alert.md +10 -10
- package/docs/reference/interfaces/AlertAttachment.md +5 -5
- package/docs/reference/interfaces/AlertClose.md +3 -3
- package/docs/reference/interfaces/AlertUtilsAttachmentOptions.md +4 -4
- package/docs/reference/interfaces/AlertUtilsOptions.md +4 -4
- package/docs/reference/interfaces/InstanceOptions.md +4 -4
- package/docs/reference/interfaces/JWTPayload.md +5 -5
- package/docs/reference/interfaces/JWTUser.md +5 -5
- package/docs/reference/interfaces/JWTUtilsConfig.md +4 -4
- package/docs/reference/interfaces/JWTUtilsPayloadKeyOptions.md +5 -5
- package/docs/reference/interfaces/JWTUtilsPayloadOptions.md +3 -3
- package/docs/reference/interfaces/JWTUtilsPayloadPasswordOptions.md +6 -6
- package/docs/reference/interfaces/NewEvent.md +2 -2
- package/docs/reference/interfaces/OriginSettings.md +3 -3
- package/docs/reference/interfaces/SlackConfig.md +4 -4
- package/docs/reference/interfaces/SmtpAuth.md +3 -3
- package/docs/reference/interfaces/SmtpConfig.md +5 -5
- package/docs/reference/interfaces/Template.md +13 -13
- package/docs/reference/interfaces/TemplateMapBase.md +1 -1
- package/docs/reference/interfaces/TwilioConfig.md +4 -4
- package/docs/reference/interfaces/WorkerMessage.md +3 -3
- package/docs/reference/interfaces/WorkerOptions.md +6 -6
- package/docs/reference/type-aliases/BooleanFunc.md +1 -1
- package/docs/reference/type-aliases/TemplateMap.md +1 -1
- package/docs/reference/type-aliases/WorkerCallback.md +1 -1
- package/docs/reference/variables/Logger.md +2 -2
- package/package.json +2 -2
package/dist/lib/ClassLoader.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
///////////////////////////////////////////////////////////////////////////////
|
|
4
4
|
import fs from "fs";
|
|
5
5
|
import path from "path";
|
|
6
|
+
import { pathToFileURL } from "url";
|
|
7
|
+
const sepRegex = new RegExp("\\" + path.sep, "g");
|
|
6
8
|
/**
|
|
7
9
|
* The *ClassLoader* provides a container for dynamically loading classes at runtime using C#/Java style namespaces.
|
|
8
10
|
* Namespaces are determined from the folder structure relative to the root.
|
|
@@ -101,7 +103,7 @@ export class ClassLoader {
|
|
|
101
103
|
*/
|
|
102
104
|
async load(dir = "") {
|
|
103
105
|
let fqp = path.resolve(path.join(this.rootDir, dir));
|
|
104
|
-
let files = fs.
|
|
106
|
+
let files = await fs.promises.readdir(fqp, { withFileTypes: true });
|
|
105
107
|
for (let file of files) {
|
|
106
108
|
// Is the file in the ignore list?
|
|
107
109
|
let skipFile = false;
|
|
@@ -120,13 +122,13 @@ export class ClassLoader {
|
|
|
120
122
|
}
|
|
121
123
|
let relpath = path.relative(this.rootDir, fqp);
|
|
122
124
|
let fullpath = path.resolve(path.join(this.rootDir, relpath, file.name));
|
|
123
|
-
let pkg = relpath.replace(
|
|
125
|
+
let pkg = relpath.replace(sepRegex, ".");
|
|
124
126
|
if (file.isDirectory()) {
|
|
125
127
|
let subdir = path.join(dir, file.name);
|
|
126
128
|
await this.load(subdir);
|
|
127
129
|
}
|
|
128
130
|
else if (this.includeJavaScript && extension.match(/^\.(js|cjs|mjs)$/)) {
|
|
129
|
-
const mod = await import(fullpath);
|
|
131
|
+
const mod = await import(pathToFileURL(fullpath).href);
|
|
130
132
|
if (mod) {
|
|
131
133
|
for (let name in mod) {
|
|
132
134
|
let clazz = mod[name];
|
|
@@ -140,7 +142,7 @@ export class ClassLoader {
|
|
|
140
142
|
}
|
|
141
143
|
}
|
|
142
144
|
else if (this.includeTypeScript && extension.match(/^\.(ts|cts|mts|tsx)$/)) {
|
|
143
|
-
const mod = await import(fullpath);
|
|
145
|
+
const mod = await import(pathToFileURL(fullpath).href);
|
|
144
146
|
if (mod) {
|
|
145
147
|
for (let name in mod) {
|
|
146
148
|
let clazz = mod[name];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClassLoader.js","sourceRoot":"","sources":["../../src/ClassLoader.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,MAAM,OAAO,WAAW;IAWpB;;;;;;;OAOG;IACH,YAAY,OAAe,EAAE,oBAA6B,IAAI,EAAE,oBAA6B,IAAI,EAAE,SAA8B,EAAE;QAlBnI,6CAA6C;QACnC,YAAO,GAAqB,IAAI,GAAG,EAAe,CAAC;QACnD,WAAM,GAAwB,EAAE,CAAC;QAC3C,wDAAwD;QAC9C,sBAAiB,GAAY,IAAI,CAAC;QAC5C,wDAAwD;QAC9C,sBAAiB,GAAY,IAAI,CAAC;QAC5C,qEAAqE;QAC3D,YAAO,GAAW,GAAG,CAAC;QAW5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACI,UAAU;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE;QAC9B,IAAI,GAAG,GAAW,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,KAAK,GAAgB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"ClassLoader.js","sourceRoot":"","sources":["../../src/ClassLoader.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/JWTUtils.js
CHANGED
|
@@ -24,9 +24,21 @@ export class JWTUtils {
|
|
|
24
24
|
*
|
|
25
25
|
* @param config The JWT configuration to use when generating the token.
|
|
26
26
|
* @param user The user to encode into the token's payload.
|
|
27
|
-
* @param data Additional data to include the token's payload.
|
|
28
27
|
*/
|
|
29
|
-
static
|
|
28
|
+
static deriveKey(password, salt) {
|
|
29
|
+
return new Promise((resolve, reject) => crypto.scrypt(password, salt, 24, (err, key) => (err ? reject(err) : resolve(key))));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generates a new JWT token for the given config and user object. The user object must be a valid RapidREST
|
|
33
|
+
* user.
|
|
34
|
+
*
|
|
35
|
+
* @param config The JWT configuration to use when generating the token.
|
|
36
|
+
* @param user The user to encode into the token's payload.
|
|
37
|
+
*/
|
|
38
|
+
static deriveKeySync(password, salt) {
|
|
39
|
+
return crypto.scryptSync(password, salt, 24);
|
|
40
|
+
}
|
|
41
|
+
static async createToken(config, user, data) {
|
|
30
42
|
// Validate the required config options
|
|
31
43
|
if (!config.secret) {
|
|
32
44
|
throw new Error("Invalid configuration provided.");
|
|
@@ -48,7 +60,7 @@ export class JWTUtils {
|
|
|
48
60
|
const pwOtions = payloadOptions;
|
|
49
61
|
const iv = Buffer.from(pwOtions.iv);
|
|
50
62
|
const salt = crypto.randomBytes(16);
|
|
51
|
-
const key =
|
|
63
|
+
const key = await JWTUtils.deriveKey(pwOtions.password, salt);
|
|
52
64
|
const cipher = crypto.createCipheriv(pwOtions.algorithm, key, iv);
|
|
53
65
|
let encrypted = cipher.update(payload.profile, "utf8", "base64");
|
|
54
66
|
encrypted += cipher.final("base64");
|
|
@@ -66,6 +78,90 @@ export class JWTUtils {
|
|
|
66
78
|
}
|
|
67
79
|
return jwt.sign(payload, config.secret, config.options);
|
|
68
80
|
}
|
|
81
|
+
static createTokenSync(config, user, data) {
|
|
82
|
+
// Validate the required config options
|
|
83
|
+
if (!config.secret) {
|
|
84
|
+
throw new Error("Invalid configuration provided.");
|
|
85
|
+
}
|
|
86
|
+
// Validate the user object
|
|
87
|
+
if (!user || !user.uid) {
|
|
88
|
+
throw new Error("Invalid or null user object provided.");
|
|
89
|
+
}
|
|
90
|
+
let payload = { profile: JSON.stringify(user), ...data };
|
|
91
|
+
// Encrypt the profile if desired
|
|
92
|
+
if (config.payload && config.payload.encrypt) {
|
|
93
|
+
const payloadOptions = config.payload;
|
|
94
|
+
if (payloadOptions.public_key) {
|
|
95
|
+
const keyOptions = payloadOptions;
|
|
96
|
+
const encrypted = crypto.publicEncrypt(keyOptions.public_key, Buffer.from(payload.profile));
|
|
97
|
+
payload.profile = encrypted.toString("base64");
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const pwOtions = payloadOptions;
|
|
101
|
+
const iv = Buffer.from(pwOtions.iv);
|
|
102
|
+
const salt = crypto.randomBytes(16);
|
|
103
|
+
const key = JWTUtils.deriveKeySync(pwOtions.password, salt);
|
|
104
|
+
const cipher = crypto.createCipheriv(pwOtions.algorithm, key, iv);
|
|
105
|
+
let encrypted = cipher.update(payload.profile, "utf8", "base64");
|
|
106
|
+
encrypted += cipher.final("base64");
|
|
107
|
+
payload.profile = salt.toString("base64") + ":" + encrypted;
|
|
108
|
+
}
|
|
109
|
+
payload.encryption = true;
|
|
110
|
+
}
|
|
111
|
+
// Compress the profile if desired
|
|
112
|
+
if (config.payload && config.payload.compress) {
|
|
113
|
+
if (config.payload.compress === JWTUtilsCompressionMethods.ZLIB) {
|
|
114
|
+
const buf = Buffer.from(payload.profile, "utf-8");
|
|
115
|
+
payload.profile = zlib.gzipSync(buf).toString("base64");
|
|
116
|
+
payload.compression = "zlib";
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return jwt.sign(payload, config.secret, config.options);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Decodes the given JWT authentication token using the provided configuration. If the token is not valid an
|
|
123
|
+
* error is thrown with the reason. Returns the encoded user object payload upon success.
|
|
124
|
+
*
|
|
125
|
+
* @param config The JWT configuration to use when validating the token.
|
|
126
|
+
* @param token The JWT token to validate.
|
|
127
|
+
* @returns The data encoded in the token's payload.
|
|
128
|
+
*/
|
|
129
|
+
static async decodeToken(config, token) {
|
|
130
|
+
// Decode the token
|
|
131
|
+
let payload = jwt.verify(token, config.secret, config.options);
|
|
132
|
+
// Validate the payload
|
|
133
|
+
if (!payload || !payload.profile) {
|
|
134
|
+
throw new Error("Token is invalid or missing data.");
|
|
135
|
+
}
|
|
136
|
+
// Decompress the payload if desired
|
|
137
|
+
if (payload.compression === JWTUtilsCompressionMethods.ZLIB) {
|
|
138
|
+
const buf = Buffer.from(payload.profile, "base64");
|
|
139
|
+
payload.profile = zlib.gunzipSync(buf).toString("utf-8");
|
|
140
|
+
}
|
|
141
|
+
// Decrypt the payload if desired
|
|
142
|
+
if (payload.encryption && config.payload && config.payload.encrypt) {
|
|
143
|
+
const payloadOptions = config.payload;
|
|
144
|
+
if (payloadOptions.private_key) {
|
|
145
|
+
const keyOptions = payloadOptions;
|
|
146
|
+
const decrypted = crypto.privateDecrypt(keyOptions.private_key, Buffer.from(payload.profile));
|
|
147
|
+
payload.profile = decrypted.toString("utf8");
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const pwOtions = payloadOptions;
|
|
151
|
+
const iv = Buffer.from(pwOtions.iv);
|
|
152
|
+
const [saltB64, profile] = payload.profile.split(":");
|
|
153
|
+
const salt = Buffer.from(saltB64, "base64");
|
|
154
|
+
const key = await JWTUtils.deriveKey(pwOtions.password, salt);
|
|
155
|
+
const decipher = crypto.createDecipheriv(pwOtions.algorithm, key, iv);
|
|
156
|
+
let decrypted = decipher.update(profile, "base64", "utf8");
|
|
157
|
+
decrypted += decipher.final("utf8");
|
|
158
|
+
payload.profile = decrypted;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Make sure the profile is an parsed
|
|
162
|
+
payload.profile = JSON.parse(payload.profile);
|
|
163
|
+
return payload;
|
|
164
|
+
}
|
|
69
165
|
/**
|
|
70
166
|
* Decodes the given JWT authentication token using the provided configuration. If the token is not valid an
|
|
71
167
|
* error is thrown with the reason. Returns the encoded user object payload upon success.
|
|
@@ -74,7 +170,7 @@ export class JWTUtils {
|
|
|
74
170
|
* @param token The JWT token to validate.
|
|
75
171
|
* @returns The data encoded in the token's payload.
|
|
76
172
|
*/
|
|
77
|
-
static
|
|
173
|
+
static decodeTokenSync(config, token) {
|
|
78
174
|
// Decode the token
|
|
79
175
|
let payload = jwt.verify(token, config.secret, config.options);
|
|
80
176
|
// Validate the payload
|
|
@@ -99,7 +195,7 @@ export class JWTUtils {
|
|
|
99
195
|
const iv = Buffer.from(pwOtions.iv);
|
|
100
196
|
const [saltB64, profile] = payload.profile.split(":");
|
|
101
197
|
const salt = Buffer.from(saltB64, "base64");
|
|
102
|
-
const key =
|
|
198
|
+
const key = JWTUtils.deriveKeySync(pwOtions.password, salt);
|
|
103
199
|
const decipher = crypto.createDecipheriv(pwOtions.algorithm, key, iv);
|
|
104
200
|
let decrypted = decipher.update(profile, "base64", "utf8");
|
|
105
201
|
decrypted += decipher.final("utf8");
|
|
@@ -111,4 +207,5 @@ export class JWTUtils {
|
|
|
111
207
|
return payload;
|
|
112
208
|
}
|
|
113
209
|
}
|
|
210
|
+
JWTUtils._parsedKeyCache = new Map();
|
|
114
211
|
//# sourceMappingURL=JWTUtils.js.map
|
package/dist/lib/JWTUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JWTUtils.js","sourceRoot":"","sources":["../../src/JWTUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAC;AA8CxB;;GAEG;AACH,MAAM,CAAN,IAAY,0BAGX;AAHD,WAAY,0BAA0B;IAClC,wCAAwC;IACxC,2CAAa,CAAA;AACjB,CAAC,EAHW,0BAA0B,KAA1B,0BAA0B,QAGrC;AAkFD;;;;GAIG;AACH,MAAM,OAAO,QAAQ;
|
|
1
|
+
{"version":3,"file":"JWTUtils.js","sourceRoot":"","sources":["../../src/JWTUtils.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/Logger.js
CHANGED
|
@@ -7,22 +7,29 @@ const { combine, timestamp, printf } = format;
|
|
|
7
7
|
const logFormat = printf((info) => {
|
|
8
8
|
return `${info.timestamp} ${info.level}: ${info.message}`;
|
|
9
9
|
});
|
|
10
|
+
const _loggerCache = new Map();
|
|
10
11
|
/**
|
|
11
|
-
* Creates a
|
|
12
|
+
* Creates (or retrieves a cached) logger with the specified level and file name to output logs to.
|
|
12
13
|
*
|
|
13
14
|
* @param level The logging level to create the logger with.
|
|
14
15
|
* @param file The name (without an extension) of the file to output logs to.
|
|
15
16
|
*/
|
|
16
17
|
export const Logger = function (level = "debug", file = undefined) {
|
|
18
|
+
const cacheKey = `${level}:${file ?? ""}`;
|
|
19
|
+
if (_loggerCache.has(cacheKey)) {
|
|
20
|
+
return _loggerCache.get(cacheKey);
|
|
21
|
+
}
|
|
17
22
|
const transport = [new transports.Console()];
|
|
18
23
|
if (file) {
|
|
19
24
|
transport.push(new winston.transports.File({ filename: file + "error.log", level: "error" }));
|
|
20
25
|
transport.push(new winston.transports.File({ filename: file + ".log" }));
|
|
21
26
|
}
|
|
22
|
-
|
|
27
|
+
const logger = winston.createLogger({
|
|
23
28
|
level,
|
|
24
29
|
format: combine(format.splat(), format.simple(), format.colorize(), timestamp(), logFormat),
|
|
25
30
|
transports: transport,
|
|
26
31
|
});
|
|
32
|
+
_loggerCache.set(cacheKey, logger);
|
|
33
|
+
return logger;
|
|
27
34
|
};
|
|
28
35
|
//# sourceMappingURL=Logger.js.map
|
package/dist/lib/Logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;AACvC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;AAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE;IACnC,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAQ,UAAS,QAAgB,OAAO,EAAE,OAA2B,SAAS;IAC7F,MAAM,SAAS,GAAU,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,IAAI,IAAI,EAAE,CAAC;QACP,SAAS,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9F,SAAS,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;AACvC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;AAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE;IACnC,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,MAAM,YAAY,GAAqB,IAAI,GAAG,EAAE,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAQ,UAAS,QAAgB,OAAO,EAAE,OAA2B,SAAS;IAC7F,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;IAC1C,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,SAAS,GAAU,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,IAAI,IAAI,EAAE,CAAC;QACP,SAAS,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9F,SAAS,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QAChC,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC;QAC3F,UAAU,EAAE,SAAS;KACxB,CAAC,CAAC;IAEH,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC"}
|
|
@@ -22,6 +22,8 @@ export class MessagingUtils {
|
|
|
22
22
|
this.slackConfigs = [];
|
|
23
23
|
this.twilioConfig = null;
|
|
24
24
|
this.templates = {};
|
|
25
|
+
/** Cache of compiled Handlebars delegates keyed by "<templateName>:<field>". */
|
|
26
|
+
this._compiledTemplates = new Map();
|
|
25
27
|
}
|
|
26
28
|
async init() {
|
|
27
29
|
if (this.slackConfigs.length > 0) {
|
|
@@ -55,6 +57,7 @@ export class MessagingUtils {
|
|
|
55
57
|
if (!this.smtpConfig.host) {
|
|
56
58
|
throw new Error("No host specified in SMTP configuration.");
|
|
57
59
|
}
|
|
60
|
+
this._transporter = nodemailer.createTransport(this.smtpConfig);
|
|
58
61
|
}
|
|
59
62
|
catch (error) {
|
|
60
63
|
this.logger?.error("Unable to setup email notifications");
|
|
@@ -99,6 +102,17 @@ export class MessagingUtils {
|
|
|
99
102
|
tplConfig.text = fs.readFileSync(tplConfig.textPath, { encoding: "utf-8" });
|
|
100
103
|
}
|
|
101
104
|
tplConfig.loaded = true;
|
|
105
|
+
// Compile and cache all Handlebars delegates on first load
|
|
106
|
+
if (tplConfig.text)
|
|
107
|
+
this._compiledTemplates.set(`${name}:text`, handlebars.compile(tplConfig.text));
|
|
108
|
+
if (tplConfig.html)
|
|
109
|
+
this._compiledTemplates.set(`${name}:html`, handlebars.compile(tplConfig.html));
|
|
110
|
+
if (tplConfig.subject)
|
|
111
|
+
this._compiledTemplates.set(`${name}:subject`, handlebars.compile(tplConfig.subject));
|
|
112
|
+
if (tplConfig.sms)
|
|
113
|
+
this._compiledTemplates.set(`${name}:sms`, handlebars.compile(tplConfig.sms));
|
|
114
|
+
if (tplConfig.slack_text)
|
|
115
|
+
this._compiledTemplates.set(`${name}:slack_text`, handlebars.compile(tplConfig.slack_text));
|
|
102
116
|
return tplConfig;
|
|
103
117
|
}
|
|
104
118
|
/**
|
|
@@ -116,28 +130,21 @@ export class MessagingUtils {
|
|
|
116
130
|
if (!tplConfig.enabled || !tplConfig.subject) {
|
|
117
131
|
return undefined;
|
|
118
132
|
}
|
|
119
|
-
//
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
133
|
+
// Render using cached compiled delegates
|
|
134
|
+
const message = this._compiledTemplates.get(`${templateName}:text`)?.(templateVars) ?? null;
|
|
135
|
+
const htmlMessage = this._compiledTemplates.get(`${templateName}:html`)?.(templateVars) ?? null;
|
|
136
|
+
const subject = this._compiledTemplates.get(`${templateName}:subject`)(templateVars);
|
|
137
|
+
// Lazily create the transporter if init() did not succeed in creating it
|
|
138
|
+
if (!this._transporter) {
|
|
139
|
+
const nodemailer = await import("nodemailer");
|
|
140
|
+
this._transporter = nodemailer.createTransport(this.smtpConfig);
|
|
124
141
|
}
|
|
125
|
-
// Create the HTML template
|
|
126
|
-
let htmlMessage = null;
|
|
127
|
-
if (tplConfig.html) {
|
|
128
|
-
const template = handlebars.compile(tplConfig.html);
|
|
129
|
-
htmlMessage = template(templateVars);
|
|
130
|
-
}
|
|
131
|
-
const subjectTemplate = handlebars.compile(tplConfig.subject);
|
|
132
|
-
const subject = subjectTemplate(templateVars);
|
|
133
142
|
// Send the e-mail to the user
|
|
134
|
-
const nodemailer = await import("nodemailer");
|
|
135
|
-
const transporter = nodemailer.createTransport(this.smtpConfig);
|
|
136
143
|
if (!this.templates?.from?.email) {
|
|
137
144
|
this.logger?.warn("Unable to send email missing from.email in message template");
|
|
138
145
|
return undefined;
|
|
139
146
|
}
|
|
140
|
-
const result = await
|
|
147
|
+
const result = await this._transporter.sendMail({
|
|
141
148
|
from: this.templates.from.email,
|
|
142
149
|
...tplConfig.email_options,
|
|
143
150
|
...options,
|
|
@@ -161,9 +168,8 @@ export class MessagingUtils {
|
|
|
161
168
|
if (!tplConfig.enabled || !tplConfig.slack_channel || !tplConfig.slack_text) {
|
|
162
169
|
return undefined;
|
|
163
170
|
}
|
|
164
|
-
//
|
|
165
|
-
const
|
|
166
|
-
const message = template(templateVars);
|
|
171
|
+
// Render using cached compiled delegate
|
|
172
|
+
const message = this._compiledTemplates.get(`${templateName}:slack_text`)(templateVars);
|
|
167
173
|
const result = [];
|
|
168
174
|
// Send the slack message to the desired channel
|
|
169
175
|
for (const app of this.slackApps) {
|
|
@@ -190,9 +196,8 @@ export class MessagingUtils {
|
|
|
190
196
|
if (!tplConfig.enabled || !tplConfig.sms) {
|
|
191
197
|
return undefined;
|
|
192
198
|
}
|
|
193
|
-
//
|
|
194
|
-
const
|
|
195
|
-
const message = template(templateVars);
|
|
199
|
+
// Render using cached compiled delegate
|
|
200
|
+
const message = this._compiledTemplates.get(`${templateName}:sms`)(templateVars);
|
|
196
201
|
// Send the message to the user
|
|
197
202
|
const result = await this.twilio.messages.create({
|
|
198
203
|
from: this.templates.from.sms,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessagingUtils.js","sourceRoot":"","sources":["../../src/MessagingUtils.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,MAAM,IAAI,CAAC;AAkEpB;;GAEG;AACH,MAAM,OAAO,cAAc;IAA3B;QACc,cAAS,GAAU,EAAE,CAAC;QAEtB,iBAAY,GAAU,EAAE,CAAC;QAK3B,iBAAY,GAAQ,IAAI,CAAC;QAEzB,cAAS,GAAgB,EAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"MessagingUtils.js","sourceRoot":"","sources":["../../src/MessagingUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,13 +37,15 @@ export class NotificationUtils {
|
|
|
37
37
|
* @param {string} data The contents of the message to send to the room or user.
|
|
38
38
|
*/
|
|
39
39
|
sendMessage(uids, type, action, data) {
|
|
40
|
+
// Serialize once regardless of how many recipients
|
|
41
|
+
const payload = JSON.stringify({ type, action, data });
|
|
40
42
|
if (Array.isArray(uids)) {
|
|
41
43
|
for (const uid of uids) {
|
|
42
|
-
void this.redis?.publish(uid,
|
|
44
|
+
void this.redis?.publish(uid, payload);
|
|
43
45
|
}
|
|
44
46
|
}
|
|
45
47
|
else {
|
|
46
|
-
void this.redis?.publish(uids,
|
|
48
|
+
void this.redis?.publish(uids, payload);
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationsUtils.js","sourceRoot":"","sources":["../../src/NotificationsUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAI1B;;;;OAIG;IACH,YAAY,KAAU;QAClB,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACI,gBAAgB,CAAC,IAAS,EAAE,MAAc,EAAE,IAAS;QACxD,KAAK,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;;;;;;OAOG;IACI,WAAW,CAAC,IAAuB,EAAE,IAAY,EAAE,MAAc,EAAE,IAAS;QAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"NotificationsUtils.js","sourceRoot":"","sources":["../../src/NotificationsUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAI1B;;;;OAIG;IACH,YAAY,KAAU;QAClB,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACI,gBAAgB,CAAC,IAAS,EAAE,MAAc,EAAE,IAAS;QACxD,KAAK,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;;;;;;OAOG;IACI,WAAW,CAAC,IAAuB,EAAE,IAAY,EAAE,MAAc,EAAE,IAAS;QAC/E,mDAAmD;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACL,CAAC;CACJ"}
|
package/dist/lib/OASUtils.js
CHANGED
|
@@ -7,6 +7,9 @@ import path from "path";
|
|
|
7
7
|
import { Axios } from "axios";
|
|
8
8
|
import YAML from "js-yaml";
|
|
9
9
|
const logger = Logger();
|
|
10
|
+
/** Cache of parsed spec objects keyed by file path or URL, to avoid repeated I/O and parsing. */
|
|
11
|
+
const _specCache = new Map();
|
|
12
|
+
const _urlRegex = /^https?:\/\/[a-zA-Z0-9]*\.?[a-z].*/;
|
|
10
13
|
export class OASUtils {
|
|
11
14
|
/**
|
|
12
15
|
* Gets the datastore definition with the specified name.
|
|
@@ -85,9 +88,10 @@ export class OASUtils {
|
|
|
85
88
|
if (!spec.components || !spec.components.schemas) {
|
|
86
89
|
throw new Error("Invalid specification. No schemas found.");
|
|
87
90
|
}
|
|
88
|
-
//
|
|
91
|
+
// Compile regex once before the loop; escape special chars to handle schema names with dots/brackets
|
|
92
|
+
const nameRegex = new RegExp(name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i");
|
|
89
93
|
for (const schemaName in spec.components.schemas) {
|
|
90
|
-
if (
|
|
94
|
+
if (nameRegex.test(schemaName)) {
|
|
91
95
|
return spec.components.schemas[schemaName];
|
|
92
96
|
}
|
|
93
97
|
}
|
|
@@ -158,6 +162,9 @@ export class OASUtils {
|
|
|
158
162
|
* @returns {Promise<any>} A promise whose result will be the loaded OpenAPI Specification as an object.
|
|
159
163
|
*/
|
|
160
164
|
static async loadSpec(file) {
|
|
165
|
+
if (_specCache.has(file)) {
|
|
166
|
+
return _specCache.get(file);
|
|
167
|
+
}
|
|
161
168
|
let apiSpec = null;
|
|
162
169
|
if (fs.existsSync(file)) {
|
|
163
170
|
let fileType = path.extname(file);
|
|
@@ -174,7 +181,7 @@ export class OASUtils {
|
|
|
174
181
|
throw new Error("Unsupported file type: " + fileType);
|
|
175
182
|
}
|
|
176
183
|
}
|
|
177
|
-
else if (
|
|
184
|
+
else if (_urlRegex.test(file)) {
|
|
178
185
|
const axios = new Axios({ baseURL: file });
|
|
179
186
|
const response = await axios.get(file);
|
|
180
187
|
if (response && response.data) {
|
|
@@ -201,7 +208,14 @@ export class OASUtils {
|
|
|
201
208
|
else {
|
|
202
209
|
throw new Error("File not found: " + file);
|
|
203
210
|
}
|
|
211
|
+
if (apiSpec !== null) {
|
|
212
|
+
_specCache.set(file, apiSpec);
|
|
213
|
+
}
|
|
204
214
|
return apiSpec;
|
|
205
215
|
}
|
|
216
|
+
/** Clears the spec parse cache. Useful in tests to force re-loading of specs. */
|
|
217
|
+
static clearSpecCache() {
|
|
218
|
+
_specCache.clear();
|
|
219
|
+
}
|
|
206
220
|
}
|
|
207
221
|
//# sourceMappingURL=OASUtils.js.map
|
package/dist/lib/OASUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OASUtils.js","sourceRoot":"","sources":["../../src/OASUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAExB,MAAM,OAAO,QAAQ;IACjB;;;;;;OAMG;IACI,MAAM,CAAC,YAAY,CAAC,IAAS,EAAE,IAAY;QAC9C,IAAI,MAAM,GAAQ,SAAS,CAAC;QAE5B,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACrD,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,SAAS,CAAC,IAAS,EAAE,IAAY;QAC3C,IAAI,MAAM,GAAQ,IAAI,CAAC;QAEvB,IAAI,IAAI,EAAE,CAAC;YACP,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAClB,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAClB,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;YAED,IAAI,KAAK,GAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACjB,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,GAAG,SAAS,CAAC;QACvB,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,WAAW,CAAC,GAAQ;QAC9B,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAChB,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/B,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACpB,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;wBACrC,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBACjC,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,kBAAkB,CAAC,GAAQ;QACrC,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,SAAS,CAAC,IAAS,EAAE,IAAY;QAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAChE,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"OASUtils.js","sourceRoot":"","sources":["../../src/OASUtils.ts"],"names":[],"mappings":"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"}
|