@atproto-labs/fetch 0.0.1 → 0.1.1
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/CHANGELOG.md +16 -4
- package/dist/fetch-error.d.ts +1 -12
- package/dist/fetch-error.d.ts.map +1 -1
- package/dist/fetch-error.js +24 -39
- package/dist/fetch-error.js.map +1 -1
- package/dist/fetch-request.d.ts +22 -5
- package/dist/fetch-request.d.ts.map +1 -1
- package/dist/fetch-request.js +55 -18
- package/dist/fetch-request.js.map +1 -1
- package/dist/fetch-response.d.ts +30 -12
- package/dist/fetch-response.d.ts.map +1 -1
- package/dist/fetch-response.js +134 -81
- package/dist/fetch-response.js.map +1 -1
- package/dist/fetch-wrap.d.ts +47 -9
- package/dist/fetch-wrap.d.ts.map +1 -1
- package/dist/fetch-wrap.js +112 -61
- package/dist/fetch-wrap.js.map +1 -1
- package/dist/fetch.d.ts +8 -1
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js +13 -0
- package/dist/fetch.js.map +1 -1
- package/dist/transformed-response.d.ts.map +1 -1
- package/dist/transformed-response.js +5 -2
- package/dist/transformed-response.js.map +1 -1
- package/dist/util.d.ts +46 -14
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +121 -24
- package/dist/util.js.map +1 -1
- package/package.json +6 -5
- package/src/fetch-error.ts +26 -44
- package/src/fetch-request.ts +81 -24
- package/src/fetch-response.ts +177 -111
- package/src/fetch-wrap.ts +139 -90
- package/src/fetch.ts +38 -3
- package/src/transformed-response.ts +5 -2
- package/src/util.ts +142 -25
- package/tsconfig.build.json +8 -0
- package/tsconfig.json +2 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
# @atproto-labs/fetch
|
|
2
2
|
|
|
3
|
-
## 0.
|
|
3
|
+
## 0.1.1
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
-
- [`
|
|
7
|
+
- [#2770](https://github.com/bluesky-social/atproto/pull/2770) [`a07b21151`](https://github.com/bluesky-social/atproto/commit/a07b21151f1850340c4b7797ebb11521b1a6cdf3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Expose extractUrl utility
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
|
|
9
|
+
- [#2770](https://github.com/bluesky-social/atproto/pull/2770) [`a07b21151`](https://github.com/bluesky-social/atproto/commit/a07b21151f1850340c4b7797ebb11521b1a6cdf3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add redirectCheckRequestTransform utility to prevent request redirects
|
|
10
|
+
|
|
11
|
+
- [#2770](https://github.com/bluesky-social/atproto/pull/2770) [`a07b21151`](https://github.com/bluesky-social/atproto/commit/a07b21151f1850340c4b7797ebb11521b1a6cdf3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Allow customizing fetch logging function
|
|
12
|
+
|
|
13
|
+
## 0.1.0
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- [#2482](https://github.com/bluesky-social/atproto/pull/2482) [`a8d6c1123`](https://github.com/bluesky-social/atproto/commit/a8d6c112359f5c4c0cfbe2df63443ed275f2a646) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add OAuth provider capability & support for DPoP signed tokens
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Updated dependencies [[`a8d6c1123`](https://github.com/bluesky-social/atproto/commit/a8d6c112359f5c4c0cfbe2df63443ed275f2a646)]:
|
|
22
|
+
- @atproto-labs/pipe@0.1.0
|
package/dist/fetch-error.d.ts
CHANGED
|
@@ -1,16 +1,5 @@
|
|
|
1
|
-
import { Transformer } from '@atproto-labs/transformer';
|
|
2
|
-
export type FetchErrorOptions = {
|
|
3
|
-
cause?: unknown;
|
|
4
|
-
request?: Request;
|
|
5
|
-
response?: Response;
|
|
6
|
-
};
|
|
7
1
|
export declare class FetchError extends Error {
|
|
8
2
|
readonly statusCode: number;
|
|
9
|
-
|
|
10
|
-
readonly response?: Response;
|
|
11
|
-
constructor(statusCode: number, message?: string, { cause, request, response }?: FetchErrorOptions);
|
|
12
|
-
static from(err: unknown): Promise<FetchError>;
|
|
3
|
+
constructor(statusCode?: number, message?: string, options?: ErrorOptions);
|
|
13
4
|
}
|
|
14
|
-
export declare const fetchFailureHandler: Transformer<unknown, never>;
|
|
15
|
-
export declare function extractInfo(err: unknown): [statusCode: number, message: string];
|
|
16
5
|
//# sourceMappingURL=fetch-error.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-error.d.ts","sourceRoot":"","sources":["../src/fetch-error.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"fetch-error.d.ts","sourceRoot":"","sources":["../src/fetch-error.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;IACnC,SAAgB,UAAU,EAAE,MAAM,CAAA;gBAEtB,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAW1E"}
|
package/dist/fetch-error.js
CHANGED
|
@@ -1,73 +1,58 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.FetchError = void 0;
|
|
4
4
|
class FetchError extends Error {
|
|
5
|
-
constructor(statusCode, message,
|
|
6
|
-
|
|
5
|
+
constructor(statusCode, message, options) {
|
|
6
|
+
if (statusCode == null || !message) {
|
|
7
|
+
const info = extractInfo(extractRootCause(options?.cause));
|
|
8
|
+
statusCode = statusCode ?? info[0];
|
|
9
|
+
message = message || info[1];
|
|
10
|
+
}
|
|
11
|
+
super(message, options);
|
|
7
12
|
Object.defineProperty(this, "statusCode", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
configurable: true,
|
|
10
|
-
writable: true,
|
|
11
|
-
value: statusCode
|
|
12
|
-
});
|
|
13
|
-
Object.defineProperty(this, "request", {
|
|
14
13
|
enumerable: true,
|
|
15
14
|
configurable: true,
|
|
16
15
|
writable: true,
|
|
17
16
|
value: void 0
|
|
18
17
|
});
|
|
19
|
-
|
|
20
|
-
enumerable: true,
|
|
21
|
-
configurable: true,
|
|
22
|
-
writable: true,
|
|
23
|
-
value: void 0
|
|
24
|
-
});
|
|
25
|
-
this.request = request;
|
|
26
|
-
this.response = response;
|
|
27
|
-
}
|
|
28
|
-
static async from(err) {
|
|
29
|
-
const cause = extractCause(err);
|
|
30
|
-
return new FetchError(...extractInfo(cause), { cause });
|
|
18
|
+
this.statusCode = statusCode;
|
|
31
19
|
}
|
|
32
20
|
}
|
|
33
21
|
exports.FetchError = FetchError;
|
|
34
|
-
|
|
35
|
-
throw await FetchError.from(err);
|
|
36
|
-
};
|
|
37
|
-
exports.fetchFailureHandler = fetchFailureHandler;
|
|
38
|
-
function extractCause(err) {
|
|
22
|
+
function extractRootCause(err) {
|
|
39
23
|
// Unwrap the Network error from undici (i.e. Node's internal fetch() implementation)
|
|
40
24
|
// https://github.com/nodejs/undici/blob/3274c975947ce11a08508743df026f73598bfead/lib/web/fetch/index.js#L223-L228
|
|
41
25
|
if (err instanceof TypeError &&
|
|
42
26
|
err.message === 'fetch failed' &&
|
|
43
|
-
err.cause
|
|
27
|
+
err.cause !== undefined) {
|
|
44
28
|
return err.cause;
|
|
45
29
|
}
|
|
46
30
|
return err;
|
|
47
31
|
}
|
|
48
32
|
function extractInfo(err) {
|
|
49
33
|
if (typeof err === 'string' && err.length > 0) {
|
|
50
|
-
return [
|
|
34
|
+
return [500, err];
|
|
51
35
|
}
|
|
52
36
|
if (!(err instanceof Error)) {
|
|
53
|
-
return [
|
|
37
|
+
return [500, 'Failed to fetch'];
|
|
54
38
|
}
|
|
55
|
-
|
|
39
|
+
const code = err['code'];
|
|
40
|
+
if (typeof code === 'string') {
|
|
56
41
|
switch (true) {
|
|
57
|
-
case
|
|
58
|
-
return [
|
|
59
|
-
case
|
|
42
|
+
case code === 'ENOTFOUND':
|
|
43
|
+
return [400, 'Invalid hostname'];
|
|
44
|
+
case code === 'ECONNREFUSED':
|
|
60
45
|
return [502, 'Connection refused'];
|
|
61
|
-
case
|
|
46
|
+
case code === 'DEPTH_ZERO_SELF_SIGNED_CERT':
|
|
62
47
|
return [502, 'Self-signed certificate'];
|
|
63
|
-
case
|
|
48
|
+
case code.startsWith('ERR_TLS'):
|
|
64
49
|
return [502, 'TLS error'];
|
|
65
|
-
case
|
|
50
|
+
case code.startsWith('ECONN'):
|
|
66
51
|
return [502, 'Connection error'];
|
|
52
|
+
default:
|
|
53
|
+
return [500, `${code} error`];
|
|
67
54
|
}
|
|
68
55
|
}
|
|
69
|
-
|
|
70
|
-
return [502, err.message];
|
|
56
|
+
return [500, err.message];
|
|
71
57
|
}
|
|
72
|
-
exports.extractInfo = extractInfo;
|
|
73
58
|
//# sourceMappingURL=fetch-error.js.map
|
package/dist/fetch-error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-error.js","sourceRoot":"","sources":["../src/fetch-error.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"fetch-error.js","sourceRoot":"","sources":["../src/fetch-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAW,SAAQ,KAAK;IAGnC,YAAY,UAAmB,EAAE,OAAgB,EAAE,OAAsB;QACvE,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;YAC1D,UAAU,GAAG,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;YAClC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9B,CAAC;QAED,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QATT;;;;;WAAkB;QAWhC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;CACF;AAdD,gCAcC;AAED,SAAS,gBAAgB,CAAC,GAAY;IACpC,qFAAqF;IACrF,kHAAkH;IAClH,IACE,GAAG,YAAY,SAAS;QACxB,GAAG,CAAC,OAAO,KAAK,cAAc;QAC9B,GAAG,CAAC,KAAK,KAAK,SAAS,EACvB,CAAC;QACD,OAAO,GAAG,CAAC,KAAK,CAAA;IAClB,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;IACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,IAAI,KAAK,WAAW;gBACvB,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;YAClC,KAAK,IAAI,KAAK,cAAc;gBAC1B,OAAO,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAA;YACpC,KAAK,IAAI,KAAK,6BAA6B;gBACzC,OAAO,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAA;YACzC,KAAK,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC7B,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;YAC3B,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC3B,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;YAClC;gBACE,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;AAC3B,CAAC"}
|
package/dist/fetch-request.d.ts
CHANGED
|
@@ -1,7 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export declare
|
|
4
|
-
|
|
1
|
+
import { FetchError } from './fetch-error.js';
|
|
2
|
+
import { asRequest } from './fetch.js';
|
|
3
|
+
export declare class FetchRequestError extends FetchError {
|
|
4
|
+
readonly request: Request;
|
|
5
|
+
constructor(request: Request, statusCode?: number, message?: string, options?: ErrorOptions);
|
|
6
|
+
static from(request: Request, cause: unknown): FetchRequestError;
|
|
7
|
+
}
|
|
8
|
+
export declare function protocolCheckRequestTransform(protocols: {
|
|
9
|
+
'about:'?: boolean;
|
|
10
|
+
'blob:'?: boolean;
|
|
11
|
+
'data:'?: boolean;
|
|
12
|
+
'file:'?: boolean;
|
|
13
|
+
'http:'?: boolean | {
|
|
14
|
+
allowCustomPort: boolean;
|
|
15
|
+
};
|
|
16
|
+
'https:'?: boolean | {
|
|
17
|
+
allowCustomPort: boolean;
|
|
18
|
+
};
|
|
19
|
+
}): (input: Request | string | URL, init?: RequestInit) => Request;
|
|
20
|
+
export declare function redirectCheckRequestTransform(): (input: Request | string | URL, init?: RequestInit) => Request;
|
|
21
|
+
export declare function requireHostHeaderTransform(): (input: Request | string | URL, init?: RequestInit) => Request;
|
|
5
22
|
export declare const DEFAULT_FORBIDDEN_DOMAIN_NAMES: string[];
|
|
6
|
-
export declare function forbiddenDomainNameRequestTransform(denyList?: Iterable<string>):
|
|
23
|
+
export declare function forbiddenDomainNameRequestTransform(denyList?: Iterable<string>): typeof asRequest | ((input: Request | string | URL, init?: RequestInit) => Promise<Request>);
|
|
7
24
|
//# sourceMappingURL=fetch-request.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-request.d.ts","sourceRoot":"","sources":["../src/fetch-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fetch-request.d.ts","sourceRoot":"","sources":["../src/fetch-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGtC,qBAAa,iBAAkB,SAAQ,UAAU;aAE7B,OAAO,EAAE,OAAO;gBAAhB,OAAO,EAAE,OAAO,EAChC,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,YAAY;IAKxB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,iBAAiB;CAIjE;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,GAAG;QAAE,eAAe,EAAE,OAAO,CAAA;KAAE,CAAA;IAChD,QAAQ,CAAC,EAAE,OAAO,GAAG;QAAE,eAAe,EAAE,OAAO,CAAA;KAAE,CAAA;CAClD,WACgB,OAAO,GAAG,MAAM,GAAG,GAAG,SAAS,WAAW,aA0B1D;AAED,wBAAgB,6BAA6B,YAC5B,OAAO,GAAG,MAAM,GAAG,GAAG,SAAS,WAAW,aAa1D;AAED,wBAAgB,0BAA0B,YACzB,OAAO,GAAG,MAAM,GAAG,GAAG,SAAS,WAAW,aAuB1D;AAED,eAAO,MAAM,8BAA8B,UAS1C,CAAA;AAED,wBAAgB,mCAAmC,CACjD,QAAQ,GAAE,QAAQ,CAAC,MAAM,CAAkC,+BAUtC,OAAO,GAAG,MAAM,GAAG,GAAG,SAAS,WAAW,uBAsBhE"}
|
package/dist/fetch-request.js
CHANGED
|
@@ -1,35 +1,71 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.forbiddenDomainNameRequestTransform = exports.DEFAULT_FORBIDDEN_DOMAIN_NAMES = exports.
|
|
3
|
+
exports.forbiddenDomainNameRequestTransform = exports.DEFAULT_FORBIDDEN_DOMAIN_NAMES = exports.requireHostHeaderTransform = exports.redirectCheckRequestTransform = exports.protocolCheckRequestTransform = exports.FetchRequestError = void 0;
|
|
4
4
|
const fetch_error_js_1 = require("./fetch-error.js");
|
|
5
|
+
const fetch_js_1 = require("./fetch.js");
|
|
5
6
|
const util_js_1 = require("./util.js");
|
|
7
|
+
class FetchRequestError extends fetch_error_js_1.FetchError {
|
|
8
|
+
constructor(request, statusCode, message, options) {
|
|
9
|
+
super(statusCode, message, options);
|
|
10
|
+
Object.defineProperty(this, "request", {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
writable: true,
|
|
14
|
+
value: request
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
static from(request, cause) {
|
|
18
|
+
if (cause instanceof FetchRequestError)
|
|
19
|
+
return cause;
|
|
20
|
+
return new FetchRequestError(request, undefined, undefined, { cause });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.FetchRequestError = FetchRequestError;
|
|
6
24
|
function protocolCheckRequestTransform(protocols) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
25
|
+
return (input, init) => {
|
|
26
|
+
const { protocol, port } = (0, util_js_1.extractUrl)(input);
|
|
27
|
+
const request = (0, fetch_js_1.asRequest)(input, init);
|
|
28
|
+
const config = Object.hasOwn(protocols, protocol) ? protocols[protocol] : undefined;
|
|
29
|
+
if (!config) {
|
|
30
|
+
throw new FetchRequestError(request, 400, `Forbidden protocol "${protocol}"`);
|
|
31
|
+
}
|
|
32
|
+
else if (config === true) {
|
|
33
|
+
// Safe to proceed
|
|
34
|
+
}
|
|
35
|
+
else if (!config['allowCustomPort'] && port !== '') {
|
|
36
|
+
throw new FetchRequestError(request, 400, `Custom ${protocol} ports not allowed`);
|
|
12
37
|
}
|
|
13
38
|
return request;
|
|
14
39
|
};
|
|
15
40
|
}
|
|
16
41
|
exports.protocolCheckRequestTransform = protocolCheckRequestTransform;
|
|
17
|
-
function
|
|
18
|
-
return
|
|
42
|
+
function redirectCheckRequestTransform() {
|
|
43
|
+
return (input, init) => {
|
|
44
|
+
const request = (0, fetch_js_1.asRequest)(input, init);
|
|
45
|
+
if (request.redirect === 'follow') {
|
|
46
|
+
throw new FetchRequestError(request, 500, 'Request redirect must be "error" or "manual"');
|
|
47
|
+
}
|
|
48
|
+
return request;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
exports.redirectCheckRequestTransform = redirectCheckRequestTransform;
|
|
52
|
+
function requireHostHeaderTransform() {
|
|
53
|
+
return (input, init) => {
|
|
19
54
|
// Note that fetch() will automatically add the Host header from the URL and
|
|
20
55
|
// discard any Host header manually set in the request.
|
|
21
|
-
const { protocol, hostname } =
|
|
56
|
+
const { protocol, hostname } = (0, util_js_1.extractUrl)(input);
|
|
57
|
+
const request = (0, fetch_js_1.asRequest)(input, init);
|
|
22
58
|
// "Host" header only makes sense in the context of an HTTP request
|
|
23
|
-
if (protocol !== 'http:' && protocol !== 'https') {
|
|
24
|
-
throw new
|
|
59
|
+
if (protocol !== 'http:' && protocol !== 'https:') {
|
|
60
|
+
throw new FetchRequestError(request, 400, `"${protocol}" requests are not allowed`);
|
|
25
61
|
}
|
|
26
62
|
if (!hostname || (0, util_js_1.isIp)(hostname)) {
|
|
27
|
-
throw new
|
|
63
|
+
throw new FetchRequestError(request, 400, 'Invalid hostname');
|
|
28
64
|
}
|
|
29
65
|
return request;
|
|
30
66
|
};
|
|
31
67
|
}
|
|
32
|
-
exports.
|
|
68
|
+
exports.requireHostHeaderTransform = requireHostHeaderTransform;
|
|
33
69
|
exports.DEFAULT_FORBIDDEN_DOMAIN_NAMES = [
|
|
34
70
|
'example.com',
|
|
35
71
|
'*.example.com',
|
|
@@ -45,20 +81,21 @@ function forbiddenDomainNameRequestTransform(denyList = exports.DEFAULT_FORBIDDE
|
|
|
45
81
|
// Optimization: if no forbidden domain names are provided, we can skip the
|
|
46
82
|
// check entirely.
|
|
47
83
|
if (denySet.size === 0) {
|
|
48
|
-
return
|
|
84
|
+
return fetch_js_1.asRequest;
|
|
49
85
|
}
|
|
50
|
-
return async (
|
|
51
|
-
const { hostname } =
|
|
86
|
+
return async (input, init) => {
|
|
87
|
+
const { hostname } = (0, util_js_1.extractUrl)(input);
|
|
88
|
+
const request = (0, fetch_js_1.asRequest)(input, init);
|
|
52
89
|
// Full domain name check
|
|
53
90
|
if (denySet.has(hostname)) {
|
|
54
|
-
throw new
|
|
91
|
+
throw new FetchRequestError(request, 403, 'Forbidden hostname');
|
|
55
92
|
}
|
|
56
93
|
// Sub domain name check
|
|
57
94
|
let curDot = hostname.indexOf('.');
|
|
58
95
|
while (curDot !== -1) {
|
|
59
96
|
const subdomain = hostname.slice(curDot + 1);
|
|
60
97
|
if (denySet.has(`*.${subdomain}`)) {
|
|
61
|
-
throw new
|
|
98
|
+
throw new FetchRequestError(request, 403, 'Forbidden hostname');
|
|
62
99
|
}
|
|
63
100
|
curDot = hostname.indexOf('.', curDot + 1);
|
|
64
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-request.js","sourceRoot":"","sources":["../src/fetch-request.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"fetch-request.js","sourceRoot":"","sources":["../src/fetch-request.ts"],"names":[],"mappings":"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"}
|
package/dist/fetch-response.d.ts
CHANGED
|
@@ -1,24 +1,42 @@
|
|
|
1
|
-
import { Transformer } from '@atproto-labs/
|
|
2
|
-
import {
|
|
3
|
-
import { FetchError
|
|
1
|
+
import { Transformer } from '@atproto-labs/pipe';
|
|
2
|
+
import type { ZodTypeAny, ParseParams, TypeOf } from 'zod';
|
|
3
|
+
import { FetchError } from './fetch-error.js';
|
|
4
4
|
import { Json } from './util.js';
|
|
5
5
|
export type ResponseTranformer = Transformer<Response>;
|
|
6
6
|
export type ResponseMessageGetter = Transformer<Response, string | undefined>;
|
|
7
7
|
export declare class FetchResponseError extends FetchError {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
readonly response: Response;
|
|
9
|
+
constructor(response: Response, statusCode?: number, message?: string, options?: ErrorOptions);
|
|
10
|
+
static from(response: Response, customMessage?: string | ResponseMessageGetter, statusCode?: number, options?: ErrorOptions): Promise<FetchResponseError>;
|
|
10
11
|
}
|
|
12
|
+
export declare function peekJson(response: Response, maxSize?: number): Promise<undefined | Json>;
|
|
13
|
+
export declare function checkLength(response: Response, maxBytes: number): number | undefined;
|
|
14
|
+
export declare function extractLength(response: Response): number | undefined;
|
|
15
|
+
export declare function extractMime(response: Response): string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* If the transformer results in an error, ensure that the response body is
|
|
18
|
+
* consumed as, in some environments (Node 👀), the response will not
|
|
19
|
+
* automatically be GC'd.
|
|
20
|
+
*
|
|
21
|
+
* @see {@link https://undici.nodejs.org/#/?id=garbage-collection}
|
|
22
|
+
* @param [onCancellationError] - Callback to handle any async body cancelling
|
|
23
|
+
* error. Defaults to logging the error. Do not use `null` if the request is
|
|
24
|
+
* cloned.
|
|
25
|
+
*/
|
|
26
|
+
export declare function cancelBodyOnError<T>(transformer: Transformer<Response, T>, onCancellationError?: null | ((err: unknown) => void)): (response: Response) => Promise<T>;
|
|
11
27
|
export declare function fetchOkProcessor(customMessage?: string | ResponseMessageGetter): ResponseTranformer;
|
|
28
|
+
export declare function fetchOkTransformer(response: Response, customMessage?: string | ResponseMessageGetter): Promise<Response>;
|
|
12
29
|
export declare function fetchMaxSizeProcessor(maxBytes: number): ResponseTranformer;
|
|
13
|
-
export declare function
|
|
14
|
-
export type
|
|
15
|
-
export type
|
|
16
|
-
export declare function fetchTypeProcessor(
|
|
30
|
+
export declare function fetchResponseMaxSizeChecker(response: Response, maxBytes: number): Response;
|
|
31
|
+
export type MimeTypeCheckFn = (mimeType: string) => boolean;
|
|
32
|
+
export type MimeTypeCheck = string | RegExp | MimeTypeCheckFn;
|
|
33
|
+
export declare function fetchTypeProcessor(expectedMime: MimeTypeCheck, contentTypeRequired?: boolean): ResponseTranformer;
|
|
34
|
+
export declare function fetchResponseTypeChecker(response: Response, isExpectedMime: MimeTypeCheckFn, contentTypeRequired?: boolean): Promise<Response>;
|
|
17
35
|
export type ParsedJsonResponse<T = Json> = {
|
|
18
36
|
response: Response;
|
|
19
37
|
json: T;
|
|
20
38
|
};
|
|
21
|
-
export declare function
|
|
22
|
-
export declare function fetchJsonProcessor<T = Json>(
|
|
23
|
-
export declare function fetchJsonZodProcessor<S extends
|
|
39
|
+
export declare function fetchResponseJsonTranformer<T = Json>(response: Response): Promise<ParsedJsonResponse<T>>;
|
|
40
|
+
export declare function fetchJsonProcessor<T = Json>(expectedMime?: MimeTypeCheck, contentTypeRequired?: boolean): Transformer<Response, ParsedJsonResponse<T>>;
|
|
41
|
+
export declare function fetchJsonZodProcessor<S extends ZodTypeAny>(schema: S, params?: Partial<ParseParams>): Transformer<ParsedJsonResponse, TypeOf<S>>;
|
|
24
42
|
//# sourceMappingURL=fetch-response.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-response.d.ts","sourceRoot":"","sources":["../src/fetch-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"fetch-response.d.ts","sourceRoot":"","sources":["../src/fetch-response.ts"],"names":[],"mappings":"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"}
|