-
-
Notifications
You must be signed in to change notification settings - Fork 207
Expand file tree
/
Copy pathindex.js
More file actions
105 lines (86 loc) · 2.27 KB
/
Copy pathindex.js
File metadata and controls
105 lines (86 loc) · 2.27 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import map from 'lib0/dist/map.cjs'
import WebSocket from 'ws'
import { createServer } from 'http'
import SharedDocument from './SharedDocument.js'
import Connection from './Connection.js'
class Server {
configuration = {
debounce: true,
port: 8080,
timeout: 30000,
}
httpServer
websocketServer
documents = new Map()
/**
* Initialize
*/
constructor() {
this.httpServer = createServer((request, response) => {
response.writeHead(200, { 'Content-Type': 'text/plain' })
response.end('OK')
})
this.websocketServer = new WebSocket.Server({
server: this.httpServer,
})
this.websocketServer.on('connection', (connection, request) => {
console.log(`New connection to ${request.url}`)
return this.createConnection(connection, request, this.createDocument(request))
})
}
/**
* Configure the server
* @param configuration
* @returns {Server}
*/
create(configuration) {
this.configuration = {
...this.configuration,
...configuration,
}
return this
}
/**
* Start the server
*/
listen() {
this.httpServer.listen(this.configuration.port, () => {
console.log(`Listening on http://127.0.0.1:${this.configuration.port}`)
})
}
/**
* Create a new document by the given request
* @param request
* @private
*/
createDocument(request) {
const documentName = request.url.slice(1).split('?')[0]
return map.setIfUndefined(this.documents, documentName, () => {
const document = new SharedDocument(documentName)
// TODO: persistence
// if (persistence !== null) {
// persistence.bindState(docname, doc)
// }
this.documents.set(documentName, document)
return document
})
}
/**
*
* @param connection
* @param request
* @param document
* @returns {Connection}
* @private
*/
createConnection(connection, request, document) {
return new Connection(connection, request, document, this.configuration.timeout)
.onClose(document => {
// TODO: Document should only be deleted, when it’s persisted
if (document.connections.size === 0) {
this.documents.delete(document.name)
}
})
}
}
export const CollaborationServer = new Server()