kucoin-universal-sdk
Version:
Official KuCoin Universal SDK.
382 lines • 15.7 kB
JavaScript
;
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