Skip to content

Commit

Permalink
node: Add order websocket
Browse files Browse the repository at this point in the history
  • Loading branch information
sehyunc committed Jan 31, 2025
1 parent 7ea0360 commit 5cf74ac
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 19 deletions.
39 changes: 20 additions & 19 deletions packages/core/src/types/token.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,37 @@ type TokenMapping = {
tokens: TokenMetadata[]
}

const tokenMappingUrl =
process.env.TOKEN_MAPPING_URL || process.env.NEXT_PUBLIC_TOKEN_MAPPING_URL

const tokenMappingStr =
process.env.NEXT_PUBLIC_TOKEN_MAPPING || process.env.TOKEN_MAPPING

invariant(
tokenMappingUrl || tokenMappingStr,
'No token mapping initialization option provided',
)

export const tokenMapping: TokenMapping = {
tokens: [],
}

export async function loadTokenMapping() {
export async function loadTokenMapping(url?: string) {
const tokenMappingUrl =
url ||
process.env.TOKEN_MAPPING_URL ||
process.env.NEXT_PUBLIC_TOKEN_MAPPING_URL
const tokenMappingStr =
process.env.TOKEN_MAPPING || process.env.NEXT_PUBLIC_TOKEN_MAPPING

invariant(
tokenMappingUrl || tokenMappingStr,
'No token mapping initialization option provided',
)

if (tokenMappingStr) {
const envTokenMapping = JSON.parse(tokenMappingStr)
formatTokenMapping(envTokenMapping)
tokenMapping.tokens = envTokenMapping.tokens
return
}

if (!tokenMappingUrl) {
throw new Error('No token mapping URL provided')
}

const res = await fetch(tokenMappingUrl)
const data = await res.json()
formatTokenMapping(data)

tokenMapping.tokens = data.tokens
}

Expand All @@ -59,12 +66,6 @@ function formatTokenMapping(data: any) {
}
}

if (tokenMappingStr) {
const envTokenMapping = JSON.parse(tokenMappingStr!)
formatTokenMapping(envTokenMapping)
tokenMapping.tokens = envTokenMapping.tokens
}

////////////////////////////////////////////////////////////////////////////////
// Token Class
////////////////////////////////////////////////////////////////////////////////
Expand Down
2 changes: 2 additions & 0 deletions packages/node/src/exports/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ export {
type GeneratedSecrets,
} from '../actions/generateWalletSecrets.js'

export { createOrderWebSocket } from '../services/orderWebSocket.js'

////////////////////////////////////////////////////////////////////////////////
// @renegade-fi/core
////////////////////////////////////////////////////////////////////////////////
Expand Down
81 changes: 81 additions & 0 deletions packages/node/src/services/orderWebSocket.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import {
AuthType,
type OrderMetadata,
RelayerWebsocket,
type RenegadeConfig,
WS_WALLET_ORDERS_ROUTE,
getWalletId,
} from '@renegade-fi/core'

interface OrderWebSocketOptions {
config: RenegadeConfig
onUpdate: (order: OrderMetadata) => void
}

export function createOrderWebSocket(options: OrderWebSocketOptions) {
return new OrderWebSocketImpl(options)
}

class OrderWebSocketImpl {
private config: RenegadeConfig
private ws: RelayerWebsocket | null = null
private callback: (order: OrderMetadata) => void
private walletId: string

constructor(options: OrderWebSocketOptions) {
this.config = options.config
this.callback = options.onUpdate
this.walletId = getWalletId(this.config)
}

connect() {
if (this.ws) return

this.ws = new RelayerWebsocket({
config: this.config,
topic: WS_WALLET_ORDERS_ROUTE(this.walletId),
authType: AuthType.Wallet,
onmessage: (event) => this.handleMessage(event),
oncloseCallback: () => this.handleClose(),
onerrorCallback: () => this.handleError(),
})

this.ws.connect()
}

disconnect() {
this.ws?.close()
this.ws = null
}

private handleMessage(event: MessageEvent) {
try {
const message = JSON.parse(event.data, (key, value) => {
if (typeof value === 'number' && key !== 'price') {
return BigInt(value)
}
return value
})

if (
message.topic === WS_WALLET_ORDERS_ROUTE(this.walletId) &&
message.event?.type === 'OrderMetadataUpdated' &&
message.event?.order
) {
this.callback(message.event.order)
}
} catch (error) {
console.error('Error processing WebSocket message:', error)
}
}

private handleClose() {
console.log('WebSocket connection closed')
this.ws = null
}

private handleError() {
console.error('WebSocket connection error')
this.ws = null
}
}

0 comments on commit 5cf74ac

Please sign in to comment.