From 24f44889a79b650d2ff683279098542f077cbd63 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 21 Sep 2017 13:25:19 +0100 Subject: [PATCH 1/7] First pass at decoding changes & comments in ranges --- .../public/coffee/ide/editor/Document.coffee | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index 229e791c67..c22c6cd6b3 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -256,14 +256,36 @@ define [ return callback(error) if error? @joined = true @doc.catchUp( updates ) - @_catchUpRanges( ranges?.changes, ranges?.comments ) + + if ranges?.changes + changes = for change in ranges.changes + change.op.i = decodeURIComponent(escape(change.op.i)) if change.op.i + change.op.d = decodeURIComponent(escape(change.op.d)) if change.op.d + change + if ranges?.comments + comments = for comment in ranges.comments + comment.op.c = decodeURIComponent(escape(comment.op.c)) + comment + + @_catchUpRanges( changes, comments ) callback() else @ide.socket.emit 'joinDoc', @doc_id, (error, docLines, version, updates, ranges) => return callback(error) if error? @joined = true @doc = new ShareJsDoc @doc_id, docLines, version, @ide.socket - @ranges = new RangesTracker(ranges?.changes, ranges?.comments) + + if ranges?.changes + changes = for change in ranges.changes + change.op.i = decodeURIComponent(escape(change.op.i)) if change.op.i + change.op.d = decodeURIComponent(escape(change.op.d)) if change.op.d + change + if ranges?.comments + comments = for comment in ranges.comments + comment.op.c = decodeURIComponent(escape(comment.op.c)) + comment + + @ranges = new RangesTracker(changes, comments) @_bindToShareJsDocEvents() callback() From b33929fa8321129c00692f2a8fdecc31ad7b1d4c Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 21 Sep 2017 13:36:31 +0100 Subject: [PATCH 2/7] DRY up --- .../public/coffee/ide/editor/Document.coffee | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index c22c6cd6b3..43e11a29db 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -256,17 +256,7 @@ define [ return callback(error) if error? @joined = true @doc.catchUp( updates ) - - if ranges?.changes - changes = for change in ranges.changes - change.op.i = decodeURIComponent(escape(change.op.i)) if change.op.i - change.op.d = decodeURIComponent(escape(change.op.d)) if change.op.d - change - if ranges?.comments - comments = for comment in ranges.comments - comment.op.c = decodeURIComponent(escape(comment.op.c)) - comment - + { changes, comments } = @_decodeRanges(ranges) @_catchUpRanges( changes, comments ) callback() else @@ -274,21 +264,23 @@ define [ return callback(error) if error? @joined = true @doc = new ShareJsDoc @doc_id, docLines, version, @ide.socket - - if ranges?.changes - changes = for change in ranges.changes - change.op.i = decodeURIComponent(escape(change.op.i)) if change.op.i - change.op.d = decodeURIComponent(escape(change.op.d)) if change.op.d - change - if ranges?.comments - comments = for comment in ranges.comments - comment.op.c = decodeURIComponent(escape(comment.op.c)) - comment - + { changes, comments } = @_decodeRanges(ranges) @ranges = new RangesTracker(changes, comments) @_bindToShareJsDocEvents() callback() + _decodeRanges: (ranges) -> + if ranges?.changes + changes = for change in ranges.changes + change.op.i = decodeURIComponent(escape(change.op.i)) if change.op.i + change.op.d = decodeURIComponent(escape(change.op.d)) if change.op.d + change + if ranges?.comments + comments = for comment in ranges.comments + comment.op.c = decodeURIComponent(escape(comment.op.c)) + comment + { changes, comments } + _leaveDoc: (callback = (error) ->) -> sl_console.log '[_leaveDoc] Sending leaveDoc request' @ide.socket.emit 'leaveDoc', @doc_id, (error) => From e2bb6dcecb1d06ff9aa6ce0f8a575f5f9a976a7b Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 21 Sep 2017 14:23:39 +0100 Subject: [PATCH 3/7] Pass option to encode range To ensure backwards compat with clients not refreshing, pass a flag to enable encoding. This way, old client won't receive encoded ranges, but also won't have decoding logic. The flag can then be removed once all clients are up to date --- services/web/public/coffee/ide/editor/Document.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index 43e11a29db..082c977bfe 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -252,7 +252,7 @@ define [ _joinDoc: (callback = (error) ->) -> if @doc? - @ide.socket.emit 'joinDoc', @doc_id, @doc.getVersion(), (error, docLines, version, updates, ranges) => + @ide.socket.emit 'joinDoc', @doc_id, { encodeRanges: true }, @doc.getVersion(), (error, docLines, version, updates, ranges) => return callback(error) if error? @joined = true @doc.catchUp( updates ) @@ -260,7 +260,7 @@ define [ @_catchUpRanges( changes, comments ) callback() else - @ide.socket.emit 'joinDoc', @doc_id, (error, docLines, version, updates, ranges) => + @ide.socket.emit 'joinDoc', @doc_id, { encodeRanges: true }, (error, docLines, version, updates, ranges) => return callback(error) if error? @joined = true @doc = new ShareJsDoc @doc_id, docLines, version, @ide.socket From a022f83cce18187fc04f4d8b7052c56eb8f7aee3 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 21 Sep 2017 15:22:56 +0100 Subject: [PATCH 4/7] Fix order of args --- services/web/public/coffee/ide/editor/Document.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index 082c977bfe..335e2e75ae 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -252,7 +252,7 @@ define [ _joinDoc: (callback = (error) ->) -> if @doc? - @ide.socket.emit 'joinDoc', @doc_id, { encodeRanges: true }, @doc.getVersion(), (error, docLines, version, updates, ranges) => + @ide.socket.emit 'joinDoc', @doc_id, @doc.getVersion(), { encodeRanges: true }, (error, docLines, version, updates, ranges) => return callback(error) if error? @joined = true @doc.catchUp( updates ) From 42b604dcda8ea0374e2bb74674b801e6a60b9505 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 21 Sep 2017 15:37:27 +0100 Subject: [PATCH 5/7] Clean up decoding from websockets --- .../public/coffee/ide/editor/Document.coffee | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index 335e2e75ae..1773844638 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -256,30 +256,26 @@ define [ return callback(error) if error? @joined = true @doc.catchUp( updates ) - { changes, comments } = @_decodeRanges(ranges) - @_catchUpRanges( changes, comments ) + @_decodeRanges(ranges) + @_catchUpRanges(ranges?.changes, ranges?.comments) callback() else @ide.socket.emit 'joinDoc', @doc_id, { encodeRanges: true }, (error, docLines, version, updates, ranges) => return callback(error) if error? @joined = true @doc = new ShareJsDoc @doc_id, docLines, version, @ide.socket - { changes, comments } = @_decodeRanges(ranges) - @ranges = new RangesTracker(changes, comments) + @_decodeRanges(ranges) + @ranges = new RangesTracker(ranges?.changes, ranges?.comments) @_bindToShareJsDocEvents() callback() _decodeRanges: (ranges) -> - if ranges?.changes - changes = for change in ranges.changes - change.op.i = decodeURIComponent(escape(change.op.i)) if change.op.i - change.op.d = decodeURIComponent(escape(change.op.d)) if change.op.d - change - if ranges?.comments - comments = for comment in ranges.comments - comment.op.c = decodeURIComponent(escape(comment.op.c)) - comment - { changes, comments } + decodeFromWebsockets = (text) -> decodeURIComponent(escape(text)) + for change in ranges.changes or [] + change.op.i = decodeFromWebsockets(change.op.i) if change.op.i + change.op.d = decodeFromWebsockets(change.op.d) if change.op.d + for comment in ranges.comments or [] + comment.op.c = decodeFromWebsockets(comment.op.c) _leaveDoc: (callback = (error) ->) -> sl_console.log '[_leaveDoc] Sending leaveDoc request' From f8d49235475c5fad207eb2132d5c3f71dbcf62a4 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Thu, 21 Sep 2017 15:41:07 +0100 Subject: [PATCH 6/7] Wrap in try/catch --- .../web/public/coffee/ide/editor/Document.coffee | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index 1773844638..887cd53a9a 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -271,11 +271,14 @@ define [ _decodeRanges: (ranges) -> decodeFromWebsockets = (text) -> decodeURIComponent(escape(text)) - for change in ranges.changes or [] - change.op.i = decodeFromWebsockets(change.op.i) if change.op.i - change.op.d = decodeFromWebsockets(change.op.d) if change.op.d - for comment in ranges.comments or [] - comment.op.c = decodeFromWebsockets(comment.op.c) + try + for change in ranges.changes or [] + change.op.i = decodeFromWebsockets(change.op.i) if change.op.i + change.op.d = decodeFromWebsockets(change.op.d) if change.op.d + for comment in ranges.comments or [] + comment.op.c = decodeFromWebsockets(comment.op.c) + catch err + console.log(err) _leaveDoc: (callback = (error) ->) -> sl_console.log '[_leaveDoc] Sending leaveDoc request' From 96d13215e390a37d9de6e36b5b9bd727d4b05075 Mon Sep 17 00:00:00 2001 From: Alasdair Smith Date: Fri, 22 Sep 2017 09:36:50 +0100 Subject: [PATCH 7/7] Be more defensive when checking encoded text --- services/web/public/coffee/ide/editor/Document.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index 887cd53a9a..459f033ac6 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -273,10 +273,10 @@ define [ decodeFromWebsockets = (text) -> decodeURIComponent(escape(text)) try for change in ranges.changes or [] - change.op.i = decodeFromWebsockets(change.op.i) if change.op.i - change.op.d = decodeFromWebsockets(change.op.d) if change.op.d + change.op.i = decodeFromWebsockets(change.op.i) if change.op.i? + change.op.d = decodeFromWebsockets(change.op.d) if change.op.d? for comment in ranges.comments or [] - comment.op.c = decodeFromWebsockets(comment.op.c) + comment.op.c = decodeFromWebsockets(comment.op.c) if comment.op.c? catch err console.log(err)