-
Notifications
You must be signed in to change notification settings - Fork 1
/
proxy.coffee
90 lines (73 loc) · 2.45 KB
/
proxy.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
browserChannel = require('browserchannel').server
connect = require 'connect'
sharedb = require './client'
webserver = connect(
# connect.logger()
connect.static "#{__dirname}"
)
nextId = 1000
opts = {webserver}
webserver.use browserChannel opts, (client) ->
console.log 'BC session established'
server = sharedb()
client.on 'close', ->
console.log 'client closed'
server.close()
server.on 'close', ->
console.log 'server closed'
client.close()
server.on 'error', (e) ->
console.log "server died: #{e}"
client.stop ->
console.log 'xxxx'
client.close()
clientDoc = null
client.on 'message', (data) ->
if data.doc
clientDoc = data.doc
else
data.doc = clientDoc
switch
when data.auth isnt undefined
# Auth (hello)
console.log 'auth'
server.auth()
client.send auth:"#{nextId++}"
when data.open is true
# Open!
opts =
type:data.type,
create:data.create,
snapshot:data.snapshot is null
opts.type = 'text' if opts.type is 'text2'
server.open data.doc, opts
when data.open is false
server.close data.doc
when data.op isnt undefined
# Submit op
server.sendOp data.doc, data.v, data.op
when data.cursor isnt undefined
server.setCursor data.doc, data.v, data.cursor
else
console.log data
server.on 'open', (err, docName, data) ->
return client.send doc:docName, open:false, error:err if err
{v, type, snapshot, ctime, mtime, create} = data
client.send doc:docName, open:true, v:v, snapshot:snapshot, create:create, meta:{ctime, mtime}
server.on 'op', (err, docName, v, op, clientId) ->
console.log 'retransmitting op', doc:docName, v:v-1, op:op
# It doesn't really make sense to get an error here.
throw new Error(err) if err
client.send doc:docName, v:v-1, op:op, meta:{source:clientId}
server.on 'op applied', (err, docName, v) ->
return client.send doc:docName, v:null, error:err if err
# The version in ShareJS is the version at which the op was submitted.
# In contrast, ShareDB acknowledges using the new server version. Hence v-1.
client.send doc:docName, v:v-1
server.on 'cursor', (err, docName, data) ->
if err
client.send doc:docName, cursor:null, error:err
else
client.send doc:docName, cursor:data
webserver.listen 7000
console.log 'Listening on https://localhost:7000/'