Skip to content

Commit b9cea73

Browse files
committed
first draft
1 parent d6571cc commit b9cea73

File tree

8 files changed

+395
-0
lines changed

8 files changed

+395
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
.DS_Store
2+
13
# Logs
24
logs
35
*.log

.travis.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
language: node_js
2+
node_js:
3+
- 0.10
4+
- 0.8
5+
before_install:
6+
- npm install [email protected] -g
7+
matrix:
8+
fast_finish: true
9+
allow_failures:
10+
- node_js: "0.11"

README.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,46 @@
11
# create-stream-server
2+
3+
**create multiple stream servers easily**
4+
5+
## Example
6+
7+
```js
8+
var css = require('create-stream-server');
9+
10+
var servers = css({
11+
s1: 'tcp://localhost:8080',
12+
s2: 'ssl://0.0.0.0:80',
13+
s3: {
14+
protocol: 'wss',
15+
host: 'localhost',
16+
port: 8888,
17+
ssl: {
18+
key: fs.readFileSync('./wss_server.key'),
19+
cert: fs.readFileSync('./wss_server.crt')
20+
}
21+
}
22+
}, {
23+
ssl: {
24+
key: fs.readFileSync('./server.key'),
25+
cert: fs.readFileSync('./server.crt')
26+
}
27+
}, function(clientStream, server){
28+
// handle the connected client as a stream
29+
});
30+
31+
// to start
32+
servers.listen(function(){
33+
console.log('launched!');
34+
});
35+
36+
// after some time
37+
servers.close(function(){
38+
console.log('done!');
39+
});
40+
41+
// to release all resources
42+
servers.destroy(function(){
43+
console.log('all gone!');
44+
});
45+
```
46+

index.js

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
var net = require('net');
2+
var tls = require('tls');
3+
var http = require('http');
4+
var https = require('https');
5+
var ws = require('ws');
6+
var _ = require('underscore');
7+
var url = require('url');
8+
var wsStream = require('websocket-stream');
9+
var async = require('async');
10+
var enableDestroy = require('server-destroy');
11+
12+
function createServer(clientHandler) {
13+
return net.createServer(function(client){
14+
clientHandler(client);
15+
});
16+
}
17+
18+
function createSecureServer(sslOptions, clientHandler){
19+
return tls.createServer(sslOptions, function(client){
20+
clientHandler(client);
21+
});
22+
}
23+
24+
function attachServer(server, clientHandler) {
25+
(new ws.Server({
26+
server: server
27+
})).on('connection', function(ws) {
28+
clientHandler(wsStream(ws));
29+
});
30+
}
31+
32+
function createWebSocketServer(clientHandler){
33+
var server = http.createServer();
34+
attachServer(server, clientHandler);
35+
return server;
36+
}
37+
38+
function createSecureWebSocketServer(sslOptions, clientHandler){
39+
var server = https.createServer(sslOptions);
40+
attachServer(server, clientHandler);
41+
return server;
42+
}
43+
44+
module.exports = function(serverConfig, sharedConfig, clientStreamHandler){
45+
if(typeof sharedConfig == 'function') {
46+
clientStreamHandler = sharedConfig;
47+
sharedConfig = {};
48+
}
49+
50+
if(typeof sharedConfig != 'object') {
51+
sharedConfig = {};
52+
}
53+
54+
var servers = {};
55+
56+
_.each(serverConfig, function(config, id){
57+
if(typeof config == 'string') {
58+
var c = url.parse(config);
59+
config = {
60+
protocol: c.protocol.replace(/:$/, ''),
61+
port: c.port,
62+
host: c.hostname
63+
};
64+
}
65+
66+
config = _.defaults(config, sharedConfig, {
67+
host: 'localhost'
68+
});
69+
70+
var server;
71+
72+
if(config.protocol == 'tcp') {
73+
server = createServer(clientStreamHandler);
74+
} else if(config.protocol == 'ssl') {
75+
server = createSecureServer(config.ssl, clientStreamHandler);
76+
} else if(config.protocol == 'ws') {
77+
server = createWebSocketServer(clientStreamHandler);
78+
} else if(config.protocol == 'wss') {
79+
server = createSecureWebSocketServer(config.ssl, clientStreamHandler);
80+
}
81+
82+
server._host = config.host;
83+
server._port = config.port;
84+
85+
servers[id] = server;
86+
});
87+
88+
return {
89+
servers: servers,
90+
listen: function(callback){
91+
async.series(_.map(servers, function(server){
92+
return function(cb){
93+
server.listen(server._port, server._host, function(){
94+
enableDestroy(server);
95+
cb();
96+
});
97+
}
98+
}), callback);
99+
},
100+
close: function(cb){
101+
async.series(_.map(servers, function(server){
102+
return server.close.bind(server);
103+
}), cb);
104+
},
105+
destroy: function(cb){
106+
async.series(_.map(servers, function(server){
107+
return server.destroy.bind(server);
108+
}), cb);
109+
}
110+
};
111+
};

package.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"name": "create-stream-server",
3+
"version": "0.0.1",
4+
"description": "create multiple stream servers easily",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "./node_modules/.bin/mocha --reporter list *.js"
8+
},
9+
"repository": {
10+
"type": "git",
11+
"url": "https://github.com/mqttjs/create-stream-server.git"
12+
},
13+
"author": "Joël Gähwiler <[email protected]>",
14+
"license": "MIT",
15+
"bugs": {
16+
"url": "https://github.com/mqttjs/create-stream-server/issues"
17+
},
18+
"homepage": "https://github.com/mqttjs/create-stream-server",
19+
"dependencies": {
20+
"async": "0.9.0",
21+
"server-destroy": "1.0.0",
22+
"underscore": "1.7.0",
23+
"websocket-stream": "1.3.2",
24+
"ws": "0.7.0"
25+
},
26+
"devDependencies": {
27+
"mocha": "2.1.0"
28+
}
29+
}

support/server.crt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDLDCCAhQCCQD0OFi+lx3bpjANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJD
3+
SDEPMA0GA1UECBMGWnVyaWNoMQ8wDQYDVQQHEwZadXJpY2gxEjAQBgNVBAoTCXNo
4+
aWZ0ci5pbzETMBEGA1UEAxMKbWVrb25nLmRldjAeFw0xNDEyMjgxMTMzNTdaFw0x
5+
NTEyMjgxMTMzNTdaMFgxCzAJBgNVBAYTAkNIMQ8wDQYDVQQIEwZadXJpY2gxDzAN
6+
BgNVBAcTBlp1cmljaDESMBAGA1UEChMJc2hpZnRyLmlvMRMwEQYDVQQDEwptZWtv
7+
bmcuZGV2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyqZScnDkk3lc
8+
h9MG00RlpD+U0jvGDGGykHi19J0bUZY+GmwCXHEdHqE2GuJDWEQcaB5RVBU5UOBd
9+
KqBcQ5AhU8HWoL3txO9+Z+E7JzchDHPhabBtwTNDD5TKcL9XcrYd3Al7FpGARsDd
10+
H8U3AC4i6srtUZb37lILQeD628qw5gL2OWL4noOr9Eszek63zURZhQQZ4aZqTi3W
11+
2EU4brYSEy1ZW0WhkSYGm8gpeCC8f8gmufPFyalMwVPXLjNVJnD9EdWVyhmtiEYG
12+
Q5iJweFaiQwIuFvYC5jxeVAji86UFV/pE5qZ/ffZHgRMBwdoNh8TZiFMV/psRv6C
13+
6JuKBeBauwIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQCgQTneRLx35T1XcEbKvqZq
14+
DGZnB+cVH7D5VGUGwOlWhVrxxRfurR3Yrcb4mUCqu6EjUrWXhauczsAdoXqrrzRY
15+
YyR9CbarAm6f80xj+aSINBm/lLZJ/GJd7XhrOUTbM3VIIHUGF3MbAP7a16t2aYsf
16+
IDa2U1GXllJfMBWyFbn53AH6Lf85fLbcmg47K1ffx+4Baw+IzIsVGuvzHG73TCA9
17+
R1/ygrIDABAXw/919zOe2vsF+BKIWZiDIeTPVxzM4M8gTuoky2ecHBBjVyAS2yXS
18+
73mi7srYyxs+7iCmixn2csZUpSnrYmJE61CDPgMtmQSt3cXnyldq6gDzefiCnZdR
19+
-----END CERTIFICATE-----

support/server.key

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEoAIBAAKCAQEAyqZScnDkk3lch9MG00RlpD+U0jvGDGGykHi19J0bUZY+GmwC
3+
XHEdHqE2GuJDWEQcaB5RVBU5UOBdKqBcQ5AhU8HWoL3txO9+Z+E7JzchDHPhabBt
4+
wTNDD5TKcL9XcrYd3Al7FpGARsDdH8U3AC4i6srtUZb37lILQeD628qw5gL2OWL4
5+
noOr9Eszek63zURZhQQZ4aZqTi3W2EU4brYSEy1ZW0WhkSYGm8gpeCC8f8gmufPF
6+
yalMwVPXLjNVJnD9EdWVyhmtiEYGQ5iJweFaiQwIuFvYC5jxeVAji86UFV/pE5qZ
7+
/ffZHgRMBwdoNh8TZiFMV/psRv6C6JuKBeBauwIDAQABAoIBAFGneNsiAAgoQ497
8+
CWoBSk9HS0j2ytNcXl32NaLt1v8l4bo1wTHMZiZcYPeuKeKb9zJA3RZbQvACp6ew
9+
W9zha3xbQ4cbYH4U3kMvLu2bOhbRbodujprlc+UIWBXcE3lmRlvN+ina0OwxdCgE
10+
CChrbqhawgs5IIeHyX9vDsWXQ3Y6DbzjC4OREUHZHTxx7KArheuqF86Wb40YMUQv
11+
un/dHyf7Bl/LoS7EmKk2Y3ldUSI9sMCroiVXx9shQ8IIOeAGrPtZdITCrlZOn9f2
12+
SQwHi+kVfQ73/rNcjgEXH8VKMOgWCyLv67WbP4ICVGIB+/OBnAZHVzbbNQuNI1AS
13+
T/mkmjkCgYEA5AH1yQBKqzjQgkPXA3bZWv1KW6yAnal9Jpicnl++UFSvlFZ054ax
14+
42MA1p/HfVq/gYvmEUROyIT1CHQ502CH/BmFpCj2JCMWNSxs4x6FBxdln8wmMj/6
15+
nVT3Ckcl6jRneoaer9iQ9TqEgmm8v+UXiuv8lRlUMf0jvm7lWcIMhi0CgYEA44dj
16+
VSYaehZwLsTqYPl57rUEhWHTqEs7lhllFVYeYQ0Z9lr4LGbc4aQa1Y6dc51zGXhs
17+
24MTe9dh8xjTJaeKvrzSvfJO3qXeQZ4OoDUrGS8m/Dv+c3BwrxQyKFu92AzvXYwD
18+
mJT+mz78nlhU8ZKE9EA3QaPa0h1k7vHPPQhsnYcCgYBKXllMtkukjWN1GauH9bvv
19+
ca5POHS6+A1aCW0MOy5YBUc/mvOGkOh0wlYDqxnmSTMtjfP8rcsEnFlP6Jjz2QiB
20+
sdFlOfcO0mLr9RGPAuVg6sC63luXCEc2CgCJ2asEOROHY2Fe+cROOEgAQXzPGmoT
21+
ZeV8vEY6B9cgxgsIu8JaAQKBgFOFKkBiaUuxmuKAJC0OxuSKDCvOGjznyOqzTbjE
22+
UQh9H6+f+wOJisFFVRhZbpC3Fj4eR49YkTlfebQbw75JvxN/CrjxDmSKbIiXtXS3
23+
r6dh+KSUfTXw61xJRJQuAQUi0mb7c4J6BvAD8gVKFXxLtYRXYjE1Laj9Y0SW/OTB
24+
h+VXAn88nRH/8k/9Xs1zHXHnEyvC5SJCBm9G+FR2RfueqygMWmsSzr2nE78bWDuj
25+
sHvrdW39qyciTYZSNJNrmdYIwqkbvWj8rIqPqQ6dloRpQHNupYPrF93IJxg6UWPU
26+
JvpC/dEKzLT+btYlgKExz6hgk15pqTHfcqgG7859aBIEMyip
27+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)