forked from creationix/candor.io
/
net.can
85 lines (76 loc) · 1.79 KB
/
net.can
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
print = global.print
p = global.prettyPrint
require = global.require
throw = (err) {
p(err)
global.exit()
}
// Used to emit on errors when libuv badness happens
check = (status) {
if (status) {
throw(require('uv').lastError())
}
}
Tcp = require('tcp')
StreamPrototype = {}
StreamPrototype.pipe = (self, stream) {
self.onData = (chunk) {
stream:write(chunk)
}
self.onEnd = () {
stream:end()
}
}
ClientPrototype = new StreamPrototype
ClientPrototype.write = (self, chunk, callback) {
check(self.socket:write(chunk, callback))
}
ClientPrototype.end = (self) {
check(self.socket:shutdown((status) {
check(status)
self.socket:close()
}))
}
ServerPrototype = {}
ServerPrototype.listen = (self, port, host, callback) {
p(self, port, host, callback)
if (!host) host = "0.0.0.0"
print("bind", host, port)
check(self.socket:bind(host, port))
check(self.listen(128, (status) {
check(status)
client = new ClientPrototype
client.socket = socket
socket = Tcp.create()
check(self.socket:accept(socket))
self.onConnection(client)
check(socket:readStart((nread, chunk) {
if (nread == -1) {
err = require('uv').lastError()
if (err.name == "EOF") {
client.onEnd()
} else {
throw(err)
}
return
}
if (nread > 0) {
client.onData(chunk)
return
}
}))
}))
}
createServer = function (onConnection) {
server = new ServerPrototype
socket = Tcp.create()
server.socket = socket
server.onConnection = onConnection
return server
}
////////////////////////////////////////////////////////////////////////////////
// Make an echo server using the API
createServer((client) {
client:pipe(client)
}):listen(8080)
print("TCP echo server listening on port 8080")