@rapidrest/service-core 1.8.0 → 2.1.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 (87) hide show
  1. package/dist/lib/ApiErrors.js +10 -0
  2. package/dist/lib/ApiErrors.js.map +1 -1
  3. package/dist/lib/BackgroundServiceManager.js +51 -9
  4. package/dist/lib/BackgroundServiceManager.js.map +1 -1
  5. package/dist/lib/EventListenerManager.js +35 -2
  6. package/dist/lib/EventListenerManager.js.map +1 -1
  7. package/dist/lib/NetUtils.js +215 -21
  8. package/dist/lib/NetUtils.js.map +1 -1
  9. package/dist/lib/ObjectFactory.js +7 -2
  10. package/dist/lib/ObjectFactory.js.map +1 -1
  11. package/dist/lib/RateLimiter.js.map +1 -1
  12. package/dist/lib/Server.js +121 -80
  13. package/dist/lib/Server.js.map +1 -1
  14. package/dist/lib/auth/AuthMiddleware.js +160 -100
  15. package/dist/lib/auth/AuthMiddleware.js.map +1 -1
  16. package/dist/lib/auth/JWTStrategy.js +6 -2
  17. package/dist/lib/auth/JWTStrategy.js.map +1 -1
  18. package/dist/lib/database/ConnectionManager.js +47 -1
  19. package/dist/lib/database/ConnectionManager.js.map +1 -1
  20. package/dist/lib/database/DatabaseErrors.js +88 -0
  21. package/dist/lib/database/DatabaseErrors.js.map +1 -0
  22. package/dist/lib/database/MongoRepository.js +31 -3
  23. package/dist/lib/database/MongoRepository.js.map +1 -1
  24. package/dist/lib/database/MongoSchemaSync.js +7 -1
  25. package/dist/lib/database/MongoSchemaSync.js.map +1 -1
  26. package/dist/lib/database/TypeOrmSupport.js +56 -6
  27. package/dist/lib/database/TypeOrmSupport.js.map +1 -1
  28. package/dist/lib/database/index.js +1 -0
  29. package/dist/lib/database/index.js.map +1 -1
  30. package/dist/lib/decorators/PersistenceDecorators.js +23 -0
  31. package/dist/lib/decorators/PersistenceDecorators.js.map +1 -1
  32. package/dist/lib/decorators/RouteDecorators.js +4 -2
  33. package/dist/lib/decorators/RouteDecorators.js.map +1 -1
  34. package/dist/lib/http/bun/BunRouter.js +119 -9
  35. package/dist/lib/http/bun/BunRouter.js.map +1 -1
  36. package/dist/lib/http/index.js +1 -0
  37. package/dist/lib/http/index.js.map +1 -1
  38. package/dist/lib/http/session/sessionMiddleware.js +62 -14
  39. package/dist/lib/http/session/sessionMiddleware.js.map +1 -1
  40. package/dist/lib/http/types.js +10 -1
  41. package/dist/lib/http/types.js.map +1 -1
  42. package/dist/lib/http/uWS/Adapters.js +31 -13
  43. package/dist/lib/http/uWS/Adapters.js.map +1 -1
  44. package/dist/lib/http/uWS/Router.js +80 -16
  45. package/dist/lib/http/uWS/Router.js.map +1 -1
  46. package/dist/lib/http/uWS/WebSocket.js +4 -2
  47. package/dist/lib/http/uWS/WebSocket.js.map +1 -1
  48. package/dist/lib/models/ModelUtils.js +910 -227
  49. package/dist/lib/models/ModelUtils.js.map +1 -1
  50. package/dist/lib/models/RepoUtils.js +863 -266
  51. package/dist/lib/models/RepoUtils.js.map +1 -1
  52. package/dist/lib/routes/BaseAdminRoute.js +5 -4
  53. package/dist/lib/routes/BaseAdminRoute.js.map +1 -1
  54. package/dist/lib/routes/BasePushRoute.js +104 -40
  55. package/dist/lib/routes/BasePushRoute.js.map +1 -1
  56. package/dist/lib/routes/CRUDRoute.js +31 -17
  57. package/dist/lib/routes/CRUDRoute.js.map +1 -1
  58. package/dist/lib/routes/RouteUtils.js +120 -29
  59. package/dist/lib/routes/RouteUtils.js.map +1 -1
  60. package/dist/lib/security/ACLUtils.js +170 -34
  61. package/dist/lib/security/ACLUtils.js.map +1 -1
  62. package/dist/types/ApiErrors.d.ts +10 -0
  63. package/dist/types/BackgroundServiceManager.d.ts +6 -0
  64. package/dist/types/EventListenerManager.d.ts +4 -0
  65. package/dist/types/NetUtils.d.ts +65 -6
  66. package/dist/types/RateLimiter.d.ts +4 -3
  67. package/dist/types/Server.d.ts +33 -2
  68. package/dist/types/auth/AuthMiddleware.d.ts +35 -4
  69. package/dist/types/database/ConnectionManager.d.ts +18 -0
  70. package/dist/types/database/DatabaseErrors.d.ts +26 -0
  71. package/dist/types/database/MongoRepository.d.ts +21 -2
  72. package/dist/types/database/index.d.ts +1 -0
  73. package/dist/types/decorators/PersistenceDecorators.d.ts +31 -0
  74. package/dist/types/decorators/RouteDecorators.d.ts +4 -2
  75. package/dist/types/http/bun/BunRouter.d.ts +23 -2
  76. package/dist/types/http/index.d.ts +2 -1
  77. package/dist/types/http/session/sessionMiddleware.d.ts +14 -4
  78. package/dist/types/http/types.d.ts +40 -0
  79. package/dist/types/http/uWS/Adapters.d.ts +10 -1
  80. package/dist/types/http/uWS/Router.d.ts +15 -2
  81. package/dist/types/models/ModelUtils.d.ts +301 -47
  82. package/dist/types/models/RepoUtils.d.ts +240 -4
  83. package/dist/types/routes/BasePushRoute.d.ts +5 -0
  84. package/dist/types/routes/CRUDRoute.d.ts +10 -0
  85. package/dist/types/routes/RouteUtils.d.ts +37 -1
  86. package/dist/types/security/ACLUtils.d.ts +68 -7
  87. package/package.json +1 -1
@@ -17,6 +17,11 @@ export var ApiErrors;
17
17
  ApiErrors["OBJECT_ID_MISMATCH"] = "api-013";
18
18
  ApiErrors["SEARCH_INVALID_RANGE"] = "api-014";
19
19
  ApiErrors["SEARCH_INVALID_ME_REFERENCE"] = "api-015";
20
+ ApiErrors["SEARCH_UNKNOWN_OPERATOR"] = "api-016";
21
+ ApiErrors["SEARCH_INVALID_OPERAND_TYPE"] = "api-017";
22
+ ApiErrors["SEARCH_INVALID_SORT_FIELD"] = "api-018";
23
+ ApiErrors["SEARCH_QUERY_TOO_COMPLEX"] = "api-019";
24
+ ApiErrors["SEARCH_OPERATOR_NOT_SUPPORTED"] = "api-020";
20
25
  ApiErrors["BULK_CREATE_FAILURE"] = "api-021";
21
26
  ApiErrors["BULK_UPDATE_FAILURE"] = "api-022";
22
27
  ApiErrors["AUTH_REQUIRED"] = "api-100";
@@ -40,6 +45,11 @@ export var ApiErrorMessages;
40
45
  ApiErrorMessages["OBJECT_ID_MISMATCH"] = "The object provided does not match the identifier given.";
41
46
  ApiErrorMessages["SEARCH_INVALID_RANGE"] = "Invalid range value: '{{value}}'. Expected 2 arguments, got {{length}}";
42
47
  ApiErrorMessages["SEARCH_INVALID_ME_REFERENCE"] = "Use of the `me` reference requires authentication.";
48
+ ApiErrorMessages["SEARCH_UNKNOWN_OPERATOR"] = "Unknown search operator '{{operator}}'. Use eq() to search for a literal value shaped like an operator call.";
49
+ ApiErrorMessages["SEARCH_INVALID_OPERAND_TYPE"] = "Invalid value '{{value}}' for field '{{field}}'. Expected a {{type}}.";
50
+ ApiErrorMessages["SEARCH_INVALID_SORT_FIELD"] = "Cannot sort by unknown field '{{field}}'.";
51
+ ApiErrorMessages["SEARCH_QUERY_TOO_COMPLEX"] = "The search query is too deeply nested or has too many conditions.";
52
+ ApiErrorMessages["SEARCH_OPERATOR_NOT_SUPPORTED"] = "The '{{operator}}' operator is not supported by the configured datasource.";
43
53
  ApiErrorMessages["BULK_CREATE_FAILURE"] = "Failed to create one or more objects.";
44
54
  ApiErrorMessages["BULK_UPDATE_FAILURE"] = "Failed to update one or more objects.";
45
55
  ApiErrorMessages["AUTH_REQUIRED"] = "Authorization is required to access this resource.";
@@ -1 +1 @@
1
- {"version":3,"file":"ApiErrors.js","sourceRoot":"","sources":["../../src/ApiErrors.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wEAAwE;AACxE,mCAAmC;AACnC,+EAA+E;AAC/E;;GAEG;AACH,MAAM,CAAN,IAAY,SAkBX;AAlBD,WAAY,SAAS;IACjB,gCAAmB,CAAA;IACnB,uCAA0B,CAAA;IAC1B,wCAA2B,CAAA;IAC3B,0CAA6B,CAAA;IAC7B,kCAAqB,CAAA;IACrB,0CAA6B,CAAA;IAC7B,+CAAkC,CAAA;IAClC,2CAA8B,CAAA;IAC9B,6CAAgC,CAAA;IAChC,oDAAuC,CAAA;IACvC,4CAA+B,CAAA;IAC/B,4CAA+B,CAAA;IAC/B,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,gDAAmC,CAAA;IACnC,mDAAsC,CAAA;IACtC,gDAAmC,CAAA;AACvC,CAAC,EAlBW,SAAS,KAAT,SAAS,QAkBpB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,gBAkBX;AAlBD,WAAY,gBAAgB;IACxB,gFAA4D,CAAA;IAC5D,uGAAmF,CAAA;IACnF,mEAA+C,CAAA;IAC/C,4FAAwE,CAAA;IACxE,2FAAuE,CAAA;IACvE,yFAAqE,CAAA;IACrE,sGAAkF,CAAA;IAClF,mGAA+E,CAAA;IAC/E,mHAA+F,CAAA;IAC/F,sGAAkF,CAAA;IAClF,iFAA6D,CAAA;IAC7D,iFAA6D,CAAA;IAC7D,wFAAoE,CAAA;IACpE,4EAAwD,CAAA;IACxD,qGAAiF,CAAA;IACjF,wGAAoF,CAAA;IACpF,kFAA8D,CAAA;AAClE,CAAC,EAlBW,gBAAgB,KAAhB,gBAAgB,QAkB3B"}
1
+ {"version":3,"file":"ApiErrors.js","sourceRoot":"","sources":["../../src/ApiErrors.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wEAAwE;AACxE,mCAAmC;AACnC,+EAA+E;AAC/E;;GAEG;AACH,MAAM,CAAN,IAAY,SAuBX;AAvBD,WAAY,SAAS;IACjB,gCAAmB,CAAA;IACnB,uCAA0B,CAAA;IAC1B,wCAA2B,CAAA;IAC3B,0CAA6B,CAAA;IAC7B,kCAAqB,CAAA;IACrB,0CAA6B,CAAA;IAC7B,+CAAkC,CAAA;IAClC,2CAA8B,CAAA;IAC9B,6CAAgC,CAAA;IAChC,oDAAuC,CAAA;IACvC,gDAAmC,CAAA;IACnC,oDAAuC,CAAA;IACvC,kDAAqC,CAAA;IACrC,iDAAoC,CAAA;IACpC,sDAAyC,CAAA;IACzC,4CAA+B,CAAA;IAC/B,4CAA+B,CAAA;IAC/B,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,gDAAmC,CAAA;IACnC,mDAAsC,CAAA;IACtC,gDAAmC,CAAA;AACvC,CAAC,EAvBW,SAAS,KAAT,SAAS,QAuBpB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,gBAuBX;AAvBD,WAAY,gBAAgB;IACxB,gFAA4D,CAAA;IAC5D,uGAAmF,CAAA;IACnF,mEAA+C,CAAA;IAC/C,4FAAwE,CAAA;IACxE,2FAAuE,CAAA;IACvE,yFAAqE,CAAA;IACrE,sGAAkF,CAAA;IAClF,mGAA+E,CAAA;IAC/E,mHAA+F,CAAA;IAC/F,sGAAkF,CAAA;IAClF,4JAAwI,CAAA;IACxI,yHAAqG,CAAA;IACrG,2FAAuE,CAAA;IACvE,kHAA8F,CAAA;IAC9F,gIAA4G,CAAA;IAC5G,iFAA6D,CAAA;IAC7D,iFAA6D,CAAA;IAC7D,wFAAoE,CAAA;IACpE,4EAAwD,CAAA;IACxD,qGAAiF,CAAA;IACjF,wGAAoF,CAAA;IACpF,kFAA8D,CAAA;AAClE,CAAC,EAvBW,gBAAgB,KAAhB,gBAAgB,QAuB3B"}
@@ -89,35 +89,49 @@ export class BackgroundServiceManager {
89
89
  // Look for the class definition with the given name if not already given
90
90
  clazz = clazz ? clazz : this.classes[serviceName];
91
91
  if (clazz) {
92
+ let service = undefined;
93
+ let startedService = undefined;
92
94
  try {
93
95
  this.logger.info("Starting service " + serviceName + "...");
94
96
  // Instantiate the service class
95
- const service = await this.objectFactory.newInstance(clazz, {
97
+ const instance = await this.objectFactory.newInstance(clazz, {
96
98
  name: serviceName,
97
99
  initialize: true,
98
100
  args: [...args],
99
101
  });
100
- this.services[serviceName] = service;
102
+ service = instance;
103
+ this.services[serviceName] = instance;
104
+ // Reject an invalid schedule before starting the service. `scheduleJob()` returns `null` for a spec
105
+ // it can't parse, which would otherwise only surface after `start()` had already run, leaving a
106
+ // started service that nothing ever stops.
107
+ if (instance.schedule && !BackgroundServiceManager.isValidSchedule(instance.schedule)) {
108
+ throw new Error(`Invalid schedule '${instance.schedule}' for background service '${serviceName}'.`);
109
+ }
101
110
  // Initialize the service
102
- await service.start();
111
+ await instance.start();
112
+ startedService = instance;
103
113
  // Schedule the service for background execution. Guard against overlapping runs: node-schedule
104
114
  // fires on every tick regardless of whether the previous invocation's `run()` has settled, so a
105
115
  // service whose `run()` occasionally outlasts its own interval would otherwise get a second,
106
116
  // concurrent invocation racing the first against the same external resources/DB writes.
107
- if (service.schedule) {
108
- const job = schedule.scheduleJob(service.schedule, async () => {
117
+ if (instance.schedule) {
118
+ const scheduled = instance;
119
+ const job = schedule.scheduleJob(scheduled.schedule, async () => {
109
120
  if (this.runningJobs.has(serviceName)) {
110
121
  this.logger.warn(`Background service '${serviceName}' is still running from a previous scheduled tick; skipping this invocation to avoid an overlapping run.`);
111
122
  return;
112
123
  }
113
124
  this.runningJobs.add(serviceName);
114
125
  try {
115
- await service.run();
126
+ await scheduled.run();
116
127
  }
117
128
  finally {
118
129
  this.runningJobs.delete(serviceName);
119
130
  }
120
131
  });
132
+ if (!job) {
133
+ throw new Error(`Failed to schedule background service '${serviceName}' with schedule '${scheduled.schedule}'.`);
134
+ }
121
135
  job.on("error", (err) => {
122
136
  this.logger.error(`Background service '${serviceName}' failed during a scheduled run.`);
123
137
  this.logger.debug(err);
@@ -126,17 +140,45 @@ export class BackgroundServiceManager {
126
140
  }
127
141
  else {
128
142
  // One time execution services are run once and then immediately cleaned up
129
- await service.run();
130
- await service.stop();
131
- await this.objectFactory.destroy(service);
143
+ await instance.run();
144
+ startedService = undefined;
145
+ await instance.stop();
146
+ await this.objectFactory.destroy(instance);
132
147
  }
133
148
  }
134
149
  catch (err) {
135
150
  this.logger.error(`Failed to start service: ${serviceName}`);
136
151
  this.logger.debug(err);
152
+ // Don't leave a half-started service behind: `stopAll()` only stops services that have a job.
153
+ if (this.jobs[serviceName]) {
154
+ this.jobs[serviceName].cancel(false);
155
+ delete this.jobs[serviceName];
156
+ }
157
+ if (startedService) {
158
+ try {
159
+ await startedService.stop();
160
+ }
161
+ catch (stopErr) {
162
+ this.logger.debug(stopErr);
163
+ }
164
+ }
165
+ if (this.services[serviceName] === service) {
166
+ delete this.services[serviceName];
167
+ }
137
168
  }
138
169
  }
139
170
  }
171
+ /**
172
+ * Returns `true` if node-schedule accepts the given schedule, without scheduling anything.
173
+ *
174
+ * @param spec The cron string, date or recurrence rule to validate.
175
+ */
176
+ static isValidSchedule(spec) {
177
+ const probe = new schedule.Job("rrst:schedule-probe");
178
+ const valid = probe.schedule(spec);
179
+ probe.cancel();
180
+ return valid;
181
+ }
140
182
  /**
141
183
  * Stops all currently active background services that are owned by the manager.
142
184
  */
@@ -1 +1 @@
1
- {"version":3,"file":"BackgroundServiceManager.js","sourceRoot":"","sources":["../../src/BackgroundServiceManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BackgroundServiceManager.js","sourceRoot":"","sources":["../../src/BackgroundServiceManager.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
10
  import { ObjectDecorators } from "@rapidrest/core";
11
+ import { attachRedisErrorHandler } from "./database/ConnectionManager.js";
11
12
  const { Config, Destroy, Init, Logger } = ObjectDecorators;
12
13
  /**
13
14
  * The `EventListenerManager` is responsible for managing event handlers and processing of incoming
@@ -26,7 +27,13 @@ export class EventListenerManager {
26
27
  // dispatch — avoids recompiling a pattern from scratch for every incoming event.
27
28
  this.typePatterns = new Map();
28
29
  this.objectFactory = objectFactory;
29
- this.redis = redis.duplicate();
30
+ // `@Logger` is only injected after construction, so the listener resolves the logger lazily.
31
+ const logger = {
32
+ error: (msg) => this.logger?.error(msg),
33
+ debug: (msg) => this.logger?.debug(msg),
34
+ info: (msg) => this.logger?.info(msg),
35
+ };
36
+ this.redis = attachRedisErrorHandler(redis.duplicate(), logger, "events (EventListenerManager)");
30
37
  }
31
38
  async init() {
32
39
  // `redis.duplicate()` (see the constructor) returns a fresh, unconnected client
@@ -80,10 +87,36 @@ export class EventListenerManager {
80
87
  }
81
88
  }
82
89
  }
90
+ /**
91
+ * Unsubscribes from all channels, closes this manager's own (duplicated) redis client and removes all
92
+ * registered handlers. Safe to call more than once.
93
+ */
83
94
  async destroy() {
84
- await this.redis.unsubscribe(...this.channels);
85
95
  this.handlers.clear();
86
96
  this.typePatterns.clear();
97
+ if (!this.redis.isOpen) {
98
+ return;
99
+ }
100
+ try {
101
+ if (this.channels.length > 0) {
102
+ await this.redis.unsubscribe(this.channels);
103
+ }
104
+ }
105
+ catch (err) {
106
+ this.logger?.debug(`EventManager: Failed to unsubscribe from pubsub channels: ${err}`);
107
+ }
108
+ try {
109
+ // `destroy()` closes the socket immediately and never waits on (or retries against) an unreachable server.
110
+ if (typeof this.redis.destroy === "function") {
111
+ this.redis.destroy();
112
+ }
113
+ else {
114
+ await this.redis.disconnect();
115
+ }
116
+ }
117
+ catch (err) {
118
+ this.logger?.debug(`EventManager: Failed to close the redis client: ${err}`);
119
+ }
87
120
  }
88
121
  /**
89
122
  * Handler function for events that arrive from redis.
@@ -1 +1 @@
1
- {"version":3,"file":"EventListenerManager.js","sourceRoot":"","sources":["../../src/EventListenerManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EventListenerManager.js","sourceRoot":"","sources":["../../src/EventListenerManager.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,9 @@
3
3
  // SPDX-License-Identifier: MPL-2.0
4
4
  ///////////////////////////////////////////////////////////////////////////////
5
5
  import { promises as dns } from "dns";
6
+ import { BlockList, isIP } from "net";
7
+ /** Maximum number of distinct `trustedProxies` lists whose compiled `BlockList` is cached at once. */
8
+ const MAX_CACHED_PROXY_LISTS = 32;
6
9
  /**
7
10
  * Provides common utilities and functions for working with networking related problems.
8
11
  *
@@ -40,16 +43,220 @@ export class NetUtils {
40
43
  }
41
44
  return result;
42
45
  }
46
+ /**
47
+ * Parses and canonicalizes a single IP address so that two spellings of the same address always compare
48
+ * equal. Accepts an optional port (`1.2.3.4:80`, `[::1]:80`), brackets and an IPv6 zone id, all of which are
49
+ * removed.
50
+ *
51
+ * - IPv4 addresses are returned unchanged (e.g. `10.0.0.1`).
52
+ * - IPv4-mapped IPv6 addresses are unmapped to plain IPv4, in either spelling: `::ffff:127.0.0.1` and uWS's
53
+ * fully expanded `0000:0000:0000:0000:0000:ffff:7f00:0001` both become `127.0.0.1`.
54
+ * - Other IPv6 addresses are returned in RFC 5952 form: lowercase, no leading zeros, and the longest run of
55
+ * two or more zero groups compressed to `::` (e.g. `2001:0DB8:0:0:0:0:0:1` becomes `2001:db8::1`).
56
+ *
57
+ * @param value The address to normalize.
58
+ * @returns The canonical address, or `undefined` if `value` is not a valid IPv4/IPv6 address.
59
+ */
60
+ static normalizeIP(value) {
61
+ if (typeof value !== "string") {
62
+ return undefined;
63
+ }
64
+ let addr = value.trim();
65
+ const bracketed = addr.match(/^\[([^\]]+)\](?::\d{1,5})?$/);
66
+ if (bracketed) {
67
+ addr = bracketed[1];
68
+ }
69
+ else {
70
+ const ipv4WithPort = addr.match(/^(\d{1,3}(?:\.\d{1,3}){3}):\d{1,5}$/);
71
+ if (ipv4WithPort) {
72
+ addr = ipv4WithPort[1];
73
+ }
74
+ }
75
+ const zoneIdx = addr.indexOf("%");
76
+ if (zoneIdx >= 0) {
77
+ addr = addr.slice(0, zoneIdx);
78
+ }
79
+ const family = isIP(addr);
80
+ if (family === 4) {
81
+ return addr;
82
+ }
83
+ else if (family !== 6) {
84
+ return undefined;
85
+ }
86
+ const groups = NetUtils.expandIPv6(addr);
87
+ if (groups[5] === 0xffff && groups.slice(0, 5).every((g) => g === 0)) {
88
+ return `${groups[6] >> 8}.${groups[6] & 0xff}.${groups[7] >> 8}.${groups[7] & 0xff}`;
89
+ }
90
+ return NetUtils.compressIPv6(groups);
91
+ }
92
+ /** Expands an already validated IPv6 address (no zone id) into its eight 16-bit groups. */
93
+ static expandIPv6(addr) {
94
+ const toGroups = (part) => {
95
+ if (part.length === 0) {
96
+ return [];
97
+ }
98
+ const result = [];
99
+ for (const piece of part.split(":")) {
100
+ if (piece.includes(".")) {
101
+ // Embedded IPv4 tail, e.g. `::ffff:1.2.3.4`
102
+ const [a, b, c, d] = piece.split(".").map((n) => parseInt(n, 10));
103
+ result.push((a << 8) | b, (c << 8) | d);
104
+ }
105
+ else {
106
+ result.push(parseInt(piece, 16));
107
+ }
108
+ }
109
+ return result;
110
+ };
111
+ const sep = addr.indexOf("::");
112
+ if (sep < 0) {
113
+ return toGroups(addr);
114
+ }
115
+ const head = toGroups(addr.slice(0, sep));
116
+ const tail = toGroups(addr.slice(sep + 2));
117
+ return [...head, ...new Array(8 - head.length - tail.length).fill(0), ...tail];
118
+ }
119
+ /** Formats eight 16-bit groups as an RFC 5952 IPv6 address. */
120
+ static compressIPv6(groups) {
121
+ let bestStart = -1;
122
+ let bestLen = 0;
123
+ for (let i = 0; i < groups.length;) {
124
+ if (groups[i] !== 0) {
125
+ i++;
126
+ continue;
127
+ }
128
+ let j = i;
129
+ while (j < groups.length && groups[j] === 0) {
130
+ j++;
131
+ }
132
+ if (j - i > bestLen) {
133
+ bestStart = i;
134
+ bestLen = j - i;
135
+ }
136
+ i = j;
137
+ }
138
+ const hex = groups.map((g) => g.toString(16));
139
+ if (bestLen < 2) {
140
+ return hex.join(":");
141
+ }
142
+ return `${hex.slice(0, bestStart).join(":")}::${hex.slice(bestStart + bestLen).join(":")}`;
143
+ }
144
+ /**
145
+ * Compiles (and caches) a `trustedProxies` list into a `BlockList`. Each entry is a single IPv4/IPv6 address or a
146
+ * CIDR range (`10.0.0.0/8`, `fd00::/8`). Entries are normalized the same way as `normalizeIP()`. Invalid entries
147
+ * are ignored.
148
+ */
149
+ static compileTrustedProxies(trustedProxies) {
150
+ const entries = (typeof trustedProxies === "string" ? trustedProxies.split(",") : [...trustedProxies])
151
+ .map((entry) => (typeof entry === "string" ? entry.trim() : ""))
152
+ .filter((entry) => entry.length > 0);
153
+ const key = entries.join("|");
154
+ const cached = NetUtils.proxyListCache.get(key);
155
+ if (cached) {
156
+ return cached;
157
+ }
158
+ const list = new BlockList();
159
+ for (const entry of entries) {
160
+ const slash = entry.indexOf("/");
161
+ if (slash >= 0) {
162
+ const prefix = Number(entry.slice(slash + 1));
163
+ const network = NetUtils.normalizeIP(entry.slice(0, slash));
164
+ const family = network ? isIP(network) : 0;
165
+ const maxPrefix = family === 4 ? 32 : 128;
166
+ if (family !== 0 && Number.isInteger(prefix) && prefix >= 0 && prefix <= maxPrefix) {
167
+ list.addSubnet(network, prefix, family === 4 ? "ipv4" : "ipv6");
168
+ }
169
+ }
170
+ else {
171
+ const address = NetUtils.normalizeIP(entry);
172
+ if (address) {
173
+ list.addAddress(address, isIP(address) === 4 ? "ipv4" : "ipv6");
174
+ }
175
+ }
176
+ }
177
+ if (NetUtils.proxyListCache.size >= MAX_CACHED_PROXY_LISTS) {
178
+ NetUtils.proxyListCache.clear();
179
+ }
180
+ NetUtils.proxyListCache.set(key, list);
181
+ return list;
182
+ }
183
+ /**
184
+ * Returns `true` if `address` matches an entry of `trustedProxies`. Both sides are normalized first (see
185
+ * `normalizeIP()`), so e.g. `::ffff:10.0.0.1` matches a `10.0.0.1` entry, and CIDR range entries are supported.
186
+ *
187
+ * @param address The address to check.
188
+ * @param trustedProxies The trusted proxy addresses and/or CIDR ranges, as an array or a comma-separated string.
189
+ */
190
+ static isTrustedProxy(address, trustedProxies) {
191
+ const normalized = NetUtils.normalizeIP(address);
192
+ if (!normalized || !trustedProxies || trustedProxies.length === 0) {
193
+ return false;
194
+ }
195
+ const list = NetUtils.compileTrustedProxies(trustedProxies);
196
+ return list.check(normalized, isIP(normalized) === 4 ? "ipv4" : "ipv6");
197
+ }
198
+ /**
199
+ * Returns the IP address of the client that made the given request, in canonical form (see `normalizeIP()`).
200
+ * This is the address that should be used for rate limiting, audit logs and any other per-client keying.
201
+ *
202
+ * The result is determined as follows:
203
+ * 1. If the socket's remote address is not a valid IP, it is returned as-is (or `undefined` if empty) and no
204
+ * header is consulted.
205
+ * 2. If `trustedProxies` is empty or the remote address is not a trusted proxy, the remote address is returned.
206
+ * Forwarding headers are ignored, so an untrusted client cannot choose its own address.
207
+ * 3. Otherwise `X-Forwarded-For` is walked from right to left (every `X-Forwarded-For` value is taken into
208
+ * account). Addresses of trusted proxies are skipped and the first address that is not a trusted proxy is
209
+ * returned. If an entry is not a valid IP address, the walk stops and the last trusted hop is returned, since
210
+ * nothing left of it can be trusted. If every entry is a trusted proxy, the left-most entry is returned.
211
+ * 4. If there is no `X-Forwarded-For` header, a valid `X-Real-IP` header is returned, else the remote address.
212
+ *
213
+ * `X-Original-Forwarded-For` is never consulted.
214
+ *
215
+ * @param req The HTTP request to extract the client address from.
216
+ * @param trustedProxies The addresses and/or CIDR ranges of reverse proxies whose forwarding headers are
217
+ * trusted, as an array or a comma-separated string.
218
+ * @returns The client's canonical IP address, or `undefined` if the request has no remote address.
219
+ */
220
+ static getClientIP(req, trustedProxies) {
221
+ const rawRemote = req.socket?.remoteAddress;
222
+ const remote = NetUtils.normalizeIP(rawRemote);
223
+ if (!remote) {
224
+ return rawRemote || undefined;
225
+ }
226
+ if (!NetUtils.isTrustedProxy(remote, trustedProxies)) {
227
+ return remote;
228
+ }
229
+ const headerEntries = (value) => (Array.isArray(value) ? value.join(",") : (value ?? ""))
230
+ .split(",")
231
+ .map((entry) => entry.trim())
232
+ .filter((entry) => entry.length > 0);
233
+ const forwardedFor = headerEntries(req.headers["x-forwarded-for"]);
234
+ if (forwardedFor.length > 0) {
235
+ let lastTrusted = remote;
236
+ for (let i = forwardedFor.length - 1; i >= 0; i--) {
237
+ const hop = NetUtils.normalizeIP(forwardedFor[i]);
238
+ if (!hop) {
239
+ return lastTrusted;
240
+ }
241
+ if (!NetUtils.isTrustedProxy(hop, trustedProxies)) {
242
+ return hop;
243
+ }
244
+ lastTrusted = hop;
245
+ }
246
+ return lastTrusted;
247
+ }
248
+ const realIp = headerEntries(req.headers["x-real-ip"]);
249
+ return NetUtils.normalizeIP(realIp[realIp.length - 1]) ?? remote;
250
+ }
43
251
  /**
44
252
  * Extracts the IP address from a given url or HTTP request.
45
253
  *
46
- * When `trustedProxies` is provided, forwarding headers (`X-Forwarded-For`, etc.) are
47
- * only trusted when the direct connection's `remoteAddress` is in that list. Without a
48
- * trusted-proxy list the headers are ignored and the socket address is returned directly,
49
- * preventing clients from spoofing their IP in audit logs.
254
+ * For an HTTP request this is identical to `getClientIP()`: forwarding headers are only trusted when the
255
+ * direct connection's remote address is one of `trustedProxies`, and the result is normalized.
50
256
  *
51
257
  * @param urlOrRequest The url or HTTP request to extract the IP from.
52
- * @param trustedProxies Optional list of proxy IP addresses whose forwarding headers should be trusted.
258
+ * @param trustedProxies Optional list of proxy IP addresses and/or CIDR ranges whose forwarding headers should
259
+ * be trusted.
53
260
  * @returns A `string` containing the IP address if found, otherwise `undefined`.
54
261
  */
55
262
  static getIPAddress(urlOrRequest, trustedProxies) {
@@ -81,24 +288,11 @@ export class NetUtils {
81
288
  }
82
289
  }
83
290
  else {
84
- const remoteAddr = urlOrRequest.socket?.remoteAddress;
85
- const proxyTrusted = trustedProxies && trustedProxies.length > 0
86
- ? remoteAddr !== undefined && trustedProxies.includes(remoteAddr)
87
- : false;
88
- if (proxyTrusted) {
89
- if (urlOrRequest.headers["x-original-forwarded-for"]) {
90
- result = urlOrRequest.headers["x-original-forwarded-for"];
91
- }
92
- else if (urlOrRequest.headers["x-forwarded-for"]) {
93
- result = urlOrRequest.headers["x-forwarded-for"];
94
- }
95
- else if (urlOrRequest.headers["x-real-ip"]) {
96
- result = urlOrRequest.headers["x-real-ip"];
97
- }
98
- }
99
- result = result ?? remoteAddr;
291
+ result = NetUtils.getClientIP(urlOrRequest, trustedProxies);
100
292
  }
101
293
  return result;
102
294
  }
103
295
  }
296
+ /** Compiled `trustedProxies` lists, keyed by their normalized, `|`-joined entries. */
297
+ NetUtils.proxyListCache = new Map();
104
298
  //# sourceMappingURL=NetUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NetUtils.js","sourceRoot":"","sources":["../../src/NetUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NetUtils.js","sourceRoot":"","sources":["../../src/NetUtils.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  ///////////////////////////////////////////////////////////////////////////////
5
5
  import "reflect-metadata";
6
6
  import { ObjectFactory as CoreObjectFactory } from "@rapidrest/core";
7
- import { ConnectionManager } from "./database/ConnectionManager.js";
7
+ import { attachRedisErrorHandler, ConnectionManager } from "./database/ConnectionManager.js";
8
8
  import { isSqlDataSource } from "./database/ConnectionKinds.js";
9
9
  import { MongoConnection } from "./database/MongoConnection.js";
10
10
  /**
@@ -36,7 +36,12 @@ export class ObjectFactory extends CoreObjectFactory {
36
36
  if (conn) {
37
37
  // Always create a copy of the connection so that the user can perform context aware operations without
38
38
  // error. We must also check that it is possible to duplicate the connection.
39
- let value = typeof conn.duplicate === "function" ? conn.duplicate() : conn;
39
+ let value = conn;
40
+ if (typeof conn.duplicate === "function") {
41
+ // A duplicate is a separate client with no listeners of its own, so without this a
42
+ // dropped socket would emit an unhandled `error` and crash the process.
43
+ value = attachRedisErrorHandler(conn.duplicate(), this.logger, `${name} (duplicate)`);
44
+ }
40
45
  if (typeof value?.connect === "function" &&
41
46
  typeof value?.isOpen === "boolean" &&
42
47
  !value.isOpen) {
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../src/RateLimiter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../src/RateLimiter.ts"],"names":[],"mappings":"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"}