@idm-plugin/vessel 1.0.4 → 1.0.6

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.
@@ -55,3 +55,4 @@ export declare class AlertHelper {
55
55
  };
56
56
  };
57
57
  }
58
+ export declare const alertHelper: AlertHelper;
package/dist/index.js CHANGED
@@ -1,60 +1,61 @@
1
1
  var C = Object.defineProperty;
2
- var O = (j, c, s) => c in j ? C(j, c, { enumerable: !0, configurable: !0, writable: !0, value: s }) : j[c] = s;
3
- var q = (j, c, s) => (O(j, typeof c != "symbol" ? c + "" : c, s), s);
2
+ var O = (M, c, e) => c in M ? C(M, c, { enumerable: !0, configurable: !0, writable: !0, value: e }) : M[c] = e;
3
+ var q = (M, c, e) => (O(M, typeof c != "symbol" ? c + "" : c, e), e);
4
4
  import Y from "got";
5
5
  import * as W from "log4js";
6
6
  import p from "moment";
7
- const M = W.getLogger();
7
+ const j = W.getLogger();
8
+ j.level = "info";
8
9
  class V {
9
10
  /**
10
11
  * 解析AIS状态码
11
12
  * @param status
12
13
  */
13
14
  parseStatus(c) {
14
- let s, n;
15
+ let e, n;
15
16
  switch (c) {
16
17
  case 0:
17
- s = "在航(主机推动)", n = "The engine is in use";
18
+ e = "在航(主机推动)", n = "The engine is in use";
18
19
  break;
19
20
  case 1:
20
- s = "锚泊", n = "Anchored";
21
+ e = "锚泊", n = "Anchored";
21
22
  break;
22
23
  case 2:
23
- s = "失控", n = "Not operated";
24
+ e = "失控", n = "Not operated";
24
25
  break;
25
26
  case 3:
26
- s = "操纵受限", n = "Limited airworthiness";
27
+ e = "操纵受限", n = "Limited airworthiness";
27
28
  break;
28
29
  case 4:
29
- s = "吃水受限", n = "Limited by ship's draft";
30
+ e = "吃水受限", n = "Limited by ship's draft";
30
31
  break;
31
32
  case 5:
32
- s = "靠泊", n = "Mooring";
33
+ e = "靠泊", n = "Mooring";
33
34
  break;
34
35
  case 6:
35
- s = "搁浅", n = "Stranded";
36
+ e = "搁浅", n = "Stranded";
36
37
  break;
37
38
  case 7:
38
- s = "捕捞作业", n = "Engaged in fishing";
39
+ e = "捕捞作业", n = "Engaged in fishing";
39
40
  break;
40
41
  case 8:
41
- s = "靠帆船提供动力", n = "Sailing";
42
+ e = "靠帆船提供动力", n = "Sailing";
42
43
  break;
43
44
  default:
44
- s = "未定义", n = "Undefined";
45
+ e = "未定义", n = "Undefined";
45
46
  }
46
- return { labelCn: s, labelEn: n };
47
+ return { labelCn: e, labelEn: n };
47
48
  }
48
49
  }
49
- class G extends V {
50
- constructor(s, n) {
50
+ class B extends V {
51
+ constructor(e, n) {
51
52
  super();
52
53
  q(this, "clientId");
53
54
  q(this, "clientSecret");
54
55
  q(this, "token");
55
- this.clientId = s, this.clientSecret = n;
56
+ this.clientId = e, this.clientSecret = n;
56
57
  }
57
- async authToken(s = {}) {
58
+ async authToken(e = {}) {
58
59
  const n = "https://svc.data.myvessel.cn/ada/oauth/token", a = {
59
60
  searchParams: {
60
61
  client_id: this.clientId,
@@ -62,7 +63,7 @@ class G extends V {
62
63
  grant_type: "client_credentials"
63
64
  }
64
65
  }, o = await Y.post(n, a).json();
65
- M.info("[%s] fetch access token from: %s - %j", s.requestId, n, o), o.error || (this.token = {
66
+ j.info("[%s] fetch access token from: %s - %j", e.requestId, n, o), o.error || (this.token = {
66
67
  accessToken: o.access_token,
67
68
  tokenType: o.token_type,
68
69
  expiresIn: o.expires_in,
@@ -71,20 +72,20 @@ class G extends V {
71
72
  issuedAt: p().utc().format()
72
73
  });
73
74
  }
74
- async realTimePosition(s, n = {}) {
75
+ async realTimePosition(e, n = {}) {
75
76
  var d, h, f;
76
77
  (!this.token || p().diff(p(this.token.issuedAt), "seconds") > ((d = this.token) == null ? void 0 : d.expiresIn) - 300) && await this.authToken(n);
77
78
  const a = "https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit", o = {
78
79
  headers: {
79
80
  Authorization: `${(h = this.token) == null ? void 0 : h.tokenType} ${(f = this.token) == null ? void 0 : f.accessToken}`
80
81
  },
81
- searchParams: { mmsi: s }
82
+ searchParams: { mmsi: e }
82
83
  };
83
- M.info("[%s] fetch realtime position from: %s - %j", n.requestId, a, o);
84
- const e = await Y.get(a, o).json();
85
- if (e.code)
86
- return M.warn("[%s] fetch realtime position failed: %j", n.requestId, a, { message: e.message, status: e.status, code: e.code }), e;
87
- const t = e.data;
84
+ j.info("[%s] fetch realtime position from: %s - %j", n.requestId, a, o);
85
+ const s = await Y.get(a, o).json();
86
+ if (s.code)
87
+ return j.warn("[%s] fetch realtime position failed: %j", n.requestId, a, { message: s.message, status: s.status, code: s.code }), s;
88
+ const t = s.data;
88
89
  for (const m in t)
89
90
  !isNaN(t[m]) && Number(t[m]) !== 1 / 0 && (t[m] = Number(t[m]));
90
91
  const r = p(`${t.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
@@ -113,35 +114,35 @@ class G extends V {
113
114
  utc: r.utc().format()
114
115
  };
115
116
  }
116
- async trajectory(s, n, a, o, e = !0, t = {}) {
117
+ async trajectory(e, n, a, o, s = !0, t = {}) {
117
118
  (!this.token || p().diff(p(this.token.issuedAt), "seconds") > this.token.expiresIn - 300) && await this.authToken(t);
118
- const r = await this.realTimePosition(s, t), i = p(n), d = p(a), h = [];
119
+ const r = await this.realTimePosition(e, t), i = p(n), d = p(a), h = [];
119
120
  for (; d.diff(i, "day", !0) > 30; )
120
- await this.trajectoryIn30Day(s, i, i.clone().add(30, "day"), r, o, h, t), i.add(30, "day");
121
- return await this.trajectoryIn30Day(s, i, d, r, o, h, t), h;
121
+ await this.trajectoryIn30Day(e, i, i.clone().add(30, "day"), r, o, h, t), i.add(30, "day");
122
+ return await this.trajectoryIn30Day(e, i, d, r, o, h, t), h;
122
123
  }
123
- async trajectoryIn30Day(s, n, a, o, e, t, r = {}) {
124
- var u, b, w, k, v;
124
+ async trajectoryIn30Day(e, n, a, o, s, t, r = {}) {
125
+ var u, b, w, k, I;
125
126
  const i = "https://svc.data.myvessel.cn/sdc/v1/vessels/status/track", d = {
126
127
  headers: {
127
128
  Authorization: `${(u = this.token) == null ? void 0 : u.tokenType} ${(b = this.token) == null ? void 0 : b.accessToken}`
128
129
  },
129
130
  json: {
130
- mmsi: s,
131
+ mmsi: e,
131
132
  startTime: n.utcOffset(8).format("YYYY-MM-DD HH:mm:ss"),
132
133
  endTime: a.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")
133
134
  }
134
135
  };
135
- M.info("[%s] fetch trajectory from: %s - %j", r.requestId, i, d);
136
+ j.info("[%s] fetch trajectory from: %s - %j", r.requestId, i, d);
136
137
  const h = await Y.post(i, d).json();
137
138
  if (h.code)
138
- return M.warn("[%s] fetch trajectory failed: %j", r.requestId, i, { message: h.message, status: h.status, code: h.code }), h;
139
+ return j.warn("[%s] fetch trajectory failed: %j", r.requestId, i, { message: h.message, status: h.status, code: h.code }), h;
139
140
  let f = -1;
140
141
  const m = p(`${(k = (w = h.data) == null ? void 0 : w[0]) == null ? void 0 : k.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
141
- return (v = h.data) == null || v.forEach((g) => {
142
+ return (I = h.data) == null || I.forEach((g) => {
142
143
  for (const N in g)
143
144
  !isNaN(g[N]) && Number(g[N]) !== 1 / 0 && (g[N] = Number(g[N]));
144
- const I = p(`${g.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00"), S = g.eta ? p(`${g.eta} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00") : void 0, l = g.status, { labelCn: H, labelEn: _ } = this.parseStatus(l), R = {
145
+ const v = p(`${g.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00"), S = g.eta ? p(`${g.eta} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00") : void 0, l = g.status, { labelCn: H, labelEn: _ } = this.parseStatus(l), R = {
145
146
  mmsi: g.mmsi,
146
147
  imo: o == null ? void 0 : o.imo,
147
148
  lat: g.lat,
@@ -153,34 +154,34 @@ class G extends V {
153
154
  status: l,
154
155
  eta: S == null ? void 0 : S.unix(),
155
156
  destination: g.dest,
156
- positionTime: I.unix(),
157
+ positionTime: v.unix(),
157
158
  labelCn: H,
158
159
  labelEn: _,
159
160
  method: "trajectory",
160
161
  vendor: "myVessel",
161
- utc: I.utc().format()
162
- }, E = Math.floor(I.diff(m, "minute", !0) / (e || 1));
162
+ utc: v.utc().format()
163
+ }, E = Math.floor(v.diff(m, "minute", !0) / (s || 1));
163
164
  E !== f && (f = E, t.push(R));
164
165
  }), t;
165
166
  }
166
167
  }
167
- class B extends V {
168
- constructor(s) {
168
+ class U extends V {
169
+ constructor(e) {
169
170
  super();
170
171
  q(this, "token");
171
- this.token = s;
172
+ this.token = e;
172
173
  }
173
- async realTimePosition(s, n = {}) {
174
+ async realTimePosition(e, n = {}) {
174
175
  const a = "https://api.hifleet.com/position/position/get/token", o = {
175
176
  searchParams: {
176
- mmsi: s,
177
+ mmsi: e,
177
178
  usertoken: this.token
178
179
  }
179
- }, e = await Y.post(a, o).json();
180
- M.info("[%s] fetch realtime position from: %s - %j", n.requestId, a, o);
181
- const t = e == null ? void 0 : e.list;
180
+ }, s = await Y.post(a, o).json();
181
+ j.info("[%s] fetch realtime position from: %s - %j", n.requestId, a, o);
182
+ const t = s == null ? void 0 : s.list;
182
183
  if (!t)
183
- return M.warn("[%s] fetch realtime position failed: %j", n.requestId, a, e), e;
184
+ return j.warn("[%s] fetch realtime position failed: %j", n.requestId, a, s), s;
184
185
  for (const m in t)
185
186
  !isNaN(t[m]) && Number(t[m]) !== 1 / 0 && (t[m] = Number(t[m]));
186
187
  t.status = t.sp > 3 ? 0 : 1;
@@ -210,11 +211,11 @@ class B extends V {
210
211
  vendor: "hifleet"
211
212
  };
212
213
  }
213
- async search(s, n = {}) {
214
+ async search(e, n = {}) {
214
215
  let a = "https://www.hifleet.com/hifleetapi/searchVesselOL.do";
215
216
  const o = {
216
217
  searchParams: {
217
- keyword: s
218
+ keyword: e
218
219
  },
219
220
  headers: {
220
221
  Referer: "https://www.hifleet.com",
@@ -222,27 +223,27 @@ class B extends V {
222
223
  Host: "www.hifleet.com"
223
224
  }
224
225
  };
225
- let e = await Y.post(a, o).json();
226
- M.info("[%s] fetch vessel props from: %s - %j", n.requestId, a, o), e instanceof Array && (e = e[0]);
227
- for (const r in e)
228
- !isNaN(e[r]) && Number(e[r]) !== 1 / 0 && (e[r] = Number(e[r]));
226
+ let s = await Y.post(a, o).json();
227
+ j.info("[%s] fetch vessel props from: %s - %j", n.requestId, a, o), s instanceof Array && (s = s[0]);
228
+ for (const r in s)
229
+ !isNaN(s[r]) && Number(s[r]) !== 1 / 0 && (s[r] = Number(s[r]));
229
230
  const t = {
230
- mmsi: e.m,
231
- name: e.n,
232
- imo: e.i,
233
- callSign: e.c,
234
- length: e.l,
235
- breadth: e.b,
236
- draught: e.dr
231
+ mmsi: s.m,
232
+ name: s.n,
233
+ imo: s.i,
234
+ callSign: s.c,
235
+ length: s.l,
236
+ breadth: s.b,
237
+ draught: s.dr
237
238
  };
238
- return a = "https://www.hifleet.com/hifleetapi/sameShipSearch.do", e = await Y.post(a, o).json(), M.info("[%s] fetch vessel dead weight from: %s - %j", n.requestId, a, o), e instanceof Array && (e = e[0]), e && (t.deadweight = Number(e.dwt)), t;
239
+ return a = "https://www.hifleet.com/hifleetapi/sameShipSearch.do", s = await Y.post(a, o).json(), j.info("[%s] fetch vessel dead weight from: %s - %j", n.requestId, a, o), s instanceof Array && (s = s[0]), s && (t.deadweight = Number(s.dwt)), t;
239
240
  }
240
- async trajectory(s, n, a, o, e = !0, t = {}) {
241
- var g, I, S;
242
- const r = await this.realTimePosition(s, t);
241
+ async trajectory(e, n, a, o, s = !0, t = {}) {
242
+ var g, v, S;
243
+ const r = await this.realTimePosition(e, t);
243
244
  let i = p(n);
244
245
  const d = p(a), h = p();
245
- if (e) {
246
+ if (s) {
246
247
  let l = d.diff(i, "d", !0);
247
248
  l < 0 ? i = d.clone().subtract(40, "d") : l < 30 ? i.subtract(10, "d") : l < 60 ? i.subtract(5, "d") : i = d.clone().subtract(80, "d"), l = h.diff(d, "d", !0), d.add(l > 10 ? 240 : l * 24, "h");
248
249
  }
@@ -250,16 +251,16 @@ class B extends V {
250
251
  searchParams: {
251
252
  endtime: d.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),
252
253
  starttime: i.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),
253
- mmsi: s,
254
+ mmsi: e,
254
255
  usertoken: this.token
255
256
  }
256
257
  }, m = "https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token", u = await Y.get(m, f).json();
257
- M.info("[%s] fetch trajectory from: %s - %j", t.requestId, m, f);
258
+ j.info("[%s] fetch trajectory from: %s - %j", t.requestId, m, f);
258
259
  let b;
259
- u && (b = ((I = (g = u.ships) == null ? void 0 : g.offors) == null ? void 0 : I.ship) || [], b.length || M.warn("[%s] fetch trajectory failed: %j", t.requestId, u));
260
+ u && (b = ((v = (g = u.ships) == null ? void 0 : g.offors) == null ? void 0 : v.ship) || [], b.length || j.warn("[%s] fetch trajectory failed: %j", t.requestId, u));
260
261
  const w = [];
261
262
  let k = -1;
262
- const v = p(`${(S = b == null ? void 0 : b[0]) == null ? void 0 : S.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
263
+ const I = p(`${(S = b == null ? void 0 : b[0]) == null ? void 0 : S.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
263
264
  for (const l of b) {
264
265
  for (const x in l)
265
266
  !isNaN(l[x]) && Number(l[x]) !== 1 / 0 && (l[x] = Number(l[x]));
@@ -282,29 +283,29 @@ class B extends V {
282
283
  labelEn: _,
283
284
  method: "trajectory",
284
285
  vendor: "hifleet"
285
- }, N = Math.floor(H.diff(v, "minute", !0) / (o || 1));
286
+ }, N = Math.floor(H.diff(I, "minute", !0) / (o || 1));
286
287
  N !== k && (k = N, w.push(E));
287
288
  }
288
289
  return w;
289
290
  }
290
291
  }
291
- class U extends V {
292
- constructor(s) {
292
+ class J extends V {
293
+ constructor(e) {
293
294
  super();
294
295
  q(this, "token");
295
- this.token = s;
296
+ this.token = e;
296
297
  }
297
- async realTimePosition(s, n = {}) {
298
+ async realTimePosition(e, n = {}) {
298
299
  const a = {
299
300
  searchParams: {
300
- id: s,
301
+ id: e,
301
302
  k: this.token,
302
303
  enc: 1
303
304
  }
304
- }, o = "https://api.shipxy.com/apicall/GetSingleShip", e = await Y.get(o, a).json();
305
- if (M.info("[%s] fetch realtime position from: %s - %j", n.requestId, o, a), (e == null ? void 0 : e.status) !== 0)
306
- return e;
307
- const t = e.data[0];
305
+ }, o = "https://api.shipxy.com/apicall/GetSingleShip", s = await Y.get(o, a).json();
306
+ if (j.info("[%s] fetch realtime position from: %s - %j", n.requestId, o, a), (s == null ? void 0 : s.status) !== 0)
307
+ return s;
308
+ const t = s.data[0];
308
309
  for (const f in t)
309
310
  !isNaN(t[f]) && Number(t[f]) !== 1 / 0 && (t[f] = Number(t[f]));
310
311
  const { labelCn: r, labelEn: i } = await this.parseStatus(t.navistat), d = p.unix(t.lasttime);
@@ -331,11 +332,11 @@ class U extends V {
331
332
  vendor: "shipxy"
332
333
  };
333
334
  }
334
- async trajectory(s, n, a, o, e = !0, t = {}) {
335
- var v;
336
- const r = await this.realTimePosition(s, t), i = p(n), d = p(a), h = "https://api.shipxy.com/apicall/GetShipTrack", f = {
335
+ async trajectory(e, n, a, o, s = !0, t = {}) {
336
+ var I;
337
+ const r = await this.realTimePosition(e, t), i = p(n), d = p(a), h = "https://api.shipxy.com/apicall/GetShipTrack", f = {
337
338
  searchParams: {
338
- id: s,
339
+ id: e,
339
340
  k: this.token,
340
341
  enc: 1,
341
342
  cut: 0,
@@ -343,59 +344,59 @@ class U extends V {
343
344
  etm: d.unix()
344
345
  }
345
346
  }, m = await Y.get(h, f).json();
346
- if (M.info("[%s] fetch trajectory from: %s - %j", t.requestId, h, f), (m == null ? void 0 : m.status) !== 0)
347
+ if (j.info("[%s] fetch trajectory from: %s - %j", t.requestId, h, f), (m == null ? void 0 : m.status) !== 0)
347
348
  return m;
348
- const u = m == null ? void 0 : m.points, b = [], w = p.unix((v = u[0]) == null ? void 0 : v.utc);
349
+ const u = m == null ? void 0 : m.points, b = [], w = p.unix((I = u[0]) == null ? void 0 : I.utc);
349
350
  let k = -1;
350
351
  for (const g of u) {
351
- const I = p.unix(g.utc), S = {
352
+ const v = p.unix(g.utc), S = {
352
353
  imo: r == null ? void 0 : r.imo,
353
- mmsi: s,
354
+ mmsi: e,
354
355
  sog: Math.round(g.sog * 3600 / 1e3 / 1852 * 100) / 100,
355
356
  cog: Math.round(g.cog / 100 * 100) / 100,
356
357
  lat: Math.round(g.lat / 1e6 * 1e5) / 1e5,
357
358
  lng: Math.round(g.lon / 1e6 * 1e5) / 1e5,
358
- positionTime: I.unix(),
359
- utc: I.utc().format(),
359
+ positionTime: v.unix(),
360
+ utc: v.utc().format(),
360
361
  method: "trajectory",
361
362
  vendor: "shipxy"
362
- }, l = Math.floor(I.diff(w, "minute", !0) / (o || 1));
363
+ }, l = Math.floor(v.diff(w, "minute", !0) / (o || 1));
363
364
  l !== k && (k = l, b.push(S));
364
365
  }
365
366
  return b;
366
367
  }
367
368
  }
368
- class J extends V {
369
- constructor(s) {
369
+ class Q extends V {
370
+ constructor(e) {
370
371
  super();
371
372
  q(this, "token");
372
- this.token = s;
373
+ this.token = e;
373
374
  }
374
- async getShipId(s, n = {}) {
375
+ async getShipId(e, n = {}) {
375
376
  const a = {
376
377
  headers: {
377
378
  appKey: this.token
378
379
  },
379
380
  json: {
380
- mmsiList: s
381
+ mmsiList: e
381
382
  }
382
- }, o = "https://api3.myships.com/sp/ships/getShipIdByMMSI", e = await Y.post(o, a).json();
383
- return M.info("[%s] fetch ship id from: %s - %j", n.requestId, o, a), e.code !== "0" ? e : e.data[0].shipId;
383
+ }, o = "https://api3.myships.com/sp/ships/getShipIdByMMSI", s = await Y.post(o, a).json();
384
+ return j.info("[%s] fetch ship id from: %s - %j", n.requestId, o, a), s.code !== "0" ? s : s.data[0].shipId;
384
385
  }
385
- async getShipInfo(s, n = {}) {
386
+ async getShipInfo(e, n = {}) {
386
387
  const a = {
387
388
  headers: {
388
389
  appKey: this.token
389
390
  },
390
391
  json: {
391
- shipId: s
392
+ shipId: e
392
393
  }
393
- }, o = "https://api3.myships.com/sp/ships/aissta", e = await Y.post(o, a).json();
394
- if (M.info("[%s] fetch ship info from: %s - %j", n.requestId, o, a), e.code !== "0")
395
- return e;
396
- const t = e.data;
394
+ }, o = "https://api3.myships.com/sp/ships/aissta", s = await Y.post(o, a).json();
395
+ if (j.info("[%s] fetch ship info from: %s - %j", n.requestId, o, a), s.code !== "0")
396
+ return s;
397
+ const t = s.data;
397
398
  let r = t.imo;
398
- return s === "407170" && (r = "9198379", M.warn("[%s] ship(%s) imo error: %s, should be %s", n.requestId, s, t.imo, r)), {
399
+ return e === "407170" && (r = "9198379", j.warn("[%s] ship(%s) imo error: %s, should be %s", n.requestId, e, t.imo, r)), {
399
400
  mmsi: t.mmsi,
400
401
  name: t.shipnameEn,
401
402
  imo: r,
@@ -405,23 +406,23 @@ class J extends V {
405
406
  draught: (t.draught || 100) / 10
406
407
  };
407
408
  }
408
- async realTimePosition(s, n = {}) {
409
- const a = await this.getShipId(s, n), o = await this.getShipInfo(a, n), e = {
409
+ async realTimePosition(e, n = {}) {
410
+ const a = await this.getShipId(e, n), o = await this.getShipInfo(a, n), s = {
410
411
  headers: {
411
412
  appKey: this.token
412
413
  },
413
414
  json: {
414
415
  shipId: a
415
416
  }
416
- }, t = "https://api3.myships.com/sp/ships/position/latest", r = await Y.post(t, e).json();
417
- M.info("[%s] fetch realtime position from: %s - %j", n.requestId, t, e);
417
+ }, t = "https://api3.myships.com/sp/ships/position/latest", r = await Y.post(t, s).json();
418
+ j.info("[%s] fetch realtime position from: %s - %j", n.requestId, t, s);
418
419
  const i = r.data[0];
419
420
  for (const u in i)
420
421
  !isNaN(i[u]) && Number(i[u]) !== 1 / 0 && (i[u] = Number(i[u]));
421
422
  const { labelCn: d, labelEn: h } = await this.parseStatus(i.aisNavStatus), f = p.unix(i.posTime);
422
423
  return {
423
424
  ...o,
424
- mmsi: s,
425
+ mmsi: e,
425
426
  lat: Math.round(i.lat / 1e4 / 60 * 1e5) / 1e5,
426
427
  lng: Math.round(i.lon / 1e4 / 60 * 1e5) / 1e5,
427
428
  sog: Math.round(i.sog / 10 * 100) / 100,
@@ -437,54 +438,55 @@ class J extends V {
437
438
  vendor: "myship"
438
439
  };
439
440
  }
440
- async trajectory(s, n, a, o, e = !0, t = {}) {
441
- const r = p(n), i = p(a), d = await this.getShipId(s), h = await this.getShipInfo(d), f = [];
441
+ async trajectory(e, n, a, o, s = !0, t = {}) {
442
+ const r = p(n), i = p(a), d = await this.getShipId(e), h = await this.getShipInfo(d), f = [];
442
443
  for (; i.diff(r, "day", !0) > 30; )
443
- await this.trajectoryIn30Day(d, r.unix(), r.add(30, "day").unix(), h, s, o, f);
444
- return await this.trajectoryIn30Day(d, r.unix(), i.unix(), h, s, o, f), f;
444
+ await this.trajectoryIn30Day(d, r.unix(), r.add(30, "day").unix(), h, e, o, f);
445
+ return await this.trajectoryIn30Day(d, r.unix(), i.unix(), h, e, o, f), f;
445
446
  }
446
- async trajectoryIn30Day(s, n, a, o, e, t, r, i = {}) {
447
+ async trajectoryIn30Day(e, n, a, o, s, t, r, i = {}) {
447
448
  var w;
448
449
  const d = {
449
450
  headers: {
450
451
  appKey: this.token
451
452
  },
452
453
  json: {
453
- shipId: s,
454
+ shipId: e,
454
455
  startTime: n,
455
456
  endTime: a
456
457
  }
457
458
  }, h = "https://api3.myships.com/sp/ships/position/history", f = await Y.post(h, d).json();
458
- if (M.info("[%s] fetch trajectory from: %s - %j", i.requestId, h, d), f.code !== "0")
459
- return M.warn("[%s] invoke myship trajectory failed: %j", i.requestId, f), f;
459
+ if (j.info("[%s] fetch trajectory from: %s - %j", i.requestId, h, d), f.code !== "0")
460
+ return j.warn("[%s] invoke myship trajectory failed: %j", i.requestId, f), f;
460
461
  const m = f.data;
461
462
  for (const k in m)
462
463
  !isNaN(m[k]) && Number(m[k]) !== 1 / 0 && (m[k] = Number(m[k]));
463
464
  const u = p.unix((w = m[0]) == null ? void 0 : w.posTime);
464
465
  let b = -1;
465
466
  for (const k of m) {
466
- const v = p.unix(k.posTime), g = {
467
+ const I = p.unix(k.posTime), g = {
467
468
  imo: o == null ? void 0 : o.imo,
468
- mmsi: e,
469
+ mmsi: s,
469
470
  lat: Math.round(k.lat / 1e4 / 60 * 1e5) / 1e5,
470
471
  lng: Math.round(k.lon / 1e4 / 60 * 1e5) / 1e5,
471
472
  sog: Math.round(k.sog / 10 * 100) / 100,
472
473
  cog: Math.round(k.cog / 10 * 100) / 100,
473
474
  hdg: Math.round(k.heading * 100) / 100,
474
475
  rot: Math.round(k.rot * 100) / 100,
475
- positionTime: v.unix(),
476
- utc: v.utc().format(),
476
+ positionTime: I.unix(),
477
+ utc: I.utc().format(),
477
478
  method: "trajectory",
478
479
  vendor: "myship"
479
- }, I = Math.floor(v.diff(u, "minute", !0) / (t || 1));
480
- I !== b && (b = I, r.push(g));
480
+ }, v = Math.floor(I.diff(u, "minute", !0) / (t || 1));
481
+ v !== b && (b = v, r.push(g));
481
482
  }
482
483
  return r;
483
484
  }
484
485
  }
485
486
  const $ = W.getLogger();
486
- var K = /* @__PURE__ */ ((j) => (j.NOTICE = "NOTICE", j.WARN = "WARN", j.HEAVY = "HEAVY", j.SEVERE = "SEVERE", j.ERROR = "ERROR", j.FATAL = "FATAL", j))(K || {});
487
- class Q {
487
+ $.level = "info";
488
+ var K = /* @__PURE__ */ ((M) => (M.NOTICE = "NOTICE", M.WARN = "WARN", M.HEAVY = "HEAVY", M.SEVERE = "SEVERE", M.ERROR = "ERROR", M.FATAL = "FATAL", M))(K || {});
489
+ class L {
488
490
  /**
489
491
  * 解析告警规则, 多规则场景
490
492
  * @param rule
@@ -493,24 +495,24 @@ class Q {
493
495
  *
494
496
  * @param options
495
497
  */
496
- parsePrinciple(c, s = {}) {
498
+ parsePrinciple(c, e = {}) {
497
499
  var t, r, i;
498
- $.info("[%s] parse rule: %s", s.requestId, c);
500
+ $.info("[%s] parse rule: %s", e.requestId, c);
499
501
  const n = new RegExp("(?<=\\[)(.+)(?=\\])", "g"), a = c.match(n) ? (t = c.match(n)) == null ? void 0 : t[0] : void 0, o = a == null ? void 0 : a.split(";");
500
502
  if (!o)
501
503
  return;
502
- const e = {};
504
+ const s = {};
503
505
  for (let d = 0; d < (o == null ? void 0 : o.length); d++) {
504
506
  const h = (i = (r = o[d].match(n)) == null ? void 0 : r[0]) == null ? void 0 : i.split("],");
505
507
  if (d === 0 && !h)
506
- e.scope = o[0];
508
+ s.scope = o[0];
507
509
  else if (h)
508
510
  for (let f = 0, m = h.length; f < m; f++) {
509
511
  const u = this.parseRule(h[f]);
510
- u && (e[u.level] ? u.key ? e[u.level][u == null ? void 0 : u.key] = u : e[u.level] = u : u.key ? e[u.level] = { [u == null ? void 0 : u.key]: u } : e[u.level] = u);
512
+ u && (s[u.level] ? u.key ? s[u.level][u == null ? void 0 : u.key] = u : s[u.level] = u : u.key ? s[u.level] = { [u == null ? void 0 : u.key]: u } : s[u.level] = u);
511
513
  }
512
514
  }
513
- return e;
515
+ return s;
514
516
  }
515
517
  /**
516
518
  * 解析单一告警规则
@@ -518,10 +520,10 @@ class Q {
518
520
  * @param rule
519
521
  * @param options
520
522
  */
521
- parseRule(c, s = {}) {
522
- var e;
523
- $.info("[%s] parse rule: %s", s.requestId, c), c = c.startsWith("[") ? c : `[${c}`, c = c.endsWith("]") ? c : `${c}]`;
524
- const n = new RegExp("(?<=\\[)(.+?)(?=\\])", "g"), a = (e = c == null ? void 0 : c.match(n)) == null ? void 0 : e[0], o = a == null ? void 0 : a.split(",");
523
+ parseRule(c, e = {}) {
524
+ var s;
525
+ $.info("[%s] parse rule: %s", e.requestId, c), c = c.startsWith("[") ? c : `[${c}`, c = c.endsWith("]") ? c : `${c}]`;
526
+ const n = new RegExp("(?<=\\[)(.+?)(?=\\])", "g"), a = (s = c == null ? void 0 : c.match(n)) == null ? void 0 : s[0], o = a == null ? void 0 : a.split(",");
525
527
  if (o)
526
528
  return { operator: o[0], number: Number(o[1]), level: o[2], time: Number(o[3]), key: o[4] };
527
529
  }
@@ -531,23 +533,25 @@ class Q {
531
533
  * @param principle 告警规则
532
534
  * @param options
533
535
  */
534
- checkWeather(c, s, n = {}) {
535
- var u, b, w, k, v, g, I, S, l, H, _, R, E, N, x;
536
- let a = 0, o = 0, e = 0, t = 0;
537
- const r = ((b = (u = s == null ? void 0 : s.SEVERE) == null ? void 0 : u.sigWave) == null ? void 0 : b.number) * 1.6, i = (k = (w = s == null ? void 0 : s.SEVERE) == null ? void 0 : w.sigWave) == null ? void 0 : k.number, d = (g = (v = s == null ? void 0 : s.HEAVY) == null ? void 0 : v.sigWave) == null ? void 0 : g.number, h = ((S = (I = s == null ? void 0 : s.SEVERE) == null ? void 0 : I.wind) == null ? void 0 : S.number) + 2, f = (H = (l = s == null ? void 0 : s.SEVERE) == null ? void 0 : l.wind) == null ? void 0 : H.number, m = (R = (_ = s == null ? void 0 : s.HEAVY) == null ? void 0 : _.wind) == null ? void 0 : R.number;
536
+ checkWeather(c, e, n = {}) {
537
+ var u, b, w, k, I, g, v, S, l, H, _, R, E, N, x;
538
+ let a = 0, o = 0, s = 0, t = 0;
539
+ const r = ((b = (u = e == null ? void 0 : e.SEVERE) == null ? void 0 : u.sigWave) == null ? void 0 : b.number) * 1.6, i = (k = (w = e == null ? void 0 : e.SEVERE) == null ? void 0 : w.sigWave) == null ? void 0 : k.number, d = (g = (I = e == null ? void 0 : e.HEAVY) == null ? void 0 : I.sigWave) == null ? void 0 : g.number, h = ((S = (v = e == null ? void 0 : e.SEVERE) == null ? void 0 : v.wind) == null ? void 0 : S.number) + 2, f = (H = (l = e == null ? void 0 : e.SEVERE) == null ? void 0 : l.wind) == null ? void 0 : H.number, m = (R = (_ = e == null ? void 0 : e.HEAVY) == null ? void 0 : _.wind) == null ? void 0 : R.number;
538
540
  for (let A = 1; A < (c == null ? void 0 : c.length); A++) {
539
541
  const y = c[A], T = (N = (E = y == null ? void 0 : y.meteo) == null ? void 0 : E.wave) == null ? void 0 : N.sig, D = (x = y == null ? void 0 : y.meteo) == null ? void 0 : x.wind, P = p(y.eta).diff(p(c[A - 1].eta), "hour", !0);
540
- t = P > t ? P : t, $.info("[%s] check sig.wave: %j", n.requestId, { ...T, dgThd4Wv: r, svThd4Wv: i, hvThd4Wv: d }), (T == null ? void 0 : T.height) >= r ? y.isDangerous = !0 : (T == null ? void 0 : T.height) >= i ? y.isSevere = !0 : (T == null ? void 0 : T.height) >= d && (y.isHeavy = !0), $.info("[%s] check wind: %j", n.requestId, { ...D, dgThd4Wd: h, svThd4Wd: f, hvThd4Wd: m }), (D == null ? void 0 : D.scale) >= h ? (y.isDangerous = !0, delete y.isSevere, delete y.isHeavy) : (D == null ? void 0 : D.scale) > f ? (y.isDangerous || (y.isSevere = !0), delete y.isHeavy) : (D == null ? void 0 : D.scale) === m && !y.isDangerous && !y.isSevere && (y.isHeavy = !0), a += y.isDangerous ? P : 0, o += y.isSevere ? P : 0, e += y.isHeavy ? P : 0, A === 1 && (c[0].isDangerous = y.isDangerous, c[0].isSevere = y.isSevere, c[0].isHeavy = y.isHeavy);
542
+ t = P > t ? P : t, $.info("[%s] check sig.wave: %j", n.requestId, { ...T, dgThd4Wv: r, svThd4Wv: i, hvThd4Wv: d }), (T == null ? void 0 : T.height) >= r ? y.isDangerous = !0 : (T == null ? void 0 : T.height) >= i ? y.isSevere = !0 : (T == null ? void 0 : T.height) >= d && (y.isHeavy = !0), $.info("[%s] check wind: %j", n.requestId, { ...D, dgThd4Wd: h, svThd4Wd: f, hvThd4Wd: m }), (D == null ? void 0 : D.scale) >= h ? (y.isDangerous = !0, delete y.isSevere, delete y.isHeavy) : (D == null ? void 0 : D.scale) > f ? (y.isDangerous || (y.isSevere = !0), delete y.isHeavy) : (D == null ? void 0 : D.scale) === m && !y.isDangerous && !y.isSevere && (y.isHeavy = !0), a += y.isDangerous ? P : 0, o += y.isSevere ? P : 0, s += y.isHeavy ? P : 0, A === 1 && (c[0].isDangerous = y.isDangerous, c[0].isSevere = y.isSevere, c[0].isHeavy = y.isHeavy);
541
543
  }
542
- return a = Math.round(a * 100) / 100, o = Math.round(o * 100) / 100, e = Math.round(e * 100) / 100, t = Math.round(t), { sample: c, dangerous: a, severe: o, heavy: e, step: t < 3 ? 3 : t, wind: { dgThd4Wd: h, svThd4Wd: f, hvThd4Wd: m }, sig: { dgThd4Wv: r, svThd4Wv: i, hvThd4Wv: d } };
544
+ return a = Math.round(a * 100) / 100, o = Math.round(o * 100) / 100, s = Math.round(s * 100) / 100, t = Math.round(t), { sample: c, dangerous: a, severe: o, heavy: s, step: t < 3 ? 3 : t, wind: { dgThd4Wd: h, svThd4Wd: f, hvThd4Wd: m }, sig: { dgThd4Wv: r, svThd4Wv: i, hvThd4Wv: d } };
543
545
  }
544
546
  }
547
+ const X = new L();
545
548
  export {
546
549
  V as AISImpl,
547
- Q as AlertHelper,
550
+ L as AlertHelper,
548
551
  K as AlertLevel,
549
- B as HifleetImpl,
550
- J as MyShipImpl,
551
- G as MyVesselImpl,
552
- U as ShipxyImpl
552
+ U as HifleetImpl,
553
+ Q as MyShipImpl,
554
+ B as MyVesselImpl,
555
+ J as ShipxyImpl,
556
+ X as alertHelper
553
557
  };
@@ -1 +1 @@
1
- (function(b,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("got"),require("log4js"),require("moment")):typeof define=="function"&&define.amd?define(["exports","got","log4js","moment"],y):(b=typeof globalThis<"u"?globalThis:b||self,y(b["idm-plugin-rabbitmq"]={},b.got,b.log4js,b.moment))})(this,function(b,y,q,p){"use strict";var J=Object.defineProperty;var Q=(b,y,q)=>y in b?J(b,y,{enumerable:!0,configurable:!0,writable:!0,value:q}):b[y]=q;var A=(b,y,q)=>(Q(b,typeof y!="symbol"?y+"":y,q),q);function L(I){const f=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(I){for(const e in I)if(e!=="default"){const a=Object.getOwnPropertyDescriptor(I,e);Object.defineProperty(f,e,a.get?a:{enumerable:!0,get:()=>I[e]})}}return f.default=I,Object.freeze(f)}const C=L(q),M=C.getLogger();class O{parseStatus(f){let e,a;switch(f){case 0:e="在航(主机推动)",a="The engine is in use";break;case 1:e="锚泊",a="Anchored";break;case 2:e="失控",a="Not operated";break;case 3:e="操纵受限",a="Limited airworthiness";break;case 4:e="吃水受限",a="Limited by ship's draft";break;case 5:e="靠泊",a="Mooring";break;case 6:e="搁浅",a="Stranded";break;case 7:e="捕捞作业",a="Engaged in fishing";break;case 8:e="靠帆船提供动力",a="Sailing";break;default:e="未定义",a="Undefined"}return{labelCn:e,labelEn:a}}}class z extends O{constructor(e,a){super();A(this,"clientId");A(this,"clientSecret");A(this,"token");this.clientId=e,this.clientSecret=a}async authToken(e={}){const a="https://svc.data.myvessel.cn/ada/oauth/token",n={searchParams:{client_id:this.clientId,client_secret:this.clientSecret,grant_type:"client_credentials"}},o=await y.post(a,n).json();M.info("[%s] fetch access token from: %s - %j",e.requestId,a,o),o.error||(this.token={accessToken:o.access_token,tokenType:o.token_type,expiresIn:o.expires_in,scope:o.scope,jti:o.jti,issuedAt:p().utc().format()})}async realTimePosition(e,a={}){var d,c,l;(!this.token||p().diff(p(this.token.issuedAt),"seconds")>((d=this.token)==null?void 0:d.expiresIn)-300)&&await this.authToken(a);const n="https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit",o={headers:{Authorization:`${(c=this.token)==null?void 0:c.tokenType} ${(l=this.token)==null?void 0:l.accessToken}`},searchParams:{mmsi:e}};M.info("[%s] fetch realtime position from: %s - %j",a.requestId,n,o);const s=await y.get(n,o).json();if(s.code)return M.warn("[%s] fetch realtime position failed: %j",a.requestId,n,{message:s.message,status:s.status,code:s.code}),s;const t=s.data;for(const h in t)!isNaN(t[h])&&Number(t[h])!==1/0&&(t[h]=Number(t[h]));const r=p(`${t.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:t.mmsi,name:t.vesselName,imo:t.imo,callSign:t.callsign,lat:t.lat,lng:t.lon,length:t.length,width:t.width,draught:t.currDraught,sog:t.sog,cog:t.cog,hdg:t.hdg,rot:t.rot,eta:t.eta,destination:t.dest,positionTime:r.unix(),status:t.status,labelCn:t.statusNameCn,labelEn:t.statusNameEn,method:"position",vendor:"myVessel",utc:r.utc().format()}}async trajectory(e,a,n,o,s=!0,t={}){(!this.token||p().diff(p(this.token.issuedAt),"seconds")>this.token.expiresIn-300)&&await this.authToken(t);const r=await this.realTimePosition(e,t),i=p(a),d=p(n),c=[];for(;d.diff(i,"day",!0)>30;)await this.trajectoryIn30Day(e,i,i.clone().add(30,"day"),r,o,c,t),i.add(30,"day");return await this.trajectoryIn30Day(e,i,d,r,o,c,t),c}async trajectoryIn30Day(e,a,n,o,s,t,r={}){var u,v,Y,j,S;const i="https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",d={headers:{Authorization:`${(u=this.token)==null?void 0:u.tokenType} ${(v=this.token)==null?void 0:v.accessToken}`},json:{mmsi:e,startTime:a.utcOffset(8).format("YYYY-MM-DD HH:mm:ss"),endTime:n.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")}};M.info("[%s] fetch trajectory from: %s - %j",r.requestId,i,d);const c=await y.post(i,d).json();if(c.code)return M.warn("[%s] fetch trajectory failed: %j",r.requestId,i,{message:c.message,status:c.status,code:c.code}),c;let l=-1;const h=p(`${(j=(Y=c.data)==null?void 0:Y[0])==null?void 0:j.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return(S=c.data)==null||S.forEach(g=>{for(const T in g)!isNaN(g[T])&&Number(g[T])!==1/0&&(g[T]=Number(g[T]));const w=p(`${g.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"),N=g.eta?p(`${g.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"):void 0,m=g.status,{labelCn:E,labelEn:P}=this.parseStatus(m),R={mmsi:g.mmsi,imo:o==null?void 0:o.imo,lat:g.lat,lng:g.lon,sog:g.sog,cog:g.cog,hdg:g.hdg,draught:g.draught,status:m,eta:N==null?void 0:N.unix(),destination:g.dest,positionTime:w.unix(),labelCn:E,labelEn:P,method:"trajectory",vendor:"myVessel",utc:w.utc().format()},x=Math.floor(w.diff(h,"minute",!0)/(s||1));x!==l&&(l=x,t.push(R))}),t}}class F extends O{constructor(e){super();A(this,"token");this.token=e}async realTimePosition(e,a={}){const n="https://api.hifleet.com/position/position/get/token",o={searchParams:{mmsi:e,usertoken:this.token}},s=await y.post(n,o).json();M.info("[%s] fetch realtime position from: %s - %j",a.requestId,n,o);const t=s==null?void 0:s.list;if(!t)return M.warn("[%s] fetch realtime position failed: %j",a.requestId,n,s),s;for(const h in t)!isNaN(t[h])&&Number(t[h])!==1/0&&(t[h]=Number(t[h]));t.status=t.sp>3?0:1;const r=t.status,{labelCn:i,labelEn:d}=this.parseStatus(r),c=p(`${t.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:t.m,name:t.n,imo:t.imonumber,callSign:t.callsign,lat:Math.round(t.la/60*1e5)/1e5,lng:Math.round(t.lo/60*1e5)/1e5,length:t.l,width:t.w,draught:t.draught,sog:t.sp,cog:t.co,hdg:t.h,rot:isNaN(t.rot)?0:t.rot,eta:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(t.eta)?p(`${t.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00").unix():void 0,destination:t.destination,positionTime:c.unix(),utc:c.utc().format(),status:r,labelCn:i,labelEn:d,method:"position",vendor:"hifleet"}}async search(e,a={}){let n="https://www.hifleet.com/hifleetapi/searchVesselOL.do";const o={searchParams:{keyword:e},headers:{Referer:"https://www.hifleet.com",Origin:"https://www.hifleet.com",Host:"www.hifleet.com"}};let s=await y.post(n,o).json();M.info("[%s] fetch vessel props from: %s - %j",a.requestId,n,o),s instanceof Array&&(s=s[0]);for(const r in s)!isNaN(s[r])&&Number(s[r])!==1/0&&(s[r]=Number(s[r]));const t={mmsi:s.m,name:s.n,imo:s.i,callSign:s.c,length:s.l,breadth:s.b,draught:s.dr};return n="https://www.hifleet.com/hifleetapi/sameShipSearch.do",s=await y.post(n,o).json(),M.info("[%s] fetch vessel dead weight from: %s - %j",a.requestId,n,o),s instanceof Array&&(s=s[0]),s&&(t.deadweight=Number(s.dwt)),t}async trajectory(e,a,n,o,s=!0,t={}){var g,w,N;const r=await this.realTimePosition(e,t);let i=p(a);const d=p(n),c=p();if(s){let m=d.diff(i,"d",!0);m<0?i=d.clone().subtract(40,"d"):m<30?i.subtract(10,"d"):m<60?i.subtract(5,"d"):i=d.clone().subtract(80,"d"),m=c.diff(d,"d",!0),d.add(m>10?240:m*24,"h")}const l={searchParams:{endtime:d.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),starttime:i.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),mmsi:e,usertoken:this.token}},h="https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token",u=await y.get(h,l).json();M.info("[%s] fetch trajectory from: %s - %j",t.requestId,h,l);let v;u&&(v=((w=(g=u.ships)==null?void 0:g.offors)==null?void 0:w.ship)||[],v.length||M.warn("[%s] fetch trajectory failed: %j",t.requestId,u));const Y=[];let j=-1;const S=p(`${(N=v==null?void 0:v[0])==null?void 0:N.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");for(const m of v){for(const _ in m)!isNaN(m[_])&&Number(m[_])!==1/0&&(m[_]=Number(m[_]));const E=p(`${m.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");m.status=m.sp>4?0:1;const{labelEn:P,labelCn:R}=this.parseStatus(m.status),x={mmsi:m.m,name:m.n,imo:r==null?void 0:r.imo,lat:m.la,lng:m.lo,draught:m.draught,sog:m.sp,cog:m.co,hdg:m.hdg,positionTime:E.unix(),utc:E.utc().format(),status:m.status,labelCn:R,labelEn:P,method:"trajectory",vendor:"hifleet"},T=Math.floor(E.diff(S,"minute",!0)/(o||1));T!==j&&(j=T,Y.push(x))}return Y}}class G extends O{constructor(e){super();A(this,"token");this.token=e}async realTimePosition(e,a={}){const n={searchParams:{id:e,k:this.token,enc:1}},o="https://api.shipxy.com/apicall/GetSingleShip",s=await y.get(o,n).json();if(M.info("[%s] fetch realtime position from: %s - %j",a.requestId,o,n),(s==null?void 0:s.status)!==0)return s;const t=s.data[0];for(const l in t)!isNaN(t[l])&&Number(t[l])!==1/0&&(t[l]=Number(t[l]));const{labelCn:r,labelEn:i}=await this.parseStatus(t.navistat),d=p.unix(t.lasttime);return{mmsi:t.ShipID,name:t.name,imo:t.imo,callSign:t.callsign,lat:Math.round(t.lat/1e6*1e5)/1e5,lng:Math.round(t.lon/1e6*1e5)/1e5,length:Math.round(t.length/10*100)/100,width:Math.round(t.width/10*100)/100,draught:Math.round(t.draught/1e3*100)/100,sog:Math.round(t.sog*3600/1e3/1852*100)/100,cog:Math.round(t.cog/100*100)/100,hdg:Math.round(t.hdg/100*100)/100,rot:Math.round(t.rot/100*100)/100,positionTime:t.lasttime,utc:d.utc().format(),status:t.navistat,labelEn:i,labelCn:r,method:"position",vendor:"shipxy"}}async trajectory(e,a,n,o,s=!0,t={}){var S;const r=await this.realTimePosition(e,t),i=p(a),d=p(n),c="https://api.shipxy.com/apicall/GetShipTrack",l={searchParams:{id:e,k:this.token,enc:1,cut:0,btm:i.unix(),etm:d.unix()}},h=await y.get(c,l).json();if(M.info("[%s] fetch trajectory from: %s - %j",t.requestId,c,l),(h==null?void 0:h.status)!==0)return h;const u=h==null?void 0:h.points,v=[],Y=p.unix((S=u[0])==null?void 0:S.utc);let j=-1;for(const g of u){const w=p.unix(g.utc),N={imo:r==null?void 0:r.imo,mmsi:e,sog:Math.round(g.sog*3600/1e3/1852*100)/100,cog:Math.round(g.cog/100*100)/100,lat:Math.round(g.lat/1e6*1e5)/1e5,lng:Math.round(g.lon/1e6*1e5)/1e5,positionTime:w.unix(),utc:w.utc().format(),method:"trajectory",vendor:"shipxy"},m=Math.floor(w.diff(Y,"minute",!0)/(o||1));m!==j&&(j=m,v.push(N))}return v}}class B extends O{constructor(e){super();A(this,"token");this.token=e}async getShipId(e,a={}){const n={headers:{appKey:this.token},json:{mmsiList:e}},o="https://api3.myships.com/sp/ships/getShipIdByMMSI",s=await y.post(o,n).json();return M.info("[%s] fetch ship id from: %s - %j",a.requestId,o,n),s.code!=="0"?s:s.data[0].shipId}async getShipInfo(e,a={}){const n={headers:{appKey:this.token},json:{shipId:e}},o="https://api3.myships.com/sp/ships/aissta",s=await y.post(o,n).json();if(M.info("[%s] fetch ship info from: %s - %j",a.requestId,o,n),s.code!=="0")return s;const t=s.data;let r=t.imo;return e==="407170"&&(r="9198379",M.warn("[%s] ship(%s) imo error: %s, should be %s",a.requestId,e,t.imo,r)),{mmsi:t.mmsi,name:t.shipnameEn,imo:r,callSign:t.callSign,length:t.length,width:t.breadth,draught:(t.draught||100)/10}}async realTimePosition(e,a={}){const n=await this.getShipId(e,a),o=await this.getShipInfo(n,a),s={headers:{appKey:this.token},json:{shipId:n}},t="https://api3.myships.com/sp/ships/position/latest",r=await y.post(t,s).json();M.info("[%s] fetch realtime position from: %s - %j",a.requestId,t,s);const i=r.data[0];for(const u in i)!isNaN(i[u])&&Number(i[u])!==1/0&&(i[u]=Number(i[u]));const{labelCn:d,labelEn:c}=await this.parseStatus(i.aisNavStatus),l=p.unix(i.posTime);return{...o,mmsi:e,lat:Math.round(i.lat/1e4/60*1e5)/1e5,lng:Math.round(i.lon/1e4/60*1e5)/1e5,sog:Math.round(i.sog/10*100)/100,cog:Math.round(i.cog/10*100)/100,hdg:Math.round(i.heading*100)/100,rot:Math.round(i.rot*100)/100,positionTime:i.posTime,utc:l.utc().format(),status:i.aisNavStatus,labelEn:c,labelCn:d,method:"position",vendor:"myship"}}async trajectory(e,a,n,o,s=!0,t={}){const r=p(a),i=p(n),d=await this.getShipId(e),c=await this.getShipInfo(d),l=[];for(;i.diff(r,"day",!0)>30;)await this.trajectoryIn30Day(d,r.unix(),r.add(30,"day").unix(),c,e,o,l);return await this.trajectoryIn30Day(d,r.unix(),i.unix(),c,e,o,l),l}async trajectoryIn30Day(e,a,n,o,s,t,r,i={}){var Y;const d={headers:{appKey:this.token},json:{shipId:e,startTime:a,endTime:n}},c="https://api3.myships.com/sp/ships/position/history",l=await y.post(c,d).json();if(M.info("[%s] fetch trajectory from: %s - %j",i.requestId,c,d),l.code!=="0")return M.warn("[%s] invoke myship trajectory failed: %j",i.requestId,l),l;const h=l.data;for(const j in h)!isNaN(h[j])&&Number(h[j])!==1/0&&(h[j]=Number(h[j]));const u=p.unix((Y=h[0])==null?void 0:Y.posTime);let v=-1;for(const j of h){const S=p.unix(j.posTime),g={imo:o==null?void 0:o.imo,mmsi:s,lat:Math.round(j.lat/1e4/60*1e5)/1e5,lng:Math.round(j.lon/1e4/60*1e5)/1e5,sog:Math.round(j.sog/10*100)/100,cog:Math.round(j.cog/10*100)/100,hdg:Math.round(j.heading*100)/100,rot:Math.round(j.rot*100)/100,positionTime:S.unix(),utc:S.utc().format(),method:"trajectory",vendor:"myship"},w=Math.floor(S.diff(u,"minute",!0)/(t||1));w!==v&&(v=w,r.push(g))}return r}}const W=C.getLogger();var K=(I=>(I.NOTICE="NOTICE",I.WARN="WARN",I.HEAVY="HEAVY",I.SEVERE="SEVERE",I.ERROR="ERROR",I.FATAL="FATAL",I))(K||{});class U{parsePrinciple(f,e={}){var t,r,i;W.info("[%s] parse rule: %s",e.requestId,f);const a=new RegExp("(?<=\\[)(.+)(?=\\])","g"),n=f.match(a)?(t=f.match(a))==null?void 0:t[0]:void 0,o=n==null?void 0:n.split(";");if(!o)return;const s={};for(let d=0;d<(o==null?void 0:o.length);d++){const c=(i=(r=o[d].match(a))==null?void 0:r[0])==null?void 0:i.split("],");if(d===0&&!c)s.scope=o[0];else if(c)for(let l=0,h=c.length;l<h;l++){const u=this.parseRule(c[l]);u&&(s[u.level]?u.key?s[u.level][u==null?void 0:u.key]=u:s[u.level]=u:u.key?s[u.level]={[u==null?void 0:u.key]:u}:s[u.level]=u)}}return s}parseRule(f,e={}){var s;W.info("[%s] parse rule: %s",e.requestId,f),f=f.startsWith("[")?f:`[${f}`,f=f.endsWith("]")?f:`${f}]`;const a=new RegExp("(?<=\\[)(.+?)(?=\\])","g"),n=(s=f==null?void 0:f.match(a))==null?void 0:s[0],o=n==null?void 0:n.split(",");if(o)return{operator:o[0],number:Number(o[1]),level:o[2],time:Number(o[3]),key:o[4]}}checkWeather(f,e,a={}){var u,v,Y,j,S,g,w,N,m,E,P,R,x,T,_;let n=0,o=0,s=0,t=0;const r=((v=(u=e==null?void 0:e.SEVERE)==null?void 0:u.sigWave)==null?void 0:v.number)*1.6,i=(j=(Y=e==null?void 0:e.SEVERE)==null?void 0:Y.sigWave)==null?void 0:j.number,d=(g=(S=e==null?void 0:e.HEAVY)==null?void 0:S.sigWave)==null?void 0:g.number,c=((N=(w=e==null?void 0:e.SEVERE)==null?void 0:w.wind)==null?void 0:N.number)+2,l=(E=(m=e==null?void 0:e.SEVERE)==null?void 0:m.wind)==null?void 0:E.number,h=(R=(P=e==null?void 0:e.HEAVY)==null?void 0:P.wind)==null?void 0:R.number;for(let V=1;V<(f==null?void 0:f.length);V++){const k=f[V],D=(T=(x=k==null?void 0:k.meteo)==null?void 0:x.wave)==null?void 0:T.sig,H=(_=k==null?void 0:k.meteo)==null?void 0:_.wind,$=p(k.eta).diff(p(f[V-1].eta),"hour",!0);t=$>t?$:t,W.info("[%s] check sig.wave: %j",a.requestId,{...D,dgThd4Wv:r,svThd4Wv:i,hvThd4Wv:d}),(D==null?void 0:D.height)>=r?k.isDangerous=!0:(D==null?void 0:D.height)>=i?k.isSevere=!0:(D==null?void 0:D.height)>=d&&(k.isHeavy=!0),W.info("[%s] check wind: %j",a.requestId,{...H,dgThd4Wd:c,svThd4Wd:l,hvThd4Wd:h}),(H==null?void 0:H.scale)>=c?(k.isDangerous=!0,delete k.isSevere,delete k.isHeavy):(H==null?void 0:H.scale)>l?(k.isDangerous||(k.isSevere=!0),delete k.isHeavy):(H==null?void 0:H.scale)===h&&!k.isDangerous&&!k.isSevere&&(k.isHeavy=!0),n+=k.isDangerous?$:0,o+=k.isSevere?$:0,s+=k.isHeavy?$:0,V===1&&(f[0].isDangerous=k.isDangerous,f[0].isSevere=k.isSevere,f[0].isHeavy=k.isHeavy)}return n=Math.round(n*100)/100,o=Math.round(o*100)/100,s=Math.round(s*100)/100,t=Math.round(t),{sample:f,dangerous:n,severe:o,heavy:s,step:t<3?3:t,wind:{dgThd4Wd:c,svThd4Wd:l,hvThd4Wd:h},sig:{dgThd4Wv:r,svThd4Wv:i,hvThd4Wv:d}}}}b.AISImpl=O,b.AlertHelper=U,b.AlertLevel=K,b.HifleetImpl=F,b.MyShipImpl=B,b.MyVesselImpl=z,b.ShipxyImpl=G,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
1
+ (function(b,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("got"),require("log4js"),require("moment")):typeof define=="function"&&define.amd?define(["exports","got","log4js","moment"],y):(b=typeof globalThis<"u"?globalThis:b||self,y(b["idm-plugin-rabbitmq"]={},b.got,b.log4js,b.moment))})(this,function(b,y,q,p){"use strict";var Q=Object.defineProperty;var X=(b,y,q)=>y in b?Q(b,y,{enumerable:!0,configurable:!0,writable:!0,value:q}):b[y]=q;var A=(b,y,q)=>(X(b,typeof y!="symbol"?y+"":y,q),q);function z(I){const f=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(I){for(const e in I)if(e!=="default"){const a=Object.getOwnPropertyDescriptor(I,e);Object.defineProperty(f,e,a.get?a:{enumerable:!0,get:()=>I[e]})}}return f.default=I,Object.freeze(f)}const C=z(q),M=C.getLogger();M.level="info";class O{parseStatus(f){let e,a;switch(f){case 0:e="在航(主机推动)",a="The engine is in use";break;case 1:e="锚泊",a="Anchored";break;case 2:e="失控",a="Not operated";break;case 3:e="操纵受限",a="Limited airworthiness";break;case 4:e="吃水受限",a="Limited by ship's draft";break;case 5:e="靠泊",a="Mooring";break;case 6:e="搁浅",a="Stranded";break;case 7:e="捕捞作业",a="Engaged in fishing";break;case 8:e="靠帆船提供动力",a="Sailing";break;default:e="未定义",a="Undefined"}return{labelCn:e,labelEn:a}}}class F extends O{constructor(e,a){super();A(this,"clientId");A(this,"clientSecret");A(this,"token");this.clientId=e,this.clientSecret=a}async authToken(e={}){const a="https://svc.data.myvessel.cn/ada/oauth/token",n={searchParams:{client_id:this.clientId,client_secret:this.clientSecret,grant_type:"client_credentials"}},o=await y.post(a,n).json();M.info("[%s] fetch access token from: %s - %j",e.requestId,a,o),o.error||(this.token={accessToken:o.access_token,tokenType:o.token_type,expiresIn:o.expires_in,scope:o.scope,jti:o.jti,issuedAt:p().utc().format()})}async realTimePosition(e,a={}){var d,c,l;(!this.token||p().diff(p(this.token.issuedAt),"seconds")>((d=this.token)==null?void 0:d.expiresIn)-300)&&await this.authToken(a);const n="https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit",o={headers:{Authorization:`${(c=this.token)==null?void 0:c.tokenType} ${(l=this.token)==null?void 0:l.accessToken}`},searchParams:{mmsi:e}};M.info("[%s] fetch realtime position from: %s - %j",a.requestId,n,o);const s=await y.get(n,o).json();if(s.code)return M.warn("[%s] fetch realtime position failed: %j",a.requestId,n,{message:s.message,status:s.status,code:s.code}),s;const t=s.data;for(const h in t)!isNaN(t[h])&&Number(t[h])!==1/0&&(t[h]=Number(t[h]));const r=p(`${t.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:t.mmsi,name:t.vesselName,imo:t.imo,callSign:t.callsign,lat:t.lat,lng:t.lon,length:t.length,width:t.width,draught:t.currDraught,sog:t.sog,cog:t.cog,hdg:t.hdg,rot:t.rot,eta:t.eta,destination:t.dest,positionTime:r.unix(),status:t.status,labelCn:t.statusNameCn,labelEn:t.statusNameEn,method:"position",vendor:"myVessel",utc:r.utc().format()}}async trajectory(e,a,n,o,s=!0,t={}){(!this.token||p().diff(p(this.token.issuedAt),"seconds")>this.token.expiresIn-300)&&await this.authToken(t);const r=await this.realTimePosition(e,t),i=p(a),d=p(n),c=[];for(;d.diff(i,"day",!0)>30;)await this.trajectoryIn30Day(e,i,i.clone().add(30,"day"),r,o,c,t),i.add(30,"day");return await this.trajectoryIn30Day(e,i,d,r,o,c,t),c}async trajectoryIn30Day(e,a,n,o,s,t,r={}){var u,v,Y,j,S;const i="https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",d={headers:{Authorization:`${(u=this.token)==null?void 0:u.tokenType} ${(v=this.token)==null?void 0:v.accessToken}`},json:{mmsi:e,startTime:a.utcOffset(8).format("YYYY-MM-DD HH:mm:ss"),endTime:n.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")}};M.info("[%s] fetch trajectory from: %s - %j",r.requestId,i,d);const c=await y.post(i,d).json();if(c.code)return M.warn("[%s] fetch trajectory failed: %j",r.requestId,i,{message:c.message,status:c.status,code:c.code}),c;let l=-1;const h=p(`${(j=(Y=c.data)==null?void 0:Y[0])==null?void 0:j.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return(S=c.data)==null||S.forEach(g=>{for(const T in g)!isNaN(g[T])&&Number(g[T])!==1/0&&(g[T]=Number(g[T]));const w=p(`${g.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"),N=g.eta?p(`${g.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"):void 0,m=g.status,{labelCn:E,labelEn:P}=this.parseStatus(m),R={mmsi:g.mmsi,imo:o==null?void 0:o.imo,lat:g.lat,lng:g.lon,sog:g.sog,cog:g.cog,hdg:g.hdg,draught:g.draught,status:m,eta:N==null?void 0:N.unix(),destination:g.dest,positionTime:w.unix(),labelCn:E,labelEn:P,method:"trajectory",vendor:"myVessel",utc:w.utc().format()},x=Math.floor(w.diff(h,"minute",!0)/(s||1));x!==l&&(l=x,t.push(R))}),t}}class G extends O{constructor(e){super();A(this,"token");this.token=e}async realTimePosition(e,a={}){const n="https://api.hifleet.com/position/position/get/token",o={searchParams:{mmsi:e,usertoken:this.token}},s=await y.post(n,o).json();M.info("[%s] fetch realtime position from: %s - %j",a.requestId,n,o);const t=s==null?void 0:s.list;if(!t)return M.warn("[%s] fetch realtime position failed: %j",a.requestId,n,s),s;for(const h in t)!isNaN(t[h])&&Number(t[h])!==1/0&&(t[h]=Number(t[h]));t.status=t.sp>3?0:1;const r=t.status,{labelCn:i,labelEn:d}=this.parseStatus(r),c=p(`${t.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:t.m,name:t.n,imo:t.imonumber,callSign:t.callsign,lat:Math.round(t.la/60*1e5)/1e5,lng:Math.round(t.lo/60*1e5)/1e5,length:t.l,width:t.w,draught:t.draught,sog:t.sp,cog:t.co,hdg:t.h,rot:isNaN(t.rot)?0:t.rot,eta:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(t.eta)?p(`${t.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00").unix():void 0,destination:t.destination,positionTime:c.unix(),utc:c.utc().format(),status:r,labelCn:i,labelEn:d,method:"position",vendor:"hifleet"}}async search(e,a={}){let n="https://www.hifleet.com/hifleetapi/searchVesselOL.do";const o={searchParams:{keyword:e},headers:{Referer:"https://www.hifleet.com",Origin:"https://www.hifleet.com",Host:"www.hifleet.com"}};let s=await y.post(n,o).json();M.info("[%s] fetch vessel props from: %s - %j",a.requestId,n,o),s instanceof Array&&(s=s[0]);for(const r in s)!isNaN(s[r])&&Number(s[r])!==1/0&&(s[r]=Number(s[r]));const t={mmsi:s.m,name:s.n,imo:s.i,callSign:s.c,length:s.l,breadth:s.b,draught:s.dr};return n="https://www.hifleet.com/hifleetapi/sameShipSearch.do",s=await y.post(n,o).json(),M.info("[%s] fetch vessel dead weight from: %s - %j",a.requestId,n,o),s instanceof Array&&(s=s[0]),s&&(t.deadweight=Number(s.dwt)),t}async trajectory(e,a,n,o,s=!0,t={}){var g,w,N;const r=await this.realTimePosition(e,t);let i=p(a);const d=p(n),c=p();if(s){let m=d.diff(i,"d",!0);m<0?i=d.clone().subtract(40,"d"):m<30?i.subtract(10,"d"):m<60?i.subtract(5,"d"):i=d.clone().subtract(80,"d"),m=c.diff(d,"d",!0),d.add(m>10?240:m*24,"h")}const l={searchParams:{endtime:d.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),starttime:i.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),mmsi:e,usertoken:this.token}},h="https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token",u=await y.get(h,l).json();M.info("[%s] fetch trajectory from: %s - %j",t.requestId,h,l);let v;u&&(v=((w=(g=u.ships)==null?void 0:g.offors)==null?void 0:w.ship)||[],v.length||M.warn("[%s] fetch trajectory failed: %j",t.requestId,u));const Y=[];let j=-1;const S=p(`${(N=v==null?void 0:v[0])==null?void 0:N.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");for(const m of v){for(const _ in m)!isNaN(m[_])&&Number(m[_])!==1/0&&(m[_]=Number(m[_]));const E=p(`${m.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");m.status=m.sp>4?0:1;const{labelEn:P,labelCn:R}=this.parseStatus(m.status),x={mmsi:m.m,name:m.n,imo:r==null?void 0:r.imo,lat:m.la,lng:m.lo,draught:m.draught,sog:m.sp,cog:m.co,hdg:m.hdg,positionTime:E.unix(),utc:E.utc().format(),status:m.status,labelCn:R,labelEn:P,method:"trajectory",vendor:"hifleet"},T=Math.floor(E.diff(S,"minute",!0)/(o||1));T!==j&&(j=T,Y.push(x))}return Y}}class B extends O{constructor(e){super();A(this,"token");this.token=e}async realTimePosition(e,a={}){const n={searchParams:{id:e,k:this.token,enc:1}},o="https://api.shipxy.com/apicall/GetSingleShip",s=await y.get(o,n).json();if(M.info("[%s] fetch realtime position from: %s - %j",a.requestId,o,n),(s==null?void 0:s.status)!==0)return s;const t=s.data[0];for(const l in t)!isNaN(t[l])&&Number(t[l])!==1/0&&(t[l]=Number(t[l]));const{labelCn:r,labelEn:i}=await this.parseStatus(t.navistat),d=p.unix(t.lasttime);return{mmsi:t.ShipID,name:t.name,imo:t.imo,callSign:t.callsign,lat:Math.round(t.lat/1e6*1e5)/1e5,lng:Math.round(t.lon/1e6*1e5)/1e5,length:Math.round(t.length/10*100)/100,width:Math.round(t.width/10*100)/100,draught:Math.round(t.draught/1e3*100)/100,sog:Math.round(t.sog*3600/1e3/1852*100)/100,cog:Math.round(t.cog/100*100)/100,hdg:Math.round(t.hdg/100*100)/100,rot:Math.round(t.rot/100*100)/100,positionTime:t.lasttime,utc:d.utc().format(),status:t.navistat,labelEn:i,labelCn:r,method:"position",vendor:"shipxy"}}async trajectory(e,a,n,o,s=!0,t={}){var S;const r=await this.realTimePosition(e,t),i=p(a),d=p(n),c="https://api.shipxy.com/apicall/GetShipTrack",l={searchParams:{id:e,k:this.token,enc:1,cut:0,btm:i.unix(),etm:d.unix()}},h=await y.get(c,l).json();if(M.info("[%s] fetch trajectory from: %s - %j",t.requestId,c,l),(h==null?void 0:h.status)!==0)return h;const u=h==null?void 0:h.points,v=[],Y=p.unix((S=u[0])==null?void 0:S.utc);let j=-1;for(const g of u){const w=p.unix(g.utc),N={imo:r==null?void 0:r.imo,mmsi:e,sog:Math.round(g.sog*3600/1e3/1852*100)/100,cog:Math.round(g.cog/100*100)/100,lat:Math.round(g.lat/1e6*1e5)/1e5,lng:Math.round(g.lon/1e6*1e5)/1e5,positionTime:w.unix(),utc:w.utc().format(),method:"trajectory",vendor:"shipxy"},m=Math.floor(w.diff(Y,"minute",!0)/(o||1));m!==j&&(j=m,v.push(N))}return v}}class U extends O{constructor(e){super();A(this,"token");this.token=e}async getShipId(e,a={}){const n={headers:{appKey:this.token},json:{mmsiList:e}},o="https://api3.myships.com/sp/ships/getShipIdByMMSI",s=await y.post(o,n).json();return M.info("[%s] fetch ship id from: %s - %j",a.requestId,o,n),s.code!=="0"?s:s.data[0].shipId}async getShipInfo(e,a={}){const n={headers:{appKey:this.token},json:{shipId:e}},o="https://api3.myships.com/sp/ships/aissta",s=await y.post(o,n).json();if(M.info("[%s] fetch ship info from: %s - %j",a.requestId,o,n),s.code!=="0")return s;const t=s.data;let r=t.imo;return e==="407170"&&(r="9198379",M.warn("[%s] ship(%s) imo error: %s, should be %s",a.requestId,e,t.imo,r)),{mmsi:t.mmsi,name:t.shipnameEn,imo:r,callSign:t.callSign,length:t.length,width:t.breadth,draught:(t.draught||100)/10}}async realTimePosition(e,a={}){const n=await this.getShipId(e,a),o=await this.getShipInfo(n,a),s={headers:{appKey:this.token},json:{shipId:n}},t="https://api3.myships.com/sp/ships/position/latest",r=await y.post(t,s).json();M.info("[%s] fetch realtime position from: %s - %j",a.requestId,t,s);const i=r.data[0];for(const u in i)!isNaN(i[u])&&Number(i[u])!==1/0&&(i[u]=Number(i[u]));const{labelCn:d,labelEn:c}=await this.parseStatus(i.aisNavStatus),l=p.unix(i.posTime);return{...o,mmsi:e,lat:Math.round(i.lat/1e4/60*1e5)/1e5,lng:Math.round(i.lon/1e4/60*1e5)/1e5,sog:Math.round(i.sog/10*100)/100,cog:Math.round(i.cog/10*100)/100,hdg:Math.round(i.heading*100)/100,rot:Math.round(i.rot*100)/100,positionTime:i.posTime,utc:l.utc().format(),status:i.aisNavStatus,labelEn:c,labelCn:d,method:"position",vendor:"myship"}}async trajectory(e,a,n,o,s=!0,t={}){const r=p(a),i=p(n),d=await this.getShipId(e),c=await this.getShipInfo(d),l=[];for(;i.diff(r,"day",!0)>30;)await this.trajectoryIn30Day(d,r.unix(),r.add(30,"day").unix(),c,e,o,l);return await this.trajectoryIn30Day(d,r.unix(),i.unix(),c,e,o,l),l}async trajectoryIn30Day(e,a,n,o,s,t,r,i={}){var Y;const d={headers:{appKey:this.token},json:{shipId:e,startTime:a,endTime:n}},c="https://api3.myships.com/sp/ships/position/history",l=await y.post(c,d).json();if(M.info("[%s] fetch trajectory from: %s - %j",i.requestId,c,d),l.code!=="0")return M.warn("[%s] invoke myship trajectory failed: %j",i.requestId,l),l;const h=l.data;for(const j in h)!isNaN(h[j])&&Number(h[j])!==1/0&&(h[j]=Number(h[j]));const u=p.unix((Y=h[0])==null?void 0:Y.posTime);let v=-1;for(const j of h){const S=p.unix(j.posTime),g={imo:o==null?void 0:o.imo,mmsi:s,lat:Math.round(j.lat/1e4/60*1e5)/1e5,lng:Math.round(j.lon/1e4/60*1e5)/1e5,sog:Math.round(j.sog/10*100)/100,cog:Math.round(j.cog/10*100)/100,hdg:Math.round(j.heading*100)/100,rot:Math.round(j.rot*100)/100,positionTime:S.unix(),utc:S.utc().format(),method:"trajectory",vendor:"myship"},w=Math.floor(S.diff(u,"minute",!0)/(t||1));w!==v&&(v=w,r.push(g))}return r}}const V=C.getLogger();V.level="info";var K=(I=>(I.NOTICE="NOTICE",I.WARN="WARN",I.HEAVY="HEAVY",I.SEVERE="SEVERE",I.ERROR="ERROR",I.FATAL="FATAL",I))(K||{});class L{parsePrinciple(f,e={}){var t,r,i;V.info("[%s] parse rule: %s",e.requestId,f);const a=new RegExp("(?<=\\[)(.+)(?=\\])","g"),n=f.match(a)?(t=f.match(a))==null?void 0:t[0]:void 0,o=n==null?void 0:n.split(";");if(!o)return;const s={};for(let d=0;d<(o==null?void 0:o.length);d++){const c=(i=(r=o[d].match(a))==null?void 0:r[0])==null?void 0:i.split("],");if(d===0&&!c)s.scope=o[0];else if(c)for(let l=0,h=c.length;l<h;l++){const u=this.parseRule(c[l]);u&&(s[u.level]?u.key?s[u.level][u==null?void 0:u.key]=u:s[u.level]=u:u.key?s[u.level]={[u==null?void 0:u.key]:u}:s[u.level]=u)}}return s}parseRule(f,e={}){var s;V.info("[%s] parse rule: %s",e.requestId,f),f=f.startsWith("[")?f:`[${f}`,f=f.endsWith("]")?f:`${f}]`;const a=new RegExp("(?<=\\[)(.+?)(?=\\])","g"),n=(s=f==null?void 0:f.match(a))==null?void 0:s[0],o=n==null?void 0:n.split(",");if(o)return{operator:o[0],number:Number(o[1]),level:o[2],time:Number(o[3]),key:o[4]}}checkWeather(f,e,a={}){var u,v,Y,j,S,g,w,N,m,E,P,R,x,T,_;let n=0,o=0,s=0,t=0;const r=((v=(u=e==null?void 0:e.SEVERE)==null?void 0:u.sigWave)==null?void 0:v.number)*1.6,i=(j=(Y=e==null?void 0:e.SEVERE)==null?void 0:Y.sigWave)==null?void 0:j.number,d=(g=(S=e==null?void 0:e.HEAVY)==null?void 0:S.sigWave)==null?void 0:g.number,c=((N=(w=e==null?void 0:e.SEVERE)==null?void 0:w.wind)==null?void 0:N.number)+2,l=(E=(m=e==null?void 0:e.SEVERE)==null?void 0:m.wind)==null?void 0:E.number,h=(R=(P=e==null?void 0:e.HEAVY)==null?void 0:P.wind)==null?void 0:R.number;for(let $=1;$<(f==null?void 0:f.length);$++){const k=f[$],H=(T=(x=k==null?void 0:k.meteo)==null?void 0:x.wave)==null?void 0:T.sig,D=(_=k==null?void 0:k.meteo)==null?void 0:_.wind,W=p(k.eta).diff(p(f[$-1].eta),"hour",!0);t=W>t?W:t,V.info("[%s] check sig.wave: %j",a.requestId,{...H,dgThd4Wv:r,svThd4Wv:i,hvThd4Wv:d}),(H==null?void 0:H.height)>=r?k.isDangerous=!0:(H==null?void 0:H.height)>=i?k.isSevere=!0:(H==null?void 0:H.height)>=d&&(k.isHeavy=!0),V.info("[%s] check wind: %j",a.requestId,{...D,dgThd4Wd:c,svThd4Wd:l,hvThd4Wd:h}),(D==null?void 0:D.scale)>=c?(k.isDangerous=!0,delete k.isSevere,delete k.isHeavy):(D==null?void 0:D.scale)>l?(k.isDangerous||(k.isSevere=!0),delete k.isHeavy):(D==null?void 0:D.scale)===h&&!k.isDangerous&&!k.isSevere&&(k.isHeavy=!0),n+=k.isDangerous?W:0,o+=k.isSevere?W:0,s+=k.isHeavy?W:0,$===1&&(f[0].isDangerous=k.isDangerous,f[0].isSevere=k.isSevere,f[0].isHeavy=k.isHeavy)}return n=Math.round(n*100)/100,o=Math.round(o*100)/100,s=Math.round(s*100)/100,t=Math.round(t),{sample:f,dangerous:n,severe:o,heavy:s,step:t<3?3:t,wind:{dgThd4Wd:c,svThd4Wd:l,hvThd4Wd:h},sig:{dgThd4Wv:r,svThd4Wv:i,hvThd4Wv:d}}}}const J=new L;b.AISImpl=O,b.AlertHelper=L,b.AlertLevel=K,b.HifleetImpl=G,b.MyShipImpl=U,b.MyVesselImpl=F,b.ShipxyImpl=B,b.alertHelper=J,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@idm-plugin/vessel",
3
3
  "private": false,
4
- "version": "1.0.4",
4
+ "version": "1.0.6",
5
5
  "description": "idm plugin for vessel",
6
6
  "type": "module",
7
7
  "keywords": [