Merge pull request #949 from feross/f/state

State cleanup, rename, & tweaks
This commit is contained in:
Feross Aboukhadijeh
2016-09-22 23:41:01 +02:00
committed by GitHub
8 changed files with 25 additions and 32 deletions

View File

@@ -22,6 +22,7 @@
"capture-frame": "^1.0.0", "capture-frame": "^1.0.0",
"chromecasts": "^1.8.0", "chromecasts": "^1.8.0",
"create-torrent": "^3.24.5", "create-torrent": "^3.24.5",
"debounce": "^1.0.0",
"deep-equal": "^1.0.1", "deep-equal": "^1.0.1",
"dlnacasts": "^0.1.0", "dlnacasts": "^0.1.0",
"drag-drop": "^2.12.1", "drag-drop": "^2.12.1",

View File

@@ -107,12 +107,12 @@ function init () {
app.isQuitting = true app.isQuitting = true
e.preventDefault() e.preventDefault()
windows.main.dispatch('saveState') // try to save state on exit windows.main.dispatch('stateSaveImmediate') // try to save state on exit
ipcMain.once('savedState', () => app.quit()) ipcMain.once('stateSaved', () => app.quit())
setTimeout(() => { setTimeout(() => {
console.error('Saving state took too long. Quitting.') console.error('Saving state took too long. Quitting.')
app.quit() app.quit()
}, 2000) // quit after 2 secs, at most }, 4000) // quit after 4 secs, at most
}) })
app.on('activate', function () { app.on('activate', function () {

View File

@@ -1,4 +1,3 @@
const State = require('../lib/state')
const {dispatch} = require('../lib/dispatcher') const {dispatch} = require('../lib/dispatcher')
const ipcRenderer = require('electron').ipcRenderer const ipcRenderer = require('electron').ipcRenderer
@@ -56,7 +55,7 @@ module.exports = class PrefsController {
ipcRenderer.send('setStartup', state.unsaved.prefs.startup) ipcRenderer.send('setStartup', state.unsaved.prefs.startup)
} }
state.saved.prefs = Object.assign(state.saved.prefs || {}, state.unsaved.prefs) state.saved.prefs = Object.assign(state.saved.prefs || {}, state.unsaved.prefs)
State.save(state) dispatch('stateSaveImmediate')
dispatch('checkDownloadPath') dispatch('checkDownloadPath')
} }
} }

View File

@@ -129,20 +129,20 @@ module.exports = class TorrentController {
const torrentSummary = this.getTorrentSummary(torrentKey) const torrentSummary = this.getTorrentSummary(torrentKey)
if (!torrentSummary) throw new Error('Not saving modtimes for deleted torrent ' + torrentKey) if (!torrentSummary) throw new Error('Not saving modtimes for deleted torrent ' + torrentKey)
torrentSummary.fileModtimes = fileModtimes torrentSummary.fileModtimes = fileModtimes
dispatch('saveStateThrottled') dispatch('stateSave')
} }
torrentFileSaved (torrentKey, torrentFileName) { torrentFileSaved (torrentKey, torrentFileName) {
console.log('torrent file saved %s: %s', torrentKey, torrentFileName) console.log('torrent file saved %s: %s', torrentKey, torrentFileName)
const torrentSummary = this.getTorrentSummary(torrentKey) const torrentSummary = this.getTorrentSummary(torrentKey)
torrentSummary.torrentFileName = torrentFileName torrentSummary.torrentFileName = torrentFileName
dispatch('saveStateThrottled') dispatch('stateSave')
} }
torrentPosterSaved (torrentKey, posterFileName) { torrentPosterSaved (torrentKey, posterFileName) {
const torrentSummary = this.getTorrentSummary(torrentKey) const torrentSummary = this.getTorrentSummary(torrentKey)
torrentSummary.posterFileName = posterFileName torrentSummary.posterFileName = posterFileName
dispatch('saveStateThrottled') dispatch('stateSave')
} }
torrentAudioMetadata (infoHash, index, info) { torrentAudioMetadata (infoHash, index, info) {

View File

@@ -4,7 +4,6 @@ const electron = require('electron')
const {dispatch} = require('../lib/dispatcher') const {dispatch} = require('../lib/dispatcher')
const {TorrentKeyNotFoundError} = require('../lib/errors') const {TorrentKeyNotFoundError} = require('../lib/errors')
const State = require('../lib/state')
const sound = require('../lib/sound') const sound = require('../lib/sound')
const TorrentSummary = require('../lib/torrent-summary') const TorrentSummary = require('../lib/torrent-summary')
@@ -159,7 +158,7 @@ module.exports = class TorrentListController {
// remove torrent from saved list // remove torrent from saved list
this.state.saved.torrents.splice(index, 1) this.state.saved.torrents.splice(index, 1)
State.saveThrottled(this.state) dispatch('stateSave')
} }
// prevent user from going forward to a deleted torrent // prevent user from going forward to a deleted torrent

View File

@@ -1,4 +1,4 @@
const State = require('../lib/state') const {dispatch} = require('../lib/dispatcher')
// Controls the UI checking for new versions of the app, prompting install // Controls the UI checking for new versions of the app, prompting install
module.exports = class UpdateController { module.exports = class UpdateController {
@@ -21,6 +21,6 @@ module.exports = class UpdateController {
let skipped = this.state.saved.skippedVersions let skipped = this.state.saved.skippedVersions
if (!skipped) skipped = this.state.saved.skippedVersions = [] if (!skipped) skipped = this.state.saved.skippedVersions = []
skipped.push(version) skipped.push(version)
State.saveThrottled(this.state) dispatch('stateSave')
} }
} }

View File

@@ -1,15 +1,19 @@
const appConfig = require('application-config')('WebTorrent') const appConfig = require('application-config')('WebTorrent')
const debounce = require('debounce')
const path = require('path') const path = require('path')
const {EventEmitter} = require('events') const {EventEmitter} = require('events')
const config = require('../../config') const config = require('../../config')
const migrations = require('./migrations') const migrations = require('./migrations')
const SAVE_DEBOUNCE_INTERVAL = 1000
const State = module.exports = Object.assign(new EventEmitter(), { const State = module.exports = Object.assign(new EventEmitter(), {
getDefaultPlayState, getDefaultPlayState,
load, load,
save, // state.save() calls are rate-limited. Use state.saveImmediate() to skip limit.
saveThrottled save: debounce(saveImmediate, SAVE_DEBOUNCE_INTERVAL),
saveImmediate
}) })
appConfig.filePath = path.join(config.CONFIG_PATH, 'config.json') appConfig.filePath = path.join(config.CONFIG_PATH, 'config.json')
@@ -98,7 +102,7 @@ function getDefaultPlayState () {
} }
/* If the saved state file doesn't exist yet, here's what we use instead */ /* If the saved state file doesn't exist yet, here's what we use instead */
function setupSavedState (cb) { function setupStateSaved (cb) {
const fs = require('fs-extra') const fs = require('fs-extra')
const parseTorrent = require('parse-torrent') const parseTorrent = require('parse-torrent')
const parallel = require('run-parallel') const parallel = require('run-parallel')
@@ -182,7 +186,7 @@ function load (cb) {
appConfig.read(function (err, saved) { appConfig.read(function (err, saved) {
if (err || !saved.version) { if (err || !saved.version) {
console.log('Missing config file: Creating new one') console.log('Missing config file: Creating new one')
setupSavedState(onSaved) setupStateSaved(onSaved)
} else { } else {
onSaved(null, saved) onSaved(null, saved)
} }
@@ -197,9 +201,8 @@ function load (cb) {
} }
// Write state.saved to the JSON state file // Write state.saved to the JSON state file
function save (state, cb) { function saveImmediate (state, cb) {
console.log('Saving state to ' + appConfig.filePath) console.log('Saving state to ' + appConfig.filePath)
delete state.saveStateTimeout
// Clean up, so that we're not saving any pending state // Clean up, so that we're not saving any pending state
const copy = Object.assign({}, state.saved) const copy = Object.assign({}, state.saved)
@@ -226,15 +229,6 @@ function save (state, cb) {
appConfig.write(copy, (err) => { appConfig.write(copy, (err) => {
if (err) console.error(err) if (err) console.error(err)
else State.emit('savedState') else State.emit('stateSaved')
}) })
} }
// Write, but no more than once a second
function saveThrottled (state) {
if (state.saveStateTimeout) return
state.saveStateTimeout = setTimeout(function () {
if (!state.saveStateTimeout) return
save(state)
}, 1000)
}

View File

@@ -257,8 +257,8 @@ const dispatchHandlers = {
'onOpen': onOpen, 'onOpen': onOpen,
'error': onError, 'error': onError,
'uncaughtError': (proc, err) => telemetry.logUncaughtError(proc, err), 'uncaughtError': (proc, err) => telemetry.logUncaughtError(proc, err),
'saveState': () => State.save(state), 'stateSave': () => State.save(state),
'saveStateThrottled': () => State.saveThrottled(state), 'stateSaveImmediate': () => State.saveImmediate(state),
'update': () => {} // No-op, just trigger an update 'update': () => {} // No-op, just trigger an update
} }
@@ -308,7 +308,7 @@ function setupIpc () {
ipcRenderer.send('ipcReady') ipcRenderer.send('ipcReady')
State.on('savedState', () => ipcRenderer.send('savedState')) State.on('stateSaved', () => ipcRenderer.send('stateSaved'))
} }
// Quits any modal popovers and returns to the torrent list screen // Quits any modal popovers and returns to the torrent list screen
@@ -465,7 +465,7 @@ function onFullscreenChanged (e, isFullScreen) {
function onWindowBoundsChanged (e, newBounds) { function onWindowBoundsChanged (e, newBounds) {
state.saved.bounds = newBounds state.saved.bounds = newBounds
dispatch('saveStateThrottled') dispatch('stateSave')
} }
function checkDownloadPath () { function checkDownloadPath () {