@futdevpro/nts-dynamo 1.15.195 → 1.15.196
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/build/_collections/safe-remote-fetch.util.d.ts +101 -0
- package/build/_collections/safe-remote-fetch.util.d.ts.map +1 -0
- package/build/_collections/safe-remote-fetch.util.js +250 -0
- package/build/_collections/safe-remote-fetch.util.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -0
- package/build/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { URL } from 'url';
|
|
2
|
+
/**
|
|
3
|
+
* BFR-FSMED-013 — SSRF-safe, KORLÁTOS remote-metadata kliens.
|
|
4
|
+
*
|
|
5
|
+
* Egy nyilvános felületről érkező URL letöltése a klasszikus SSRF-felület: a szerver a saját
|
|
6
|
+
* hálózati pozíciójából kér le tetszőleges címet. A védelemnek ezért **minden DNS-válaszra és
|
|
7
|
+
* minden redirect-hopra** érvényesnek kell lennie, nem csak az első URL-re — különben egy
|
|
8
|
+
* **DNS-rebinding** vagy egy belső címre mutató redirect átviszi a kérést a privát hálózatba.
|
|
9
|
+
*
|
|
10
|
+
* Amit kikényszerít:
|
|
11
|
+
* - URL-normalizálás, credential-es URL (`user:pass@`) TILTVA;
|
|
12
|
+
* - protokoll-policy (alapból csak `https:`);
|
|
13
|
+
* - **minden** feloldott IP ellenőrzése (privát / loopback / link-local / reserved / CGNAT),
|
|
14
|
+
* IPv4-in-IPv6 és vegyes jelölés kezelésével;
|
|
15
|
+
* - redirect-limit, és **hopokként újra-ellenőrzött** cél;
|
|
16
|
+
* - timeout, maximális válasz-méret (bounded stream — a body sosem olvasható korlátlanul),
|
|
17
|
+
* engedélyezett content-type lista;
|
|
18
|
+
* - stabil `reason` kódok és REDAKTÁLT diagnosztika (a hibába nem kerül credential).
|
|
19
|
+
*/
|
|
20
|
+
/** Stabil, gépileg feldolgozható elutasítási okok. */
|
|
21
|
+
export declare enum DyNTS_SafeFetchReason_Type {
|
|
22
|
+
invalidUrl = "invalid-url",
|
|
23
|
+
credentialsInUrl = "credentials-in-url",
|
|
24
|
+
protocolNotAllowed = "protocol-not-allowed",
|
|
25
|
+
hostNotResolvable = "host-not-resolvable",
|
|
26
|
+
blockedAddress = "blocked-address",
|
|
27
|
+
tooManyRedirects = "too-many-redirects",
|
|
28
|
+
contentTypeNotAllowed = "content-type-not-allowed",
|
|
29
|
+
responseTooLarge = "response-too-large",
|
|
30
|
+
timeout = "timeout",
|
|
31
|
+
requestFailed = "request-failed"
|
|
32
|
+
}
|
|
33
|
+
/** A kliens beállításai — minden korlát explicit, alapértelmezés a szigorúbb. */
|
|
34
|
+
export interface DyNTS_SafeFetch_Options_Interface {
|
|
35
|
+
allowedProtocols?: string[];
|
|
36
|
+
maxRedirects?: number;
|
|
37
|
+
timeoutMs?: number;
|
|
38
|
+
maxResponseBytes?: number;
|
|
39
|
+
allowedContentTypes?: string[];
|
|
40
|
+
/** Injektálható DNS-feloldó — teszthez és a rebinding-mátrixhoz. */
|
|
41
|
+
resolve?: (hostname: string) => Promise<string[]>;
|
|
42
|
+
/** Injektálható transport — teszthez, illetve saját HTTP-réteghez (proxy, mTLS). */
|
|
43
|
+
transport?: DyNTS_SafeFetch_Transport;
|
|
44
|
+
}
|
|
45
|
+
/** Egyetlen HTTP-hop kimenete — a body itt MÁR korlátos. */
|
|
46
|
+
export interface DyNTS_SafeFetch_TransportResult_Interface {
|
|
47
|
+
status: number;
|
|
48
|
+
headers: Record<string, string | string[] | undefined>;
|
|
49
|
+
body: string;
|
|
50
|
+
bytes: number;
|
|
51
|
+
truncated: boolean;
|
|
52
|
+
}
|
|
53
|
+
/** Injektálható transport-szignatúra. */
|
|
54
|
+
export type DyNTS_SafeFetch_Transport = (url: URL, options: DyNTS_SafeFetch_Options_Interface) => Promise<DyNTS_SafeFetch_TransportResult_Interface>;
|
|
55
|
+
/** Sikeres letöltés eredménye — a body KORLÁTOS. */
|
|
56
|
+
export interface DyNTS_SafeFetch_Result_Interface {
|
|
57
|
+
finalUrl: string;
|
|
58
|
+
/** A bejárt hopok, az eredeti URL-lel kezdve — auditálható redirect-lánc. */
|
|
59
|
+
redirectChain: string[];
|
|
60
|
+
status: number;
|
|
61
|
+
contentType: string;
|
|
62
|
+
bytes: number;
|
|
63
|
+
body: string;
|
|
64
|
+
truncated: boolean;
|
|
65
|
+
}
|
|
66
|
+
/** Elutasítás — stabil kóddal és redaktált diagnosztikával. */
|
|
67
|
+
export declare class DyNTS_SafeFetch_Error extends Error {
|
|
68
|
+
readonly reason: DyNTS_SafeFetchReason_Type;
|
|
69
|
+
readonly diagnostic?: Record<string, unknown>;
|
|
70
|
+
constructor(reason: DyNTS_SafeFetchReason_Type, message: string, diagnostic?: Record<string, unknown>);
|
|
71
|
+
}
|
|
72
|
+
export declare class DyNTS_SafeRemoteFetch_Util {
|
|
73
|
+
private static readonly defaults;
|
|
74
|
+
/**
|
|
75
|
+
* IP-cím blokkolandó-e. IPv4 és IPv6 (a **IPv4-in-IPv6** alakkal együtt: `::ffff:10.0.0.1`).
|
|
76
|
+
*
|
|
77
|
+
* ⚠️ Ez a döntő pont: a hostnév ártalmatlan lehet, miközben egy KÜLSŐ DNS-szerver privát címre
|
|
78
|
+
* oldja fel (DNS-rebinding). Ezért a szűrés a FELOLDOTT CÍMEN történik, nem a néven.
|
|
79
|
+
*/
|
|
80
|
+
static isBlockedAddress(address: string): boolean;
|
|
81
|
+
/** Privát / loopback / link-local / reserved / CGNAT IPv4. */
|
|
82
|
+
private static isBlockedIpv4;
|
|
83
|
+
/** Loopback / link-local / unique-local / unspecified IPv6. */
|
|
84
|
+
private static isBlockedIpv6;
|
|
85
|
+
/** URL-normalizálás + protokoll- és credential-ellenőrzés. */
|
|
86
|
+
static assertUrlIsAllowed(rawUrl: string, options?: DyNTS_SafeFetch_Options_Interface): URL;
|
|
87
|
+
/** A host MINDEN feloldott címét ellenőrzi — egyetlen blokkolt cím is elutasít. */
|
|
88
|
+
static assertHostResolvesToPublicAddress(hostname: string, options?: DyNTS_SafeFetch_Options_Interface): Promise<string[]>;
|
|
89
|
+
/** Content-type engedélyezett-e (a paramétereket levágva). */
|
|
90
|
+
static isContentTypeAllowed(contentType: string, options?: DyNTS_SafeFetch_Options_Interface): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* KORLÁTOS letöltés: minden hopon újra-ellenőrzött cél, bounded body, timeout.
|
|
93
|
+
*
|
|
94
|
+
* A body-t soha nem olvassuk korlátlanul: a `maxResponseBytes` fölött a kapcsolatot elvágjuk
|
|
95
|
+
* (a `Content-Length` HIÁNYA nem mentesít — a stream-limit a valódi védelem).
|
|
96
|
+
*/
|
|
97
|
+
static fetchMetadata(rawUrl: string, options?: DyNTS_SafeFetch_Options_Interface): Promise<DyNTS_SafeFetch_Result_Interface>;
|
|
98
|
+
/** Egyetlen HTTP-hívás bounded stream-olvasással és timeouttal (az alapértelmezett transport). */
|
|
99
|
+
static request(url: URL, options?: DyNTS_SafeFetch_Options_Interface): Promise<DyNTS_SafeFetch_TransportResult_Interface>;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=safe-remote-fetch.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-remote-fetch.util.d.ts","sourceRoot":"","sources":["../../src/_collections/safe-remote-fetch.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyNTS_SafeRemoteFetch_Util = exports.DyNTS_SafeFetch_Error = exports.DyNTS_SafeFetchReason_Type = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const dns = tslib_1.__importStar(require("dns"));
|
|
6
|
+
const http = tslib_1.__importStar(require("http"));
|
|
7
|
+
const https = tslib_1.__importStar(require("https"));
|
|
8
|
+
const url_1 = require("url");
|
|
9
|
+
/**
|
|
10
|
+
* BFR-FSMED-013 — SSRF-safe, KORLÁTOS remote-metadata kliens.
|
|
11
|
+
*
|
|
12
|
+
* Egy nyilvános felületről érkező URL letöltése a klasszikus SSRF-felület: a szerver a saját
|
|
13
|
+
* hálózati pozíciójából kér le tetszőleges címet. A védelemnek ezért **minden DNS-válaszra és
|
|
14
|
+
* minden redirect-hopra** érvényesnek kell lennie, nem csak az első URL-re — különben egy
|
|
15
|
+
* **DNS-rebinding** vagy egy belső címre mutató redirect átviszi a kérést a privát hálózatba.
|
|
16
|
+
*
|
|
17
|
+
* Amit kikényszerít:
|
|
18
|
+
* - URL-normalizálás, credential-es URL (`user:pass@`) TILTVA;
|
|
19
|
+
* - protokoll-policy (alapból csak `https:`);
|
|
20
|
+
* - **minden** feloldott IP ellenőrzése (privát / loopback / link-local / reserved / CGNAT),
|
|
21
|
+
* IPv4-in-IPv6 és vegyes jelölés kezelésével;
|
|
22
|
+
* - redirect-limit, és **hopokként újra-ellenőrzött** cél;
|
|
23
|
+
* - timeout, maximális válasz-méret (bounded stream — a body sosem olvasható korlátlanul),
|
|
24
|
+
* engedélyezett content-type lista;
|
|
25
|
+
* - stabil `reason` kódok és REDAKTÁLT diagnosztika (a hibába nem kerül credential).
|
|
26
|
+
*/
|
|
27
|
+
/** Stabil, gépileg feldolgozható elutasítási okok. */
|
|
28
|
+
var DyNTS_SafeFetchReason_Type;
|
|
29
|
+
(function (DyNTS_SafeFetchReason_Type) {
|
|
30
|
+
DyNTS_SafeFetchReason_Type["invalidUrl"] = "invalid-url";
|
|
31
|
+
DyNTS_SafeFetchReason_Type["credentialsInUrl"] = "credentials-in-url";
|
|
32
|
+
DyNTS_SafeFetchReason_Type["protocolNotAllowed"] = "protocol-not-allowed";
|
|
33
|
+
DyNTS_SafeFetchReason_Type["hostNotResolvable"] = "host-not-resolvable";
|
|
34
|
+
DyNTS_SafeFetchReason_Type["blockedAddress"] = "blocked-address";
|
|
35
|
+
DyNTS_SafeFetchReason_Type["tooManyRedirects"] = "too-many-redirects";
|
|
36
|
+
DyNTS_SafeFetchReason_Type["contentTypeNotAllowed"] = "content-type-not-allowed";
|
|
37
|
+
DyNTS_SafeFetchReason_Type["responseTooLarge"] = "response-too-large";
|
|
38
|
+
DyNTS_SafeFetchReason_Type["timeout"] = "timeout";
|
|
39
|
+
DyNTS_SafeFetchReason_Type["requestFailed"] = "request-failed";
|
|
40
|
+
})(DyNTS_SafeFetchReason_Type || (exports.DyNTS_SafeFetchReason_Type = DyNTS_SafeFetchReason_Type = {}));
|
|
41
|
+
/** Elutasítás — stabil kóddal és redaktált diagnosztikával. */
|
|
42
|
+
class DyNTS_SafeFetch_Error extends Error {
|
|
43
|
+
reason;
|
|
44
|
+
diagnostic;
|
|
45
|
+
constructor(reason, message, diagnostic) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.reason = reason;
|
|
48
|
+
this.diagnostic = diagnostic;
|
|
49
|
+
this.name = 'DyNTS_SafeFetch_Error';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.DyNTS_SafeFetch_Error = DyNTS_SafeFetch_Error;
|
|
53
|
+
class DyNTS_SafeRemoteFetch_Util {
|
|
54
|
+
static defaults = {
|
|
55
|
+
allowedProtocols: ['https:'],
|
|
56
|
+
maxRedirects: 3,
|
|
57
|
+
timeoutMs: 5_000,
|
|
58
|
+
maxResponseBytes: 256 * 1024,
|
|
59
|
+
allowedContentTypes: ['text/html', 'application/json', 'text/plain', 'application/xml', 'text/xml'],
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* IP-cím blokkolandó-e. IPv4 és IPv6 (a **IPv4-in-IPv6** alakkal együtt: `::ffff:10.0.0.1`).
|
|
63
|
+
*
|
|
64
|
+
* ⚠️ Ez a döntő pont: a hostnév ártalmatlan lehet, miközben egy KÜLSŐ DNS-szerver privát címre
|
|
65
|
+
* oldja fel (DNS-rebinding). Ezért a szűrés a FELOLDOTT CÍMEN történik, nem a néven.
|
|
66
|
+
*/
|
|
67
|
+
static isBlockedAddress(address) {
|
|
68
|
+
const value = `${address ?? ''}`.trim().toLowerCase().replace(/^\[|\]$/g, '');
|
|
69
|
+
if (!value.length) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// IPv4-in-IPv6 (`::ffff:10.0.0.1`) és a `::ffff:0a00:0001` hexa-alak → az IPv4-re vezetjük vissza
|
|
73
|
+
const mappedIpv4 = value.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);
|
|
74
|
+
if (mappedIpv4) {
|
|
75
|
+
return DyNTS_SafeRemoteFetch_Util.isBlockedIpv4(mappedIpv4[1]);
|
|
76
|
+
}
|
|
77
|
+
if (value.includes(':')) {
|
|
78
|
+
return DyNTS_SafeRemoteFetch_Util.isBlockedIpv6(value);
|
|
79
|
+
}
|
|
80
|
+
return DyNTS_SafeRemoteFetch_Util.isBlockedIpv4(value);
|
|
81
|
+
}
|
|
82
|
+
/** Privát / loopback / link-local / reserved / CGNAT IPv4. */
|
|
83
|
+
static isBlockedIpv4(address) {
|
|
84
|
+
const parts = address.split('.').map((p) => Number(p));
|
|
85
|
+
if (parts.length !== 4 || parts.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
const [a, b] = parts;
|
|
89
|
+
return a === 0 // "this network"
|
|
90
|
+
|| a === 10 // privát
|
|
91
|
+
|| a === 127 // loopback
|
|
92
|
+
|| (a === 169 && b === 254) // link-local
|
|
93
|
+
|| (a === 172 && b >= 16 && b <= 31) // privát
|
|
94
|
+
|| (a === 192 && b === 168) // privát
|
|
95
|
+
|| (a === 100 && b >= 64 && b <= 127) // CGNAT
|
|
96
|
+
|| (a === 192 && b === 0) // IETF protocol assignments / TEST-NET-1
|
|
97
|
+
|| a === 198 && (b === 18 || b === 19) // benchmark
|
|
98
|
+
|| a >= 224; // multicast + reserved
|
|
99
|
+
}
|
|
100
|
+
/** Loopback / link-local / unique-local / unspecified IPv6. */
|
|
101
|
+
static isBlockedIpv6(address) {
|
|
102
|
+
if (address === '::' || address === '::1') {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return /^fe[89ab]/.test(address) // link-local
|
|
106
|
+
|| /^f[cd]/.test(address) // unique-local
|
|
107
|
+
|| /^ff/.test(address); // multicast
|
|
108
|
+
}
|
|
109
|
+
/** URL-normalizálás + protokoll- és credential-ellenőrzés. */
|
|
110
|
+
static assertUrlIsAllowed(rawUrl, options) {
|
|
111
|
+
let url;
|
|
112
|
+
try {
|
|
113
|
+
url = new url_1.URL(`${rawUrl}`);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
throw new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.invalidUrl, 'The URL could not be parsed.');
|
|
117
|
+
}
|
|
118
|
+
// A credential a REDIRECT-en is átöröklődhetne, és a naplóba is beszivárogna — tiltva.
|
|
119
|
+
if (url.username.length || url.password.length) {
|
|
120
|
+
throw new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.credentialsInUrl, 'A URL carrying credentials is not allowed.', { host: url.hostname });
|
|
121
|
+
}
|
|
122
|
+
const allowed = options?.allowedProtocols ?? DyNTS_SafeRemoteFetch_Util.defaults.allowedProtocols;
|
|
123
|
+
if (!allowed.includes(url.protocol)) {
|
|
124
|
+
throw new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.protocolNotAllowed, `The '${url.protocol}' protocol is not allowed.`, { protocol: url.protocol, allowed: allowed });
|
|
125
|
+
}
|
|
126
|
+
return url;
|
|
127
|
+
}
|
|
128
|
+
/** A host MINDEN feloldott címét ellenőrzi — egyetlen blokkolt cím is elutasít. */
|
|
129
|
+
static async assertHostResolvesToPublicAddress(hostname, options) {
|
|
130
|
+
const resolver = options?.resolve
|
|
131
|
+
?? (async (host) => {
|
|
132
|
+
const records = await dns.promises.lookup(host, { all: true });
|
|
133
|
+
return records.map((r) => r.address);
|
|
134
|
+
});
|
|
135
|
+
let addresses;
|
|
136
|
+
try {
|
|
137
|
+
addresses = await resolver(hostname);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
throw new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.hostNotResolvable, 'The host could not be resolved.', { host: hostname });
|
|
141
|
+
}
|
|
142
|
+
if (!addresses?.length) {
|
|
143
|
+
throw new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.hostNotResolvable, 'The host resolved to no address.', { host: hostname });
|
|
144
|
+
}
|
|
145
|
+
const blocked = addresses.filter((address) => DyNTS_SafeRemoteFetch_Util.isBlockedAddress(address));
|
|
146
|
+
if (blocked.length) {
|
|
147
|
+
throw new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.blockedAddress, 'The host resolves to a non-public address.', { host: hostname, blockedCount: blocked.length });
|
|
148
|
+
}
|
|
149
|
+
return addresses;
|
|
150
|
+
}
|
|
151
|
+
/** Content-type engedélyezett-e (a paramétereket levágva). */
|
|
152
|
+
static isContentTypeAllowed(contentType, options) {
|
|
153
|
+
const allowed = options?.allowedContentTypes
|
|
154
|
+
?? DyNTS_SafeRemoteFetch_Util.defaults.allowedContentTypes;
|
|
155
|
+
const value = `${contentType ?? ''}`.split(';')[0].trim().toLowerCase();
|
|
156
|
+
return allowed.includes(value);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* KORLÁTOS letöltés: minden hopon újra-ellenőrzött cél, bounded body, timeout.
|
|
160
|
+
*
|
|
161
|
+
* A body-t soha nem olvassuk korlátlanul: a `maxResponseBytes` fölött a kapcsolatot elvágjuk
|
|
162
|
+
* (a `Content-Length` HIÁNYA nem mentesít — a stream-limit a valódi védelem).
|
|
163
|
+
*/
|
|
164
|
+
static async fetchMetadata(rawUrl, options) {
|
|
165
|
+
const maxRedirects = options?.maxRedirects ?? DyNTS_SafeRemoteFetch_Util.defaults.maxRedirects;
|
|
166
|
+
const transport = options?.transport ?? DyNTS_SafeRemoteFetch_Util.request;
|
|
167
|
+
const redirectChain = [];
|
|
168
|
+
let currentUrl = rawUrl;
|
|
169
|
+
for (let hop = 0; hop <= maxRedirects; hop++) {
|
|
170
|
+
const url = DyNTS_SafeRemoteFetch_Util.assertUrlIsAllowed(currentUrl, options);
|
|
171
|
+
await DyNTS_SafeRemoteFetch_Util.assertHostResolvesToPublicAddress(url.hostname, options);
|
|
172
|
+
redirectChain.push(url.toString());
|
|
173
|
+
const response = await transport(url, options ?? {});
|
|
174
|
+
const location = `${response.headers.location ?? ''}` || undefined;
|
|
175
|
+
if (response.status >= 300 && response.status < 400 && location) {
|
|
176
|
+
// A redirect celja UJRA vegigmegy a teljes ellenorzesen: URL-policy, credential-tiltas ES
|
|
177
|
+
// DNS-feloldas. Ez zarja a "publikus elso hop, privat masodik hop" utat.
|
|
178
|
+
currentUrl = new url_1.URL(location, url).toString();
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const contentType = `${response.headers['content-type'] ?? ''}`;
|
|
182
|
+
if (!DyNTS_SafeRemoteFetch_Util.isContentTypeAllowed(contentType, options)) {
|
|
183
|
+
throw new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.contentTypeNotAllowed, 'The response content-type is not allowed.', { contentType: contentType.split(';')[0], finalUrl: url.toString() });
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
finalUrl: url.toString(),
|
|
187
|
+
redirectChain: redirectChain,
|
|
188
|
+
status: response.status,
|
|
189
|
+
contentType: contentType,
|
|
190
|
+
bytes: response.bytes,
|
|
191
|
+
body: response.body,
|
|
192
|
+
truncated: response.truncated,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
throw new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.tooManyRedirects, 'The redirect limit was exceeded.', { maxRedirects: maxRedirects, hops: redirectChain.length });
|
|
196
|
+
}
|
|
197
|
+
/** Egyetlen HTTP-hívás bounded stream-olvasással és timeouttal (az alapértelmezett transport). */
|
|
198
|
+
static request(url, options) {
|
|
199
|
+
const timeoutMs = options?.timeoutMs ?? DyNTS_SafeRemoteFetch_Util.defaults.timeoutMs;
|
|
200
|
+
const maxBytes = options?.maxResponseBytes ?? DyNTS_SafeRemoteFetch_Util.defaults.maxResponseBytes;
|
|
201
|
+
const lib = url.protocol === 'http:' ? http : https;
|
|
202
|
+
return new Promise((resolve, reject) => {
|
|
203
|
+
const request = lib.request(url, { method: 'GET', timeout: timeoutMs }, (response) => {
|
|
204
|
+
let size = 0;
|
|
205
|
+
let truncated = false;
|
|
206
|
+
const chunks = [];
|
|
207
|
+
response.on('data', (chunk) => {
|
|
208
|
+
size += chunk.length;
|
|
209
|
+
if (size > maxBytes) {
|
|
210
|
+
truncated = true;
|
|
211
|
+
response.destroy();
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
chunks.push(chunk);
|
|
215
|
+
});
|
|
216
|
+
response.on('end', () => {
|
|
217
|
+
resolve({
|
|
218
|
+
status: response.statusCode ?? 0,
|
|
219
|
+
headers: response.headers,
|
|
220
|
+
body: Buffer.concat(chunks).toString('utf8'),
|
|
221
|
+
bytes: size,
|
|
222
|
+
truncated: truncated,
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
response.on('close', () => {
|
|
226
|
+
if (truncated) {
|
|
227
|
+
resolve({
|
|
228
|
+
status: response.statusCode ?? 0,
|
|
229
|
+
headers: response.headers,
|
|
230
|
+
body: Buffer.concat(chunks).toString('utf8'),
|
|
231
|
+
bytes: size,
|
|
232
|
+
truncated: true,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
request.on('timeout', () => {
|
|
238
|
+
request.destroy();
|
|
239
|
+
reject(new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.timeout, 'The request timed out.'));
|
|
240
|
+
});
|
|
241
|
+
request.on('error', (error) => {
|
|
242
|
+
// A hibaüzenet a HOSTOT tartalmazhatja, credentialt nem (azt már fentebb kizártuk).
|
|
243
|
+
reject(new DyNTS_SafeFetch_Error(DyNTS_SafeFetchReason_Type.requestFailed, 'The request failed.', { host: url.hostname, cause: error.name }));
|
|
244
|
+
});
|
|
245
|
+
request.end();
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.DyNTS_SafeRemoteFetch_Util = DyNTS_SafeRemoteFetch_Util;
|
|
250
|
+
//# sourceMappingURL=safe-remote-fetch.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-remote-fetch.util.js","sourceRoot":"","sources":["../../src/_collections/safe-remote-fetch.util.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
|
@@ -32,6 +32,9 @@ export * from './_collections/signed-url.util';
|
|
|
32
32
|
export * from './_collections/client-safe-error.util';
|
|
33
33
|
export * from './_collections/client-safe-error-response.interface';
|
|
34
34
|
export * from './_collections/load-shed.util';
|
|
35
|
+
export * from './_collections/secret-redaction.util';
|
|
36
|
+
export * from './_collections/dependency-host-guard.util';
|
|
37
|
+
export * from './_collections/safe-remote-fetch.util';
|
|
35
38
|
export * from './_services/core/event-loop-diag.service';
|
|
36
39
|
export * from './_services/core/request-hunter.service';
|
|
37
40
|
export * from './_services/core/db-stats.service';
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA2BA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,qDAAqD,CAAC;AACpE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,sCAAsC,CAAC;AAIrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAK7C,mEAAmE;AACnE,cAAc,uDAAuD,CAAC;AACtE,cAAc,qDAAqD,CAAC;AACpE,cAAc,wDAAwD,CAAC;AACvE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,wDAAwD,CAAC;AACvE,cAAc,yDAAyD,CAAC;AACxE,cAAc,uDAAuD,CAAC;AACtE,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0DAA0D,CAAC;AACzE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,2DAA2D,CAAC;AAC1E,cAAc,2DAA2D,CAAC;AAC1E,cAAc,iDAAiD,CAAC;AAChE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,2DAA2D,CAAC;AAC1E,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qDAAqD,CAAC;AACpE,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AAGrD,cAAc,wDAAwD,CAAC;AACvE,cAAc,gEAAgE,CAAA;AAC9E,cAAc,mDAAmD,CAAC;AAClE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,wDAAwD,CAAC;AACvE,cAAc,sDAAsD,CAAC;AACrE,cAAc,uDAAuD,CAAC;AAGtE,cAAc,gCAAgC,CAAC;AAG/C,cAAc,mDAAmD,CAAC;AAKlE,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oDAAoD,CAAC;AACnE,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,oDAAoD,CAAC;AAEnE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AAGnE,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AAGnD,cAAc,+BAA+B,CAAC;AAG9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AAGzD,cAAc,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA2BA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,qDAAqD,CAAC;AACpE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,sCAAsC,CAAC;AAIrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAK7C,mEAAmE;AACnE,cAAc,uDAAuD,CAAC;AACtE,cAAc,qDAAqD,CAAC;AACpE,cAAc,wDAAwD,CAAC;AACvE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,wDAAwD,CAAC;AACvE,cAAc,yDAAyD,CAAC;AACxE,cAAc,uDAAuD,CAAC;AACtE,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0DAA0D,CAAC;AACzE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,2DAA2D,CAAC;AAC1E,cAAc,2DAA2D,CAAC;AAC1E,cAAc,iDAAiD,CAAC;AAChE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,2DAA2D,CAAC;AAC1E,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qDAAqD,CAAC;AACpE,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AAGrD,cAAc,wDAAwD,CAAC;AACvE,cAAc,gEAAgE,CAAA;AAC9E,cAAc,mDAAmD,CAAC;AAClE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,wDAAwD,CAAC;AACvE,cAAc,sDAAsD,CAAC;AACrE,cAAc,uDAAuD,CAAC;AAGtE,cAAc,gCAAgC,CAAC;AAG/C,cAAc,mDAAmD,CAAC;AAKlE,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oDAAoD,CAAC;AACnE,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,oDAAoD,CAAC;AAEnE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AAGnE,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AAGnD,cAAc,+BAA+B,CAAC;AAG9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AAGzD,cAAc,mCAAmC,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -61,6 +61,9 @@ tslib_1.__exportStar(require("./_collections/signed-url.util"), exports);
|
|
|
61
61
|
tslib_1.__exportStar(require("./_collections/client-safe-error.util"), exports);
|
|
62
62
|
tslib_1.__exportStar(require("./_collections/client-safe-error-response.interface"), exports);
|
|
63
63
|
tslib_1.__exportStar(require("./_collections/load-shed.util"), exports);
|
|
64
|
+
tslib_1.__exportStar(require("./_collections/secret-redaction.util"), exports);
|
|
65
|
+
tslib_1.__exportStar(require("./_collections/dependency-host-guard.util"), exports);
|
|
66
|
+
tslib_1.__exportStar(require("./_collections/safe-remote-fetch.util"), exports);
|
|
64
67
|
tslib_1.__exportStar(require("./_services/core/event-loop-diag.service"), exports);
|
|
65
68
|
tslib_1.__exportStar(require("./_services/core/request-hunter.service"), exports);
|
|
66
69
|
tslib_1.__exportStar(require("./_services/core/db-stats.service"), exports);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;IAsBI;;;AAEJ,cAAc;AACd,sEAA4C;AAC5C,8EAAoD;AACpD,wFAA8D;AAC9D,8FAAoE;AACpE,sFAA4D;AAC5D,mFAAyD;AACzD,uFAA6D;AAC7D,+EAAqD;AAGrD,QAAQ;AACR,wEAA8C;AAC9C,8EAAoD;AACpD,8EAAoD;AACpD,uEAA6C;AAG7C,6CAA6C;AAE7C,mEAAmE;AACnE,gGAAsE;AACtE,8FAAoE;AACpE,iGAAuE;AACvE,yFAA+D;AAC/D,iGAAuE;AACvE,kGAAwE;AACxE,gGAAsE;AACtE,uFAA6D;AAC7D,mGAAyE;AACzE,qGAA2E;AAC3E,oGAA0E;AAC1E,oGAA0E;AAC1E,0FAAgE;AAChE,yFAA+D;AAC/D,oGAA0E;AAC1E,+EAAqD;AACrD,iFAAuD;AACvD,yEAA+C;AAC/C,gFAAsD;AACtD,8FAAoE;AACpE,wEAA8C;AAC9C,mFAAyD;AACzD,kFAAwD;AACxD,4EAAkD;AAClD,+EAAqD;AAErD,wBAAwB;AACxB,iGAAuE;AACvE,yGAA8E;AAC9E,4FAAkE;AAClE,qGAA2E;AAC3E,iGAAuE;AACvE,+FAAqE;AACrE,gGAAsE;AAEtE,eAAe;AACf,yEAA+C;AAE/C,qBAAqB;AACrB,4FAAkE;AAGlE,WAAW;AACX,gBAAgB;AAChB,uEAA6C;AAC7C,wEAA8C;AAE9C,yEAA+C;AAC/C,6FAAmE;AACnE,0EAAgD;AAChD,gFAAsD;AACtD,6FAAmE;AAEnE,sFAA4D;AAC5D,oFAA0D;AAC1D,6FAAmE;AAEnE,gBAAgB;AAChB,4EAAkD;AAClD,gFAAsD;AACtD,wEAA8C;AAC9C,sEAA4C;AAC5C,kFAAwD;AACxD,6EAAmD;AAEnD,kBAAkB;AAClB,wEAA8C;AAE9C,iBAAiB;AACjB,+EAAqD;AACrD,mFAAyD;AAEzD,kBAAkB;AAClB,4EAAkD"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;IAsBI;;;AAEJ,cAAc;AACd,sEAA4C;AAC5C,8EAAoD;AACpD,wFAA8D;AAC9D,8FAAoE;AACpE,sFAA4D;AAC5D,mFAAyD;AACzD,uFAA6D;AAC7D,+EAAqD;AAGrD,QAAQ;AACR,wEAA8C;AAC9C,8EAAoD;AACpD,8EAAoD;AACpD,uEAA6C;AAG7C,6CAA6C;AAE7C,mEAAmE;AACnE,gGAAsE;AACtE,8FAAoE;AACpE,iGAAuE;AACvE,yFAA+D;AAC/D,iGAAuE;AACvE,kGAAwE;AACxE,gGAAsE;AACtE,uFAA6D;AAC7D,mGAAyE;AACzE,qGAA2E;AAC3E,oGAA0E;AAC1E,oGAA0E;AAC1E,0FAAgE;AAChE,yFAA+D;AAC/D,oGAA0E;AAC1E,+EAAqD;AACrD,iFAAuD;AACvD,yEAA+C;AAC/C,gFAAsD;AACtD,8FAAoE;AACpE,wEAA8C;AAC9C,+EAAqD;AACrD,oFAA0D;AAC1D,gFAAsD;AACtD,mFAAyD;AACzD,kFAAwD;AACxD,4EAAkD;AAClD,+EAAqD;AAErD,wBAAwB;AACxB,iGAAuE;AACvE,yGAA8E;AAC9E,4FAAkE;AAClE,qGAA2E;AAC3E,iGAAuE;AACvE,+FAAqE;AACrE,gGAAsE;AAEtE,eAAe;AACf,yEAA+C;AAE/C,qBAAqB;AACrB,4FAAkE;AAGlE,WAAW;AACX,gBAAgB;AAChB,uEAA6C;AAC7C,wEAA8C;AAE9C,yEAA+C;AAC/C,6FAAmE;AACnE,0EAAgD;AAChD,gFAAsD;AACtD,6FAAmE;AAEnE,sFAA4D;AAC5D,oFAA0D;AAC1D,6FAAmE;AAEnE,gBAAgB;AAChB,4EAAkD;AAClD,gFAAsD;AACtD,wEAA8C;AAC9C,sEAA4C;AAC5C,kFAAwD;AACxD,6EAAmD;AAEnD,kBAAkB;AAClB,wEAA8C;AAE9C,iBAAiB;AACjB,+EAAqD;AACrD,mFAAyD;AAEzD,kBAAkB;AAClB,4EAAkD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/nts-dynamo",
|
|
3
|
-
"version": "01.15.
|
|
3
|
+
"version": "01.15.196",
|
|
4
4
|
"description": "Dynamic NodeTS (NodeJS-Typescript), MongoDB Backend System Framework by Future Development Program Ltd.",
|
|
5
5
|
"DyBu_settings": {
|
|
6
6
|
"packageType": "server-package",
|