@rapidrest/service-core 2.0.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.
- package/dist/lib/BackgroundServiceManager.js +51 -9
- package/dist/lib/BackgroundServiceManager.js.map +1 -1
- package/dist/lib/EventListenerManager.js +35 -2
- package/dist/lib/EventListenerManager.js.map +1 -1
- package/dist/lib/NetUtils.js +215 -21
- package/dist/lib/NetUtils.js.map +1 -1
- package/dist/lib/ObjectFactory.js +7 -2
- package/dist/lib/ObjectFactory.js.map +1 -1
- package/dist/lib/RateLimiter.js.map +1 -1
- package/dist/lib/Server.js +121 -80
- package/dist/lib/Server.js.map +1 -1
- package/dist/lib/auth/AuthMiddleware.js +160 -100
- package/dist/lib/auth/AuthMiddleware.js.map +1 -1
- package/dist/lib/auth/JWTStrategy.js +6 -2
- package/dist/lib/auth/JWTStrategy.js.map +1 -1
- package/dist/lib/database/ConnectionManager.js +47 -1
- package/dist/lib/database/ConnectionManager.js.map +1 -1
- package/dist/lib/database/DatabaseErrors.js +88 -0
- package/dist/lib/database/DatabaseErrors.js.map +1 -0
- package/dist/lib/database/MongoRepository.js +31 -3
- package/dist/lib/database/MongoRepository.js.map +1 -1
- package/dist/lib/database/MongoSchemaSync.js +7 -1
- package/dist/lib/database/MongoSchemaSync.js.map +1 -1
- package/dist/lib/database/TypeOrmSupport.js +11 -6
- package/dist/lib/database/TypeOrmSupport.js.map +1 -1
- package/dist/lib/database/index.js +1 -0
- package/dist/lib/database/index.js.map +1 -1
- package/dist/lib/decorators/PersistenceDecorators.js +23 -0
- package/dist/lib/decorators/PersistenceDecorators.js.map +1 -1
- package/dist/lib/decorators/RouteDecorators.js +4 -2
- package/dist/lib/decorators/RouteDecorators.js.map +1 -1
- package/dist/lib/http/bun/BunRouter.js +119 -9
- package/dist/lib/http/bun/BunRouter.js.map +1 -1
- package/dist/lib/http/index.js +1 -0
- package/dist/lib/http/index.js.map +1 -1
- package/dist/lib/http/session/sessionMiddleware.js +62 -14
- package/dist/lib/http/session/sessionMiddleware.js.map +1 -1
- package/dist/lib/http/types.js +10 -1
- package/dist/lib/http/types.js.map +1 -1
- package/dist/lib/http/uWS/Adapters.js +31 -13
- package/dist/lib/http/uWS/Adapters.js.map +1 -1
- package/dist/lib/http/uWS/Router.js +80 -16
- package/dist/lib/http/uWS/Router.js.map +1 -1
- package/dist/lib/http/uWS/WebSocket.js +4 -2
- package/dist/lib/http/uWS/WebSocket.js.map +1 -1
- package/dist/lib/models/ModelUtils.js +255 -81
- package/dist/lib/models/ModelUtils.js.map +1 -1
- package/dist/lib/models/RepoUtils.js +863 -266
- package/dist/lib/models/RepoUtils.js.map +1 -1
- package/dist/lib/routes/BaseAdminRoute.js +5 -4
- package/dist/lib/routes/BaseAdminRoute.js.map +1 -1
- package/dist/lib/routes/BasePushRoute.js +104 -40
- package/dist/lib/routes/BasePushRoute.js.map +1 -1
- package/dist/lib/routes/CRUDRoute.js +31 -17
- package/dist/lib/routes/CRUDRoute.js.map +1 -1
- package/dist/lib/routes/RouteUtils.js +120 -29
- package/dist/lib/routes/RouteUtils.js.map +1 -1
- package/dist/lib/security/ACLUtils.js +170 -34
- package/dist/lib/security/ACLUtils.js.map +1 -1
- package/dist/types/BackgroundServiceManager.d.ts +6 -0
- package/dist/types/EventListenerManager.d.ts +4 -0
- package/dist/types/NetUtils.d.ts +65 -6
- package/dist/types/RateLimiter.d.ts +4 -3
- package/dist/types/Server.d.ts +33 -2
- package/dist/types/auth/AuthMiddleware.d.ts +35 -4
- package/dist/types/database/ConnectionManager.d.ts +18 -0
- package/dist/types/database/DatabaseErrors.d.ts +26 -0
- package/dist/types/database/MongoRepository.d.ts +21 -2
- package/dist/types/database/index.d.ts +1 -0
- package/dist/types/decorators/PersistenceDecorators.d.ts +31 -0
- package/dist/types/decorators/RouteDecorators.d.ts +4 -2
- package/dist/types/http/bun/BunRouter.d.ts +23 -2
- package/dist/types/http/index.d.ts +2 -1
- package/dist/types/http/session/sessionMiddleware.d.ts +14 -4
- package/dist/types/http/types.d.ts +40 -0
- package/dist/types/http/uWS/Adapters.d.ts +10 -1
- package/dist/types/http/uWS/Router.d.ts +15 -2
- package/dist/types/models/ModelUtils.d.ts +96 -1
- package/dist/types/models/RepoUtils.d.ts +240 -4
- package/dist/types/routes/BasePushRoute.d.ts +5 -0
- package/dist/types/routes/CRUDRoute.d.ts +10 -0
- package/dist/types/routes/RouteUtils.d.ts +37 -1
- package/dist/types/security/ACLUtils.d.ts +68 -7
- package/package.json +1 -1
|
@@ -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
|
|
97
|
+
const instance = await this.objectFactory.newInstance(clazz, {
|
|
96
98
|
name: serviceName,
|
|
97
99
|
initialize: true,
|
|
98
100
|
args: [...args],
|
|
99
101
|
});
|
|
100
|
-
|
|
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
|
|
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 (
|
|
108
|
-
const
|
|
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
|
|
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
|
|
130
|
-
|
|
131
|
-
await
|
|
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":";;;;;;;;;AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,wBAAwB;IAajC,YAAY,aAA4B,EAAE,OAAW;QAT7C,SAAI,GAAQ,EAAE,CAAC;QAIvB,yGAAyG;QACzG,sGAAsG;QAC9F,gBAAW,GAAgB,IAAI,GAAG,EAAE,CAAC;QACrC,aAAQ,GAAQ,EAAE,CAAC;QAGvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACI,UAAU,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ;QACjB,kEAAkE;QAClE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,KAAK,CAAC,SAAS,YAAY,iBAAiB,EAAE,CAAC;oBAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAClC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,KAAW,EAAE,GAAG,IAAS;QAC7D,iDAAiD;QACjD,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,yEAAyE;QACzE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAElD,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC;gBAE5D,gCAAgC;gBAChC,MAAM,
|
|
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
|
-
|
|
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":";;;;;;;;;AAKA,OAAO,EAAS,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAY7B,YAAY,aAA4B,EAAE,KAAsB;QAV/C,aAAQ,GAAa,EAAE,CAAC;QAIjC,aAAQ,GAA4B,IAAI,GAAG,EAAE,CAAC;QACtD,yGAAyG;QACzG,iFAAiF;QAChE,iBAAY,GAAwB,IAAI,GAAG,EAAE,CAAC;QAI3D,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"EventListenerManager.js","sourceRoot":"","sources":["../../src/EventListenerManager.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/NetUtils.js
CHANGED
|
@@ -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
|
-
*
|
|
47
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
package/dist/lib/NetUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetUtils.js","sourceRoot":"","sources":["../../src/NetUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAiB,MAAM,KAAK,CAAC;
|
|
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 =
|
|
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":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;
|
|
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":";;;;;;;;;AAAA,gFAAgF;AAChF,6CAA6C;AAC7C,mCAAmC;AACnC,gFAAgF;AAChF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAwB,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAEpD,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAErC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../src/RateLimiter.ts"],"names":[],"mappings":"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"}
|