class MapEventHandler { constructor(options, dashmap) { this.options = options; this.dashmap = dashmap; } connect(user_id, host, port) { var d = new Date(); var client_id = "dash-" + user_id + "-" + d.getMonth() + "-" + d.getDate() + "-" + d.getHours() + "-" + d.getMinutes() + "-" + d.getSeconds() + "-" + d.getMilliseconds(); console.log(client_id); this.mqtt = new Paho.MQTT.Client(host, port, client_id); var options = { // useSSL: true, timeout: 3, invocationContext: this, onSuccess: this.onConnect.bind(this), }; this.mqtt.onMessageArrived = this.onMessage.bind(this); console.log('connecting to mqtt server...'); this.mqtt.connect(options); } onConnect(icontext) { console.log('mqtt connected!'); var my = icontext.invocationContext; if (my.options.track_rider) { // subscribe to rider locations console.log('subscribing to ' + my.options.channels.rider_location); my.mqtt.subscribe(my.options.channels.rider_location); // subscribe to rider status console.log('subscribing to ' + my.options.channels.rider_status); my.mqtt.subscribe(my.options.channels.rider_status); } if (my.options.track_jo) { // subscribe to jo locations console.log('subscribing to ' + my.options.channels.jo_location); my.mqtt.subscribe(my.options.channels.jo_location); // subscribe to jo status console.log('subscribing to ' + my.options.channels.jo_status); my.mqtt.subscribe(my.options.channels.jo_status); } } onMessage(msg) { // console.log(msg); console.log('received message'); var channel = msg.destinationName; var chan_split = channel.split('/'); var payload = msg.payloadString; // handle different channels switch (chan_split[0]) { case "rider": this.handleRider(chan_split, payload); break; case "jo": this.handleJobOrder(chan_split, payload); break; } } handleRider(chan_split, payload) { console.log("rider message"); switch (chan_split[2]) { case "location": console.log("got location for rider " + chan_split[1] + " - " + payload); var pl_split = payload.split(':'); console.log(pl_split); // check for correct format if (pl_split.length != 2) break; var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); // TODO: check if available or not this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; case "status": console.log("got status for rider " + chan_split[1] + " - " + payload); switch (payload) { case 'available': this.dashmap.switchRiderStatus(chan_split[1], 'available'); break; case 'jo': console.log('jo status'); this.dashmap.switchRiderStatus(chan_split[1], 'jo'); break; case 'logout': this.dashmap.removeRiderMarker(chan_split[1]); break; } break; } } handleJobOrder(chan_split, payload) { console.log("jo message"); var id = chan_split[1]; switch (chan_split[2]) { case "location": // var my = this; console.log("got location for jo " + id + " - " + payload); var pl_split = payload.split(':'); // check for correct format if (pl_split.length != 2) break; var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); // move marker console.log(lat + ' - ' + lng); this.dashmap.putCustomerMarker(id, lat, lng); break; case "status": console.log("got status for jo " + payload); switch (payload) { case 'cancel': case 'fulfill': case 'delete': this.dashmap.removeCustomerMarker(id); break; } } } }