UNPKG

kucoin-universal-sdk

Version:
382 lines 15.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mockWebSocketHandlerTimeout = mockWebSocketHandlerTimeout; exports.mockWebSocketHandlerClose = mockWebSocketHandlerClose; exports.mockWebSocketHandlerReconnect = mockWebSocketHandlerReconnect; exports.mockWebSocketHandlerEcho = mockWebSocketHandlerEcho; exports.mockWebSocketHandlerPingPong = mockWebSocketHandlerPingPong; exports.mockWebSocketHandler2 = mockWebSocketHandler2; exports.mockWebSocketHandlerReadBufferFull = mockWebSocketHandlerReadBufferFull; const ws_1 = require("ws"); const http_1 = require("http"); const model_1 = require("../../model"); const crypto_1 = require("crypto"); const default_ws_client_1 = require("../infra/default_ws_client"); const DEFAULT_TOKEN_INFO = { token: '', pingInterval: 1000, endpoint: '', protocol: '', encrypt: true, pingTimeout: 1000, }; function createMessage(id, type) { let m = new model_1.WsMessage(); m.id = id; m.type = type; return m; } function createWebSocketServer(handler) { const server = (0, http_1.createServer)(); const wss = new ws_1.WebSocketServer({ server }); wss.on('connection', handler); server.listen(0); return server; } function mockWebSocketHandler1(ws) { console.log('[server] New connection'); ws.send(JSON.stringify(createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.WelcomeMessage))); ws.on('message', (message) => { const m = JSON.parse(message.toString()); switch (m.type) { case model_1.MessageType.PingMessage: ws.send(JSON.stringify(createMessage(m.id, model_1.MessageType.PongMessage))); break; case model_1.MessageType.SubscribeMessage: console.log('[server] Received subscribe message'); ws.send(JSON.stringify(createMessage(m.id, model_1.MessageType.AckMessage))); setTimeout(() => { for (let i = 0; i < 10; i++) { ws.send(JSON.stringify(createMessage(i.toString(), model_1.MessageType.Message))); } }, 10); break; } }); ws.on('close', () => { console.log('[server] Connection closed'); }); } function mockWebSocketHandlerTimeout(ws) { ws.on('message', (message) => { }); ws.on('close', () => { }); } function mockWebSocketHandlerClose(ws) { ws.send(JSON.stringify(createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.WelcomeMessage))); setTimeout(() => { console.log('[server] New connection close it'); ws.close(); }, 1000); } let x = 0; function mockWebSocketHandlerReconnect(ws) { ws.send(JSON.stringify(createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.WelcomeMessage))); if (x == 0) { setTimeout(() => { console.log('[server] New connection close it'); ws.close(); }, 1000); } x += 1; } function mockWebSocketHandlerEcho(ws) { ws.send(JSON.stringify(createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.WelcomeMessage))); ws.on('upgrade', (data) => { console.log(data); }); ws.on('open', (socket) => { ws.send(JSON.stringify(createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.WelcomeMessage))); }); ws.on('message', (message) => { ws.send(message.toString()); }); ws.on('close', () => { console.log('[server] Connection closed'); }); } function mockWebSocketHandlerPingPong(ws) { ws.send(JSON.stringify(createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.WelcomeMessage))); ws.on('message', (message) => { let x = model_1.WsMessage.fromJson(message.toString()); ws.send(JSON.stringify(createMessage(x.id, model_1.MessageType.PongMessage))); }); } function mockWebSocketHandler2(ws) { console.log('[server2] New connection'); ws.send(JSON.stringify(createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.WelcomeMessage))); ws.on('message', (message) => { const m = JSON.parse(message.toString()); switch (m.type) { case model_1.MessageType.PingMessage: ws.send(JSON.stringify(createMessage(m.id, model_1.MessageType.PongMessage))); break; case model_1.MessageType.SubscribeMessage: console.log('[server2] Received subscribe message'); ws.send(JSON.stringify(createMessage(m.id, model_1.MessageType.AckMessage))); break; } }); ws.on('close', () => { console.log('[server2] Connection closed'); }); } function mockWebSocketHandlerReadBufferFull(ws) { ws.send(JSON.stringify(createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.WelcomeMessage))); ws.on('message', (message) => { const m = JSON.parse(message.toString()); switch (m.type) { case model_1.MessageType.PingMessage: ws.send(JSON.stringify(createMessage(m.id, model_1.MessageType.PongMessage))); break; case model_1.MessageType.SubscribeMessage: console.log('[server2] Received subscribe message'); ws.send(JSON.stringify(createMessage(m.id, model_1.MessageType.AckMessage))); ws.send(JSON.stringify(createMessage(m.id, model_1.MessageType.Message))); ws.send(JSON.stringify(createMessage(m.id, model_1.MessageType.Message))); break; } }); ws.on('close', () => { console.log('[server2] Connection closed'); }); } class mockProvider { constructor(wsToken) { this.wsToken = wsToken; } getToken() { return Promise.resolve([this.wsToken]); } close() { return Promise.resolve(undefined); } } function testByMockServer(handler) { let server = createWebSocketServer(handler); return new Promise((resolve, reject) => { server.on('listening', () => { let port = 0; const address = server.address(); if (typeof address === 'object' && address) { port = address.port; } resolve(port); }); server.on('error', (err) => { reject(err); }); }); } describe('WS Transport Test', () => { test('test client connect error', () => { return testByMockServer(mockWebSocketHandler2) .then(() => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); return client.start(); }) .catch((err) => { expect(err).toBeDefined(); }); }); test('test client connect', () => { return testByMockServer(mockWebSocketHandlerEcho).then((port) => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; let token = DEFAULT_TOKEN_INFO; token.endpoint = `http://127.0.0.1:${port}`; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), option); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); return client.start().then(() => { return new Promise((resolve, reject) => { setTimeout(resolve, 1000); }); }); }); }); test('test client ping/pong', () => { return testByMockServer(mockWebSocketHandlerPingPong).then((port) => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; let token = DEFAULT_TOKEN_INFO; token.endpoint = `http://127.0.0.1:${port}`; token.pingInterval = 100; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), option); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); return client.start().then(() => { return new Promise((resolve, reject) => { setTimeout(resolve, 4000); }); }); }); }); test('test client connect/disconnect', () => { return testByMockServer(mockWebSocketHandlerEcho).then((port) => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; let token = DEFAULT_TOKEN_INFO; token.endpoint = `http://127.0.0.1:${port}`; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), option); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); return client.start().then(() => { return client.stop(); }); }); }); test('test client timeout', () => { return testByMockServer(mockWebSocketHandlerTimeout).then((port) => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; let token = DEFAULT_TOKEN_INFO; token.endpoint = `http://127.0.0.1:${port}`; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), option); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); return client .start() .then(() => { return client.stop(); }) .catch((err) => { expect(err).toBeDefined(); }); }); }); test('test remote close', () => { return testByMockServer(mockWebSocketHandlerClose).then((port) => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; option.reconnect = false; let token = DEFAULT_TOKEN_INFO; token.endpoint = `http://127.0.0.1:${port}`; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), option); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); return client.start().then(() => { return new Promise((resolve, reject) => { setTimeout(resolve, 4000); }); }); }); }); test('test reconnect', () => { return testByMockServer(mockWebSocketHandlerReconnect).then((port) => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; option.reconnect = true; option.reconnectAttempts = 3; option.reconnectInterval = 1000; let token = DEFAULT_TOKEN_INFO; token.endpoint = `http://127.0.0.1:${port}`; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), option); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); return client.start().then(() => { return new Promise((resolve, reject) => { setTimeout(resolve, 4000); }).then(() => { return client.stop(); }); }); }); }); test('test read write', () => { return testByMockServer(mockWebSocketHandler2).then((port) => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; option.reconnect = true; option.reconnectAttempts = 3; option.reconnectInterval = 1000; let token = DEFAULT_TOKEN_INFO; token.endpoint = `http://127.0.0.1:${port}`; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), option); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); return client .start() .then(() => { let x = createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.SubscribeMessage); return client.write(x, 1000); }) .then(() => { return client.stop(); }); }); }); test('test write timeout', () => { return testByMockServer(mockWebSocketHandler2).then((port) => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; option.reconnect = true; option.reconnectAttempts = 3; option.reconnectInterval = 1000; let token = DEFAULT_TOKEN_INFO; token.endpoint = `http://127.0.0.1:${port}`; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), option); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); return client .start() .then(() => { let x = createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.SubscribeMessage); return client.write(x, 0); }) .then(() => { return client.stop(); }) .catch((err) => { expect(err).toBeDefined(); }); }); }); test('test read buffer full', () => { return testByMockServer(mockWebSocketHandlerReadBufferFull).then((port) => { let option = model_1.DEFAULT_WEBSOCKET_CLIENT_OPTION; option.dialTimeout = 1000; option.reconnect = true; option.reconnectAttempts = 3; option.reconnectInterval = 1000; option.readMessageBuffer = 1; let token = DEFAULT_TOKEN_INFO; token.endpoint = `http://127.0.0.1:${port}`; let client = new default_ws_client_1.WebSocketClient(new mockProvider(DEFAULT_TOKEN_INFO), option); client.on('event', function (event, mes) { console.log('[client] Received event', event, mes); }); let count = 0; client.on('message', async function (message) { await new Promise((resolve, reject) => { setTimeout(resolve, 1000); }); console.log('[client] Received message', message, count++, new Date().toString()); }); return client .start() .then(() => { let x = createMessage((0, crypto_1.randomUUID)(), model_1.MessageType.SubscribeMessage); return client.write(x, 1000); }) .then(() => { return new Promise((resolve, reject) => { setTimeout(resolve, 4000); }); }); }); }); }); //# sourceMappingURL=default_ws_client.test.js.map