@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.
Files changed (53) hide show
  1. package/dist/lib/AlertUtils.js +53 -37
  2. package/dist/lib/AlertUtils.js.map +1 -1
  3. package/dist/lib/ApiError.js +8 -1
  4. package/dist/lib/ApiError.js.map +1 -1
  5. package/dist/lib/CacheUtils.js +23 -0
  6. package/dist/lib/CacheUtils.js.map +1 -0
  7. package/dist/lib/ClassLoader.js +48 -55
  8. package/dist/lib/ClassLoader.js.map +1 -1
  9. package/dist/lib/FileUtils.js +120 -45
  10. package/dist/lib/FileUtils.js.map +1 -1
  11. package/dist/lib/JWTUtils.js +200 -165
  12. package/dist/lib/JWTUtils.js.map +1 -1
  13. package/dist/lib/Logger.js +32 -3
  14. package/dist/lib/Logger.js.map +1 -1
  15. package/dist/lib/MemoryStore.js +8 -6
  16. package/dist/lib/MemoryStore.js.map +1 -1
  17. package/dist/lib/MessagingUtils.js +69 -40
  18. package/dist/lib/MessagingUtils.js.map +1 -1
  19. package/dist/lib/NotificationsUtils.js +26 -8
  20. package/dist/lib/NotificationsUtils.js.map +1 -1
  21. package/dist/lib/OASUtils.js +55 -24
  22. package/dist/lib/OASUtils.js.map +1 -1
  23. package/dist/lib/ObjectFactory.js +144 -67
  24. package/dist/lib/ObjectFactory.js.map +1 -1
  25. package/dist/lib/ObjectUtils.js +18 -5
  26. package/dist/lib/ObjectUtils.js.map +1 -1
  27. package/dist/lib/StringUtils.js +55 -28
  28. package/dist/lib/StringUtils.js.map +1 -1
  29. package/dist/lib/TelemetryUtils.js +30 -4
  30. package/dist/lib/TelemetryUtils.js.map +1 -1
  31. package/dist/lib/UserUtils.js +4 -5
  32. package/dist/lib/UserUtils.js.map +1 -1
  33. package/dist/lib/ValidationUtils.js +10 -3
  34. package/dist/lib/ValidationUtils.js.map +1 -1
  35. package/dist/lib/index.js +1 -0
  36. package/dist/lib/index.js.map +1 -1
  37. package/dist/lib/threads/ThreadPool.js +131 -55
  38. package/dist/lib/threads/ThreadPool.js.map +1 -1
  39. package/dist/types/AlertUtils.d.ts +4 -0
  40. package/dist/types/CacheUtils.d.ts +14 -0
  41. package/dist/types/ClassLoader.d.ts +10 -0
  42. package/dist/types/FileUtils.d.ts +20 -7
  43. package/dist/types/JWTUtils.d.ts +69 -24
  44. package/dist/types/MessagingUtils.d.ts +5 -1
  45. package/dist/types/NotificationsUtils.d.ts +22 -0
  46. package/dist/types/ObjectFactory.d.ts +25 -1
  47. package/dist/types/ObjectUtils.d.ts +4 -0
  48. package/dist/types/StringUtils.d.ts +8 -0
  49. package/dist/types/TelemetryUtils.d.ts +10 -0
  50. package/dist/types/ValidationUtils.d.ts +1 -1
  51. package/dist/types/index.d.ts +1 -0
  52. package/dist/types/threads/ThreadPool.d.ts +30 -1
  53. package/package.json +1 -1
@@ -15,12 +15,21 @@ export class ObjectFactory {
15
15
  constructor(config, logger) {
16
16
  /** A map for string fully qualified class names to their class types. */
17
17
  this.classes = new Map();
18
- /** A map for the unique name to the intance of a particular class type. */
18
+ /** A map for the unique name to the intance of a particular class type.
19
+ *
20
+ * Note that this map is unbounded and only shrinks via an explicit `destroy()` call.
21
+ */
19
22
  this.instances = new Map();
20
23
  /** Cache of prototype-chain metadata keyed by constructor function. WeakMap allows GC of dropped classes. */
21
24
  this._metadataCache = new WeakMap();
22
25
  /** Secondary index: className → first registered instance key, for O(1) getInstance() fallback. */
23
26
  this._firstByClass = new Map();
27
+ /** Tracks in-flight `initialize()` promises, keyed by registry name, for instances currently completing
28
+ * async initialization. `newInstance()` registers an instance in `instances` before its (possibly async)
29
+ * initialization completes, so a concurrent `newInstance()` call for the same name would otherwise find the
30
+ * entry via the instances-map fast path and receive the not-yet-initialized instance synchronously instead
31
+ * of waiting. Consulting this map lets that caller await the same in-flight initialization instead. */
32
+ this._pendingInit = new Map();
24
33
  this.config = config;
25
34
  this.logger = logger ? logger : Logger();
26
35
  // Add ourself so it can be injected/retrieved
@@ -76,13 +85,7 @@ export class ObjectFactory {
76
85
  async destroy(objs) {
77
86
  // If no set of objects was provided we want to destroy everything
78
87
  if (!objs) {
79
- objs = [];
80
- this.instances.forEach((value, key) => {
81
- if (!value.name) {
82
- value.name = key;
83
- }
84
- objs.push(value);
85
- });
88
+ objs = Array.from(this.instances.values());
86
89
  }
87
90
  else {
88
91
  // If only a single object was passed in we need to convert this to an array
@@ -92,7 +95,14 @@ export class ObjectFactory {
92
95
  }
93
96
  // Go through each object and call its destructor, if available
94
97
  for (const obj of objs) {
95
- const name = obj.name ?? obj._name;
98
+ if (!obj) {
99
+ continue;
100
+ }
101
+ // `_name` - the factory's own non-enumerable bookkeeping field set in `newInstance()` - is the only
102
+ // reliable source of an instance's registry key. A business-domain `.name` property (e.g. an
103
+ // `Organization`/`Team` entity that legitimately has a `name` field) must never be consulted here:
104
+ // doing so would resolve to the wrong key and leave the actually-registered instance undeleted.
105
+ const name = obj._name;
96
106
  const meta = this._getOrBuildMetadata(obj);
97
107
  if (meta.destroyMethod) {
98
108
  try {
@@ -112,27 +122,31 @@ export class ObjectFactory {
112
122
  // torn-down zombie via the instances-map fast path. The factory's own bootstrap self-registration
113
123
  // (see the constructor) is left in place since it isn't a user-managed instance.
114
124
  if (name && obj !== this) {
115
- this.instances.delete(name);
116
- for (const [className, firstName] of this._firstByClass) {
117
- if (firstName === name) {
118
- // The destroyed instance was the secondary index's "first" entry for this class.
119
- // Promote another surviving instance of the same class if one exists, otherwise
120
- // drop the entry so getInstance() correctly reports no instance is available.
121
- let replacement;
122
- for (const key of this.instances.keys()) {
123
- if (key.startsWith(`${className}:`)) {
124
- replacement = key;
125
- break;
126
- }
127
- }
128
- if (replacement) {
129
- this._firstByClass.set(className, replacement);
130
- }
131
- else {
132
- this._firstByClass.delete(className);
133
- }
125
+ this._removeInstance(name);
126
+ }
127
+ }
128
+ }
129
+ /** Removes `name` from `instances`. If it was the secondary index's "first" entry for its class, promotes
130
+ * another surviving instance of the same class if one exists, otherwise drops the entry so `getInstance()`
131
+ * correctly reports no instance is available. Shared by `destroy()` and `newInstance()`'s failed-initialization
132
+ * cleanup. */
133
+ _removeInstance(name) {
134
+ this.instances.delete(name);
135
+ for (const [className, firstName] of this._firstByClass) {
136
+ if (firstName === name) {
137
+ let replacement;
138
+ for (const key of this.instances.keys()) {
139
+ if (key.startsWith(`${className}:`)) {
140
+ replacement = key;
141
+ break;
134
142
  }
135
143
  }
144
+ if (replacement) {
145
+ this._firstByClass.set(className, replacement);
146
+ }
147
+ else {
148
+ this._firstByClass.delete(className);
149
+ }
136
150
  }
137
151
  }
138
152
  }
@@ -204,18 +218,11 @@ export class ObjectFactory {
204
218
  }
205
219
  }
206
220
  if (promises.length > 0) {
207
- // Create a wrapper that waits for all init promises to finish before returning
208
- return new Promise(async (resolve, reject) => {
209
- try {
210
- for (const promise of promises) {
211
- await promise;
212
- }
213
- }
214
- catch (err) {
215
- reject(err);
216
- }
217
- resolve(obj);
218
- });
221
+ // Promise.all() attaches a handler to every entry in `promises` up front (synchronously), so even
222
+ // though it settles as soon as the first one rejects, none of the others are ever left unobserved.
223
+ // A sequential for-await loop, by contrast, stops awaiting as soon as one throws, which can orphan a
224
+ // still-pending later @Init promise's eventual rejection as an unhandled rejection.
225
+ return Promise.all(promises).then(() => obj);
219
226
  }
220
227
  else {
221
228
  return obj;
@@ -229,24 +236,48 @@ export class ObjectFactory {
229
236
  */
230
237
  getInitMethods(obj) {
231
238
  const results = [];
239
+ const seen = new Set();
240
+ // Covers metadata defined directly on a plain object instance rather than via a class's prototype chain
241
+ // (e.g. `Reflect.defineMetadata(..., obj, "someMethod")`), which the prototype-chain scan below - by
242
+ // design, since it starts at `Object.getPrototypeOf(obj)` - never visits.
232
243
  for (const member in obj) {
233
- const initialize = Reflect.getMetadata("rrst:initialize", obj, member);
234
- if (initialize) {
244
+ if (Reflect.getMetadata("rrst:initialize", obj, member) && !seen.has(member)) {
245
+ seen.add(member);
235
246
  results.push(obj[member]);
236
247
  }
237
248
  }
238
- let proto = Object.getPrototypeOf(obj);
239
- while (proto) {
240
- for (const member of Object.getOwnPropertyNames(proto)) {
241
- const initialize = Reflect.getMetadata("rrst:initialize", proto, member);
242
- if (initialize) {
243
- results.push(obj[member]);
244
- }
249
+ // Reuses the same cached prototype-chain scan that `initialize()` uses (via `_getOrBuildMetadata`), so
250
+ // this method and the actual `@Init` invocation performed during instantiation can never disagree about
251
+ // which methods on a class are considered `@Init` methods.
252
+ for (const member of this._getOrBuildMetadata(obj).initMethods) {
253
+ if (!seen.has(member)) {
254
+ seen.add(member);
255
+ results.push(obj[member]);
245
256
  }
246
- proto = Object.getPrototypeOf(proto);
247
257
  }
248
258
  return results;
249
259
  }
260
+ /**
261
+ * Derives the class name/fqn used to index `instances`/`classes` from a class type, fully qualified name
262
+ * string, or (defensively) a live instance. Shared by `getInstance`, `newInstance` and `register` so the
263
+ * three can never disagree about which string identifies a given class - a custom `.fqn` (e.g. one assigned
264
+ * by `ClassLoader`) always takes precedence over the bare `.name`, honored consistently everywhere a class
265
+ * identity is resolved.
266
+ *
267
+ * @param typeOrInstance The class type, fqn string, or instance to derive the name from.
268
+ */
269
+ static classNameOf(typeOrInstance) {
270
+ if (typeof typeOrInstance === "string") {
271
+ return typeOrInstance;
272
+ }
273
+ if (!typeOrInstance) {
274
+ return "";
275
+ }
276
+ return (typeOrInstance.fqn ||
277
+ typeOrInstance.name ||
278
+ (typeOrInstance.constructor && typeOrInstance.constructor.name) ||
279
+ "");
280
+ }
250
281
  /**
251
282
  * Returns the object instance with the given unique name. Unique names take the form `<ClassName>:<InstanceName>`.
252
283
  * It is possible to only specifiy the `<ClassName>`, doing so will automatically look for the `<ClassName>:default`
@@ -254,20 +285,13 @@ export class ObjectFactory {
254
285
  * @param nameOrType The unique name or class type of the object to retrieve.
255
286
  * @returns The object instance associated with the given name if found, otherwise `undefined`.
256
287
  */
257
- // TODO: Investigate name vs fqn
258
288
  getInstance(nameOrType) {
259
289
  // Make sure we have a valid type name. Must run before `nameOrType` is dereferenced below, otherwise
260
290
  // `getInstance(null)`/`getInstance(undefined)` throw a raw TypeError instead of this intended error.
261
291
  if (!nameOrType) {
262
292
  throw new Error("No valid nameOrType was specified.");
263
293
  }
264
- let search = "";
265
- if (typeof nameOrType === "string") {
266
- search = nameOrType;
267
- }
268
- else {
269
- search = nameOrType.name ? nameOrType.name : nameOrType.constructor ? nameOrType.constructor.name : search;
270
- }
294
+ const search = ObjectFactory.classNameOf(nameOrType);
271
295
  // First search for the exact name or with `:default`
272
296
  let result = this.instances.get(search.includes(":") ? search : search + ":default");
273
297
  // If we didn't found a result and we weren't given an exact name to search, find the first
@@ -290,18 +314,42 @@ export class ObjectFactory {
290
314
  * @param options The options to use when instantiating the new class object.
291
315
  */
292
316
  newInstance(type, options) {
293
- let name = options?.name || uuidV4();
317
+ const explicitName = options?.name;
318
+ let name = explicitName || uuidV4();
294
319
  const initialize = options?.initialize !== undefined ? options.initialize : true;
295
320
  const args = options?.args || [];
296
- // If an class type was given extract it's fqn
297
- const className = typeof type === "string" ? type : type.fqn || type.name || type.constructor.name;
298
- // Names are namespace specific by type. Prepend the type to the name if not already done.
299
- if (name && !name.includes(className)) {
321
+ // If a class type was given extract its fqn
322
+ const className = ObjectFactory.classNameOf(type);
323
+ // Names are namespace specific by type. Prepend the type to the name if not already done - checked via
324
+ // the literal "ClassName:" prefix rather than mere substring containment, since a caller-supplied name
325
+ // that merely *contains* the class name somewhere (e.g. "MyClassPrimary" for class "MyClass") is not
326
+ // actually namespaced and must still be prefixed, or a later lookup/promotion keyed on that prefix
327
+ // (see `destroy()`) would never find it.
328
+ if (name && !name.startsWith(`${className}:`)) {
300
329
  name = `${className}:${name}`;
301
330
  }
302
- // First check to see if an instance was already created for the given name
303
- if (name && this.instances.has(name)) {
304
- return this.instances.get(name);
331
+ if (explicitName === "default") {
332
+ // `@Inject`'s implicit default name (it always resolves `options.name` to `"default"` when the
333
+ // caller doesn't specify one) - and an explicit `{ name: "default" }` - requests "the" singleton
334
+ // instance of this class. That should fall back to any existing instance of the class, the same
335
+ // fallback `getInstance()` provides, rather than only ever matching the literal "ClassName:default"
336
+ // key. Without this, @Inject would silently create a second, disconnected instance whenever a class
337
+ // had already been instantiated under a different name, breaking singleton reuse and circular-
338
+ // dependency resolution. This intentionally does not apply to a bare `newInstance(Type)` call with
339
+ // no name at all (handled below), which always creates a fresh instance.
340
+ const existingName = this.instances.has(name)
341
+ ? name
342
+ : this._firstByClass.get(className);
343
+ if (existingName && this.instances.has(existingName)) {
344
+ // If the existing instance's async initialization is still in flight, return that same promise
345
+ // rather than the raw, not-yet-initialized instance - otherwise a concurrent caller would resolve
346
+ // immediately with an object whose injected config/logger/dependencies may still be undefined.
347
+ return this._pendingInit.get(existingName) ?? this.instances.get(existingName);
348
+ }
349
+ }
350
+ else if (name && this.instances.has(name)) {
351
+ // First check to see if an instance was already created for the given name
352
+ return this._pendingInit.get(name) ?? this.instances.get(name);
305
353
  }
306
354
  // Make sure we have a valid type name
307
355
  if (!className) {
@@ -345,8 +393,33 @@ export class ObjectFactory {
345
393
  }
346
394
  // Now initialize the object with any injectable defaults. This must happen after we add the instance
347
395
  // to our internal map so that circular dependencies due not cause endless cycles of creation/initialization.
396
+ //
397
+ // If initialization fails - synchronously (e.g. a missing required config path) or asynchronously (e.g. a
398
+ // rejecting `@Init` method) - the instance must not be left behind in `instances`/`_firstByClass`: without
399
+ // this cleanup, every later `newInstance()` call for the same name would silently hand back the same
400
+ // broken, half-initialized object forever via the fast path above, with no error and no way to recover
401
+ // short of the caller knowing to call `destroy()` first.
348
402
  if (initialize) {
349
- return this.initialize(instance);
403
+ try {
404
+ const result = this.initialize(instance);
405
+ if (result instanceof Promise) {
406
+ const tracked = result.then((resolved) => {
407
+ this._pendingInit.delete(name);
408
+ return resolved;
409
+ }, (err) => {
410
+ this._pendingInit.delete(name);
411
+ this._removeInstance(name);
412
+ throw err;
413
+ });
414
+ this._pendingInit.set(name, tracked);
415
+ return tracked;
416
+ }
417
+ return result;
418
+ }
419
+ catch (err) {
420
+ this._removeInstance(name);
421
+ throw err;
422
+ }
350
423
  }
351
424
  return instance;
352
425
  }
@@ -356,6 +429,10 @@ export class ObjectFactory {
356
429
  * @param fqn The fully qualified name of the class to register. If not specified, the class name will be used.
357
430
  */
358
431
  register(clazz, fqn) {
432
+ // Deliberately not `classNameOf()`: unlike `getInstance`/`newInstance`, `register` only ever expects an
433
+ // actual class type, never a live instance, so it must not fall back to `clazz.constructor.name` - doing
434
+ // so would silently "succeed" (registering the instance itself under its class's name) if a caller
435
+ // mistakenly passes an instance instead of a class.
359
436
  const name = fqn ? fqn : clazz.fqn || clazz.name;
360
437
  if (!name) {
361
438
  this.logger.info(`Unable to register class ${name} for ${clazz}/${fqn}`);
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectFactory.js","sourceRoot":"","sources":["../../src/ObjectFactory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObjectFactory.js","sourceRoot":"","sources":["../../src/ObjectFactory.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,10 @@ export class ObjectUtils {
24
24
  * Internal implementation of `deleteScopedProps` that tracks already-visited objects so that circular
25
25
  * references (e.g. ORM-populated relations that reference each other) don't cause infinite recursion.
26
26
  */
27
- static _deleteScopedProps(obj, user, clazz, recurse, visited) {
27
+ static _deleteScopedProps(obj, user, clazz, recurse, visited, depth = 0) {
28
+ if (depth > ObjectUtils.MAX_RECURSE_DEPTH) {
29
+ throw new Error(`Maximum object nesting depth (${ObjectUtils.MAX_RECURSE_DEPTH}) exceeded.`);
30
+ }
28
31
  const objs = Array.isArray(obj) ? obj : [obj];
29
32
  for (const obj of objs) {
30
33
  // Track every object visited (Set works fine with primitives too, so no `typeof` guard is needed)
@@ -47,7 +50,7 @@ export class ObjectUtils {
47
50
  // `typeof null === "object"` in JS, and recursing into `null` would throw inside
48
51
  // `Object.getOwnPropertyNames`.
49
52
  if (recurse && obj[member] !== null && typeof obj[member] === "object") {
50
- ObjectUtils._deleteScopedProps(obj[member], user, undefined, recurse, visited);
53
+ ObjectUtils._deleteScopedProps(obj[member], user, undefined, recurse, visited, depth + 1);
51
54
  }
52
55
  }
53
56
  }
@@ -67,7 +70,10 @@ export class ObjectUtils {
67
70
  * Internal implementation of `validate` that tracks already-visited objects so that circular references
68
71
  * (e.g. ORM-populated relations that reference each other) don't cause infinite recursion.
69
72
  */
70
- static _validate(obj, clazz, recurse, visited) {
73
+ static _validate(obj, clazz, recurse, visited, depth = 0) {
74
+ if (depth > ObjectUtils.MAX_RECURSE_DEPTH) {
75
+ throw new Error(`Maximum object nesting depth (${ObjectUtils.MAX_RECURSE_DEPTH}) exceeded.`);
76
+ }
71
77
  const objs = Array.isArray(obj) ? obj : [obj];
72
78
  for (const obj of objs) {
73
79
  // Track every object visited (Set works fine with primitives too, so no `typeof` guard is needed)
@@ -86,7 +92,10 @@ export class ObjectUtils {
86
92
  throw new Error(`Property ${member} cannot be null.`);
87
93
  }
88
94
  const validator = Reflect.getMetadata("rrst:validator", metadataObj, member);
89
- if (validator && obj[member]) {
95
+ // Matches the nullable convention just above (null/undefined/"" are "absent", everything else -
96
+ // including `0`/`false` - is a real value to validate) rather than gating on plain truthiness,
97
+ // which would silently skip validation for any property whose legitimate value is falsy.
98
+ if (validator && obj[member] !== null && obj[member] !== undefined && obj[member] !== "") {
90
99
  try {
91
100
  obj[member] = validator(obj[member]);
92
101
  }
@@ -98,10 +107,14 @@ export class ObjectUtils {
98
107
  // `typeof null === "object"` in JS, and recursing into `null` would throw inside
99
108
  // `Object.getOwnPropertyNames`.
100
109
  if (recurse && obj[member] !== null && typeof obj[member] === "object") {
101
- ObjectUtils._validate(obj[member], undefined, recurse, visited);
110
+ ObjectUtils._validate(obj[member], undefined, recurse, visited, depth + 1);
102
111
  }
103
112
  }
104
113
  }
105
114
  }
106
115
  }
116
+ /** Maximum object nesting depth `deleteScopedProps`/`validate` will recurse into with `recurse: true`. Guards
117
+ * against stack exhaustion from a pathologically deep (but otherwise valid, e.g. attacker-controlled JSON)
118
+ * object graph - cycle detection alone doesn't bound depth for a non-cyclic but very deep structure. */
119
+ ObjectUtils.MAX_RECURSE_DEPTH = 50;
107
120
  //# sourceMappingURL=ObjectUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectUtils.js","sourceRoot":"","sources":["../../src/ObjectUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObjectUtils.js","sourceRoot":"","sources":["../../src/ObjectUtils.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,16 @@
7
7
  * @author Jean-Philippe Steinmetz
8
8
  */
9
9
  export class StringUtils {
10
+ /**
11
+ * Escapes all regular expression metacharacters in `str` so it can be safely embedded in a `RegExp` pattern
12
+ * and matched as a literal string.
13
+ *
14
+ * @param {string} str The string to escape.
15
+ * @returns {string} The escaped string.
16
+ */
17
+ static escapeRegExp(str) {
18
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
19
+ }
10
20
  /**
11
21
  * Returns a list of all parameters contained within the string. A parameter is a bracket delimited substring
12
22
  * (e.g. /my/{key}/with/{id}).
@@ -42,36 +52,38 @@ export class StringUtils {
42
52
  * @param {object} variables A map of key=>value pairs to search for and replace.
43
53
  */
44
54
  static findAndReplace(contents, variables) {
45
- let output = contents;
46
- // Pre-compile one regex per key (O(n)) rather than creating new RegExp inside nested loops (O(n²)).
47
- // The key is escaped since it may contain regex metacharacters (e.g. from external input), which could
48
- // otherwise be used for regex injection or catastrophic backtracking (ReDoS).
49
- const regexCache = new Map();
50
- for (const key in variables) {
51
- const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
52
- regexCache.set(key, new RegExp("(\\{\\{" + escapedKey + "\\}\\})", "g"));
55
+ const keys = Object.keys(variables);
56
+ // Keys with a null/undefined value are substituted as an empty string so that "{{key}}" placeholders aren't
57
+ // left in the final string. Resolved into a local copy rather than writing back onto `variables` itself,
58
+ // since this is a read-only formatting call from the caller's perspective - mutating their object would
59
+ // silently overwrite any null/undefined sentinel they relied on after this call returns.
60
+ const values = {};
61
+ for (const key of keys) {
62
+ const value = variables[key];
63
+ values[key] = value === null || value === undefined ? "" : value;
53
64
  }
54
- // Go through all variables and perform replacement
55
- for (const key in variables) {
56
- // Perform replacement on the variable value itself. This allows nested variable replacement.
57
- // Uses a null/undefined check rather than a truthiness check so falsy-but-real values (0, false,
58
- // "") are still substituted instead of leaving the literal "{{key}}" placeholder in the output.
59
- if (variables[key] !== undefined && variables[key] !== null) {
60
- let value = variables[key];
61
- for (const key2 in variables) {
62
- if (variables[key2] !== undefined && variables[key2] !== null) {
63
- // A function replacer is used (rather than passing the value directly as the second
64
- // argument) so a value containing `$`-sequences (`$&`, `$$`, `$1`, ...) is inserted
65
- // literally instead of being interpreted by `String.replace` as a special pattern.
66
- const replacement2 = variables[key2];
67
- value = value.toString().replace(regexCache.get(key2), () => replacement2);
68
- }
69
- }
70
- const replacement = value;
71
- output = output.replace(regexCache.get(key), () => replacement);
65
+ // A single combined regex - built once, O(k) - matching any `{{key}}` for any known key, rather than one
66
+ // regex per key checked in a nested O(k²) loop. Each key is escaped since it may contain regex
67
+ // metacharacters (e.g. from external input), which could otherwise be used for regex injection or
68
+ // catastrophic backtracking (ReDoS). Delimiting each alternative with the literal `{{`/`}}` means the
69
+ // matched key text is always recovered exactly, regardless of alternative order or shared prefixes
70
+ // between keys (backtracking still finds the alternative that makes the overall `\{\{...\}\}` match).
71
+ const combined = new RegExp("\\{\\{(" + keys.map((k) => StringUtils.escapeRegExp(k)).join("|") + ")\\}\\}", "g");
72
+ // A function replacer is used (rather than passing the value directly) so a value containing
73
+ // `$`-sequences (`$&`, `$$`, `$1`, ...) is inserted literally instead of being interpreted by
74
+ // `String.replace` as a special pattern.
75
+ const resolve = (key) => values[key].toString();
76
+ // Resolve one level of nested variable references within each value (e.g. a value of "{{adjective}} Dog"
77
+ // has "{{adjective}}" substituted), then use the resolved values for the final pass over `contents`.
78
+ const resolved = new Map();
79
+ for (const key of keys) {
80
+ let value = resolve(key);
81
+ if (value.includes("{{")) {
82
+ value = value.replace(combined, (_full, matchedKey) => resolve(matchedKey));
72
83
  }
84
+ resolved.set(key, value);
73
85
  }
74
- return output;
86
+ return contents.replace(combined, (_full, matchedKey) => resolved.get(matchedKey) ?? _full);
75
87
  }
76
88
  /**
77
89
  * Replaces all instances of the match regex pattern with the contents of the inner regular expression pattern for
@@ -94,7 +106,22 @@ export class StringUtils {
94
106
  : match.global
95
107
  ? match
96
108
  : new RegExp(match.source, match.flags + "g");
97
- return str.replace(global, (_full, capture) => prefix + capture);
109
+ // Whether `global` has at least one capturing group, counted without executing it against `str` (a
110
+ // regex appended with an empty `|` alternative always matches the empty string, so `.exec("")`'s result
111
+ // array length - 1 gives the group count regardless of whether the original pattern would ever match).
112
+ // A plain `string` `match` compiles to a group-less regex, so this is always `false` in that case.
113
+ const hasCaptureGroup = new RegExp(global.source + "|").exec("").length > 1;
114
+ // A function replacer is used, receiving the full match plus every captured group in order. Without
115
+ // checking `hasCaptureGroup` first, a pattern with no capturing group would still receive a value in
116
+ // the "capture" position per String.prototype.replace's callback signature - but that value is the
117
+ // match's numeric *offset*, not `undefined`, silently corrupting the output (e.g. replaceAll("hello
118
+ // world", "o", "_") would embed "4"/"7" from the offsets instead of doing a plain substring
119
+ // replacement). With no capture group there's no "inner" text distinct from the match to preserve, so
120
+ // the whole match is simply replaced by `prefix` - i.e. ordinary search-and-replace semantics.
121
+ return str.replace(global, (...args) => {
122
+ const capture = hasCaptureGroup ? args[1] : "";
123
+ return prefix + capture;
124
+ });
98
125
  }
99
126
  /**
100
127
  * Converts the first character in the given string to be lowercase (e.g. myVariable).
@@ -1 +1 @@
1
- {"version":3,"file":"StringUtils.js","sourceRoot":"","sources":["../../src/StringUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACpB;;;;;;OAMG;IACI,MAAM,CAAC,aAAa,CAAC,GAAW;QACnC,IAAI,OAAO,GAAkB,IAAI,KAAK,EAAE,CAAC;QAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC5C,CAAC,GAAG,GAAG,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACJ,MAAM;gBACV,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM;YACV,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,cAAc,CAAC,QAAgB,EAAE,SAAc;QACzD,IAAI,MAAM,GAAW,QAAQ,CAAC;QAE9B,oGAAoG;QACpG,uGAAuG;QACvG,8EAA8E;QAC9E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC9D,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,SAAS,GAAG,UAAU,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,mDAAmD;QACnD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,6FAA6F;YAC7F,iGAAiG;YACjG,gGAAgG;YAChG,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1D,IAAI,KAAK,GAAW,SAAS,CAAC,GAAG,CAAW,CAAC;gBAC7C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC3B,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC5D,oFAAoF;wBACpF,oFAAoF;wBACpF,mFAAmF;wBACnF,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAW,CAAC;wBAC/C,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;oBAChF,CAAC;gBACL,CAAC;gBAED,MAAM,WAAW,GAAG,KAAK,CAAC;gBAC1B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;YACrE,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,MAAM,CAAC,UAAU,CAAC,GAAW,EAAE,KAAsB,EAAE,MAAc;QACxE,qGAAqG;QACrG,MAAM,MAAM,GACR,OAAO,KAAK,KAAK,QAAQ;YACrB,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;YACxB,CAAC,CAAC,KAAK,CAAC,MAAM;gBACZ,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IACrE,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,WAAW,CAAC,GAAW;QACjC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,YAAY,CAAC,GAAW;QAClC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;CACJ"}
1
+ {"version":3,"file":"StringUtils.js","sourceRoot":"","sources":["../../src/StringUtils.ts"],"names":[],"mappings":"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"}
@@ -21,12 +21,20 @@ export class Event {
21
21
  this.origin = serviceName ? `${serviceName}:${config.get("version")}` : "unknown";
22
22
  this.type = data.type;
23
23
  this.userId = userId;
24
- // Copy all fields in data to this object
25
24
  const tmp = data;
26
- for (let key in tmp) {
27
- // We intentionally exclude only environment/origin/uid/userId from copying here. All others, including timestamp
25
+ const protectedFields = new Set([
26
+ "environment",
27
+ "origin",
28
+ "uid",
29
+ "userId",
30
+ "__proto__",
31
+ "constructor",
32
+ "prototype",
33
+ ]);
34
+ for (const key of Object.keys(tmp)) {
35
+ // We intentionally exclude only these fields from copying here. All others, including timestamp
28
36
  // the caller can override in order to provide more accurate information about the event.
29
- if (key !== "environment" && key !== "origin" && key !== "uid" && key !== "userId") {
37
+ if (!protectedFields.has(key)) {
30
38
  this[key] = tmp[key];
31
39
  }
32
40
  }
@@ -142,6 +150,24 @@ export class EventUtils {
142
150
  EventUtils.listeners.set(type, callbacks);
143
151
  }
144
152
  }
153
+ /**
154
+ * Unregisters a `callback` previously registered via `on()` for the given event `type`. Since `EventUtils` is
155
+ * a long-lived process-wide singleton, any listener registered dynamically (rather than once at startup) must
156
+ * eventually be removed via this method or its closure - and anything it captures - is retained for the life
157
+ * of the process.
158
+ *
159
+ * @param type The type of event the callback was registered for.
160
+ * @param callback The exact function reference passed to `on()`.
161
+ */
162
+ static off(type, callback) {
163
+ const callbacks = EventUtils.listeners.get(type);
164
+ if (callbacks) {
165
+ const idx = callbacks.indexOf(callback);
166
+ if (idx >= 0) {
167
+ callbacks.splice(idx, 1);
168
+ }
169
+ }
170
+ }
145
171
  }
146
172
  EventUtils.initialized = false;
147
173
  EventUtils.listeners = new Map();