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
No related branches found
No related tags found
No related merge requests found
...@@ -34,29 +34,35 @@ class CloudProvider { ...@@ -34,29 +34,35 @@ class CloudProvider {
this.connection = new WebSocket((location.protocol === 'http:' ? 'ws://' : 'wss://') + cloudHost); this.connection = new WebSocket((location.protocol === 'http:' ? 'ws://' : 'wss://') + cloudHost);
this.connection.onerror = e => { this.connection.onerror = this.onError.bind(this);
log.error(`Websocket connection error: ${JSON.stringify(e)}`); this.connection.onmessage = this.onMessage.bind(this);
this.connection.onopen = this.onOpen.bind(this);
// TODO Add re-connection attempt logic here this.connection.onclose = this.onClose.bind(this);
this.clear(); }
};
onError (event) {
this.connection.onmessage = event => { log.error(`Websocket connection error: ${JSON.stringify(event)}`);
const messageString = event.data; // TODO Add re-connection attempt logic here
log.info(`Received websocket message: ${messageString}`); this.clear();
const message = JSON.parse(messageString); }
const parsedData = this.parseMessage(message);
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.vm.postIOData('cloud', parsedData);
}; });
}
this.connection.onopen = () => { onOpen () {
this.writeToServer('handshake'); this.writeToServer('handshake');
log.info(`Successfully connected to clouddata server.`); log.info(`Successfully connected to clouddata server.`);
}; }
this.connection.onclose = () => { onClose () {
log.info(`Closed connection to websocket`); log.info(`Closed connection to websocket`);
};
} }
parseMessage (message) { parseMessage (message) {
......
...@@ -6,8 +6,10 @@ global.WebSocket = null; ...@@ -6,8 +6,10 @@ global.WebSocket = null;
describe('CloudProvider', () => { describe('CloudProvider', () => {
let cloudProvider = null; let cloudProvider = null;
let sentMessage = null; let sentMessage = null;
let vmIOData = [];
beforeEach(() => { beforeEach(() => {
vmIOData = [];
cloudProvider = new CloudProvider(); cloudProvider = new CloudProvider();
// Stub connection // Stub connection
cloudProvider.connection = { cloudProvider.connection = {
...@@ -15,6 +17,12 @@ describe('CloudProvider', () => { ...@@ -15,6 +17,12 @@ describe('CloudProvider', () => {
sentMessage = msg; sentMessage = msg;
} }
}; };
// Stub vm
cloudProvider.vm = {
postIOData: (_namespace, data) => {
vmIOData.push(data);
}
};
}); });
test('updateVariable', () => { test('updateVariable', () => {
...@@ -41,4 +49,39 @@ describe('CloudProvider', () => { ...@@ -41,4 +49,39 @@ describe('CloudProvider', () => {
expect(obj.value).toEqual(5); expect(obj.value).toEqual(5);
expect(obj.index).toEqual(0); 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.
Finish editing this message first!
Please register or to comment