OSDN Git Service

Bump qs and express
[bytom/bytom-electron.git] / main.js
1 require('babel-register')
2 require('events').EventEmitter.defaultMaxListeners = 100
3 const {app, BrowserWindow, ipcMain, shell} = require('electron')
4 const spawn = require('child_process').spawn
5 const glob = require('glob')
6 const url = require('url')
7 const path = require('path')
8 const fs = require('fs')
9 const logger = require('./modules/logger')
10 const log = logger.create('main')
11 const bytomdLog = logger.create('bytomd')
12 const Settings = require('./modules/settings')
13
14 const tcpPortUsed = require('tcp-port-used');
15
16 let win, bytomdInit, bytomdNode
17
18 global.fileExist = false
19 global.mining = {isMining: false}
20 let startnode = false
21
22 Settings.init()
23
24 function initialize () {
25
26   function createWindow() {
27     // Create browser Window
28
29     const icon_path = path.join(__dirname, '/static/images/app-icon/png/app.png')
30     win = new BrowserWindow({
31       width: 1024 + 238,
32       height: 768,
33       minHeight: 768,
34       minWidth: 1024,
35       titleBarStyle: 'hidden',
36       'webPreferences': {
37         'webSecurity': !process.env.DEV_URL,
38         'preload': path.join(__dirname, '/modules/preload.js')
39       },
40       icon: icon_path
41     })
42
43     const startUrl = process.env.DEV_URL ||
44       url.format({
45         pathname: path.join(__dirname, '/public/index.html'),
46         protocol: 'file:',
47         slashes: true
48       })
49     win.loadURL(startUrl)
50
51     if(process.env.DEV){
52       win.webContents.openDevTools()
53     }
54
55     win.webContents.on('new-window', function(e, url) {
56       e.preventDefault()
57       shell.openExternal(url)
58     })
59
60     win.webContents.on('did-finish-load', function () {
61       if(startnode){
62         win.webContents.send('ConfiguredNetwork', 'startNode')
63       }
64     })
65
66     win.on('closed', () => {
67       win = null
68       app.quit()
69     })
70   }
71
72   app.on('ready', () => {
73
74     loadMenu()
75
76     setupConfigure()
77
78     bytomd()
79
80     createWindow()
81   })
82
83 //All window Closed
84   app.on('window-all-closed', () => {
85     if (process.platform !== 'darwin') {
86       app.quit()
87     }
88   })
89
90   app.on('activate', () => {
91     if (win === null) {
92       createWindow()
93     }
94   })
95
96   app.on('before-quit', () => {
97     if(bytomdInit){
98       bytomdInit.kill('SIGINT')
99       log.info('Kill bytomd Init command...')
100     }
101     if(bytomdNode){
102       bytomdNode.kill('SIGINT')
103       const killTimeout = setTimeout(() => {
104         bytomdNode.kill('SIGKILL')
105       }, 8000 /* 8 seconds */)
106
107       bytomdNode.once('close', () => {
108         clearTimeout(killTimeout)
109         bytomdNode = null
110       })
111
112       log.info('Kill bytomd Mining command...')
113     }
114   })
115 }
116
117 function setBytomNode(event) {
118   bytomdNode = spawn( `${Settings.bytomdPath}`, ['node', '--web.closed', '--home', Settings.bytomdDataPath] )
119
120   bytomdNode.stdout.on('data', function(data) {
121     bytomdLog.info(`bytomd node: ${data}`)
122   })
123
124   bytomdNode.stderr.on('data', function(data) {
125     bytomdNode.on('exit', function (code) {
126       bytomdLog.info('bytom Node exited with code ' + code)
127       app.quit()
128     })
129   })
130
131   tcpPortUsed.waitUntilUsed(9888, 500, 20000)
132     .then(function() {
133       if (event) {
134         event.sender.send('ConfiguredNetwork', 'startNode')
135       }
136       else {
137         startnode = true
138         win.webContents.send('ConfiguredNetwork', 'startNode')
139       }
140     }, function(err) {
141       bytomdLog.info('Error:', err.message);
142     });
143 }
144
145 function setBytomInit(event, bytomNetwork) {
146   // Init bytomd
147   bytomdInit = spawn(`${Settings.bytomdPath}`, ['init', '--chain_id',  `${bytomNetwork}`, '--home', Settings.bytomdDataPath] )
148
149   bytomdInit.stdout.on('data', function(data) {
150     bytomdLog.info(`bytomd init: ${data}`)
151   })
152
153   bytomdInit.stderr.on('data', function(data) {
154     bytomdLog.info(`bytomd init: ${data}`)
155   })
156
157   bytomdInit.on('exit', function (code) {
158     event.sender.send('ConfiguredNetwork','init')
159     setBytomNode(event)
160     bytomdLog.info('bytom init exited with code ' + code)
161   })
162
163   bytomdInit.once('close', () => {
164     bytomdInit = null
165   })
166 }
167
168 function bytomd(){
169   const filePath = path.join(`${Settings.bytomdDataPath}/config.toml`)
170   if (fs.existsSync(filePath)) {
171     log.info('Bytomd Network has been inited')
172     global.fileExist = true
173     setBytomNode()
174   }else {
175     log.info('Init Bytomd Network...')
176     ipcMain.on('bytomdInitNetwork', (event, arg) => {
177       setBytomInit( event,  arg )
178     })
179   }
180 }
181
182 // Require each JS file in the main-process dir
183 function loadMenu () {
184   const files = glob.sync(path.join(__dirname, 'modules/menus/*.js'))
185   files.forEach((file) => { require(file) })
186 }
187
188 function setupConfigure(){
189   const logFolder = {logFolder: path.join(app.getPath('userData'), 'logs')}
190   const loggerOptions = Object.assign(logFolder)
191   logger.setup(loggerOptions)
192 }
193
194
195 // Handle Squirrel on Windows startup events
196 switch (process.argv[1]) {
197   case '--squirrel-install':
198   case '--squirrel-uninstall':
199   case '--squirrel-obsolete':
200   case '--squirrel-updated':
201     app.quit()
202     break
203   default:
204     initialize()
205 }
206