const httpServer = require('http-server') const remixd = require('remixd') const path = require('path') const merge = require('merge') const colors = require('colors') const DEFAULT_OPTIONS = { protocol: 'http', host: 'localhost', port: '8088' } module.exports = (embark) => { // plugin options const readOnly = embark.pluginConfig.readOnly || false const { protocol, host, port } = merge.recursive(DEFAULT_OPTIONS, embark.pluginConfig.remixIde) // globals const remixIdeUrl = `${protocol}://${host}` + `${port ? `:${port}` : ''}` const sharedFolder = path.join(__dirname, '../../') const sharedFolderService = remixd.services.sharedFolder let server // setup HTTP server if (['localhost', '127.0.0.1', '0.0.0.0'].includes(host)) { server = httpServer.createServer({ root: path.join(__dirname, '../../node_modules/remix-ide') }) server.listen(port, '127.0.0.1', function () { embark.logger.info('Remix IDE (via embark-remix plugin) available at ' + colors.underline(remixIdeUrl)) }) } else { embark.logger.info('embark-remix is set to connect to a Remix IDE at ' + colors.underline(remixIdeUrl)) } // setup Embark service check embark.registerServiceCheck('Remix IDE', (cb) => { return cb({ name: `Remix IDE ${host}:${port}`, status: 'on' }) }) // setup remixd shared folder service const sharedFolderRouter = new remixd.Router(65520, sharedFolderService, { remixIdeUrl }, (webSocket) => { sharedFolderService.setWebSocket(webSocket) sharedFolderService.setupNotifications(sharedFolder) sharedFolderService.sharedFolder(sharedFolder, readOnly) }) const killRemixD = sharedFolderRouter.start() const kill = () => { if (server) server.close() embark.logger.info(colors.red('embark-remix stopped')) process.exit() } if (process.platform === 'win32') { require('readline').createInterface({ input: process.stdin, output: process.stdout }).on('SIGINT', function () { process.emit('SIGINT') }) } process.on('SIGINT', kill) // catch ctrl-c process.on('SIGTERM', kill) // catch kill process.on('exit', killRemixD) }