overleaf/services/document-updater/app/coffee/sharejs/server/syncqueue.js

52 lines
1.5 KiB
JavaScript

/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
// A synchronous processing queue. The queue calls process on the arguments,
// ensuring that process() is only executing once at a time.
//
// process(data, callback) _MUST_ eventually call its callback.
//
// Example:
//
// queue = require 'syncqueue'
//
// fn = queue (data, callback) ->
// asyncthing data, ->
// callback(321)
//
// fn(1)
// fn(2)
// fn(3, (result) -> console.log(result))
//
// ^--- async thing will only be running once at any time.
module.exports = function(process) {
if (typeof process !== 'function') { throw new Error('process is not a function'); }
const queue = [];
const enqueue = function(data, callback) {
queue.push([data, callback]);
return flush();
};
enqueue.busy = false;
var flush = function() {
if (enqueue.busy || (queue.length === 0)) { return; }
enqueue.busy = true;
const [data, callback] = Array.from(queue.shift());
return process(data, function(...result) { // TODO: Make this not use varargs - varargs are really slow.
enqueue.busy = false;
// This is called after busy = false so a user can check if enqueue.busy is set in the callback.
if (callback) { callback.apply(null, result); }
return flush();
});
};
return enqueue;
};