hk-bus-eta
Version:
Query the ETA (Estimated Time of Arrival) of HK Bus/Minibus/MTR/Lightrail
135 lines • 5.9 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const tz_1 = require("@date-fns/tz");
const date_fns_1 = require("date-fns");
const utils_1 = require("./utils");
function fetchEtas({ route, seq, freq, holidays, serviceDayMap, }) {
return __awaiter(this, void 0, void 0, function* () {
if (seq > 1) {
return Promise.resolve([]);
}
const apiEtas = yield fetch(`https://www.sunferry.com.hk/eta/?route=${route}`, {
cache: utils_1.isSafari ? "default" : "no-store",
})
.then((response) => response.json())
.then(({ data, generated_timestamp, }) => {
if (!data)
return [];
return data.map(({ depart_time, eta, rmk_en, rmk_tc, route_tc, route_en }) => {
var _a, _b;
/**
* @param timeString HH:mm
*/
const guessDateTimeByTimeString = (timeString) => {
const generated = new tz_1.TZDate(generated_timestamp, "Asia/Hong_Kong");
const time = (0, date_fns_1.startOfMinute)((0, date_fns_1.set)(generated, {
hours: parseInt(timeString.split(":")[0], 10),
minutes: parseInt(timeString.split(":")[1], 10),
}));
return (0, date_fns_1.closestTo)(generated, [
(0, date_fns_1.sub)(time, { days: 1 }),
time,
(0, date_fns_1.add)(time, { days: 1 }),
]);
};
// 橫水渡 - (坪洲-梅窩)
// 中環 - 長洲
const [originZh, destZh] = (((_a = /^橫水渡 - \((.*)\)$/.exec(route_tc)) === null || _a === void 0 ? void 0 : _a[1]) || route_tc)
.split("-")
.map((s) => s.trim());
// Inter Islands (Peng Chau - Mui Wo)
// Central - Cheung Chau
const [originEn, destEn] = (((_b = /^Inter Islands \((.*)\)$/.exec(route_en)) === null || _b === void 0 ? void 0 : _b[1]) || route_en)
.split("-")
.map((s) => s.trim());
return {
departTime: (0, date_fns_1.formatISO)(guessDateTimeByTimeString(depart_time)),
eta: eta ? (0, date_fns_1.formatISO)(guessDateTimeByTimeString(eta)) : null,
remark: {
zh: rmk_tc !== null && rmk_tc !== void 0 ? rmk_tc : "",
en: rmk_en !== null && rmk_en !== void 0 ? rmk_en : "",
},
dest: {
zh: destZh,
en: destEn,
},
co: "sunferry",
};
});
})
.catch((err) => {
console.error("Error fetching Sun Ferry ETAs:", err);
return [];
});
if (seq === 0) {
const greatestApiEtaTime = apiEtas.length > 0
? (0, date_fns_1.max)(apiEtas.map((e) => new Date(e.departTime)))
: undefined;
const now = new Date();
return [
...apiEtas
.filter((eta) => (0, date_fns_1.endOfMinute)(new Date(eta.departTime)) >= now && !eta.eta)
.map((eta) => ({
eta: eta.departTime,
remark: {
zh: [eta.remark.zh, "預定班次"].filter(Boolean).join(";"),
en: [eta.remark.en, "Scheduled"].filter(Boolean).join("; "),
},
dest: eta.dest,
co: eta.co,
})),
...(0, utils_1.getUpcomingFerry)({
holidays,
serviceDayMap,
freq,
date: (0, date_fns_1.max)([
...(greatestApiEtaTime
? [(0, date_fns_1.add)(greatestApiEtaTime, { minutes: 1 })]
: []),
now,
]),
})
.filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
.map((eta) => ({
eta: eta,
remark: {
zh: "預定班次",
en: "Scheduled",
},
dest: {
zh: "",
en: "",
},
co: "sunferry",
})),
];
}
else if (seq === 1) {
return apiEtas
.filter((eta) => eta.eta !== null)
.map((eta) => ({
eta: eta.eta,
remark: {
zh: eta.remark.zh,
en: eta.remark.en,
},
dest: eta.dest,
co: eta.co,
}));
}
else {
return [];
}
});
}
exports.default = fetchEtas;
//# sourceMappingURL=sunferry.js.map