UNPKG

atriusmaps-node-sdk

Version:

This project provides an API to Atrius Personal Wayfinder maps within a Node environment. See the README.md for more information

115 lines (111 loc) 2.73 kB
'use strict'; var Zousan = require('zousan'); const bustleResponseComparitor = (r1, r2) => { if (r1.responseOrder == null) { return r2.responseOrder == null ? 0 : 1; } if (r2.responseOrder == null) { return -1; } return r1.responseOrder - r2.responseOrder; }; const arRmAt = (ar, index) => ar.splice(index, 1)[0]; const arRm = (ar, value) => { let i = 0; do { i = ar.indexOf(value, i); if (i >= 0) { arRmAt(ar, i); } } while (i >= 0); return ar; }; function create(opts = {}) { const log = opts.log ? opts.log.sublog ? opts.log.sublog("bustle", { color: "pink" }) : opts.log : console; const ons = {}; const mons = {}; function on(ev, fn) { if (!ons[ev]) { ons[ev] = []; } ons[ev].push(fn); return () => off(ev, fn); } function monitor(ev, fn) { if (!mons[ev]) { mons[ev] = []; } mons[ev].push(fn); return () => moff(ev, fn); } function off(ev, fn) { Zousan.soon(() => { if (!ons[ev]) { return; } arRm(ons[ev], fn); }); } function moff(ev, fn) { Zousan.soon(() => { if (!mons[ev]) { return; } arRm(mons[ev], fn); }); } const serve = (ev, ob, done) => () => { const myOns = ons[ev]; const myMons = mons[ev]; const res = []; if (myOns) { for (const listener of myOns) { try { res.push(listener(ob)); } catch (err) { if (opts.reportAllErrors) { log.error(err); } if (opts.rejectOnError) { res.push(Zousan.reject(err)); } else { res.push(err); } } } } const results = Zousan.all(res); if (myMons) { for (const listener of myMons) { try { listener(ob, results); } catch (err) { if (opts.reportAllErrors) { log.error(err); } } } } done(results); }; const get = (ev, ob) => send(ev, ob).then( (res) => res.length !== 1 ? Zousan.reject(`${ev} event did not return a single result, but ${res.length} results.`) : res[0] ); const getFirst = (ev, ob) => send(ev, ob).then( (res) => res.length >= 1 ? res.sort(bustleResponseComparitor)[0] : void 0 ); function send(ev, ob) { if (opts.showEvents) { if (typeof opts.showEvents === "function") { if (opts.showEvents(ev, ob)) { log.info("send with", ev, " and ", ob); } } else { log.info("send with", ev, " and ", ob); } } return new Zousan((resolve) => Zousan.soon(serve(ev, ob, resolve))); } return { get, getFirst, moff, monitor, off, on, send }; } exports.create = create;