forked from jamesshore/lets_code_javascript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
86 lines (70 loc) · 2.9 KB
/
Copy pathserver.js
File metadata and controls
86 lines (70 loc) · 2.9 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
// Copyright (c) 2012 Titanium I.T. LLC. All rights reserved. See LICENSE.txt for details.
(function() {
"use strict";
var http = require("http");
var fs = require("fs");
var send = require("send");
var io = require('socket.io');
var ServerPointerEvent = require("../shared/server_pointer_event.js");
var ClientPointerEvent = require("../shared/client_pointer_event.js");
var ServerDrawEvent = require("../shared/server_draw_event.js");
var ClientDrawEvent = require("../shared/client_draw_event.js");
var ServerClearScreenEvent = require("../shared/server_clear_screen_event.js");
var ClientClearScreenEvent = require("../shared/client_clear_screen_event.js");
var Server = module.exports = function Server() {};
Server.prototype.start = function(contentDir, notFoundPageToServe, portNumber, callback) {
if (!portNumber) throw "port number is required";
this._httpServer = http.createServer();
handleHttpRequests(this._httpServer, contentDir, notFoundPageToServe);
this._ioServer = io(this._httpServer);
handleSocketIoEvents(this._ioServer);
this._httpServer.listen(portNumber, callback);
};
Server.prototype.stop = function(callback) {
if (this._httpServer === undefined) return callback(new Error("stop() called before server started"));
this._httpServer.close(callback);
};
function handleHttpRequests(httpServer, contentDir, notFoundPageToServe) {
httpServer.on("request", function(request, response) {
send(request, request.url, { root: contentDir }).on("error", handleError).pipe(response);
function handleError(err) {
if (err.status === 404) serveErrorFile(response, 404, contentDir + "/" + notFoundPageToServe);
else throw err;
}
});
}
function handleSocketIoEvents(ioServer) {
ioServer.on("connect", function(socket) {
reflectClientEventsWithId(socket);
reflectClientEventsWithoutId(socket);
});
}
function reflectClientEventsWithId(socket) {
socket.on(ClientPointerEvent.EVENT_NAME, function(eventData) {
var clientEvent = ClientPointerEvent.fromSerializableObject(eventData);
var serverEvent = clientEvent.toServerEvent(socket.id);
socket.broadcast.emit(ServerPointerEvent.EVENT_NAME, serverEvent.toSerializableObject());
});
}
function reflectClientEventsWithoutId(socket) {
var supportedEvents = [
ClientDrawEvent,
ClientClearScreenEvent
];
supportedEvents.forEach(function(eventConstructor) {
socket.on(eventConstructor.EVENT_NAME, function(eventData) {
var clientEvent = eventConstructor.fromSerializableObject(eventData);
var serverEvent = clientEvent.toServerEvent();
socket.broadcast.emit(serverEvent.name(), serverEvent.toSerializableObject());
});
});
}
function serveErrorFile(response, statusCode, file) {
response.statusCode = statusCode;
response.setHeader("Content-Type", "text/html; charset=UTF-8");
fs.readFile(file, function(err, data) {
if (err) throw err;
response.end(data);
});
}
}());