procrealms-client
Version:
A web/terminal hybrid client for Procedural Realms
82 lines (68 loc) • 1.86 kB
JavaScript
const Handlers = require('./handlers')
const Log = require('./log')
const U = require('./utils')
let ws
exports.url = 'ws://proceduralrealms.com:8000'
if (process && process.env.NODE_ENV == 'dev') {
exports.url = 'ws://localhost:8001'
}
exports.timeout = 5
exports.attempt = 0
let pendingRequests = {}
exports.init = (onConnect, onClose, onError) => {
let WebSocket
onConnect = onConnect || function () {}
exports.attempt++
if (U.inBrowser()) {
WebSocket = window.WebSocket
ws = new WebSocket(exports.url)
ws.onopen = onConnect
ws.onclose = onClose
ws.onmessage = function (ev) {
onMessage(ev.data)
}
ws.onerror = onError
} else {
WebSocket = require('ws').WebSocket
ws = new WebSocket(exports.url)
ws.off('open', onConnect).on('open', onConnect)
ws.off('message', onMessage).on('message', onMessage)
ws.off('close', onClose).on('close', onClose)
ws.off('error', onError).on('error', onError)
}
return onConnect
}
exports.send = (cmd, msg) => {
Log.write(`-> ${cmd} ${msg ? JSON.stringify(msg) : ''}`)
let out = JSON.stringify({ cmd, msg })
ws.send(out)
}
function onMessage (json) {
try {
let { cmd, msg } = JSON.parse(json)
Handlers.onEvent(cmd, msg)
} catch (err) {
console.log('error parsing message: %s', json)
console.log(err.stack)
}
}
exports.fetchEntity = (eid) => {
let requestId = `entity-${eid}`
if (pendingRequests[requestId]) {
return
}
pendingRequests[requestId] = true
exports.send('entity', { eid })
}
exports.fetchItem = (iid) => {
let requestId = `item-${iid}`
if (pendingRequests[requestId]) {
return
}
pendingRequests[requestId] = true
exports.send('item', { iid })
}
exports.requestComplete = function (requestId) {
Log.write(`completed request ${requestId}`)
delete pendingRequests[requestId]
}