@hydra-acp/browser 0.1.26 → 0.1.27
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 +49 -33
- package/dist/hydra/client.js +24 -1
- package/dist/hydra/client.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/server/push-store.js +101 -0
- package/dist/server/push-store.js.map +1 -0
- package/dist/server/routes-push.js +33 -0
- package/dist/server/routes-push.js.map +1 -0
- package/dist/server/routes-root.js +22 -9
- package/dist/server/routes-root.js.map +1 -1
- package/dist/server/routes-sessions.js +13 -0
- package/dist/server/routes-sessions.js.map +1 -1
- package/dist/server/session-visibility.js +34 -0
- package/dist/server/session-visibility.js.map +1 -0
- package/dist/server/turn-notify-callback.js +152 -0
- package/dist/server/turn-notify-callback.js.map +1 -0
- package/dist/server/ws-bridge.js +112 -1
- package/dist/server/ws-bridge.js.map +1 -1
- package/dist/setup/conf-writer.js +86 -0
- package/dist/setup/conf-writer.js.map +1 -0
- package/dist/setup/tailscale-wizard.js +229 -0
- package/dist/setup/tailscale-wizard.js.map +1 -0
- package/dist/ui/index.html +119 -30
- package/dist/ui/sw.js +38 -11
- package/dist/util/paths.js +3 -0
- package/dist/util/paths.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -8,19 +8,19 @@ create fresh sessions, kill old ones, and browse the project files of any
|
|
|
8
8
|
session — all from a phone or laptop browser.
|
|
9
9
|
|
|
10
10
|
The hydra master token never leaves the machine; the browser authenticates
|
|
11
|
-
with a
|
|
11
|
+
you with a password (set via `hydra-acp auth password`) and issues its own
|
|
12
|
+
session cookie.
|
|
12
13
|
|
|
13
14
|
## How it works
|
|
14
15
|
|
|
15
16
|
```
|
|
16
|
-
hydra REST
|
|
17
|
-
/v1/sessions <---------- |
|
|
17
|
+
hydra REST +--------------------+ browser
|
|
18
|
+
/v1/sessions <---------- | | ----> GET /
|
|
18
19
|
| hydra-acp-browser | <----> /ws?session=<id>
|
|
19
|
-
hydra WSS <----------> |
|
|
20
|
-
/acp
|
|
20
|
+
hydra WSS <----------> | |
|
|
21
|
+
/acp +--------------------+
|
|
21
22
|
|
|
|
22
23
|
~/.hydra-acp/browser/
|
|
23
|
-
authkey
|
|
24
24
|
link
|
|
25
25
|
```
|
|
26
26
|
|
|
@@ -96,9 +96,10 @@ The extension exposes:
|
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
On startup, hydra spawns hydra-acp-browser with these env vars set:
|
|
99
|
-
`HYDRA_ACP_DAEMON_URL`, `HYDRA_ACP_TOKEN`, `HYDRA_ACP_WS_URL`.
|
|
100
|
-
|
|
101
|
-
the
|
|
99
|
+
`HYDRA_ACP_DAEMON_URL`, `HYDRA_ACP_TOKEN`, `HYDRA_ACP_WS_URL`. It writes
|
|
100
|
+
the URL to open to `~/.hydra-acp/browser/link`. Set the sign-in password
|
|
101
|
+
once on the daemon host with `hydra-acp auth password`; the browser's
|
|
102
|
+
login page authenticates against that.
|
|
102
103
|
Stdout/stderr land in `~/.hydra-acp/extensions/hydra-acp-browser.log`.
|
|
103
104
|
Lifecycle is managed with
|
|
104
105
|
`hydra-acp extensions start|stop|restart hydra-acp-browser` —
|
|
@@ -113,26 +114,47 @@ The extension exposes:
|
|
|
113
114
|
npm start
|
|
114
115
|
```
|
|
115
116
|
|
|
116
|
-
4. **Open the browser** to the URL printed on stderr
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
4. **Open the browser** to the URL printed on stderr (also at
|
|
118
|
+
`~/.hydra-acp/browser/link`). Enter the password from step 2; a
|
|
119
|
+
successful login sets an `hb_session` cookie and subsequent requests
|
|
120
|
+
are authenticated by that cookie alone.
|
|
119
121
|
|
|
120
122
|
## HTTPS
|
|
121
123
|
|
|
122
124
|
Optional on `127.0.0.1`, **required** for any non-loopback bind (the server
|
|
123
|
-
refuses otherwise — same rule as the hydra daemon).
|
|
124
|
-
|
|
125
|
+
refuses otherwise — same rule as the hydra daemon).
|
|
126
|
+
|
|
127
|
+
### On a tailnet (recommended)
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
hydra-acp-browser tailscale setup
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Mints a real Let's Encrypt cert via `tailscale cert`, points
|
|
134
|
+
`BROWSER_TLS_CERT`/`BROWSER_TLS_KEY` at it, binds `BROWSER_HOST` to your
|
|
135
|
+
tailnet IP specifically (not `0.0.0.0` — your LAN never sees it), adds your
|
|
136
|
+
MagicDNS name to `BROWSER_ALLOWED_HOSTS`, and offers to restart the
|
|
137
|
+
extension. No trust prompts, no manual SAN wrangling. Certs expire after
|
|
138
|
+
~90 days; re-run the same command to renew.
|
|
139
|
+
|
|
140
|
+
If `tailscale cert` needs root (no `operator` set — see `tailscale set
|
|
141
|
+
--operator=$(whoami)` to fix this permanently), the wizard offers to retry
|
|
142
|
+
with `sudo` and fixes up file ownership afterward so the server can still
|
|
143
|
+
read the key.
|
|
144
|
+
|
|
145
|
+
### Without Tailscale: self-signed
|
|
146
|
+
|
|
147
|
+
The simplest setup is a self-signed cert in `~/.hydra-acp/browser/tls/`.
|
|
125
148
|
|
|
126
149
|
1. **Generate cert + key.** ECDSA P-256, 5-year validity, with a SAN
|
|
127
150
|
covering loopback. Add any extra hostnames you'll hit it from
|
|
128
|
-
(
|
|
151
|
+
(LAN IP, etc.) to the SAN inline:
|
|
129
152
|
|
|
130
153
|
```sh
|
|
131
154
|
mkdir -p ~/.hydra-acp/browser/tls && chmod 700 ~/.hydra-acp/browser/tls
|
|
132
155
|
cd ~/.hydra-acp/browser/tls
|
|
133
156
|
|
|
134
157
|
SAN='subjectAltName=DNS:localhost,DNS:'"$(hostname)"',IP:127.0.0.1,IP:::1'
|
|
135
|
-
# ^ add ,DNS:my.tailnet.ts.net or ,IP:100.64.x.y if needed.
|
|
136
158
|
|
|
137
159
|
openssl req -x509 \
|
|
138
160
|
-newkey ec -pkeyopt ec_paramgen_curve:P-256 \
|
|
@@ -165,35 +187,29 @@ is a self-signed cert in `~/.hydra-acp/browser/tls/`.
|
|
|
165
187
|
|
|
166
188
|
```sh
|
|
167
189
|
BROWSER_HOST=0.0.0.0
|
|
168
|
-
BROWSER_ALLOWED_HOSTS=mybox,
|
|
190
|
+
BROWSER_ALLOWED_HOSTS=mybox,100.64.1.5
|
|
169
191
|
```
|
|
170
192
|
|
|
171
193
|
Every entry in `BROWSER_ALLOWED_HOSTS` must also be in the cert's SAN.
|
|
172
194
|
|
|
173
195
|
3. **Apply** with `hydra-acp extensions restart hydra-acp-browser`. The
|
|
174
196
|
log line should now read `listening on https://…` and the
|
|
175
|
-
`Open: https
|
|
176
|
-
|
|
197
|
+
`Open: https://…/` URL is what you load. The auth cookie carries
|
|
198
|
+
`Secure` automatically when serving HTTPS.
|
|
177
199
|
|
|
178
200
|
4. **Trust the cert.** Self-signed certs trip browser warnings.
|
|
179
201
|
- **Click-through:** open the URL, accept the warning. Per-site only.
|
|
180
202
|
- **Linux Chrome/Chromium:**
|
|
181
|
-
`certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n hydra-acp
|
|
203
|
+
`certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n hydra-acp browser -i ~/.hydra-acp/browser/tls/cert.pem`
|
|
182
204
|
- **macOS:** double-click `cert.pem`, add to System keychain, set
|
|
183
205
|
"Always Trust" in Get Info.
|
|
184
206
|
- **iOS:** AirDrop/email `cert.pem` to the device, install profile
|
|
185
207
|
(Settings → General → VPN & Device Management), then enable under
|
|
186
208
|
Settings → General → About → Certificate Trust Settings.
|
|
187
209
|
|
|
188
|
-
If you're already on Tailscale, [`tailscale cert`](https://tailscale.com/kb/1153/enabling-https)
|
|
189
|
-
issues a real Let's Encrypt cert for `<host>.tailnet.ts.net` — strictly
|
|
190
|
-
better than self-signed (no trust prompts, ~30 s setup). Drop the
|
|
191
|
-
output paths into `BROWSER_TLS_CERT` / `BROWSER_TLS_KEY` and skip
|
|
192
|
-
step 4.
|
|
193
|
-
|
|
194
210
|
If you flip-flop between HTTP and HTTPS, the `Secure` cookie set under
|
|
195
|
-
HTTPS won't be sent over plain HTTP
|
|
196
|
-
`
|
|
211
|
+
HTTPS won't be sent over plain HTTP — clear cookies for the site (or hit
|
|
212
|
+
`/logout`) and sign in again.
|
|
197
213
|
|
|
198
214
|
## Configuration keys
|
|
199
215
|
|
|
@@ -202,22 +218,22 @@ HTTPS won't be sent over plain HTTP. Run
|
|
|
202
218
|
| Key | Default | Notes |
|
|
203
219
|
|------------------------------|----------------------------------------|-------|
|
|
204
220
|
| `BROWSER_HOST` | `127.0.0.1` | Bind host. Non-loopback requires TLS. |
|
|
205
|
-
| `BROWSER_PORT` | `
|
|
221
|
+
| `BROWSER_PORT` | `5514` | Listen port. |
|
|
206
222
|
| `BROWSER_TLS_CERT` | (none) | If set with `BROWSER_TLS_KEY`, listen on HTTPS. |
|
|
207
223
|
| `BROWSER_TLS_KEY` | (none) | Path to TLS key. |
|
|
208
|
-
| `BROWSER_AUTHKEY_FILE` | `~/.hydra-acp/browser/authkey` | Where the browser-side authkey lives. |
|
|
209
224
|
| `BROWSER_LINK_FILE` | `~/.hydra-acp/browser/link` | URL written for convenience. |
|
|
210
225
|
| `BROWSER_ALLOWED_HOSTS` | empty | Comma-sep extra Host values for DNS-rebind allowlist (e.g. Tailscale name). |
|
|
211
226
|
| `BROWSER_FILE_MAX_BYTES` | `262144` | Upper bound for `/api/files/read`. |
|
|
212
|
-
| `HYDRA_DAEMON_URL` | from env / `http://127.0.0.1:
|
|
227
|
+
| `HYDRA_DAEMON_URL` | from env / `http://127.0.0.1:55514` | `HYDRA_ACP_DAEMON_URL` env wins. |
|
|
213
228
|
| `HYDRA_WS_URL` | derived | `HYDRA_ACP_WS_URL` env wins. |
|
|
214
229
|
| `HYDRA_TOKEN` | (required) | Same precedence as the slack ext. |
|
|
215
230
|
| `DEBUG` | `false` | Verbose logging. |
|
|
216
231
|
|
|
217
232
|
## Security
|
|
218
233
|
|
|
219
|
-
- **
|
|
220
|
-
|
|
234
|
+
- **Password vs. hydra token.** The browser only ever sees the session
|
|
235
|
+
token the daemon issues after a password login. The hydra master
|
|
236
|
+
token stays on the server.
|
|
221
237
|
- **Loopback or TLS.** The server refuses to bind a non-loopback host
|
|
222
238
|
unless `BROWSER_TLS_CERT` and `BROWSER_TLS_KEY` are configured —
|
|
223
239
|
mirrors hydra's daemon.
|
package/dist/hydra/client.js
CHANGED
|
@@ -35,7 +35,15 @@ export class HydraRestClient {
|
|
|
35
35
|
if (r.status === 204) {
|
|
36
36
|
return undefined;
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
// Some endpoints (killSession has been observed doing this) reply
|
|
39
|
+
// success with an empty body on a status other than 204 — read as
|
|
40
|
+
// text first and only parse if there's actually something there,
|
|
41
|
+
// rather than assuming any non-204 2xx has a JSON body. r.json()
|
|
42
|
+
// on an empty string throws "Unexpected end of JSON input", which
|
|
43
|
+
// isn't a HydraRestError, so it was surfacing as a generic kill
|
|
44
|
+
// failure even though the operation had already succeeded.
|
|
45
|
+
const text = await r.text();
|
|
46
|
+
return (text ? JSON.parse(text) : undefined);
|
|
39
47
|
}
|
|
40
48
|
async health() {
|
|
41
49
|
return this.json("GET", "/v1/health");
|
|
@@ -51,12 +59,27 @@ export class HydraRestClient {
|
|
|
51
59
|
const suffix = qs.toString() ? `?${qs.toString()}` : "";
|
|
52
60
|
return this.json("GET", `/v1/sessions${suffix}`);
|
|
53
61
|
}
|
|
62
|
+
// Single-session equivalent of listSessions — used to keep one
|
|
63
|
+
// session's live metadata (title/cwd/model/workspace) fresh while a
|
|
64
|
+
// client is viewing it, without paying to list and serialize every
|
|
65
|
+
// other session on the install just to read one entry back out.
|
|
66
|
+
async getSession(sessionId) {
|
|
67
|
+
return this.json("GET", `/v1/sessions/${encodeURIComponent(sessionId)}`);
|
|
68
|
+
}
|
|
54
69
|
async killSession(sessionId) {
|
|
55
70
|
await this.json("POST", `/v1/sessions/${encodeURIComponent(sessionId)}/kill`);
|
|
56
71
|
}
|
|
57
72
|
async listAgents() {
|
|
58
73
|
return this.json("GET", "/v1/agents");
|
|
59
74
|
}
|
|
75
|
+
// Register a one-shot HTTP callback for a specific prompt's turn
|
|
76
|
+
// completion (see cli's turn-notify.ts / PROTOCOL.md). `already_terminal`
|
|
77
|
+
// means the turn had already finished by the time this landed — the
|
|
78
|
+
// caller should treat that as an immediate completion rather than
|
|
79
|
+
// waiting on a callback that will never come.
|
|
80
|
+
async registerTurnNotify(sessionId, messageId, callbackUrl, secret) {
|
|
81
|
+
return this.json("POST", `/v1/sessions/${encodeURIComponent(sessionId)}/prompt/${encodeURIComponent(messageId)}/notify`, { callbackUrl, secret });
|
|
82
|
+
}
|
|
60
83
|
async getConfig() {
|
|
61
84
|
return this.json("GET", "/v1/config");
|
|
62
85
|
}
|
package/dist/hydra/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/hydra/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAyCjC,MAAM,OAAO,eAAe;IAEP;IACA;IAFnB,YACmB,OAAe,EACf,KAAa;QADb,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAQ;IAC7B,CAAC;IAEJ,MAAM,CAAC,UAAU,CAAC,OAAe,EAAE,KAAa;QAC9C,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,IAAI,CAChB,MAAc,EACd,IAAY,EACZ,IAAc;QAEd,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;SACtC,CAAC;QACF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC9C,gEAAgE;QAChE,6DAA6D;QAC7D,iEAAiE;QACjE,yBAAyB;QACzB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACrB,OAAO,SAAc,CAAC;QACxB,CAAC;QACD,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/hydra/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,8 @@ import { registerAgentRoutes } from "./server/routes-agents.js";
|
|
|
9
9
|
import { registerFileRoutes } from "./server/routes-files.js";
|
|
10
10
|
import { registerRootRoutes } from "./server/routes-root.js";
|
|
11
11
|
import { registerConfigRoutes } from "./server/routes-config.js";
|
|
12
|
+
import { registerPushRoutes } from "./server/routes-push.js";
|
|
13
|
+
import { startTurnNotifyCallbackServer } from "./server/turn-notify-callback.js";
|
|
12
14
|
import { attachWsBridge } from "./server/ws-bridge.js";
|
|
13
15
|
import { UpstreamConnection, runInitialize } from "./hydra/ws.js";
|
|
14
16
|
import { logger, setDebug } from "./util/log.js";
|
|
@@ -31,6 +33,11 @@ async function main(argv) {
|
|
|
31
33
|
printHelp();
|
|
32
34
|
return;
|
|
33
35
|
}
|
|
36
|
+
if (argv[0] === "tailscale" && argv[1] === "setup") {
|
|
37
|
+
const { runTailscaleSetup } = await import("./setup/tailscale-wizard.js");
|
|
38
|
+
await runTailscaleSetup();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
34
41
|
const config = loadConfig();
|
|
35
42
|
setDebug(config.debug);
|
|
36
43
|
ensureLoopbackOrTls(config.browserHost, !!config.tls);
|
|
@@ -41,7 +48,9 @@ async function main(argv) {
|
|
|
41
48
|
registerAgentRoutes(app, ctx);
|
|
42
49
|
registerFileRoutes(app, ctx);
|
|
43
50
|
registerConfigRoutes(app, ctx);
|
|
51
|
+
registerPushRoutes(app, ctx);
|
|
44
52
|
await app.listen({ host: config.browserHost, port: config.browserPort });
|
|
53
|
+
await startTurnNotifyCallbackServer();
|
|
45
54
|
attachWsBridge(app.server, ctx);
|
|
46
55
|
// Register this process's version with the daemon using its own token so
|
|
47
56
|
// `hydra extension list` can show the version column. Fire-and-forget —
|
|
@@ -122,6 +131,8 @@ function printHelp() {
|
|
|
122
131
|
|
|
123
132
|
Usage:
|
|
124
133
|
hydra-acp-browser Start the server.
|
|
134
|
+
hydra-acp-browser tailscale setup Mint a Tailscale cert and configure
|
|
135
|
+
HTTPS + Tailscale-only access.
|
|
125
136
|
hydra-acp-browser --version Print version and exit.
|
|
126
137
|
hydra-acp-browser --help Show this message.
|
|
127
138
|
|
|
@@ -131,7 +142,7 @@ Set the master password on the daemon host:
|
|
|
131
142
|
Sign in by opening the printed URL in your browser and entering the
|
|
132
143
|
password.
|
|
133
144
|
|
|
134
|
-
Config: ~/.hydra-acp
|
|
145
|
+
Config: ~/.hydra-acp/browser.conf (KEY=VALUE).
|
|
135
146
|
When run as a hydra-acp extension, HYDRA_ACP_DAEMON_URL / HYDRA_ACP_TOKEN /
|
|
136
147
|
HYDRA_ACP_WS_URL are injected automatically.
|
|
137
148
|
`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAE3B,SAAS,mBAAmB,CAAC,IAAY,EAAE,MAAe;IACxD,MAAM,UAAU,GACd,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,KAAK;QACd,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,OAAO,CAAC;IACnB,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,yCAAyC,IAAI,iGAAiG,CAC/I,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,WAAW,EAAE,IAAI,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvB,mBAAmB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEtD,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAE9B,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Persisted Web Push state: this install's VAPID key pair (generated
|
|
2
|
+
// once, reused forever — regenerating would invalidate every browser's
|
|
3
|
+
// existing subscription) and the set of subscriptions registered by
|
|
4
|
+
// browsers that turned on turn-end notifications. Single JSON file
|
|
5
|
+
// under ~/.hydra-acp/browser/, mirroring the rest of this module's
|
|
6
|
+
// persisted state (auth, link file).
|
|
7
|
+
import { promises as fsp } from "node:fs";
|
|
8
|
+
import { dirname } from "node:path";
|
|
9
|
+
import webpush from "web-push";
|
|
10
|
+
import { paths } from "../util/paths.js";
|
|
11
|
+
import { logger } from "../util/log.js";
|
|
12
|
+
const log = logger("push-store");
|
|
13
|
+
let cached;
|
|
14
|
+
async function load() {
|
|
15
|
+
if (cached)
|
|
16
|
+
return cached;
|
|
17
|
+
try {
|
|
18
|
+
const text = await fsp.readFile(paths.pushFile(), "utf8");
|
|
19
|
+
cached = JSON.parse(text);
|
|
20
|
+
return cached;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
const keys = webpush.generateVAPIDKeys();
|
|
24
|
+
cached = { vapid: keys, subscriptions: [] };
|
|
25
|
+
await save();
|
|
26
|
+
return cached;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function save() {
|
|
30
|
+
if (!cached)
|
|
31
|
+
return;
|
|
32
|
+
await fsp.mkdir(dirname(paths.pushFile()), { recursive: true, mode: 0o700 });
|
|
33
|
+
await fsp.writeFile(paths.pushFile(), JSON.stringify(cached, null, 2), {
|
|
34
|
+
mode: 0o600,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export async function getVapidPublicKey() {
|
|
38
|
+
return (await load()).vapid.publicKey;
|
|
39
|
+
}
|
|
40
|
+
// Apple's Web Push (APNs-backed) validates the VAPID JWT's `sub` claim
|
|
41
|
+
// strictly and rejects anything without a real-looking domain —
|
|
42
|
+
// "mailto:...@localhost" comes back 403 BadJwtToken. example.com is
|
|
43
|
+
// reserved for documentation use (RFC 2606) precisely so placeholders
|
|
44
|
+
// like this don't need to resolve to anything real.
|
|
45
|
+
async function vapidDetails() {
|
|
46
|
+
const { vapid } = await load();
|
|
47
|
+
return { subject: "mailto:hydra-acp@example.com", ...vapid };
|
|
48
|
+
}
|
|
49
|
+
export async function addSubscription(sub) {
|
|
50
|
+
const file = await load();
|
|
51
|
+
file.subscriptions = file.subscriptions.filter((s) => s.endpoint !== sub.endpoint);
|
|
52
|
+
file.subscriptions.push(sub);
|
|
53
|
+
await save();
|
|
54
|
+
log.info(`subscribed ${sub.endpoint.slice(0, 60)}… (${file.subscriptions.length} total)`);
|
|
55
|
+
}
|
|
56
|
+
export async function removeSubscription(endpoint) {
|
|
57
|
+
const file = await load();
|
|
58
|
+
const before = file.subscriptions.length;
|
|
59
|
+
file.subscriptions = file.subscriptions.filter((s) => s.endpoint !== endpoint);
|
|
60
|
+
if (file.subscriptions.length !== before) {
|
|
61
|
+
await save();
|
|
62
|
+
log.info(`unsubscribed ${endpoint.slice(0, 60)}… (${file.subscriptions.length} total)`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function hasSubscriptions() {
|
|
66
|
+
return (await load()).subscriptions.length > 0;
|
|
67
|
+
}
|
|
68
|
+
// Sends to every registered subscription, pruning any the push service
|
|
69
|
+
// reports as gone (404/410 — the user uninstalled, revoked permission,
|
|
70
|
+
// or the browser rotated the endpoint). Best-effort: a delivery failure
|
|
71
|
+
// for one subscription doesn't block the others.
|
|
72
|
+
export async function sendPushToAll(payload) {
|
|
73
|
+
const file = await load();
|
|
74
|
+
if (file.subscriptions.length === 0) {
|
|
75
|
+
log.info(`sendPushToAll: no subscriptions, skipping "${payload.title}"`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
log.info(`sending push to ${file.subscriptions.length} subscription(s): "${payload.title}" / "${payload.body}"`);
|
|
79
|
+
const details = await vapidDetails();
|
|
80
|
+
const body = JSON.stringify(payload);
|
|
81
|
+
const stale = [];
|
|
82
|
+
await Promise.all(file.subscriptions.map(async (sub) => {
|
|
83
|
+
try {
|
|
84
|
+
await webpush.sendNotification(sub, body, { vapidDetails: details });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const e = err;
|
|
88
|
+
if (e.statusCode === 404 || e.statusCode === 410) {
|
|
89
|
+
stale.push(sub.endpoint);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
log.warn(`push delivery failed: status=${e.statusCode} body=${e.body} headers=${JSON.stringify(e.headers)} msg=${e.message}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}));
|
|
96
|
+
if (stale.length > 0) {
|
|
97
|
+
file.subscriptions = file.subscriptions.filter((s) => !stale.includes(s.endpoint));
|
|
98
|
+
await save();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=push-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-store.js","sourceRoot":"","sources":["../../src/server/push-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { addSubscription, getVapidPublicKey, removeSubscription, } from "./push-store.js";
|
|
2
|
+
function isSubscription(body) {
|
|
3
|
+
if (!body || typeof body !== "object")
|
|
4
|
+
return false;
|
|
5
|
+
const b = body;
|
|
6
|
+
if (typeof b.endpoint !== "string")
|
|
7
|
+
return false;
|
|
8
|
+
const keys = b.keys;
|
|
9
|
+
return !!keys && typeof keys.p256dh === "string" && typeof keys.auth === "string";
|
|
10
|
+
}
|
|
11
|
+
export function registerPushRoutes(app, _ctx) {
|
|
12
|
+
app.get("/api/push/vapid-public-key", async (_request, reply) => {
|
|
13
|
+
reply.send({ publicKey: await getVapidPublicKey() });
|
|
14
|
+
});
|
|
15
|
+
app.post("/api/push/subscribe", async (request, reply) => {
|
|
16
|
+
if (!isSubscription(request.body)) {
|
|
17
|
+
reply.code(400).send({ error: "invalid subscription" });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
await addSubscription(request.body);
|
|
21
|
+
reply.code(204).send();
|
|
22
|
+
});
|
|
23
|
+
app.post("/api/push/unsubscribe", async (request, reply) => {
|
|
24
|
+
const body = request.body;
|
|
25
|
+
if (!body?.endpoint) {
|
|
26
|
+
reply.code(400).send({ error: "endpoint required" });
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await removeSubscription(body.endpoint);
|
|
30
|
+
reply.code(204).send();
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=routes-push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes-push.js","sourceRoot":"","sources":["../../src/server/routes-push.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,GAEnB,MAAM,iBAAiB,CAAC;AAGzB,SAAS,cAAc,CAAC,IAAa;IACnC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjD,MAAM,IAAI,GAAG,CAAC,CAAC,IAA2C,CAAC;IAC3D,OAAO,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAoB,EAAE,IAAmB;IAC1E,GAAG,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAyC,CAAC;QAC/D,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,MAAM,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -35,7 +35,11 @@ export function registerRootRoutes(app, ctx) {
|
|
|
35
35
|
reply.send(injectNonce(html, request.cspNonce ?? ""));
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
// Preserve a deep link (e.g. ?protocol_launch=... from a web+hydra://
|
|
39
|
+
// handoff) through the login round trip so it isn't lost when an
|
|
40
|
+
// unauthenticated visit gets bounced to the login page.
|
|
41
|
+
const next = new URL(request.url, "http://internal").search;
|
|
42
|
+
reply.code(200).send(loginPage(request.cspNonce ?? "", undefined, next));
|
|
39
43
|
});
|
|
40
44
|
app.post("/login", {
|
|
41
45
|
config: { skipAuth: true, skipCsrf: true },
|
|
@@ -65,14 +69,19 @@ export function registerRootRoutes(app, ctx) {
|
|
|
65
69
|
}
|
|
66
70
|
async function handleLogin(request, reply, ctx) {
|
|
67
71
|
const ip = request.ip ?? "unknown";
|
|
72
|
+
const body = request.body;
|
|
73
|
+
// Only trust it back as a same-page query string: must start with "?"
|
|
74
|
+
// and stay within printable ASCII, so it can never turn into an
|
|
75
|
+
// absolute or protocol-relative redirect target.
|
|
76
|
+
const rawNext = body && typeof body.next === "string" ? body.next : "";
|
|
77
|
+
const next = /^\?[\x20-\x7e]{0,2048}$/.test(rawNext) ? rawNext : "";
|
|
68
78
|
if (ctx.rateLimiter.isBlocked(ip)) {
|
|
69
|
-
reply.code(429).type("text/html; charset=utf-8").send(loginPage(request.cspNonce ?? "", "Too many failed attempts. Try again in a few minutes."));
|
|
79
|
+
reply.code(429).type("text/html; charset=utf-8").send(loginPage(request.cspNonce ?? "", "Too many failed attempts. Try again in a few minutes.", next));
|
|
70
80
|
return;
|
|
71
81
|
}
|
|
72
|
-
const body = request.body;
|
|
73
82
|
const password = body && typeof body.password === "string" ? body.password : "";
|
|
74
83
|
if (password.length === 0) {
|
|
75
|
-
reply.code(400).type("text/html; charset=utf-8").send(loginPage(request.cspNonce ?? "", "Password required."));
|
|
84
|
+
reply.code(400).type("text/html; charset=utf-8").send(loginPage(request.cspNonce ?? "", "Password required.", next));
|
|
76
85
|
return;
|
|
77
86
|
}
|
|
78
87
|
const daemonResp = await fetch(`${ctx.config.hydraDaemonUrl}/v1/auth/login`, {
|
|
@@ -87,7 +96,7 @@ async function handleLogin(request, reply, ctx) {
|
|
|
87
96
|
secure: ctx.scheme === "https",
|
|
88
97
|
maxAgeSeconds: COOKIE_MAX_AGE_SECONDS,
|
|
89
98
|
}));
|
|
90
|
-
reply.code(303).header("Location", "/").send();
|
|
99
|
+
reply.code(303).header("Location", "/" + next).send();
|
|
91
100
|
return;
|
|
92
101
|
}
|
|
93
102
|
ctx.rateLimiter.recordFailure(ip);
|
|
@@ -108,7 +117,7 @@ async function handleLogin(request, reply, ctx) {
|
|
|
108
117
|
reply
|
|
109
118
|
.code(daemonResp.status === 403 ? 403 : 401)
|
|
110
119
|
.type("text/html; charset=utf-8")
|
|
111
|
-
.send(loginPage(request.cspNonce ?? "", errMsg));
|
|
120
|
+
.send(loginPage(request.cspNonce ?? "", errMsg, next));
|
|
112
121
|
}
|
|
113
122
|
async function handleLogout(request, reply, ctx) {
|
|
114
123
|
const cookies = parseCookies(request.headers.cookie);
|
|
@@ -134,16 +143,19 @@ async function handleLogout(request, reply, ctx) {
|
|
|
134
143
|
function injectNonce(html, nonce) {
|
|
135
144
|
return html.replaceAll("__CSP_NONCE__", nonce);
|
|
136
145
|
}
|
|
137
|
-
function loginPage(nonce, error) {
|
|
146
|
+
function loginPage(nonce, error, next) {
|
|
138
147
|
const errorHtml = error
|
|
139
148
|
? `<p class="error" role="alert">${escapeHtml(error)}</p>`
|
|
140
149
|
: "";
|
|
150
|
+
const nextField = next
|
|
151
|
+
? `<input type="hidden" name="next" value="${escapeHtml(next)}">`
|
|
152
|
+
: "";
|
|
141
153
|
return `<!doctype html>
|
|
142
154
|
<html lang="en">
|
|
143
155
|
<head>
|
|
144
156
|
<meta charset="utf-8">
|
|
145
157
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
146
|
-
<title>
|
|
158
|
+
<title>Hydra</title>
|
|
147
159
|
<style nonce="${nonce}">
|
|
148
160
|
:root { color-scheme: dark; font-family: system-ui, sans-serif; }
|
|
149
161
|
body { background: #0e1116; color: #d6deeb; margin: 0; padding: 4rem 1.5rem; max-width: 26rem; margin-inline: auto; line-height: 1.5; }
|
|
@@ -175,9 +187,10 @@ code { background: #1c2230; padding: 0.1rem 0.4rem; border-radius: 4px; }
|
|
|
175
187
|
</style>
|
|
176
188
|
</head>
|
|
177
189
|
<body>
|
|
178
|
-
<h1>
|
|
190
|
+
<h1>Hydra</h1>
|
|
179
191
|
${errorHtml}
|
|
180
192
|
<form id="loginForm" method="POST" action="/login" autocomplete="off">
|
|
193
|
+
${nextField}
|
|
181
194
|
<label for="password">Password</label>
|
|
182
195
|
<input type="password" id="password" name="password" autofocus required autocomplete="off">
|
|
183
196
|
<button type="submit">Sign in</button>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-root.js","sourceRoot":"","sources":["../../src/server/routes-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,sBAAsB,EACtB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AAElC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErD,gEAAgE;AAChE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEzC,IAAI,UAA8B,CAAC;AAEnC,KAAK,UAAU,QAAQ;IACrB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,UAAU,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,IAAI,QAA4B,CAAC;AAEjC,KAAK,UAAU,MAAM;IACnB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAoB,EACpB,GAAkB;IAElB,GAAG,CAAC,GAAG,CACL,GAAG,EACH;QACE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC3C,EACD,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"routes-root.js","sourceRoot":"","sources":["../../src/server/routes-root.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,6 +60,19 @@ export function registerSessionRoutes(app, ctx) {
|
|
|
60
60
|
reply.code(status).send({ error: err.message });
|
|
61
61
|
}
|
|
62
62
|
});
|
|
63
|
+
// Single-session lookup, used by the SPA to keep the currently-open
|
|
64
|
+
// session's metadata fresh without polling the full list.
|
|
65
|
+
app.get("/api/sessions/:id", async (request, reply) => {
|
|
66
|
+
const id = request.params.id;
|
|
67
|
+
try {
|
|
68
|
+
const result = await clientFor(ctx, request).getSession(id);
|
|
69
|
+
reply.send(result);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const status = err instanceof HydraRestError ? err.status : 502;
|
|
73
|
+
reply.code(status).send({ error: err.message });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
63
76
|
app.post("/api/kill", async (request, reply) => {
|
|
64
77
|
const body = (request.body ?? {});
|
|
65
78
|
if (!body.sessionId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-sessions.js","sourceRoot":"","sources":["../../src/server/routes-sessions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"routes-sessions.js","sourceRoot":"","sources":["../../src/server/routes-sessions.ts"],"names":[],"mappings":"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"}
|