From d283834978db49ee0ca1fcbf48ddc43d3ea06750 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Thu, 20 Jun 2013 10:47:41 -0700 Subject: [PATCH] Add initial document sharing over peerJS connection --- package.json | 2 + .../collaboration/lib/collaboration.coffee | 54 +++++++++++++++---- src/packages/collaboration/lib/prompt.coffee | 33 ++++++++++++ 3 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 src/packages/collaboration/lib/prompt.coffee diff --git a/package.json b/package.json index f642e2952..039077a40 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,8 @@ "season": "0.10.0", "humanize-plus": "1.1.0", "semver": "1.1.4", + "guid": "0.0.10", + "telepath": "git://github.com/atom/telepath.git", "c-tmbundle": "1.0.0", "coffee-script-tmbundle": "2.0.0", "css-tmbundle": "1.0.0", diff --git a/src/packages/collaboration/lib/collaboration.coffee b/src/packages/collaboration/lib/collaboration.coffee index cba73f015..56a548468 100644 --- a/src/packages/collaboration/lib/collaboration.coffee +++ b/src/packages/collaboration/lib/collaboration.coffee @@ -1,15 +1,51 @@ Peer = require './peer' +Guid = require 'guid' +Prompt = require './prompt' +{createSite, Document} = require 'telepath' -createConnection = -> - peer = new Peer('some-id1', {host: 'ec2-54-218-51-127.us-west-2.compute.amazonaws.com', port: 8080}) +peerJsSettings = + host: 'ec2-54-218-51-127.us-west-2.compute.amazonaws.com' + port: 8080 + +wireDocumentEvents = (connection, sharedDocument) -> + sharedDocument.outputEvents.on 'changed', (event) -> + console.log 'sending event', event + connection.send(event) + + connection.on 'data', (event) -> + console.log 'receiving event', event + sharedDocument.handleInputEvent(event) + +startSession = -> + id = Guid.create().toString() + peer = new Peer(id, peerJsSettings) + sharedDocument = Document.fromObject(createSite(id), {a: 1, b: 2, c: 3}) + window.doc = sharedDocument peer.on 'connection', (connection) -> - console.log 'connection' - connection.on 'data', (data) -> - console.log('Got data:', data) + connection.on 'open', -> + console.log 'sending document', sharedDocument.serialize() + connection.send(sharedDocument.serialize()) + wireDocumentEvents(connection, sharedDocument) + id + +joinSession = (id) -> + siteId = Guid.create().toString() + peer = new Peer(siteId, peerJsSettings) + connection = peer.connect(id) + connection.on 'open', -> + console.log 'connection opened' + connection.once 'data', (data) -> + console.log 'received data', data + sharedDocument = Document.deserialize(createSite(siteId), data) + window.doc = sharedDocument + console.log 'received document', sharedDocument.toObject() + wireDocumentEvents(connection, sharedDocument) module.exports = activate: -> - createConnection() - peer = new Peer('some-id2', {host: 'ec2-54-218-51-127.us-west-2.compute.amazonaws.com', port: 8080}) - c2 = peer.connect('some-id1') - c2.on 'open', -> c2.send('test?') + rootView.command 'collaboration:start-session', -> + pasteboard.write(startSession()) + + rootView.command 'collaboration:join-session', -> + new Prompt 'Enter a session id to join', (id) -> + joinSession(id) diff --git a/src/packages/collaboration/lib/prompt.coffee b/src/packages/collaboration/lib/prompt.coffee new file mode 100644 index 000000000..afb07c537 --- /dev/null +++ b/src/packages/collaboration/lib/prompt.coffee @@ -0,0 +1,33 @@ +{View} = require 'space-pen' +Editor = require 'editor' +$ = require 'jquery' +Point = require 'point' +_ = require 'underscore' + +module.exports = +class Prompt extends View + @activate: -> new Prompt + + @content: ({message}) -> + @div class: 'overlay from-top mini', => + @subview 'miniEditor', new Editor(mini: true) + @div class: 'message', outlet: 'message', message + + initialize: (message, @confirmed) -> + @miniEditor.on 'focusout', => @remove() + @on 'core:confirm', => @confirm() + @on 'core:cancel', => @remove() + @attach() + + beforeRemove: -> + @previouslyFocusedElement?.focus() + @miniEditor.setText('') + + confirm: -> + @confirmed(@miniEditor.getText()) + @remove() + + attach: -> + @previouslyFocusedElement = $(':focus') + rootView.append(this) + @miniEditor.focus()