UNPKG

@lodestar/beacon-node

Version:

A Typescript implementation of the beacon chain

66 lines 2.17 kB
import { RequestError, RequestErrorCode } from "@lodestar/reqresp"; /** * Sink for `<response_chunk>*`, from * ```bnf * response ::= <response_chunk>* * ``` * Expects exactly one response */ export async function collectExactOneTyped(source, typeFn) { for await (const chunk of source) { const type = typeFn(chunk.fork, chunk.protocolVersion); const response = sszDeserializeResponse(type, chunk.data); return response; } throw new RequestError({ code: RequestErrorCode.EMPTY_RESPONSE }); } /** * Sink for `<response_chunk>*`, from * ```bnf * response ::= <response_chunk>* * ``` * Collects a bounded list of responses up to `maxResponses` */ export async function collectMaxResponseTyped(source, maxResponses, typeFn) { // else: zero or more responses const responses = []; for await (const chunk of source) { const type = typeFn(chunk.fork, chunk.protocolVersion); const response = sszDeserializeResponse(type, chunk.data); responses.push(response); if (maxResponses !== undefined && responses.length >= maxResponses) { break; } } return responses; } /** * Sink for `<response_chunk>*`, from * ```bnf * response ::= <response_chunk>* * ``` * Collects a bounded list of responses up to `maxResponses` */ export async function collectMaxResponseTypedWithBytes(source, maxResponses, typeFn) { // else: zero or more responses const responses = []; for await (const chunk of source) { const type = typeFn(chunk.fork, chunk.protocolVersion); const data = sszDeserializeResponse(type, chunk.data); responses.push({ data, bytes: chunk.data }); if (maxResponses !== undefined && responses.length >= maxResponses) { break; } } return responses; } /** Light wrapper on type to wrap deserialize errors */ export function sszDeserializeResponse(type, bytes) { try { return type.deserialize(bytes); } catch (e) { throw new RequestError({ code: RequestErrorCode.INVALID_RESPONSE_SSZ, errorMessage: e.message }); } } //# sourceMappingURL=collect.js.map