feat: update getSignatureStatus methods

This commit is contained in:
Justin Starry
2020-04-06 17:56:26 +08:00
committed by Michael Vines
parent ae10f1ecab
commit 3a2fe7fdbc
7 changed files with 57 additions and 23 deletions

View File

@@ -96,6 +96,16 @@ function notificationResultAndContext(resultDescription: any) {
*/
export type Commitment = 'max' | 'recent';
/**
* Configuration object for changing query behavior
*
* @typedef {Object} SignatureStatusConfig
* @property {boolean} searchTransactionHistory enable searching status history, not needed for recent transactions
*/
export type SignatureStatusConfig = {
searchTransactionHistory: boolean,
};
/**
* Information describing a cluster node
*
@@ -829,6 +839,13 @@ export class Connection {
);
}
/**
* The default commitment used for requests
*/
get commitment(): ?Commitment {
return this._commitment;
}
/**
* Fetch the balance for the specified public key, return with context
*/
@@ -1033,25 +1050,28 @@ export class Connection {
*/
async getSignatureStatus(
signature: TransactionSignature,
commitment: ?Commitment,
config: ?SignatureStatusConfig,
): Promise<RpcResponseAndContext<SignatureStatus | null>> {
const {context, value} = await this.getSignatureStatuses(
[signature],
commitment,
config,
);
assert(value.length === 1);
return {context, value: value[0]};
}
/**
* Fetch the current status of a signature
* Fetch the current statuses of a batch of signatures
*/
async getSignatureStatuses(
signatures: Array<TransactionSignature>,
commitment: ?Commitment,
config: ?SignatureStatusConfig,
): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>> {
const args = this._argsWithCommitment([signatures], commitment);
const unsafeRes = await this._rpcRequest('getSignatureStatuses', args);
const params = [signatures];
if (config) {
params.push(config);
}
const unsafeRes = await this._rpcRequest('getSignatureStatuses', params);
const res = GetSignatureStatusesRpcResult(unsafeRes);
if (res.error) {
throw new Error(res.error.message);

View File

@@ -15,15 +15,20 @@ export async function sendAndConfirmRawTransaction(
commitment: ?Commitment,
): Promise<TransactionSignature> {
const start = Date.now();
const statusCommitment = commitment || connection.commitment || 'max';
let signature = await connection.sendRawTransaction(rawTransaction);
// Wait up to a couple slots for a confirmation
let status = null;
let statusRetries = 6;
for (;;) {
status = (await connection.getSignatureStatus(signature, commitment)).value;
status = (await connection.getSignatureStatus(signature)).value;
if (status) {
break;
if (statusCommitment === 'max' && status.confirmations === null) {
break;
} else if (statusCommitment === 'recent') {
break;
}
}
// Sleep for approximately half a slot

View File

@@ -43,8 +43,11 @@ async function _sendAndConfirmTransaction(
signers: Array<Account>,
commitment: ?Commitment,
): Promise<TransactionSignature> {
const statusCommitment = commitment || connection.commitment || 'max';
let sendRetries = 10;
let signature;
for (;;) {
const start = Date.now();
signature = await connection.sendTransaction(transaction, ...signers);
@@ -53,10 +56,13 @@ async function _sendAndConfirmTransaction(
let status = null;
let statusRetries = 6;
for (;;) {
status = (await connection.getSignatureStatus(signature, commitment))
.value;
status = (await connection.getSignatureStatus(signature)).value;
if (status) {
break;
if (statusCommitment === 'max' && status.confirmations === null) {
break;
} else if (statusCommitment === 'recent') {
break;
}
}
if (--statusRetries <= 0) {