fetch with ws
This commit is contained in:
@@ -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();
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
connection,
|
let bulkAccountLoader: BulkAccountLoader | undefined;
|
||||||
stateCommitment,
|
|
||||||
ORDERBOOK_UPDATE_INTERVAL
|
// only set when using websockets
|
||||||
);
|
let slotSubscriber: SlotSubscriber | undefined;
|
||||||
|
|
||||||
|
let accountSubscription: DriftClientSubscriptionConfig;
|
||||||
|
let slotSource: SlotSource;
|
||||||
|
|
||||||
|
if (!useWebsocket) {
|
||||||
|
bulkAccountLoader = new BulkAccountLoader(
|
||||||
|
connection,
|
||||||
|
stateCommitment,
|
||||||
|
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');
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user