diff --git a/package.json b/package.json index acba66a2af8082d586dcaf0e8172831972a1ba42..8bd48b4d97c6c5b7dfbe2b8e92e0d76dfbb24abd 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "apicache": "*", "asyncawait": "^0.7.4", "bluebird": "^2.9.34", - "connect-timeout": "*", "debug": "^2.2.0", "express": "^4.13.3", "morgan": "^1.6.1", diff --git a/server.js b/server.js index 92a22878104f27cca329ee3bf636d2d0cdac63c6..5238019d0593ff342aeb6e1c363724aed3525dbb 100755 --- a/server.js +++ b/server.js @@ -11,7 +11,6 @@ var await = require( 'asyncawait/await' ); var async = require( 'asyncawait/async' ); var apicache = require( 'apicache' ).options( { defaultDuration: 15000 } ); var cache = apicache.middleware; -var timeout = require( 'connect-timeout' ); var request = require( 'request' ); var config = require( process.env.AUGUSTCTL_CONFIG || './config.json' ); @@ -63,35 +62,24 @@ function statusStringtoInt( status ) { return statusInt; } -// Clear cached routes -function clearCaches( lockName ) { - apicache.clear( '/api/status/' + lockName ); - apicache.clear( '/api/lock/' + lockName ); - apicache.clear( '/api/unlock/' + lockName ); - - return true; -} - -// Middleware to handle timeout status checks -function haltOnTimedout( req, res, next ) { - if ( req.timedout ) { - request( 'http://' + address + ':' + port + '/api/disconnect/' + req.params.lock_name ); - } else { - next(); - } -} - /** * ROUTES */ // Endpoint to check lock status -app.get( '/api/status/:lock_name', timeout( '5 seconds' ), cache( '5 seconds' ), haltOnTimedout, function( req, res ) { +app.get( '/api/status/:lock_name', cache( '5 seconds' ), function( req, res, next ) { var lockName = req.params.lock_name; // Parse allowed request arguments var lock = getLockInstance( lockName, res ); if ( ! lock ) { + res.sendStatus( 400 ); + return; + } + + // Check if lock is already connected, and bail if it is since two devices can't connect at once + if ( lock.isConnected() ) { + res.sendStatus( 503 ); return; } @@ -110,21 +98,13 @@ app.get( '/api/status/:lock_name', timeout( '5 seconds' ), cache( '5 seconds' ), // Perform requested action lock.connect().then( actionFunction ).catch( function( err ) { console.error( err ); - - try { - request( 'http://' + address + ':' + port + '/api/disconnect/' + lockName, function() { - request( 'http://' + address + ':' + port + '/api/status/' + lockName ); - } ); - } catch ( e ) { - // We don't care about request results - } - - res.sendStatus( 503 ); + lock.disconnect(); + res.sendStatus( 500 ); } ); } ); // Endpoint to change lock state -app.get( '/api/:lock_action(lock|unlock)/:lock_name', timeout( '5 seconds' ), cache( '3 seconds' ), haltOnTimedout, function( req, res ) { +app.get( '/api/:lock_action(lock|unlock)/:lock_name', function( req, res, next ) { // Parse allowed request arguments var action = req.params.lock_action, allowedActions = [ 'unlock', 'lock' ]; @@ -136,9 +116,15 @@ app.get( '/api/:lock_action(lock|unlock)/:lock_name', timeout( '5 seconds' ), ca var lockName = req.params.lock_name, lock = getLockInstance( lockName, res ); if ( ! lock ) { + res.sendStatus( 400 ); return; } + // Check if lock is already connected, and disconnect so we can force the action + if ( lock.isConnected() ) { + lock.disconnect(); + } + // Suspendable functions to interact with lock based on requested action var actionFunction = async( function() { var status = await( lock.status() ); @@ -162,36 +148,40 @@ app.get( '/api/:lock_action(lock|unlock)/:lock_name', timeout( '5 seconds' ), ca } lock.disconnect(); - clearCaches( lockName ); + apicache.clear( '/api/status/' + lockName ); res.json( ret ); } ); // Perform requested action lock.connect().then( actionFunction ).catch( function( err ) { console.error( err ); + lock.disconnect(); try { - request( 'http://' + address + ':' + port + '/api/disconnect/' + lockName, function() { - request( 'http://' + address + ':' + port + '/api/status/' + lockName ); - } ); - } catch ( e ) { - // We don't care about request results - } + request( 'http://' + address + ':' + port + '/api/' + action + '/' + lockName ); + } catch ( e ) {} - res.sendStatus( 503 ); + res.sendStatus( 500 ); } ); } ); // Endpoint to disconnect a lock's BLE connections -app.get( '/api/disconnect/:lock_name', function( req, res ) { +app.get( '/api/disconnect/:lock_name', function( req, res, next ) { // Parse allowed request arguments var lock = getLockInstance( req.params.lock_name, res ); if ( ! lock ) { + res.sendStatus( 400 ); + return; + } + + // Check if lock is already connected, and bail if it's already disconnected + if ( ! lock.isConnected() ) { + res.sendStatus( 503 ); return; } lock.disconnect(); - clearCaches( req.params.lock_name ); + apicache.clear( '/api/status/' + req.params.lock_name ); res.sendStatus( 204 ); } );