2019-05-20 11:18:25 +00:00
"use strict" ;
2019-07-04 19:53:00 +00:00
import MqttClient from 'simple-mqtt-client' ;
2019-07-04 16:18:38 +00:00
2019-05-20 11:18:25 +00:00
class TTNAppServer {
2019-07-08 14:42:05 +00:00
get connection _string ( ) {
return ` ${ this . settings . ttn . tls ? "mqtts" : "mqtt" } :// ${ this . settings . ttn . host } : ${ this . settings . ttn . port } / `
}
2019-05-23 21:39:10 +00:00
// Destructure the awilix container
2019-07-08 14:42:05 +00:00
constructor ( { settings , ansi , MessageHandler , log } ) {
2019-05-23 21:39:10 +00:00
this . settings = settings ;
2019-05-29 10:59:40 +00:00
/** @type {Ansi} */
this . a = ansi ;
2019-07-08 14:42:05 +00:00
/** @type {Log} */
this . log = log ;
2019-07-04 16:18:38 +00:00
/** @type {MessageHandler} */
2019-07-08 14:42:05 +00:00
this . message _handler = MessageHandler ;
2019-05-20 11:18:25 +00:00
}
2019-07-08 14:42:05 +00:00
async run ( ) {
2019-07-04 16:18:38 +00:00
if ( this . settings . ttn . app _id == "CHANGE_THIS" || this . settings . ttn . access _key == "CHANGE_THIS" ) {
2019-07-08 14:42:05 +00:00
this . log . error ( ` Error: No TTN app id specified. Try filling in the required values in settings.toml. If they don't exist yet, try using server/settings.default.toml as a reference. ` ) ;
2019-07-04 16:18:38 +00:00
return false ;
}
2019-07-04 19:53:00 +00:00
2019-07-08 14:42:05 +00:00
this . ttn _client = await this . connect ( ) ;
2019-07-04 19:53:00 +00:00
2019-07-08 14:42:05 +00:00
for ( let device _name of this . settings . ttn . devices ) {
if ( device _name == "CHANGE_THIS" ) {
this . log . error ( ` Error: No device names specified. Try filling in the required values in settings.toml. If they don't exist yet, try using server/settings.default.toml as a reference. ` ) ;
return false ;
}
this . ttn _client . subscribe ( ` ${ device _name } /up ` , this . handle _message . bind ( this ) ) ;
}
2019-06-03 13:14:23 +00:00
2019-07-08 14:42:05 +00:00
this . log . log ( ` Connected to ${ this . connection _string } ` ) ;
}
connect ( ) {
return new Promise ( ( resolve , _reject ) => {
this . log . log ( ` Connecting to ${ this . connection _string } ` ) ;
MqttClient . new ( ) . init (
this . connection _string ,
this . settings . ttn . app _id , // Username
this . settings . ttn . access _key , // Password
` ${ this . settings . ttn . app _id } /devices ` , // Base topic
( client ) => {
client ;
resolve ( client ) ;
}
) ;
} )
2019-07-04 16:18:38 +00:00
}
2019-07-08 14:42:05 +00:00
async handle _message ( payload ) {
await this . message _handler . handle ( payload ) ;
2019-05-20 11:18:25 +00:00
}
}
export default TTNAppServer ;