publishing messages
This commit is contained in:
@@ -3,6 +3,8 @@ import {
|
|||||||
DLOBSubscriber,
|
DLOBSubscriber,
|
||||||
DLOBSubscriptionConfig,
|
DLOBSubscriptionConfig,
|
||||||
L2OrderBookGenerator,
|
L2OrderBookGenerator,
|
||||||
|
MainnetPerpMarkets,
|
||||||
|
MainnetSpotMarkets,
|
||||||
MarketType,
|
MarketType,
|
||||||
groupL2,
|
groupL2,
|
||||||
} from '@drift-labs/sdk';
|
} from '@drift-labs/sdk';
|
||||||
@@ -16,16 +18,49 @@ type wsMarketL2Args = {
|
|||||||
marketName: string;
|
marketName: string;
|
||||||
depth: number;
|
depth: number;
|
||||||
includeVamm: boolean;
|
includeVamm: boolean;
|
||||||
|
numVammOrders?: number;
|
||||||
grouping?: number;
|
grouping?: number;
|
||||||
fallbackL2Generators?: L2OrderBookGenerator[];
|
fallbackL2Generators?: L2OrderBookGenerator[];
|
||||||
|
updateOnChange?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export class DLOBSubscriberIO extends DLOBSubscriber {
|
export class DLOBSubscriberIO extends DLOBSubscriber {
|
||||||
public marketL2Args: wsMarketL2Args[] = [];
|
public marketL2Args: wsMarketL2Args[] = [];
|
||||||
|
public lastSeenL2Formatted: Map<MarketType, Map<number, any>>;
|
||||||
io: Server;
|
io: Server;
|
||||||
|
|
||||||
constructor(config: DLOBSubscriptionConfig) {
|
constructor(config: DLOBSubscriptionConfig) {
|
||||||
super(config);
|
super(config);
|
||||||
|
|
||||||
|
// Set up appropriate maps
|
||||||
|
this.lastSeenL2Formatted = new Map();
|
||||||
|
this.lastSeenL2Formatted.set(MarketType.SPOT, new Map());
|
||||||
|
this.lastSeenL2Formatted.set(MarketType.PERP, new Map());
|
||||||
|
|
||||||
|
// Add all active markets to the market L2Args
|
||||||
|
for (const market of MainnetPerpMarkets) {
|
||||||
|
this.marketL2Args.push({
|
||||||
|
marketIndex: market.marketIndex,
|
||||||
|
marketType: MarketType.PERP,
|
||||||
|
marketName: market.symbol,
|
||||||
|
depth: 2,
|
||||||
|
includeVamm: true,
|
||||||
|
numVammOrders: 100,
|
||||||
|
updateOnChange: true,
|
||||||
|
fallbackL2Generators: []
|
||||||
|
});
|
||||||
|
}
|
||||||
|
for (const market of MainnetSpotMarkets) {
|
||||||
|
this.marketL2Args.push({
|
||||||
|
marketIndex: market.marketIndex,
|
||||||
|
marketType: MarketType.SPOT,
|
||||||
|
marketName: market.symbol,
|
||||||
|
depth: 2,
|
||||||
|
includeVamm: false,
|
||||||
|
updateOnChange: true,
|
||||||
|
fallbackL2Generators: []
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override async updateDLOB(): Promise<void> {
|
override async updateDLOB(): Promise<void> {
|
||||||
@@ -46,6 +81,11 @@ export class DLOBSubscriberIO extends DLOBSubscriber {
|
|||||||
} else {
|
} else {
|
||||||
l2Formatted = l2WithBNToStrings(l2);
|
l2Formatted = l2WithBNToStrings(l2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (l2Args.updateOnChange && this.lastSeenL2Formatted.get(l2Args.marketType)?.get(l2Args.marketIndex) === JSON.stringify(l2Formatted)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.lastSeenL2Formatted.get(l2Args.marketType)?.set(l2Args.marketIndex, JSON.stringify(l2Formatted));
|
||||||
l2Formatted['marketName'] = l2Args.marketName;
|
l2Formatted['marketName'] = l2Args.marketName;
|
||||||
l2Formatted['marketType'] = l2Args.marketType;
|
l2Formatted['marketType'] = l2Args.marketType;
|
||||||
l2Formatted['marketIndex'] = l2Args.marketIndex;
|
l2Formatted['marketIndex'] = l2Args.marketIndex;
|
||||||
|
|||||||
40
src/index.ts
40
src/index.ts
@@ -17,7 +17,6 @@ import {
|
|||||||
DLOBOrder,
|
DLOBOrder,
|
||||||
DLOBOrders,
|
DLOBOrders,
|
||||||
DLOBOrdersCoder,
|
DLOBOrdersCoder,
|
||||||
MarketType,
|
|
||||||
DLOBNode,
|
DLOBNode,
|
||||||
isVariant,
|
isVariant,
|
||||||
BN,
|
BN,
|
||||||
@@ -39,7 +38,6 @@ import {
|
|||||||
errorHandler,
|
errorHandler,
|
||||||
getPhoenixSubscriber,
|
getPhoenixSubscriber,
|
||||||
getSerumSubscriber,
|
getSerumSubscriber,
|
||||||
validateWsSubscribeMsg,
|
|
||||||
validateDlobQuery,
|
validateDlobQuery,
|
||||||
} from './utils/utils';
|
} from './utils/utils';
|
||||||
import { DLOBSubscriberIO } from './dlob-subscriber/DLOBSubscriberIO';
|
import { DLOBSubscriberIO } from './dlob-subscriber/DLOBSubscriberIO';
|
||||||
@@ -54,7 +52,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;
|
||||||
const ORDERBOOK_UPDATE_INTERVAL = 100;
|
const ORDERBOOK_UPDATE_INTERVAL = 1000;
|
||||||
|
|
||||||
const rateLimitCallsPerSecond = process.env.RATE_LIMIT_CALLS_PER_SECOND
|
const rateLimitCallsPerSecond = process.env.RATE_LIMIT_CALLS_PER_SECOND
|
||||||
? parseInt(process.env.RATE_LIMIT_CALLS_PER_SECOND)
|
? parseInt(process.env.RATE_LIMIT_CALLS_PER_SECOND)
|
||||||
@@ -162,7 +160,6 @@ const main = async () => {
|
|||||||
programID: clearingHousePublicKey,
|
programID: clearingHousePublicKey,
|
||||||
accountSubscription: {
|
accountSubscription: {
|
||||||
type: 'websocket',
|
type: 'websocket',
|
||||||
resubTimeoutMs: 60000,
|
|
||||||
},
|
},
|
||||||
env: driftEnv,
|
env: driftEnv,
|
||||||
userStats: true,
|
userStats: true,
|
||||||
@@ -813,41 +810,6 @@ const main = async () => {
|
|||||||
socket.on('disconnect', () => {
|
socket.on('disconnect', () => {
|
||||||
console.log('user disconnected');
|
console.log('user disconnected');
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('message', (msg: any) => {
|
|
||||||
const parsed = JSON.parse(msg);
|
|
||||||
if (parsed['type'] == 'subscribe') {
|
|
||||||
const valid = validateWsSubscribeMsg(parsed);
|
|
||||||
if (!valid.valid) {
|
|
||||||
socket.emit('message', {
|
|
||||||
type: 'error',
|
|
||||||
message: `Bad Request: Invalid subscribe message: ${valid.msg}`,
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dlobSubscriber.marketL2Args.push({
|
|
||||||
marketIndex: parseInt(parsed['marketIndex']),
|
|
||||||
marketType: isVariant(parsed['marketType'].toLowerCase(), 'spot')
|
|
||||||
? MarketType.SPOT
|
|
||||||
: MarketType.PERP,
|
|
||||||
marketName: parsed['marketName'],
|
|
||||||
depth: parseInt(parsed['depth']),
|
|
||||||
includeVamm: parsed['includeVamm'] === 'true',
|
|
||||||
grouping: parsed['grouping']
|
|
||||||
? parseInt(parsed['grouping'])
|
|
||||||
: undefined,
|
|
||||||
fallbackL2Generators: isVariant(parsed['marketType'], 'spot')
|
|
||||||
? [
|
|
||||||
`${parsed['includePhoenix']}`.toLowerCase() === 'true' &&
|
|
||||||
MARKET_SUBSCRIBERS[parseInt(parsed['marketIndex'])].phoenix,
|
|
||||||
`${parsed['includeSerum']}`.toLowerCase() === 'true' &&
|
|
||||||
MARKET_SUBSCRIBERS[parseInt(parsed['marketIndex'])].serum,
|
|
||||||
].filter((a) => !!a)
|
|
||||||
: [],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user