request-got-adapter 0.1.1 → 0.1.2
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/README.md +1 -0
- package/dist/core.js +20 -1
- package/dist/errors.d.ts +11 -11
- package/dist/errors.js +21 -4
- package/dist/index.d.ts +8 -4
- package/dist/response.d.ts +8 -0
- package/dist/response.js +32 -0
- package/dist/translate.js +8 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -112,6 +112,7 @@ One deliberate improvement over the reference: passing an object `body` without
|
|
|
112
112
|
| `agent` / `agentOptions` / `forever` / `.forever()` | ✅ |
|
|
113
113
|
| `jar` / `request.jar()` / `request.cookie()` (tough-cookie) | ✅ |
|
|
114
114
|
| `transform` / `transform2xxOnly` | ✅ |
|
|
115
|
+
| `response.caseless` (case-insensitive header helper) | ✅ |
|
|
115
116
|
| `localAddress` / `family` / `lookup` | ✅ |
|
|
116
117
|
| `.defaults()` (chainable) | ✅ |
|
|
117
118
|
| Callback style `(err, response, body)` alongside promises | ✅ |
|
package/dist/core.js
CHANGED
|
@@ -46,6 +46,23 @@ function toRequestError(err, prepared) {
|
|
|
46
46
|
}
|
|
47
47
|
return new errors_1.RequestError(cause, prepared.rpOptions, undefined);
|
|
48
48
|
}
|
|
49
|
+
const errorListenerAttached = Symbol.for('request-got-adapter.errorListenerAttached');
|
|
50
|
+
const swallowLateErrors = () => { };
|
|
51
|
+
// request kept 'error' listeners on the request and its socket for their whole
|
|
52
|
+
// lifetime; without this, late socket errors emitted after got settles (seen with
|
|
53
|
+
// keep-alive reuse and mocked sockets) become unhandled 'error' events.
|
|
54
|
+
function attachDefensiveErrorListeners(pending) {
|
|
55
|
+
const promiseWithEvents = pending;
|
|
56
|
+
promiseWithEvents.on?.('request', (request) => {
|
|
57
|
+
request.on('error', swallowLateErrors);
|
|
58
|
+
request.on('socket', (socket) => {
|
|
59
|
+
if (!socket[errorListenerAttached]) {
|
|
60
|
+
socket[errorListenerAttached] = true;
|
|
61
|
+
socket.on('error', swallowLateErrors);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
49
66
|
async function gotCall(prepared, extraHeaders) {
|
|
50
67
|
const gotModule = await (0, got_loader_1.loadGot)();
|
|
51
68
|
const got = gotModule.default;
|
|
@@ -56,7 +73,9 @@ async function gotCall(prepared, extraHeaders) {
|
|
|
56
73
|
}
|
|
57
74
|
: prepared.gotOptions;
|
|
58
75
|
try {
|
|
59
|
-
|
|
76
|
+
const pending = got(prepared.url, options);
|
|
77
|
+
attachDefensiveErrorListeners(pending);
|
|
78
|
+
return await pending;
|
|
60
79
|
}
|
|
61
80
|
catch (err) {
|
|
62
81
|
throw toRequestError(err, prepared);
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
export declare class StatusCodeError extends Error {
|
|
2
2
|
name: "StatusCodeError";
|
|
3
3
|
statusCode: number;
|
|
4
|
-
error:
|
|
5
|
-
options:
|
|
6
|
-
response:
|
|
4
|
+
error: any;
|
|
5
|
+
options: any;
|
|
6
|
+
response: any;
|
|
7
7
|
constructor(statusCode: number, body: unknown, options?: unknown, response?: unknown);
|
|
8
8
|
}
|
|
9
9
|
export declare class RequestError extends Error {
|
|
10
10
|
name: "RequestError";
|
|
11
|
-
cause:
|
|
12
|
-
error:
|
|
13
|
-
options:
|
|
14
|
-
response:
|
|
11
|
+
cause: any;
|
|
12
|
+
error: any;
|
|
13
|
+
options: any;
|
|
14
|
+
response: any;
|
|
15
15
|
constructor(cause: unknown, options?: unknown, response?: unknown);
|
|
16
16
|
}
|
|
17
17
|
export declare class TransformError extends Error {
|
|
18
18
|
name: "TransformError";
|
|
19
|
-
cause:
|
|
20
|
-
error:
|
|
21
|
-
options:
|
|
22
|
-
response:
|
|
19
|
+
cause: any;
|
|
20
|
+
error: any;
|
|
21
|
+
options: any;
|
|
22
|
+
response: any;
|
|
23
23
|
constructor(cause: unknown, options?: unknown, response?: unknown);
|
|
24
24
|
}
|
package/dist/errors.js
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Error classes matching request-promise-core's errors 1:1 (names, fields, message formats).
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
3
|
exports.TransformError = exports.RequestError = exports.StatusCodeError = void 0;
|
|
4
|
+
// Error classes matching request-promise-core's errors 1:1 (names, fields, message formats).
|
|
5
|
+
// request-promise-core assigns `this.message` in plain constructors, making it an
|
|
6
|
+
// ENUMERABLE own property — consumers rely on `{ ...err }` spreads and JSON.stringify
|
|
7
|
+
// keeping the message, so mirror that explicitly (ES class super() makes it non-enumerable).
|
|
8
|
+
function exposeMessage(error, message) {
|
|
9
|
+
Object.defineProperty(error, 'message', {
|
|
10
|
+
value: message,
|
|
11
|
+
enumerable: true,
|
|
12
|
+
writable: true,
|
|
13
|
+
configurable: true
|
|
14
|
+
});
|
|
15
|
+
}
|
|
5
16
|
class StatusCodeError extends Error {
|
|
6
17
|
name = 'StatusCodeError';
|
|
7
18
|
statusCode;
|
|
@@ -9,7 +20,9 @@ class StatusCodeError extends Error {
|
|
|
9
20
|
options;
|
|
10
21
|
response;
|
|
11
22
|
constructor(statusCode, body, options, response) {
|
|
12
|
-
|
|
23
|
+
const message = `${statusCode} - ${JSON.stringify(body)}`;
|
|
24
|
+
super(message);
|
|
25
|
+
exposeMessage(this, message);
|
|
13
26
|
this.statusCode = statusCode;
|
|
14
27
|
this.error = body;
|
|
15
28
|
this.options = options;
|
|
@@ -25,7 +38,9 @@ class RequestError extends Error {
|
|
|
25
38
|
options;
|
|
26
39
|
response;
|
|
27
40
|
constructor(cause, options, response) {
|
|
28
|
-
|
|
41
|
+
const message = String(cause);
|
|
42
|
+
super(message);
|
|
43
|
+
exposeMessage(this, message);
|
|
29
44
|
this.cause = cause;
|
|
30
45
|
this.error = cause;
|
|
31
46
|
this.options = options;
|
|
@@ -41,7 +56,9 @@ class TransformError extends Error {
|
|
|
41
56
|
options;
|
|
42
57
|
response;
|
|
43
58
|
constructor(cause, options, response) {
|
|
44
|
-
|
|
59
|
+
const message = String(cause);
|
|
60
|
+
super(message);
|
|
61
|
+
exposeMessage(this, message);
|
|
45
62
|
this.cause = cause;
|
|
46
63
|
this.error = cause;
|
|
47
64
|
this.options = options;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jar as createJar, cookie as parseCookieString } from './cookies';
|
|
2
2
|
import { RequestError as RequestErrorClass, StatusCodeError as StatusCodeErrorClass, TransformError as TransformErrorClass } from './errors';
|
|
3
3
|
import type { FullResponse as FullResponseShape } from './response';
|
|
4
4
|
import type { AuthOptions, OAuthOptions } from './rp-options';
|
|
5
5
|
declare function requestGotAdapter(uriOrOptions: string | requestGotAdapter.Options, optionsOrCallback?: requestGotAdapter.RequestPromiseOptions | requestGotAdapter.RequestCallback, callback?: requestGotAdapter.RequestCallback): requestGotAdapter.RequestPromise;
|
|
6
6
|
declare namespace requestGotAdapter {
|
|
7
|
-
type RequestCallback = (error:
|
|
7
|
+
type RequestCallback = (error: any, response: any, body: any) => void;
|
|
8
8
|
type FullResponse = FullResponseShape;
|
|
9
9
|
interface RequestPromise<T = any> extends Promise<T> {
|
|
10
10
|
promise(): Promise<T>;
|
|
@@ -29,7 +29,7 @@ declare namespace requestGotAdapter {
|
|
|
29
29
|
time?: boolean;
|
|
30
30
|
simple?: boolean;
|
|
31
31
|
resolveWithFullResponse?: boolean;
|
|
32
|
-
followRedirect?: boolean;
|
|
32
|
+
followRedirect?: boolean | ((response: any) => boolean);
|
|
33
33
|
followAllRedirects?: boolean;
|
|
34
34
|
followOriginalHttpMethod?: boolean;
|
|
35
35
|
maxRedirects?: number;
|
|
@@ -62,7 +62,11 @@ declare namespace requestGotAdapter {
|
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
64
|
type Options = OptionsWithUri | OptionsWithUrl;
|
|
65
|
-
|
|
65
|
+
interface CookieJar {
|
|
66
|
+
setCookie: (cookieOrString: any, uri: string, options?: any) => any;
|
|
67
|
+
getCookieString: (uri: string) => string;
|
|
68
|
+
getCookies: (uri: string) => any[];
|
|
69
|
+
}
|
|
66
70
|
interface RequestPromiseCall {
|
|
67
71
|
(options: Options, callback?: RequestCallback): RequestPromise;
|
|
68
72
|
(uri: string, options?: RequestPromiseOptions, callback?: RequestCallback): RequestPromise;
|
package/dist/response.d.ts
CHANGED
|
@@ -24,6 +24,13 @@ interface GotResponseLike {
|
|
|
24
24
|
};
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
+
export interface Caseless {
|
|
28
|
+
get: (name: string) => unknown;
|
|
29
|
+
has: (name: string) => string | false;
|
|
30
|
+
set: (name: string, value: unknown) => void;
|
|
31
|
+
del: (name: string) => void;
|
|
32
|
+
swap: (name: string) => void;
|
|
33
|
+
}
|
|
27
34
|
export interface FullResponse {
|
|
28
35
|
statusCode: number;
|
|
29
36
|
statusMessage?: string;
|
|
@@ -31,6 +38,7 @@ export interface FullResponse {
|
|
|
31
38
|
rawHeaders?: string[];
|
|
32
39
|
httpVersion?: string;
|
|
33
40
|
body: unknown;
|
|
41
|
+
caseless: Caseless;
|
|
34
42
|
request: {
|
|
35
43
|
uri: ReturnType<typeof parseLegacyUrl>;
|
|
36
44
|
method: string;
|
package/dist/response.js
CHANGED
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildFullResponse = buildFullResponse;
|
|
4
4
|
const node_url_1 = require("node:url");
|
|
5
|
+
// request responses carry a `caseless` helper for case-insensitive header access
|
|
6
|
+
function makeCaseless(headers) {
|
|
7
|
+
const findKey = (name) => {
|
|
8
|
+
const lower = name.toLowerCase();
|
|
9
|
+
return Object.keys(headers).find((key) => key.toLowerCase() === lower);
|
|
10
|
+
};
|
|
11
|
+
return {
|
|
12
|
+
get(name) {
|
|
13
|
+
const key = findKey(name);
|
|
14
|
+
return key === undefined ? undefined : headers[key];
|
|
15
|
+
},
|
|
16
|
+
has(name) {
|
|
17
|
+
return findKey(name) ?? false;
|
|
18
|
+
},
|
|
19
|
+
set(name, value) {
|
|
20
|
+
headers[findKey(name) ?? name] = value;
|
|
21
|
+
},
|
|
22
|
+
del(name) {
|
|
23
|
+
const key = findKey(name);
|
|
24
|
+
if (key !== undefined)
|
|
25
|
+
delete headers[key];
|
|
26
|
+
},
|
|
27
|
+
swap(name) {
|
|
28
|
+
const key = findKey(name);
|
|
29
|
+
if (key === undefined || key === name)
|
|
30
|
+
return;
|
|
31
|
+
headers[name] = headers[key];
|
|
32
|
+
delete headers[key];
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
5
36
|
function buildFullResponse(gotResponse, prepared, body) {
|
|
6
37
|
const finalMethod = gotResponse.request?.options?.method ?? prepared.method;
|
|
7
38
|
const requestPart = {
|
|
@@ -16,6 +47,7 @@ function buildFullResponse(gotResponse, prepared, body) {
|
|
|
16
47
|
rawHeaders: gotResponse.rawHeaders,
|
|
17
48
|
httpVersion: gotResponse.httpVersion,
|
|
18
49
|
body,
|
|
50
|
+
caseless: makeCaseless(gotResponse.headers),
|
|
19
51
|
request: requestPart,
|
|
20
52
|
toJSON() {
|
|
21
53
|
return {
|
package/dist/translate.js
CHANGED
|
@@ -224,6 +224,14 @@ function prepare(rpOptions) {
|
|
|
224
224
|
body = `${body}&${(0, oauth_1.toOAuthQuery)(oauthParams)}`;
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
|
+
// request computes content-length (as a number) for string/Buffer bodies and
|
|
228
|
+
// records it on the outgoing headers — visible via response.request.headers
|
|
229
|
+
if (body !== undefined && !(0, headers_1.hasHeader)(headers, 'content-length')) {
|
|
230
|
+
if (typeof body === 'string')
|
|
231
|
+
headers['content-length'] = Buffer.byteLength(body);
|
|
232
|
+
else if (Buffer.isBuffer(body))
|
|
233
|
+
headers['content-length'] = body.length;
|
|
234
|
+
}
|
|
227
235
|
const gotHeaders = { ...headers };
|
|
228
236
|
// got injects its own user-agent unless explicitly disabled; request sends none
|
|
229
237
|
if (!(0, headers_1.hasHeader)(gotHeaders, 'user-agent'))
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "request-got-adapter",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Drop-in replacement for request-promise-native, backed by got. Same API, same options, same errors — no deprecated request-family dependencies.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|