@lodestar/reqresp 1.8.0 → 1.9.0-dev.0122664d8e
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 +20 -8
- package/lib/ReqResp.d.ts +7 -7
- package/lib/ReqResp.js +4 -2
- package/lib/ReqResp.js.map +1 -1
- package/lib/encoders/requestDecode.d.ts +2 -2
- package/lib/encoders/requestDecode.js +3 -3
- package/lib/encoders/requestDecode.js.map +1 -1
- package/lib/encoders/requestEncode.d.ts +2 -2
- package/lib/encoders/requestEncode.js +2 -4
- package/lib/encoders/requestEncode.js.map +1 -1
- package/lib/encoders/responseDecode.d.ts +4 -4
- package/lib/encoders/responseDecode.js +7 -2
- package/lib/encoders/responseDecode.js.map +1 -1
- package/lib/encoders/responseEncode.d.ts +5 -3
- package/lib/encoders/responseEncode.js +7 -32
- package/lib/encoders/responseEncode.js.map +1 -1
- package/lib/encodingStrategies/index.d.ts +3 -3
- package/lib/encodingStrategies/index.js +2 -2
- package/lib/encodingStrategies/index.js.map +1 -1
- package/lib/encodingStrategies/sszSnappy/decode.d.ts +3 -3
- package/lib/encodingStrategies/sszSnappy/decode.js +1 -14
- package/lib/encodingStrategies/sszSnappy/decode.js.map +1 -1
- package/lib/encodingStrategies/sszSnappy/encode.d.ts +1 -2
- package/lib/encodingStrategies/sszSnappy/encode.js +2 -23
- package/lib/encodingStrategies/sszSnappy/encode.js.map +1 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/metrics.d.ts +2 -0
- package/lib/metrics.js +18 -2
- package/lib/metrics.js.map +1 -1
- package/lib/rate_limiter/ReqRespRateLimiter.d.ts +1 -1
- package/lib/rate_limiter/ReqRespRateLimiter.js.map +1 -1
- package/lib/request/errors.d.ts +9 -16
- package/lib/request/errors.js +10 -11
- package/lib/request/errors.js.map +1 -1
- package/lib/request/index.d.ts +4 -2
- package/lib/request/index.js +16 -18
- package/lib/request/index.js.map +1 -1
- package/lib/response/errors.d.ts +5 -2
- package/lib/response/errors.js +15 -2
- package/lib/response/errors.js.map +1 -1
- package/lib/response/index.d.ts +6 -4
- package/lib/response/index.js +19 -7
- package/lib/response/index.js.map +1 -1
- package/lib/types.d.ts +62 -79
- package/lib/types.js +0 -8
- package/lib/types.js.map +1 -1
- package/lib/utils/bufferedSource.d.ts +1 -1
- package/lib/utils/bufferedSource.js.map +1 -1
- package/lib/utils/collectExactOne.js +2 -2
- package/lib/utils/collectExactOne.js.map +1 -1
- package/lib/utils/protocolId.d.ts +2 -2
- package/lib/utils/protocolId.js.map +1 -1
- package/package.json +11 -10
- package/lib/protocols/BeaconBlockAndBlobsSidecarByRoot.d.ts +0 -4
- package/lib/protocols/BeaconBlockAndBlobsSidecarByRoot.js +0 -27
- package/lib/protocols/BeaconBlockAndBlobsSidecarByRoot.js.map +0 -1
- package/lib/protocols/BeaconBlocksByRange.d.ts +0 -5
- package/lib/protocols/BeaconBlocksByRange.js +0 -38
- package/lib/protocols/BeaconBlocksByRange.js.map +0 -1
- package/lib/protocols/BeaconBlocksByRoot.d.ts +0 -5
- package/lib/protocols/BeaconBlocksByRoot.js +0 -38
- package/lib/protocols/BeaconBlocksByRoot.js.map +0 -1
- package/lib/protocols/BlobsSidecarsByRange.d.ts +0 -4
- package/lib/protocols/BlobsSidecarsByRange.js +0 -27
- package/lib/protocols/BlobsSidecarsByRange.js.map +0 -1
- package/lib/protocols/Goodbye.d.ts +0 -4
- package/lib/protocols/Goodbye.js +0 -21
- package/lib/protocols/Goodbye.js.map +0 -1
- package/lib/protocols/LightClientBootstrap.d.ts +0 -4
- package/lib/protocols/LightClientBootstrap.js +0 -30
- package/lib/protocols/LightClientBootstrap.js.map +0 -1
- package/lib/protocols/LightClientFinalityUpdate.d.ts +0 -4
- package/lib/protocols/LightClientFinalityUpdate.js +0 -29
- package/lib/protocols/LightClientFinalityUpdate.js.map +0 -1
- package/lib/protocols/LightClientOptimisticUpdate.d.ts +0 -4
- package/lib/protocols/LightClientOptimisticUpdate.js +0 -29
- package/lib/protocols/LightClientOptimisticUpdate.js.map +0 -1
- package/lib/protocols/LightClientUpdatesByRange.d.ts +0 -4
- package/lib/protocols/LightClientUpdatesByRange.js +0 -28
- package/lib/protocols/LightClientUpdatesByRange.js.map +0 -1
- package/lib/protocols/Metadata.d.ts +0 -5
- package/lib/protocols/Metadata.js +0 -31
- package/lib/protocols/Metadata.js.map +0 -1
- package/lib/protocols/Ping.d.ts +0 -4
- package/lib/protocols/Ping.js +0 -20
- package/lib/protocols/Ping.js.map +0 -1
- package/lib/protocols/Status.d.ts +0 -4
- package/lib/protocols/Status.js +0 -24
- package/lib/protocols/Status.js.map +0 -1
- package/lib/protocols/index.d.ts +0 -13
- package/lib/protocols/index.js +0 -13
- package/lib/protocols/index.js.map +0 -1
- package/lib/protocols/utils.d.ts +0 -7
- package/lib/protocols/utils.js +0 -9
- package/lib/protocols/utils.js.map +0 -1
package/lib/index.js
CHANGED
|
@@ -3,7 +3,7 @@ export { getMetrics } from "./metrics.js";
|
|
|
3
3
|
export { Encoding as ReqRespEncoding } from "./types.js"; // Expose enums renamed
|
|
4
4
|
export * from "./types.js";
|
|
5
5
|
export * from "./interface.js";
|
|
6
|
-
export
|
|
7
|
-
export
|
|
6
|
+
export * from "./response/errors.js";
|
|
7
|
+
export * from "./request/errors.js";
|
|
8
8
|
export { collectExactOne, collectMaxResponse, formatProtocolID, parseProtocolID } from "./utils/index.js";
|
|
9
9
|
//# 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,OAAO,EAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAc,MAAM,cAAc,CAAC;AAClD,OAAO,EAAC,UAAU,EAA2B,MAAM,cAAc,CAAC;AAClE,OAAO,EAAC,QAAQ,IAAI,eAAe,EAAC,MAAM,YAAY,CAAC,CAAC,uBAAuB;AAC/E,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAC,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC"}
|
package/lib/metrics.d.ts
CHANGED
|
@@ -52,6 +52,8 @@ export declare function getMetrics(register: MetricsRegister): {
|
|
|
52
52
|
incomingRequests: Gauge<"method">;
|
|
53
53
|
incomingRequestHandlerTime: Histogram<"method">;
|
|
54
54
|
incomingErrors: Gauge<"method">;
|
|
55
|
+
outgoingResponseTTFB: Histogram<"method">;
|
|
56
|
+
incomingResponseTTFB: Histogram<"method">;
|
|
55
57
|
dialErrors: Gauge<string>;
|
|
56
58
|
};
|
|
57
59
|
export {};
|
package/lib/metrics.js
CHANGED
|
@@ -14,7 +14,8 @@ export function getMetrics(register) {
|
|
|
14
14
|
name: "beacon_reqresp_outgoing_request_roundtrip_time_seconds",
|
|
15
15
|
help: "Histogram of outgoing requests round-trip time",
|
|
16
16
|
labelNames: ["method"],
|
|
17
|
-
|
|
17
|
+
// Spec sets RESP_TIMEOUT = 10 sec
|
|
18
|
+
buckets: [0.1, 0.2, 0.5, 1, 5, 10, 15, 60],
|
|
18
19
|
}),
|
|
19
20
|
outgoingErrors: register.gauge({
|
|
20
21
|
name: "beacon_reqresp_outgoing_requests_error_total",
|
|
@@ -30,13 +31,28 @@ export function getMetrics(register) {
|
|
|
30
31
|
name: "beacon_reqresp_incoming_request_handler_time_seconds",
|
|
31
32
|
help: "Histogram of incoming requests internal handling time",
|
|
32
33
|
labelNames: ["method"],
|
|
33
|
-
|
|
34
|
+
// Spec sets RESP_TIMEOUT = 10 sec
|
|
35
|
+
buckets: [0.1, 0.2, 0.5, 1, 5, 10],
|
|
34
36
|
}),
|
|
35
37
|
incomingErrors: register.gauge({
|
|
36
38
|
name: "beacon_reqresp_incoming_requests_error_total",
|
|
37
39
|
help: "Counts total failed responses handled per method",
|
|
38
40
|
labelNames: ["method"],
|
|
39
41
|
}),
|
|
42
|
+
outgoingResponseTTFB: register.histogram({
|
|
43
|
+
name: "beacon_reqresp_outgoing_response_ttfb_seconds",
|
|
44
|
+
help: "Time to first byte (TTFB) for outgoing responses",
|
|
45
|
+
labelNames: ["method"],
|
|
46
|
+
// Spec sets TTFB_TIMEOUT = 5 sec
|
|
47
|
+
buckets: [0.1, 1, 5],
|
|
48
|
+
}),
|
|
49
|
+
incomingResponseTTFB: register.histogram({
|
|
50
|
+
name: "beacon_reqresp_incoming_response_ttfb_seconds",
|
|
51
|
+
help: "Time to first byte (TTFB) for incoming responses",
|
|
52
|
+
labelNames: ["method"],
|
|
53
|
+
// Spec sets TTFB_TIMEOUT = 5 sec
|
|
54
|
+
buckets: [0.1, 1, 5],
|
|
55
|
+
}),
|
|
40
56
|
dialErrors: register.gauge({
|
|
41
57
|
name: "beacon_reqresp_dial_errors_total",
|
|
42
58
|
help: "Count total dial errors",
|
package/lib/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AA2DA;;GAEG;AACH,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CAAC,QAAyB;IAClD,qGAAqG;IAErG,OAAO;QACL,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAW;YACzC,IAAI,EAAE,wCAAwC;YAC9C,IAAI,EAAE,uCAAuC;YAC7C,UAAU,EAAE,CAAC,QAAQ,CAAC;SACvB,CAAC;QACF,4BAA4B,EAAE,QAAQ,CAAC,SAAS,CAAW;YACzD,IAAI,EAAE,wDAAwD;YAC9D,IAAI,EAAE,gDAAgD;YACtD,UAAU,EAAE,CAAC,QAAQ,CAAC;YACtB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AA2DA;;GAEG;AACH,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CAAC,QAAyB;IAClD,qGAAqG;IAErG,OAAO;QACL,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAW;YACzC,IAAI,EAAE,wCAAwC;YAC9C,IAAI,EAAE,uCAAuC;YAC7C,UAAU,EAAE,CAAC,QAAQ,CAAC;SACvB,CAAC;QACF,4BAA4B,EAAE,QAAQ,CAAC,SAAS,CAAW;YACzD,IAAI,EAAE,wDAAwD;YAC9D,IAAI,EAAE,gDAAgD;YACtD,UAAU,EAAE,CAAC,QAAQ,CAAC;YACtB,kCAAkC;YAClC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;SAC3C,CAAC;QACF,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAW;YACvC,IAAI,EAAE,8CAA8C;YACpD,IAAI,EAAE,8CAA8C;YACpD,UAAU,EAAE,CAAC,QAAQ,CAAC;SACvB,CAAC;QACF,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAW;YACzC,IAAI,EAAE,wCAAwC;YAC9C,IAAI,EAAE,2CAA2C;YACjD,UAAU,EAAE,CAAC,QAAQ,CAAC;SACvB,CAAC;QACF,0BAA0B,EAAE,QAAQ,CAAC,SAAS,CAAW;YACvD,IAAI,EAAE,sDAAsD;YAC5D,IAAI,EAAE,uDAAuD;YAC7D,UAAU,EAAE,CAAC,QAAQ,CAAC;YACtB,kCAAkC;YAClC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;SACnC,CAAC;QACF,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAW;YACvC,IAAI,EAAE,8CAA8C;YACpD,IAAI,EAAE,kDAAkD;YACxD,UAAU,EAAE,CAAC,QAAQ,CAAC;SACvB,CAAC;QACF,oBAAoB,EAAE,QAAQ,CAAC,SAAS,CAAW;YACjD,IAAI,EAAE,+CAA+C;YACrD,IAAI,EAAE,kDAAkD;YACxD,UAAU,EAAE,CAAC,QAAQ,CAAC;YACtB,iCAAiC;YACjC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;SACrB,CAAC;QACF,oBAAoB,EAAE,QAAQ,CAAC,SAAS,CAAW;YACjD,IAAI,EAAE,+CAA+C;YACrD,IAAI,EAAE,kDAAkD;YACxD,UAAU,EAAE,CAAC,QAAQ,CAAC;YACtB,iCAAiC;YACjC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;SACrB,CAAC;QACF,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC;YACzB,IAAI,EAAE,kCAAkC;YACxC,IAAI,EAAE,yBAAyB;SAChC,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -12,7 +12,7 @@ export declare class ReqRespRateLimiter {
|
|
|
12
12
|
private lastSeenRequestsByPeer;
|
|
13
13
|
constructor(opts?: ReqRespRateLimiterOpts | undefined);
|
|
14
14
|
get enabled(): boolean;
|
|
15
|
-
initRateLimits
|
|
15
|
+
initRateLimits(protocolID: ProtocolID, rateLimits: InboundRateLimitQuota): void;
|
|
16
16
|
allows(peerId: PeerId, protocolID: string, requestCount: number): boolean;
|
|
17
17
|
prune(peerId: PeerId): void;
|
|
18
18
|
start(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReqRespRateLimiter.js","sourceRoot":"","sources":["../../src/rate_limiter/ReqRespRateLimiter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AAErD,0GAA0G;AAC1G,MAAM,oCAAoC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE5D,oEAAoE;AACpE,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAI9C,MAAM,OAAO,kBAAkB;IAS7B,YAA6B,IAA6B;;QAA7B,SAAI,GAAJ,IAAI,CAAyB;QARzC,wBAAmB,GAAG,IAAI,GAAG,EAAuC,CAAC;QACrE,sBAAiB,GAAG,IAAI,GAAG,EAAqC,CAAC;QAClF,+CAA+C;QACvC,oBAAe,GAA+B,SAAS,CAAC;QAM9D,IAAI,CAAC,mBAAmB,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,mBAAmB,mCAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,cAAc,
|
|
1
|
+
{"version":3,"file":"ReqRespRateLimiter.js","sourceRoot":"","sources":["../../src/rate_limiter/ReqRespRateLimiter.ts"],"names":[],"mappings":"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"}
|
package/lib/request/errors.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { LodestarError } from "@lodestar/utils";
|
|
2
|
-
import { Encoding } from "../types.js";
|
|
1
|
+
import { LodestarError, LodestarErrorObject } from "@lodestar/utils";
|
|
3
2
|
import { ResponseError } from "../response/index.js";
|
|
4
3
|
import { RpcResponseStatusError } from "../interface.js";
|
|
5
4
|
export declare enum RequestErrorCode {
|
|
6
5
|
/** `<response_chunk>` had `<result>` === INVALID_REQUEST */
|
|
7
6
|
INVALID_REQUEST = "REQUEST_ERROR_INVALID_REQUEST",
|
|
7
|
+
INVALID_RESPONSE_SSZ = "REQUEST_ERROR_INVALID_RESPONSE_SSZ",
|
|
8
8
|
/** `<response_chunk>` had `<result>` === SERVER_ERROR */
|
|
9
9
|
SERVER_ERROR = "REQUEST_ERROR_SERVER_ERROR",
|
|
10
10
|
/** `<response_chunk>` had `<result>` === RESOURCE_UNAVAILABLE */
|
|
@@ -33,6 +33,9 @@ export declare enum RequestErrorCode {
|
|
|
33
33
|
type RequestErrorType = {
|
|
34
34
|
code: RequestErrorCode.INVALID_REQUEST;
|
|
35
35
|
errorMessage: string;
|
|
36
|
+
} | {
|
|
37
|
+
code: RequestErrorCode.INVALID_RESPONSE_SSZ;
|
|
38
|
+
errorMessage: string;
|
|
36
39
|
} | {
|
|
37
40
|
code: RequestErrorCode.SERVER_ERROR;
|
|
38
41
|
errorMessage: string;
|
|
@@ -64,20 +67,10 @@ type RequestErrorType = {
|
|
|
64
67
|
} | {
|
|
65
68
|
code: RequestErrorCode.REQUEST_RATE_LIMITED;
|
|
66
69
|
};
|
|
67
|
-
export
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
};
|
|
72
|
-
/**
|
|
73
|
-
* Same error types as RequestError but without metadata.
|
|
74
|
-
* Top level function sendRequest() must rethrow RequestInternalError with metadata
|
|
75
|
-
*/
|
|
76
|
-
export declare class RequestInternalError extends LodestarError<RequestErrorType> {
|
|
77
|
-
constructor(type: RequestErrorType);
|
|
78
|
-
}
|
|
79
|
-
export declare class RequestError extends LodestarError<RequestErrorType & RequestErrorMetadata> {
|
|
80
|
-
constructor(type: RequestErrorType, metadata: RequestErrorMetadata);
|
|
70
|
+
export declare const REQUEST_ERROR_CLASS_NAME = "RequestError";
|
|
71
|
+
export declare class RequestError extends LodestarError<RequestErrorType> {
|
|
72
|
+
constructor(type: RequestErrorType, message?: string, stack?: string);
|
|
73
|
+
static fromObject(obj: LodestarErrorObject): RequestError;
|
|
81
74
|
}
|
|
82
75
|
/**
|
|
83
76
|
* Parse response status errors into detailed request errors for each status code for easier debugging
|
package/lib/request/errors.js
CHANGED
|
@@ -5,6 +5,7 @@ export var RequestErrorCode;
|
|
|
5
5
|
// Declaring specific values of RpcResponseStatusError for error clarity downstream
|
|
6
6
|
/** `<response_chunk>` had `<result>` === INVALID_REQUEST */
|
|
7
7
|
RequestErrorCode["INVALID_REQUEST"] = "REQUEST_ERROR_INVALID_REQUEST";
|
|
8
|
+
RequestErrorCode["INVALID_RESPONSE_SSZ"] = "REQUEST_ERROR_INVALID_RESPONSE_SSZ";
|
|
8
9
|
/** `<response_chunk>` had `<result>` === SERVER_ERROR */
|
|
9
10
|
RequestErrorCode["SERVER_ERROR"] = "REQUEST_ERROR_SERVER_ERROR";
|
|
10
11
|
/** `<response_chunk>` had `<result>` === RESOURCE_UNAVAILABLE */
|
|
@@ -30,18 +31,16 @@ export var RequestErrorCode;
|
|
|
30
31
|
/** Request rate limited */
|
|
31
32
|
RequestErrorCode["REQUEST_RATE_LIMITED"] = "REQUEST_ERROR_RATE_LIMITED";
|
|
32
33
|
})(RequestErrorCode || (RequestErrorCode = {}));
|
|
33
|
-
|
|
34
|
-
* Same error types as RequestError but without metadata.
|
|
35
|
-
* Top level function sendRequest() must rethrow RequestInternalError with metadata
|
|
36
|
-
*/
|
|
37
|
-
export class RequestInternalError extends LodestarError {
|
|
38
|
-
constructor(type) {
|
|
39
|
-
super(type);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
34
|
+
export const REQUEST_ERROR_CLASS_NAME = "RequestError";
|
|
42
35
|
export class RequestError extends LodestarError {
|
|
43
|
-
constructor(type,
|
|
44
|
-
super(
|
|
36
|
+
constructor(type, message, stack) {
|
|
37
|
+
super(type, message !== null && message !== void 0 ? message : renderErrorMessage(type), stack);
|
|
38
|
+
}
|
|
39
|
+
static fromObject(obj) {
|
|
40
|
+
if (obj.className !== "RequestError") {
|
|
41
|
+
throw new Error(`Expected className to be RequestError, but got ${obj.className}`);
|
|
42
|
+
}
|
|
43
|
+
return new RequestError(obj.type, obj.message, obj.stack);
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/request/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/request/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAsB,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAC,UAAU,EAAyB,MAAM,iBAAiB,CAAC;AAEnE,MAAM,CAAN,IAAY,gBA6BX;AA7BD,WAAY,gBAAgB;IAC1B,mFAAmF;IACnF,4DAA4D;IAC5D,qEAAiD,CAAA;IACjD,+EAA2D,CAAA;IAC3D,yDAAyD;IACzD,+DAA2C,CAAA;IAC3C,iEAAiE;IACjE,uEAAmD,CAAA;IACnD,wEAAwE;IACxE,+EAA2D,CAAA;IAC3D,4DAA4D;IAC5D,+DAA2C,CAAA;IAC3C,uCAAuC;IACvC,2DAAuC,CAAA;IACvC,iEAAiE;IACjE,qEAAiD,CAAA;IACjD,8CAA8C;IAC9C,iEAA6C,CAAA;IAC7C,mFAAmF;IACnF,uEAAmD,CAAA;IACnD,iDAAiD;IACjD,mEAA+C,CAAA;IAC/C,iCAAiC;IACjC,+DAA2C,CAAA;IAC3C,gDAAgD;IAChD,+DAA2C,CAAA;IAC3C,2BAA2B;IAC3B,uEAAmD,CAAA;AACrD,CAAC,EA7BW,gBAAgB,KAAhB,gBAAgB,QA6B3B;AAkBD,MAAM,CAAC,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAEvD,MAAM,OAAO,YAAa,SAAQ,aAA+B;IAC/D,YAAY,IAAsB,EAAE,OAAgB,EAAE,KAAc;QAClE,KAAK,CAAC,IAAI,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,GAAwB;QACxC,IAAI,GAAG,CAAC,SAAS,KAAK,cAAc,EAAE;YACpC,MAAM,IAAI,KAAK,CAAC,kDAAkD,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;SACpF;QAED,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,IAAwB,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,iCAAiC,CAAC,CAAgB;IAChE,MAAM,EAAC,YAAY,EAAE,MAAM,EAAC,GAAG,CAAC,CAAC;IACjC,QAAQ,MAAM,EAAE;QACd,KAAK,UAAU,CAAC,eAAe;YAC7B,OAAO,EAAC,IAAI,EAAE,gBAAgB,CAAC,eAAe,EAAE,YAAY,EAAC,CAAC;QAChE,KAAK,UAAU,CAAC,YAAY;YAC1B,OAAO,EAAC,IAAI,EAAE,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAC,CAAC;QAC7D,KAAK,UAAU,CAAC,oBAAoB;YAClC,OAAO,EAAC,IAAI,EAAE,gBAAgB,CAAC,oBAAoB,EAAE,YAAY,EAAC,CAAC;QACrE;YACE,OAAO,EAAC,IAAI,EAAE,gBAAgB,CAAC,oBAAoB,EAAE,YAAY,EAAE,MAAM,EAAC,CAAC;KAC9E;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAsB;IAChD,QAAQ,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK,gBAAgB,CAAC,eAAe,CAAC;QACtC,KAAK,gBAAgB,CAAC,YAAY,CAAC;QACnC,KAAK,gBAAgB,CAAC,oBAAoB,CAAC;QAC3C,KAAK,gBAAgB,CAAC,oBAAoB;YACxC,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC9C;YACE,OAAO,IAAI,CAAC,IAAI,CAAC;KACpB;AACH,CAAC"}
|
package/lib/request/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { PeerId } from "@libp2p/interface-peer-id";
|
|
2
2
|
import { Libp2p } from "libp2p";
|
|
3
3
|
import { Logger } from "@lodestar/utils";
|
|
4
|
-
import {
|
|
4
|
+
import { MixedProtocol, ResponseIncoming } from "../types.js";
|
|
5
|
+
import { Metrics } from "../metrics.js";
|
|
5
6
|
import { RequestError, RequestErrorCode } from "./errors.js";
|
|
6
7
|
export { RequestError, RequestErrorCode };
|
|
7
8
|
export declare const DEFAULT_DIAL_TIMEOUT: number;
|
|
@@ -21,6 +22,7 @@ export interface SendRequestOpts {
|
|
|
21
22
|
type SendRequestModules = {
|
|
22
23
|
logger: Logger;
|
|
23
24
|
libp2p: Libp2p;
|
|
25
|
+
metrics: Metrics | null;
|
|
24
26
|
peerClient?: string;
|
|
25
27
|
};
|
|
26
28
|
/**
|
|
@@ -34,5 +36,5 @@ type SendRequestModules = {
|
|
|
34
36
|
* - Any part of the response_chunk fails validation. Throws a typed error (see `SszSnappyError`)
|
|
35
37
|
* - The maximum number of requested chunks are read. Does not throw, returns read chunks only.
|
|
36
38
|
*/
|
|
37
|
-
export declare function sendRequest
|
|
39
|
+
export declare function sendRequest({ logger, libp2p, metrics, peerClient }: SendRequestModules, peerId: PeerId, protocols: MixedProtocol[], protocolIDs: string[], requestBody: Uint8Array, signal?: AbortSignal, opts?: SendRequestOpts, requestId?: number): AsyncIterable<ResponseIncoming>;
|
|
38
40
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/request/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { prettyPrintPeerId, abortableSource } from "../utils/index.js";
|
|
|
4
4
|
import { ResponseError } from "../response/index.js";
|
|
5
5
|
import { requestEncode } from "../encoders/requestEncode.js";
|
|
6
6
|
import { responseDecode } from "../encoders/responseDecode.js";
|
|
7
|
-
import { RequestError, RequestErrorCode,
|
|
7
|
+
import { RequestError, RequestErrorCode, responseStatusErrorToRequestError } from "./errors.js";
|
|
8
8
|
export { RequestError, RequestErrorCode };
|
|
9
9
|
// Default spec values from https://github.com/ethereum/consensus-specs/blob/v1.2.0/specs/phase0/p2p-interface.md#configuration
|
|
10
10
|
export const DEFAULT_DIAL_TIMEOUT = 5 * 1000; // 5 sec
|
|
@@ -22,8 +22,8 @@ export const DEFAULT_RESP_TIMEOUT = 10 * 1000; // 10 sec
|
|
|
22
22
|
* - Any part of the response_chunk fails validation. Throws a typed error (see `SszSnappyError`)
|
|
23
23
|
* - The maximum number of requested chunks are read. Does not throw, returns read chunks only.
|
|
24
24
|
*/
|
|
25
|
-
export async function* sendRequest({ logger, libp2p, peerClient }, peerId, protocols, protocolIDs, requestBody, signal, opts, requestId = 0) {
|
|
26
|
-
var _a, _b, _c, _d, _e
|
|
25
|
+
export async function* sendRequest({ logger, libp2p, metrics, peerClient }, peerId, protocols, protocolIDs, requestBody, signal, opts, requestId = 0) {
|
|
26
|
+
var _a, _b, _c, _d, _e;
|
|
27
27
|
if (protocols.length === 0) {
|
|
28
28
|
throw Error("sendRequest must set > 0 protocols");
|
|
29
29
|
}
|
|
@@ -31,10 +31,9 @@ export async function* sendRequest({ logger, libp2p, peerClient }, peerId, proto
|
|
|
31
31
|
const REQUEST_TIMEOUT = (_b = opts === null || opts === void 0 ? void 0 : opts.requestTimeoutMs) !== null && _b !== void 0 ? _b : DEFAULT_REQUEST_TIMEOUT;
|
|
32
32
|
const TTFB_TIMEOUT = (_c = opts === null || opts === void 0 ? void 0 : opts.ttfbTimeoutMs) !== null && _c !== void 0 ? _c : DEFAULT_TTFB_TIMEOUT;
|
|
33
33
|
const RESP_TIMEOUT = (_d = opts === null || opts === void 0 ? void 0 : opts.respTimeoutMs) !== null && _d !== void 0 ? _d : DEFAULT_RESP_TIMEOUT;
|
|
34
|
-
const peerIdStr = peerId.toString();
|
|
35
34
|
const peerIdStrShort = prettyPrintPeerId(peerId);
|
|
36
|
-
const { method, encoding } = protocols[0];
|
|
37
|
-
const logCtx = { method, encoding, client: peerClient, peer: peerIdStrShort, requestId };
|
|
35
|
+
const { method, encoding, version } = protocols[0];
|
|
36
|
+
const logCtx = { method, version, encoding, client: peerClient, peer: peerIdStrShort, requestId };
|
|
38
37
|
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
39
38
|
throw new ErrorAborted("sendRequest");
|
|
40
39
|
}
|
|
@@ -63,18 +62,20 @@ export async function* sendRequest({ logger, libp2p, peerClient }, peerId, proto
|
|
|
63
62
|
return conn;
|
|
64
63
|
}, DIAL_TIMEOUT, signal).catch((e) => {
|
|
65
64
|
if (e instanceof TimeoutError) {
|
|
66
|
-
throw new
|
|
65
|
+
throw new RequestError({ code: RequestErrorCode.DIAL_TIMEOUT });
|
|
67
66
|
}
|
|
68
67
|
else {
|
|
69
|
-
throw new
|
|
68
|
+
throw new RequestError({ code: RequestErrorCode.DIAL_ERROR, error: e });
|
|
70
69
|
}
|
|
71
70
|
});
|
|
71
|
+
// TODO: Does the TTFB timer start on opening stream or after receiving request
|
|
72
|
+
const timerTTFB = metrics === null || metrics === void 0 ? void 0 : metrics.outgoingResponseTTFB.startTimer({ method });
|
|
72
73
|
// Parse protocol selected by the responder
|
|
73
74
|
const protocolId = (_e = stream.stat.protocol) !== null && _e !== void 0 ? _e : "unknown";
|
|
74
75
|
const protocol = protocolsMap.get(protocolId);
|
|
75
76
|
if (!protocol)
|
|
76
77
|
throw Error(`dialProtocol selected unknown protocolId ${protocolId}`);
|
|
77
|
-
logger.debug("Req sending request",
|
|
78
|
+
logger.debug("Req sending request", logCtx);
|
|
78
79
|
// Spec: The requester MUST close the write side of the stream once it finishes writing the request message
|
|
79
80
|
// Impl: stream.sink is closed automatically by js-libp2p-mplex when piped source is exhausted
|
|
80
81
|
// REQUEST_TIMEOUT: Non-spec timeout from sending request until write stream closed by responder
|
|
@@ -83,10 +84,10 @@ export async function* sendRequest({ logger, libp2p, peerClient }, peerId, proto
|
|
|
83
84
|
// Must close the stream read side (stream.source) manually AND the write side
|
|
84
85
|
stream.abort(e);
|
|
85
86
|
if (e instanceof TimeoutError) {
|
|
86
|
-
throw new
|
|
87
|
+
throw new RequestError({ code: RequestErrorCode.REQUEST_TIMEOUT });
|
|
87
88
|
}
|
|
88
89
|
else {
|
|
89
|
-
throw new
|
|
90
|
+
throw new RequestError({ code: RequestErrorCode.REQUEST_ERROR, error: e });
|
|
90
91
|
}
|
|
91
92
|
});
|
|
92
93
|
logger.debug("Req request sent", logCtx);
|
|
@@ -113,11 +114,11 @@ export async function* sendRequest({ logger, libp2p, peerClient }, peerId, proto
|
|
|
113
114
|
yield* pipe(abortableSource(stream.source, [
|
|
114
115
|
{
|
|
115
116
|
signal: ttfbTimeoutController.signal,
|
|
116
|
-
getError: () => new
|
|
117
|
+
getError: () => new RequestError({ code: RequestErrorCode.TTFB_TIMEOUT }),
|
|
117
118
|
},
|
|
118
119
|
{
|
|
119
120
|
signal: respTimeoutController.signal,
|
|
120
|
-
getError: () => new
|
|
121
|
+
getError: () => new RequestError({ code: RequestErrorCode.RESP_TIMEOUT }),
|
|
121
122
|
},
|
|
122
123
|
]),
|
|
123
124
|
// Transforms `Buffer` chunks to yield `ResponseBody` chunks
|
|
@@ -125,6 +126,7 @@ export async function* sendRequest({ logger, libp2p, peerClient }, peerId, proto
|
|
|
125
126
|
onFirstHeader() {
|
|
126
127
|
// On first byte, cancel the single use TTFB_TIMEOUT, and start RESP_TIMEOUT
|
|
127
128
|
clearTimeout(timeoutTTFB);
|
|
129
|
+
timerTTFB === null || timerTTFB === void 0 ? void 0 : timerTTFB();
|
|
128
130
|
restartRespTimeout();
|
|
129
131
|
},
|
|
130
132
|
onFirstResponseChunk() {
|
|
@@ -149,12 +151,8 @@ export async function* sendRequest({ logger, libp2p, peerClient }, peerId, proto
|
|
|
149
151
|
}
|
|
150
152
|
catch (e) {
|
|
151
153
|
logger.verbose("Req error", logCtx, e);
|
|
152
|
-
const metadata = { method, encoding, peer: peerIdStr };
|
|
153
154
|
if (e instanceof ResponseError) {
|
|
154
|
-
throw new RequestError(responseStatusErrorToRequestError(e)
|
|
155
|
-
}
|
|
156
|
-
else if (e instanceof RequestInternalError) {
|
|
157
|
-
throw new RequestError(e.type, metadata);
|
|
155
|
+
throw new RequestError(responseStatusErrorToRequestError(e));
|
|
158
156
|
}
|
|
159
157
|
else {
|
|
160
158
|
throw e;
|
package/lib/request/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,SAAS,CAAC;AAI7B,OAAO,EAAC,YAAY,EAAU,WAAW,EAAE,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAEhF,OAAO,EAAC,iBAAiB,EAAE,eAAe,EAAC,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"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"}
|
package/lib/response/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LodestarError } from "@lodestar/utils";
|
|
1
|
+
import { LodestarError, LodestarErrorMetaData, LodestarErrorObject } from "@lodestar/utils";
|
|
2
2
|
import { RespStatus, RpcResponseStatusError } from "../interface.js";
|
|
3
3
|
type RpcResponseStatusNotSuccess = Exclude<RespStatus, RespStatus.SUCCESS>;
|
|
4
4
|
export declare enum ResponseErrorCode {
|
|
@@ -9,6 +9,7 @@ type RequestErrorType = {
|
|
|
9
9
|
status: RpcResponseStatusError;
|
|
10
10
|
errorMessage: string;
|
|
11
11
|
};
|
|
12
|
+
export declare const RESPONSE_ERROR_CLASS_NAME = "ResponseError";
|
|
12
13
|
/**
|
|
13
14
|
* Used internally only to signal a response status error. Since the error should never bubble up to the user,
|
|
14
15
|
* the error code and error message does not matter much.
|
|
@@ -16,7 +17,9 @@ type RequestErrorType = {
|
|
|
16
17
|
export declare class ResponseError extends LodestarError<RequestErrorType> {
|
|
17
18
|
status: RpcResponseStatusNotSuccess;
|
|
18
19
|
errorMessage: string;
|
|
19
|
-
constructor(status: RpcResponseStatusNotSuccess, errorMessage: string);
|
|
20
|
+
constructor(status: RpcResponseStatusNotSuccess, errorMessage: string, stack?: string);
|
|
21
|
+
getMetadata(): LodestarErrorMetaData;
|
|
22
|
+
static fromObject(obj: LodestarErrorObject): ResponseError;
|
|
20
23
|
}
|
|
21
24
|
export {};
|
|
22
25
|
//# sourceMappingURL=errors.d.ts.map
|
package/lib/response/errors.js
CHANGED
|
@@ -4,16 +4,29 @@ export var ResponseErrorCode;
|
|
|
4
4
|
(function (ResponseErrorCode) {
|
|
5
5
|
ResponseErrorCode["RESPONSE_STATUS_ERROR"] = "RESPONSE_STATUS_ERROR";
|
|
6
6
|
})(ResponseErrorCode || (ResponseErrorCode = {}));
|
|
7
|
+
export const RESPONSE_ERROR_CLASS_NAME = "ResponseError";
|
|
7
8
|
/**
|
|
8
9
|
* Used internally only to signal a response status error. Since the error should never bubble up to the user,
|
|
9
10
|
* the error code and error message does not matter much.
|
|
10
11
|
*/
|
|
11
12
|
export class ResponseError extends LodestarError {
|
|
12
|
-
constructor(status, errorMessage) {
|
|
13
|
+
constructor(status, errorMessage, stack) {
|
|
13
14
|
const type = { code: ResponseErrorCode.RESPONSE_STATUS_ERROR, status, errorMessage };
|
|
14
|
-
super(type, `RESPONSE_ERROR_${RespStatus[status]}: ${errorMessage}
|
|
15
|
+
super(type, `RESPONSE_ERROR_${RespStatus[status]}: ${errorMessage}`, stack);
|
|
15
16
|
this.status = status;
|
|
16
17
|
this.errorMessage = errorMessage;
|
|
17
18
|
}
|
|
19
|
+
getMetadata() {
|
|
20
|
+
return {
|
|
21
|
+
status: this.status,
|
|
22
|
+
errorMessage: this.errorMessage,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
static fromObject(obj) {
|
|
26
|
+
if (obj.className !== RESPONSE_ERROR_CLASS_NAME) {
|
|
27
|
+
throw new Error(`Expected className to be ResponseError, but got ${obj.className}`);
|
|
28
|
+
}
|
|
29
|
+
return new ResponseError(obj.type.status, obj.type.errorMessage, obj.stack);
|
|
30
|
+
}
|
|
18
31
|
}
|
|
19
32
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/response/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/response/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAA6C,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAC,UAAU,EAAyB,MAAM,iBAAiB,CAAC;AAInE,MAAM,CAAN,IAAY,iBAEX;AAFD,WAAY,iBAAiB;IAC3B,oEAA+C,CAAA;AACjD,CAAC,EAFW,iBAAiB,KAAjB,iBAAiB,QAE5B;AAQD,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;AAEzD;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,aAA+B;IAGhE,YAAY,MAAmC,EAAE,YAAoB,EAAE,KAAc;QACnF,MAAM,IAAI,GAAG,EAAC,IAAI,EAAE,iBAAiB,CAAC,qBAAqB,EAAE,MAAM,EAAE,YAAY,EAAC,CAAC;QACnF,KAAK,CAAC,IAAI,EAAE,kBAAkB,UAAU,CAAC,MAAM,CAAC,KAAK,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,WAAW;QACT,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,GAAwB;QACxC,IAAI,GAAG,CAAC,SAAS,KAAK,yBAAyB,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;SACrF;QAED,OAAO,IAAI,aAAa,CACtB,GAAG,CAAC,IAAI,CAAC,MAAqC,EAC9C,GAAG,CAAC,IAAI,CAAC,YAAsB,EAC/B,GAAG,CAAC,KAAK,CACV,CAAC;IACJ,CAAC;CACF"}
|
package/lib/response/index.d.ts
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { PeerId } from "@libp2p/interface-peer-id";
|
|
2
2
|
import { Stream } from "@libp2p/interface-connection";
|
|
3
3
|
import { Logger } from "@lodestar/utils";
|
|
4
|
-
import {
|
|
4
|
+
import { Protocol } from "../types.js";
|
|
5
5
|
import { ReqRespRateLimiter } from "../rate_limiter/ReqRespRateLimiter.js";
|
|
6
|
+
import { Metrics } from "../metrics.js";
|
|
6
7
|
import { ResponseError } from "./errors.js";
|
|
7
8
|
export { ResponseError };
|
|
8
9
|
export declare const DEFAULT_REQUEST_TIMEOUT: number;
|
|
9
|
-
export interface HandleRequestOpts
|
|
10
|
+
export interface HandleRequestOpts {
|
|
10
11
|
logger: Logger;
|
|
12
|
+
metrics: Metrics | null;
|
|
11
13
|
stream: Stream;
|
|
12
14
|
peerId: PeerId;
|
|
13
|
-
protocol:
|
|
15
|
+
protocol: Protocol;
|
|
14
16
|
protocolID: string;
|
|
15
17
|
rateLimiter: ReqRespRateLimiter;
|
|
16
18
|
signal?: AbortSignal;
|
|
@@ -30,5 +32,5 @@ export interface HandleRequestOpts<Req, Resp> {
|
|
|
30
32
|
* 4a. Encode and write `<response_chunks>` to peer
|
|
31
33
|
* 4b. On error, encode and write an error `<response_chunk>` and stop
|
|
32
34
|
*/
|
|
33
|
-
export declare function handleRequest
|
|
35
|
+
export declare function handleRequest({ logger, metrics, stream, peerId, protocol, protocolID, rateLimiter, signal, requestId, peerClient, requestTimeoutMs, }: HandleRequestOpts): Promise<void>;
|
|
34
36
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/response/index.js
CHANGED
|
@@ -19,7 +19,7 @@ export const DEFAULT_REQUEST_TIMEOUT = 5 * 1000; // 5 sec
|
|
|
19
19
|
* 4a. Encode and write `<response_chunks>` to peer
|
|
20
20
|
* 4b. On error, encode and write an error `<response_chunk>` and stop
|
|
21
21
|
*/
|
|
22
|
-
export async function handleRequest({ logger, stream, peerId, protocol, protocolID, rateLimiter, signal, requestId = 0, peerClient = "unknown", requestTimeoutMs, }) {
|
|
22
|
+
export async function handleRequest({ logger, metrics, stream, peerId, protocol, protocolID, rateLimiter, signal, requestId = 0, peerClient = "unknown", requestTimeoutMs, }) {
|
|
23
23
|
const REQUEST_TIMEOUT = requestTimeoutMs !== null && requestTimeoutMs !== void 0 ? requestTimeoutMs : DEFAULT_REQUEST_TIMEOUT;
|
|
24
24
|
const logCtx = { method: protocol.method, client: peerClient, peer: prettyPrintPeerId(peerId), requestId };
|
|
25
25
|
let responseError = null;
|
|
@@ -28,8 +28,10 @@ export async function handleRequest({ logger, stream, peerId, protocol, protocol
|
|
|
28
28
|
// This syntax allows to recycle stream.sink to send success and error chunks without returning
|
|
29
29
|
// in case request whose body is a List fails at chunk_i > 0, without breaking out of the for..await..of
|
|
30
30
|
(async function* requestHandlerSource() {
|
|
31
|
-
var _a, _b, _c
|
|
31
|
+
var _a, _b, _c;
|
|
32
32
|
try {
|
|
33
|
+
// TODO: Does the TTFB timer start on opening stream or after receiving request
|
|
34
|
+
const timerTTFB = metrics === null || metrics === void 0 ? void 0 : metrics.outgoingResponseTTFB.startTimer({ method: protocol.method });
|
|
33
35
|
const requestBody = await withTimeout(() => pipe(stream.source, requestDecode(protocol)), REQUEST_TIMEOUT, signal).catch((e) => {
|
|
34
36
|
if (e instanceof TimeoutError) {
|
|
35
37
|
throw e; // Let outter catch {} re-type the error as SERVER_ERROR
|
|
@@ -38,18 +40,28 @@ export async function handleRequest({ logger, stream, peerId, protocol, protocol
|
|
|
38
40
|
throw new ResponseError(RespStatus.INVALID_REQUEST, e.message);
|
|
39
41
|
}
|
|
40
42
|
});
|
|
41
|
-
logger.debug("Req received",
|
|
42
|
-
|
|
43
|
+
logger.debug("Req received", logCtx);
|
|
44
|
+
// Max count by request for byRange and byRoot
|
|
45
|
+
const requestCount = (_c = (_b = (_a = protocol === null || protocol === void 0 ? void 0 : protocol.inboundRateLimits) === null || _a === void 0 ? void 0 : _a.getRequestCount) === null || _b === void 0 ? void 0 : _b.call(_a, requestBody)) !== null && _c !== void 0 ? _c : 1;
|
|
43
46
|
if (!rateLimiter.allows(peerId, protocolID, requestCount)) {
|
|
44
|
-
throw new RequestError({ code: RequestErrorCode.REQUEST_RATE_LIMITED }
|
|
47
|
+
throw new RequestError({ code: RequestErrorCode.REQUEST_RATE_LIMITED });
|
|
45
48
|
}
|
|
49
|
+
const requestChunk = {
|
|
50
|
+
data: requestBody,
|
|
51
|
+
version: protocol.version,
|
|
52
|
+
};
|
|
46
53
|
yield* pipe(
|
|
47
54
|
// TODO: Debug the reason for type conversion here
|
|
48
|
-
protocol.handler(
|
|
55
|
+
protocol.handler(requestChunk, peerId),
|
|
49
56
|
// NOTE: Do not log the resp chunk contents, logs get extremely cluttered
|
|
50
57
|
// Note: Not logging on each chunk since after 1 year it hasn't add any value when debugging
|
|
51
58
|
// onChunk(() => logger.debug("Resp sending chunk", logCtx)),
|
|
52
|
-
responseEncodeSuccess(protocol
|
|
59
|
+
responseEncodeSuccess(protocol, {
|
|
60
|
+
onChunk(chunkIndex) {
|
|
61
|
+
if (chunkIndex === 0)
|
|
62
|
+
timerTTFB === null || timerTTFB === void 0 ? void 0 : timerTTFB();
|
|
63
|
+
},
|
|
64
|
+
}));
|
|
53
65
|
}
|
|
54
66
|
catch (e) {
|
|
55
67
|
const status = e instanceof ResponseError ? e.status : RespStatus.SERVER_ERROR;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,SAAS,CAAC;AAI7B,OAAO,EAAS,YAAY,EAAE,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAC,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAC,mBAAmB,EAAE,qBAAqB,EAAC,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":"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"}
|