@lodestar/utils 1.30.0-dev.c91cd9c141 → 1.30.0-dev.d85e73aa12

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/lib/fetch.d.ts ADDED
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Native fetch with transparent and consistent error handling
3
+ *
4
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/fetch)
5
+ */
6
+ declare function wrappedFetch(url: string | URL, init?: RequestInit): Promise<Response>;
7
+ export { wrappedFetch as fetch };
8
+ export declare function isFetchError(e: unknown): e is FetchError;
9
+ export type FetchErrorType = "failed" | "input" | "aborted" | "timeout" | "unknown";
10
+ type FetchErrorCause = NativeFetchFailedError["cause"] | NativeFetchInputError["cause"];
11
+ export declare class FetchError extends Error {
12
+ type: FetchErrorType;
13
+ code: string;
14
+ cause?: FetchErrorCause;
15
+ constructor(url: string | URL, e: unknown);
16
+ }
17
+ type NativeFetchError = TypeError & {
18
+ cause: Error & {
19
+ code?: string;
20
+ };
21
+ };
22
+ /**
23
+ * ```
24
+ * TypeError: fetch failed
25
+ * cause: Error: connect ECONNREFUSED 127.0.0.1:9596
26
+ * errno: -111,
27
+ * code: 'ECONNREFUSED',
28
+ * syscall: 'connect',
29
+ * address: '127.0.0.1',
30
+ * port: 9596
31
+ * ---------------------------
32
+ * TypeError: fetch failed
33
+ * cause: Error: getaddrinfo ENOTFOUND non-existent-domain
34
+ * errno: -3008,
35
+ * code: 'ENOTFOUND',
36
+ * syscall: 'getaddrinfo',
37
+ * hostname: 'non-existent-domain'
38
+ * ---------------------------
39
+ * TypeError: fetch failed
40
+ * cause: SocketError: other side closed
41
+ * code: 'UND_ERR_SOCKET',
42
+ * socket: {}
43
+ * ---------------------------
44
+ * TypeError: fetch failed
45
+ * cause: Error: unknown scheme
46
+ * [cause]: undefined
47
+ * ```
48
+ */
49
+ type NativeFetchFailedError = NativeFetchError & {
50
+ message: "fetch failed";
51
+ cause: {
52
+ errno?: string;
53
+ syscall?: string;
54
+ address?: string;
55
+ port?: string;
56
+ hostname?: string;
57
+ socket?: object;
58
+ [prop: string]: unknown;
59
+ };
60
+ };
61
+ /**
62
+ * ```
63
+ * TypeError: Failed to parse URL from invalid-url
64
+ * [cause]: TypeError [ERR_INVALID_URL]: Invalid URL
65
+ * input: 'invalid-url',
66
+ * code: 'ERR_INVALID_URL'
67
+ * ```
68
+ */
69
+ type NativeFetchInputError = NativeFetchError & {
70
+ cause: {
71
+ input: unknown;
72
+ };
73
+ };
74
+ //# sourceMappingURL=fetch.d.ts.map
package/lib/fetch.js ADDED
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Native fetch with transparent and consistent error handling
3
+ *
4
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/fetch)
5
+ */
6
+ async function wrappedFetch(url, init) {
7
+ try {
8
+ // This function wraps global `fetch` which should only be directly called here
9
+ // biome-ignore lint/style/noRestrictedGlobals: <explanation>
10
+ return await fetch(url, init);
11
+ }
12
+ catch (e) {
13
+ throw new FetchError(url, e);
14
+ }
15
+ }
16
+ export { wrappedFetch as fetch };
17
+ export function isFetchError(e) {
18
+ return e instanceof FetchError;
19
+ }
20
+ export class FetchError extends Error {
21
+ constructor(url, e) {
22
+ if (isNativeFetchFailedError(e)) {
23
+ super(`Request to ${url.toString()} failed, reason: ${e.cause.message}`);
24
+ this.type = "failed";
25
+ this.code = e.cause.code || "ERR_FETCH_FAILED";
26
+ this.cause = e.cause;
27
+ }
28
+ else if (isNativeFetchInputError(e)) {
29
+ // For input errors the e.message is more detailed
30
+ super(e.message);
31
+ this.type = "input";
32
+ this.code = e.cause.code || "ERR_INVALID_INPUT";
33
+ this.cause = e.cause;
34
+ }
35
+ else if (isNativeFetchAbortError(e)) {
36
+ super(`Request to ${url.toString()} was aborted`);
37
+ this.type = "aborted";
38
+ this.code = "ERR_ABORTED";
39
+ }
40
+ else if (isNativeFetchTimeoutError(e)) {
41
+ super(`Request to ${url.toString()} timed out`);
42
+ this.type = "timeout";
43
+ this.code = "ERR_TIMEOUT";
44
+ }
45
+ else {
46
+ super(e.message);
47
+ this.type = "unknown";
48
+ this.code = "ERR_UNKNOWN";
49
+ }
50
+ this.name = this.constructor.name;
51
+ }
52
+ }
53
+ function isNativeFetchError(e) {
54
+ return e instanceof TypeError && e.cause instanceof Error;
55
+ }
56
+ function isNativeFetchFailedError(e) {
57
+ return isNativeFetchError(e) && e.message === "fetch failed";
58
+ }
59
+ function isNativeFetchInputError(e) {
60
+ return isNativeFetchError(e) && e.cause.input !== undefined;
61
+ }
62
+ function isNativeFetchAbortError(e) {
63
+ return e instanceof DOMException && e.name === "AbortError";
64
+ }
65
+ function isNativeFetchTimeoutError(e) {
66
+ return e instanceof DOMException && e.name === "TimeoutError";
67
+ }
68
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -24,4 +24,5 @@ export * from "./verifyMerkleBranch.js";
24
24
  export * from "./promise.js";
25
25
  export * from "./waitFor.js";
26
26
  export * from "./ethConversion.js";
27
+ export * from "./fetch.js";
27
28
  //# sourceMappingURL=index.d.ts.map
package/lib/index.js CHANGED
@@ -24,4 +24,5 @@ export * from "./verifyMerkleBranch.js";
24
24
  export * from "./promise.js";
25
25
  export * from "./waitFor.js";
26
26
  export * from "./ethConversion.js";
27
+ export * from "./fetch.js";
27
28
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAC,KAAK,EAAoB,MAAM,YAAY,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAwB,OAAO,EAAyB,MAAM,YAAY,CAAC;AAClF,cAAc,UAAU,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAC,KAAK,EAAoB,MAAM,YAAY,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAwB,OAAO,EAAyB,MAAM,YAAY,CAAC;AAClF,cAAc,UAAU,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
package/lib/timeout.js CHANGED
@@ -1,7 +1,10 @@
1
1
  import { anySignal } from "any-signal";
2
- import { TimeoutError } from "./errors.js";
2
+ import { ErrorAborted, TimeoutError } from "./errors.js";
3
3
  import { sleep } from "./sleep.js";
4
4
  export async function withTimeout(asyncFn, timeoutMs, signal) {
5
+ if (signal?.aborted) {
6
+ throw new ErrorAborted();
7
+ }
5
8
  const timeoutAbortController = new AbortController();
6
9
  const timeoutAndParentSignal = anySignal([timeoutAbortController.signal, ...(signal ? [signal] : [])]);
7
10
  async function timeoutPromise(signal) {
@@ -1 +1 @@
1
- {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../src/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AACrC,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA6D,EAC7D,SAAiB,EACjB,MAAoB;IAEpB,MAAM,sBAAsB,GAAG,IAAI,eAAe,EAAE,CAAC;IACrD,MAAM,sBAAsB,GAAG,SAAS,CAAC,CAAC,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEvG,KAAK,UAAU,cAAc,CAAC,MAAmB;QAC/C,MAAM,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAE,cAAc,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvG,CAAC;YAAS,CAAC;QACT,sBAAsB,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../src/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AACrC,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AACvD,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA6D,EAC7D,SAAiB,EACjB,MAAoB;IAEpB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,sBAAsB,GAAG,IAAI,eAAe,EAAE,CAAC;IACrD,MAAM,sBAAsB,GAAG,SAAS,CAAC,CAAC,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEvG,KAAK,UAAU,cAAc,CAAC,MAAmB;QAC/C,MAAM,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAE,cAAc,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvG,CAAC;YAAS,CAAC;QACT,sBAAsB,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ChainSafe/lodestar/issues"
13
13
  },
14
- "version": "1.30.0-dev.c91cd9c141",
14
+ "version": "1.30.0-dev.d85e73aa12",
15
15
  "type": "module",
16
16
  "exports": "./lib/index.js",
17
17
  "files": [
@@ -37,7 +37,7 @@
37
37
  "types": "lib/index.d.ts",
38
38
  "dependencies": {
39
39
  "@chainsafe/as-sha256": "^1.1.0",
40
- "any-signal": "3.0.1",
40
+ "any-signal": "^4.1.1",
41
41
  "bigint-buffer": "^1.1.5",
42
42
  "case": "^1.6.3",
43
43
  "js-yaml": "^4.1.0"
@@ -53,5 +53,5 @@
53
53
  "beacon",
54
54
  "blockchain"
55
55
  ],
56
- "gitHead": "c391eec108c18441a2ecb37c5049afe265e513b1"
56
+ "gitHead": "9fdde7b824f52d85f7c18fa244d22a1446a12482"
57
57
  }