|
@@ -0,0 +1,94 @@
|
|
|
+
|
|
|
+
|
|
|
+'use strict';
|
|
|
+
|
|
|
+const fs = require('fs');
|
|
|
+const path = require('path');
|
|
|
+
|
|
|
+class SimpleServerHelper {
|
|
|
+ constructor(config, request, response) {
|
|
|
+ this.settings = {
|
|
|
+ ...{
|
|
|
+ publicFolder: 'public',
|
|
|
+ htmlIndexPath: 'public/index.html',
|
|
|
+ html404Path: 'public/404.html',
|
|
|
+ verbose: false,
|
|
|
+ allowedFiles: {
|
|
|
+ txt: 'text/plain',
|
|
|
+ json: 'text/json',
|
|
|
+ css: 'text/css',
|
|
|
+ gif: 'image/gif',
|
|
|
+ jpg: 'image/jpeg',
|
|
|
+ png: 'image/png',
|
|
|
+ svg: 'image/svg+xml',
|
|
|
+ ico: 'image/ico',
|
|
|
+ js: 'application/javascript',
|
|
|
+ html: 'text/html',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ...config
|
|
|
+ };
|
|
|
+ this.request = request;
|
|
|
+ this.response = response;
|
|
|
+ const uri = request.url.toLowerCase();
|
|
|
+ const publicPath = path.join(__dirname, this.settings.publicFolder);
|
|
|
+ this.mimeType = this.getType(uri);
|
|
|
+ this.filePath = this.isHtml() ? this.settings.htmlIndexPath : publicPath + uri;
|
|
|
+ }
|
|
|
+
|
|
|
+ getType(path) {
|
|
|
+ if (path == '/') return this.settings.allowedFiles['html'];
|
|
|
+ const extension = path.split('.').pop().split('?').shift();
|
|
|
+ return this.settings.allowedFiles[extension];
|
|
|
+ }
|
|
|
+
|
|
|
+ isHtml() {
|
|
|
+ return this.mimeType == this.settings.allowedFiles['html'];
|
|
|
+ }
|
|
|
+
|
|
|
+ isValid() {
|
|
|
+ return this.isHtml() || this.fileExist();
|
|
|
+ }
|
|
|
+
|
|
|
+ fileExist() {
|
|
|
+ let exists = false
|
|
|
+ try {
|
|
|
+ exists = fs.existsSync(this.filePath);
|
|
|
+ } catch (error) {
|
|
|
+ if (this.settings.verbose) console.error(error);
|
|
|
+ }
|
|
|
+ return exists;
|
|
|
+ }
|
|
|
+
|
|
|
+ handleLogs(isValid) {
|
|
|
+ if (this.settings.verbose) {
|
|
|
+ if (isValid) console.info(new Date().toString() + ' ' + this.filePath);
|
|
|
+ else console.error('Error accessing ' + this.request.url);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ writeHead(isValid) {
|
|
|
+ if (isValid) {
|
|
|
+ this.response.writeHead(200, {
|
|
|
+ 'Cache-Control': 'max-age=31536000',
|
|
|
+ 'Content-Type': this.mimeType
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ this.response.writeHead(404, {
|
|
|
+ 'Content-Type': this.settings.allowedFiles['html']
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ respond() {
|
|
|
+ const isValid = this.isValid();
|
|
|
+ this.writeHead(isValid);
|
|
|
+ isValid ? fs.createReadStream(this.filePath).pipe(this.response)
|
|
|
+ : fs.createReadStream(this.settings.html404Path).pipe(this.response);
|
|
|
+ this.handleLogs(isValid);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+module.exports = {
|
|
|
+ SimpleServerHelper
|
|
|
+};
|