Skip to content
Snippets Groups Projects
Commit f98831e3 authored by Paul Kaplan's avatar Paul Kaplan
Browse files

Support multiple commands from cloud data server

parent 15098c7a
Branches
Tags
No related merge requests found
......@@ -34,29 +34,35 @@ class CloudProvider {
this.connection = new WebSocket((location.protocol === 'http:' ? 'ws://' : 'wss://') + cloudHost);
this.connection.onerror = e => {
log.error(`Websocket connection error: ${JSON.stringify(e)}`);
// TODO Add re-connection attempt logic here
this.clear();
};
this.connection.onmessage = event => {
const messageString = event.data;
log.info(`Received websocket message: ${messageString}`);
const message = JSON.parse(messageString);
const parsedData = this.parseMessage(message);
this.connection.onerror = this.onError.bind(this);
this.connection.onmessage = this.onMessage.bind(this);
this.connection.onopen = this.onOpen.bind(this);
this.connection.onclose = this.onClose.bind(this);
}
onError (event) {
log.error(`Websocket connection error: ${JSON.stringify(event)}`);
// TODO Add re-connection attempt logic here
this.clear();
}
onMessage (event) {
const messageString = event.data;
log.info(`Received websocket message: ${messageString}`);
// Multiple commands can be received, newline separated
messageString.split('\n').forEach(message => {
const parsedData = this.parseMessage(JSON.parse(message));
this.vm.postIOData('cloud', parsedData);
};
});
}
this.connection.onopen = () => {
this.writeToServer('handshake');
log.info(`Successfully connected to clouddata server.`);
};
onOpen () {
this.writeToServer('handshake');
log.info(`Successfully connected to clouddata server.`);
}
this.connection.onclose = () => {
log.info(`Closed connection to websocket`);
};
onClose () {
log.info(`Closed connection to websocket`);
}
parseMessage (message) {
......
......@@ -6,8 +6,10 @@ global.WebSocket = null;
describe('CloudProvider', () => {
let cloudProvider = null;
let sentMessage = null;
let vmIOData = [];
beforeEach(() => {
vmIOData = [];
cloudProvider = new CloudProvider();
// Stub connection
cloudProvider.connection = {
......@@ -15,6 +17,12 @@ describe('CloudProvider', () => {
sentMessage = msg;
}
};
// Stub vm
cloudProvider.vm = {
postIOData: (_namespace, data) => {
vmIOData.push(data);
}
};
});
test('updateVariable', () => {
......@@ -41,4 +49,39 @@ describe('CloudProvider', () => {
expect(obj.value).toEqual(5);
expect(obj.index).toEqual(0);
});
test('onMessage ack', () => {
const msg = JSON.stringify({
method: 'ack',
name: 'name'
});
cloudProvider.onMessage({data: msg});
expect(vmIOData[0].varCreate.name).toEqual('name');
});
test('onMessage set', () => {
const msg = JSON.stringify({
method: 'set',
name: 'name',
value: 'value'
});
cloudProvider.onMessage({data: msg});
expect(vmIOData[0].varUpdate.name).toEqual('name');
expect(vmIOData[0].varUpdate.value).toEqual('value');
});
test('onMessage with multiple commands', () => {
const msg1 = JSON.stringify({
method: 'set',
name: 'name1',
value: 'value'
});
const msg2 = JSON.stringify({
method: 'ack',
name: 'name2'
});
cloudProvider.onMessage({data: `${msg1}\n${msg2}`});
expect(vmIOData[0].varUpdate.name).toEqual('name1');
expect(vmIOData[1].varCreate.name).toEqual('name2');
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment