Merge branch 'buffer_sharejs_ops'

This commit is contained in:
James Allen 2015-04-22 13:59:19 +01:00
commit 6c585adb3c
6 changed files with 32 additions and 5 deletions

View file

@ -29,7 +29,7 @@ block content
strong #{translate("reconnecting")}...
.div(ng-controller="SavingNotificationController")
.alert.alert-warning.small( ng-repeat="(doc_id, state) in docSavingStatus" ng-if="state.unsavedSeconds > 3") #{translate("saving_notification_with_seconds", {docname:"{{ state.doc.name }}", seconds:"{{ state.unsavedSeconds }}"})}
.alert.alert-warning.small( ng-repeat="(doc_id, state) in docSavingStatus" ng-if="state.unsavedSeconds > 8") #{translate("saving_notification_with_seconds", {docname:"{{ state.doc.name }}", seconds:"{{ state.unsavedSeconds }}"})}
include ./editor/left-menu

View file

@ -14,6 +14,10 @@ define [
return true if doc.hasBufferedOps()
return false
@flushAll: () ->
for doc_id, doc of @openDocs
doc.flush()
constructor: (@ide, @doc_id) ->
@connected = @ide.socket.socket.connected
@joined = false
@ -109,6 +113,9 @@ define [
else
@_leaveDoc(callback)
flush: () ->
@doc?.flushPendingOps()
pollSavedStatus: () ->
# returns false if doc has ops waiting to be acknowledged or
# sent that haven't changed since the last time we checked.

View file

@ -28,6 +28,9 @@ define [
initialized = true
@autoOpenDoc()
@$scope.$on "flush-changes", () =>
Document.flushAll()
autoOpenDoc: () ->
open_doc_id =
@ide.localStorage("doc.open_id.#{@$scope.project_id}") or

View file

@ -2,6 +2,8 @@ define [
"utils/EventEmitter"
"libs/sharejs"
], (EventEmitter, ShareJs) ->
SINGLE_USER_FLUSH_DELAY = 1000 #ms
class ShareJsDoc extends EventEmitter
constructor: (@doc_id, docLines, version, @socket) ->
# Dencode any binary bits of data
@ -33,11 +35,15 @@ define [
@_doc = new ShareJs.Doc @connection, @doc_id,
type: @type
@_doc.setFlushDelay(SINGLE_USER_FLUSH_DELAY)
@_doc.on "change", () =>
@trigger "change"
@_doc.on "acknowledge", () =>
@trigger "acknowledge"
@_doc.on "remoteop", () =>
# As soon as we're working with a collaborator, start sending
# ops as quickly as possible for low latency.
@_doc.setFlushDelay(0)
@trigger "remoteop"
@_bindToDocChanges(@_doc)

View file

@ -200,7 +200,7 @@ class Doc
callback null, oldInflightOp for callback in @inflightCallbacks
# Send the next op.
@flush()
@delayedFlush()
else if msg.op
# We got a new op from the server.
@ -247,6 +247,9 @@ class Doc
# Only one op can be in-flight at a time, so if an op is already on its way then
# this method does nothing.
flush: =>
@flushTimeout = null
#console.log "CALLED FLUSH"
return unless @connection.state == 'ok' and @inflightOp == null and @pendingOp != null
# Rotate null -> pending -> inflight
@ -256,6 +259,7 @@ class Doc
@pendingOp = null
@pendingCallbacks = []
#console.log "SENDING OP TO SERVER", @inflightOp, @version
@connection.send {doc:@name, op:@inflightOp, v:@version}
# Submit an op to the server. The op maybe held for a little while before being sent, as only one
@ -275,9 +279,14 @@ class Doc
@emit 'change', op
# A timeout is used so if the user sends multiple ops at the same time, they'll be composed
# & sent together.
setTimeout @flush, 0
@delayedFlush()
delayedFlush: () ->
if !@flushTimeout?
@flushTimeout = setTimeout @flush, @_flushDelay || 0
setFlushDelay: (delay) =>
@_flushDelay = delay
shout: (msg) =>
# Meta ops don't have to queue, they can go direct. Good/bad idea?

View file

@ -123,6 +123,8 @@ define [
return if $scope.pdf.compiling
$scope.pdf.compiling = true
ide.$scope.$broadcast("flush-changes")
if !options.isAutoCompile
compileCount++
if compileCount == 1