|
|
@@ -1,16 +1,3 @@
|
|
|
-/* eslint-disable
|
|
|
- camelcase,
|
|
|
- handle-callback-err,
|
|
|
-*/
|
|
|
-// TODO: This file was created by bulk-decaffeinate.
|
|
|
-// Fix any style issues and re-enable lint.
|
|
|
-/*
|
|
|
- * decaffeinate suggestions:
|
|
|
- * DS101: Remove unnecessary use of Array.from
|
|
|
- * DS102: Remove unnecessary code created because of implicit returns
|
|
|
- * DS207: Consider shorter variations of null checks
|
|
|
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
- */
|
|
|
let DocUpdaterClient
|
|
|
const Settings = require('settings-sharelatex')
|
|
|
const rclient = require('redis-sharelatex').createClient(
|
|
|
@@ -20,143 +7,122 @@ const keys = Settings.redis.documentupdater.key_schema
|
|
|
const request = require('request').defaults({ jar: false })
|
|
|
const async = require('async')
|
|
|
|
|
|
-const rclient_sub = require('redis-sharelatex').createClient(
|
|
|
+const rclientSub = require('redis-sharelatex').createClient(
|
|
|
Settings.redis.pubsub
|
|
|
)
|
|
|
-rclient_sub.subscribe('applied-ops')
|
|
|
-rclient_sub.setMaxListeners(0)
|
|
|
+rclientSub.subscribe('applied-ops')
|
|
|
+rclientSub.setMaxListeners(0)
|
|
|
|
|
|
module.exports = DocUpdaterClient = {
|
|
|
randomId() {
|
|
|
- const chars = __range__(1, 24, true).map(
|
|
|
- (i) => Math.random().toString(16)[2]
|
|
|
- )
|
|
|
- return chars.join('')
|
|
|
+ let str = ''
|
|
|
+ for (let i = 0; i < 24; i++) {
|
|
|
+ str += Math.floor(Math.random() * 16).toString(16)
|
|
|
+ }
|
|
|
+ return str
|
|
|
},
|
|
|
|
|
|
subscribeToAppliedOps(callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (message) {}
|
|
|
- }
|
|
|
- return rclient_sub.on('message', callback)
|
|
|
+ rclientSub.on('message', callback)
|
|
|
},
|
|
|
|
|
|
- sendUpdate(project_id, doc_id, update, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (error) {}
|
|
|
- }
|
|
|
- return rclient.rpush(
|
|
|
- keys.pendingUpdates({ doc_id }),
|
|
|
+ sendUpdate(projectId, docId, update, callback) {
|
|
|
+ rclient.rpush(
|
|
|
+ keys.pendingUpdates({ doc_id: docId }),
|
|
|
JSON.stringify(update),
|
|
|
(error) => {
|
|
|
- if (error != null) {
|
|
|
+ if (error) {
|
|
|
return callback(error)
|
|
|
}
|
|
|
- const doc_key = `${project_id}:${doc_id}`
|
|
|
- return rclient.sadd('DocsWithPendingUpdates', doc_key, (error) => {
|
|
|
- if (error != null) {
|
|
|
+ const docKey = `${projectId}:${docId}`
|
|
|
+ rclient.sadd('DocsWithPendingUpdates', docKey, (error) => {
|
|
|
+ if (error) {
|
|
|
return callback(error)
|
|
|
}
|
|
|
- return rclient.rpush('pending-updates-list', doc_key, callback)
|
|
|
+ rclient.rpush('pending-updates-list', docKey, callback)
|
|
|
})
|
|
|
}
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- sendUpdates(project_id, doc_id, updates, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (error) {}
|
|
|
- }
|
|
|
- return DocUpdaterClient.preloadDoc(project_id, doc_id, (error) => {
|
|
|
- if (error != null) {
|
|
|
+ sendUpdates(projectId, docId, updates, callback) {
|
|
|
+ DocUpdaterClient.preloadDoc(projectId, docId, (error) => {
|
|
|
+ if (error) {
|
|
|
return callback(error)
|
|
|
}
|
|
|
- const jobs = []
|
|
|
- for (const update of Array.from(updates)) {
|
|
|
- ;((update) =>
|
|
|
- jobs.push((callback) =>
|
|
|
- DocUpdaterClient.sendUpdate(project_id, doc_id, update, callback)
|
|
|
- ))(update)
|
|
|
- }
|
|
|
- return async.series(jobs, (err) =>
|
|
|
- DocUpdaterClient.waitForPendingUpdates(project_id, doc_id, callback)
|
|
|
- )
|
|
|
+ const jobs = updates.map((update) => (callback) => {
|
|
|
+ DocUpdaterClient.sendUpdate(projectId, docId, update, callback)
|
|
|
+ })
|
|
|
+ async.series(jobs, (err) => {
|
|
|
+ if (err) {
|
|
|
+ return callback(err)
|
|
|
+ }
|
|
|
+ DocUpdaterClient.waitForPendingUpdates(projectId, docId, callback)
|
|
|
+ })
|
|
|
})
|
|
|
},
|
|
|
|
|
|
- waitForPendingUpdates(project_id, doc_id, callback) {
|
|
|
- return async.retry(
|
|
|
+ waitForPendingUpdates(projectId, docId, callback) {
|
|
|
+ async.retry(
|
|
|
{ times: 30, interval: 100 },
|
|
|
(cb) =>
|
|
|
- rclient.llen(keys.pendingUpdates({ doc_id }), (err, length) => {
|
|
|
+ rclient.llen(keys.pendingUpdates({ doc_id: docId }), (err, length) => {
|
|
|
+ if (err) {
|
|
|
+ return cb(err)
|
|
|
+ }
|
|
|
if (length > 0) {
|
|
|
- return cb(new Error('updates still pending'))
|
|
|
+ cb(new Error('updates still pending'))
|
|
|
} else {
|
|
|
- return cb()
|
|
|
+ cb()
|
|
|
}
|
|
|
}),
|
|
|
callback
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- getDoc(project_id, doc_id, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (error, res, body) {}
|
|
|
- }
|
|
|
- return request.get(
|
|
|
- `http://localhost:3003/project/${project_id}/doc/${doc_id}`,
|
|
|
+ getDoc(projectId, docId, callback) {
|
|
|
+ request.get(
|
|
|
+ `http://localhost:3003/project/${projectId}/doc/${docId}`,
|
|
|
(error, res, body) => {
|
|
|
if (body != null && res.statusCode >= 200 && res.statusCode < 300) {
|
|
|
body = JSON.parse(body)
|
|
|
}
|
|
|
- return callback(error, res, body)
|
|
|
+ callback(error, res, body)
|
|
|
}
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- getDocAndRecentOps(project_id, doc_id, fromVersion, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (error, res, body) {}
|
|
|
- }
|
|
|
- return request.get(
|
|
|
- `http://localhost:3003/project/${project_id}/doc/${doc_id}?fromVersion=${fromVersion}`,
|
|
|
+ getDocAndRecentOps(projectId, docId, fromVersion, callback) {
|
|
|
+ request.get(
|
|
|
+ `http://localhost:3003/project/${projectId}/doc/${docId}?fromVersion=${fromVersion}`,
|
|
|
(error, res, body) => {
|
|
|
if (body != null && res.statusCode >= 200 && res.statusCode < 300) {
|
|
|
body = JSON.parse(body)
|
|
|
}
|
|
|
- return callback(error, res, body)
|
|
|
+ callback(error, res, body)
|
|
|
}
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- preloadDoc(project_id, doc_id, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (error) {}
|
|
|
- }
|
|
|
- return DocUpdaterClient.getDoc(project_id, doc_id, callback)
|
|
|
+ preloadDoc(projectId, docId, callback) {
|
|
|
+ DocUpdaterClient.getDoc(projectId, docId, callback)
|
|
|
},
|
|
|
|
|
|
- flushDoc(project_id, doc_id, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (error) {}
|
|
|
- }
|
|
|
- return request.post(
|
|
|
- `http://localhost:3003/project/${project_id}/doc/${doc_id}/flush`,
|
|
|
+ flushDoc(projectId, docId, callback) {
|
|
|
+ request.post(
|
|
|
+ `http://localhost:3003/project/${projectId}/doc/${docId}/flush`,
|
|
|
(error, res, body) => callback(error, res, body)
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- setDocLines(project_id, doc_id, lines, source, user_id, undoing, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (error) {}
|
|
|
- }
|
|
|
- return request.post(
|
|
|
+ setDocLines(projectId, docId, lines, source, userId, undoing, callback) {
|
|
|
+ request.post(
|
|
|
{
|
|
|
- url: `http://localhost:3003/project/${project_id}/doc/${doc_id}`,
|
|
|
+ url: `http://localhost:3003/project/${projectId}/doc/${docId}`,
|
|
|
json: {
|
|
|
lines,
|
|
|
source,
|
|
|
- user_id,
|
|
|
+ user_id: userId,
|
|
|
undoing
|
|
|
}
|
|
|
},
|
|
|
@@ -164,115 +130,68 @@ module.exports = DocUpdaterClient = {
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- deleteDoc(project_id, doc_id, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (error) {}
|
|
|
- }
|
|
|
- return request.del(
|
|
|
- `http://localhost:3003/project/${project_id}/doc/${doc_id}`,
|
|
|
+ deleteDoc(projectId, docId, callback) {
|
|
|
+ request.del(
|
|
|
+ `http://localhost:3003/project/${projectId}/doc/${docId}`,
|
|
|
(error, res, body) => callback(error, res, body)
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- flushProject(project_id, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function () {}
|
|
|
- }
|
|
|
- return request.post(
|
|
|
- `http://localhost:3003/project/${project_id}/flush`,
|
|
|
- callback
|
|
|
- )
|
|
|
+ flushProject(projectId, callback) {
|
|
|
+ request.post(`http://localhost:3003/project/${projectId}/flush`, callback)
|
|
|
},
|
|
|
|
|
|
- deleteProject(project_id, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function () {}
|
|
|
- }
|
|
|
- return request.del(`http://localhost:3003/project/${project_id}`, callback)
|
|
|
+ deleteProject(projectId, callback) {
|
|
|
+ request.del(`http://localhost:3003/project/${projectId}`, callback)
|
|
|
},
|
|
|
|
|
|
- deleteProjectOnShutdown(project_id, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function () {}
|
|
|
- }
|
|
|
- return request.del(
|
|
|
- `http://localhost:3003/project/${project_id}?background=true&shutdown=true`,
|
|
|
+ deleteProjectOnShutdown(projectId, callback) {
|
|
|
+ request.del(
|
|
|
+ `http://localhost:3003/project/${projectId}?background=true&shutdown=true`,
|
|
|
callback
|
|
|
)
|
|
|
},
|
|
|
|
|
|
flushOldProjects(callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function () {}
|
|
|
- }
|
|
|
- return request.get(
|
|
|
+ request.get(
|
|
|
'http://localhost:3003/flush_queued_projects?min_delete_age=1',
|
|
|
callback
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- acceptChange(project_id, doc_id, change_id, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function () {}
|
|
|
- }
|
|
|
- return request.post(
|
|
|
- `http://localhost:3003/project/${project_id}/doc/${doc_id}/change/${change_id}/accept`,
|
|
|
+ acceptChange(projectId, docId, changeId, callback) {
|
|
|
+ request.post(
|
|
|
+ `http://localhost:3003/project/${projectId}/doc/${docId}/change/${changeId}/accept`,
|
|
|
callback
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- removeComment(project_id, doc_id, comment, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function () {}
|
|
|
- }
|
|
|
- return request.del(
|
|
|
- `http://localhost:3003/project/${project_id}/doc/${doc_id}/comment/${comment}`,
|
|
|
+ removeComment(projectId, docId, comment, callback) {
|
|
|
+ request.del(
|
|
|
+ `http://localhost:3003/project/${projectId}/doc/${docId}/comment/${comment}`,
|
|
|
callback
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- getProjectDocs(project_id, projectStateHash, callback) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function () {}
|
|
|
- }
|
|
|
- return request.get(
|
|
|
- `http://localhost:3003/project/${project_id}/doc?state=${projectStateHash}`,
|
|
|
+ getProjectDocs(projectId, projectStateHash, callback) {
|
|
|
+ request.get(
|
|
|
+ `http://localhost:3003/project/${projectId}/doc?state=${projectStateHash}`,
|
|
|
(error, res, body) => {
|
|
|
if (body != null && res.statusCode >= 200 && res.statusCode < 300) {
|
|
|
body = JSON.parse(body)
|
|
|
}
|
|
|
- return callback(error, res, body)
|
|
|
+ callback(error, res, body)
|
|
|
}
|
|
|
)
|
|
|
},
|
|
|
|
|
|
- sendProjectUpdate(
|
|
|
- project_id,
|
|
|
- userId,
|
|
|
- docUpdates,
|
|
|
- fileUpdates,
|
|
|
- version,
|
|
|
- callback
|
|
|
- ) {
|
|
|
- if (callback == null) {
|
|
|
- callback = function (error) {}
|
|
|
- }
|
|
|
- return request.post(
|
|
|
+ sendProjectUpdate(projectId, userId, updates, version, callback) {
|
|
|
+ request.post(
|
|
|
{
|
|
|
- url: `http://localhost:3003/project/${project_id}`,
|
|
|
- json: { userId, docUpdates, fileUpdates, version }
|
|
|
+ url: `http://localhost:3003/project/${projectId}`,
|
|
|
+ json: { userId, updates, version }
|
|
|
},
|
|
|
(error, res, body) => callback(error, res, body)
|
|
|
)
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-function __range__(left, right, inclusive) {
|
|
|
- const range = []
|
|
|
- const ascending = left < right
|
|
|
- const end = !inclusive ? right : ascending ? right + 1 : right - 1
|
|
|
- for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
|
|
|
- range.push(i)
|
|
|
- }
|
|
|
- return range
|
|
|
-}
|