UNPKG

hk-bus-eta

Version:

Query the ETA (Estimated Time of Arrival) of HK Bus/Minibus/MTR/Lightrail

135 lines 5.9 kB
"use strict"; 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