'use strict' var EventManager = require('../lib/events') var modalDialog = require('../app/ui/modaldialog') var yo = require('yo-yo') class Remixd { constructor (port) { this.event = new EventManager() this.port = port this.callbacks = {} this.callid = 0 this.socket = null this.connected = false } online () { return this.socket !== null } close () { if (this.socket) { this.socket.close() this.socket = null } } start (cb) { if (this.socket) { try { this.socket.close() } catch (e) {} } this.event.trigger('connecting', []) this.socket = new WebSocket('ws://localhost:' + this.port, 'echo-protocol') // eslint-disable-line this.socket.addEventListener('open', (event) => { this.connected = true this.event.trigger('connected', [event]) cb() }) this.socket.addEventListener('message', (event) => { var data = JSON.parse(event.data) if (data.type === 'reply') { if (this.callbacks[data.id]) { this.callbacks[data.id](data.error, data.result) delete this.callbacks[data.id] } this.event.trigger('replied', [data]) } else if (data.type === 'notification') { this.event.trigger('notified', [data]) } else if (data.type === 'system') { if (data.error) { this.event.trigger('system', [{ error: data.error }]) } } }) this.socket.addEventListener('error', (event) => { this.errored(event) cb(event) }) this.socket.addEventListener('close', (event) => { if (event.wasClean) { this.connected = false this.event.trigger('closed', [event]) } else { this.errored(event) } this.socket = null }) } errored (event) { function remixdDialog () { return yo`