| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- logger = require "logger-sharelatex"
- metrics = require('../../infrastructure/Metrics')
- Settings = require 'settings-sharelatex'
- rclient = require("redis").createClient(Settings.redis.web.port, Settings.redis.web.host)
- rclient.auth(Settings.redis.web.password)
- DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler')
- AutomaticSnapshotManager = require("../Versioning/AutomaticSnapshotManager")
- EditorRealTimeController = require("./EditorRealTimeController")
- module.exports = EditorUpdatesController =
- _applyUpdate: (client, project_id, doc_id, update, callback = (error) ->) ->
- metrics.inc "editor.doc-update", 0.3
- metrics.set "editor.active-projects", project_id, 0.3
- client.get "user_id", (error, user_id) ->
- metrics.set "editor.active-users", user_id, 0.3
- client.get "take_snapshots", (error, takeSnapshot) ->
- if takeSnapshot
- AutomaticSnapshotManager.markProjectAsUpdated(project_id)
- DocumentUpdaterHandler.queueChange project_id, doc_id, update, (error) ->
- if error?
- logger.error err:error, project_id: project_id, "document was not available for update"
- client.disconnect()
- callback(error)
- applyOtUpdate: (client, project_id, doc_id, update) ->
- update.meta ||= {}
- update.meta.source = client.id
- client.get "user_id", (error, user_id) ->
- update.meta.user_id = user_id
- EditorUpdatesController._applyUpdate client, project_id, doc_id, update
- applyAceUpdate: (client, project_id, doc_id, window_name, update) ->
- # This is deprecated now and should never be used. Kick the client off if they call it.
- # After the initial deploy this can be removed safely
- logger.err project_id: project_id, doc_id: doc_id, "client using old Ace Update method"
- client.disconnect()
-
- listenForUpdatesFromDocumentUpdater: () ->
- rclient.subscribe "applied-ops"
- rclient.on "message", @_processMessageFromDocumentUpdater.bind(@)
-
- _processMessageFromDocumentUpdater: (channel, message) ->
- message = JSON.parse message
- if message.op?
- @_applyUpdateFromDocumentUpdater(message.doc_id, message.op)
- else if message.error?
- @_processErrorFromDocumentUpdater(message.doc_id, message.error, message)
- _applyUpdateFromDocumentUpdater: (doc_id, update) ->
- io = require('../../infrastructure/Server').io
- for client in io.sockets.clients(doc_id)
- if client.id == update.meta.source
- client.emit "otUpdateApplied", v: update.v, doc: update.doc
- else
- client.emit "otUpdateApplied", update
- _processErrorFromDocumentUpdater: (doc_id, error, message) ->
- io = require('../../infrastructure/Server').io
- logger.error err: error, doc_id: doc_id, "error from document updater"
- for client in io.sockets.clients(doc_id)
- client.emit "otUpdateError", error, message
- client.disconnect()
|