hk-bus-eta 3.7.7 → 3.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,28 +19,29 @@ or
19
19
 
20
20
  __Crawling traffic database:__
21
21
  ```ts
22
- import { fetchEtaObj } from "hk-bus-eta";
23
- import type { BusDb } from "hk-bus-eta";
22
+ import { fetchEtaDb } from "hk-bus-eta";
23
+ import type { EtaDb } from "hk-bus-eta";
24
24
 
25
- fetchEtaDb().then((db: BusDb) => {
25
+ (async function () {
26
+ const etaDb: EtaDb = await fetchEtaDb();
26
27
  console.log(db)
27
- })
28
+ })();
28
29
  ```
29
30
 
30
31
  __Crawling ETA__
31
32
  ```ts
32
33
  import { fetchEtas } from "hk-bus-eta";
33
- import tyep { Eta } from "hk-bus-eta";
34
-
35
- // busDb is the BusDb object fetched by fetchEtaObj
36
-
37
- fetchEtas({
38
- ...busDb.routeList["1+1+CHUK YUEN ESTATE+STAR FERRY"],
39
- seq: 0,
40
- language: "en",
41
- }).then(etas => {
42
- console.log(etas)
43
- })
34
+ import type { Eta } from "hk-bus-eta";
35
+
36
+ (async function () {
37
+ // etaDb is the EtaDb object fetched by fetchEtaObj
38
+ const etas: Eta[] = await fetchEtas({
39
+ ...etaDb.routeList["1+1+CHUK YUEN ESTATE+STAR FERRY"],
40
+ seq: 0,
41
+ language: "en",
42
+ });
43
+ console.log(etas);
44
+ })();
44
45
  ```
45
46
 
46
47
  ## Data Structure
package/dist/hkkf.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  import type { Eta, EtaDb, RouteListEntry } from "./type";
2
2
  interface fetchEtasProps {
3
+ route: RouteListEntry["route"];
4
+ bound: RouteListEntry["bound"]["hkkf"];
3
5
  freq: RouteListEntry["freq"];
4
6
  seq: number;
5
7
  holidays: EtaDb["holidays"];
6
8
  serviceDayMap: EtaDb["serviceDayMap"];
7
9
  }
8
- export default function fetchEtas({ freq, seq, holidays, serviceDayMap, }: fetchEtasProps): Promise<Eta[]>;
10
+ export default function fetchEtas({ route, bound, freq, seq, holidays, serviceDayMap, }: fetchEtasProps): Promise<Eta[]>;
9
11
  export {};
package/dist/hkkf.js CHANGED
@@ -1,53 +1,51 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const utils_1 = require("./utils");
4
- function fetchEtas({ freq, seq, holidays, serviceDayMap, }) {
5
- if (seq >= 1)
6
- return Promise.resolve([]);
7
- const now = new Date();
8
- return Promise.resolve((0, utils_1.getUpcomingFerry)({ holidays, serviceDayMap, freq, date: new Date() })
9
- .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
10
- .map((eta) => ({
11
- eta: eta,
12
- remark: {
13
- zh: "預定班次",
14
- en: "Scheduled",
15
- },
16
- dest: {
17
- zh: "",
18
- en: "",
19
- },
20
- co: "fortuneferry",
21
- })));
22
- /*
23
- * the official API is broken most of the time, keep it for reference
24
- return fetch(
25
- `https://www.hkkfeta.com/opendata/eta/${route.slice(2)}/${bound === "I" ? "inbound" : "outbound"}`,
26
- {
27
- cache: isSafari ? "default" : "no-store",
28
- },
29
- )
30
- .then((response) => response.json())
31
- .then(({ data }) => {
32
- if (!data) return [];
33
-
34
- return data
35
- .map(({ETA}: any) => {
36
- return {
37
- eta: ETA,
38
- remark: {
39
- zh: "",
40
- en: "",
41
- },
42
- dest: {
4
+ function fetchEtas({ route, bound, freq, seq, holidays, serviceDayMap, }) {
5
+ if (seq === 0) {
6
+ const now = new Date();
7
+ return Promise.resolve((0, utils_1.getUpcomingFerry)({ holidays, serviceDayMap, freq, date: new Date() })
8
+ .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
9
+ .map((eta) => ({
10
+ eta: eta,
11
+ remark: {
12
+ zh: "預定班次",
13
+ en: "Scheduled",
14
+ },
15
+ dest: {
43
16
  zh: "",
44
17
  en: "",
45
- },
46
- co: "hkkf",
47
- }
48
- });
49
- });
50
- */
18
+ },
19
+ co: "hkkf",
20
+ })));
21
+ }
22
+ else if (seq === 1) {
23
+ return fetch(`https://www.hkkfeta.com/opendata/eta/${route.slice(2)}/${bound === "I" ? "inbound" : "outbound"}`, {
24
+ cache: utils_1.isSafari ? "default" : "no-store",
25
+ })
26
+ .then((response) => response.json())
27
+ .then(({ data }) => {
28
+ if (!data)
29
+ return [];
30
+ return data.map(({ ETA }) => {
31
+ return {
32
+ eta: ETA,
33
+ remark: {
34
+ zh: "",
35
+ en: "",
36
+ },
37
+ dest: {
38
+ zh: "",
39
+ en: "",
40
+ },
41
+ co: "hkkf",
42
+ };
43
+ });
44
+ });
45
+ }
46
+ else {
47
+ return Promise.resolve([]);
48
+ }
51
49
  }
52
50
  exports.default = fetchEtas;
53
51
  //# sourceMappingURL=hkkf.js.map
package/dist/hkkf.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hkkf.js","sourceRoot":"","sources":["../src/hkkf.ts"],"names":[],"mappings":";;AACA,mCAAqD;AASrD,SAAwB,SAAS,CAAC,EAChC,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,aAAa,GACE;IACf,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,OAAO,OAAO,CAAC,OAAO,CACpB,IAAA,wBAAgB,EAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;SAClE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;SACtE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,GAAG,EAAE,GAAG;QACR,MAAM,EAAE;YACN,EAAE,EAAE,MAAM;YACV,EAAE,EAAE,WAAW;SAChB;QACD,IAAI,EAAE;YACJ,EAAE,EAAE,EAAE;YACN,EAAE,EAAE,EAAE;SACP;QACD,EAAE,EAAE,cAAc;KACnB,CAAC,CAAC,CACN,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4BI;AACN,CAAC;AArDD,4BAqDC"}
1
+ {"version":3,"file":"hkkf.js","sourceRoot":"","sources":["../src/hkkf.ts"],"names":[],"mappings":";;AACA,mCAAqD;AAWrD,SAAwB,SAAS,CAAC,EAChC,KAAK,EACL,KAAK,EACL,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,aAAa,GACE;IACf,IAAI,GAAG,KAAK,CAAC,EAAE;QACb,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,OAAO,CACpB,IAAA,wBAAgB,EAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;aAClE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;aACtE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,GAAG,EAAE,GAAG;YACR,MAAM,EAAE;gBACN,EAAE,EAAE,MAAM;gBACV,EAAE,EAAE,WAAW;aAChB;YACD,IAAI,EAAE;gBACJ,EAAE,EAAE,EAAE;gBACN,EAAE,EAAE,EAAE;aACP;YACD,EAAE,EAAE,MAAM;SACX,CAAC,CAAC,CACN,CAAC;KACH;SAAM,IAAI,GAAG,KAAK,CAAC,EAAE;QACpB,OAAO,KAAK,CACV,wCAAwC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,EAClG;YACE,KAAK,EAAE,gBAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;SACzC,CACF;aACE,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;aACnC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YACjB,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC;YAErB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAO,EAAE,EAAE;gBAC/B,OAAO;oBACL,GAAG,EAAE,GAAG;oBACR,MAAM,EAAE;wBACN,EAAE,EAAE,EAAE;wBACN,EAAE,EAAE,EAAE;qBACP;oBACD,IAAI,EAAE;wBACJ,EAAE,EAAE,EAAE;wBACN,EAAE,EAAE,EAAE;qBACP;oBACD,EAAE,EAAE,MAAM;iBACX,CAAA;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;KACN;SAAM;QACL,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;KAC5B;AACH,CAAC;AAvDD,4BAuDC"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { RouteListEntry, EtaDb, Eta, StopList } from "./type";
2
2
  interface fetchEtasProps extends RouteListEntry {
3
- stopList: StopList;
4
- holidays: EtaDb["holidays"];
5
- serviceDayMap: EtaDb["serviceDayMap"];
3
+ stopList?: StopList;
4
+ holidays?: EtaDb["holidays"];
5
+ serviceDayMap?: EtaDb["serviceDayMap"];
6
6
  language: "zh" | "en";
7
7
  seq: number;
8
8
  }
package/dist/index.js CHANGED
@@ -69,6 +69,9 @@ function fetchEtas({ route, stops, bound, dest, freq, seq, serviceType, co, nlbI
69
69
  _etas = _etas.concat(yield (0, lightRail_1.default)({ stopId: stops.lightRail[seq], route, dest }));
70
70
  }
71
71
  else if (company_id === "mtr" && stops.mtr) {
72
+ if (!stopList) {
73
+ throw new Error("mtr requires stopList");
74
+ }
72
75
  _etas = _etas.concat(yield (0, mtr_1.default)({
73
76
  stopId: stops.mtr[seq],
74
77
  route,
@@ -77,6 +80,15 @@ function fetchEtas({ route, stops, bound, dest, freq, seq, serviceType, co, nlbI
77
80
  }));
78
81
  }
79
82
  else if (company_id === "fortuneferry" && stops.fortuneferry) {
83
+ if (!stopList) {
84
+ throw new Error("fortuneferry requires stopList");
85
+ }
86
+ if (!serviceDayMap) {
87
+ throw new Error("fortuneferry requires serviceDayMap");
88
+ }
89
+ if (!holidays) {
90
+ throw new Error("fortuneferry requires holidays");
91
+ }
80
92
  _etas = _etas.concat(yield (0, fortuneferry_1.default)({
81
93
  stops,
82
94
  seq,
@@ -87,10 +99,29 @@ function fetchEtas({ route, stops, bound, dest, freq, seq, serviceType, co, nlbI
87
99
  }));
88
100
  }
89
101
  else if (company_id === "sunferry" && stops.sunferry) {
102
+ if (!serviceDayMap) {
103
+ throw new Error("sunferry requires serviceDayMap");
104
+ }
105
+ if (!holidays) {
106
+ throw new Error("sunferry requires holidays");
107
+ }
90
108
  _etas = _etas.concat(yield (0, sunferry_1.default)({ route, seq, holidays, serviceDayMap, freq }));
91
109
  }
92
110
  else if (company_id === "hkkf" && stops.hkkf) {
93
- _etas = _etas.concat(yield (0, hkkf_1.default)({ freq, seq, holidays, serviceDayMap }));
111
+ if (!serviceDayMap) {
112
+ throw new Error("hkkf requires serviceDayMap");
113
+ }
114
+ if (!holidays) {
115
+ throw new Error("hkkf requires holidays");
116
+ }
117
+ _etas = _etas.concat(yield (0, hkkf_1.default)({
118
+ route,
119
+ bound: bound.hkkf,
120
+ freq,
121
+ seq,
122
+ holidays,
123
+ serviceDayMap,
124
+ }));
94
125
  }
95
126
  }
96
127
  if (_etas.some((e) => e.eta)) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/sunferry.js CHANGED
@@ -1,60 +1,134 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ const tz_1 = require("@date-fns/tz");
13
+ const date_fns_1 = require("date-fns");
3
14
  const utils_1 = require("./utils");
4
15
  function fetchEtas({ route, seq, freq, holidays, serviceDayMap, }) {
5
- if (seq === 1)
6
- return Promise.resolve([]);
7
- return fetch(`https://www.sunferry.com.hk/eta/?route=${route}`, {
8
- cache: utils_1.isSafari ? "default" : "no-store",
9
- })
10
- .then((response) => response.json())
11
- .then(({ data }) => {
12
- throw new Error("");
13
- if (!data)
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ if (seq > 1) {
18
+ return Promise.resolve([]);
19
+ }
20
+ const apiEtas = yield fetch(`https://www.sunferry.com.hk/eta/?route=${route}`, {
21
+ cache: utils_1.isSafari ? "default" : "no-store",
22
+ })
23
+ .then((response) => response.json())
24
+ .then(({ data, generated_timestamp, }) => {
25
+ if (!data)
26
+ return [];
27
+ return data.map(({ depart_time, eta, rmk_en, rmk_tc, route_tc, route_en }) => {
28
+ var _a, _b;
29
+ /**
30
+ * @param timeString HH:mm
31
+ */
32
+ const guessDateTimeByTimeString = (timeString) => {
33
+ const generated = new tz_1.TZDate(generated_timestamp, "Asia/Hong_Kong");
34
+ const time = (0, date_fns_1.startOfMinute)((0, date_fns_1.set)(generated, {
35
+ hours: parseInt(timeString.split(":")[0], 10),
36
+ minutes: parseInt(timeString.split(":")[1], 10),
37
+ }));
38
+ return (0, date_fns_1.closestTo)(generated, [
39
+ (0, date_fns_1.sub)(time, { days: 1 }),
40
+ time,
41
+ (0, date_fns_1.add)(time, { days: 1 }),
42
+ ]);
43
+ };
44
+ // 橫水渡 - (坪洲-梅窩)
45
+ // 中環 - 長洲
46
+ const [originZh, destZh] = (((_a = /^橫水渡 - \((.*)\)$/.exec(route_tc)) === null || _a === void 0 ? void 0 : _a[1]) || route_tc)
47
+ .split("-")
48
+ .map((s) => s.trim());
49
+ // Inter Islands (Peng Chau - Mui Wo)
50
+ // Central - Cheung Chau
51
+ const [originEn, destEn] = (((_b = /^Inter Islands \((.*)\)$/.exec(route_en)) === null || _b === void 0 ? void 0 : _b[1]) || route_en)
52
+ .split("-")
53
+ .map((s) => s.trim());
54
+ return {
55
+ departTime: (0, date_fns_1.formatISO)(guessDateTimeByTimeString(depart_time)),
56
+ eta: eta ? (0, date_fns_1.formatISO)(guessDateTimeByTimeString(eta)) : null,
57
+ remark: {
58
+ zh: rmk_tc !== null && rmk_tc !== void 0 ? rmk_tc : "",
59
+ en: rmk_en !== null && rmk_en !== void 0 ? rmk_en : "",
60
+ },
61
+ dest: {
62
+ zh: destZh,
63
+ en: destEn,
64
+ },
65
+ co: "sunferry",
66
+ };
67
+ });
68
+ })
69
+ .catch((err) => {
70
+ console.error("Error fetching Sun Ferry ETAs:", err);
14
71
  return [];
15
- return data.map(({ depart_time, rmk_en, rmk_tc, route_tc, route_en }) => {
16
- const date = new Date();
17
- let guess = `${date.getFullYear()}-${("0" + (date.getMonth() + 1)).slice(-2)}-${("0" + date.getDate()).slice(-2)}T${depart_time}:00+08:00`;
18
- if (new Date(guess) < date) {
19
- date.setDate(date.getDate() + 1);
20
- guess = `${date.getFullYear()}-${("0" + (date.getMonth() + 1)).slice(-2)}-${("0" + date.getDate()).slice(-2)}T${depart_time}:00+08:00`;
21
- }
22
- return {
23
- eta: guess,
72
+ });
73
+ if (seq === 0) {
74
+ const greatestApiEtaTime = apiEtas.length > 0
75
+ ? (0, date_fns_1.max)(apiEtas.map((e) => new Date(e.departTime)))
76
+ : undefined;
77
+ const now = new Date();
78
+ return [
79
+ ...apiEtas
80
+ .filter((eta) => (0, date_fns_1.endOfMinute)(new Date(eta.departTime)) >= now && !eta.eta)
81
+ .map((eta) => ({
82
+ eta: eta.departTime,
83
+ remark: {
84
+ zh: [eta.remark.zh, "預定班次"].filter(Boolean).join(";"),
85
+ en: [eta.remark.en, "Scheduled"].filter(Boolean).join("; "),
86
+ },
87
+ dest: eta.dest,
88
+ co: eta.co,
89
+ })),
90
+ ...(0, utils_1.getUpcomingFerry)({
91
+ holidays,
92
+ serviceDayMap,
93
+ freq,
94
+ date: (0, date_fns_1.max)([
95
+ ...(greatestApiEtaTime
96
+ ? [(0, date_fns_1.add)(greatestApiEtaTime, { minutes: 1 })]
97
+ : []),
98
+ now,
99
+ ]),
100
+ })
101
+ .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
102
+ .map((eta) => ({
103
+ eta: eta,
104
+ remark: {
105
+ zh: "預定班次",
106
+ en: "Scheduled",
107
+ },
108
+ dest: {
109
+ zh: "",
110
+ en: "",
111
+ },
112
+ co: "sunferry",
113
+ })),
114
+ ];
115
+ }
116
+ else if (seq === 1) {
117
+ return apiEtas
118
+ .filter((eta) => eta.eta !== null)
119
+ .map((eta) => ({
120
+ eta: eta.eta,
24
121
  remark: {
25
- zh: rmk_tc,
26
- en: rmk_en,
122
+ zh: eta.remark.zh,
123
+ en: eta.remark.en,
27
124
  },
28
- dest: {
29
- zh: route_tc.split(" - ")[1],
30
- en: route_en.split(" - ")[1],
31
- },
32
- co: "sunferry",
33
- };
34
- });
35
- })
36
- .catch(() => {
37
- // the API gives CORS error, the below handling is for browser
38
- const now = new Date();
39
- return (0, utils_1.getUpcomingFerry)({
40
- holidays,
41
- serviceDayMap,
42
- freq,
43
- date: new Date(),
44
- })
45
- .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
46
- .map((eta) => ({
47
- eta: eta,
48
- remark: {
49
- zh: "預定班次",
50
- en: "Scheduled",
51
- },
52
- dest: {
53
- zh: "",
54
- en: "",
55
- },
56
- co: "sunferry",
57
- }));
125
+ dest: eta.dest,
126
+ co: eta.co,
127
+ }));
128
+ }
129
+ else {
130
+ return [];
131
+ }
58
132
  });
59
133
  }
60
134
  exports.default = fetchEtas;
@@ -1 +1 @@
1
- {"version":3,"file":"sunferry.js","sourceRoot":"","sources":["../src/sunferry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sunferry.js","sourceRoot":"","sources":["../src/sunferry.ts"],"names":[],"mappings":"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"}
package/esm/hkkf.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  import type { Eta, EtaDb, RouteListEntry } from "./type";
2
2
  interface fetchEtasProps {
3
+ route: RouteListEntry["route"];
4
+ bound: RouteListEntry["bound"]["hkkf"];
3
5
  freq: RouteListEntry["freq"];
4
6
  seq: number;
5
7
  holidays: EtaDb["holidays"];
6
8
  serviceDayMap: EtaDb["serviceDayMap"];
7
9
  }
8
- export default function fetchEtas({ freq, seq, holidays, serviceDayMap, }: fetchEtasProps): Promise<Eta[]>;
10
+ export default function fetchEtas({ route, bound, freq, seq, holidays, serviceDayMap, }: fetchEtasProps): Promise<Eta[]>;
9
11
  export {};
package/esm/hkkf.js CHANGED
@@ -1,50 +1,48 @@
1
- import { getUpcomingFerry } from "./utils";
2
- export default function fetchEtas({ freq, seq, holidays, serviceDayMap, }) {
3
- if (seq >= 1)
4
- return Promise.resolve([]);
5
- const now = new Date();
6
- return Promise.resolve(getUpcomingFerry({ holidays, serviceDayMap, freq, date: new Date() })
7
- .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
8
- .map((eta) => ({
9
- eta: eta,
10
- remark: {
11
- zh: "預定班次",
12
- en: "Scheduled",
13
- },
14
- dest: {
15
- zh: "",
16
- en: "",
17
- },
18
- co: "fortuneferry",
19
- })));
20
- /*
21
- * the official API is broken most of the time, keep it for reference
22
- return fetch(
23
- `https://www.hkkfeta.com/opendata/eta/${route.slice(2)}/${bound === "I" ? "inbound" : "outbound"}`,
24
- {
25
- cache: isSafari ? "default" : "no-store",
26
- },
27
- )
28
- .then((response) => response.json())
29
- .then(({ data }) => {
30
- if (!data) return [];
31
-
32
- return data
33
- .map(({ETA}: any) => {
34
- return {
35
- eta: ETA,
36
- remark: {
37
- zh: "",
38
- en: "",
39
- },
40
- dest: {
1
+ import { getUpcomingFerry, isSafari } from "./utils";
2
+ export default function fetchEtas({ route, bound, freq, seq, holidays, serviceDayMap, }) {
3
+ if (seq === 0) {
4
+ const now = new Date();
5
+ return Promise.resolve(getUpcomingFerry({ holidays, serviceDayMap, freq, date: new Date() })
6
+ .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
7
+ .map((eta) => ({
8
+ eta: eta,
9
+ remark: {
10
+ zh: "預定班次",
11
+ en: "Scheduled",
12
+ },
13
+ dest: {
41
14
  zh: "",
42
15
  en: "",
43
- },
44
- co: "hkkf",
45
- }
46
- });
47
- });
48
- */
16
+ },
17
+ co: "hkkf",
18
+ })));
19
+ }
20
+ else if (seq === 1) {
21
+ return fetch(`https://www.hkkfeta.com/opendata/eta/${route.slice(2)}/${bound === "I" ? "inbound" : "outbound"}`, {
22
+ cache: isSafari ? "default" : "no-store",
23
+ })
24
+ .then((response) => response.json())
25
+ .then(({ data }) => {
26
+ if (!data)
27
+ return [];
28
+ return data.map(({ ETA }) => {
29
+ return {
30
+ eta: ETA,
31
+ remark: {
32
+ zh: "",
33
+ en: "",
34
+ },
35
+ dest: {
36
+ zh: "",
37
+ en: "",
38
+ },
39
+ co: "hkkf",
40
+ };
41
+ });
42
+ });
43
+ }
44
+ else {
45
+ return Promise.resolve([]);
46
+ }
49
47
  }
50
48
  //# sourceMappingURL=hkkf.js.map
package/esm/hkkf.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hkkf.js","sourceRoot":"","sources":["../src/hkkf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAY,MAAM,SAAS,CAAC;AASrD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,aAAa,GACE;IACf,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,OAAO,OAAO,CAAC,OAAO,CACpB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;SAClE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;SACtE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,GAAG,EAAE,GAAG;QACR,MAAM,EAAE;YACN,EAAE,EAAE,MAAM;YACV,EAAE,EAAE,WAAW;SAChB;QACD,IAAI,EAAE;YACJ,EAAE,EAAE,EAAE;YACN,EAAE,EAAE,EAAE;SACP;QACD,EAAE,EAAE,cAAc;KACnB,CAAC,CAAC,CACN,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4BI;AACN,CAAC"}
1
+ {"version":3,"file":"hkkf.js","sourceRoot":"","sources":["../src/hkkf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAWrD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,KAAK,EACL,KAAK,EACL,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,aAAa,GACE;IACf,IAAI,GAAG,KAAK,CAAC,EAAE;QACb,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,OAAO,CACpB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;aAClE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;aACtE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,GAAG,EAAE,GAAG;YACR,MAAM,EAAE;gBACN,EAAE,EAAE,MAAM;gBACV,EAAE,EAAE,WAAW;aAChB;YACD,IAAI,EAAE;gBACJ,EAAE,EAAE,EAAE;gBACN,EAAE,EAAE,EAAE;aACP;YACD,EAAE,EAAE,MAAM;SACX,CAAC,CAAC,CACN,CAAC;KACH;SAAM,IAAI,GAAG,KAAK,CAAC,EAAE;QACpB,OAAO,KAAK,CACV,wCAAwC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,EAClG;YACE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;SACzC,CACF;aACE,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;aACnC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YACjB,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC;YAErB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAO,EAAE,EAAE;gBAC/B,OAAO;oBACL,GAAG,EAAE,GAAG;oBACR,MAAM,EAAE;wBACN,EAAE,EAAE,EAAE;wBACN,EAAE,EAAE,EAAE;qBACP;oBACD,IAAI,EAAE;wBACJ,EAAE,EAAE,EAAE;wBACN,EAAE,EAAE,EAAE;qBACP;oBACD,EAAE,EAAE,MAAM;iBACX,CAAA;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;KACN;SAAM;QACL,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;KAC5B;AACH,CAAC"}
package/esm/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { RouteListEntry, EtaDb, Eta, StopList } from "./type";
2
2
  interface fetchEtasProps extends RouteListEntry {
3
- stopList: StopList;
4
- holidays: EtaDb["holidays"];
5
- serviceDayMap: EtaDb["serviceDayMap"];
3
+ stopList?: StopList;
4
+ holidays?: EtaDb["holidays"];
5
+ serviceDayMap?: EtaDb["serviceDayMap"];
6
6
  language: "zh" | "en";
7
7
  seq: number;
8
8
  }
package/esm/index.js CHANGED
@@ -39,6 +39,9 @@ export async function fetchEtas({ route, stops, bound, dest, freq, seq, serviceT
39
39
  _etas = _etas.concat(await lightrail({ stopId: stops.lightRail[seq], route, dest }));
40
40
  }
41
41
  else if (company_id === "mtr" && stops.mtr) {
42
+ if (!stopList) {
43
+ throw new Error("mtr requires stopList");
44
+ }
42
45
  _etas = _etas.concat(await mtr({
43
46
  stopId: stops.mtr[seq],
44
47
  route,
@@ -47,6 +50,15 @@ export async function fetchEtas({ route, stops, bound, dest, freq, seq, serviceT
47
50
  }));
48
51
  }
49
52
  else if (company_id === "fortuneferry" && stops.fortuneferry) {
53
+ if (!stopList) {
54
+ throw new Error("fortuneferry requires stopList");
55
+ }
56
+ if (!serviceDayMap) {
57
+ throw new Error("fortuneferry requires serviceDayMap");
58
+ }
59
+ if (!holidays) {
60
+ throw new Error("fortuneferry requires holidays");
61
+ }
50
62
  _etas = _etas.concat(await fortuneferry({
51
63
  stops,
52
64
  seq,
@@ -57,10 +69,29 @@ export async function fetchEtas({ route, stops, bound, dest, freq, seq, serviceT
57
69
  }));
58
70
  }
59
71
  else if (company_id === "sunferry" && stops.sunferry) {
72
+ if (!serviceDayMap) {
73
+ throw new Error("sunferry requires serviceDayMap");
74
+ }
75
+ if (!holidays) {
76
+ throw new Error("sunferry requires holidays");
77
+ }
60
78
  _etas = _etas.concat(await sunferry({ route, seq, holidays, serviceDayMap, freq }));
61
79
  }
62
80
  else if (company_id === "hkkf" && stops.hkkf) {
63
- _etas = _etas.concat(await hkkf({ freq, seq, holidays, serviceDayMap }));
81
+ if (!serviceDayMap) {
82
+ throw new Error("hkkf requires serviceDayMap");
83
+ }
84
+ if (!holidays) {
85
+ throw new Error("hkkf requires holidays");
86
+ }
87
+ _etas = _etas.concat(await hkkf({
88
+ route,
89
+ bound: bound.hkkf,
90
+ freq,
91
+ seq,
92
+ holidays,
93
+ serviceDayMap,
94
+ }));
64
95
  }
65
96
  }
66
97
  if (_etas.some((e) => e.eta)) {
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/esm/sunferry.js CHANGED
@@ -1,58 +1,121 @@
1
+ import { TZDate } from "@date-fns/tz";
2
+ import { add, closestTo, endOfMinute, formatISO, max, set, startOfMinute, sub, } from "date-fns";
1
3
  import { getUpcomingFerry, isSafari } from "./utils";
2
- export default function fetchEtas({ route, seq, freq, holidays, serviceDayMap, }) {
3
- if (seq === 1)
4
+ export default async function fetchEtas({ route, seq, freq, holidays, serviceDayMap, }) {
5
+ if (seq > 1) {
4
6
  return Promise.resolve([]);
5
- return fetch(`https://www.sunferry.com.hk/eta/?route=${route}`, {
7
+ }
8
+ const apiEtas = await fetch(`https://www.sunferry.com.hk/eta/?route=${route}`, {
6
9
  cache: isSafari ? "default" : "no-store",
7
10
  })
8
11
  .then((response) => response.json())
9
- .then(({ data }) => {
10
- throw new Error("");
12
+ .then(({ data, generated_timestamp, }) => {
11
13
  if (!data)
12
14
  return [];
13
- return data.map(({ depart_time, rmk_en, rmk_tc, route_tc, route_en }) => {
14
- const date = new Date();
15
- let guess = `${date.getFullYear()}-${("0" + (date.getMonth() + 1)).slice(-2)}-${("0" + date.getDate()).slice(-2)}T${depart_time}:00+08:00`;
16
- if (new Date(guess) < date) {
17
- date.setDate(date.getDate() + 1);
18
- guess = `${date.getFullYear()}-${("0" + (date.getMonth() + 1)).slice(-2)}-${("0" + date.getDate()).slice(-2)}T${depart_time}:00+08:00`;
19
- }
15
+ return data.map(({ depart_time, eta, rmk_en, rmk_tc, route_tc, route_en }) => {
16
+ var _a, _b;
17
+ /**
18
+ * @param timeString HH:mm
19
+ */
20
+ const guessDateTimeByTimeString = (timeString) => {
21
+ const generated = new TZDate(generated_timestamp, "Asia/Hong_Kong");
22
+ const time = startOfMinute(set(generated, {
23
+ hours: parseInt(timeString.split(":")[0], 10),
24
+ minutes: parseInt(timeString.split(":")[1], 10),
25
+ }));
26
+ return closestTo(generated, [
27
+ sub(time, { days: 1 }),
28
+ time,
29
+ add(time, { days: 1 }),
30
+ ]);
31
+ };
32
+ // 橫水渡 - (坪洲-梅窩)
33
+ // 中環 - 長洲
34
+ const [originZh, destZh] = (((_a = /^橫水渡 - \((.*)\)$/.exec(route_tc)) === null || _a === void 0 ? void 0 : _a[1]) || route_tc)
35
+ .split("-")
36
+ .map((s) => s.trim());
37
+ // Inter Islands (Peng Chau - Mui Wo)
38
+ // Central - Cheung Chau
39
+ const [originEn, destEn] = (((_b = /^Inter Islands \((.*)\)$/.exec(route_en)) === null || _b === void 0 ? void 0 : _b[1]) || route_en)
40
+ .split("-")
41
+ .map((s) => s.trim());
20
42
  return {
21
- eta: guess,
43
+ departTime: formatISO(guessDateTimeByTimeString(depart_time)),
44
+ eta: eta ? formatISO(guessDateTimeByTimeString(eta)) : null,
22
45
  remark: {
23
- zh: rmk_tc,
24
- en: rmk_en,
46
+ zh: rmk_tc !== null && rmk_tc !== void 0 ? rmk_tc : "",
47
+ en: rmk_en !== null && rmk_en !== void 0 ? rmk_en : "",
25
48
  },
26
49
  dest: {
27
- zh: route_tc.split(" - ")[1],
28
- en: route_en.split(" - ")[1],
50
+ zh: destZh,
51
+ en: destEn,
29
52
  },
30
53
  co: "sunferry",
31
54
  };
32
55
  });
33
56
  })
34
- .catch(() => {
35
- // the API gives CORS error, the below handling is for browser
57
+ .catch((err) => {
58
+ console.error("Error fetching Sun Ferry ETAs:", err);
59
+ return [];
60
+ });
61
+ if (seq === 0) {
62
+ const greatestApiEtaTime = apiEtas.length > 0
63
+ ? max(apiEtas.map((e) => new Date(e.departTime)))
64
+ : undefined;
36
65
  const now = new Date();
37
- return getUpcomingFerry({
38
- holidays,
39
- serviceDayMap,
40
- freq,
41
- date: new Date(),
42
- })
43
- .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
66
+ return [
67
+ ...apiEtas
68
+ .filter((eta) => endOfMinute(new Date(eta.departTime)) >= now && !eta.eta)
69
+ .map((eta) => ({
70
+ eta: eta.departTime,
71
+ remark: {
72
+ zh: [eta.remark.zh, "預定班次"].filter(Boolean).join(";"),
73
+ en: [eta.remark.en, "Scheduled"].filter(Boolean).join("; "),
74
+ },
75
+ dest: eta.dest,
76
+ co: eta.co,
77
+ })),
78
+ ...getUpcomingFerry({
79
+ holidays,
80
+ serviceDayMap,
81
+ freq,
82
+ date: max([
83
+ ...(greatestApiEtaTime
84
+ ? [add(greatestApiEtaTime, { minutes: 1 })]
85
+ : []),
86
+ now,
87
+ ]),
88
+ })
89
+ .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
90
+ .map((eta) => ({
91
+ eta: eta,
92
+ remark: {
93
+ zh: "預定班次",
94
+ en: "Scheduled",
95
+ },
96
+ dest: {
97
+ zh: "",
98
+ en: "",
99
+ },
100
+ co: "sunferry",
101
+ })),
102
+ ];
103
+ }
104
+ else if (seq === 1) {
105
+ return apiEtas
106
+ .filter((eta) => eta.eta !== null)
44
107
  .map((eta) => ({
45
- eta: eta,
108
+ eta: eta.eta,
46
109
  remark: {
47
- zh: "預定班次",
48
- en: "Scheduled",
110
+ zh: eta.remark.zh,
111
+ en: eta.remark.en,
49
112
  },
50
- dest: {
51
- zh: "",
52
- en: "",
53
- },
54
- co: "sunferry",
113
+ dest: eta.dest,
114
+ co: eta.co,
55
115
  }));
56
- });
116
+ }
117
+ else {
118
+ return [];
119
+ }
57
120
  }
58
121
  //# sourceMappingURL=sunferry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sunferry.js","sourceRoot":"","sources":["../src/sunferry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sunferry.js","sourceRoot":"","sources":["../src/sunferry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hk-bus-eta",
3
- "version": "3.7.7",
3
+ "version": "3.7.8",
4
4
  "description": "Query the ETA (Estimated Time of Arrival) of HK Bus/Minibus/MTR/Lightrail",
5
5
  "main": "dist/index.js",
6
6
  "module": "esm/index.js",
@@ -51,6 +51,7 @@
51
51
  "typescript": "^5.2.2"
52
52
  },
53
53
  "dependencies": {
54
+ "@date-fns/tz": "^1.4.1",
54
55
  "date-fns": "^4.1.0",
55
56
  "date-fns-tz": "^3.2.0"
56
57
  }
package/src/hkkf.ts CHANGED
@@ -2,6 +2,8 @@ import type { Eta, EtaDb, RouteListEntry } from "./type";
2
2
  import { getUpcomingFerry, isSafari } from "./utils";
3
3
 
4
4
  interface fetchEtasProps {
5
+ route: RouteListEntry["route"];
6
+ bound: RouteListEntry["bound"]["hkkf"];
5
7
  freq: RouteListEntry["freq"];
6
8
  seq: number;
7
9
  holidays: EtaDb["holidays"];
@@ -9,43 +11,43 @@ interface fetchEtasProps {
9
11
  }
10
12
 
11
13
  export default function fetchEtas({
14
+ route,
15
+ bound,
12
16
  freq,
13
17
  seq,
14
18
  holidays,
15
19
  serviceDayMap,
16
20
  }: fetchEtasProps): Promise<Eta[]> {
17
- if (seq >= 1) return Promise.resolve([]);
18
- const now = new Date();
19
- return Promise.resolve(
20
- getUpcomingFerry({ holidays, serviceDayMap, freq, date: new Date() })
21
- .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
22
- .map((eta) => ({
23
- eta: eta,
24
- remark: {
25
- zh: "預定班次",
26
- en: "Scheduled",
27
- },
28
- dest: {
29
- zh: "",
30
- en: "",
31
- },
32
- co: "fortuneferry",
33
- })),
34
- );
35
- /*
36
- * the official API is broken most of the time, keep it for reference
37
- return fetch(
38
- `https://www.hkkfeta.com/opendata/eta/${route.slice(2)}/${bound === "I" ? "inbound" : "outbound"}`,
39
- {
40
- cache: isSafari ? "default" : "no-store",
41
- },
42
- )
43
- .then((response) => response.json())
44
- .then(({ data }) => {
45
- if (!data) return [];
46
-
47
- return data
48
- .map(({ETA}: any) => {
21
+ if (seq === 0) {
22
+ const now = new Date();
23
+ return Promise.resolve(
24
+ getUpcomingFerry({ holidays, serviceDayMap, freq, date: new Date() })
25
+ .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
26
+ .map((eta) => ({
27
+ eta: eta,
28
+ remark: {
29
+ zh: "預定班次",
30
+ en: "Scheduled",
31
+ },
32
+ dest: {
33
+ zh: "",
34
+ en: "",
35
+ },
36
+ co: "hkkf",
37
+ }))
38
+ );
39
+ } else if (seq === 1) {
40
+ return fetch(
41
+ `https://www.hkkfeta.com/opendata/eta/${route.slice(2)}/${bound === "I" ? "inbound" : "outbound"}`,
42
+ {
43
+ cache: isSafari ? "default" : "no-store",
44
+ }
45
+ )
46
+ .then((response) => response.json())
47
+ .then(({ data }) => {
48
+ if (!data) return [];
49
+
50
+ return data.map(({ ETA }: any) => {
49
51
  return {
50
52
  eta: ETA,
51
53
  remark: {
@@ -59,6 +61,8 @@ export default function fetchEtas({
59
61
  co: "hkkf",
60
62
  }
61
63
  });
62
- });
63
- */
64
+ });
65
+ } else {
66
+ return Promise.resolve([]);
67
+ }
64
68
  }
package/src/index.ts CHANGED
@@ -11,10 +11,19 @@ import hkkf from "./hkkf";
11
11
  import { RouteListEntry, EtaDb, Eta, StopList } from "./type";
12
12
 
13
13
  interface fetchEtasProps extends RouteListEntry {
14
- stopList: StopList;
15
- holidays: EtaDb["holidays"];
16
- serviceDayMap: EtaDb["serviceDayMap"];
14
+ // For mtr and fortuneferry query. Optional
15
+ stopList?: StopList;
16
+
17
+ // For fortuneferry, sunferry, hkkf query. Optional
18
+ holidays?: EtaDb["holidays"];
19
+
20
+ // For fortuneferry, sunferry, hkkf query. Optional
21
+ serviceDayMap?: EtaDb["serviceDayMap"];
22
+
23
+ // Language for the output ETA
17
24
  language: "zh" | "en";
25
+
26
+ // Sequence number of the stop in the stops array
18
27
  seq: number;
19
28
  }
20
29
 
@@ -68,6 +77,9 @@ export async function fetchEtas({
68
77
  await lightrail({ stopId: stops.lightRail[seq], route, dest }),
69
78
  );
70
79
  } else if (company_id === "mtr" && stops.mtr) {
80
+ if (!stopList) {
81
+ throw new Error("mtr requires stopList");
82
+ }
71
83
  _etas = _etas.concat(
72
84
  await mtr({
73
85
  stopId: stops.mtr[seq],
@@ -77,6 +89,15 @@ export async function fetchEtas({
77
89
  }),
78
90
  );
79
91
  } else if (company_id === "fortuneferry" && stops.fortuneferry) {
92
+ if (!stopList) {
93
+ throw new Error("fortuneferry requires stopList");
94
+ }
95
+ if (!serviceDayMap) {
96
+ throw new Error("fortuneferry requires serviceDayMap");
97
+ }
98
+ if (!holidays) {
99
+ throw new Error("fortuneferry requires holidays");
100
+ }
80
101
  _etas = _etas.concat(
81
102
  await fortuneferry({
82
103
  stops,
@@ -88,12 +109,31 @@ export async function fetchEtas({
88
109
  }),
89
110
  );
90
111
  } else if (company_id === "sunferry" && stops.sunferry) {
112
+ if (!serviceDayMap) {
113
+ throw new Error("sunferry requires serviceDayMap");
114
+ }
115
+ if (!holidays) {
116
+ throw new Error("sunferry requires holidays");
117
+ }
91
118
  _etas = _etas.concat(
92
119
  await sunferry({ route, seq, holidays, serviceDayMap, freq }),
93
120
  );
94
121
  } else if (company_id === "hkkf" && stops.hkkf) {
122
+ if (!serviceDayMap) {
123
+ throw new Error("hkkf requires serviceDayMap");
124
+ }
125
+ if (!holidays) {
126
+ throw new Error("hkkf requires holidays");
127
+ }
95
128
  _etas = _etas.concat(
96
- await hkkf({ freq, seq, holidays, serviceDayMap }),
129
+ await hkkf({
130
+ route,
131
+ bound: bound.hkkf,
132
+ freq,
133
+ seq,
134
+ holidays,
135
+ serviceDayMap,
136
+ })
97
137
  );
98
138
  }
99
139
  }
package/src/sunferry.ts CHANGED
@@ -1,3 +1,14 @@
1
+ import { TZDate } from "@date-fns/tz";
2
+ import {
3
+ add,
4
+ closestTo,
5
+ endOfMinute,
6
+ formatISO,
7
+ max,
8
+ set,
9
+ startOfMinute,
10
+ sub,
11
+ } from "date-fns";
1
12
  import type { Eta, EtaDb, Freq, RouteListEntry } from "./type";
2
13
  import { getUpcomingFerry, isSafari } from "./utils";
3
14
 
@@ -9,53 +20,139 @@ interface fetchEtasProps {
9
20
  serviceDayMap: EtaDb["serviceDayMap"];
10
21
  }
11
22
 
12
- export default function fetchEtas({
23
+ export default async function fetchEtas({
13
24
  route,
14
25
  seq,
15
26
  freq,
16
27
  holidays,
17
28
  serviceDayMap,
18
29
  }: fetchEtasProps): Promise<Eta[]> {
19
- if (seq === 1) return Promise.resolve([]);
30
+ if (seq > 1) {
31
+ return Promise.resolve([]);
32
+ }
20
33
 
21
- return fetch(`https://www.sunferry.com.hk/eta/?route=${route}`, {
22
- cache: isSafari ? "default" : "no-store",
23
- })
34
+ const apiEtas = await fetch(
35
+ `https://www.sunferry.com.hk/eta/?route=${route}`,
36
+ {
37
+ cache: isSafari ? "default" : "no-store",
38
+ }
39
+ )
24
40
  .then((response) => response.json())
25
- .then(({ data }) => {
26
- throw new Error("");
27
- if (!data) return [];
28
- return data.map(
29
- ({ depart_time, rmk_en, rmk_tc, route_tc, route_en }: any) => {
30
- const date = new Date();
31
- let guess = `${date.getFullYear()}-${("0" + (date.getMonth() + 1)).slice(-2)}-${("0" + date.getDate()).slice(-2)}T${depart_time}:00+08:00`;
32
- if (new Date(guess) < date) {
33
- date.setDate(date.getDate() + 1);
34
- guess = `${date.getFullYear()}-${("0" + (date.getMonth() + 1)).slice(-2)}-${("0" + date.getDate()).slice(-2)}T${depart_time}:00+08:00`;
41
+ .then(
42
+ ({
43
+ data,
44
+ generated_timestamp,
45
+ }: {
46
+ data:
47
+ | {
48
+ routecode: string;
49
+ route_en: string;
50
+ route_tc: string;
51
+ route_sc: string;
52
+ vesselcode?: string;
53
+ depart_time: string;
54
+ lat: string | null;
55
+ lng: string | null;
56
+ eta: string | null;
57
+ rmk_en: string | null;
58
+ rmk_tc: string | null;
59
+ rmk_sc: string | null;
60
+ date_timestamp: string;
61
+ }[]
62
+ | null;
63
+ generated_timestamp: string;
64
+ }) => {
65
+ if (!data) return [];
66
+ return data.map(
67
+ ({ depart_time, eta, rmk_en, rmk_tc, route_tc, route_en }) => {
68
+ /**
69
+ * @param timeString HH:mm
70
+ */
71
+ const guessDateTimeByTimeString = (timeString: string) => {
72
+ const generated = new TZDate(
73
+ generated_timestamp,
74
+ "Asia/Hong_Kong"
75
+ );
76
+ const time = startOfMinute(
77
+ set(generated, {
78
+ hours: parseInt(timeString.split(":")[0], 10),
79
+ minutes: parseInt(timeString.split(":")[1], 10),
80
+ })
81
+ );
82
+ return closestTo(generated, [
83
+ sub(time, { days: 1 }),
84
+ time,
85
+ add(time, { days: 1 }),
86
+ ])!;
87
+ };
88
+
89
+ // 橫水渡 - (坪洲-梅窩)
90
+ // 中環 - 長洲
91
+ const [originZh, destZh] = (
92
+ /^橫水渡 - \((.*)\)$/.exec(route_tc)?.[1] || route_tc
93
+ )
94
+ .split("-")
95
+ .map((s) => s.trim());
96
+ // Inter Islands (Peng Chau - Mui Wo)
97
+ // Central - Cheung Chau
98
+ const [originEn, destEn] = (
99
+ /^Inter Islands \((.*)\)$/.exec(route_en)?.[1] || route_en
100
+ )
101
+ .split("-")
102
+ .map((s) => s.trim());
103
+
104
+ return {
105
+ departTime: formatISO(guessDateTimeByTimeString(depart_time)),
106
+ eta: eta ? formatISO(guessDateTimeByTimeString(eta)) : null, // No ETA: Not yet departed OR already arrived at destination
107
+ remark: {
108
+ zh: rmk_tc ?? "",
109
+ en: rmk_en ?? "",
110
+ },
111
+ dest: {
112
+ zh: destZh,
113
+ en: destEn,
114
+ },
115
+ co: "sunferry" as const,
116
+ };
35
117
  }
36
- return {
37
- eta: guess,
38
- remark: {
39
- zh: rmk_tc,
40
- en: rmk_en,
41
- },
42
- dest: {
43
- zh: route_tc.split(" - ")[1],
44
- en: route_en.split(" - ")[1],
45
- },
46
- co: "sunferry",
47
- };
48
- },
49
- );
50
- })
51
- .catch(() => {
52
- // the API gives CORS error, the below handling is for browser
53
- const now = new Date();
54
- return getUpcomingFerry({
118
+ );
119
+ }
120
+ )
121
+ .catch((err) => {
122
+ console.error("Error fetching Sun Ferry ETAs:", err);
123
+ return [];
124
+ });
125
+
126
+ if (seq === 0) {
127
+ const greatestApiEtaTime =
128
+ apiEtas.length > 0
129
+ ? max(apiEtas.map((e) => new Date(e.departTime)))
130
+ : undefined;
131
+ const now = new Date();
132
+ return [
133
+ ...apiEtas
134
+ .filter(
135
+ (eta) => endOfMinute(new Date(eta.departTime)) >= now && !eta.eta
136
+ )
137
+ .map((eta) => ({
138
+ eta: eta.departTime,
139
+ remark: {
140
+ zh: [eta.remark.zh, "預定班次"].filter(Boolean).join(";"),
141
+ en: [eta.remark.en, "Scheduled"].filter(Boolean).join("; "),
142
+ },
143
+ dest: eta.dest,
144
+ co: eta.co,
145
+ })),
146
+ ...getUpcomingFerry({
55
147
  holidays,
56
148
  serviceDayMap,
57
149
  freq,
58
- date: new Date(),
150
+ date: max([
151
+ ...(greatestApiEtaTime
152
+ ? [add(greatestApiEtaTime, { minutes: 1 })]
153
+ : []),
154
+ now,
155
+ ]),
59
156
  })
60
157
  .filter((v) => new Date(v).getTime() - now.getTime() < 180 * 60 * 1000)
61
158
  .map((eta) => ({
@@ -68,7 +165,22 @@ export default function fetchEtas({
68
165
  zh: "",
69
166
  en: "",
70
167
  },
71
- co: "sunferry",
72
- }));
73
- });
168
+ co: "sunferry" as const,
169
+ })),
170
+ ];
171
+ } else if (seq === 1) {
172
+ return apiEtas
173
+ .filter((eta) => eta.eta !== null)
174
+ .map((eta) => ({
175
+ eta: eta.eta!,
176
+ remark: {
177
+ zh: eta.remark.zh,
178
+ en: eta.remark.en,
179
+ },
180
+ dest: eta.dest,
181
+ co: eta.co,
182
+ }));
183
+ } else {
184
+ return [];
185
+ }
74
186
  }