UNPKG

@ox-fun/drift-sdk

Version:

SDK for Drift Protocol

77 lines (69 loc) 2.06 kB
import { UserMap } from './userMap'; import { getNonIdleUserFilter, getUserFilter } from '../memcmp'; import { WebSocketProgramAccountSubscriber } from '../accounts/webSocketProgramAccountSubscriber'; import { UserAccount } from '../types'; import { Commitment, Context, PublicKey } from '@solana/web3.js'; export class WebsocketSubscription { private userMap: UserMap; private commitment: Commitment; private skipInitialLoad: boolean; private resubTimeoutMs?: number; private includeIdle?: boolean; private decodeFn: (name: string, data: Buffer) => UserAccount; private subscriber: WebSocketProgramAccountSubscriber<UserAccount>; constructor({ userMap, commitment, skipInitialLoad = false, resubTimeoutMs, includeIdle = false, decodeFn, }: { userMap: UserMap; commitment: Commitment; skipInitialLoad?: boolean; resubTimeoutMs?: number; includeIdle?: boolean; decodeFn: (name: string, data: Buffer) => UserAccount; }) { this.userMap = userMap; this.commitment = commitment; this.skipInitialLoad = skipInitialLoad; this.resubTimeoutMs = resubTimeoutMs; this.includeIdle = includeIdle || false; this.decodeFn = decodeFn; } public async subscribe(): Promise<void> { if (!this.subscriber) { const filters = [getUserFilter()]; if (!this.includeIdle) { filters.push(getNonIdleUserFilter()); } this.subscriber = new WebSocketProgramAccountSubscriber<UserAccount>( 'UserMap', 'User', this.userMap.driftClient.program, this.decodeFn, { filters, commitment: this.commitment, }, this.resubTimeoutMs ); } await this.subscriber.subscribe( (accountId: PublicKey, account: UserAccount, context: Context) => { const userKey = accountId.toBase58(); this.userMap.updateUserAccount(userKey, account, context.slot); } ); if (!this.skipInitialLoad) { await this.userMap.sync(); } } public async unsubscribe(): Promise<void> { if (!this.subscriber) return; await this.subscriber.unsubscribe(); this.subscriber = undefined; } }