aboutsummaryrefslogtreecommitdiff
path: root/lib/dead_drop.js
diff options
context:
space:
mode:
authorBen Beltran <ben@nsovocal.com>2017-02-19 02:04:42 -0600
committerBen Beltran <ben@nsovocal.com>2017-02-19 02:04:42 -0600
commitb0b2aee1145b50a58c22d39627df717d45c6338f (patch)
tree068b1f22bb170312b0830840a72a3ff0e21ae207 /lib/dead_drop.js
parentdc10b1de1a73effd6d0ab5744709913ef5cbe5b3 (diff)
parent2082455bb240291413c368c1b74736a739db2a2c (diff)
Merge branch 'release/1.0.0'
Diffstat (limited to 'lib/dead_drop.js')
-rw-r--r--lib/dead_drop.js134
1 files changed, 134 insertions, 0 deletions
diff --git a/lib/dead_drop.js b/lib/dead_drop.js
new file mode 100644
index 0000000..3336444
--- /dev/null
+++ b/lib/dead_drop.js
@@ -0,0 +1,134 @@
+'use strict';
+
+const Koa = require('koa');
+const KoaBodyParser = require('koa-bodyparser');
+const KoaRoute = require('koa-route');
+
+const MainMenuController = require('./controllers/main_menu');
+const RecordingMenuController = require('./controllers/recording_menu');
+const RecordingsController = require('./controllers/recordings');
+
+const internals = {};
+
+/**
+ * The Dead Drop class is the main entry point for the application.
+ *
+ * @class DeadDrop
+ * @param {DeadDrop.tConfiguration} config the initialization options to
+ * extend the instance
+ */
+module.exports = internals.DeadDrop = class DeadDrop {
+
+ constructor(config) {
+
+ Object.assign(this, config);
+ }
+
+ /**
+ * Initializes the application and starts listening. Also prints a
+ * nice robotic banner with information.
+ *
+ * @function run
+ * @memberof DeadDrop
+ * @instance
+ */
+ run() {
+
+ this._initializeServer();
+ this._startServer();
+ this._printBanner();
+
+ return Promise.resolve();
+ }
+
+ // Initializes the Koa application and all the handlers.
+
+ _initializeServer() {
+
+ const self = this;
+
+ this._app = Koa();
+
+ this._app.use(KoaBodyParser());
+
+ this._app.use(function * (next) {
+
+ const accountSid = this.request.body.AccountSid || this.request.query.AccountSid;
+
+ if (accountSid === self.twilioAccountSid) {
+ yield next;
+ }
+ else {
+ this.throw('Unauthorized', 401);
+ }
+ });
+
+ this._initializeMainMenuRoutes();
+ this._initializeRecordingMenuRoutes();
+ this._initializeRecordingsRoutes();
+
+ this._app.use(function * () {
+
+ this.body = 'How did you get here? Shoo!';
+ });
+
+ }
+
+ // Starts listening
+
+ _startServer() {
+
+ this._app.listen(this.port);
+ }
+
+ // Initializes the main menu routes.
+
+ _initializeMainMenuRoutes() {
+
+ const mainMenuController = new MainMenuController();
+
+ this._app.use(KoaRoute.get('/menus/main', mainMenuController.serveMenu()));
+ this._app.use(KoaRoute.post('/menus/main', mainMenuController.parseMenuSelection()));
+ }
+
+ // Initializes the recording menu routes.
+
+ _initializeRecordingMenuRoutes() {
+
+ const recordingMenuController = new RecordingMenuController();
+
+ this._app.use(KoaRoute.get('/menus/recording', recordingMenuController.serveMenu()));
+ this._app.use(KoaRoute.post('/menus/recording', recordingMenuController.parseMenuSelection()));
+ }
+
+ // Initializes the recordings routes.
+
+ _initializeRecordingsRoutes() {
+
+ const recordingsController = new RecordingsController({
+ redis: this.redis
+ });
+
+ this._app.use(KoaRoute.get('/recordings', recordingsController.startRecording()));
+ this._app.use(KoaRoute.post('/recordings', recordingsController.saveRecording()));
+ this._app.use(KoaRoute.get('/recordings/:id', recordingsController.getRecording()));
+ }
+
+ // Prints the banner.
+
+ _printBanner() {
+
+ console.log(' >o<');
+ console.log(' /-----\\');
+ console.log(` |ú ù| - Happy to listen on: ${this.port}`);
+ console.log(' | U |');
+ console.log(' \\---/');
+ console.log(' +---------+');
+ console.log(' ~| () |~');
+ console.log(' ~| /\\ | ~');
+ console.log(' ~| \\/ | ~c');
+ console.log(' ^+---------+');
+ console.log(' (o==o==o) ');
+
+ }
+};