Optionally cache openOrdersAccounts

This commit is contained in:
Nathaniel Parke 2020-09-04 13:14:57 +08:00
parent 92c859360c
commit 15d76566ca
1 changed files with 29 additions and 2 deletions

View File

@ -66,6 +66,9 @@ export class Market {
private _skipPreflight: boolean; private _skipPreflight: boolean;
private _confirmations: number; private _confirmations: number;
private _programId: PublicKey; private _programId: PublicKey;
private _openOrdersAccountsCache: {
[publickKey: string]: { accounts: OpenOrders[]; ts: number };
};
constructor( constructor(
decoded, decoded,
@ -84,6 +87,7 @@ export class Market {
this._skipPreflight = skipPreflight; this._skipPreflight = skipPreflight;
this._confirmations = confirmations; this._confirmations = confirmations;
this._programId = programId; this._programId = programId;
this._openOrdersAccountsCache = {};
} }
static get LAYOUT() { static get LAYOUT() {
@ -157,11 +161,16 @@ export class Market {
async loadOrdersForOwner( async loadOrdersForOwner(
connection: Connection, connection: Connection,
ownerAddress: PublicKey, ownerAddress: PublicKey,
cacheDurationMs = 0,
): Promise<Order[]> { ): Promise<Order[]> {
const [bids, asks, openOrdersAccounts] = await Promise.all([ const [bids, asks, openOrdersAccounts] = await Promise.all([
this.loadBids(connection), this.loadBids(connection),
this.loadAsks(connection), this.loadAsks(connection),
this.findOpenOrdersAccountsForOwner(connection, ownerAddress), this.findOpenOrdersAccountsForOwner(
connection,
ownerAddress,
cacheDurationMs,
),
]); ]);
return this.filterForOpenOrders(bids, asks, openOrdersAccounts); return this.filterForOpenOrders(bids, asks, openOrdersAccounts);
} }
@ -225,13 +234,27 @@ export class Market {
async findOpenOrdersAccountsForOwner( async findOpenOrdersAccountsForOwner(
connection: Connection, connection: Connection,
ownerAddress: PublicKey, ownerAddress: PublicKey,
cacheDurationMs = 0,
): Promise<OpenOrders[]> { ): Promise<OpenOrders[]> {
return OpenOrders.findForMarketAndOwner( const strOwner = ownerAddress.toBase58();
const now = new Date().getTime();
if (
strOwner in this._openOrdersAccountsCache &&
now - this._openOrdersAccountsCache[strOwner].ts < cacheDurationMs
) {
return this._openOrdersAccountsCache[strOwner].accounts;
}
const openOrdersAccountsForOwner = await OpenOrders.findForMarketAndOwner(
connection, connection,
this.address, this.address,
ownerAddress, ownerAddress,
this._programId, this._programId,
); );
this._openOrdersAccountsCache[strOwner] = {
accounts: openOrdersAccountsForOwner,
ts: now,
};
return openOrdersAccountsForOwner;
} }
async placeOrder( async placeOrder(
@ -272,12 +295,14 @@ export class Market {
orderType = 'limit', orderType = 'limit',
clientId, clientId,
}: OrderParams<T>, }: OrderParams<T>,
cacheDurationMs = 0,
) { ) {
// @ts-ignore // @ts-ignore
const ownerAddress: PublicKey = owner.publicKey ?? owner; const ownerAddress: PublicKey = owner.publicKey ?? owner;
const openOrdersAccounts = await this.findOpenOrdersAccountsForOwner( const openOrdersAccounts = await this.findOpenOrdersAccountsForOwner(
connection, connection,
ownerAddress, ownerAddress,
cacheDurationMs,
); // TODO: cache this ); // TODO: cache this
const transaction = new Transaction(); const transaction = new Transaction();
const signers: (T | Account)[] = [owner]; const signers: (T | Account)[] = [owner];
@ -296,6 +321,8 @@ export class Market {
); );
openOrdersAddress = newOpenOrdersAccount.publicKey; openOrdersAddress = newOpenOrdersAccount.publicKey;
signers.push(newOpenOrdersAccount); signers.push(newOpenOrdersAccount);
// refresh the cache of open order accounts on next fetch
this._openOrdersAccountsCache[ownerAddress.toBase58()].ts = 0;
} else { } else {
openOrdersAddress = openOrdersAccounts[0].address; openOrdersAddress = openOrdersAccounts[0].address;
} }