Merge pull request #31 from drift-labs/ws-fetch

fetch with ws
This commit is contained in:
wphan
2023-11-29 13:31:47 -08:00
committed by GitHub
3 changed files with 74 additions and 22 deletions

View File

@@ -11,6 +11,7 @@ export type DLOBProvider = {
}>; }>;
getUserAccount(publicKey: PublicKey): UserAccount | undefined; getUserAccount(publicKey: PublicKey): UserAccount | undefined;
size(): number; size(): number;
fetch(): Promise<void>;
}; };
export function getDLOBProviderFromUserMap(userMap: UserMap): DLOBProvider { export function getDLOBProviderFromUserMap(userMap: UserMap): DLOBProvider {
@@ -38,6 +39,9 @@ export function getDLOBProviderFromUserMap(userMap: UserMap): DLOBProvider {
size: () => { size: () => {
return userMap.size(); return userMap.size();
}, },
fetch: () => {
return userMap.sync();
},
}; };
} }
@@ -73,5 +77,8 @@ export function getDLOBProviderFromOrderSubscriber(
size(): number { size(): number {
return orderSubscriber.usersAccounts.size; return orderSubscriber.usersAccounts.size;
}, },
fetch() {
return orderSubscriber.fetch();
},
}; };
} }

View File

@@ -62,6 +62,7 @@ const sdkConfig = initialize({ env: process.env.ENV });
const stateCommitment: Commitment = 'processed'; const stateCommitment: Commitment = 'processed';
const serverPort = process.env.PORT || 6969; const serverPort = process.env.PORT || 6969;
export const ORDERBOOK_UPDATE_INTERVAL = 1000; export const ORDERBOOK_UPDATE_INTERVAL = 1000;
const WS_FALLBACK_FETCH_INTERVAL = ORDERBOOK_UPDATE_INTERVAL * 10;
const useWebsocket = process.env.USE_WEBSOCKET?.toLowerCase() === 'true'; const useWebsocket = process.env.USE_WEBSOCKET?.toLowerCase() === 'true';
const useOrderSubscriber = const useOrderSubscriber =
process.env.USE_ORDER_SUBSCRIBER?.toLowerCase() === 'true'; process.env.USE_ORDER_SUBSCRIBER?.toLowerCase() === 'true';
@@ -282,6 +283,11 @@ const main = async () => {
`dlob provider initialized in ${Date.now() - initDLOBProviderStart} ms` `dlob provider initialized in ${Date.now() - initDLOBProviderStart} ms`
); );
logger.info(`dlob provider size ${dlobProvider.size()}`); logger.info(`dlob provider size ${dlobProvider.size()}`);
if (useWebsocket) {
setInterval(async () => {
await dlobProvider.fetch();
}, WS_FALLBACK_FETCH_INTERVAL);
}
logger.info(`Initializing DLOBSubscriber...`); logger.info(`Initializing DLOBSubscriber...`);
const initDlobSubscriberStart = Date.now(); const initDlobSubscriberStart = Date.now();

View File

@@ -11,6 +11,8 @@ import {
BulkAccountLoader, BulkAccountLoader,
OrderSubscriber, OrderSubscriber,
SlotSource, SlotSource,
DriftClientSubscriptionConfig,
SlotSubscriber,
} from '@drift-labs/sdk'; } from '@drift-labs/sdk';
import { logger, setLogLevel } from '../utils/logger'; import { logger, setLogLevel } from '../utils/logger';
@@ -24,6 +26,9 @@ import {
} from '../dlobProvider'; } from '../dlobProvider';
require('dotenv').config(); require('dotenv').config();
const stateCommitment: Commitment = 'processed';
const ORDERBOOK_UPDATE_INTERVAL = 1000;
const WS_FALLBACK_FETCH_INTERVAL = ORDERBOOK_UPDATE_INTERVAL * 10;
const driftEnv = (process.env.ENV || 'devnet') as DriftEnv; const driftEnv = (process.env.ENV || 'devnet') as DriftEnv;
const commitHash = process.env.COMMIT; const commitHash = process.env.COMMIT;
const REDIS_HOST = process.env.REDIS_HOST || 'localhost'; const REDIS_HOST = process.env.REDIS_HOST || 'localhost';
@@ -32,10 +37,6 @@ const REDIS_PASSWORD = process.env.REDIS_PASSWORD;
//@ts-ignore //@ts-ignore
const sdkConfig = initialize({ env: process.env.ENV }); const sdkConfig = initialize({ env: process.env.ENV });
const stateCommitment: Commitment = 'processed';
const ORDERBOOK_UPDATE_INTERVAL = 1000;
let driftClient: DriftClient; let driftClient: DriftClient;
const opts = program.opts(); const opts = program.opts();
@@ -45,6 +46,7 @@ const endpoint = process.env.ENDPOINT;
const wsEndpoint = process.env.WS_ENDPOINT; const wsEndpoint = process.env.WS_ENDPOINT;
const useOrderSubscriber = const useOrderSubscriber =
process.env.USE_ORDER_SUBSCRIBER?.toLowerCase() === 'true'; process.env.USE_ORDER_SUBSCRIBER?.toLowerCase() === 'true';
const useWebsocket = process.env.USE_WEBSOCKET?.toLowerCase() === 'true';
logger.info(`RPC endpoint: ${endpoint}`); logger.info(`RPC endpoint: ${endpoint}`);
logger.info(`WS endpoint: ${wsEndpoint}`); logger.info(`WS endpoint: ${wsEndpoint}`);
@@ -60,20 +62,48 @@ const main = async () => {
commitment: stateCommitment, commitment: stateCommitment,
}); });
const bulkAccountLoader = new BulkAccountLoader( // only set when polling
let bulkAccountLoader: BulkAccountLoader | undefined;
// only set when using websockets
let slotSubscriber: SlotSubscriber | undefined;
let accountSubscription: DriftClientSubscriptionConfig;
let slotSource: SlotSource;
if (!useWebsocket) {
bulkAccountLoader = new BulkAccountLoader(
connection, connection,
stateCommitment, stateCommitment,
ORDERBOOK_UPDATE_INTERVAL ORDERBOOK_UPDATE_INTERVAL
); );
accountSubscription = {
type: 'polling',
accountLoader: bulkAccountLoader,
};
slotSource = {
getSlot: () => bulkAccountLoader!.getSlot(),
};
} else {
accountSubscription = {
type: 'websocket',
commitment: stateCommitment,
};
slotSubscriber = new SlotSubscriber(connection);
await slotSubscriber.subscribe();
slotSource = {
getSlot: () => slotSubscriber!.getSlot(),
};
}
driftClient = new DriftClient({ driftClient = new DriftClient({
connection, connection,
wallet, wallet,
programID: clearingHousePublicKey, programID: clearingHousePublicKey,
accountSubscription: { accountSubscription,
type: 'polling',
accountLoader: bulkAccountLoader,
},
env: driftEnv, env: driftEnv,
}); });
@@ -90,15 +120,23 @@ const main = async () => {
logger.error(e); logger.error(e);
}); });
let slotSource: SlotSource;
let dlobProvider: DLOBProvider; let dlobProvider: DLOBProvider;
if (useOrderSubscriber) { if (useOrderSubscriber) {
const orderSubscriber = new OrderSubscriber({ let subscriptionConfig;
driftClient, if (useWebsocket) {
subscriptionConfig: { subscriptionConfig = {
type: 'websocket',
};
} else {
subscriptionConfig = {
type: 'polling', type: 'polling',
frequency: ORDERBOOK_UPDATE_INTERVAL, frequency: ORDERBOOK_UPDATE_INTERVAL,
}, };
}
const orderSubscriber = new OrderSubscriber({
driftClient,
subscriptionConfig,
}); });
dlobProvider = getDLOBProviderFromOrderSubscriber(orderSubscriber); dlobProvider = getDLOBProviderFromOrderSubscriber(orderSubscriber);
@@ -114,10 +152,6 @@ const main = async () => {
); );
dlobProvider = getDLOBProviderFromUserMap(userMap); dlobProvider = getDLOBProviderFromUserMap(userMap);
slotSource = {
getSlot: () => bulkAccountLoader.getSlot(),
};
} }
await dlobProvider.subscribe(); await dlobProvider.subscribe();
@@ -133,6 +167,11 @@ const main = async () => {
redisClient, redisClient,
}); });
await dlobSubscriber.subscribe(); await dlobSubscriber.subscribe();
if (useWebsocket) {
setInterval(async () => {
await dlobProvider.fetch();
}, WS_FALLBACK_FETCH_INTERVAL);
}
console.log('DLOBSubscriber Publishing Messages'); console.log('DLOBSubscriber Publishing Messages');
}; };