From 9d857385c45b5c58455b4a6b0b514f178b4eafb4 Mon Sep 17 00:00:00 2001 From: wphan Date: Fri, 15 Dec 2023 16:44:26 -0800 Subject: [PATCH] add implementation --- src/dlob-subscriber/DLOBSubscriberIO.ts | 15 +++++-- src/utils/webhook.ts | 57 +++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 src/utils/webhook.ts diff --git a/src/dlob-subscriber/DLOBSubscriberIO.ts b/src/dlob-subscriber/DLOBSubscriberIO.ts index b277304..7dd331f 100644 --- a/src/dlob-subscriber/DLOBSubscriberIO.ts +++ b/src/dlob-subscriber/DLOBSubscriberIO.ts @@ -19,6 +19,7 @@ import { l2WithBNToStrings, } from '../utils/utils'; import { logger } from '../utils/logger'; +import { webhookMessage } from '../utils/webhook'; type wsMarketL2Args = { marketIndex: number; @@ -144,12 +145,18 @@ export class DLOBSubscriberIO extends DLOBSubscriber { asks: l2Formatted.asks.slice(0, 5), }); + // START HACK FOR DEBUGGING FAILURE WEBSOCKET CONNECTIONS const orderSubscriberSlot = this.slotSource.getSlot(); - const dlobOracleSlot = l2Formatted['oracle']['slot']; - if (Math.abs(orderSubscriberSlot - dlobOracleSlot) > 50) { - noticeSlack('dlobsubscirber kiling itstelf slot breakokren') - process.exit(420); + const dlobOracleSlot = parseInt(l2Formatted['oracleData']['slot']); + const slotDiff = Math.abs(orderSubscriberSlot - dlobOracleSlot); + if (slotDiff > 50) { + const msg = `DlobPublisher bad slot in ${l2Formatted['marketType']} market ${l2Formatted['marketName']}! abs(oracleSlot (${dlobOracleSlot}) - orderSubscriberSlot (${orderSubscriberSlot})) = ${slotDiff} > 50`; + logger.error(msg); + webhookMessage(msg).then(() => { + process.exit(1); + }); } + // END HACK FOR DEBUGGING FAILURE WEBSOCKET CONNECTIONS this.redisClient.client.publish( `orderbook_${marketType}_${l2Args.marketIndex}`, diff --git a/src/utils/webhook.ts b/src/utils/webhook.ts new file mode 100644 index 0000000..7ecdedc --- /dev/null +++ b/src/utils/webhook.ts @@ -0,0 +1,57 @@ +import axios from 'axios'; +require('dotenv').config(); +import { logger } from './logger'; + +// enum for webhook type (slack, telegram, ...) +export enum WebhookType { + Slack = 'slack', + Discord = 'discord', + Telegram = 'telegram', +} + +export async function webhookMessage( + message: string, + webhookUrl?: string, + prefix?: string, + webhookType?: WebhookType +): Promise { + if (process.env.WEBHOOK_TYPE) { + webhookType = process.env.WEBHOOK_TYPE as WebhookType; + } + if (!webhookType) { + webhookType = WebhookType.Discord; + } + if (webhookUrl || process.env.WEBHOOK_URL) { + const webhook = webhookUrl || process.env.WEBHOOK_URL; + const fullMessage = prefix ? prefix + message : message; + if (fullMessage && webhook) { + try { + let data; + switch (webhookType) { + case WebhookType.Slack: + data = { + text: fullMessage, + }; + break; + case WebhookType.Discord: + data = { + content: fullMessage, + }; + break; + case WebhookType.Telegram: + data = { + text: fullMessage, + }; + break; + default: + logger.error(`webhookMessage: unknown webhookType: ${webhookType}`); + return; + } + + await axios.post(webhook, data); + } catch (err) { + logger.info('webhook error'); + } + } + } +}