Skip to content

Commit a4b9753

Browse files
authored
feat: better errors for Node.JS bindings (#406)
Closes #397.
1 parent 15894c8 commit a4b9753

12 files changed

Lines changed: 444 additions & 58 deletions

File tree

Cargo.lock

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ members = [
1010
[patch.crates-io]
1111
h2 = { git = "https://github.com/apify/h2", rev = "7f393a728a8db07cabb1b78d2094772b33943b9a" }
1212
rustls = { git = "https://github.com/apify/rustls", rev="4823cdb16098938eccf91af1329e9d5b681e3554" }
13-
tower-http = { git = "https://github.com/apify/tower-http", branch="main" }
13+
tower-http = { git = "https://github.com/apify/tower-http", rev="f9efc0d9193e774d33aedc1022b922efefc22052" }
14+
hyper-util = { git = "https://github.com/apify/hyper-util", rev="9b7795dfd7158fc55e7c84b65bf1dae1d2dea67d" }
1415

1516
[profile.release]
1617
strip = true # Automatically strip symbols from the binary.

impit-node/dts-header.d.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/* auto-generated by NAPI-RS */
2+
/* eslint-disable */
3+
4+
export declare class ImpitError extends Error {}
5+
export declare class HTTPError extends ImpitError {}
6+
export declare class RequestError extends ImpitError {}
7+
export declare class TransportError extends RequestError {}
8+
export declare class TimeoutError extends TransportError {}
9+
export declare class ConnectTimeout extends TimeoutError {}
10+
export declare class ReadTimeout extends TimeoutError {}
11+
export declare class WriteTimeout extends TimeoutError {}
12+
export declare class PoolTimeout extends TimeoutError {}
13+
export declare class NetworkError extends TransportError {}
14+
export declare class ConnectError extends NetworkError {}
15+
export declare class ReadError extends NetworkError {}
16+
export declare class WriteError extends NetworkError {}
17+
export declare class CloseError extends NetworkError {}
18+
export declare class ProtocolError extends TransportError {}
19+
export declare class LocalProtocolError extends ProtocolError {}
20+
export declare class RemoteProtocolError extends ProtocolError {}
21+
export declare class ProxyError extends TransportError {}
22+
export declare class ProxyTunnelError extends ProxyError {
23+
status?: number
24+
}
25+
export declare class ProxyAuthRequired extends ProxyError {}
26+
export declare class UnsupportedProtocol extends TransportError {}
27+
export declare class DecodingError extends RequestError {}
28+
export declare class TooManyRedirects extends RequestError {}
29+
export declare class HTTPStatusError extends HTTPError {}
30+
export declare class InvalidURL extends ImpitError {}
31+
export declare class CookieConflict extends ImpitError {}
32+
export declare class StreamError extends ImpitError {}
33+
export declare class StreamConsumed extends StreamError {}
34+
export declare class ResponseNotRead extends StreamError {}
35+
export declare class RequestNotRead extends StreamError {}
36+
export declare class StreamClosed extends StreamError {}

impit-node/errors.js

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
class ImpitError extends Error { constructor(msg) { super(msg); this.name = this.constructor.name; } }
2+
class HTTPError extends ImpitError {}
3+
class RequestError extends ImpitError {}
4+
class TransportError extends RequestError {}
5+
class TimeoutError extends TransportError {}
6+
class ConnectTimeout extends TimeoutError {}
7+
class ReadTimeout extends TimeoutError {}
8+
class WriteTimeout extends TimeoutError {}
9+
class PoolTimeout extends TimeoutError {}
10+
class NetworkError extends TransportError {}
11+
class ConnectError extends NetworkError {}
12+
class ReadError extends NetworkError {}
13+
class WriteError extends NetworkError {}
14+
class CloseError extends NetworkError {}
15+
class ProtocolError extends TransportError {}
16+
class LocalProtocolError extends ProtocolError {}
17+
class RemoteProtocolError extends ProtocolError {}
18+
class ProxyError extends TransportError {}
19+
class ProxyTunnelError extends ProxyError {
20+
constructor(msg) {
21+
super(msg);
22+
const match = msg.match(/with status code (\d+)/);
23+
this.status = match ? Number(match[1]) : undefined;
24+
}
25+
}
26+
class ProxyAuthRequired extends ProxyError {}
27+
class UnsupportedProtocol extends TransportError {}
28+
class DecodingError extends RequestError {}
29+
class TooManyRedirects extends RequestError {}
30+
class HTTPStatusError extends HTTPError {}
31+
class InvalidURL extends ImpitError {}
32+
class CookieConflict extends ImpitError {}
33+
class StreamError extends ImpitError {}
34+
class StreamConsumed extends StreamError {}
35+
class ResponseNotRead extends StreamError {}
36+
class RequestNotRead extends StreamError {}
37+
class StreamClosed extends StreamError {}
38+
39+
const errorClassMap = {
40+
HTTPError,
41+
RequestError,
42+
TransportError,
43+
TimeoutException: TimeoutError,
44+
ConnectTimeout,
45+
ReadTimeout,
46+
WriteTimeout,
47+
PoolTimeout,
48+
NetworkError,
49+
ConnectError,
50+
ReadError,
51+
WriteError,
52+
CloseError,
53+
ProtocolError,
54+
LocalProtocolError,
55+
RemoteProtocolError,
56+
ProxyError,
57+
ProxyTunnelError,
58+
ProxyAuthRequired,
59+
UnsupportedProtocol,
60+
DecodingError,
61+
TooManyRedirects,
62+
HTTPStatusError,
63+
InvalidURL,
64+
CookieConflict,
65+
StreamError,
66+
StreamConsumed,
67+
ResponseNotRead,
68+
RequestNotRead,
69+
StreamClosed,
70+
};
71+
72+
function rethrowNativeError(err) {
73+
const match = err.message?.match(/^(\w+): ([\s\S]*)$/);
74+
if (match) {
75+
const [, code, message] = match;
76+
const ErrorClass = errorClassMap[code];
77+
if (ErrorClass) {
78+
throw new ErrorClass(message);
79+
}
80+
}
81+
throw err;
82+
}
83+
84+
module.exports = {
85+
rethrowNativeError,
86+
ImpitError,
87+
HTTPError,
88+
RequestError,
89+
TransportError,
90+
TimeoutError,
91+
ConnectTimeout,
92+
ReadTimeout,
93+
WriteTimeout,
94+
PoolTimeout,
95+
NetworkError,
96+
ConnectError,
97+
ReadError,
98+
WriteError,
99+
CloseError,
100+
ProtocolError,
101+
LocalProtocolError,
102+
RemoteProtocolError,
103+
ProxyError,
104+
ProxyTunnelError,
105+
ProxyAuthRequired,
106+
UnsupportedProtocol,
107+
DecodingError,
108+
TooManyRedirects,
109+
HTTPStatusError,
110+
InvalidURL,
111+
CookieConflict,
112+
StreamError,
113+
StreamConsumed,
114+
ResponseNotRead,
115+
RequestNotRead,
116+
StreamClosed,
117+
};

impit-node/index.d.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,40 @@
11
/* auto-generated by NAPI-RS */
22
/* eslint-disable */
33

4+
export declare class ImpitError extends Error {}
5+
export declare class HTTPError extends ImpitError {}
6+
export declare class RequestError extends ImpitError {}
7+
export declare class TransportError extends RequestError {}
8+
export declare class TimeoutError extends TransportError {}
9+
export declare class ConnectTimeout extends TimeoutError {}
10+
export declare class ReadTimeout extends TimeoutError {}
11+
export declare class WriteTimeout extends TimeoutError {}
12+
export declare class PoolTimeout extends TimeoutError {}
13+
export declare class NetworkError extends TransportError {}
14+
export declare class ConnectError extends NetworkError {}
15+
export declare class ReadError extends NetworkError {}
16+
export declare class WriteError extends NetworkError {}
17+
export declare class CloseError extends NetworkError {}
18+
export declare class ProtocolError extends TransportError {}
19+
export declare class LocalProtocolError extends ProtocolError {}
20+
export declare class RemoteProtocolError extends ProtocolError {}
21+
export declare class ProxyError extends TransportError {}
22+
export declare class ProxyTunnelError extends ProxyError {
23+
status?: number
24+
}
25+
export declare class ProxyAuthRequired extends ProxyError {}
26+
export declare class UnsupportedProtocol extends TransportError {}
27+
export declare class DecodingError extends RequestError {}
28+
export declare class TooManyRedirects extends RequestError {}
29+
export declare class HTTPStatusError extends HTTPError {}
30+
export declare class InvalidURL extends ImpitError {}
31+
export declare class CookieConflict extends ImpitError {}
32+
export declare class StreamError extends ImpitError {}
33+
export declare class StreamConsumed extends StreamError {}
34+
export declare class ResponseNotRead extends StreamError {}
35+
export declare class RequestNotRead extends StreamError {}
36+
export declare class StreamClosed extends StreamError {}
37+
438
export type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array
539
/**
640
* The main class of the `impit` package

0 commit comments

Comments
 (0)