1 const {app, BrowserWindow, ipcMain, shell} = require('electron')
2 const spawn = require('child_process').spawn
3 const glob = require('glob')
4 const url = require('url')
5 const path = require('path')
6 const fs = require('fs')
7 const toml = require('toml')
8 const logger = require('./main-process/logger')
9 const log = logger.create('main')
10 const bytomdLog = logger.create('bytomd')
12 let win, bytomdInit, bytomdMining
14 global.fileExist = false
15 global.mining = {isMining: false}
17 function initialize () {
19 function createWindow() {
20 // Create browser Window
22 const icon_path = path.join(__dirname, '/static/images/app-icon/png/app.png')
23 win = new BrowserWindow({
27 'webSecurity': !process.env.DEV_URL,
28 'preload': path.join(__dirname, '/main-process/preload.js')
33 const startUrl = process.env.DEV_URL ||
35 pathname: path.join(__dirname, '/public/index.html'),
42 win.webContents.openDevTools()
45 win.webContents.on('new-window', function(e, url) {
47 shell.openExternal(url)
51 win.on('closed', () => {
57 app.on('ready', () => {
69 app.on('window-all-closed', () => {
70 if (process.platform !== 'darwin') {
75 app.on('activate', () => {
81 app.on('before-quit', () => {
83 bytomdInit.kill('SIGINT')
84 log.info('Kill bytomd Init command...')
87 bytomdMining.kill('SIGINT')
88 const killTimeout = setTimeout(() => {
89 bytomdMining.kill('SIGKILL')
90 }, 8000 /* 8 seconds */)
92 bytomdMining.once('close', () => {
93 clearTimeout(killTimeout)
97 log.info('Kill bytomd Mining command...')
101 const bytomdPath = process.env.DEV?
102 path.join(__dirname, '/bytomd/bytomd-darwin_amd64'):
103 glob.sync( path.join(__dirname, '/bytomd/bytomd*').replace('app.asar', 'app.asar.unpacked'))
106 switch (process.platform){
108 bytomdDataPath = `${app.getPath('appData')}/Bytom`
111 bytomdDataPath = `${app.getPath('home')}/Library/Bytom`
114 bytomdDataPath = `${app.getPath('home')}/.bytom`
117 function setBytomMining(event) {
118 bytomdMining = spawn( `${bytomdPath}`, ['node', '--web.closed'] )
120 bytomdMining.stdout.on('data', function(data) {
121 bytomdLog.info(`bytomd mining: ${data}`)
124 bytomdMining.stderr.on('data', function(data) {
125 bytomdLog.info(`bytomd mining: ${data}`)
126 if(data.includes('msg="Started node"') && event){
127 event.sender.send('ConfiguredNetwork','startNode')
131 bytomdMining.on('exit', function (code) {
132 bytomdLog.info('bytom Mining exited with code ' + code)
137 function setBytomInit(event, bytomNetwork) {
139 bytomdInit = spawn(`${bytomdPath}`, ['init', '--chain_id', `${bytomNetwork}`] )
141 bytomdInit.stdout.on('data', function(data) {
142 bytomdLog.info(`bytomd init: ${data}`)
145 bytomdInit.stderr.on('data', function(data) {
146 bytomdLog.info(`bytomd init: ${data}`)
149 bytomdInit.on('exit', function (code) {
150 event.sender.send('ConfiguredNetwork','init')
151 setBytomMining(event)
152 bytomdLog.info('bytom init exited with code ' + code)
155 bytomdInit.once('close', () => {
161 const filePath = path.join(`${bytomdDataPath}/config.toml`)
163 fs.stat(`${filePath}`, function(err) {
165 log.info('Bytomd Network has been inited')
166 global.fileExist = true
169 let genesisFile = fs.readFileSync(filePath)
170 genesisFile = toml.parse(genesisFile)
172 global.networkStatus = genesisFile.chain_id
174 } else if(err.code == 'ENOENT') {
175 //wait for the int network call
176 log.info('Init Bytomd Network')
177 ipcMain.on('bytomdInitNetwork', (event, arg) => {
178 setBytomInit( event, arg )
179 global.networkStatus = arg
182 log.error('Some other error: ', err.code)
187 // Require each JS file in the main-process dir
188 function loadMenu () {
189 const files = glob.sync(path.join(__dirname, 'main-process/menus/*.js'))
190 files.forEach((file) => { require(file) })
193 function setupConfigure(){
194 const logFolder = {logFolder: path.join(app.getPath('userData'), 'logs')}
195 const loggerOptions = Object.assign(logFolder)
196 logger.setup(loggerOptions)
199 // Handle Squirrel on Windows startup events
200 switch (process.argv[1]) {
201 case '--squirrel-install':
202 case '--squirrel-uninstall':
203 case '--squirrel-obsolete':
204 case '--squirrel-updated':