Skip to content

Commit

Permalink
Add optional handlers for websocket error/close events
Browse files Browse the repository at this point in the history
  • Loading branch information
akuzni2 committed Jan 31, 2025
1 parent 7608494 commit ae54d44
Showing 1 changed file with 91 additions and 84 deletions.
175 changes: 91 additions & 84 deletions test/transports/websocket.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import { Server } from 'mock-socket'
import { Adapter, AdapterEndpoint } from '../../src/adapter'
import { AdapterConfig, EmptyCustomSettings } from '../../src/config'
import { metrics as eaMetrics } from '../../src/metrics'
import { WebSocketClassProvider, WebsocketReverseMappingTransport, WebSocketTransport } from '../../src/transports'
import {
WebSocketClassProvider,
WebsocketReverseMappingTransport,
WebSocketTransport,
} from '../../src/transports'
import { SingleNumberResultResponse, sleep } from '../../src/util'
import { mockWebSocketProvider, runAllUntilTime, TestAdapter } from '../../src/util/testing-utils'
import { InputParameters } from '../../src/validation'
Expand Down Expand Up @@ -884,106 +888,109 @@ test.serial('if defined the close handler is called when the websocket is closed
t.true(handlerCalled)
})

test.serial('if defined the error handler is called when the websocket emits an error', async (t) => {
const base = 'ETH'
const quote = 'DOGE'
process.env['METRICS_ENABLED'] = 'false'
let handlerCalled = false
test.serial(
'if defined the error handler is called when the websocket emits an error',
async (t) => {
const base = 'ETH'
const quote = 'DOGE'
process.env['METRICS_ENABLED'] = 'false'
let handlerCalled = false

// Mock WS
mockWebSocketProvider(WebSocketClassProvider)
const mockWsServer = new Server(ENDPOINT_URL, { mock: false })
mockWsServer.on('connection', (socket) => {
socket.on('message', () => {
socket.send(
JSON.stringify({
pair: `${base}/${quote}`,
value: price,
}),
)
// Mock WS
mockWebSocketProvider(WebSocketClassProvider)
const mockWsServer = new Server(ENDPOINT_URL, { mock: false })
mockWsServer.on('connection', (socket) => {
socket.on('message', () => {
socket.send(
JSON.stringify({
pair: `${base}/${quote}`,
value: price,
}),
)
})
// Simulate error event after connection
setTimeout(() => {
const errorEvent = new Event('error')
socket.dispatchEvent(errorEvent)
}, 100)
})
// Simulate error event after connection
setTimeout(() => {
const errorEvent = new Event('error')
socket.dispatchEvent(errorEvent)
}, 100)
})

const transport = new WebSocketTransport<WebSocketTypes>({
url: () => ENDPOINT_URL,
handlers: {
error: async (event) => {
handlerCalled = true
},
message(message) {
const [curBase, curQuote] = message.pair.split('/')
return [
{
params: { base: curBase, quote: curQuote },
response: {
data: {
const transport = new WebSocketTransport<WebSocketTypes>({
url: () => ENDPOINT_URL,
handlers: {
error: async (event) => {

Check warning on line 921 in test/transports/websocket.test.ts

View workflow job for this annotation

GitHub Actions / lint

'event' is defined but never used. Allowed unused args must match /^_/u
handlerCalled = true
},
message(message) {
const [curBase, curQuote] = message.pair.split('/')
return [
{
params: { base: curBase, quote: curQuote },
response: {
data: {
result: message.value,
},
result: message.value,
},
result: message.value,
},
},
]
]
},
},
},
builders: {
subscribeMessage: (params) => ({
request: 'subscribe',
pair: `${params.base}/${params.quote}`,
}),
unsubscribeMessage: (params) => ({
request: 'unsubscribe',
pair: `${params.base}/${params.quote}`,
}),
},
})
builders: {
subscribeMessage: (params) => ({
request: 'subscribe',
pair: `${params.base}/${params.quote}`,
}),
unsubscribeMessage: (params) => ({
request: 'unsubscribe',
pair: `${params.base}/${params.quote}`,
}),
},
})

const webSocketEndpoint = new AdapterEndpoint({
name: 'TEST',
transport: transport,
inputParameters,
})
const webSocketEndpoint = new AdapterEndpoint({
name: 'TEST',
transport: transport,
inputParameters,
})

const config = new AdapterConfig(
{},
{
envDefaultOverrides: {
BACKGROUND_EXECUTE_MS_WS,
WS_SUBSCRIPTION_UNRESPONSIVE_TTL: 180_000,
const config = new AdapterConfig(
{},
{
envDefaultOverrides: {
BACKGROUND_EXECUTE_MS_WS,
WS_SUBSCRIPTION_UNRESPONSIVE_TTL: 180_000,
},
},
},
)
)

const adapter = new Adapter({
name: 'TEST',
defaultEndpoint: 'test',
config,
endpoints: [webSocketEndpoint],
})
const adapter = new Adapter({
name: 'TEST',
defaultEndpoint: 'test',
config,
endpoints: [webSocketEndpoint],
})

const testAdapter = await TestAdapter.startWithMockedCache(adapter, t.context)
const testAdapter = await TestAdapter.startWithMockedCache(adapter, t.context)

await testAdapter.startBackgroundExecuteThenGetResponse(t, {
requestData: { base, quote },
expectedResponse: {
data: {
await testAdapter.startBackgroundExecuteThenGetResponse(t, {
requestData: { base, quote },
expectedResponse: {
data: {
result: price,
},
result: price,
statusCode: 200,
},
result: price,
statusCode: 200,
},
})
})

await testAdapter.api.close()
mockWsServer.close()
await t.context.clock.runAllAsync()
await testAdapter.api.close()
mockWsServer.close()
await t.context.clock.runAllAsync()

t.true(handlerCalled)
})
t.true(handlerCalled)
},
)

const createReverseMappingAdapter = (
envDefaultOverrides?: Record<string, string | number | symbol>,
Expand Down

0 comments on commit ae54d44

Please sign in to comment.