Last active
June 2, 2018 00:08
-
-
Save jasongrout/8adb039d83197641e665b55e6a65d490 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const WebSocket = require('ws'); | |
const patchDB = new Map(); | |
numStores = 0; | |
const wss = new WebSocket.Server({ port: 8081 }); | |
function storeId(msg) { | |
return { | |
msgType: 'storeid-reply', | |
parentId: msg.msgId, | |
content: { | |
storeId: numStores++ | |
} | |
} | |
} | |
function patchBroadcast(msg, ws) { | |
// Broadcast the patch to everyone. | |
wss.clients.forEach(function each(client) { | |
if (client !== ws && client.readyState === WebSocket.OPEN) { | |
client.send(JSON.stringify(msg)); | |
} | |
}); | |
console.log('Broadcasted: ', JSON.stringify(msg)); | |
// Store the patch for later retreival | |
patchDB.set(msg.content.patch.patchId, msg.content.patch); | |
} | |
function patchHistory(msg) { | |
return { | |
msgType: 'patch-history-reply', | |
parentId: msg.msgId, | |
content: { | |
patchHistory: { | |
checkpoint: null, | |
patches: Array.from(patchDB.values()) | |
} | |
} | |
} | |
} | |
function patchRequest(msg) { | |
return { | |
msgType: 'fetch-patch-reply', | |
parentId: msg.msgId, | |
content: { | |
// Return the requested patches that exist. | |
patches: msg.content.patchIds.map(id => patchDB.get(id)).filter(patch => patch !== undefined) | |
} | |
} | |
} | |
wss.on('connection', function connection(ws) { | |
ws.on('message', function incoming(data) { | |
console.log('received: ', data); | |
let reply = null; | |
const msg = JSON.parse(data); | |
switch(msg.msgType) { | |
case 'storeid-request': | |
reply = storeId(msg); | |
break; | |
case 'patch-broadcast': | |
patchBroadcast(msg, ws); | |
break; | |
case 'patch-history-request': | |
reply = patchHistory(msg); | |
break; | |
case 'fetch-patch-request': | |
reply = patchRequest(msg); | |
break; | |
default: | |
console.error('unhandled message: ', JSON.stringify(msg)); | |
} | |
if (reply) { | |
console.log('Reply: ', JSON.stringify(reply)); | |
ws.send(JSON.stringify(reply)); | |
} | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment