signalk-aiscast 0.1.4 → 0.3.0

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/CHANGELOG.md CHANGED
@@ -1,13 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0
4
+
5
+ - Buddy boats: vessels on [signalk-buddylist-plugin](https://github.com/sbender9/signalk-buddylist-plugin)'s list are followed on aiscast wherever they are, far beyond VHF range, in every receive mode. The buddylist plugin keeps raising its buddy flag and proximity alerts, so Freeboard-SK's buddy icon and phone notifications work at any distance. The status line shows how many buddies have been heard from.
6
+ - Own-ship reports from NMEA 2000 are recognized by the boat's MMSI, not only by the transceiver-information field. A transmitting transponder (like the B&G V60-B) stamps its own position "Channel A/B VDL transmission", which previously published as `!AIVDM` and left the plugin unaware a transponder was present. Those reports now publish as `!AIVDO`, pause self-reported position synthesis while transponder data flows, and follow the *Share my own ship's AIS transponder data* setting.
7
+
8
+ ## 0.2.0
9
+
10
+ - New Share setting: *Fallback to self-reported AIS position*. When an AIS transponder is not available, the plugin builds class B position and static reports from Signal K (like `@signalk/aisreporter`). It publishes them as `!AIVDO` tagged `s:self`, so a boat with only a GPS appears on aiscast as self-reported. Synthesis pauses while the plugin hears a real `!AIVDO`. The setting is checked by default when you save the config form, and configs saved before this setting existed stay off until you save them again. The checkbox is disabled until an MMSI is set in Vessel settings.
11
+ - Each Share setting explains itself below its label, and Receive mode renders as radio buttons instead of a dropdown.
12
+
3
13
  ## 0.1.4
4
14
 
5
- - Personal tokens minted by aiscast no longer expire; the plugin keeps a cached token with no expiry instead of minting a new one every start.
15
+ - Personal tokens minted by aiscast no longer expire. The plugin keeps a cached token with no expiry instead of minting a new one every start.
6
16
  - The npm package includes this changelog.
7
17
 
8
18
  ## 0.1.3
9
19
 
10
- - Fixes the plugin never connecting on high-latency links (Starlink in remote regions, satellite, some cellular): Node gave up on the IPv4 connection after 250 ms and fell back to an unroutable IPv6 address; each attempt now gets 3 s.
20
+ - Fixes the plugin never connecting on high-latency links (Starlink in remote regions, satellite, some cellular). Node abandoned the IPv4 connection after 250 ms and then used an unroutable IPv6 address. Each attempt now gets 3 s.
11
21
  - The debug log shows the real reason a socket failed (for example `socket error: ETIMEDOUT (connect ETIMEDOUT 2.29.0.215:443; …)`) instead of an empty `socket error:` line.
12
22
 
13
23
  ## 0.1.2
@@ -16,7 +26,7 @@
16
26
 
17
27
  ## 0.1.1
18
28
 
19
- - Retries token minting with backoff (1 to 30 min) instead of waiting six hours after a failed start, so a Pi that boots before its network is up starts sharing as soon as it can.
29
+ - Retries token minting with backoff (1 to 30 min) instead of waiting six hours after a failed start. A Pi that boots before its network is ready now starts sharing as soon as it can.
20
30
  - Token errors include the underlying cause (DNS, TLS, connection refused).
21
31
 
22
32
  ## 0.1.0
package/README.md CHANGED
@@ -2,10 +2,12 @@
2
2
 
3
3
  Signal K plugin for [aiscast](https://github.com/openwatersio/aiscast), the open AIS network from [Open Waters](https://openwaters.io). It does two things over one connection:
4
4
 
5
- - **Share**: every AIS sentence your receiver hears (`!AIVDM` on NMEA 0183, or NMEA 2000 AIS PGNs re-encoded as sentences) is sent to aiscast as it arrives, so the places only boats can hear get coverage. Your own transponder's position (`!AIVDO`) is shared too; it has its own switch if you would rather share only what you hear from others.
6
- - **Receive**: when the boat hears no AIS of its own (no receiver, receiver off, server running ashore), the plugin subscribes to aiscast around your position and injects the traffic as Signal K targets with `$source` `signalk-aiscast.net`, so Freeboard and friends show them. `Always` mode also fills in beyond VHF range; locally heard targets win.
5
+ - **Share**: the plugin sends every AIS sentence your receiver hears to aiscast as it arrives (`!AIVDM` on NMEA 0183, or NMEA 2000 AIS PGNs re-encoded as sentences), so the places only boats can hear get coverage. The plugin also shares your own transponder's position (`!AIVDO`). When an AIS transponder is not available, the plugin builds class B reports from the Signal K position and marks them self-reported. Each part has its own checkbox.
6
+ - **Receive**: when the boat hears no AIS of its own (no receiver, receiver off, server running ashore), the plugin subscribes to aiscast around your position. It injects the traffic as Signal K targets with `$source` `signalk-aiscast.net`, so Freeboard and friends show them. `Always` mode also adds traffic beyond VHF range, and locally heard targets win.
7
7
 
8
- No account. On first start the plugin generates an Ed25519 keypair in its data directory and requests its own access token from aiscast (sent as an `Authorization: Bearer` header); receptions are credited to that key. Paste an operator-issued token into the config to publish as a named station with higher limits.
8
+ It also follows your buddy boats worldwide: see [Buddy boats](#buddy-boats).
9
+
10
+ No account. On first start the plugin generates an Ed25519 keypair in its data directory and requests its own access token from aiscast, sent as an `Authorization: Bearer` header. aiscast credits receptions to that key. Paste an operator-issued token into the config to publish as a named station with higher limits.
9
11
 
10
12
  ## Install
11
13
 
@@ -15,23 +17,37 @@ Signal K App Store → `signalk-aiscast`, or `npm install signalk-aiscast` in `~
15
17
 
16
18
  | Setting | Default | Meaning |
17
19
  |---|---|---|
18
- | Share → Other vessels | on | publish AIS heard by the receiver (NMEA 0183 `!AIVDM`, NMEA 2000 AIS) |
19
- | Share → Own ship | on | publish `!AIVDO`; your position becomes public open data on aiscast (it is already broadcast on VHF) |
20
- | ReceiveShow traffic from aiscast | auto | `Off`, `Auto` (only while nothing is heard locally for 90 s), `Always` (also beyond local VHF range; local reception wins per target) |
20
+ | Share → AIS targets I receive | on | publish AIS heard by the receiver (NMEA 0183 `!AIVDM`, NMEA 2000 AIS) |
21
+ | Share → My own ship's AIS transponder data | on | forward what the transponder broadcasts (`!AIVDO`). Your position becomes public open data on aiscast, and the transponder already broadcasts it on VHF |
22
+ | ShareFallback to self-reported AIS position | on | when an AIS transponder is not available, build class B reports from Signal K: position every 60 s while moving, static data every 6 min, tagged `s:self`. Synthesis pauses for 5 min after any real `!AIVDO`. The setting stays disabled until an MMSI is set in Vessel settings |
23
+ | Receive → Show traffic from aiscast | auto | `Off`, `Auto` (only while nothing is heard locally for 90 s), `Always` (also beyond local VHF range, and local reception wins per target) |
21
24
  | Receive → Radius | 50 nm | subscription box around the vessel (5–200) |
22
25
  | Advanced → Server | `https://ais.openwaters.io` | aiscast base URL |
23
- | Advanced → Access token | empty | optional operator-issued token; empty = self-minted personal token |
26
+ | Advanced → Access token | empty | optional operator-issued token. Empty = self-minted personal token |
27
+
28
+ ## Buddy boats
29
+
30
+ Install [signalk-buddylist-plugin](https://github.com/sbender9/signalk-buddylist-plugin) alongside and the vessels on its buddy list stay on your chart wherever they are, far beyond VHF range. The buddylist plugin owns the list and the alerts; this plugin only supplies the positions, from aiscast, by subscribing to the buddies' MMSIs alongside the radius.
31
+
32
+ - Add a buddy in Freeboard-SK (tap a vessel → "Is Buddy"), through the buddylist plugin's config, or `POST /signalk/v2/api/resources/buddies` with `{"urn": "urn:mrn:imo:mmsi:<mmsi>", "name": "Selkie"}`. The plugin picks up changes within a minute.
33
+ - Buddies are followed in every receive mode, including `Off`: the whole point is traffic beyond local reception. Local reception still wins per target in `Always` mode.
34
+ - The buddylist plugin raises `vessels.<urn>.buddy` and its `notifications.buddy.<urn>` proximity alert the moment positions arrive, so Freeboard's buddy icon, the buddies-only filter, and phone alerts via signalk-push-notifications all work at any distance.
35
+ - The status line shows `buddies 2/3`: how many of the listed buddies aiscast has heard from in the last 10 minutes.
36
+ - A buddy only appears when some station or satellite feed hears them. Coastal coverage is good; mid-ocean gaps are real.
37
+
38
+ Without the buddylist plugin installed, there are no buddies and nothing changes.
24
39
 
25
40
  ## Behaviour worth knowing
26
41
 
27
- - Sentences go out as received, each stamped with a NMEA TAG block carrying the receive time. Anything not acknowledged, or heard while offline, waits in `<data dir>/queue/` (cap 100 MB) and replays oldest-first on reconnect; aiscast archives replayed sentences older than a minute without putting them on the live map.
28
- - Reconnects with jittered backoff (5 s → 5 min; 30 min after a refusal) and a 60 s silence watchdog. Status line in Plugin Config shows the key prefix, send rate, queue depth, targets, and link state.
29
- - Injected targets come through the server's own AIS parser, so they are shaped exactly like VHF-received ones; the server's *Maximum age of inactive vessels* setting expires them. Your own vessel and echoes of your own receptions are never injected, and payloads received from aiscast are never published back.
30
- - NMEA 2000 AIS needs nothing extra: PGNs 129038/129039/129041/129794/129809/129810 are re-encoded to `!AIVDM` (own ship to `!AIVDO`) and tagged `s:n2k`, since N2K carries decoded fields rather than the VHF bits. `signalk-n2kais-to-nmea0183` is not required and not listened to.
42
+ - The plugin sends sentences as received, each stamped with a NMEA TAG block that carries the receive time. Anything unacknowledged, or heard while offline, waits in `<data dir>/queue/` (cap 100 MB) and replays oldest-first on reconnect. aiscast archives replayed sentences older than a minute and keeps them off the live map.
43
+ - The plugin reconnects with jittered backoff (5 s → 5 min, and 30 min after a refusal) and a 60 s silence watchdog. The status line in Plugin Config shows the key prefix, send rate, queue depth, targets, and link state.
44
+ - Injected targets come through the server's own AIS parser, so they are shaped exactly like VHF-received ones. The server's *Maximum age of inactive vessels* setting expires them. The plugin never injects your own vessel or echoes of your own receptions, and it never publishes payloads from aiscast back to aiscast.
45
+ - NMEA 2000 AIS needs nothing extra. The plugin re-encodes PGNs 129038/129039/129041/129794/129809/129810 to `!AIVDM` (own ship to `!AIVDO`) and tags them `s:n2k`, since N2K carries decoded fields rather than the VHF bits. The plugin works without `signalk-n2kais-to-nmea0183` and ignores its output.
46
+ - The self-reported position fallback does for aiscast what `@signalk/aisreporter` does for MarineTraffic. Position comes from `navigation.position`, with SOG, COG, and heading (true, or magnetic plus variation) when present, and the AIS "not available" values when absent. Name, callsign, ship type, and dimensions come from `name`, `communication.callsignVhf`, `design.aisShipType`, `design.length`/`design.beam`, and `sensors.gps.fromBow`/`fromCenter`. aiscast marks these events `synthesized: true`, keeps them out of its AISHub feed, and shows them apart from VHF receptions. The plugin sends nothing without a fix, while the GPS sits at Null Island, or while the position stays unchanged.
31
47
 
32
48
  ## Data and licensing
33
49
 
34
- What you share is published by aiscast under its open data terms (see the [aiscast README](https://github.com/openwatersio/aiscast#readme)). The plugin never shares anything other than AIS sentences and, if you enable it, your own AIS position. Removal requests and the privacy policy are on the aiscast site.
50
+ aiscast publishes what you share under its open data terms: the [contributor agreement](https://github.com/openwatersio/aiscast/blob/main/docs/contributor-agreement.md), summarized in the [aiscast README](https://github.com/openwatersio/aiscast#readme). The plugin shares only AIS sentences and, if you enable it, your own position. That position comes from the transponder, or the plugin builds it from Signal K when an AIS transponder is not available. Removal requests and the privacy policy are on the aiscast site.
35
51
 
36
52
  ## Development
37
53
 
@@ -41,4 +57,4 @@ npm test # vitest against a fake aiscast server
41
57
  npm run build # dist/
42
58
  ```
43
59
 
44
- Released to npm by the repo's `release.yml` when a GitHub release tagged `signalk-plugin-v*` is created.
60
+ The repo's `release.yml` releases to npm when someone creates a GitHub release tagged `signalk-plugin-v*`.
@@ -0,0 +1,16 @@
1
+ export declare const BUDDYLIST_OPTIONS = "signalk-buddylist-plugin.json";
2
+ export declare class Buddies {
3
+ private readonly file;
4
+ private readonly selfMmsi;
5
+ private readonly onChange;
6
+ private readonly pollMs;
7
+ private timer;
8
+ private stopped;
9
+ private last;
10
+ mmsis: number[];
11
+ constructor(file: string, // <config>/plugin-config-data/signalk-buddylist-plugin.json
12
+ selfMmsi: string | null, onChange: (mmsis: number[]) => void, pollMs?: number);
13
+ start(): void;
14
+ stop(): void;
15
+ private poll;
16
+ }
@@ -0,0 +1,59 @@
1
+ import { readFile } from "node:fs/promises";
2
+ export const BUDDYLIST_OPTIONS = "signalk-buddylist-plugin.json";
3
+ // The buddy list belongs to signalk-buddylist-plugin (Freeboard-SK's "Is Buddy" button writes to it, and it
4
+ // raises the vessels.<urn>.buddy flag and proximity notifications once positions arrive). This watches its
5
+ // saved options for MMSIs to follow on aiscast. No file, plugin disabled, or no buddies all mean an empty list.
6
+ export class Buddies {
7
+ file;
8
+ selfMmsi;
9
+ onChange;
10
+ pollMs;
11
+ timer = null;
12
+ stopped = false;
13
+ last = ""; // matches the empty list, so a missing file never reports a change
14
+ mmsis = [];
15
+ constructor(file, // <config>/plugin-config-data/signalk-buddylist-plugin.json
16
+ selfMmsi, onChange, pollMs = 60_000) {
17
+ this.file = file;
18
+ this.selfMmsi = selfMmsi;
19
+ this.onChange = onChange;
20
+ this.pollMs = pollMs;
21
+ }
22
+ start() {
23
+ void this.poll();
24
+ this.timer = setInterval(() => void this.poll(), this.pollMs);
25
+ }
26
+ stop() {
27
+ this.stopped = true;
28
+ if (this.timer)
29
+ clearInterval(this.timer);
30
+ this.timer = null;
31
+ }
32
+ async poll() {
33
+ let mmsis = [];
34
+ try {
35
+ const opts = JSON.parse(await readFile(this.file, "utf8"));
36
+ if (opts.enabled !== false) {
37
+ mmsis = (opts.configuration?.buddies ?? [])
38
+ // only real MMSIs reach the subscription; a malformed one would refuse the whole frame
39
+ .map((b) => /^urn:mrn:imo:mmsi:(\d{9})$/.exec(b.urn ?? "")?.[1])
40
+ .filter((m) => m != null && m !== this.selfMmsi)
41
+ .map(Number);
42
+ }
43
+ }
44
+ catch (err) {
45
+ // Missing file means the buddylist plugin is not installed or never configured: an empty list.
46
+ // Anything else (EACCES, EMFILE, a torn read) is transient: keep the last list and try again later.
47
+ if (err.code !== "ENOENT")
48
+ return;
49
+ }
50
+ mmsis = [...new Set(mmsis)].sort((a, b) => a - b);
51
+ const key = mmsis.join();
52
+ if (this.stopped || key === this.last)
53
+ return;
54
+ this.last = key;
55
+ this.mmsis = mmsis;
56
+ this.onChange(mmsis);
57
+ }
58
+ }
59
+ //# sourceMappingURL=buddies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buddies.js","sourceRoot":"","sources":["../src/buddies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAEjE,4GAA4G;AAC5G,2GAA2G;AAC3G,gHAAgH;AAChH,MAAM,OAAO,OAAO;IAOC;IACA;IACA;IACA;IATX,KAAK,GAA0B,IAAI,CAAC;IACpC,OAAO,GAAG,KAAK,CAAC;IAChB,IAAI,GAAG,EAAE,CAAC,CAAC,mEAAmE;IACtF,KAAK,GAAa,EAAE,CAAC;IAErB,YACmB,IAAY,EAAE,4DAA4D;IAC1E,QAAuB,EACvB,QAAmC,EACnC,SAAS,MAAM;QAHf,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAe;QACvB,aAAQ,GAAR,QAAQ,CAA2B;QACnC,WAAM,GAAN,MAAM,CAAS;IAC/B,CAAC;IAEJ,KAAK;QACH,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,KAAK,GAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAGxD,CAAC;YACF,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC3B,KAAK,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,IAAI,EAAE,CAAC;oBACzC,uFAAuF;qBACtF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;qBAC/D,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC;qBAC5D,GAAG,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,+FAA+F;YAC/F,oGAAoG;YACpG,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO;QAC/D,CAAC;QACD,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO;QAC9C,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;CACF"}
@@ -29,14 +29,20 @@ export declare class Downlink {
29
29
  private subscribed;
30
30
  private timer;
31
31
  private targets;
32
+ private buddies;
33
+ private sentMmsi;
34
+ private mmsiCap;
35
+ private lastFrame;
36
+ private refusedFrame;
32
37
  private selfMmsi;
33
38
  stats: DownlinkStats;
34
39
  constructor(app: ServerAPI, link: Link, opts: DownlinkOptions, log?: (msg: string) => void);
35
40
  start(): void;
36
41
  stop(): void;
37
42
  localHeard(now?: number): void;
43
+ setBuddies(mmsis: number[]): void;
44
+ buddiesSeen(now?: number): number;
38
45
  private wanted;
39
- private ownPosition;
40
46
  tick(now?: number): void;
41
47
  private onFrame;
42
48
  private vhfIsFresh;
package/dist/downlink.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Parser } from "@signalk/nmea0183-signalk";
2
2
  import { stripTag } from "./nmea.js";
3
+ import { ownPosition } from "./ownship.js";
3
4
  const LOCAL_QUIET = 90_000; // auto: no local AIS for this long → subscribe
4
5
  const RESUBSCRIBE_FRACTION = 0.25; // re-send the box after moving this fraction of the radius
5
6
  const VHF_WINS = 60_000; // always: leave a target alone when another source updated it this recently
@@ -17,6 +18,11 @@ export class Downlink {
17
18
  subscribed = false;
18
19
  timer = null;
19
20
  targets = new Map();
21
+ buddies = [];
22
+ sentMmsi = "";
23
+ mmsiCap = Infinity; // from the welcome frame's limits; the server refuses a too-long list as a whole frame
24
+ lastFrame = ""; // last subscribe frame sent, to avoid re-sending one the server refused
25
+ refusedFrame = "";
20
26
  selfMmsi;
21
27
  stats = { targets: 0, events: 0, subscribed: false };
22
28
  constructor(app, link, opts, log = () => { }) {
@@ -30,6 +36,7 @@ export class Downlink {
30
36
  start() {
31
37
  this.link.on("open", () => {
32
38
  this.subscribed = false;
39
+ this.refusedFrame = "";
33
40
  this.tick();
34
41
  });
35
42
  this.link.on("close", () => {
@@ -37,8 +44,12 @@ export class Downlink {
37
44
  this.stats.subscribed = false;
38
45
  });
39
46
  this.link.on("error", (message) => {
40
- if (/bbox/.test(message))
41
- this.subscribed = this.stats.subscribed = false; // aiscast kept the old subscription (none)
47
+ // aiscast refuses a subscribe frame as a unit and keeps the old subscription (none). Remember the
48
+ // refused frame so the 10 s tick does not resend it verbatim; any change to it is tried again.
49
+ if (/bbox|mmsi/i.test(message)) {
50
+ this.subscribed = this.stats.subscribed = false;
51
+ this.refusedFrame = this.lastFrame;
52
+ }
42
53
  });
43
54
  this.link.on("frame", (f) => this.onFrame(f));
44
55
  this.timer = setInterval(() => this.tick(), 10_000);
@@ -55,6 +66,22 @@ export class Downlink {
55
66
  if (this.subscribed && this.opts.mode === "auto")
56
67
  this.tick(now);
57
68
  }
69
+ // Buddy MMSIs to follow wherever they are, independent of the receive mode: the point is traffic
70
+ // beyond local reception, so the list keeps the subscription alive even when the radius half is quiet.
71
+ setBuddies(mmsis) {
72
+ this.buddies = mmsis;
73
+ this.tick();
74
+ }
75
+ // How many buddies have been heard from recently.
76
+ buddiesSeen(now = Date.now()) {
77
+ let n = 0;
78
+ for (const m of this.buddies) {
79
+ const at = this.targets.get(`vessels.urn:mrn:imo:mmsi:${m}`);
80
+ if (at != null && now - at < TARGET_TTL)
81
+ n++;
82
+ }
83
+ return n;
84
+ }
58
85
  wanted(now) {
59
86
  switch (this.opts.mode) {
60
87
  case "off":
@@ -65,55 +92,79 @@ export class Downlink {
65
92
  return now - this.lastLocal > LOCAL_QUIET;
66
93
  }
67
94
  }
68
- ownPosition() {
69
- const p = this.app.getSelfPath("navigation.position");
70
- const v = p && "value" in p ? p.value : p;
71
- if (!v || typeof v.latitude !== "number" || typeof v.longitude !== "number")
72
- return null;
73
- if (Math.abs(v.latitude) < 1e-6 && Math.abs(v.longitude) < 1e-6)
74
- return null; // Null Island
75
- return v;
76
- }
77
95
  tick(now = Date.now()) {
78
96
  if (!this.link.open)
79
97
  return;
80
- if (!this.wanted(now)) {
98
+ const wantBox = this.wanted(now);
99
+ const pos = wantBox ? ownPosition(this.app) : null;
100
+ // Never subscribe a box without a fix: an empty bbox is the whole world. While the fix is gone, the
101
+ // last box stands in so a GPS dropout does not tear down the subscription.
102
+ const box = pos ? { lat: pos.latitude, lon: pos.longitude, radiusNm: this.opts.radiusNm } : wantBox ? this.box : null;
103
+ // Over the cap, the server would refuse the whole frame, bbox included: follow what fits instead.
104
+ const mmsi = this.buddies.length > this.mmsiCap ? this.buddies.slice(0, this.mmsiCap) : this.buddies;
105
+ if (!box && mmsi.length === 0) {
81
106
  if (this.subscribed && this.link.send({ type: "unsubscribe" })) {
82
107
  this.subscribed = false;
83
108
  this.stats.subscribed = false;
109
+ this.box = null;
110
+ this.sentMmsi = "";
84
111
  this.log("unsubscribed");
85
112
  }
86
113
  return;
87
114
  }
88
- const pos = this.ownPosition();
89
- if (!pos)
90
- return; // never subscribe without a position: an empty bbox is the whole world
91
- const moved = this.box
92
- ? distanceNm(pos.latitude, pos.longitude, this.box.lat, this.box.lon) > this.box.radiusNm * RESUBSCRIBE_FRACTION ||
93
- this.box.radiusNm !== this.opts.radiusNm
94
- : true;
95
- if (this.subscribed && !moved)
115
+ const boxChanged = box !== this.box &&
116
+ (!box ||
117
+ !this.box ||
118
+ distanceNm(box.lat, box.lon, this.box.lat, this.box.lon) > this.box.radiusNm * RESUBSCRIBE_FRACTION ||
119
+ this.box.radiusNm !== box.radiusNm);
120
+ if (this.subscribed && !boxChanged && mmsi.join() === this.sentMmsi)
121
+ return;
122
+ // snapshot: the server replays its cache for the new coverage, so targets appear at connect
123
+ // instead of one by one as they next transmit (a moored class B is minutes between reports).
124
+ const frame = { type: "subscribe", snapshot: true };
125
+ if (box)
126
+ frame.bbox = [bbox(box)];
127
+ if (mmsi.length > 0)
128
+ frame.mmsi = mmsi;
129
+ const encoded = JSON.stringify(frame);
130
+ if (encoded === this.refusedFrame)
96
131
  return;
97
- const box = { lat: pos.latitude, lon: pos.longitude, radiusNm: this.opts.radiusNm };
98
- if (this.link.send({ type: "subscribe", bbox: [bbox(box)] })) {
132
+ this.lastFrame = encoded;
133
+ if (this.link.send(frame)) {
99
134
  this.box = box;
135
+ this.sentMmsi = mmsi.join();
100
136
  this.subscribed = true;
101
137
  this.stats.subscribed = true;
102
- this.log(`subscribed ${box.radiusNm} nm around ${box.lat.toFixed(3)},${box.lon.toFixed(3)}`);
138
+ const parts = [
139
+ box && `${box.radiusNm} nm around ${box.lat.toFixed(3)},${box.lon.toFixed(3)}`,
140
+ mmsi.length > 0 && `${mmsi.length} buddies`,
141
+ ];
142
+ this.log(`subscribed ${parts.filter(Boolean).join(" + ")}`);
103
143
  }
104
144
  }
105
145
  onFrame(f) {
146
+ if (f.type === "welcome") {
147
+ const cap = f.limits?.mmsis;
148
+ if (typeof cap === "number" && cap !== this.mmsiCap) {
149
+ this.mmsiCap = cap;
150
+ this.tick(); // a tighter cap trims the list; a looser one restores it
151
+ }
152
+ return;
153
+ }
106
154
  if (f.type !== "event")
107
155
  return;
108
156
  const ev = f;
109
157
  if (!Array.isArray(ev.nmea) || ev.nmea.length === 0)
110
158
  return;
111
- for (const s of ev.nmea)
112
- this.opts.onReceived?.(s);
159
+ // Own-vessel echoes (our publishes, or another station hearing our transmission) skip the loop guard:
160
+ // marking them seen would swallow our own future uplink of an identical payload (re-synthesized s:self
161
+ // position, type 24 rebroadcast unchanged every few minutes). Self is never injected, so there is no loop.
113
162
  if (this.opts.selfSource && ev.source === this.opts.selfSource)
114
163
  return;
115
164
  if (!ev.mmsi || String(ev.mmsi) === this.selfMmsi)
116
165
  return;
166
+ for (const s of ev.nmea)
167
+ this.opts.onReceived?.(s);
117
168
  if (POSITION_TYPES.has(ev.msg_type ?? "") && (ev.lat == null || ev.lon == null))
118
169
  return; // aiscast rejected the position
119
170
  let delta = null;
@@ -1 +1 @@
1
- {"version":3,"file":"downlink.js","sourceRoot":"","sources":["../src/downlink.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"downlink.js","sourceRoot":"","sources":["../src/downlink.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export interface Config {
5
5
  share?: {
6
6
  targets?: boolean;
7
7
  ownShip?: boolean;
8
+ position?: boolean;
8
9
  };
9
10
  receive?: {
10
11
  mode?: ReceiveMode;
package/dist/index.js CHANGED
@@ -1,8 +1,11 @@
1
+ import { join } from "node:path";
2
+ import { Buddies, BUDDYLIST_OPTIONS } from "./buddies.js";
1
3
  import { Downlink } from "./downlink.js";
2
4
  import { forgetToken, loadIdentity, loadToken, } from "./identity.js";
3
5
  import { Link } from "./link.js";
4
6
  import { n2kToSentence } from "./n2k.js";
5
7
  import { isAis, isOwnShip } from "./nmea.js";
8
+ import { OwnShip, SOURCE_TAG } from "./ownship.js";
6
9
  import { Uplink } from "./uplink.js";
7
10
  export const PLUGIN_ID = "signalk-aiscast";
8
11
  const DEFAULT_SERVER = "https://ais.openwaters.io";
@@ -20,6 +23,7 @@ export default function (app) {
20
23
  description: "Show nearby traffic without an AIS receiver and share your AIS data with the world.",
21
24
  schema: {
22
25
  type: "object",
26
+ description: "By enabling this plugin, you agree to the Open Waters AIS Contributor Agreement (https://github.com/openwatersio/aiscast/blob/main/docs/contributor-agreement.md): the AIS data you share is dedicated to the public domain.",
23
27
  properties: {
24
28
  share: {
25
29
  type: "object",
@@ -27,12 +31,17 @@ export default function (app) {
27
31
  properties: {
28
32
  targets: {
29
33
  type: "boolean",
30
- title: "Other vessels (NMEA 0183 !AIVDM and NMEA 2000 AIS)",
34
+ title: "Share AIS targets I receive",
31
35
  default: true,
32
36
  },
33
37
  ownShip: {
34
38
  type: "boolean",
35
- title: "Own ship (!AIVDO)",
39
+ title: "Share my own ship's AIS transponder data",
40
+ default: true,
41
+ },
42
+ position: {
43
+ type: "boolean",
44
+ title: "Fallback to self-reported AIS position",
36
45
  default: true,
37
46
  },
38
47
  },
@@ -79,10 +88,29 @@ export default function (app) {
79
88
  },
80
89
  },
81
90
  },
82
- uiSchema: {
91
+ // A function so the MMSI check runs fresh on every config-page load.
92
+ uiSchema: () => ({
83
93
  "ui:order": ["share", "receive", "advanced"],
94
+ share: {
95
+ // the checkbox widget puts schema descriptions above the label; ui:help renders below
96
+ targets: {
97
+ "ui:help": "Other vessels visible from a connected NMEA 0183/2000 AIS receiver.",
98
+ },
99
+ ownShip: {
100
+ "ui:help": "Forward what the AIS transponder broadcasts; it is already public on VHF.",
101
+ },
102
+ position: app.getSelfPath("mmsi")
103
+ ? {
104
+ "ui:help": "When an AIS transponder is not available, but GPS position is, synthesize class B AIS reports from Signal K data.",
105
+ }
106
+ : {
107
+ "ui:disabled": true,
108
+ "ui:help": "Needs an MMSI in Vessel settings.",
109
+ },
110
+ },
111
+ receive: { mode: { "ui:widget": "radio" } },
84
112
  advanced: { token: { "ui:widget": "password" } },
85
- },
113
+ }),
86
114
  start(config) {
87
115
  const gen = ++generation;
88
116
  startAsync(config, gen).catch((err) => {
@@ -104,6 +132,10 @@ export default function (app) {
104
132
  const wsBase = server.replace(/^http/, "ws");
105
133
  const shareTargets = config.share?.targets ?? true;
106
134
  const shareOwn = config.share?.ownShip ?? true;
135
+ // Absent from a config saved before the setting existed: off, so an upgrade never enables it silently.
136
+ const sharePosition = config.share?.position ?? false;
137
+ if (sharePosition && !app.getSelfPath("mmsi"))
138
+ app.debug("self-reported position is on but no MMSI is set; nothing will be synthesized");
107
139
  const mode = config.receive?.mode ?? "auto";
108
140
  const radiusNm = Math.min(200, Math.max(5, config.receive?.radiusNm ?? 50));
109
141
  const dir = app.getDataDirPath();
@@ -151,6 +183,7 @@ export default function (app) {
151
183
  // Token in a header, not the URL, so it stays out of proxy and server logs.
152
184
  const l = new Link(() => `${wsBase}/v1/stream`, () => token ? { Authorization: `Bearer ${token.token}` } : {}, log);
153
185
  const up = new Uplink(l, dir, log);
186
+ const own = new OwnShip(app, (s, now) => up.hear(s, now, SOURCE_TAG));
154
187
  const down = new Downlink(app, l, {
155
188
  mode,
156
189
  radiusNm,
@@ -158,7 +191,10 @@ export default function (app) {
158
191
  selfSource,
159
192
  onReceived: (s) => up.noteReceived(s),
160
193
  }, log);
161
- const canShare = () => token !== null && !publishRefused && (shareTargets || shareOwn);
194
+ // The data dir is <config>/plugin-config-data/<id>; the buddylist plugin's options file is a sibling.
195
+ const selfMmsi = app.getSelfPath("mmsi");
196
+ const buddies = new Buddies(join(dir, "..", BUDDYLIST_OPTIONS), selfMmsi == null ? null : String(selfMmsi), (mmsis) => down.setBuddies(mmsis));
197
+ const canShare = () => token !== null && !publishRefused && (shareTargets || shareOwn || sharePosition);
162
198
  up.enabled = canShare();
163
199
  l.on("open", () => {
164
200
  if (publishRefused)
@@ -190,6 +226,9 @@ export default function (app) {
190
226
  else if (/bbox/.test(message)) {
191
227
  reportError(`aiscast refused the subscription: ${message} (reduce the radius)`);
192
228
  }
229
+ else if (/mmsi/.test(message)) {
230
+ reportError(`aiscast refused the buddy list: ${message} (trim the buddy list)`);
231
+ }
193
232
  else {
194
233
  log(`aiscast: ${message}`);
195
234
  }
@@ -200,15 +239,21 @@ export default function (app) {
200
239
  return;
201
240
  }
202
241
  down.start();
242
+ buddies.start();
203
243
  l.start();
244
+ if (sharePosition)
245
+ own.start();
204
246
  const onSentence = (sentence, source) => {
205
247
  if (typeof sentence !== "string" || !isAis(sentence))
206
248
  return;
207
- const own = isOwnShip(sentence);
208
- if (!own)
209
- down.localHeard();
210
- if (own ? shareOwn : shareTargets)
211
- up.hear(sentence, Date.now(), source);
249
+ const now = Date.now();
250
+ const isOwn = isOwnShip(sentence);
251
+ if (isOwn)
252
+ own.heard(now);
253
+ else
254
+ down.localHeard(now);
255
+ if (isOwn ? shareOwn : shareTargets)
256
+ up.hear(sentence, now, source);
212
257
  };
213
258
  const onNmea = (sentence) => onSentence(sentence);
214
259
  const onN2k = (msg) => {
@@ -233,6 +278,8 @@ export default function (app) {
233
278
  refreshToken()
234
279
  .catch((err) => log(`token refresh: ${describe(err)}`))
235
280
  .then(() => {
281
+ if (!live())
282
+ return; // stop() landed mid-refresh; do not resurrect the timer
236
283
  up.enabled = canShare();
237
284
  if (token?.token !== before)
238
285
  l.reconnect();
@@ -260,17 +307,20 @@ export default function (app) {
260
307
  const upText = up.enabled
261
308
  ? `↑ ${perMin}/min (queue ${up.stats.queued})`
262
309
  : "↑ off";
263
- const downText = mode === "off"
264
- ? "↓ off"
265
- : down.stats.subscribed
266
- ? `↓ ${down.stats.targets} targets`
310
+ const downText = down.stats.subscribed
311
+ ? `↓ ${down.stats.targets} targets`
312
+ : mode === "off"
313
+ ? "↓ off"
267
314
  : "↓ idle";
315
+ const buddyText = buddies.mmsis.length > 0
316
+ ? ` buddies ${down.buddiesSeen()}/${buddies.mmsis.length}`
317
+ : "";
268
318
  const linkText = l.open
269
319
  ? "connected"
270
320
  : l.lastRefusal
271
321
  ? `refused: ${l.lastRefusal}`
272
322
  : "reconnecting";
273
- app.setPluginStatus(`key ${key}… ${upText} ${downText} ${linkText}`);
323
+ app.setPluginStatus(`key ${key}… ${upText} ${downText}${buddyText} ${linkText}`);
274
324
  }, STATUS_EVERY),
275
325
  ];
276
326
  teardown = async () => {
@@ -280,6 +330,8 @@ export default function (app) {
280
330
  clearTimeout(tokenTimer);
281
331
  events.removeListener("nmea0183", onNmea);
282
332
  events.removeListener("N2KAnalyzerOut", onN2k);
333
+ own.stop();
334
+ buddies.stop();
283
335
  down.stop();
284
336
  await up.stop();
285
337
  l.stop();
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/n2k.js CHANGED
@@ -8,7 +8,10 @@ export function n2kToSentence(app, msg) {
8
8
  return null;
9
9
  const pgn = convertNamesToCamel(app, msg);
10
10
  const f = pgn.fields ?? {};
11
- const own = f.aisTransceiverInformation === AisTransceiver.OwnInformationNotBroadcast;
11
+ // A transmitting transponder stamps its own position "Channel A/B VDL transmission", not
12
+ // "Own information not broadcast" (that's silent/receive-only mode), so match by MMSI too.
13
+ const own = f.aisTransceiverInformation === AisTransceiver.OwnInformationNotBroadcast ||
14
+ (f.userId !== undefined && f.userId === Number(app.getSelfPath("mmsi")));
12
15
  let enc = null;
13
16
  switch (msg.pgn) {
14
17
  case 129038: // class A position
package/dist/n2k.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"n2k.js","sourceRoot":"","sources":["../src/n2k.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"n2k.js","sourceRoot":"","sources":["../src/n2k.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ServerAPI } from "@signalk/server-api";
2
+ export declare const SOURCE_TAG = "self";
3
+ export interface Position {
4
+ latitude: number;
5
+ longitude: number;
6
+ }
7
+ export declare function ownPosition(app: ServerAPI): Position | null;
8
+ export declare class OwnShip {
9
+ private readonly app;
10
+ private readonly emit;
11
+ private lastHeard;
12
+ private lastStatic;
13
+ private lastLat?;
14
+ private lastLon?;
15
+ private timer;
16
+ constructor(app: ServerAPI, emit: (sentence: string, now: number) => void);
17
+ start(): void;
18
+ stop(): void;
19
+ heard(now?: number): void;
20
+ tick(now?: number): void;
21
+ private position;
22
+ private static;
23
+ private num;
24
+ }
@@ -0,0 +1,139 @@
1
+ import ggencoder from "ggencoder";
2
+ const { AisEncode } = ggencoder; // CommonJS without static named exports
3
+ export const SOURCE_TAG = "self";
4
+ const REPORT_EVERY = 60_000;
5
+ const STATIC_EVERY = 6 * 60_000;
6
+ const TRANSPONDER_QUIET = 5 * 60_000; // a class B transponder sends at least every 3 min; longer silence means none
7
+ // AIS "not available" sentinels; ggencoder would otherwise encode 0 (stopped, heading north).
8
+ const SOG_NA_KN = 102.3;
9
+ const COG_NA_DEG = 360;
10
+ const HDG_NA = 511;
11
+ export function ownPosition(app) {
12
+ const p = app.getSelfPath("navigation.position");
13
+ const v = p && "value" in p ? p.value : p;
14
+ if (!v || typeof v.latitude !== "number" || typeof v.longitude !== "number")
15
+ return null;
16
+ if (Math.abs(v.latitude) < 1e-6 && Math.abs(v.longitude) < 1e-6)
17
+ return null; // Null Island
18
+ return v;
19
+ }
20
+ export class OwnShip {
21
+ app;
22
+ emit;
23
+ lastHeard = 0;
24
+ lastStatic = 0;
25
+ lastLat;
26
+ lastLon;
27
+ timer = null;
28
+ constructor(app, emit) {
29
+ this.app = app;
30
+ this.emit = emit;
31
+ }
32
+ start() {
33
+ this.timer = setInterval(() => this.tick(), REPORT_EVERY);
34
+ this.tick();
35
+ }
36
+ stop() {
37
+ if (this.timer)
38
+ clearInterval(this.timer);
39
+ this.timer = null;
40
+ }
41
+ // A real !AIVDO came through: the boat has a transponder, so nothing is synthesized for a while.
42
+ heard(now = Date.now()) {
43
+ this.lastHeard = now;
44
+ }
45
+ tick(now = Date.now()) {
46
+ if (now - this.lastHeard < TRANSPONDER_QUIET)
47
+ return;
48
+ const mmsi = this.app.getSelfPath("mmsi");
49
+ if (!mmsi)
50
+ return;
51
+ const pos = ownPosition(this.app);
52
+ if (!pos)
53
+ return;
54
+ // Positions are skipped while unchanged (stuck GPS, tree re-emitting the same value); static is due regardless.
55
+ if (pos.latitude !== this.lastLat || pos.longitude !== this.lastLon) {
56
+ const sentence = this.position(mmsi, pos);
57
+ if (sentence)
58
+ this.emit(sentence, now);
59
+ this.lastLat = pos.latitude;
60
+ this.lastLon = pos.longitude;
61
+ }
62
+ if (now - this.lastStatic >= STATIC_EVERY) {
63
+ this.lastStatic = now;
64
+ for (const s of this.static(mmsi))
65
+ this.emit(s, now);
66
+ }
67
+ }
68
+ position(mmsi, pos) {
69
+ const sog = this.num("navigation.speedOverGround.value");
70
+ const cog = this.num("navigation.courseOverGroundTrue.value");
71
+ let hdg = this.num("navigation.headingTrue.value");
72
+ if (hdg === undefined) {
73
+ const mag = this.num("navigation.headingMagnetic.value");
74
+ const variation = this.num("navigation.magneticVariation.value"); // east-positive, so true = magnetic + variation
75
+ if (mag !== undefined && variation !== undefined)
76
+ hdg = mag + variation;
77
+ }
78
+ return encode({
79
+ aistype: 18,
80
+ repeat: 0,
81
+ own: true,
82
+ mmsi,
83
+ lat: pos.latitude,
84
+ lon: pos.longitude,
85
+ accuracy: 0,
86
+ // ggencoder truncates to the field resolution (0.1 kn, 0.1°, 1°), so round first; a course near due
87
+ // north must wrap to 0, not round up to the 360 "not available" sentinel
88
+ sog: sog === undefined ? SOG_NA_KN : Math.round(sog * 19.438444924574) / 10,
89
+ cog: cog === undefined ? COG_NA_DEG : (Math.round(deg(cog) * 10) % 3600) / 10,
90
+ hdg: hdg === undefined ? HDG_NA : Math.round(deg(hdg)) % 360,
91
+ });
92
+ }
93
+ static(mmsi) {
94
+ const out = [];
95
+ const name = this.app.getSelfPath("name");
96
+ if (typeof name === "string" && name) {
97
+ const partA = encode({ aistype: 24, repeat: 0, own: true, part: 0, mmsi, shipname: name });
98
+ if (partA)
99
+ out.push(partA);
100
+ }
101
+ const cargo = this.num("design.aisShipType.value.id");
102
+ const callsign = this.app.getSelfPath("communication.callsignVhf");
103
+ const length = this.num("design.length.value.overall");
104
+ const beam = this.num("design.beam.value");
105
+ const partB = {};
106
+ if (cargo !== undefined)
107
+ partB.cargo = cargo;
108
+ if (typeof callsign === "string" && callsign)
109
+ partB.callsign = callsign;
110
+ if (length !== undefined && beam !== undefined) {
111
+ const fromBow = this.num("sensors.gps.fromBow.value") ?? length / 2;
112
+ const fromCenter = this.num("sensors.gps.fromCenter.value") ?? 0; // Signal K: positive to port
113
+ partB.dimA = Math.round(fromBow);
114
+ partB.dimB = Math.round(length - fromBow);
115
+ partB.dimC = Math.round(beam / 2 - fromCenter); // dimC is to port, dimD to starboard
116
+ partB.dimD = Math.round(beam / 2 + fromCenter);
117
+ }
118
+ if (Object.keys(partB).length > 0) {
119
+ const sentence = encode({ aistype: 24, repeat: 0, own: true, part: 1, mmsi, ...partB });
120
+ if (sentence)
121
+ out.push(sentence);
122
+ }
123
+ return out;
124
+ }
125
+ num(path) {
126
+ const v = this.app.getSelfPath(path);
127
+ return typeof v === "number" && Number.isFinite(v) ? v : undefined;
128
+ }
129
+ }
130
+ // ggencoder leaves nmea as [] and sets valid=false for a message shape it does not implement.
131
+ function encode(msg) {
132
+ const enc = new AisEncode(msg);
133
+ return enc.valid ? enc.nmea : null;
134
+ }
135
+ // Radians → degrees in [0, 360); a magnetic + variation sum can fall outside one turn.
136
+ function deg(rad) {
137
+ return ((((rad * 180) / Math.PI) % 360) + 360) % 360;
138
+ }
139
+ //# sourceMappingURL=ownship.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownship.js","sourceRoot":"","sources":["../src/ownship.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,WAAW,CAAC;AAElC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC,wCAAwC;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AACjC,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC;AAChC,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,8EAA8E;AACpH,8FAA8F;AAC9F,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,MAAM,GAAG,GAAG,CAAC;AAOnB,MAAM,UAAU,WAAW,CAAC,GAAc;IACxC,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,qBAAqB,CAAgD,CAAC;IAChG,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAA0B,CAAC;IACpE,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzF,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,cAAc;IAC5F,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,OAAO,OAAO;IAQC;IACA;IARX,SAAS,GAAG,CAAC,CAAC;IACd,UAAU,GAAG,CAAC,CAAC;IACf,OAAO,CAAU;IACjB,OAAO,CAAU;IACjB,KAAK,GAA0B,IAAI,CAAC;IAE5C,YACmB,GAAc,EACd,IAA6C;QAD7C,QAAG,GAAH,GAAG,CAAW;QACd,SAAI,GAAJ,IAAI,CAAyC;IAC7D,CAAC;IAEJ,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,iGAAiG;IACjG,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACnB,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,iBAAiB;YAAE,OAAO;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAgC,CAAC;QACzE,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,gHAAgH;QAChH,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC1C,IAAI,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC;QAC/B,CAAC;QACD,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,YAAY,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,IAAqB,EAAE,GAAa;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QAC9D,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACnD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC,gDAAgD;YAClH,IAAI,GAAG,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;gBAAE,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC;QAC1E,CAAC;QACD,OAAO,MAAM,CAAC;YACZ,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,IAAI;YACT,IAAI;YACJ,GAAG,EAAE,GAAG,CAAC,QAAQ;YACjB,GAAG,EAAE,GAAG,CAAC,SAAS;YAClB,QAAQ,EAAE,CAAC;YACX,oGAAoG;YACpG,yEAAyE;YACzE,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,EAAE;YAC3E,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;YAC7E,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG;SAC7D,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,IAAqB;QAClC,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3F,IAAI,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC3C,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QAC7C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ;YAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACxE,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;YACpE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B;YAC/F,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;YAC1C,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,qCAAqC;YACrF,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YACxF,IAAI,QAAQ;gBAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,GAAG,CAAC,IAAY;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,CAAC;CACF;AAED,8FAA8F;AAC9F,SAAS,MAAM,CAAC,GAA4B;IAC1C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED,uFAAuF;AACvF,SAAS,GAAG,CAAC,GAAW;IACtB,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACvD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "signalk-aiscast",
3
- "version": "0.1.4",
3
+ "version": "0.3.0",
4
4
  "description": "Show nearby traffic without an AIS receiver and share your AIS data with the world.",
5
5
  "license": "MIT",
6
6
  "author": "Brandon Keepers <brandon@opensoul.org>",