Skip to content

Commit 73223e2

Browse files
committed
Initial commit
Signed-off-by: Chris Abrams <[email protected]>
0 parents  commit 73223e2

12 files changed

+599
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.DS_Store
2+
node_modules

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#webRTC Video Chat (still working on the peer connection API)
2+
Project that uses node.js, web sockets, and the peer connection API to handle real-time HTML video chat.

config/express.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = function(connect, express, path, server, settings) {
2+
3+
server.configure(function() {
4+
server.set('views', path + '/views');
5+
server.set('view engine', 'jade');
6+
server.set('view options', { layout: false });
7+
server.use(connect.bodyParser());
8+
server.use(connect.static(path + '/public'));
9+
server.use(express.cookieParser());
10+
server.use(express.session({secret: settings.sessionSecret}));
11+
server.use(server.router);
12+
});
13+
14+
server.listen(settings.port, null);
15+
};

config/settings.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
var settings = {
2+
sessionSecret: 'sh44FSFEIPANVPOEANVh5h55h66h7h7x01hhh!',
3+
port: 8081,
4+
debug: (process.env.NODE_ENV !== 'production'),
5+
theme: 'default',
6+
themes: {
7+
default: {
8+
errors: {
9+
notfound: 'themes/default/errors/404'
10+
},
11+
layout: 'themes/default/layout',
12+
index: 'themes/default/index'
13+
}
14+
}
15+
};
16+
17+
settings.uri = 'http://localhost:' + 8081;
18+
19+
if (process.env.NODE_ENV == 'production') {
20+
settings.uri = 'http://videochat.jit.su';
21+
settings.port = process.env.PORT || 80;
22+
}
23+
24+
module.exports = settings;

lib/router.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
module.exports = function(express, server, settings) {
2+
3+
//Show all errors and keep search engines from using robots.txt
4+
server.configure('development', function() {
5+
server.use(express.errorHandler({
6+
'dumpExceptions': true,
7+
'showStack': true
8+
}));
9+
server.all('/robots.txt', function(req,res) {
10+
res.send('User-agent: *\nDisallow: /', {'Content-Type': 'text/plain'});
11+
});
12+
});
13+
14+
//Suppress errors, allow all search engines
15+
server.configure('production', function() {
16+
server.use(express.errorHandler());
17+
server.all('/robots.txt', function(req,res) {
18+
res.send('User-agent: *', {'Content-Type': 'text/plain'});
19+
});
20+
});
21+
22+
server.get('/', function(req, res) {
23+
res.render(settings.themes[settings.theme].index, {
24+
title: 'Index'
25+
});
26+
});
27+
28+
//404
29+
server.get('*', function(req, res) {
30+
if(req.accepts('html')) {
31+
res.status(404);
32+
res.render(settings.themes[settings.theme].errors.notfound, {
33+
title: 'Not Found'
34+
});
35+
}
36+
});
37+
}

lib/sockets.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module.exports = function Server(io, server) {
2+
var socket = io.listen(server);
3+
4+
socket.on('connection', function(socket) {
5+
6+
console.log('Client Connected');
7+
socket.broadcast.emit('connected', {});
8+
9+
socket.on('message', function(data) {
10+
socket.broadcast.emit('server_message', data);
11+
socket.emit('server_message', data);
12+
});
13+
14+
socket.on('disconnect', function() {
15+
console.log('Client Disconnected.');
16+
});
17+
});
18+
19+
return this;
20+
};

package.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"name": "videochat",
3+
"subdomain": "videochat",
4+
"description": "video chatting",
5+
"scripts": {
6+
"start": "node server.js"
7+
},
8+
"version": "0.0.1-6",
9+
"engines": {
10+
"node": "v0.8.x"
11+
},
12+
"authors": [
13+
"Chris Abrams <[email protected]>"
14+
],
15+
"dependencies": {
16+
"connect": "2.4.4",
17+
"express": "https://github.com/chrisabrams/express2/tarball/master",
18+
"jade": "0.27.2",
19+
"moment": "1.7.0",
20+
"mongoose": "3.0.3",
21+
"socket.io": "0.9.10",
22+
"stylus": "0.29.0"
23+
},
24+
"devDependencies": {
25+
"mocha": "1.4.0",
26+
"should": "1.1.0"
27+
}
28+
}

public/app.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var app = new VideoChat;
2+
3+
app.init();

public/index.html

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta http-equiv="X-UA-Compatible" content="chrome=1"/>
5+
<link rel="stylesheet" href="/style.css" />
6+
7+
<!-- type="text/javascript">
8+
(function() {
9+
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
10+
po.src = 'https://apis.google.com/js/plusone.js';
11+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
12+
})();
13+
-->
14+
</head>
15+
<body>
16+
17+
<div id="container">
18+
<div id="card">
19+
<div id="local">
20+
<video width="100%" height="100%" id="localVideo" autoplay="autoplay"/>
21+
</div>
22+
<div id="remote">
23+
<video width="100%" height="100%" id="remoteVideo" autoplay="autoplay">
24+
</video>
25+
<div id="mini">
26+
<video width="100%" height="100%" id="miniVideo" autoplay="autoplay" />
27+
</div>
28+
</div>
29+
</div>
30+
<div id="footer">
31+
</div>
32+
</div>
33+
<script src="/socket.io/socket.io.js"></script>
34+
<script src="/videochat.js"></script>
35+
<script src="/app.js"></script>
36+
</body>
37+
</html>

public/style.css

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
/* http://meyerweb.com/eric/tools/css/reset/
2+
v2.0 | 20110126
3+
License: none (public domain)
4+
*/
5+
6+
html, body, div, span, applet, object, iframe,
7+
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
8+
a, abbr, acronym, address, big, cite, code,
9+
del, dfn, em, img, ins, kbd, q, s, samp,
10+
small, strike, strong, sub, sup, tt, var,
11+
b, u, i, center,
12+
dl, dt, dd, ol, ul, li,
13+
fieldset, form, label, legend,
14+
table, caption, tbody, tfoot, thead, tr, th, td,
15+
article, aside, canvas, details, embed,
16+
figure, figcaption, footer, header, hgroup,
17+
menu, nav, output, ruby, section, summary,
18+
time, mark, audio, video {
19+
margin: 0;
20+
padding: 0;
21+
border: 0;
22+
font-size: 100%;
23+
font: inherit;
24+
vertical-align: baseline;
25+
}
26+
/* HTML5 display-role reset for older browsers */
27+
article, aside, details, figcaption, figure,
28+
footer, header, hgroup, menu, nav, section {
29+
display: block;
30+
}
31+
body {
32+
line-height: 1;
33+
}
34+
ol, ul, li {
35+
list-style: none;
36+
}
37+
blockquote, q {
38+
quotes: none;
39+
}
40+
blockquote:before, blockquote:after,
41+
q:before, q:after {
42+
content: '';
43+
content: none;
44+
}
45+
table {
46+
border-collapse: collapse;
47+
border-spacing: 0;
48+
}
49+
50+
body {
51+
background-color: #000;
52+
}
53+
54+
a:link { color: #ffffff; }
55+
a:visited {color: #ffffff; }
56+
html, body {
57+
background-color: #000000;
58+
height: 100%;
59+
font-family:Verdana, Arial, Helvetica, sans-serif;
60+
}
61+
body {
62+
margin: 0;
63+
padding: 0;
64+
}
65+
#container {
66+
position: relative;
67+
min-height: 100%;
68+
width: 100%;
69+
margin: 0px auto;
70+
-webkit-perspective: 1000;
71+
}
72+
#card {
73+
-webkit-transition-property: rotation;
74+
-webkit-transition-duration: 2s;
75+
}
76+
#local {
77+
position: absolute;
78+
width: 100%;
79+
-webkit-transform: scale(-1, 1);
80+
-webkit-backface-visibility: hidden;
81+
}
82+
#remote {
83+
position: absolute;
84+
width: 100%;
85+
-webkit-transform: rotateY(180deg);
86+
-webkit-backface-visibility: hidden;
87+
}
88+
#mini {
89+
position: absolute;
90+
height: 30%;
91+
width: 30%;
92+
bottom: 32px;
93+
right: 4px;
94+
-webkit-transform: scale(-1, 1);
95+
opacity: 1.0;
96+
//-webkit-transform: rotateY(180deg);
97+
//-webkit-backface-visibility: hidden;
98+
}
99+
#localVideo {
100+
opacity: 0;
101+
-webkit-transition-property: opacity;
102+
-webkit-transition-duration: 2s;
103+
}
104+
#remoteVideo {
105+
opacity: 0;
106+
-webkit-transition-property: opacity;
107+
-webkit-transition-duration: 2s;
108+
}
109+
#miniVideo {
110+
opacity: 0;
111+
-webkit-transition-property: opacity;
112+
-webkit-transition-duration: 2s;
113+
}
114+
#footer {
115+
spacing: 4px;
116+
position: absolute;
117+
bottom: 0;
118+
width: 100%;
119+
height: 28px;
120+
background-color: #3F3F3F;
121+
color: rgb(255, 255, 255);
122+
font-size:13px; font-weight: bold;
123+
line-height: 28px;
124+
text-align: center;
125+
}
126+
#hangup {
127+
font-size:13px; font-weight:bold;
128+
color:#FFFFFF;
129+
width:128px;
130+
height:24px;
131+
background-color:#808080;
132+
border-style:solid;
133+
border-color:#FFFFFF;
134+
margin:2px;
135+
}
136+
#logo {
137+
display: block;
138+
top:4;
139+
right:4;
140+
position:absolute;
141+
float:right;
142+
opacity: 0.5;
143+
}

0 commit comments

Comments
 (0)