Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions packages/contracts/source/contracts/p2p/endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,15 @@ export interface GetStatusResponse extends Response {
config: PeerConfig;
}

export interface GetProposalQuery {
blockNumber: number;
round: number;
}

export interface GetProposalRequest extends Request {
payload: {
headers: HeaderData;
query: GetProposalQuery;
};
}

Expand Down
3 changes: 2 additions & 1 deletion packages/contracts/source/contracts/p2p/peer-communicator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import type {
GetMessagesQuery,
GetMessagesResponse,
GetPeersResponse,
GetProposalQuery,
GetProposalResponse,
GetStatusResponse,
} from "./endpoints.js";
Expand All @@ -22,7 +23,7 @@ export interface PeerCommunicator {
getPeers(peer: Peer): Promise<GetPeersResponse>;
getApiNodes(peer: Peer): Promise<GetApiNodesResponse>;
getMessages(peer: Peer, query: GetMessagesQuery): Promise<GetMessagesResponse>;
getProposal(peer: Peer): Promise<GetProposalResponse>;
getProposal(peer: Peer, query: GetProposalQuery): Promise<GetProposalResponse>;
getBlocks(
peer: Peer,
{ fromBlockNumber, limit }: { fromBlockNumber: number; limit?: number },
Expand Down
8 changes: 8 additions & 0 deletions packages/p2p/source/downloader/proposal-downloader.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ describe<{
context.downloader = context.app.resolve(ProposalDownloader);
});

it("#download - should request exactly the job's block and round", ({ downloader, peer }) => {
const getProposal = stub(communicator, "getProposal").returnValue(new Promise(() => {}));

downloader.download(peer);

getProposal.calledWith(peer, { blockNumber: 2, round: 0 });
});

it("#download - should release the slot on an empty reply and allow the round to be re-pulled", async ({
downloader,
peer,
Expand Down
5 changes: 4 additions & 1 deletion packages/p2p/source/downloader/proposal-downloader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,10 @@ export class ProposalDownloader implements Contracts.P2P.Downloader {
let error: Error | undefined;

try {
const result = await this.communicator.getProposal(job.peer);
const result = await this.communicator.getProposal(job.peer, {
blockNumber: job.blockNumber,
round: job.round,
});

if (result.proposal.length === 0) {
return;
Expand Down
7 changes: 5 additions & 2 deletions packages/p2p/source/peer-communicator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,14 @@ export class PeerCommunicator implements Contracts.P2P.PeerCommunicator {
return response.data;
}

public async getProposal(peer: Contracts.P2P.Peer): Promise<Contracts.P2P.GetProposalResponse> {
public async getProposal(
peer: Contracts.P2P.Peer,
query: Contracts.P2P.GetProposalQuery,
): Promise<Contracts.P2P.GetProposalResponse> {
const response = await this.#emit<Contracts.P2P.GetProposalResponse>(
peer,
Routes.GetProposal,
{},
{ query },
{ timeout: 5000 },
);
return response.data;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,14 @@ import "shared.proto";

package getProposal;

message GetProposalQuery {
uint32 blockNumber = 1;
uint32 round = 2;
}

message GetProposalRequest {
shared.Headers headers = 1;
GetProposalQuery query = 2;
}

message GetProposalResponse {
Expand Down
129 changes: 129 additions & 0 deletions packages/p2p/source/socket-server/codecs/proto/protos.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1542,6 +1542,129 @@ export namespace getPeers {
/** Namespace getProposal. */
export namespace getProposal {

/**
* Properties of a GetProposalQuery.
* @deprecated Use getProposal.GetProposalQuery.$Properties instead.
*/
interface IGetProposalQuery extends getProposal.GetProposalQuery.$Properties {
}

/** Represents a GetProposalQuery. */
class GetProposalQuery {

/**
* Constructs a new GetProposalQuery.
* @param [properties] Properties to set
*/
constructor(properties?: getProposal.GetProposalQuery.$Properties);

/** Unknown fields preserved while decoding when enabled */
$unknowns?: Uint8Array[];

/** GetProposalQuery blockNumber. */
blockNumber: number;

/** GetProposalQuery round. */
round: number;

/**
* Creates a new GetProposalQuery instance using the specified properties.
* @param [properties] Properties to set
* @returns GetProposalQuery instance
*/
static create(properties: getProposal.GetProposalQuery.$Shape): getProposal.GetProposalQuery & getProposal.GetProposalQuery.$Shape;
static create(properties?: getProposal.GetProposalQuery.$Properties): getProposal.GetProposalQuery;

/**
* Encodes the specified GetProposalQuery message. Does not implicitly {@link getProposal.GetProposalQuery.verify|verify} messages.
* @param message GetProposalQuery message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encode(message: getProposal.GetProposalQuery.$Properties, writer?: $protobuf.Writer): $protobuf.Writer;

/**
* Encodes the specified GetProposalQuery message, length delimited. Does not implicitly {@link getProposal.GetProposalQuery.verify|verify} messages.
* @param message GetProposalQuery message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encodeDelimited(message: getProposal.GetProposalQuery.$Properties, writer?: $protobuf.Writer): $protobuf.Writer;

/**
* Decodes a GetProposalQuery message from the specified reader or buffer.
* @param reader Reader or buffer to decode from
* @param [length] Message length if known beforehand
* @returns {getProposal.GetProposalQuery & getProposal.GetProposalQuery.$Shape} GetProposalQuery
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): getProposal.GetProposalQuery & getProposal.GetProposalQuery.$Shape;

/**
* Decodes a GetProposalQuery message from the specified reader or buffer, length delimited.
* @param reader Reader or buffer to decode from
* @returns {getProposal.GetProposalQuery & getProposal.GetProposalQuery.$Shape} GetProposalQuery
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): getProposal.GetProposalQuery & getProposal.GetProposalQuery.$Shape;

/**
* Verifies a GetProposalQuery message.
* @param message Plain object to verify
* @returns `null` if valid, otherwise the reason why it is not
*/
static verify(message: { [k: string]: any }): (string|null);

/**
* Creates a GetProposalQuery message from a plain object. Also converts values to their respective internal types.
* @param object Plain object
* @returns GetProposalQuery
*/
static fromObject(object: { [k: string]: any }): getProposal.GetProposalQuery;

/**
* Creates a plain object from a GetProposalQuery message. Also converts values to other types if specified.
* @param message GetProposalQuery
* @param [options] Conversion options
* @returns Plain object
*/
static toObject(message: getProposal.GetProposalQuery, options?: $protobuf.IConversionOptions): { [k: string]: any };

/**
* Converts this GetProposalQuery to JSON.
* @returns JSON object
*/
toJSON(): { [k: string]: any };

/**
* Gets the type url for GetProposalQuery
* @param [prefix] Custom type url prefix, defaults to `"type.googleapis.com"`
* @returns The type url
*/
static getTypeUrl(prefix?: string): string;
}

namespace GetProposalQuery {

/** Properties of a GetProposalQuery. */
interface $Properties {

/** GetProposalQuery blockNumber */
blockNumber?: (number|null);

/** GetProposalQuery round */
round?: (number|null);

/** Unknown fields preserved while decoding when enabled */
$unknowns?: Uint8Array[];
}

/** Shape of a GetProposalQuery. */
type $Shape = getProposal.GetProposalQuery.$Properties;
}

/**
* Properties of a GetProposalRequest.
* @deprecated Use getProposal.GetProposalRequest.$Properties instead.
Expand All @@ -1564,6 +1687,9 @@ export namespace getProposal {
/** GetProposalRequest headers. */
headers?: (shared.Headers.$Properties|null);

/** GetProposalRequest query. */
query?: (getProposal.GetProposalQuery.$Properties|null);

/**
* Creates a new GetProposalRequest instance using the specified properties.
* @param [properties] Properties to set
Expand Down Expand Up @@ -1651,6 +1777,9 @@ export namespace getProposal {
/** GetProposalRequest headers */
headers?: (shared.Headers.$Properties|null);

/** GetProposalRequest query */
query?: (getProposal.GetProposalQuery.$Properties|null);

/** Unknown fields preserved while decoding when enabled */
$unknowns?: Uint8Array[];
}
Expand Down
Loading