diff --git a/packages/platform/src/rpc.ts b/packages/platform/src/rpc.ts index d278f92116..da39f36f11 100644 --- a/packages/platform/src/rpc.ts +++ b/packages/platform/src/rpc.ts @@ -29,7 +29,7 @@ export class Request

{ method: M params: P - constructor (method: M, ...params: P) { + constructor (method: M, params: P, id?: ReqId) { this.method = method this.params = params } diff --git a/server/server/src/__tests__/server.test.ts b/server/server/src/__tests__/server.test.ts index 0dd1cfcd00..e92e06b138 100644 --- a/server/server/src/__tests__/server.test.ts +++ b/server/server/src/__tests__/server.test.ts @@ -14,12 +14,15 @@ // limitations under the License. // +import { Request, readResponse, serialize } from '@anticrm/platform' import { start, _Token } from '../server' import { encode } from 'jwt-simple' import WebSocket from 'ws' describe('server', () => { - start(async () => ({}), 3333) + start(async () => ({ + ping: () => {} + }), 3333) function connect (): WebSocket { const payload: _Token = { @@ -36,4 +39,33 @@ describe('server', () => { done() }) }) + + it('should not connect to server without token', (done) => { + const conn = new WebSocket('ws://localhost:3333/xyz') + conn.on('error', () => { + console.log('error') + conn.close() + done() + }) + }) + + it('should send many requests', (done) => { + const conn = connect() + const total = 10 + // const start = Date.now() + conn.on('open', () => { + for (let i = 0; i < total; i++) { + conn.send(serialize(new Request('ping', [], i))) + } + }) + let received = 0 + conn.on('message', (msg: string) => { + readResponse(msg) + if (++received === total) { + // console.log('resp:', resp, ' Time: ', Date.now() - start) + conn.close() + done() + } + }) + }) }) diff --git a/server/server/src/server.ts b/server/server/src/server.ts index 86b555c31a..2dba9785d0 100644 --- a/server/server/src/server.ts +++ b/server/server/src/server.ts @@ -60,12 +60,12 @@ export function start (serviceFactory: () => Promise, port: number, host?: const server = createServer() server.on('upgrade', (request: IncomingMessage, socket, head: Buffer) => { const token = request.url?.substring(1) // remove leading '/' - if (token === undefined) { + try { + const payload = decode(token ?? '', 'secret', false) + wss.handleUpgrade(request, socket, head, ws => wss.emit('connection', ws, request, payload)) + } catch (err) { socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n') socket.destroy() - } else { - const payload = decode(token, 'secret', false) - wss.handleUpgrade(request, socket, head, ws => wss.emit('connection', ws, request, payload)) } })