Skip to content
This repository was archived by the owner on Oct 19, 2022. It is now read-only.

Commit 4c500e0

Browse files
committed
Removed Socket.IO in favor of plain SSE
1 parent ac5f1ca commit 4c500e0

File tree

5 files changed

+127
-312
lines changed

5 files changed

+127
-312
lines changed

__tests__/devalpha.spec.ts

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as _ from 'highland'
2-
import * as io from 'socket.io-client'
2+
import * as EventSource from 'eventsource'
33
import {
44
devalpha,
55
createTrader,
@@ -412,18 +412,13 @@ test('dashboard works as expected', (done) => {
412412
serverEvents.push('a')
413413
}).resume()
414414

415-
const socket = io(`http://localhost:${SOCKET_PORT}`, {
416-
autoConnect: false
417-
})
418-
419-
expect(serverEvents.length).toBe(0)
420-
expect(clientEvents.length).toBe(0)
421-
422-
socket.on(DASHBOARD_EVENTS, ({ events }) => {
415+
const client = new EventSource(`http://127.0.0.1:${SOCKET_PORT}/backtest`)
416+
client.addEventListener(DASHBOARD_EVENTS, ({ data }) => {
417+
const events = JSON.parse(data).events
423418
clientEvents = [...clientEvents, ...events]
424419
})
425-
426-
socket.on(DASHBOARD_FINISHED, ({ startedAt, finishedAt }) => {
420+
client.addEventListener(DASHBOARD_FINISHED, ({ data }) => {
421+
const { startedAt, finishedAt } = JSON.parse(data)
427422
runTime = finishedAt - startedAt
428423

429424
expect(serverEvents.length).toBe(4)
@@ -433,13 +428,8 @@ test('dashboard works as expected', (done) => {
433428
done()
434429
})
435430

436-
socket.on('connect', () => {
437-
setTimeout(() => {
438-
socket.emit(DASHBOARD_INITIALIZE)
439-
}, 100)
440-
})
441-
442-
socket.open()
431+
expect(serverEvents.length).toBe(0)
432+
expect(clientEvents.length).toBe(0)
443433
})
444434

445435
test('calling devalpha logs to console', (done) => {

lib/constants.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,7 @@ export const ORDER_CANCEL = '@@devalpha/ORDER_CANCEL'
99
export const INITIALIZED = '@@devalpha/INITIALIZED'
1010
export const FINISHED = '@@devalpha/FINISHED'
1111

12-
export const DASHBOARD_INITIALIZE = '@@devalpha/DASHBOARD_INITIALIZE'
1312
export const DASHBOARD_EVENTS = '@@devalpha/DASHBOARD_EVENTS'
1413
export const DASHBOARD_FINISHED = '@@devalpha/DASHBOARD_FINISHED'
1514

16-
export const SOCKETIO_RECONNECT_FAILED = 'reconnect_failed'
17-
export const SOCKETIO_CONNECT = 'connect'
18-
export const SOCKETIO_CONNECTION = 'connection'
19-
export const SOCKETIO_RECONNECT = 'reconnect'
20-
export const SOCKETIO_DISCONNECT = 'disconnect'
21-
2215
export const SOCKET_PORT = '4449'

lib/index.ts

Lines changed: 58 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as _ from 'highland'
2-
import * as http from 'http'
3-
import * as socket from 'socket.io'
2+
import { createServer } from 'http'
3+
import { parse } from 'url'
44

55
import { createStreamMerged, createStreamSorted } from './util/streams'
66
import { createConsumerCreator } from './util/consumers'
@@ -24,8 +24,6 @@ import {
2424
import {
2525
INITIALIZED,
2626
FINISHED,
27-
SOCKETIO_CONNECTION,
28-
DASHBOARD_INITIALIZE,
2927
DASHBOARD_EVENTS,
3028
DASHBOARD_FINISHED,
3129
SOCKET_PORT
@@ -193,40 +191,75 @@ export function createTrader(settings: any, strategy: Strategy) {
193191
}))
194192

195193
if (config.dashboard.active) {
196-
const app = http.createServer()
197-
const io = socket(app, {
198-
pingTimeout: 1000,
199-
pingInterval: 400,
200-
origins: /* istanbul ignore next: must be manually tested for now */
201-
process.env.NODE_ENV === 'test' ? '*:*' : 'beta.devalpha.io:*'
202-
})
203-
204-
app.listen(config.dashboard.port)
205194

206195
const socketStream = output.fork()
207196
output = output.fork()
208197

209-
io.on(SOCKETIO_CONNECTION, (client) => {
210-
client.on(DASHBOARD_INITIALIZE, () => {
198+
let id = 0;
199+
const createMessage = (message: any) => {
200+
let response = ''
201+
response += `id: ${id++}\n`
202+
response += `event: ${message.type}\n`
203+
response += `data: ${JSON.stringify(message.payload)}\n`
204+
response += `\n`
205+
return response
206+
}
207+
208+
const app = createServer((req, res) => {
209+
const headers: any = {
210+
'Access-Control-Allow-Origin': '*',
211+
'Access-Control-Allow-Methods': 'OPTIONS, GET',
212+
'Access-Control-Max-Age': 60 * 60 * 24 * 30,
213+
'Cache-Control': 'no-cache',
214+
'Connection': 'close'
215+
}
216+
217+
if (req.method === 'OPTIONS') {
218+
res.writeHead(204, headers)
219+
return res.end()
220+
}
221+
222+
const url = parse(req.url as string)
223+
if (url.pathname === '/') {
224+
headers['Content-Type'] = 'application/json'
225+
res.writeHead(200, headers)
226+
res.write(JSON.stringify({
227+
message: 'ok'
228+
}))
229+
res.end()
230+
} else if (url.pathname === '/backtest') {
231+
headers['Content-Type'] = 'text/event-stream',
232+
headers['Connection'] = 'keep-alive',
233+
res.writeHead(200, headers)
211234
startedAt = Date.now()
212235
socketStream
213236
.batchWithTimeOrCount(500, 1000)
214237
.each((events) => {
215-
io.emit(DASHBOARD_EVENTS, { events })
238+
res.write(createMessage({
239+
type: DASHBOARD_EVENTS,
240+
payload: { events }
241+
}))
216242
})
217243
.done(() => {
218244
finishedAt = Date.now()
219-
220-
io.emit(DASHBOARD_FINISHED, {
221-
startedAt,
222-
finishedAt
223-
})
224-
225-
client.disconnect(true)
226-
io.close()
245+
res.write(createMessage({
246+
type: DASHBOARD_FINISHED,
247+
payload: {
248+
startedAt,
249+
finishedAt
250+
}
251+
}))
252+
res.end()
253+
app.close()
227254
})
228-
})
255+
} else {
256+
res.writeHead(404, headers)
257+
res.end()
258+
}
229259
})
260+
261+
app.listen(config.dashboard.port)
262+
230263
}
231264

232265
return output

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy