From 7050ee849b88e5111c974bb284f418b14b797c14 Mon Sep 17 00:00:00 2001 From: DC Date: Fri, 8 Jul 2016 11:20:56 -0700 Subject: [PATCH] Refactor main.js: fix state save on exit --- main/index.js | 5 ++++- renderer/lib/state.js | 25 +++++++++++-------------- renderer/main.js | 7 ++++--- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/main/index.js b/main/index.js index dc6f759b..3be191cc 100644 --- a/main/index.js +++ b/main/index.js @@ -90,7 +90,10 @@ function init () { e.preventDefault() windows.main.dispatch('saveState') // try to save state on exit ipcMain.once('savedState', () => app.quit()) - setTimeout(() => app.quit(), 2000) // quit after 2 secs, at most + setTimeout(() => { + console.error('Saving state took too long. Quitting.') + app.quit() + }, 2000) // quit after 2 secs, at most }) app.on('activate', function () { diff --git a/renderer/lib/state.js b/renderer/lib/state.js index b81b6b87..2fd1ba82 100644 --- a/renderer/lib/state.js +++ b/renderer/lib/state.js @@ -1,15 +1,16 @@ -module.exports = { +var appConfig = require('application-config')('WebTorrent') +var path = require('path') +var {EventEmitter} = require('events') + +var config = require('../../config') +var migrations = require('./migrations') + +var State = module.exports = Object.assign(new EventEmitter(), { getDefaultPlayState, load, save, saveThrottled -} - -var appConfig = require('application-config')('WebTorrent') -var path = require('path') - -var config = require('../../config') -var migrations = require('./migrations') +}) appConfig.filePath = path.join(config.CONFIG_PATH, 'config.json') @@ -183,8 +184,6 @@ function save (state, cb) { console.log('Saving state to ' + appConfig.filePath) delete state.saveStateTimeout - var electron = require('electron') - // Clean up, so that we're not saving any pending state var copy = Object.assign({}, state.saved) // Remove torrents pending addition to the list, where we haven't finished @@ -205,11 +204,9 @@ function save (state, cb) { return torrent }) - appConfig.write(copy, function (err) { + appConfig.write(copy, (err) => { if (err) console.error(err) - - // TODO: this doesn't belong here - electron.ipcRenderer.send('savedState') + else State.emit('savedState') }) } diff --git a/renderer/main.js b/renderer/main.js index feb2b11d..3e3356ca 100644 --- a/renderer/main.js +++ b/renderer/main.js @@ -180,7 +180,6 @@ const dispatchHandlers = { 'deleteTorrent': (infoHash) => controllers.torrentList.deleteTorrent(infoHash), 'toggleSelectTorrent': (infoHash) => controllers.torrentList.toggleSelectTorrent(infoHash), 'openTorrentContextMenu': (infoHash) => controllers.torrentList.openTorrentContextMenu(infoHash), - 'startTorrentingSummary': (torrentSummary) => controllers.torrentList.startTorrentingSummary(torrentSummary), @@ -236,9 +235,9 @@ const dispatchHandlers = { // Everything else 'onOpen': (files) => onOpen(files), - 'saveState': (state) => State.save(state), 'onError': (err) => onError(err), - 'uncaughtError': (proc, err) => telemetry.logUncaughtError(proc, err) + 'uncaughtError': (proc, err) => telemetry.logUncaughtError(proc, err), + 'saveState': () => State.save(state) } // Events from the UI never modify state directly. Instead they call dispatch() @@ -284,6 +283,8 @@ function setupIpc () { ipcRenderer.on('wt-uncaught-error', (e, err) => telemetry.logUncaughtError('webtorrent', err)) ipcRenderer.send('ipcReady') + + State.on('savedState', () => ipcRenderer.send('savedState')) } // Quits any modal popovers and returns to the torrent list screen