Skip to content

Commit 4ebc225

Browse files
author
vivekpala
committed
Code files
1 parent 2e8259b commit 4ebc225

File tree

368 files changed

+74809
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

368 files changed

+74809
-0
lines changed

Chapter 1/fiboapp.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
var http = require('http');
2+
var url = require('url');
3+
4+
var fibonacci = function(n) {
5+
if (n === 1 || n === 2)
6+
return 1;
7+
else
8+
return fibonacci(n-1) + fibonacci(n-2);
9+
}
10+
11+
http.createServer(function (req, res) {
12+
var urlP = url.parse(req.url, true);
13+
var fibo;
14+
res.writeHead(200, {'Content-Type': 'text/plain'});
15+
if (urlP.query['n']) {
16+
fibo = fibonacci(urlP.query['n']);
17+
res.end('Fibonacci '+ urlP.query['n'] +'='+ fibo);
18+
} else {
19+
res.end('USAGE: http://127.0.0.1:8124?n=## where ## is the Fibonacci number desired');
20+
}
21+
}).listen(8124, '127.0.0.1');
22+
console.log('Server running at http://127.0.0.1:8124');
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
version: '2'
2+
services:
3+
4+
db-auth:
5+
build: ../db-auth
6+
container_name: db-auth
7+
networks:
8+
- authnet
9+
volumes:
10+
- db-auth-data:/var/lib/mysql
11+
# - ../db-auth/data:/var/lib/mysql
12+
13+
userauth:
14+
build: ../users
15+
container_name: userauth
16+
networks:
17+
- authnet
18+
- notesauth
19+
expose:
20+
- 3333
21+
depends_on:
22+
- db-auth
23+
restart: on-failure:10
24+
25+
db-notes:
26+
build: ../db-notes
27+
container_name: db-notes
28+
networks:
29+
- frontnet
30+
volumes:
31+
- db-notes-data:/var/lib/mysql
32+
# - ../db-notes/data:/var/lib/mysql
33+
34+
notesapp:
35+
build: ../notes
36+
container_name: notesapp
37+
networks:
38+
- frontnet
39+
- notesauth
40+
expose:
41+
- 3000
42+
ports:
43+
- "3000:3000"
44+
depends_on:
45+
- db-notes
46+
- userauth
47+
restart: on-failure:10
48+
49+
networks:
50+
authnet:
51+
driver: bridge
52+
frontnet:
53+
driver: bridge
54+
notesauth:
55+
driver: bridge
56+
57+
volumes:
58+
db-auth-data:
59+
db-notes-data:

Chapter 10/db-auth/Dockerfile

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
FROM mysql:5.7
2+
3+
ENV MYSQL_RANDOM_ROOT_PASSWORD=yes
4+
ENV MYSQL_DATABASE=userauth
5+
ENV MYSQL_USER=userauth
6+
ENV MYSQL_PASSWORD=userauth
7+
8+
RUN sed -i "s/^#bind-address.*$/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
9+
RUN sed -i "s/^pid-file/# pid-file/" /etc/mysql/my.cnf
10+
RUN sed -i "s/^socket/# socket/" /etc/mysql/my.cnf
11+
12+
VOLUME /var/lib/mysql
13+
14+
EXPOSE 3306
15+
CMD ["mysqld"]

Chapter 10/db-notes/Dockerfile

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
FROM mysql:5.7
2+
3+
ENV MYSQL_RANDOM_ROOT_PASSWORD=yes
4+
ENV MYSQL_DATABASE=notes
5+
ENV MYSQL_USER=notes
6+
ENV MYSQL_PASSWORD=notes
7+
8+
RUN sed -i "s/^#bind-address.*$/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
9+
RUN sed -i "s/^pid-file/# pid-file/" /etc/mysql/my.cnf
10+
RUN sed -i "s/^socket/# socket/" /etc/mysql/my.cnf
11+
12+
VOLUME /var/lib/mysql
13+
14+
EXPOSE 3306
15+
CMD ["mysqld"]

Chapter 10/notes/Dockerfile

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
FROM node:5.9.0
2+
3+
ENV DEBUG="notes:*,messages:*"
4+
ENV SEQUELIZE_CONNECT="models/sequelize-docker-mysql.yaml"
5+
ENV NOTES_MODEL="models/notes-sequelize"
6+
ENV USERS_MODEL="models/users-rest"
7+
ENV USER_SERVICE_URL="http://userauth:3333"
8+
ENV PORT="3000"
9+
ENV NOTES_SESSIONS_DIR="/sessions"
10+
11+
RUN mkdir -p /usr/src/app
12+
COPY . /usr/src/app/
13+
WORKDIR /usr/src/app
14+
RUN apt-get update -y \
15+
&& apt-get -y install curl python build-essential git ca-certificates \
16+
&& npm install --unsafe-perm
17+
18+
VOLUME /sessions
19+
20+
EXPOSE 3000
21+
22+
CMD npm run docker

Chapter 10/notes/app.js

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
#!/usr/bin/env node
2+
3+
'use strict';
4+
5+
const util = require('util');
6+
const express = require('express');
7+
const http = require('http');
8+
const path = require('path');
9+
const fs = require('fs');
10+
const favicon = require('serve-favicon');
11+
const logger = require('morgan');
12+
const FileStreamRotator = require('file-stream-rotator');
13+
const cookieParser = require('cookie-parser');
14+
const bodyParser = require('body-parser');
15+
const session = require('express-session')
16+
const FileStore = require('session-file-store')(session);
17+
const passportSocketIo = require("passport.socketio");
18+
19+
const routes = require('./routes/index');
20+
const users = require('./routes/users');
21+
const notes = require('./routes/notes');
22+
23+
const log = require('debug')('notes:server');
24+
const error = require('debug')('notes:error');
25+
26+
process.on('uncaughtException', function(err) {
27+
error("I've crashed!!! - "+ (err.stack || err));
28+
});
29+
30+
const sessionCookie = 'notes.sid';
31+
const sessionSecret = 'keyboard mouse';
32+
const sessionStore = new FileStore({ path: process.env.NOTES_SESSIONS_DIR ? process.env.NOTES_SESSIONS_DIR : "sessions" });
33+
34+
var app = express();
35+
36+
/**
37+
* Create HTTP server.
38+
*/
39+
40+
var server = http.createServer(app);
41+
var io = require('socket.io')(server);
42+
43+
io.use(passportSocketIo.authorize({
44+
cookieParser: cookieParser,
45+
key: sessionCookie,
46+
secret: sessionSecret,
47+
store: sessionStore
48+
}));
49+
50+
/**
51+
* Get port from environment and store in Express.
52+
*/
53+
54+
var port = normalizePort(process.env.PORT || '3000');
55+
app.set('port', port);
56+
57+
// view engine setup
58+
app.set('views', path.join(__dirname, 'views'));
59+
app.set('view engine', 'ejs');
60+
61+
var accessLogStream;
62+
if (process.env.REQUEST_LOG_FILE) {
63+
var logDirectory = path.dirname(process.env.REQUEST_LOG_FILE);
64+
fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory);
65+
accessLogStream = FileStreamRotator.getStream({
66+
filename: process.env.REQUEST_LOG_FILE,
67+
frequency: 'daily',
68+
verbose: false
69+
});
70+
}
71+
72+
// uncomment after placing your favicon in /public
73+
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
74+
app.use(logger(process.env.REQUEST_LOG_FORMAT || 'dev', {
75+
stream: accessLogStream ? accessLogStream : process.stdout
76+
}));
77+
app.use(bodyParser.json());
78+
app.use(bodyParser.urlencoded({ extended: false }));
79+
app.use(cookieParser());
80+
app.use(express.static(path.join(__dirname, 'public')));
81+
// app.use('/vendor/bootstrap/css', express.static(path.join(__dirname, 'cyborg')));
82+
app.use('/vendor/bootstrap/css', express.static(path.join(__dirname, 'bower_components', 'bootstrap', 'dist', 'css')));
83+
app.use('/vendor/bootstrap/fonts', express.static(path.join(__dirname, 'bower_components', 'bootstrap', 'dist', 'fonts')));
84+
app.use('/vendor/bootstrap/js', express.static(path.join(__dirname, 'bower_components', 'bootstrap', 'dist', 'js')));
85+
app.use('/vendor/jquery', express.static(path.join(__dirname, 'bower_components', 'jquery', 'dist')));
86+
87+
app.use(session({
88+
store: sessionStore,
89+
secret: sessionSecret,
90+
key: sessionCookie,
91+
resave: true,
92+
saveUninitialized: true
93+
}));
94+
95+
users.initPassport(app);
96+
97+
app.use('/', routes);
98+
app.use('/users', users.router);
99+
app.use('/notes', notes);
100+
101+
routes.socketio(io);
102+
notes.socketio(io);
103+
104+
// catch 404 and forward to error handler
105+
app.use(function(req, res, next) {
106+
var err = new Error('Not Found');
107+
err.status = 404;
108+
next(err);
109+
});
110+
111+
// error handlers
112+
113+
// development error handler
114+
// will print stacktrace
115+
if (app.get('env') === 'development') {
116+
app.use(function(err, req, res, next) {
117+
// util.log(err.message);
118+
res.status(err.status || 500);
119+
error((err.status || 500) +' '+ error.message);
120+
res.render('error', {
121+
message: err.message,
122+
error: err
123+
});
124+
});
125+
}
126+
127+
// production error handler
128+
// no stacktraces leaked to user
129+
app.use(function(err, req, res, next) {
130+
// util.log(err.message);
131+
res.status(err.status || 500);
132+
error((err.status || 500) +' '+ error.message);
133+
res.render('error', {
134+
message: err.message,
135+
error: {}
136+
});
137+
});
138+
139+
140+
module.exports = app;
141+
142+
143+
/**
144+
* Listen on provided port, on all network interfaces.
145+
*/
146+
147+
server.listen(port);
148+
server.on('error', onError);
149+
server.on('listening', onListening);
150+
151+
152+
/**
153+
* Normalize a port into a number, string, or false.
154+
*/
155+
156+
function normalizePort(val) {
157+
var port = parseInt(val, 10);
158+
159+
if (isNaN(port)) {
160+
// named pipe
161+
return val;
162+
}
163+
164+
if (port >= 0) {
165+
// port number
166+
return port;
167+
}
168+
169+
return false;
170+
}
171+
172+
/**
173+
* Event listener for HTTP server "error" event.
174+
*/
175+
176+
function onError(error) {
177+
if (error.syscall !== 'listen') {
178+
throw error;
179+
}
180+
181+
var bind = typeof port === 'string'
182+
? 'Pipe ' + port
183+
: 'Port ' + port;
184+
185+
// handle specific listen errors with friendly messages
186+
switch (error.code) {
187+
case 'EACCES':
188+
console.error(bind + ' requires elevated privileges');
189+
process.exit(1);
190+
break;
191+
case 'EADDRINUSE':
192+
console.error(bind + ' is already in use');
193+
process.exit(1);
194+
break;
195+
default:
196+
throw error;
197+
}
198+
}
199+
200+
/**
201+
* Event listener for HTTP server "listening" event.
202+
*/
203+
204+
function onListening() {
205+
var addr = server.address();
206+
var bind = typeof addr === 'string'
207+
? 'pipe ' + addr
208+
: 'port ' + addr.port;
209+
log('Listening on ' + bind);
210+
}

0 commit comments

Comments
 (0)