@marineyachtradar/signalk-plugin 1.0.0 → 1.1.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/README.md +30 -0
- package/package.json +5 -5
- package/plugin/config/schema.d.ts +1 -0
- package/plugin/config/schema.d.ts.map +1 -1
- package/plugin/config/schema.js +12 -0
- package/plugin/config/schema.js.map +1 -1
- package/plugin/index.js +161 -8
- package/plugin/index.js.map +1 -1
- package/plugin/signalk-token.d.ts +81 -0
- package/plugin/signalk-token.d.ts.map +1 -0
- package/plugin/signalk-token.js +173 -0
- package/plugin/signalk-token.js.map +1 -0
- package/plugin/types.d.ts +4 -0
- package/plugin/types.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -66,6 +66,36 @@ With **signalk-container** installed, the plugin automatically pulls and manages
|
|
|
66
66
|
|
|
67
67
|
Without arguments, mayara-server auto-discovers all radar brands on all network interfaces.
|
|
68
68
|
|
|
69
|
+
### Signal K Authentication
|
|
70
|
+
|
|
71
|
+
The plugin reaches back into the local Signal K server in two places: it subscribes to navigation deltas over WebSocket (so the radar overlay can render own-ship heading/position), and it does a one-shot REST read of `/signalk/v1/api/vessels/` so the AIS overlay is populated immediately (rather than trickling in vessel-by-vessel over the next 5–60 s). On a Signal K server with security **enabled** — the default for fresh installs — both calls need a bearer token.
|
|
72
|
+
|
|
73
|
+
The plugin uses the standard Signal K device-access-request flow to obtain one. No copy-pasting tokens from the admin UI required:
|
|
74
|
+
|
|
75
|
+
1. **On first start**, the plugin POSTs a `readwrite` access request for `clientId = mayara-server-signalk-plugin`. The request appears in your admin UI under **Security → Access Requests** with description _"MaYaRa Radar (Server) — AIS overlay seeding + radar/target/notification writebacks"_.
|
|
76
|
+
2. Plugin status changes to _"Awaiting Signal K token approval — see Security → Access Requests"_. Approve the request once. (Mayara may also push radar targets, MARPA tracks, and notifications back to Signal K in future releases — hence the `readwrite` scope.)
|
|
77
|
+
3. The plugin caches the issued JWT to a `signalk-token` file in its plugin data directory (mode `0600`) — typically `~/.signalk/plugin-config-data/mayara-server-signalk-plugin/signalk-token` — and recreates the container with `-n ws:127.0.0.1:${PORT}` plus `--signalk-token-file /run/mayara/token`.
|
|
78
|
+
4. Subsequent restarts reuse the cached token — no further admin interaction.
|
|
79
|
+
|
|
80
|
+
Until the request is approved (or if you deny it), the container runs with `-n tcp:127.0.0.1:${TCPSTREAMPORT}` instead. Navigation deltas still flow, only the initial AIS REST snapshot is skipped (the overlay then fills from live deltas as vessels are heard).
|
|
81
|
+
|
|
82
|
+
**Settings:**
|
|
83
|
+
|
|
84
|
+
- **`requestSignalkToken`** (default: `true`) — disables the auto-request flow. Set to `false` if you'd rather mayara stay on the unauthenticated TCP stream, or if you intend to pass a token manually via `mayaraArgs: ["--signalk-token", "<token>"]` (or `--signalk-token-file`).
|
|
85
|
+
|
|
86
|
+
**Requirements:**
|
|
87
|
+
|
|
88
|
+
- mayara-server image with the `--signalk-token-file` flag — present on `:main` and on releases newer than v3.5.1. If your `Image version` is `latest` and the most recent release is still ≤ v3.5.1, switch to `main` (or wait for the next release) to exercise the WS-with-token path. The token request itself works regardless of the mayara version.
|
|
89
|
+
- Signal K's **Security → Settings → Allow New Device Registration** must remain enabled (it's on by default). If you've disabled it, the plugin's POST returns 403, the container stays on the TCP fallback, and plugin status surfaces a hint.
|
|
90
|
+
|
|
91
|
+
**Revoking access:** delete the device entry in **Security → Devices** (or **Security → Access Requests** if still listed there), then delete the plugin's cached token file:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
rm ~/.signalk/plugin-config-data/mayara-server-signalk-plugin/signalk-token
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Restart the plugin and it'll request a fresh token.
|
|
98
|
+
|
|
69
99
|
### Resource Limits
|
|
70
100
|
|
|
71
101
|
The plugin sets sensible default resource caps so a runaway container can't take down Signal K:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marineyachtradar/signalk-plugin",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "MaYaRa Radar - Connect SignalK to mayara-server",
|
|
5
5
|
"main": "plugin/index.js",
|
|
6
6
|
"signalk-plugin-enabled-by-default": true,
|
|
@@ -61,21 +61,21 @@
|
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@babel/core": "^7.29.0",
|
|
63
63
|
"@babel/preset-react": "^7.28.5",
|
|
64
|
-
"@eslint/js": "^
|
|
64
|
+
"@eslint/js": "^10.0.1",
|
|
65
65
|
"@signalk/server-api": "^2.24.0",
|
|
66
66
|
"@types/express": "^5.0.0",
|
|
67
67
|
"@types/node": "^22.0.0",
|
|
68
68
|
"@types/ws": "^8.5.0",
|
|
69
|
-
"eslint": "^
|
|
69
|
+
"eslint": "^10.3.0",
|
|
70
70
|
"eslint-config-prettier": "^10.0.0",
|
|
71
71
|
"eslint-plugin-prettier": "^5.0.0",
|
|
72
72
|
"prettier": "^3.0.0",
|
|
73
|
-
"typescript": "^
|
|
73
|
+
"typescript": "^6.0.3",
|
|
74
74
|
"typescript-eslint": "^8.0.0",
|
|
75
75
|
"babel-loader": "^10.1.1",
|
|
76
76
|
"react": "^19.2.4",
|
|
77
77
|
"react-dom": "^19.2.4",
|
|
78
|
-
"vitest": "^
|
|
78
|
+
"vitest": "^4.1.5",
|
|
79
79
|
"webpack": "^5.105.4",
|
|
80
80
|
"webpack-cli": "^7.0.2"
|
|
81
81
|
},
|
|
@@ -3,6 +3,7 @@ export declare const ConfigSchema: import("@sinclair/typebox").TObject<{
|
|
|
3
3
|
managedContainer: import("@sinclair/typebox").TBoolean;
|
|
4
4
|
mayaraVersion: import("@sinclair/typebox").TString;
|
|
5
5
|
mayaraArgs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
|
|
6
|
+
requestSignalkToken: import("@sinclair/typebox").TBoolean;
|
|
6
7
|
host: import("@sinclair/typebox").TString;
|
|
7
8
|
port: import("@sinclair/typebox").TNumber;
|
|
8
9
|
secure: import("@sinclair/typebox").TBoolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAEhD,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAEhD,eAAO,MAAM,YAAY;;;;;;;;;;EAwDvB,CAAA;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,CAAA;AAShD,eAAO,MAAM,eAAe,EAAE,MAU7B,CAAA"}
|
package/plugin/config/schema.js
CHANGED
|
@@ -17,6 +17,17 @@ exports.ConfigSchema = typebox_1.Type.Object({
|
|
|
17
17
|
title: 'mayara-server arguments',
|
|
18
18
|
description: 'e.g. ["--brand", "furuno", "--interface", "eth0"]'
|
|
19
19
|
}),
|
|
20
|
+
requestSignalkToken: typebox_1.Type.Boolean({
|
|
21
|
+
default: true,
|
|
22
|
+
title: 'Auto-request a Signal K device token for the radar overlay',
|
|
23
|
+
description: 'When Signal K security is enabled, the plugin requests a read/write ' +
|
|
24
|
+
'token from this server (visible as a pending request in Security → ' +
|
|
25
|
+
'Access Requests). Approve it once and mayara will use the WebSocket ' +
|
|
26
|
+
'transport and full AIS overlay seeding. Read/write scope leaves room ' +
|
|
27
|
+
'for future radar/target/notification writebacks from mayara to Signal ' +
|
|
28
|
+
'K. Disable to keep mayara on the unauthenticated TCP delta stream ' +
|
|
29
|
+
'(AIS overlay then fills only from live deltas).'
|
|
30
|
+
}),
|
|
20
31
|
host: typebox_1.Type.String({
|
|
21
32
|
default: 'localhost',
|
|
22
33
|
title: 'mayara-server host',
|
|
@@ -56,6 +67,7 @@ exports.SCHEMA_DEFAULTS = {
|
|
|
56
67
|
managedContainer: true,
|
|
57
68
|
mayaraVersion: 'latest',
|
|
58
69
|
mayaraArgs: [],
|
|
70
|
+
requestSignalkToken: true,
|
|
59
71
|
host: 'localhost',
|
|
60
72
|
port: 6502,
|
|
61
73
|
secure: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEnC,QAAA,YAAY,GAAG,cAAI,CAAC,MAAM,CAAC;IACtC,gBAAgB,EAAE,cAAI,CAAC,OAAO,CAAC;QAC7B,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,4CAA4C;QACnD,WAAW,EAAE,0DAA0D;KACxE,CAAC;IACF,aAAa,EAAE,cAAI,CAAC,MAAM,CAAC;QACzB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,yBAAyB;KACjC,CAAC;IACF,UAAU,EAAE,cAAI,CAAC,KAAK,CAAC,cAAI,CAAC,MAAM,EAAE,EAAE;QACpC,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,mDAAmD;KACjE,CAAC;IAEF,IAAI,EAAE,cAAI,CAAC,MAAM,CAAC;QAChB,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,gEAAgE;KAC9E,CAAC;IACF,IAAI,EAAE,cAAI,CAAC,MAAM,CAAC;QAChB,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,oBAAoB;QAC3B,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,KAAK;KACf,CAAC;IACF,MAAM,EAAE,cAAI,CAAC,OAAO,CAAC;QACnB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,eAAe;KACvB,CAAC;IAEF,qBAAqB,EAAE,cAAI,CAAC,MAAM,CAAC;QACjC,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,mCAAmC;QAC1C,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,iBAAiB,EAAE,cAAI,CAAC,MAAM,CAAC;QAC7B,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,8BAA8B;QACrC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;KACZ,CAAC;CACH,CAAC,CAAA;AAIF,+DAA+D;AAC/D,kEAAkE;AAClE,qEAAqE;AACrE,gEAAgE;AAChE,kEAAkE;AAClE,oEAAoE;AACpE,gCAAgC;AACnB,QAAA,eAAe,GAAW;IACrC,gBAAgB,EAAE,IAAI;IACtB,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,EAAE;IACd,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,KAAK;IACb,qBAAqB,EAAE,EAAE;IACzB,iBAAiB,EAAE,CAAC;CACrB,CAAA"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEnC,QAAA,YAAY,GAAG,cAAI,CAAC,MAAM,CAAC;IACtC,gBAAgB,EAAE,cAAI,CAAC,OAAO,CAAC;QAC7B,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,4CAA4C;QACnD,WAAW,EAAE,0DAA0D;KACxE,CAAC;IACF,aAAa,EAAE,cAAI,CAAC,MAAM,CAAC;QACzB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,yBAAyB;KACjC,CAAC;IACF,UAAU,EAAE,cAAI,CAAC,KAAK,CAAC,cAAI,CAAC,MAAM,EAAE,EAAE;QACpC,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,mDAAmD;KACjE,CAAC;IACF,mBAAmB,EAAE,cAAI,CAAC,OAAO,CAAC;QAChC,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,4DAA4D;QACnE,WAAW,EACT,sEAAsE;YACtE,qEAAqE;YACrE,sEAAsE;YACtE,uEAAuE;YACvE,wEAAwE;YACxE,oEAAoE;YACpE,iDAAiD;KACpD,CAAC;IAEF,IAAI,EAAE,cAAI,CAAC,MAAM,CAAC;QAChB,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,gEAAgE;KAC9E,CAAC;IACF,IAAI,EAAE,cAAI,CAAC,MAAM,CAAC;QAChB,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,oBAAoB;QAC3B,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,KAAK;KACf,CAAC;IACF,MAAM,EAAE,cAAI,CAAC,OAAO,CAAC;QACnB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,eAAe;KACvB,CAAC;IAEF,qBAAqB,EAAE,cAAI,CAAC,MAAM,CAAC;QACjC,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,mCAAmC;QAC1C,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,iBAAiB,EAAE,cAAI,CAAC,MAAM,CAAC;QAC7B,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,8BAA8B;QACrC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;KACZ,CAAC;CACH,CAAC,CAAA;AAIF,+DAA+D;AAC/D,kEAAkE;AAClE,qEAAqE;AACrE,gEAAgE;AAChE,kEAAkE;AAClE,oEAAoE;AACpE,gCAAgC;AACnB,QAAA,eAAe,GAAW;IACrC,gBAAgB,EAAE,IAAI;IACtB,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,EAAE;IACd,mBAAmB,EAAE,IAAI;IACzB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,KAAK;IACb,qBAAqB,EAAE,EAAE;IACzB,iBAAiB,EAAE,CAAC;CACrB,CAAA"}
|
package/plugin/index.js
CHANGED
|
@@ -4,10 +4,12 @@ const mayara_client_1 = require("./mayara-client");
|
|
|
4
4
|
const radar_provider_1 = require("./radar-provider");
|
|
5
5
|
const spoke_forwarder_1 = require("./spoke-forwarder");
|
|
6
6
|
const schema_1 = require("./config/schema");
|
|
7
|
+
const signalk_token_1 = require("./signalk-token");
|
|
7
8
|
const MAYARA_IMAGE = 'ghcr.io/marineyachtradar/mayara-server';
|
|
8
9
|
const CONTAINER_NAME = 'mayara-server';
|
|
9
10
|
const PLUGIN_ID = 'mayara-server-signalk-plugin';
|
|
10
11
|
const SAFE_TAG = /^[a-zA-Z0-9._-]+$/;
|
|
12
|
+
const TOKEN_PATH_IN_CONTAINER = '/run/mayara/token';
|
|
11
13
|
/**
|
|
12
14
|
* Sensible default resource limits for the mayara-server container.
|
|
13
15
|
* Tested on a Pi 5 8GB with a Garmin xHD2 radar at 24 NM range.
|
|
@@ -38,6 +40,8 @@ module.exports = function (app) {
|
|
|
38
40
|
let currentSettings = null;
|
|
39
41
|
const spokeForwarders = new Map();
|
|
40
42
|
let discoveryInterval = null;
|
|
43
|
+
// Set true on stop() so the in-flight token poller exits its loop.
|
|
44
|
+
let tokenPollerCancelled = false;
|
|
41
45
|
let reconnectInterval = null;
|
|
42
46
|
let isConnected = false;
|
|
43
47
|
const knownRadars = new Set();
|
|
@@ -54,12 +58,19 @@ module.exports = function (app) {
|
|
|
54
58
|
// every field being present.
|
|
55
59
|
const merged = { ...schema_1.SCHEMA_DEFAULTS, ...config };
|
|
56
60
|
currentSettings = merged;
|
|
61
|
+
// Reset the poller cancel flag so a stop/start cycle (config
|
|
62
|
+
// change, plugin disable/enable) lets the next start make a
|
|
63
|
+
// fresh token request.
|
|
64
|
+
tokenPollerCancelled = false;
|
|
57
65
|
void asyncStart(merged).catch((err) => {
|
|
58
66
|
app.setPluginError(`Startup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
59
67
|
});
|
|
60
68
|
},
|
|
61
69
|
async stop() {
|
|
62
70
|
app.debug('Stopping mayara-server-signalk-plugin');
|
|
71
|
+
// Tell any in-flight token poller to exit on its next tick so
|
|
72
|
+
// it doesn't keep the process alive after stop() returns.
|
|
73
|
+
tokenPollerCancelled = true;
|
|
63
74
|
try {
|
|
64
75
|
app.radarApi.unRegister(PLUGIN_ID);
|
|
65
76
|
}
|
|
@@ -269,24 +280,156 @@ module.exports = function (app) {
|
|
|
269
280
|
// ==========================================================================
|
|
270
281
|
/**
|
|
271
282
|
* Build a ContainerConfig for the mayara-server container with the
|
|
272
|
-
* given tag. Used
|
|
273
|
-
*
|
|
283
|
+
* given tag. Used at startup, when applying updates, and after a
|
|
284
|
+
* background token mint completes — signalk-container drift-detects
|
|
285
|
+
* the resulting `command`/`volumes` changes and recreates the
|
|
286
|
+
* container transparently.
|
|
287
|
+
*
|
|
288
|
+
* Default nav-address is the upstream Signal K server itself:
|
|
289
|
+
* - `ws:127.0.0.1:${SK_PORT}` plus `--signalk-token-file` when a
|
|
290
|
+
* cached device token exists (full WS path → AIS REST seeding
|
|
291
|
+
* works inside the container).
|
|
292
|
+
* - `tcp:127.0.0.1:${TCPSTREAMPORT}` otherwise (legacy delta
|
|
293
|
+
* stream; AIS overlay still works but only fills from live
|
|
294
|
+
* deltas, not the initial REST snapshot).
|
|
295
|
+
*
|
|
296
|
+
* Either way, `mayaraArgs` may override `-n` entirely, in which case
|
|
297
|
+
* we don't inject our default or `--signalk-token-file`.
|
|
274
298
|
*/
|
|
275
299
|
function buildContainerConfig(tag) {
|
|
276
300
|
const userArgs = currentSettings?.mayaraArgs ?? [];
|
|
301
|
+
const userOverridesNav = userArgs.some((a) => a === '-n' || a === '--navigation-address');
|
|
302
|
+
const skPort = Number(process.env.PORT) || 3000;
|
|
277
303
|
const tcpPort = Number(process.env.TCPSTREAMPORT) || 8375;
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
const
|
|
282
|
-
|
|
304
|
+
const dataDir = app.getDataDirPath();
|
|
305
|
+
const haveToken = (0, signalk_token_1.hasCachedToken)(dataDir);
|
|
306
|
+
const tokenFile = (0, signalk_token_1.tokenFilePath)(dataDir);
|
|
307
|
+
const injected = [];
|
|
308
|
+
const volumes = {};
|
|
309
|
+
if (!userOverridesNav) {
|
|
310
|
+
if (haveToken) {
|
|
311
|
+
injected.push('-n', `ws:127.0.0.1:${skPort}`, '--signalk-token-file', TOKEN_PATH_IN_CONTAINER);
|
|
312
|
+
// signalk-container volume shape: key = container path, value =
|
|
313
|
+
// host path. Mount the file (not a directory) so mayara only
|
|
314
|
+
// sees its token, not the whole data dir.
|
|
315
|
+
volumes[TOKEN_PATH_IN_CONTAINER] = tokenFile;
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
injected.push('-n', `tcp:127.0.0.1:${tcpPort}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
const command = ['mayara-server', ...injected, ...userArgs];
|
|
322
|
+
const config = {
|
|
283
323
|
image: MAYARA_IMAGE,
|
|
284
324
|
tag,
|
|
285
325
|
networkMode: 'host',
|
|
286
326
|
command,
|
|
287
327
|
restart: 'unless-stopped',
|
|
288
|
-
resources: DEFAULT_RESOURCES
|
|
328
|
+
resources: DEFAULT_RESOURCES,
|
|
329
|
+
// The mayara image declares `USER mayara` with UID/GID 1000. Tell
|
|
330
|
+
// signalk-container so its UID-mapping logic emits the right flag
|
|
331
|
+
// (`--userns=keep-id:uid=1000,gid=1000` on rootless podman,
|
|
332
|
+
// `--user 1000:1000` on docker / rootful podman). Without this
|
|
333
|
+
// hint signalk-container assumes inImageUid=0, the in-image
|
|
334
|
+
// mayara user runs under the subuid range, and the bind-mounted
|
|
335
|
+
// signalk-token file (mode 0600 owned by the host SK user) is
|
|
336
|
+
// unreadable from inside the container.
|
|
337
|
+
user: { inImageUid: 1000, inImageGid: 1000 }
|
|
289
338
|
};
|
|
339
|
+
if (Object.keys(volumes).length > 0) {
|
|
340
|
+
config.volumes = volumes;
|
|
341
|
+
}
|
|
342
|
+
return config;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Drive the Signal K device-access-request flow to obtain a token,
|
|
346
|
+
* then recreate the mayara container with the WS-based config so the
|
|
347
|
+
* AIS REST seeder can populate the in-radar overlay from the
|
|
348
|
+
* upstream `vessels/` snapshot.
|
|
349
|
+
*
|
|
350
|
+
* Fast path: a cached token already exists — log it and we're done
|
|
351
|
+
* (the container was already started with the correct config by
|
|
352
|
+
* `buildContainerConfig`).
|
|
353
|
+
*
|
|
354
|
+
* Slow path: POST a request, surface "Awaiting approval" plugin
|
|
355
|
+
* status, poll until admin approves (or denies, or stop() is
|
|
356
|
+
* called). On approval, write the token and re-call ensureRunning
|
|
357
|
+
* so signalk-container drift-detects the new `command`/`volumes`
|
|
358
|
+
* and recreates the container.
|
|
359
|
+
*/
|
|
360
|
+
async function ensureSignalkToken(containers, tag) {
|
|
361
|
+
const dataDir = app.getDataDirPath();
|
|
362
|
+
if ((0, signalk_token_1.readCachedToken)(dataDir)) {
|
|
363
|
+
app.debug('Signal K token cached; container started with WS transport');
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
const skPort = Number(process.env.PORT) || 3000;
|
|
367
|
+
// Request `readwrite` so mayara can later push deltas back into SK
|
|
368
|
+
// (radar targets, MARPA tracks, heading echoes, guard-zone
|
|
369
|
+
// notifications). Today the token only reads the AIS REST snapshot,
|
|
370
|
+
// but Signal K admin UI doesn't let the operator widen permissions
|
|
371
|
+
// post-approval — we'd have to revoke and re-request. Asking for
|
|
372
|
+
// the broader scope up front avoids that migration step when the
|
|
373
|
+
// writeback features land in mayara-server.
|
|
374
|
+
const begin = await (0, signalk_token_1.beginTokenRequest)({
|
|
375
|
+
dataDir,
|
|
376
|
+
signalkPort: skPort,
|
|
377
|
+
clientId: PLUGIN_ID,
|
|
378
|
+
description: 'MaYaRa Radar (Server) — AIS overlay seeding + radar/target/notification writebacks',
|
|
379
|
+
permissions: 'readwrite'
|
|
380
|
+
});
|
|
381
|
+
switch (begin.kind) {
|
|
382
|
+
case 'cached':
|
|
383
|
+
// Race: token landed between the readCachedToken above and the
|
|
384
|
+
// POST. Recreate to pick up WS transport.
|
|
385
|
+
await containers.ensureRunning(CONTAINER_NAME, buildContainerConfig(tag));
|
|
386
|
+
return;
|
|
387
|
+
case 'no-security':
|
|
388
|
+
app.debug('Signal K security disabled; no token needed');
|
|
389
|
+
// SK serves no-security WS without auth, so switch from tcp:
|
|
390
|
+
// to ws: by recreating with the same buildContainerConfig
|
|
391
|
+
// (which always emits ws: when haveToken is true, but here
|
|
392
|
+
// haveToken is false — fall back to tcp:, which still works).
|
|
393
|
+
return;
|
|
394
|
+
case 'requests-disabled':
|
|
395
|
+
app.setPluginStatus('Signal K device access requests are disabled. To enable the AIS ' +
|
|
396
|
+
"overlay's initial REST snapshot, enable device access requests in " +
|
|
397
|
+
'Security settings, or add `--signalk-token <token>` to mayaraArgs.');
|
|
398
|
+
return;
|
|
399
|
+
case 'error':
|
|
400
|
+
app.debug(`Signal K token request error: ${begin.message}`);
|
|
401
|
+
return;
|
|
402
|
+
case 'pending':
|
|
403
|
+
// Fall through to the polling block below.
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
app.setPluginStatus('Awaiting Signal K token approval — see Security → Access Requests');
|
|
407
|
+
app.debug(`Awaiting approval at ${begin.href} (request ${begin.requestId}). ` +
|
|
408
|
+
`Set plugin config "requestSignalkToken" to false to suppress this.`);
|
|
409
|
+
const token = await (0, signalk_token_1.awaitApproval)(begin.href, skPort, () => tokenPollerCancelled, (msg) => {
|
|
410
|
+
app.debug(msg);
|
|
411
|
+
});
|
|
412
|
+
if (!token) {
|
|
413
|
+
// Denied, expired, or plugin stopped. Either way, leave the
|
|
414
|
+
// container on its existing transport; user can request again
|
|
415
|
+
// by restarting the plugin.
|
|
416
|
+
if (!tokenPollerCancelled) {
|
|
417
|
+
app.setPluginStatus('Signal K token request was denied or expired. AIS overlay will ' +
|
|
418
|
+
'fill from live deltas only. Restart the plugin to request again.');
|
|
419
|
+
}
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
(0, signalk_token_1.writeCachedToken)(dataDir, token);
|
|
423
|
+
app.debug('Signal K token approved and cached; recreating container with WS transport');
|
|
424
|
+
app.setPluginStatus('Signal K token approved — recreating container...');
|
|
425
|
+
try {
|
|
426
|
+
await containers.ensureRunning(CONTAINER_NAME, buildContainerConfig(tag));
|
|
427
|
+
app.setPluginStatus('Running');
|
|
428
|
+
}
|
|
429
|
+
catch (err) {
|
|
430
|
+
app.setPluginError(`Token approved but container recreate failed: ${errMsg(err)}. ` +
|
|
431
|
+
`Restart the plugin to retry.`);
|
|
432
|
+
}
|
|
290
433
|
}
|
|
291
434
|
/**
|
|
292
435
|
* Wait up to `timeoutMs` for signalk-container to be both loaded
|
|
@@ -334,6 +477,16 @@ module.exports = function (app) {
|
|
|
334
477
|
// and ports. Resources follow the live-update path. No local hash
|
|
335
478
|
// tracking needed.
|
|
336
479
|
await containers.ensureRunning(CONTAINER_NAME, config);
|
|
480
|
+
// Kick off Signal K device-token acquisition in the background. The
|
|
481
|
+
// container is already running with whatever transport the cached
|
|
482
|
+
// token (or lack thereof) selected; if we mint a new token here we
|
|
483
|
+
// recreate it later to switch transports. Failure paths only flip
|
|
484
|
+
// plugin status — they don't block startup.
|
|
485
|
+
if (settings.requestSignalkToken !== false) {
|
|
486
|
+
void ensureSignalkToken(containers, tag).catch((err) => {
|
|
487
|
+
app.debug(`Signal K token acquisition failed: ${errMsg(err)}`);
|
|
488
|
+
});
|
|
489
|
+
}
|
|
337
490
|
// Register with the centralized update service. The service auto-
|
|
338
491
|
// detects whether `tag` is a semver pin (compare via GitHub releases)
|
|
339
492
|
// or a floating tag like `latest`/`main` (digest drift detection).
|
package/plugin/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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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export type EnsureResult = {
|
|
2
|
+
kind: 'cached';
|
|
3
|
+
token: string;
|
|
4
|
+
} | {
|
|
5
|
+
kind: 'no-security';
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'requests-disabled';
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'pending';
|
|
10
|
+
requestId: string;
|
|
11
|
+
href: string;
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'error';
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
export interface EnsureOptions {
|
|
17
|
+
dataDir: string;
|
|
18
|
+
signalkPort: number;
|
|
19
|
+
clientId: string;
|
|
20
|
+
description: string;
|
|
21
|
+
permissions?: 'readonly' | 'readwrite' | 'admin';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Read a cached token from `${dataDir}/signalk-token` if present and
|
|
25
|
+
* non-empty (after trim). Returns `undefined` otherwise. This is the
|
|
26
|
+
* fast path — the token, once admin-approved, is stable across restarts.
|
|
27
|
+
*/
|
|
28
|
+
export declare function readCachedToken(dataDir: string): string | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* The absolute host-side path of the cached token file under `dataDir`.
|
|
31
|
+
* Returned regardless of whether the file currently exists — callers
|
|
32
|
+
* who only want to mount it should pair this with `hasCachedToken`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function tokenFilePath(dataDir: string): string;
|
|
35
|
+
/** True iff the cached token file exists on disk. Cheaper than reading. */
|
|
36
|
+
export declare function hasCachedToken(dataDir: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Persist `token` to `${dataDir}/signalk-token` with mode 0600. The
|
|
39
|
+
* single file ensures the on-disk format stays simple (no JSON parsing
|
|
40
|
+
* to corrupt) and the mode keeps the secret readable only to the
|
|
41
|
+
* Signal K server process owner.
|
|
42
|
+
*/
|
|
43
|
+
export declare function writeCachedToken(dataDir: string, token: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Begin a Signal K device access request and resolve when it transitions
|
|
46
|
+
* out of PENDING. Returns one of:
|
|
47
|
+
* - `{ kind: 'cached', token }` when the cache was hit before this call
|
|
48
|
+
* was made (callers should usually check `readCachedToken` first; this
|
|
49
|
+
* is a safety net).
|
|
50
|
+
* - `{ kind: 'no-security' }` when SK has security disabled — no token
|
|
51
|
+
* is needed; callers should connect anonymously.
|
|
52
|
+
* - `{ kind: 'requests-disabled' }` when SK is secured but the admin has
|
|
53
|
+
* turned off device access requests; surface this so the user can
|
|
54
|
+
* either enable it or paste a token by hand.
|
|
55
|
+
* - `{ kind: 'pending', requestId, href, cancel }` once SK has accepted
|
|
56
|
+
* the request and is waiting for admin approval. The caller can:
|
|
57
|
+
* - await `awaitApproval(href, log)` to block until decision
|
|
58
|
+
* - call `cancel()` to stop the in-flight poller on plugin stop()
|
|
59
|
+
* - `{ kind: 'error', message }` on any other failure path.
|
|
60
|
+
*
|
|
61
|
+
* Polling is server-side via `GET /signalk/v1/requests/:id`; we don't try
|
|
62
|
+
* to subscribe to SK's notification path because the access-request flow
|
|
63
|
+
* is intentionally HTTP-driven.
|
|
64
|
+
*/
|
|
65
|
+
export declare function beginTokenRequest(opts: EnsureOptions): Promise<EnsureResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Poll `${href}` until it transitions out of PENDING, then return the
|
|
68
|
+
* issued token. Stops if `isCancelled()` returns true between polls (so
|
|
69
|
+
* plugin.stop() can break the loop). Returns `undefined` if the request
|
|
70
|
+
* is denied or expires server-side.
|
|
71
|
+
*
|
|
72
|
+
* The href returned by SK is a relative path like
|
|
73
|
+
* `/signalk/v1/requests/<uuid>`; we resolve it against
|
|
74
|
+
* `http://127.0.0.1:${signalkPort}`.
|
|
75
|
+
*
|
|
76
|
+
* `pollIntervalMs` defaults to 5s in production (an admin clicking
|
|
77
|
+
* approve is a slow human action; we don't need to poll faster than
|
|
78
|
+
* that). Tests override it to single-digit milliseconds.
|
|
79
|
+
*/
|
|
80
|
+
export declare function awaitApproval(href: string, signalkPort: number, isCancelled: () => boolean, log: (msg: string) => void, pollIntervalMs?: number): Promise<string | undefined>;
|
|
81
|
+
//# sourceMappingURL=signalk-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signalk-token.d.ts","sourceRoot":"","sources":["../src/signalk-token.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAA;CACjD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKnE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGrE;AAWD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAsDlF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,EAC1B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAC1B,cAAc,GAAE,MAAyB,GACxC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsC7B"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readCachedToken = readCachedToken;
|
|
4
|
+
exports.tokenFilePath = tokenFilePath;
|
|
5
|
+
exports.hasCachedToken = hasCachedToken;
|
|
6
|
+
exports.writeCachedToken = writeCachedToken;
|
|
7
|
+
exports.beginTokenRequest = beginTokenRequest;
|
|
8
|
+
exports.awaitApproval = awaitApproval;
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const TOKEN_FILENAME = 'signalk-token';
|
|
12
|
+
const POLL_INTERVAL_MS = 5_000;
|
|
13
|
+
/**
|
|
14
|
+
* Read a cached token from `${dataDir}/signalk-token` if present and
|
|
15
|
+
* non-empty (after trim). Returns `undefined` otherwise. This is the
|
|
16
|
+
* fast path — the token, once admin-approved, is stable across restarts.
|
|
17
|
+
*/
|
|
18
|
+
function readCachedToken(dataDir) {
|
|
19
|
+
const path = (0, path_1.join)(dataDir, TOKEN_FILENAME);
|
|
20
|
+
if (!(0, fs_1.existsSync)(path))
|
|
21
|
+
return undefined;
|
|
22
|
+
const raw = (0, fs_1.readFileSync)(path, 'utf8').trim();
|
|
23
|
+
return raw.length > 0 ? raw : undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The absolute host-side path of the cached token file under `dataDir`.
|
|
27
|
+
* Returned regardless of whether the file currently exists — callers
|
|
28
|
+
* who only want to mount it should pair this with `hasCachedToken`.
|
|
29
|
+
*/
|
|
30
|
+
function tokenFilePath(dataDir) {
|
|
31
|
+
return (0, path_1.join)(dataDir, TOKEN_FILENAME);
|
|
32
|
+
}
|
|
33
|
+
/** True iff the cached token file exists on disk. Cheaper than reading. */
|
|
34
|
+
function hasCachedToken(dataDir) {
|
|
35
|
+
return (0, fs_1.existsSync)((0, path_1.join)(dataDir, TOKEN_FILENAME));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Persist `token` to `${dataDir}/signalk-token` with mode 0600. The
|
|
39
|
+
* single file ensures the on-disk format stays simple (no JSON parsing
|
|
40
|
+
* to corrupt) and the mode keeps the secret readable only to the
|
|
41
|
+
* Signal K server process owner.
|
|
42
|
+
*/
|
|
43
|
+
function writeCachedToken(dataDir, token) {
|
|
44
|
+
const path = (0, path_1.join)(dataDir, TOKEN_FILENAME);
|
|
45
|
+
(0, fs_1.writeFileSync)(path, token, { mode: 0o600 });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Begin a Signal K device access request and resolve when it transitions
|
|
49
|
+
* out of PENDING. Returns one of:
|
|
50
|
+
* - `{ kind: 'cached', token }` when the cache was hit before this call
|
|
51
|
+
* was made (callers should usually check `readCachedToken` first; this
|
|
52
|
+
* is a safety net).
|
|
53
|
+
* - `{ kind: 'no-security' }` when SK has security disabled — no token
|
|
54
|
+
* is needed; callers should connect anonymously.
|
|
55
|
+
* - `{ kind: 'requests-disabled' }` when SK is secured but the admin has
|
|
56
|
+
* turned off device access requests; surface this so the user can
|
|
57
|
+
* either enable it or paste a token by hand.
|
|
58
|
+
* - `{ kind: 'pending', requestId, href, cancel }` once SK has accepted
|
|
59
|
+
* the request and is waiting for admin approval. The caller can:
|
|
60
|
+
* - await `awaitApproval(href, log)` to block until decision
|
|
61
|
+
* - call `cancel()` to stop the in-flight poller on plugin stop()
|
|
62
|
+
* - `{ kind: 'error', message }` on any other failure path.
|
|
63
|
+
*
|
|
64
|
+
* Polling is server-side via `GET /signalk/v1/requests/:id`; we don't try
|
|
65
|
+
* to subscribe to SK's notification path because the access-request flow
|
|
66
|
+
* is intentionally HTTP-driven.
|
|
67
|
+
*/
|
|
68
|
+
async function beginTokenRequest(opts) {
|
|
69
|
+
const cached = readCachedToken(opts.dataDir);
|
|
70
|
+
if (cached)
|
|
71
|
+
return { kind: 'cached', token: cached };
|
|
72
|
+
const url = `http://127.0.0.1:${opts.signalkPort}/signalk/v1/access/requests`;
|
|
73
|
+
let res;
|
|
74
|
+
try {
|
|
75
|
+
res = await fetch(url, {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
headers: { 'Content-Type': 'application/json' },
|
|
78
|
+
body: JSON.stringify({
|
|
79
|
+
clientId: opts.clientId,
|
|
80
|
+
description: opts.description,
|
|
81
|
+
permissions: opts.permissions ?? 'readonly'
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
87
|
+
return { kind: 'error', message: `POST ${url} failed: ${msg}` };
|
|
88
|
+
}
|
|
89
|
+
if (res.status === 404) {
|
|
90
|
+
// SK serves 404 here only when the dummy (no-security) strategy is
|
|
91
|
+
// active. Tokens are neither minted nor needed.
|
|
92
|
+
return { kind: 'no-security' };
|
|
93
|
+
}
|
|
94
|
+
if (res.status === 403) {
|
|
95
|
+
return { kind: 'requests-disabled' };
|
|
96
|
+
}
|
|
97
|
+
if (res.status !== 202 && res.status !== 200) {
|
|
98
|
+
return { kind: 'error', message: `Unexpected HTTP ${res.status} from access-request endpoint` };
|
|
99
|
+
}
|
|
100
|
+
const reply = (await res.json());
|
|
101
|
+
if (reply.state === 'COMPLETED') {
|
|
102
|
+
// Unusual but possible — approval already on file. Cache + return.
|
|
103
|
+
const token = reply.accessRequest?.token;
|
|
104
|
+
if (token) {
|
|
105
|
+
writeCachedToken(opts.dataDir, token);
|
|
106
|
+
return { kind: 'cached', token };
|
|
107
|
+
}
|
|
108
|
+
return { kind: 'error', message: 'Access request completed without a token' };
|
|
109
|
+
}
|
|
110
|
+
if (!reply.href) {
|
|
111
|
+
return { kind: 'error', message: 'Access request response missing href' };
|
|
112
|
+
}
|
|
113
|
+
// The polling loop lives in `awaitApproval` so the caller can race it
|
|
114
|
+
// against its own shutdown signal (typically the plugin's stop()).
|
|
115
|
+
return {
|
|
116
|
+
kind: 'pending',
|
|
117
|
+
requestId: reply.requestId,
|
|
118
|
+
href: reply.href
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Poll `${href}` until it transitions out of PENDING, then return the
|
|
123
|
+
* issued token. Stops if `isCancelled()` returns true between polls (so
|
|
124
|
+
* plugin.stop() can break the loop). Returns `undefined` if the request
|
|
125
|
+
* is denied or expires server-side.
|
|
126
|
+
*
|
|
127
|
+
* The href returned by SK is a relative path like
|
|
128
|
+
* `/signalk/v1/requests/<uuid>`; we resolve it against
|
|
129
|
+
* `http://127.0.0.1:${signalkPort}`.
|
|
130
|
+
*
|
|
131
|
+
* `pollIntervalMs` defaults to 5s in production (an admin clicking
|
|
132
|
+
* approve is a slow human action; we don't need to poll faster than
|
|
133
|
+
* that). Tests override it to single-digit milliseconds.
|
|
134
|
+
*/
|
|
135
|
+
async function awaitApproval(href, signalkPort, isCancelled, log, pollIntervalMs = POLL_INTERVAL_MS) {
|
|
136
|
+
const url = href.startsWith('http')
|
|
137
|
+
? href
|
|
138
|
+
: `http://127.0.0.1:${signalkPort}${href.startsWith('/') ? '' : '/'}${href}`;
|
|
139
|
+
while (!isCancelled()) {
|
|
140
|
+
await sleep(pollIntervalMs);
|
|
141
|
+
if (isCancelled())
|
|
142
|
+
return undefined;
|
|
143
|
+
let res;
|
|
144
|
+
try {
|
|
145
|
+
res = await fetch(url, { method: 'GET' });
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
log(`Token poll fetch failed (will retry): ${err instanceof Error ? err.message : String(err)}`);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (!res.ok) {
|
|
152
|
+
log(`Token poll: HTTP ${res.status} (will retry)`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const reply = (await res.json());
|
|
156
|
+
if (reply.state === 'PENDING') {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// COMPLETED. Either an approved request (has token) or a denied one.
|
|
160
|
+
const token = reply.accessRequest?.token;
|
|
161
|
+
if (token)
|
|
162
|
+
return token;
|
|
163
|
+
const perm = reply.accessRequest?.permission;
|
|
164
|
+
log(`Access request completed without a token (permission=${perm ?? 'unknown'}). ` +
|
|
165
|
+
`Admin probably denied the request.`);
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
function sleep(ms) {
|
|
171
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=signalk-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signalk-token.js","sourceRoot":"","sources":["../src/signalk-token.ts"],"names":[],"mappings":"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"}
|
package/plugin/types.d.ts
CHANGED
package/plugin/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/C;AAED,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;CAC1C;AAoBD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAA;AAE7E,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,OAAO,CAAC,EAAE,IAAI,GAAG,gBAAgB,GAAG,QAAQ,CAAA;IAC5C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|