mirror of
https://github.com/overleaf/overleaf.git
synced 2024-10-31 21:21:03 -04:00
38 lines
920 B
CoffeeScript
38 lines
920 B
CoffeeScript
|
ASpellWorker = require "./ASpellWorker"
|
||
|
_ = require "underscore"
|
||
|
|
||
|
class ASpellWorkerPool
|
||
|
constructor: (@options) ->
|
||
|
@PROCESS_POOL = []
|
||
|
@timeout = 1000
|
||
|
|
||
|
create: (language) ->
|
||
|
worker = new ASpellWorker(language, @options)
|
||
|
worker.pipe.on 'exit', () =>
|
||
|
@cleanup
|
||
|
@PROCESS_POOL.push(worker)
|
||
|
return worker
|
||
|
|
||
|
cleanup: () ->
|
||
|
active = @PROCESS_POOL.filter (worker) ->
|
||
|
worker.state != 'killed'
|
||
|
@PROCESS_POOL = active
|
||
|
|
||
|
check: (language, words, timeout, callback) ->
|
||
|
# look for an existing process in the pool
|
||
|
availableWorker = _.find @PROCESS_POOL, (cached) ->
|
||
|
cached.language == language && cached.isReady()
|
||
|
if not availableWorker?
|
||
|
worker = @create(language)
|
||
|
else
|
||
|
worker = availableWorker
|
||
|
|
||
|
timer = setTimeout () ->
|
||
|
worker.pipe.kill('SIGKILL')
|
||
|
, timeout || 1000
|
||
|
worker.check words, (err, output) ->
|
||
|
clearTimeout timer
|
||
|
callback(err, output)
|
||
|
|
||
|
module.exports = ASpellWorkerPool
|