refactor(realtime): update dirty note job

Signed-off-by: BoHong Li <a60814billy@gmail.com>
This commit is contained in:
BoHong Li 2019-05-27 15:18:44 +08:00
parent 0352057c8b
commit f892c68e30
No known key found for this signature in database
GPG Key ID: 9696D5590D58290F
1 changed files with 53 additions and 25 deletions

View File

@ -1,6 +1,5 @@
'use strict' 'use strict'
const async = require('async')
const config = require('./config') const config = require('./config')
const logger = require('./logger') const logger = require('./logger')
const moment = require('moment') const moment = require('moment')
@ -11,38 +10,67 @@ class UpdateDirtyNoteJob {
} }
start () { start () {
setInterval(this.updateDirtyNote.bind(this), 1000) if (this.timer) return
this.timer = setInterval(this.updateDirtyNotes.bind(this), 1000)
} }
updateDirtyNote () { stop () {
if (!this.timer) return
clearInterval(this.timer)
this.timer = undefined
}
updateDirtyNotes () {
const notes = this.realtime.getNotePool() const notes = this.realtime.getNotePool()
async.each(Object.keys(notes), (key, callback) => { Object.keys(notes).forEach((key) => {
const note = notes[key] const note = notes[key]
if (!note.server.isDirty) return callback(null, null) this.updateDirtyNote(note)
.catch((err) => {
logger.error('updateDirtyNote: updater error', err)
})
})
}
if (config.debug) logger.info('updater found dirty note: ' + key) async updateDirtyNote (note) {
note.server.isDirty = false const notes = this.realtime.getNotePool()
this.realtime.updateNote(note, (err, _note) => { if (!note.server.isDirty) return
// handle when note already been clean up
if (!notes[key] || !notes[key].server) return callback(null, null)
if (!_note) {
this.realtime.io.to(note.id).emit('info', {
code: 404
})
logger.error('note not found: ', note.id)
}
if (err || !_note) { if (config.debug) logger.info('updateDirtyNote: updater found dirty note: ' + note.id)
this.realtime.disconnectSocketOnNote(note) note.server.isDirty = false
return callback(err, null)
}
note.updatetime = moment(_note.lastchangeAt).valueOf() try {
this.realtime.emitCheck(note) const _note = await this.updateNoteAsync(note)
return callback(null, null) // handle when note already been clean up
if (!notes[note.id] || !notes[note.id].server) return
if (!_note) {
this.realtime.io.to(note.id).emit('info', {
code: 404
})
logger.error('updateDirtyNote: note not found: ', note.id)
this.realtime.disconnectSocketOnNote(note)
}
note.updatetime = moment(_note.lastchangeAt).valueOf()
this.realtime.emitCheck(note)
} catch (err) {
logger.error('updateDirtyNote: note not found: ', note.id)
this.realtime.io.to(note.id).emit('info', {
code: 404
})
this.realtime.disconnectSocketOnNote(note)
throw err
}
}
updateNoteAsync (note) {
return new Promise((resolve, reject) => {
this.realtime.updateNote(note, (err, _note) => {
if (err) {
return reject(err)
}
return resolve(_note)
}) })
}, (err) => {
if (err) return logger.error('updater error', err)
}) })
} }
} }