Skip to content

Instantly share code, notes, and snippets.

@mappum
Created December 16, 2016 21:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mappum/f790b3b648464b0aa2452db499a28cd3 to your computer and use it in GitHub Desktop.
Save mappum/f790b3b648464b0aa2452db499a28cd3 to your computer and use it in GitHub Desktop.
'use strict'
var EventEmitter = require('events')
var electronEval = require('electron-eval')
var watt = require('watt')
class Daemon extends EventEmitter {
constructor (opts) {
super()
this.daemon = electronEval(opts)
watt.wrapAll(this, 'navigate', 'eval')
var openDevTools = opts.showDevTools ? 'wv.openDevTools()' : ''
this.daemon.eval(`
var wv = window.webview = document.createElement('webview')
wv.setAttribute('preload', '${require.resolve('./daemonPreload.js')}')
wv.setAttribute('style', 'position: absolute; top: 0; right: 0; bottom: 0; left: 0;')
wv.setAttribute('disablewebsecurity', '1')
${opts.userAgent ? `wv.setAttribute('useragent', '${opts.userAgent}')` : ''}
document.body.appendChild(wv)
wv.addEventListener('dom-ready', function () {
${openDevTools}
})
wv.addEventListener('did-finish-load', function () {
window.send('did-finish-load')
})
window.webview.addEventListener('ipc-message', function (e) {
window.send(e.channel, e.args[0])
})
`, this.error.bind(this))
}
error (err) {
if (err) this.emit('error', err)
}
* navigate (url, next) {
this.daemon.eval(`window.webview.setAttribute('src', '${url}')`)
yield this.daemon.once('did-finish-load', next)
}
* eval (code, next) {
var reqId = Math.random().toString(36)
this.daemon.eval(`
window.webview.send('eval', ${JSON.stringify(code)}, ${JSON.stringify(reqId)})
`)
var timeout = setTimeout(() => {
this.eval(code, next)
}, 5000)
var res = yield this.daemon.once(reqId, next.arg(0))
clearTimeout(timeout)
if (res[0]) throw res[0]
return res[1]
}
}
module.exports = Daemon
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment