Skip to content

Commit

Permalink
node: Add order websocket (#161)
Browse files Browse the repository at this point in the history
* node: Add order websocket

* chore: version packages
  • Loading branch information
sehyunc authored Jan 31, 2025
1 parent 7ea0360 commit b16b395
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 1 deletion.
6 changes: 6 additions & 0 deletions packages/node/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @renegade-fi/node

## 0.5.1

### Patch Changes

- node: Add order websocket

## 0.5.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/node/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@renegade-fi/node",
"description": "Node.js library for Renegade",
"version": "0.5.0",
"version": "0.5.1",
"repository": {
"type": "git",
"url": "https://github.com/renegade-fi/typescript-sdk.git",
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 b16b395

Please sign in to comment.