"use strict"; import mqtt from 'async-mqtt'; class TTNAppServer { get connection_string() { return `${this.settings.ttn.tls ? "mqtts" : "mqtt"}://${this.settings.ttn.host}:${this.settings.ttn.port}/` } // Destructure the awilix container constructor({ settings, ansi, MessageHandler, log }) { this.settings = settings; /** @type {Ansi} */ this.a = ansi; /** @type {Log} */ this.log = log; /** @type {MessageHandler} */ this.message_handler = MessageHandler; } async run() { // 1: Sanity checks if(this.settings.ttn.app_id == "CHANGE_THIS" || this.settings.ttn.access_key == "CHANGE_THIS") { 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.`); return false; } if(this.settings.ttn.devices.includes("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; } // 2: Connect this.ttn_client = await this.connect(); this.ttn_client.on("message", this.handle_message.bind(this)); this.log.log(`Connected to ${this.connection_string}`); // 3: Subscribe let result = await this.ttn_client.subscribe(this.settings.ttn.devices.map( (device_name) => `${this.settings.ttn.app_id}/devices/${device_name}/up` )); this.log.log(`Subscribed to ${result.map((el) => el.topic).join(", ")}`); } connect() { return new Promise((resolve, _reject) => { let client = mqtt.connect(this.connection_string, { username: this.settings.ttn.app_id, password: this.settings.ttn.access_key }); client.once("connect", () => resolve(client)); }); } async handle_message(topic, message_buffer) { let message = message_buffer.toString("utf8"), message_object = null; try { message_object = JSON.parse(message); } catch(error) { this.log.log(error); return false; } this.log.log(`[mqtt/handler] ${topic}: `, message_object); // await this.message_handler.handle(payload); } } export default TTNAppServer;