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
JavaScript
;
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;