diff --git a/.dockerignore b/.dockerignore index 31e9137..2021696 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,53 +1,4 @@ -# Logs -log -logs -*.log -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git -node_modules - -# OSX .DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -ehthumbs.db -Thumbs.db -.AppleDouble -.LSOverride -Icon - -# Java -*.class - -# Git -.git - -# FilePizza -src +node_modules +dist resources -log -*.pem diff --git a/.gitignore b/.gitignore index f0eda12..8d67a86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,39 +1,3 @@ -# Logs -log -logs -*.log - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# Commenting this out is preferred by some people, see -# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- -node_modules/* - -# Users Environment Variables -.lock-wscript - -# Compiled assets +.DS_Store +node_modules dist -css/index.css - -# New Relic -newrelic.js - -# SSL Keys -*.pem diff --git a/Dockerfile b/Dockerfile index 3e288c3..a63a7b1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,9 @@ FROM node:latest -MAINTAINER Alex Kern +MAINTAINER Alex Kern -# install -RUN mkdir -p /filepizza -WORKDIR /filepizza -COPY package.json Makefile ./ -RUN make install COPY . ./ +RUN npm install && npm run build -# run ENV NODE_ENV production EXPOSE 80 -CMD ./dist/index.js +CMD node ./dist/index.js diff --git a/Makefile b/Makefile deleted file mode 100644 index 0999223..0000000 --- a/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -# ============================================================================== -# config - -.PHONY: all build clean install push run - -all: run - -WATCH ?= false -TAG ?= latest - -# ============================================================================== -# phony targets - -build: - ./node_modules/.bin/babel src --ignore __tests__,__mocks__ --out-dir dist - ./node_modules/.bin/webpack --optimize-minimize ./src/client - docker build -t kern/filepizza:$(TAG) . - -clean: - @ rm -rf node_modules - @ rm -rf dist - -install: - npm install - -push: build - docker push kern/filepizza:$(TAG) - -run: | node_modules - @ if [ "$(WATCH)" = false ]; then \ - ./node_modules/.bin/babel-node src; \ - else \ - ./node_modules/.bin/nodemon ./node_modules/.bin/babel-node -i dist src; \ - fi - -# ============================================================================== -# file targets - -node_modules: - npm install diff --git a/README.md b/README.md index b62bb27..fc016d5 100644 --- a/README.md +++ b/README.md @@ -15,30 +15,26 @@ A hosted instance of FilePizza is available at [file.pizza](http://file.pizza). The recommended way to deploy FilePizza is as a [Docker container](https://hub.docker.com/r/kern/filepizza). -You can also install FilePizza via the command-line: + $ docker run -p 8080:8080 -e PORT=8080 -it kern/filepizza:latest - $ npm install filepizza -g - $ filepizza +You can also use [zeit/now](https://zeit.co/now): -You can specify the port that FilePizza's HTTP server uses by setting the `PORT` environment variable (default 3000): + $ now --npm --public -e NODE_ENV=production - $ env PORT=8080 filepizza - -If you'd like to use [Twilio's STUN/TURN service](https://www.twilio.com/stun-turn) for better connectivity behind NATs, you can specify your SID and token like so: - - $ env TWILIO_SID=abcdef TWILIO_TOKEN=ghijkl filepizza +If you'd like to use [Twilio's STUN/TURN service](https://www.twilio.com/stun-turn) for better connectivity behind NATs, you can specify your SID and token using the `TWILIO_SID` and `TWILIO_TOKEN` environment variables, respectively. ## Development $ git clone https://github.com/kern/filepizza.git $ npm install - $ npm run watch + $ npm build + $ npm start FilePizza is an isomorphic React application which uses the Flux application architecture. ES6 features are used liberally and compiled using Babel. Views are rendered on the server, store data is serialized and sent to the client, which then picks up where the server left off. Both client and server JavaScript files can be found in `lib/`. `lib/server.js` and `lib/client.js` are the server and client entrypoints, respectively. `lib/components/`, `lib/stores/`, and `lib/actions/` contain the corresponding Flux modules, implemented using [alt](https://github.com/goatslacker/alt). `lib/routes.js` serves as the isomorphic routes file using [react-router](https://github.com/rackt/react-router). -Stylesheets are automatically compiled using Stylus and are available at `/css`. Client-side JavaScript is compiled using Browserify and is available at `/js`. +Client-side JavaScript and CSS are compiled using webpack and are available at `/app.js`. ## FAQ diff --git a/src/actions/DownloadActions.js b/lib/actions/DownloadActions.js similarity index 100% rename from src/actions/DownloadActions.js rename to lib/actions/DownloadActions.js diff --git a/src/actions/SupportActions.js b/lib/actions/SupportActions.js similarity index 100% rename from src/actions/SupportActions.js rename to lib/actions/SupportActions.js diff --git a/src/actions/UploadActions.js b/lib/actions/UploadActions.js similarity index 100% rename from src/actions/UploadActions.js rename to lib/actions/UploadActions.js diff --git a/src/alt.js b/lib/alt.js similarity index 100% rename from src/alt.js rename to lib/alt.js diff --git a/lib/client.js b/lib/client.js new file mode 100644 index 0000000..6bff7ff --- /dev/null +++ b/lib/client.js @@ -0,0 +1,22 @@ +import "babel-polyfill"; +import "./index.styl"; +import React from "react"; +import ReactRouter from "react-router"; +import routes from "./routes"; +import alt from "./alt"; +import webrtcSupport from "webrtcsupport"; +import SupportActions from "./actions/SupportActions"; + +let bootstrap = document.getElementById("bootstrap").innerHTML; +alt.bootstrap(bootstrap); + +window.FilePizza = () => { + ReactRouter.run(routes, ReactRouter.HistoryLocation, function(Handler) { + React.render(, document); + }); + + if (!webrtcSupport.support) SupportActions.noSupport(); + + let isChrome = navigator.userAgent.toLowerCase().indexOf("chrome") > -1; + if (isChrome) SupportActions.isChrome(); +}; diff --git a/lib/components/App.js b/lib/components/App.js new file mode 100644 index 0000000..daabd7a --- /dev/null +++ b/lib/components/App.js @@ -0,0 +1,97 @@ +import Bootstrap from "./Bootstrap"; +import ErrorPage from "./ErrorPage"; +import FrozenHead from "react-frozenhead"; +import React from "react"; +import SupportStore from "../stores/SupportStore"; +import { RouteHandler } from "react-router"; +import ga from "react-google-analytics"; + +ga("create", "UA-62785624-1", "auto"); +ga("send", "pageview"); + +export default class App extends React.Component { + constructor() { + super(); + this.state = SupportStore.getState(); + + this._onChange = () => { + this.setState(SupportStore.getState()); + }; + } + + componentDidMount() { + SupportStore.listen(this._onChange); + } + + componentWillUnmount() { + SupportStore.unlisten(this._onChange); + } + + render() { + return ( + + + + + + + + + FilePizza - Your files, delivered. + + + + + + + ); + } +} diff --git a/src/components/Bootstrap.js b/lib/components/Bootstrap.js similarity index 100% rename from src/components/Bootstrap.js rename to lib/components/Bootstrap.js diff --git a/src/components/ChromeNotice.js b/lib/components/ChromeNotice.js similarity index 100% rename from src/components/ChromeNotice.js rename to lib/components/ChromeNotice.js diff --git a/src/components/DownloadButton.js b/lib/components/DownloadButton.js similarity index 100% rename from src/components/DownloadButton.js rename to lib/components/DownloadButton.js diff --git a/src/components/DownloadPage.js b/lib/components/DownloadPage.js similarity index 100% rename from src/components/DownloadPage.js rename to lib/components/DownloadPage.js diff --git a/src/components/DropZone.js b/lib/components/DropZone.js similarity index 100% rename from src/components/DropZone.js rename to lib/components/DropZone.js diff --git a/src/components/ErrorPage.js b/lib/components/ErrorPage.js similarity index 100% rename from src/components/ErrorPage.js rename to lib/components/ErrorPage.js diff --git a/src/components/ProgressBar.js b/lib/components/ProgressBar.js similarity index 100% rename from src/components/ProgressBar.js rename to lib/components/ProgressBar.js diff --git a/src/components/Spinner.js b/lib/components/Spinner.js similarity index 100% rename from src/components/Spinner.js rename to lib/components/Spinner.js diff --git a/src/components/Tempalink.js b/lib/components/Tempalink.js similarity index 100% rename from src/components/Tempalink.js rename to lib/components/Tempalink.js diff --git a/src/components/UploadPage.js b/lib/components/UploadPage.js similarity index 100% rename from src/components/UploadPage.js rename to lib/components/UploadPage.js diff --git a/src/components/Uploader.js b/lib/components/Uploader.js similarity index 100% rename from src/components/Uploader.js rename to lib/components/Uploader.js diff --git a/src/db.js b/lib/db.js similarity index 100% rename from src/db.js rename to lib/db.js diff --git a/lib/ice.js b/lib/ice.js new file mode 100644 index 0000000..4045ea5 --- /dev/null +++ b/lib/ice.js @@ -0,0 +1,44 @@ +var twilio = require("twilio"); +var winston = require("winston"); + +if (process.env.TWILIO_SID && process.env.TWILIO_TOKEN) { + var twilioSID = process.env.TWILIO_SID; + var twilioToken = process.env.TWILIO_TOKEN; + var client = twilio(twilioSID, twilioToken); + winston.info("Using Twilio TURN service"); +} else { + var client = null; +} + +var DEFAULT_ICE_SERVERS = [ + { + urls: "stun:stun.l.google.com:19302" + } +]; + +var CACHE_LIFETIME = 5 * 60 * 1000; // 5 minutes +var cachedPromise = null; + +function clearCache() { + cachedPromise = null; +} + +exports.getICEServers = function() { + if (client == null) return Promise.resolve(DEFAULT_ICE_SERVERS); + if (cachedPromise) return cachedPromise; + + cachedPromise = new Promise(function(resolve, reject) { + client.tokens.create({}, function(err, token) { + if (err) { + winston.error(err); + return resolve(DEFAULT_ICE_SERVERS); + } + + winston.info("Retrieved ICE servers from Twilio"); + setTimeout(clearCache, CACHE_LIFETIME); + resolve(token.ice_servers); + }); + }); + + return cachedPromise; +}; diff --git a/src/index.js b/lib/index.js similarity index 100% rename from src/index.js rename to lib/index.js diff --git a/css/index.styl b/lib/index.styl similarity index 99% rename from css/index.styl rename to lib/index.styl index 725a191..f26319c 100644 --- a/css/index.styl +++ b/lib/index.styl @@ -1,3 +1,5 @@ +@import "nib"; + beige = #F9F2E7 dark-gray = #333 gray = #777 diff --git a/src/middleware/bootstrap.js b/lib/middleware/bootstrap.js similarity index 100% rename from src/middleware/bootstrap.js rename to lib/middleware/bootstrap.js diff --git a/src/middleware/error.js b/lib/middleware/error.js similarity index 100% rename from src/middleware/error.js rename to lib/middleware/error.js diff --git a/src/middleware/javascript.js b/lib/middleware/javascript.js similarity index 100% rename from src/middleware/javascript.js rename to lib/middleware/javascript.js diff --git a/src/middleware/react.js b/lib/middleware/react.js similarity index 100% rename from src/middleware/react.js rename to lib/middleware/react.js diff --git a/src/middleware/static.js b/lib/middleware/static.js similarity index 100% rename from src/middleware/static.js rename to lib/middleware/static.js diff --git a/src/routes.js b/lib/routes.js similarity index 100% rename from src/routes.js rename to lib/routes.js diff --git a/lib/server.js b/lib/server.js new file mode 100644 index 0000000..b65c795 --- /dev/null +++ b/lib/server.js @@ -0,0 +1,124 @@ +var db = require("./db"); +var express = require("express"); +var expressWinston = require("express-winston"); +var forceSSL = require("express-force-ssl"); +var fs = require("fs"); +var http = require("http"); +var https = require("https"); +var ice = require("./ice"); +var path = require("path"); +var socketIO = require("socket.io"); +var winston = require("winston"); + +var app = express(); + +if (process.env.SECURE) { + var server = https.Server( + { + key: fs.readFileSync(process.env.SSL_KEY || "key.pem"), + cert: fs.readFileSync(process.env.SSL_CERT || "cert.pem") + }, + app + ); + var port = process.env.PORT || 443; + var insecurePort = process.env.INSECURE_PORT || 80; + http.Server(app).listen(80); +} else { + var server = http.Server(app); + var port = + process.env.PORT || (process.env.NODE_ENV === "production" ? 80 : 3000); +} + +var io = socketIO(server); +io.set("transports", ["polling"]); + +var logDir = path.resolve(__dirname, "../log"); + +winston.add(winston.transports.DailyRotateFile, { + filename: logDir + "/access.log", + level: "info" +}); + +winston.add(winston.transports.File, { + filename: logDir + "/error.log", + level: "error", + handleExceptions: true, + json: false +}); + +server.on("error", function(err) { + winston.error(err.message); + process.exit(1); +}); + +process.on("unhandledRejection", (reason, p) => { + p.catch(err => { + log.error("Exiting due to unhandled rejection!"); + log.error(err); + process.exit(1); + }); +}); + +process.on("uncaughtException", err => { + log.error("Exiting due to uncaught exception!"); + log.error(err); + process.exit(1); +}); + +server.listen(port, function(err) { + var host = server.address().address; + var port = server.address().port; + winston.info("FilePizza listening on %s:%s", host, port); +}); + +if (!process.env.QUIET) { + app.use( + expressWinston.logger({ + winstonInstance: winston, + expressFormat: true + }) + ); +} + +if (process.env.FORCE_SSL) { + app.set("forceSSLOptions", { + trustXFPHeader: true + }); + + app.use(forceSSL); +} + +app.get("/app.js", require("./middleware/javascript")); +app.use(require("./middleware/static")); + +app.use([ + require("./middleware/bootstrap"), + require("./middleware/error"), + require("./middleware/react") +]); + +io.on("connection", function(socket) { + var upload = null; + + socket.on("upload", function(metadata, res) { + if (upload) return; + db.create(socket).then(u => { + upload = u; + upload.fileName = metadata.fileName; + upload.fileSize = metadata.fileSize; + upload.fileType = metadata.fileType; + upload.infoHash = metadata.infoHash; + res(upload.token); + }); + }); + + socket.on("rtcConfig", function(_, res) { + ice.getICEServers().then(function(iceServers) { + res({ iceServers: iceServers }); + }); + }); + + socket.on("disconnect", function() { + db.remove(upload); + }); +}); diff --git a/src/stores/DownloadStore.js b/lib/stores/DownloadStore.js similarity index 100% rename from src/stores/DownloadStore.js rename to lib/stores/DownloadStore.js diff --git a/src/stores/ErrorStore.js b/lib/stores/ErrorStore.js similarity index 100% rename from src/stores/ErrorStore.js rename to lib/stores/ErrorStore.js diff --git a/src/stores/SupportStore.js b/lib/stores/SupportStore.js similarity index 100% rename from src/stores/SupportStore.js rename to lib/stores/SupportStore.js diff --git a/src/stores/UploadStore.js b/lib/stores/UploadStore.js similarity index 100% rename from src/stores/UploadStore.js rename to lib/stores/UploadStore.js diff --git a/src/toppings.js b/lib/toppings.js similarity index 100% rename from src/toppings.js rename to lib/toppings.js diff --git a/src/util.js b/lib/util.js similarity index 100% rename from src/util.js rename to lib/util.js diff --git a/src/wt.js b/lib/wt.js similarity index 100% rename from src/wt.js rename to lib/wt.js diff --git a/package.json b/package.json index 874ded7..405b616 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "license": "BSD-3-Clause", "homepage": "https://github.com/kern/filepizza", "scripts": { - "start": "make run" + "start": "node ./dist/index.js", + "build": "babel lib --ignore __tests__,__mocks__ --out-dir dist && webpack -p ./lib/client" }, "repository": { "type": "git", @@ -33,45 +34,39 @@ }, "dependencies": { "alt": "^0.14.4", - "babel-cli": "^6.6.5", - "babel-core": "^6.14.0", - "babel-loader": "^6.2.4", - "babel-plugin-add-module-exports": "^0.1.2", + "babel-cli": "^6.16.0", + "babel-core": "^6.17.0", + "babel-loader": "^6.2.5", + "babel-plugin-add-module-exports": "^0.2.1", "babel-plugin-transform-react-jsx": "^6.7.4", "babel-polyfill": "^6.16.0", "babel-preset-es2015": "^6.14.0", - "babel-preset-stage-0": "^6.5.0", + "babel-preset-stage-0": "^6.16.0", "classnames": "^1.2.0", + "css-loader": "^0.28.4", "express": "^4.12.0", "express-force-ssl": "^0.3.1", "express-winston": "^0.3.1", "filepizza-socket": "^1.0.0", + "json-loader": "^0.5.4", "newrelic": "^1.21.1", "nib": "^1.1.0", "node-uuid": "^1.4.3", + "nodemon": "^1.4.1", "react": "^0.13.0", "react-frozenhead": "^0.3.0", "react-google-analytics": "^0.2.0", "react-router": "^0.13.1", "socket.io": "^1.3.5", "socket.io-client": "^1.3.5", + "style-loader": "^0.18.2", "stylus": "^0.50.0", + "stylus-loader": "^3.0.1", "twilio": "^2.9.1", "webpack": "^1.12.14", + "webpack-dev-middleware": "^1.6.1", "webrtcsupport": "^2.2.0", "winston": "^1.0.1", "xkcd-password": "^1.2.0" - }, - "devDependencies": { - "babel-cli": "^6.16.0", - "babel-core": "^6.17.0", - "babel-loader": "^6.2.5", - "babel-plugin-add-module-exports": "^0.2.1", - "babel-plugin-transform-react-jsx": "^6.8.0", - "babel-preset-es2015": "^6.16.0", - "babel-preset-stage-0": "^6.16.0", - "json-loader": "^0.5.4", - "nodemon": "^1.4.1", - "webpack-dev-middleware": "^1.6.1" } } diff --git a/src/client.js b/src/client.js deleted file mode 100644 index 365d75a..0000000 --- a/src/client.js +++ /dev/null @@ -1,22 +0,0 @@ -import 'babel-polyfill' -import React from 'react' -import ReactRouter from 'react-router' -import routes from './routes' -import alt from './alt' -import webrtcSupport from 'webrtcsupport' -import SupportActions from './actions/SupportActions' - -let bootstrap = document.getElementById('bootstrap').innerHTML -alt.bootstrap(bootstrap) - -window.FilePizza = () => { - ReactRouter.run(routes, ReactRouter.HistoryLocation, function (Handler) { - React.render(, document) - }) - - if (!webrtcSupport.support) SupportActions.noSupport() - - let isChrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1 - if (isChrome) SupportActions.isChrome() - -} diff --git a/src/components/App.js b/src/components/App.js deleted file mode 100644 index b3346c5..0000000 --- a/src/components/App.js +++ /dev/null @@ -1,71 +0,0 @@ -import Bootstrap from './Bootstrap' -import ErrorPage from './ErrorPage' -import FrozenHead from 'react-frozenhead' -import React from 'react' -import SupportStore from '../stores/SupportStore' -import { RouteHandler } from 'react-router' -import ga from 'react-google-analytics' - -ga('create', 'UA-62785624-1', 'auto'); -ga('send', 'pageview'); - -export default class App extends React.Component { - - constructor() { - super() - this.state = SupportStore.getState() - - this._onChange = () => { - this.setState(SupportStore.getState()) - } - } - - componentDidMount() { - SupportStore.listen(this._onChange) - } - - componentWillUnmount() { - SupportStore.unlisten(this._onChange) - } - - render() { - return - - - - - - - - - FilePizza - Your files, delivered. - - - - - - - - } - -} diff --git a/src/ice.js b/src/ice.js deleted file mode 100644 index 53b2249..0000000 --- a/src/ice.js +++ /dev/null @@ -1,45 +0,0 @@ -var twilio = require('twilio') -var winston = require('winston') - -if (process.env.TWILIO_SID && process.env.TWILIO_TOKEN) { - var twilioSID = process.env.TWILIO_SID - var twilioToken = process.env.TWILIO_TOKEN - var client = twilio(twilioSID, twilioToken) - // winston.info('Created Twilio client', { sid: twilioSID, token: twilioToken }) -} else { - var client = null -} - -var DEFAULT_ICE_SERVERS = [ - { - url: 'stun:23.21.150.121', // deprecated, replaced by `urls` - urls: 'stun:23.21.150.121' - } -] - -var CACHE_LIFETIME = 5 * 60 * 1000 // 5 minutes -var cachedPromise = null - -function clearCache() { - cachedPromise = null -} - -exports.getICEServers = function () { - if (client == null) return Promise.resolve(DEFAULT_ICE_SERVERS) - if (cachedPromise) return cachedPromise - - cachedPromise = new Promise(function (resolve, reject) { - client.tokens.create({}, function(err, token) { - if (err) { - winston.error(err) - return resolve(DEFAULT_ICE_SERVERS) - } - - winston.info('Retrieved ICE servers from Twilio', token.ice_servers) - setTimeout(clearCache, CACHE_LIFETIME) - resolve(token.ice_servers) - }) - }) - - return cachedPromise -} diff --git a/src/middleware/css.js b/src/middleware/css.js deleted file mode 100644 index 831dc2d..0000000 --- a/src/middleware/css.js +++ /dev/null @@ -1,26 +0,0 @@ -var express = require('express') -var nib = require('nib') -var path = require('path') -var stylus = require('stylus') - -var CSS_PATH = path.resolve(__dirname, '../../css') -var COMPILED_PATH = path.resolve(__dirname, '../../css/index.css') - -var routes = module.exports = new express.Router() - -routes.use(function (req, res, next) { - req.url = '/index.css' - next() -}, stylus.middleware({ - src: CSS_PATH, - dest: CSS_PATH, - compile: function (str, path) { - return stylus(str) - .set('filename', path) - .set('compress', true) - .use(nib()) - .import('nib') - } -}), function (req, res) { - res.sendFile(COMPILED_PATH) -}) diff --git a/src/server.js b/src/server.js deleted file mode 100644 index f302f4d..0000000 --- a/src/server.js +++ /dev/null @@ -1,119 +0,0 @@ -var db = require('./db') -var express = require('express') -var expressWinston = require('express-winston') -var forceSSL = require('express-force-ssl') -var fs = require('fs') -var http = require('http') -var https = require('https') -var ice = require('./ice') -var path = require('path') -var socketIO = require('socket.io') -var winston = require('winston') - -var app = express() - -if (process.env.SECURE) { - var server = https.Server({ - key: fs.readFileSync(process.env.SSL_KEY || 'key.pem'), - cert: fs.readFileSync(process.env.SSL_CERT || 'cert.pem') - }, app) - var port = process.env.PORT || 443 - var insecurePort = process.env.INSECURE_PORT || 80 - http.Server(app).listen(80) -} else { - var server = http.Server(app) - var port = process.env.PORT || (process.env.NODE_ENV === 'production' ? 80 : 3000) -} - -var io = socketIO(server) -io.set('transports', ['polling']) - -var logDir = path.resolve(__dirname, '../log') - -winston.add(winston.transports.DailyRotateFile, { - filename: logDir + '/access.log', - level: 'info' -}) - -winston.add(winston.transports.File, { - filename: logDir + '/error.log', - level: 'error', - handleExceptions: true, - json: false -}) - -server.on('error', function (err) { - console.error(err.message) - process.exit(1) -}) - -process.on('unhandledRejection', (reason, p) => { - p.catch(err => { - log.error('Exiting due to unhandled rejection!') - log.error(err) - process.exit(1) - }) -}) - -process.on('uncaughtException', err => { - log.error('Exiting due to uncaught exception!') - log.error(err) - process.exit(1) -}) - -server.listen(port, function (err) { - var host = server.address().address - var port = server.address().port - console.log('FilePizza listening on %s:%s', host, port) -}) - -app.use(expressWinston.logger({ - winstonInstance: winston, - expressFormat: true -})) - -if (process.env.FORCE_SSL) { - app.set('forceSSLOptions', { - trustXFPHeader: true - }) - - app.use(forceSSL) -} - -app.get('/app.js', require('./middleware/javascript')) -app.get('/app.css', require('./middleware/css')) -app.use(require('./middleware/static')) - -app.use([ - require('./middleware/bootstrap'), - require('./middleware/error'), - require('./middleware/react') -]) - -io.on('connection', function (socket) { - - var upload = null - - socket.on('upload', function (metadata, res) { - if (upload) return - db.create(socket).then((u) => { - upload = u - upload.fileName = metadata.fileName - upload.fileSize = metadata.fileSize - upload.fileType = metadata.fileType - upload.infoHash = metadata.infoHash - res(upload.token) - }) - }) - - socket.on('rtcConfig', function (_, res) { - ice.getICEServers().then(function (iceServers) { - res({ iceServers: iceServers }) - }) - }) - - socket.on('disconnect', function () { - db.remove(upload) - }) - -}) diff --git a/webpack.config.js b/webpack.config.js index 2f37d21..172ee70 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,9 +1,11 @@ +const nib = require("nib"); + module.exports = { - entry: './src/client', - target: 'web', + entry: "./lib/client", + target: "web", output: { - filename: 'dist/bundle.js' + filename: "dist/bundle.js" }, module: { @@ -11,16 +13,24 @@ module.exports = { { test: /\.js$/, exclude: /node_modules/, - loader: 'babel-loader' + loader: "babel-loader" }, { test: /\.json$/, - loader: 'json' + loader: "json" + }, + { + test: /\.styl$/, + loader: "style-loader!css-loader!stylus-loader" } ] }, node: { - fs: 'empty' + fs: "empty" + }, + + stylus: { + use: [nib()] } -} +};