mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-14 14:13:43 +01:00
[real-time] remove per-doc rooms (#35691)
* [real-time] remove applied-ops pub/sub * [real-time] remove per-doc rooms GitOrigin-RevId: ec3b76b37a029df15bf20d6f2832fb7c089c0042
This commit is contained in:
@@ -40,6 +40,11 @@ const MAX_PENDING_OP_SIZE = 64
|
||||
type JoinCallback = (error?: Error) => void
|
||||
type LeaveCallback = JoinCallback
|
||||
|
||||
// Trailing options bag on the joinDoc response
|
||||
type JoinDocResponseOptions = {
|
||||
canSkipLeaveDoc?: boolean
|
||||
}
|
||||
|
||||
type Update =
|
||||
| {
|
||||
v: number
|
||||
@@ -102,6 +107,11 @@ export class DocumentContainer extends EventEmitter {
|
||||
private joinCallbacks: JoinCallback[] = []
|
||||
private leaveCallbacks: LeaveCallback[] = []
|
||||
|
||||
// Set from the joinDoc response. When true, the server signalled that its
|
||||
// leaveDoc handler is a no-op (doc rooms retired), so we can skip the
|
||||
// leaveDoc RPC and just clean up locally.
|
||||
private canSkipLeaveDoc = false
|
||||
|
||||
doc?: ShareJsDoc
|
||||
cm6?: EditorFacade
|
||||
oldInflightOp?: ShareJsOperation
|
||||
@@ -491,13 +501,15 @@ export class DocumentContainer extends EventEmitter {
|
||||
version,
|
||||
updates,
|
||||
ranges,
|
||||
type = 'sharejs-text-ot'
|
||||
type = 'sharejs-text-ot',
|
||||
options: JoinDocResponseOptions = {}
|
||||
) => {
|
||||
if (error) {
|
||||
callback?.(error)
|
||||
return
|
||||
}
|
||||
this.joined = true
|
||||
this.canSkipLeaveDoc = options.canSkipLeaveDoc ?? false
|
||||
this.doc?.catchUp(updates)
|
||||
if (this.doc?.getType() !== type) {
|
||||
// TODO(24596): page reload after checking for pending ops?
|
||||
@@ -527,13 +539,15 @@ export class DocumentContainer extends EventEmitter {
|
||||
version,
|
||||
updates,
|
||||
ranges,
|
||||
type: OTType = 'sharejs-text-ot'
|
||||
type: OTType = 'sharejs-text-ot',
|
||||
options: JoinDocResponseOptions = {}
|
||||
) => {
|
||||
if (error) {
|
||||
callback?.(error)
|
||||
return
|
||||
}
|
||||
this.joined = true
|
||||
this.canSkipLeaveDoc = options.canSkipLeaveDoc ?? false
|
||||
this.doc = new ShareJsDoc(
|
||||
this.doc_id,
|
||||
docLines,
|
||||
@@ -582,22 +596,32 @@ export class DocumentContainer extends EventEmitter {
|
||||
}
|
||||
|
||||
private leaveDoc(callback?: LeaveCallback) {
|
||||
if (this.canSkipLeaveDoc) {
|
||||
debugConsole.log('[leaveDoc] Leaving doc (server round-trip skipped)')
|
||||
this.finishLeaveDoc()
|
||||
callback?.()
|
||||
return
|
||||
}
|
||||
debugConsole.log('[leaveDoc] Sending leaveDoc request')
|
||||
this.socket.emit('leaveDoc', this.doc_id, error => {
|
||||
if (error) {
|
||||
callback?.(error)
|
||||
return
|
||||
}
|
||||
this.joined = false
|
||||
for (const leaveCallback of this.leaveCallbacks) {
|
||||
debugConsole.log('[_leaveDoc] Calling buffered callback', leaveCallback)
|
||||
leaveCallback(error)
|
||||
}
|
||||
this.leaveCallbacks = []
|
||||
this.finishLeaveDoc()
|
||||
callback?.()
|
||||
})
|
||||
}
|
||||
|
||||
private finishLeaveDoc() {
|
||||
this.joined = false
|
||||
for (const leaveCallback of this.leaveCallbacks) {
|
||||
debugConsole.log('[_leaveDoc] Calling buffered callback', leaveCallback)
|
||||
leaveCallback()
|
||||
}
|
||||
this.leaveCallbacks = []
|
||||
}
|
||||
|
||||
cleanUp() {
|
||||
// if we arrive here from _onError the pending and inflight ops will have been cleared
|
||||
if (this.hasBufferedOps()) {
|
||||
|
||||
Reference in New Issue
Block a user