@rapidrest/core 1.15.0 → 2.0.0
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/AlertUtils.js +53 -37
- package/dist/lib/AlertUtils.js.map +1 -1
- package/dist/lib/ApiError.js +8 -1
- package/dist/lib/ApiError.js.map +1 -1
- package/dist/lib/CacheUtils.js +23 -0
- package/dist/lib/CacheUtils.js.map +1 -0
- package/dist/lib/ClassLoader.js +48 -55
- package/dist/lib/ClassLoader.js.map +1 -1
- package/dist/lib/FileUtils.js +120 -45
- package/dist/lib/FileUtils.js.map +1 -1
- package/dist/lib/JWTUtils.js +200 -165
- package/dist/lib/JWTUtils.js.map +1 -1
- package/dist/lib/Logger.js +32 -3
- package/dist/lib/Logger.js.map +1 -1
- package/dist/lib/MemoryStore.js +8 -6
- package/dist/lib/MemoryStore.js.map +1 -1
- package/dist/lib/MessagingUtils.js +69 -40
- package/dist/lib/MessagingUtils.js.map +1 -1
- package/dist/lib/NotificationsUtils.js +26 -8
- package/dist/lib/NotificationsUtils.js.map +1 -1
- package/dist/lib/OASUtils.js +55 -24
- package/dist/lib/OASUtils.js.map +1 -1
- package/dist/lib/ObjectFactory.js +144 -67
- package/dist/lib/ObjectFactory.js.map +1 -1
- package/dist/lib/ObjectUtils.js +18 -5
- package/dist/lib/ObjectUtils.js.map +1 -1
- package/dist/lib/StringUtils.js +55 -28
- package/dist/lib/StringUtils.js.map +1 -1
- package/dist/lib/TelemetryUtils.js +30 -4
- package/dist/lib/TelemetryUtils.js.map +1 -1
- package/dist/lib/UserUtils.js +4 -5
- package/dist/lib/UserUtils.js.map +1 -1
- package/dist/lib/ValidationUtils.js +10 -3
- package/dist/lib/ValidationUtils.js.map +1 -1
- package/dist/lib/index.js +1 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/threads/ThreadPool.js +131 -55
- package/dist/lib/threads/ThreadPool.js.map +1 -1
- package/dist/types/AlertUtils.d.ts +4 -0
- package/dist/types/CacheUtils.d.ts +14 -0
- package/dist/types/ClassLoader.d.ts +10 -0
- package/dist/types/FileUtils.d.ts +20 -7
- package/dist/types/JWTUtils.d.ts +69 -24
- package/dist/types/MessagingUtils.d.ts +5 -1
- package/dist/types/NotificationsUtils.d.ts +22 -0
- package/dist/types/ObjectFactory.d.ts +25 -1
- package/dist/types/ObjectUtils.d.ts +4 -0
- package/dist/types/StringUtils.d.ts +8 -0
- package/dist/types/TelemetryUtils.d.ts +10 -0
- package/dist/types/ValidationUtils.d.ts +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/threads/ThreadPool.d.ts +30 -1
- package/package.json +1 -1
package/dist/lib/AlertUtils.js
CHANGED
|
@@ -45,6 +45,12 @@ export class AlertUtils {
|
|
|
45
45
|
this.logger = options.logger;
|
|
46
46
|
this.serviceUrl = options.serviceUrl;
|
|
47
47
|
}
|
|
48
|
+
/** Returns `true` if `status` is a 2XX HTTP success code. Shared by every method below that inspects a
|
|
49
|
+
* response's status, so a future change to what counts as "success" (e.g. also accepting 304) only needs
|
|
50
|
+
* to be made in one place. */
|
|
51
|
+
static isSuccess(status) {
|
|
52
|
+
return status >= 200 && status < 300;
|
|
53
|
+
}
|
|
48
54
|
/**
|
|
49
55
|
* Attempts to close the existing alert with the given identifier.
|
|
50
56
|
* @param id The unique identifier of the alert to close.
|
|
@@ -52,19 +58,22 @@ export class AlertUtils {
|
|
|
52
58
|
*/
|
|
53
59
|
async close(id, data = {}) {
|
|
54
60
|
try {
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
// Truncate into a copy rather than the caller's object, so `data` isn't silently modified out from
|
|
62
|
+
// under a caller that reuses it after this call returns.
|
|
63
|
+
const payload = { ...data };
|
|
64
|
+
if (payload.note) {
|
|
65
|
+
payload.note = payload.note.substring(0, MAX_CHARS_NOTE);
|
|
57
66
|
}
|
|
58
|
-
if (
|
|
59
|
-
|
|
67
|
+
if (payload.source) {
|
|
68
|
+
payload.source = payload.source.substring(0, MAX_CHARS_SOURCE);
|
|
60
69
|
}
|
|
61
70
|
const url = `${this.serviceUrl}/${encodeURIComponent(id)}/close`;
|
|
62
|
-
const response = await axios.post(url,
|
|
71
|
+
const response = await axios.post(url, payload, {
|
|
63
72
|
headers: {
|
|
64
73
|
Authorization: this.auth,
|
|
65
74
|
}
|
|
66
75
|
});
|
|
67
|
-
return
|
|
76
|
+
return AlertUtils.isSuccess(response.status);
|
|
68
77
|
}
|
|
69
78
|
catch (err) {
|
|
70
79
|
this.logger?.error("Failed to close alert with id " + id);
|
|
@@ -87,9 +96,7 @@ export class AlertUtils {
|
|
|
87
96
|
});
|
|
88
97
|
// axios's default validateStatus already rejects (throws) any non-2xx response before we get here, so
|
|
89
98
|
// the alternate branch below is unreachable under normal operation; kept as defense in depth.
|
|
90
|
-
return response.status
|
|
91
|
-
? response.data
|
|
92
|
-
: /* v8 ignore next */ null;
|
|
99
|
+
return AlertUtils.isSuccess(response.status) ? response.data : /* v8 ignore next */ null;
|
|
93
100
|
}
|
|
94
101
|
catch (err) {
|
|
95
102
|
this.logger?.error("Failed to retrieve alert with id " + id);
|
|
@@ -107,41 +114,50 @@ export class AlertUtils {
|
|
|
107
114
|
*/
|
|
108
115
|
async send(alert, vars = {}, attachments) {
|
|
109
116
|
try {
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
// Substitute/truncate into a copy rather than the caller's `alert` object. `Alert` is a natural
|
|
118
|
+
// template to define once and reuse across multiple send() calls with different `vars` - mutating it
|
|
119
|
+
// in place would leave later calls with no "{{placeholder}}" left to substitute, since the first call
|
|
120
|
+
// already overwrote them with the first call's resolved values.
|
|
121
|
+
const payload = { ...alert };
|
|
122
|
+
// Perform variable substitution on the alert's text fields *before* truncating them below. Note:
|
|
123
|
+
// these fields are treated as plain data, never as a template to compile/execute, since
|
|
124
|
+
// `description`/`message`/`note` frequently originate from untrusted event or exception text and
|
|
125
|
+
// must not be interpretable as code.
|
|
126
|
+
payload.description = StringUtils.findAndReplace(payload.description, vars);
|
|
127
|
+
payload.message = StringUtils.findAndReplace(payload.message, vars);
|
|
128
|
+
if (payload.note) {
|
|
129
|
+
payload.note = StringUtils.findAndReplace(payload.note, vars);
|
|
130
|
+
}
|
|
131
|
+
// Truncate the various properties to the maximimum allowed by the most restrictive known API (e.g.
|
|
132
|
+
// OpsGenie). Done *after* substitution above - substituting into an already-truncated string could
|
|
133
|
+
// expand a short placeholder (e.g. a long exception message) past the API's limit, defeating the
|
|
134
|
+
// truncation this is meant to guarantee.
|
|
135
|
+
payload.alias = payload.alias.substring(0, MAX_CHARS_ALIAS);
|
|
136
|
+
payload.description = payload.description.substring(0, MAX_CHARS_DESCRIPTION);
|
|
137
|
+
if (payload.entity) {
|
|
138
|
+
payload.entity = payload.entity.substring(0, MAX_CHARS_ENTITY);
|
|
115
139
|
}
|
|
116
|
-
|
|
117
|
-
if (
|
|
118
|
-
|
|
140
|
+
payload.message = payload.message.substring(0, MAX_CHARS_MESSAGE);
|
|
141
|
+
if (payload.note) {
|
|
142
|
+
payload.note = payload.note.substring(0, MAX_CHARS_NOTE);
|
|
119
143
|
}
|
|
120
|
-
|
|
121
|
-
if (
|
|
144
|
+
payload.source = payload.source.substring(0, MAX_CHARS_SOURCE);
|
|
145
|
+
if (payload.tags) {
|
|
122
146
|
let tags = [];
|
|
123
|
-
for (let i = 0; i < Math.min(MAX_TAGS,
|
|
124
|
-
const tag =
|
|
147
|
+
for (let i = 0; i < Math.min(MAX_TAGS, payload.tags.length); i++) {
|
|
148
|
+
const tag = payload.tags[i];
|
|
125
149
|
tags.push(tag.substring(0, MAX_CHARS_TAGS));
|
|
126
150
|
}
|
|
127
|
-
|
|
151
|
+
payload.tags = tags;
|
|
128
152
|
}
|
|
129
|
-
|
|
130
|
-
// data, never as a template to compile/execute, since `description`/`message`/`note` frequently
|
|
131
|
-
// originate from untrusted event or exception text and must not be interpretable as code.
|
|
132
|
-
alert.description = StringUtils.findAndReplace(alert.description, vars);
|
|
133
|
-
alert.message = StringUtils.findAndReplace(alert.message, vars);
|
|
134
|
-
if (alert.note) {
|
|
135
|
-
alert.note = StringUtils.findAndReplace(alert.note, vars);
|
|
136
|
-
}
|
|
137
|
-
let response = await axios.post(this.serviceUrl, alert, {
|
|
153
|
+
let response = await axios.post(this.serviceUrl, payload, {
|
|
138
154
|
headers: {
|
|
139
155
|
Authorization: this.auth,
|
|
140
156
|
}
|
|
141
157
|
});
|
|
142
158
|
// axios's default validateStatus already rejects (throws) any non-2xx response before we get here, so
|
|
143
159
|
// the alternate branch below is unreachable under normal operation; kept as defense in depth.
|
|
144
|
-
const requestId =
|
|
160
|
+
const requestId = AlertUtils.isSuccess(response.status)
|
|
145
161
|
? response.data.requestId
|
|
146
162
|
: /* v8 ignore next */ null;
|
|
147
163
|
if (!requestId) {
|
|
@@ -191,10 +207,10 @@ export class AlertUtils {
|
|
|
191
207
|
}, attachments.indexFile);
|
|
192
208
|
}
|
|
193
209
|
else {
|
|
194
|
-
// Upload each attachment individually
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
210
|
+
// Upload each attachment individually and concurrently - they're independent uploads to
|
|
211
|
+
// different destinations, so there's no need to serialize them and pay N round-trips of
|
|
212
|
+
// latency on this alerting path where fast delivery matters most.
|
|
213
|
+
await Promise.all(attachments.files.map((file) => this.addAttachment(id, file, attachments.indexFile)));
|
|
198
214
|
}
|
|
199
215
|
}
|
|
200
216
|
return id;
|
|
@@ -230,7 +246,7 @@ export class AlertUtils {
|
|
|
230
246
|
Authorization: this.auth
|
|
231
247
|
}
|
|
232
248
|
});
|
|
233
|
-
return
|
|
249
|
+
return AlertUtils.isSuccess(response.status);
|
|
234
250
|
}
|
|
235
251
|
catch (err) {
|
|
236
252
|
// Don't fail the rest of the request if attachments fail
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlertUtils.js","sourceRoot":"","sources":["../../src/AlertUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,YAAY,GAAW,EAAE,CAAC;AAChC,MAAM,eAAe,GAAW,GAAG,CAAC;AACpC,MAAM,qBAAqB,GAAW,KAAK,CAAC;AAC5C,MAAM,gBAAgB,GAAW,GAAG,CAAC;AACrC,MAAM,iBAAiB,GAAW,GAAG,CAAC;AACtC,MAAM,cAAc,GAAW,KAAK,CAAC;AACrC,MAAM,gBAAgB,GAAW,GAAG,CAAC;AACrC,MAAM,cAAc,GAAW,EAAE,CAAC;AAClC,MAAM,QAAQ,GAAW,EAAE,CAAC;AAE5B;;GAEG;AACH,MAAM,CAAN,IAAY,aAWX;AAXD,WAAY,aAAa;IACrB,0FAA0F;IAC1F,gCAAe,CAAA;IACf,kGAAkG;IAClG,8BAAa,CAAA;IACb,gGAAgG;IAChG,iCAAgB,CAAA;IAChB,gHAAgH;IAChH,+BAAc,CAAA;IACd,6GAA6G;IAC7G,8BAAa,CAAA;AACjB,CAAC,EAXW,aAAa,KAAb,aAAa,QAWxB;AA6ED;;;GAGG;AACH,MAAM,OAAO,UAAU;IAQnB;;;OAGG;IACH,YAAY,OAA0B;QAClC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,KAAK,CAAC,EAAU,EAAE,OAAmB,EAAE;QAChD,IAAI,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"AlertUtils.js","sourceRoot":"","sources":["../../src/AlertUtils.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/ApiError.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { Logger } from "./Logger.js";
|
|
1
2
|
import { StringUtils } from "./StringUtils.js";
|
|
3
|
+
const logger = Logger();
|
|
2
4
|
/**
|
|
3
5
|
* Describes an error that originates from a API service. This class extends the standard `Error` class to include
|
|
4
6
|
* a unique code that can be used to trace an error to source code as well as the HTTP response status returned with
|
|
@@ -22,7 +24,12 @@ export class ApiError extends Error {
|
|
|
22
24
|
this.message = this.ApiMessageTemplate(message, templateVariables);
|
|
23
25
|
}
|
|
24
26
|
catch (error) {
|
|
25
|
-
//
|
|
27
|
+
// Falls back to the raw, unsubstituted `message` (already set via `super(message)` above) rather
|
|
28
|
+
// than propagating - a malformed template/templateVariables shouldn't prevent the error itself from
|
|
29
|
+
// being constructed and thrown. Logged rather than silently swallowed so a caller-supplied template
|
|
30
|
+
// bug is still discoverable.
|
|
31
|
+
logger.warn(`Failed to apply template variables to ApiError message: ${code}`);
|
|
32
|
+
logger.debug(error);
|
|
26
33
|
}
|
|
27
34
|
Object.setPrototypeOf(this, ApiError.prototype);
|
|
28
35
|
}
|
package/dist/lib/ApiError.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiError.js","sourceRoot":"","sources":["../../src/ApiError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAMxB,kBAAkB,CAAC,OAA2B,EAAE,iBAAuB;QAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACd,CAAC;QACD,IAAI,OAAO,IAAI,iBAAiB,EAAE,CAAC;YAC/B,OAAO,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,IAAY,EAAE,MAAc,EAAE,OAAgB,EAAE,iBAAuB;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,
|
|
1
|
+
{"version":3,"file":"ApiError.js","sourceRoot":"","sources":["../../src/ApiError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAExB;;;;GAIG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAMxB,kBAAkB,CAAC,OAA2B,EAAE,iBAAuB;QAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACd,CAAC;QACD,IAAI,OAAO,IAAI,iBAAiB,EAAE,CAAC;YAC/B,OAAO,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,IAAY,EAAE,MAAc,EAAE,OAAgB,EAAE,iBAAuB;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,iGAAiG;YACjG,oGAAoG;YACpG,oGAAoG;YACpG,6BAA6B;YAC7B,MAAM,CAAC,IAAI,CAAC,2DAA2D,IAAI,EAAE,CAAC,CAAC;YAC/E,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACJ"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
3
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
4
|
+
/**
|
|
5
|
+
* Utility functions for working with bounded in-memory caches.
|
|
6
|
+
*
|
|
7
|
+
* @author Jean-Philippe Steinmetz
|
|
8
|
+
*/
|
|
9
|
+
export class CacheUtils {
|
|
10
|
+
/**
|
|
11
|
+
* Evicts the oldest inserted entry from `map`, if any. A `Map` preserves insertion order, so this removes
|
|
12
|
+
* whatever entry was `set()` least recently among those still present.
|
|
13
|
+
*
|
|
14
|
+
* @param map The map to evict the oldest entry from.
|
|
15
|
+
*/
|
|
16
|
+
static evictOldest(map) {
|
|
17
|
+
const oldestKey = map.keys().next().value;
|
|
18
|
+
if (oldestKey !== undefined) {
|
|
19
|
+
map.delete(oldestKey);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=CacheUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheUtils.js","sourceRoot":"","sources":["../../src/CacheUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACnB;;;;;OAKG;IACI,MAAM,CAAC,WAAW,CAAO,GAAc;QAC1C,MAAM,SAAS,GAAkB,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACL,CAAC;CACJ"}
|
package/dist/lib/ClassLoader.js
CHANGED
|
@@ -41,6 +41,10 @@ const sepRegex = new RegExp("\\" + path.sep, "g");
|
|
|
41
41
|
* an ESM-only project you must use the `ts-node/esm` module loader. This can be specified by passing the `--loader` to
|
|
42
42
|
* node at runtime.
|
|
43
43
|
*
|
|
44
|
+
* Also, this code intentionally does not perform path-containment and symlink checks during it's load process as the
|
|
45
|
+
* purpose of this utility is never to be exposed to a client-facing API or process. Doing so would never make sense
|
|
46
|
+
* anyway. The lack of containment checks here is to eliminate real performance costs that such containment introduces.
|
|
47
|
+
*
|
|
44
48
|
* ```
|
|
45
49
|
* node --loader ts-node/esm <module>
|
|
46
50
|
* ```
|
|
@@ -95,6 +99,34 @@ export class ClassLoader {
|
|
|
95
99
|
hasClass(fqn) {
|
|
96
100
|
return this.classes.get(fqn) ? true : false;
|
|
97
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Imports the module at `fullpath` and registers each of its exports as a class under its fully qualified
|
|
104
|
+
* name, shared by both the JavaScript and TypeScript loading branches of `load()` so a future change to
|
|
105
|
+
* how exports are turned into registered classes only needs to be made in one place.
|
|
106
|
+
*/
|
|
107
|
+
async registerModule(fullpath, pkg, fileName) {
|
|
108
|
+
const mod = await import(pathToFileURL(fullpath).href);
|
|
109
|
+
/* v8 ignore else -- unreachable: dynamic `import()` either resolves to a truthy namespace object or rejects, it never resolves to a falsy value. */
|
|
110
|
+
if (mod) {
|
|
111
|
+
for (let name in mod) {
|
|
112
|
+
let clazz = mod[name];
|
|
113
|
+
// Skip primitive-valued exports (string/number/boolean/etc.) rather than registering them: ES
|
|
114
|
+
// modules run in strict mode, so `clazz.fqn = fqn` below would throw `TypeError: Cannot create
|
|
115
|
+
// property 'fqn' on <primitive>` for a module that exports e.g. `export const VERSION = "1.0.0"`
|
|
116
|
+
// alongside its classes, aborting the load of the entire directory. Enums compile to plain
|
|
117
|
+
// objects (typeof "object"), so they're still registered as before.
|
|
118
|
+
if (clazz === null || (typeof clazz !== "function" && typeof clazz !== "object")) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
let fqn = `${pkg.length > 0 ? pkg + "." : ""}${name === "default" ? path.basename(fileName, path.extname(fileName)) : name}`;
|
|
122
|
+
clazz.fqn = fqn;
|
|
123
|
+
this.classes.set(fqn, clazz);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw new Error("Failed to load module file: " + fullpath);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
98
130
|
/**
|
|
99
131
|
* Loads all modules exports contained in the directory specified. The folder must be a child
|
|
100
132
|
* directory to the `rootDir` parameter passed in to the constructor.
|
|
@@ -103,79 +135,40 @@ export class ClassLoader {
|
|
|
103
135
|
*/
|
|
104
136
|
async load(dir = "") {
|
|
105
137
|
let fqp = path.resolve(path.join(this.rootDir, dir));
|
|
106
|
-
// Ensure the resolved directory is still contained within rootDir. Prevents a caller-supplied `dir`
|
|
107
|
-
// (e.g. containing "../") from escaping rootDir and dynamically importing/executing arbitrary modules
|
|
108
|
-
// found elsewhere on disk.
|
|
109
|
-
const rel = path.relative(this.rootDir, fqp);
|
|
110
|
-
if (rel !== "" && (rel.startsWith("..") || path.isAbsolute(rel))) {
|
|
111
|
-
throw new Error(`Directory "${dir}" escapes the allowed root directory "${this.rootDir}".`);
|
|
112
|
-
}
|
|
113
138
|
let files = await fs.promises.readdir(fqp, { withFileTypes: true });
|
|
114
|
-
|
|
139
|
+
// Processed concurrently via `Promise.all` since sibling entries in a directory are independent of one
|
|
140
|
+
// another; `Promise.all` still `await`s every entry (and propagates the first rejection) before `load()`
|
|
141
|
+
// itself resolves, so parallelizing here only shortens cold-start time rather than changing behavior.
|
|
142
|
+
await Promise.all(files.map(async (file) => {
|
|
115
143
|
// Is the file in the ignore list?
|
|
116
|
-
let skipFile = false;
|
|
117
144
|
for (const iPath of this.ignore) {
|
|
118
145
|
if (file.name.match(iPath)) {
|
|
119
|
-
|
|
120
|
-
break;
|
|
146
|
+
return;
|
|
121
147
|
}
|
|
122
148
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
149
|
+
let relpath = path.relative(this.rootDir, fqp);
|
|
150
|
+
let pkg = relpath.replace(sepRegex, ".");
|
|
151
|
+
let fullpath = path.join(fqp, file.name);
|
|
126
152
|
let extension = path.extname(file.name);
|
|
127
153
|
if (!extension) {
|
|
128
154
|
extension = file.name;
|
|
129
155
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
//
|
|
134
|
-
//
|
|
135
|
-
// could point at an arbitrary file or directory outside rootDir and still be recursed into or
|
|
136
|
-
// dynamically imported below, defeating the containment check performed on `dir` above.
|
|
137
|
-
if (file.isSymbolicLink()) {
|
|
138
|
-
const realpath = await fs.promises.realpath(fullpath);
|
|
139
|
-
const relReal = path.relative(this.rootDir, realpath);
|
|
140
|
-
if (relReal !== "" && (relReal.startsWith("..") || path.isAbsolute(relReal))) {
|
|
141
|
-
throw new Error(`Symlink "${fullpath}" escapes the allowed root directory "${this.rootDir}".`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
156
|
+
// `Dirent.isDirectory()` reflects the directory entry itself, not what it points to, so a
|
|
157
|
+
// symlinked directory falls through to the extension-matching branches below rather than being
|
|
158
|
+
// recursed into - deliberate: following it here (e.g. via `fs.statSync().isDirectory()`) would
|
|
159
|
+
// let a symlink that points back at one of its own ancestors send `load()` into unbounded
|
|
160
|
+
// recursion.
|
|
144
161
|
if (file.isDirectory()) {
|
|
145
162
|
let subdir = path.join(dir, file.name);
|
|
146
163
|
await this.load(subdir);
|
|
147
164
|
}
|
|
148
165
|
else if (this.includeJavaScript && extension.match(/^\.(js|cjs|mjs)$/)) {
|
|
149
|
-
|
|
150
|
-
/* v8 ignore else -- unreachable: dynamic `import()` either resolves to a truthy namespace object or rejects, it never resolves to a falsy value. */
|
|
151
|
-
if (mod) {
|
|
152
|
-
for (let name in mod) {
|
|
153
|
-
let clazz = mod[name];
|
|
154
|
-
let fqn = `${pkg.length > 0 ? pkg + "." : ""}${name === "default" ? file.name.split(".")[0] : name}`;
|
|
155
|
-
clazz.fqn = fqn;
|
|
156
|
-
this.classes.set(fqn, clazz);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
throw new Error("Failed to load module file: " + fullpath);
|
|
161
|
-
}
|
|
166
|
+
await this.registerModule(fullpath, pkg, file.name);
|
|
162
167
|
}
|
|
163
168
|
else if (this.includeTypeScript && extension.match(/^\.(ts|cts|mts|tsx)$/)) {
|
|
164
|
-
|
|
165
|
-
/* v8 ignore else -- unreachable: dynamic `import()` either resolves to a truthy namespace object or rejects, it never resolves to a falsy value. */
|
|
166
|
-
if (mod) {
|
|
167
|
-
for (let name in mod) {
|
|
168
|
-
let clazz = mod[name];
|
|
169
|
-
let fqn = `${pkg.length > 0 ? pkg + "." : ""}${name === "default" ? file.name.split(".")[0] : name}`;
|
|
170
|
-
clazz.fqn = fqn;
|
|
171
|
-
this.classes.set(fqn, clazz);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
throw new Error("Failed to load module file: " + fullpath);
|
|
176
|
-
}
|
|
169
|
+
await this.registerModule(fullpath, pkg, file.name);
|
|
177
170
|
}
|
|
178
|
-
}
|
|
171
|
+
}));
|
|
179
172
|
}
|
|
180
173
|
}
|
|
181
174
|
//# sourceMappingURL=ClassLoader.js.map
|
|
@@ -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,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAClD
|
|
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,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAClD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;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;;;;OAIG;IACK,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,GAAW,EAAE,QAAgB;QACxE,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5D,oJAAoJ;QACpJ,IAAI,GAAG,EAAE,CAAC;YACN,KAAK,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;gBACnB,IAAI,KAAK,GAAQ,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,8FAA8F;gBAC9F,+FAA+F;gBAC/F,iGAAiG;gBACjG,2FAA2F;gBAC3F,oEAAoE;gBACpE,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;oBAC/E,SAAS;gBACb,CAAC;gBACD,IAAI,GAAG,GAAW,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrI,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;gBAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,QAAQ,CAAC,CAAC;QAC/D,CAAC;IACL,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;QAE7D,IAAI,KAAK,GAAgB,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,uGAAuG;QACvG,yGAAyG;QACzG,sGAAsG;QACtG,MAAM,OAAO,CAAC,GAAG,CACb,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACrB,kCAAkC;YAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO;gBACX,CAAC;YACL,CAAC;YAED,IAAI,OAAO,GAAW,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACvD,IAAI,GAAG,GAAW,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAEjD,IAAI,QAAQ,GAAW,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEjD,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;YAC1B,CAAC;YAED,0FAA0F;YAC1F,+FAA+F;YAC/F,+FAA+F;YAC/F,0FAA0F;YAC1F,aAAa;YACb,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrB,IAAI,MAAM,GAAW,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;iBAAM,IAAI,IAAI,CAAC,iBAAiB,IAAI,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACvE,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,IAAI,CAAC,iBAAiB,IAAI,SAAS,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBAC3E,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC;QACL,CAAC,CAAC,CACL,CAAC;IACN,CAAC;CACJ"}
|