fileport-gateway 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,7 +16,7 @@ Implemented:
16
16
  - CLI and browser preview shell;
17
17
  - explicit RO/RW shares, expiry and strict existing-file-only atomic saves.
18
18
 
19
- See [current architecture](docs/CURRENT_ARCHITECTURE.md), [Dufs compatibility](docs/DUFS_COMPATIBILITY.md), and [migration plan](docs/MIGRATION_PLAN.md).
19
+ See [current architecture](docs/CURRENT_ARCHITECTURE,md), [Dufs compatibility](docs/DUFS_COMPATIBILITY,md), and [migration plan](docs/MIGRATION_PLAN,md), and [network/CLI contract](docs/NETWORK_AND_CLI.md).
20
20
 
21
21
  ## Install
22
22
 
@@ -42,7 +42,14 @@ fileport ls
42
42
  fileport revoke <share-id>
43
43
  ```
44
44
 
45
- Fileport provides HTTP only; `FILEPORT_PUBLIC_BASE_URL` rejects `https://`. The public service defaults to `0.0.0.0:7892`. Agent control is available only through `$FILEPORT_STATE_DIR/control.sock` (0600).
45
+ Fileport provides HTTP only. The listener defaults to `0.0.0.0:7892`; generated URLs default to the default-route LAN IPv4, not `127.0.0.1`. A configured hostname must resolve entirely to local, listener-covered addresses.
46
+
47
+ ```bash
48
+ fileport doctor --json
49
+ fileport config set --public-url http://files.example.com:7892
50
+ fileport --help
51
+ fileport share --help
52
+ ``` Agent control is available only through `$FILEPORT_STATE_DIR/control.sock` (0600).
46
53
 
47
54
  ## Verify
48
55
 
package/dist/cli.js CHANGED
@@ -4,84 +4,293 @@ import fs from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { controlRequest } from "./client.js";
7
- import { loadConfig } from "./config.js";
7
+ import { configPath, loadConfig, readConfigFile, writeConfigFile } from "./config.js";
8
8
  import { Gateway } from "./gateway.js";
9
+ import { PublicAddressResolver } from "./network.js";
9
10
  import { parseDuration } from "./duration.js";
10
- const config = loadConfig();
11
- const controlSocket = path.join(config.stateDir, "control.sock");
12
- async function waitForControl() { const deadline = Date.now() + 5000; while (Date.now() < deadline) {
13
- try {
14
- await controlRequest(controlSocket, "GET", "/shares");
15
- return;
11
+ const ROOT_HELP = `Fileport Gateway — securely share local developer artifacts over HTTP
12
+
13
+ Usage:
14
+ fileport <command> [options]
15
+ fileport --help
16
+ fileport --version
17
+
18
+ Commands:
19
+ serve Start the user-scoped Gateway
20
+ share Create a capability URL for a file or directory
21
+ ls List active shares
22
+ revoke Revoke a share capability
23
+ status Show daemon status and advertised address
24
+ stop Stop the running daemon
25
+ doctor Diagnose bind, LAN address, public URL, and DNS
26
+ config Show or update persistent configuration
27
+
28
+ Safety defaults:
29
+ Shares are read-only unless --rw is explicit. Fileport is HTTP-only.
30
+ Without public.url, Fileport advertises the default-route LAN IPv4.
31
+ Configured hostnames are issued only when every A/AAAA address is local
32
+ and covered by the listener. Capability URLs are secrets; do not publish them.
33
+
34
+ Agent output:
35
+ --json writes one JSON object to stdout; diagnostics go to stderr.
36
+ share without --json writes only the URL.
37
+
38
+ Exit codes:
39
+ 0 success; 2 usage; 3 invalid config; 4 public address/DNS validation;
40
+ 5 daemon/bind/runtime unavailable; 6 share not found.
41
+
42
+ Examples:
43
+ fileport share ./report.md --readonly
44
+ fileport share ./report.md --rw --expire 2h --json
45
+ fileport doctor --json
46
+ fileport config set --public-url http://files.example.com:7892
47
+
48
+ Environment:
49
+ FILEPORT_HOST, FILEPORT_PORT, FILEPORT_PUBLIC_BASE_URL,
50
+ FILEPORT_STATE_DIR, FILEPORT_CONFIG_FILE, FILEPORT_DUFS_BIN
51
+
52
+ Run 'fileport <command> --help' for command details.`;
53
+ const HELP = {
54
+ serve: `Usage: fileport serve [--host HOST] [--port PORT] [--public-url URL] [--json]\n\nStart the Gateway. --host controls listening; --public-url only controls advertised URLs.\nDefault bind: 0.0.0.0:7892. A configured hostname is DNS-validated as all-local.\n--json emits one readiness object; long-running diagnostics use stderr.`,
55
+ share: `Usage: fileport share <path> [--readonly|--rw] [--expire 2h] [--json]\n\nCreate an opaque capability URL. Default: --readonly. --rw permits strict,\nversioned, existing-file-only text saves. Expiry units: m, h, d, w.\nThe capability URL is a secret. Default stdout is only the URL.`,
56
+ ls: `Usage: fileport ls [--json]\n\nList non-expired shares. Human mode prints a compact table; JSON mode emits {shares:[...]}.`,
57
+ revoke: `Usage: fileport revoke <share-id> [--json]\n\nImmediately revoke a capability. JSON mode emits {ok,id}. Exit 6 if absent.`,
58
+ status: `Usage: fileport status [--json]\n\nShow daemon PID, bind address, advertised address, and active share count.`,
59
+ stop: `Usage: fileport stop [--json]\n\nGracefully stop the user-scoped Gateway and its Dufs workers.`,
60
+ doctor: `Usage: fileport doctor [--json]\n\nShow a runtime snapshot of interfaces, selected LAN IPv4, public URL, DNS/CNAME\nresolution, local matches, and warnings. Does not create a share.`,
61
+ config: `Usage:\n fileport config show [--json]\n fileport config set [--host H] [--port N] [--public-url URL]\n fileport config unset --public-url\n\nPersistent file: ~/.config/fileport/config.json (0700 directory, 0600 file).\nPriority: command flags > environment > config file > defaults. Restart after changes.`
62
+ };
63
+ class CliError extends Error {
64
+ exitCode;
65
+ constructor(message, exitCode) {
66
+ super(message);
67
+ this.exitCode = exitCode;
16
68
  }
17
- catch {
18
- await new Promise((r) => setTimeout(r, 50));
69
+ }
70
+ function hasHelp(args) { return args.includes("--help") || args.includes("-h"); }
71
+ function jsonFlag(args) { return args.includes("--json"); }
72
+ function output(value, json, human) { if (json)
73
+ process.stdout.write(`${JSON.stringify(value)}\n`);
74
+ else if (human !== undefined)
75
+ process.stdout.write(`${human}\n`); }
76
+ function assertOnlyFlags(args, allowed, valueFlags = new Set()) { for (let i = 0; i < args.length; i++) {
77
+ const arg = args[i];
78
+ if (!arg.startsWith("-"))
79
+ continue;
80
+ if (!allowed.has(arg))
81
+ throw new CliError(`unknown option: ${arg}`, 2);
82
+ if (valueFlags.has(arg)) {
83
+ if (!args[i + 1] || args[i + 1].startsWith("-"))
84
+ throw new CliError(`${arg} requires a value`, 2);
85
+ i++;
19
86
  }
20
- } throw new Error("gateway did not become ready"); }
21
- async function ensureServer() {
87
+ } }
88
+ function option(args, name) { const i = args.indexOf(name); if (i < 0)
89
+ return; const v = args[i + 1]; if (!v || v.startsWith("-"))
90
+ throw new CliError(`${name} requires a value`, 2); return v; }
91
+ async function packageVersion() { const raw = await fs.readFile(fileURLToPath(new URL("../package.json", import.meta.url)), "utf8"); return JSON.parse(raw).version; }
92
+ async function waitForControl(socket) { const deadline = Date.now() + 5000; while (Date.now() < deadline) {
22
93
  try {
23
- await controlRequest(controlSocket, "GET", "/shares");
94
+ await controlRequest(socket, "GET", "/status");
24
95
  return;
25
96
  }
26
- catch { }
27
- await fs.mkdir(config.stateDir, { recursive: true, mode: 0o700 });
28
- const executable = fileURLToPath(import.meta.url);
29
- const child = spawn(process.execPath, [executable, "serve"], { detached: true, stdio: "ignore", env: process.env });
30
- child.unref();
31
- await waitForControl();
97
+ catch {
98
+ await new Promise(r => setTimeout(r, 50));
99
+ }
100
+ } throw new CliError("gateway did not become ready", 5); }
101
+ async function ensureServer(config = loadConfig()) { const socket = path.join(config.stateDir, "control.sock"); try {
102
+ const status = await controlRequest(socket, "GET", "/status");
103
+ if (status.protocolVersion !== 1)
104
+ throw new CliError("running Fileport daemon is from an older version; run 'fileport stop' and retry", 5);
105
+ return { config, socket };
32
106
  }
107
+ catch (error) {
108
+ if (error instanceof CliError)
109
+ throw error;
110
+ } await fs.mkdir(config.stateDir, { recursive: true, mode: 0o700 }); const executable = fileURLToPath(import.meta.url), child = spawn(process.execPath, [executable, "serve"], { detached: true, stdio: "ignore", env: process.env }); child.unref(); await waitForControl(socket); return { config, socket }; }
111
+ function overrides(args) { return { host: option(args, "--host"), port: option(args, "--port") ? Number(option(args, "--port")) : undefined, publicBaseUrl: option(args, "--public-url") }; }
112
+ let jsonRequested = false;
33
113
  async function main() {
34
- const [command, ...args] = process.argv.slice(2);
114
+ const argv = process.argv.slice(2), command = argv[0];
115
+ jsonRequested = argv.includes("--json");
116
+ if (!command || command === "help" || hasHelp(argv.slice(0, 1))) {
117
+ output({}, false, ROOT_HELP);
118
+ return;
119
+ }
120
+ if (command === "--version" || command === "-V") {
121
+ output({}, false, await packageVersion());
122
+ return;
123
+ }
124
+ const args = argv.slice(1);
125
+ if (hasHelp(args)) {
126
+ if (!HELP[command])
127
+ throw new CliError(`unknown command: ${command}`, 2);
128
+ output({}, false, HELP[command]);
129
+ return;
130
+ }
131
+ const asJson = jsonFlag(args);
35
132
  if (command === "serve") {
36
- const gateway = new Gateway(config);
37
- await gateway.start();
38
- console.log(`fileport listening on ${config.host}:${config.port}`);
133
+ assertOnlyFlags(args, new Set(["--json", "--host", "--port", "--public-url"]), new Set(["--host", "--port", "--public-url"]));
134
+ const config = loadConfig(process.env, overrides(args)), gateway = new Gateway(config);
135
+ try {
136
+ await gateway.start();
137
+ }
138
+ catch (error) {
139
+ const code = error.code;
140
+ throw new CliError(code === "EADDRINUSE" ? `port ${config.port} is already in use` : code === "EADDRNOTAVAIL" ? `cannot bind ${config.host}; it is not assigned to this machine` : error instanceof Error ? error.message : String(error), code?.startsWith("EADDR") ? 5 : 4);
141
+ }
142
+ const ready = await controlRequest(path.join(config.stateDir, "control.sock"), "GET", "/status");
143
+ output(ready, asJson, `fileport listening on ${config.host}:${config.port}`);
39
144
  const stop = async () => { await gateway.close(); process.exit(0); };
40
145
  process.on("SIGINT", stop);
41
146
  process.on("SIGTERM", stop);
42
147
  return;
43
148
  }
44
149
  if (command === "share") {
45
- let permission = "ro";
46
- let expire;
150
+ if (args.includes("--rw") && (args.includes("--readonly") || args.includes("--ro")))
151
+ throw new CliError("--rw conflicts with --readonly", 2);
152
+ let permission = "ro", expire;
47
153
  const positional = [];
48
- for (let index = 0; index < args.length; index++) {
49
- const arg = args[index];
50
- if (arg === "--rw")
154
+ for (let i = 0; i < args.length; i++) {
155
+ const a = args[i];
156
+ if (a === "--json")
157
+ continue;
158
+ if (a === "--rw")
51
159
  permission = "rw";
52
- else if (arg === "--readonly" || arg === "--ro")
160
+ else if (a === "--readonly" || a === "--ro")
53
161
  permission = "ro";
54
- else if (arg === "--expire") {
55
- expire = args[++index];
162
+ else if (a === "--expire") {
163
+ expire = args[++i];
56
164
  if (!expire)
57
- throw new Error("--expire requires a duration");
165
+ throw new CliError("--expire requires a duration", 2);
58
166
  }
59
- else if (arg.startsWith("-"))
60
- throw new Error(`unknown option: ${arg}`);
167
+ else if (a.startsWith("-"))
168
+ throw new CliError(`unknown option: ${a}`, 2);
61
169
  else
62
- positional.push(arg);
170
+ positional.push(a);
63
171
  }
64
172
  if (positional.length !== 1)
65
- throw new Error("usage: fileport share <path> [--readonly|--rw] [--expire 2h]");
66
- await ensureServer();
67
- const result = await controlRequest(controlSocket, "POST", "/shares", { path: positional[0], permission, expiresAt: expire ? parseDuration(expire) : undefined });
68
- console.log(result.url);
173
+ throw new CliError("share requires exactly one path", 2);
174
+ const { socket } = await ensureServer();
175
+ const result = await controlRequest(socket, "POST", "/shares", { path: positional[0], permission, expiresAt: expire ? parseDuration(expire) : undefined });
176
+ output(result, asJson, result.url);
69
177
  return;
70
178
  }
71
179
  if (command === "ls") {
72
- await ensureServer();
73
- console.log(JSON.stringify(await controlRequest(controlSocket, "GET", "/shares"), null, 2));
180
+ assertOnlyFlags(args, new Set(["--json"]));
181
+ if (args.some(a => !a.startsWith("-")))
182
+ throw new CliError("ls accepts no positional arguments", 2);
183
+ const { socket } = await ensureServer();
184
+ const result = await controlRequest(socket, "GET", "/shares");
185
+ if (asJson)
186
+ output(result, true);
187
+ else {
188
+ const lines = ["ID\tPERM\tEXPIRES\tTARGET", ...result.shares.map((s) => `${s.id}\t${s.permission}\t${s.expiresAt ?? "-"}\t${s.target}`)];
189
+ output({}, false, lines.join("\n"));
190
+ }
74
191
  return;
75
192
  }
76
193
  if (command === "revoke") {
77
- if (!args[0])
78
- throw new Error("usage: fileport revoke <share-id>");
79
- await ensureServer();
80
- await controlRequest(controlSocket, "DELETE", `/shares/${encodeURIComponent(args[0])}`);
194
+ assertOnlyFlags(args, new Set(["--json"]));
195
+ const ids = args.filter(a => !a.startsWith("-"));
196
+ if (ids.length > 1)
197
+ throw new CliError("revoke accepts exactly one share id", 2);
198
+ const id = ids[0];
199
+ if (!id)
200
+ throw new CliError("revoke requires a share id", 2);
201
+ const { socket } = await ensureServer();
202
+ try {
203
+ await controlRequest(socket, "DELETE", `/shares/${encodeURIComponent(id)}`);
204
+ }
205
+ catch {
206
+ throw new CliError(`share not found: ${id}`, 6);
207
+ }
208
+ output({ ok: true, id }, asJson, `revoked ${id}`);
209
+ return;
210
+ }
211
+ if (command === "status" || command === "doctor") {
212
+ assertOnlyFlags(args, new Set(["--json"]));
213
+ if (args.some(a => !a.startsWith("-")))
214
+ throw new CliError(`${command} accepts no positional arguments`, 2);
215
+ const config = loadConfig();
216
+ const socket = path.join(config.stateDir, "control.sock");
217
+ try {
218
+ const result = await controlRequest(socket, "GET", `/${command}`);
219
+ if (command === "doctor" && result.status === "error")
220
+ throw new CliError(result.error?.message ?? "public address validation failed", 4);
221
+ output(result, asJson, JSON.stringify(result, null, 2));
222
+ }
223
+ catch (error) {
224
+ if (error instanceof CliError)
225
+ throw error;
226
+ if (command === "status")
227
+ throw new CliError("gateway is not running", 5);
228
+ const gateway = new Gateway(config);
229
+ try {
230
+ const result = await gateway.addressResolver.inspect({ host: config.host, port: config.port, publicBaseUrl: config.publicBaseUrl }, true).then(s => ({ bind: { host: config.host, port: config.port }, ...s }));
231
+ output(result, asJson, JSON.stringify(result, null, 2));
232
+ }
233
+ catch (error) {
234
+ throw new CliError(error instanceof Error ? error.message : String(error), 4);
235
+ }
236
+ }
237
+ return;
238
+ }
239
+ if (command === "stop") {
240
+ assertOnlyFlags(args, new Set(["--json"]));
241
+ if (args.some(a => !a.startsWith("-")))
242
+ throw new CliError("stop accepts no positional arguments", 2);
243
+ const config = loadConfig(), socket = path.join(config.stateDir, "control.sock");
244
+ try {
245
+ const result = await controlRequest(socket, "POST", "/shutdown");
246
+ output(result, asJson, `stopped ${result.pid}`);
247
+ }
248
+ catch {
249
+ throw new CliError("gateway is not running", 5);
250
+ }
81
251
  return;
82
252
  }
83
- console.error("usage: fileport <serve|share|ls|revoke>");
84
- process.exitCode = 2;
253
+ if (command === "config") {
254
+ const action = args[0] ?? "show", file = configPath(), value = readConfigFile(file);
255
+ if (action === "show") {
256
+ output({ file, config: value }, asJson, JSON.stringify({ file, config: value }, null, 2));
257
+ return;
258
+ }
259
+ if (action === "set") {
260
+ const host = option(args, "--host"), port = option(args, "--port"), publicUrl = option(args, "--public-url");
261
+ if (!host && !port && !publicUrl)
262
+ throw new CliError("config set requires --host, --port, or --public-url", 2);
263
+ const next = { ...value, bind: { ...value.bind }, public: { ...value.public, dnsPolicy: "all-local" } };
264
+ if (host)
265
+ next.bind.host = host;
266
+ if (port)
267
+ next.bind.port = Number(port);
268
+ if (publicUrl)
269
+ next.public.url = publicUrl;
270
+ const checked = loadConfig({ ...process.env, FILEPORT_CONFIG_FILE: "/nonexistent" }, { host: next.bind?.host, port: next.bind?.port, publicBaseUrl: next.public?.url ?? undefined });
271
+ await new PublicAddressResolver().inspect({ host: checked.host, port: checked.port, publicBaseUrl: checked.publicBaseUrl }, true);
272
+ writeConfigFile(next, file);
273
+ output({ ok: true, file, config: next }, asJson, `updated ${file}; restart Fileport to apply`);
274
+ return;
275
+ }
276
+ if (action === "unset" && args.includes("--public-url")) {
277
+ const next = { ...value, public: { ...value.public, url: null, dnsPolicy: "all-local" } };
278
+ writeConfigFile(next, file);
279
+ output({ ok: true, file, config: next }, asJson, `removed public.url from ${file}; restart Fileport to apply`);
280
+ return;
281
+ }
282
+ throw new CliError("invalid config command", 2);
283
+ }
284
+ throw new CliError(`unknown command: ${command}`, 2);
285
+ }
286
+ main().catch(error => { const e = error; let code = e instanceof CliError ? e.exitCode : 3; let message = e instanceof Error ? e.message : String(e); let detail; try {
287
+ detail = JSON.parse(message);
288
+ if (detail?.error)
289
+ message = detail.message ?? detail.error;
85
290
  }
86
- main().catch((error) => { console.error(error instanceof Error ? error.message : error); process.exitCode = 1; });
291
+ catch { } if (/DNS_|public host|LAN IPv4|public IP|public URL|NO_LAN/i.test(message + (detail?.error ?? "")))
292
+ code = 4; if (jsonRequested)
293
+ process.stdout.write(`${JSON.stringify({ ok: false, error: { code: detail?.error ?? "CLI_ERROR", message }, exitCode: code })}\n`);
294
+ else
295
+ process.stderr.write(`${message}\n`); process.exitCode = code; });
87
296
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,2 +1,20 @@
1
1
  import type { FileportConfig } from "./types.js";
2
- export declare function loadConfig(env?: NodeJS.ProcessEnv): FileportConfig;
2
+ export interface FileportConfigFile {
3
+ bind?: {
4
+ host?: string;
5
+ port?: number;
6
+ };
7
+ public?: {
8
+ url?: string | null;
9
+ dnsPolicy?: "all-local";
10
+ };
11
+ }
12
+ export interface ConfigOverrides {
13
+ host?: string;
14
+ port?: number;
15
+ publicBaseUrl?: string;
16
+ }
17
+ export declare function configPath(env?: NodeJS.ProcessEnv): string;
18
+ export declare function readConfigFile(file?: string): FileportConfigFile;
19
+ export declare function writeConfigFile(value: FileportConfigFile, file?: string): void;
20
+ export declare function loadConfig(env?: NodeJS.ProcessEnv, overrides?: ConfigOverrides): FileportConfig;
package/dist/config.js CHANGED
@@ -1,30 +1,69 @@
1
+ import fs from "node:fs";
1
2
  import os from "node:os";
2
3
  import path from "node:path";
3
4
  import { fileURLToPath } from "node:url";
4
- function integer(value, fallback) {
5
- if (!value)
5
+ import { normalizePublicUrl } from "./network.js";
6
+ function validPort(value, fallback) {
7
+ if (value === undefined || value === null || value === "")
6
8
  return fallback;
7
9
  const result = Number(value);
8
10
  if (!Number.isInteger(result) || result < 1 || result > 65535)
9
- throw new Error(`invalid port: ${value}`);
11
+ throw new Error(`invalid port: ${String(value)}`);
10
12
  return result;
11
13
  }
12
- export function loadConfig(env = process.env) {
13
- const stateHome = env.XDG_STATE_HOME || path.join(os.homedir(), ".local", "state");
14
- let publicBaseUrl = env.FILEPORT_PUBLIC_BASE_URL;
15
- if (publicBaseUrl) {
16
- const parsed = new URL(publicBaseUrl);
17
- if (parsed.protocol !== "http:")
18
- throw new Error("Fileport supports HTTP only; FILEPORT_PUBLIC_BASE_URL must use http://");
19
- publicBaseUrl = publicBaseUrl.replace(/\/$/, "");
14
+ export function configPath(env = process.env) { const home = env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config"); return path.resolve(env.FILEPORT_CONFIG_FILE || path.join(home, "fileport", "config.json")); }
15
+ export function readConfigFile(file = configPath()) {
16
+ try {
17
+ const value = JSON.parse(fs.readFileSync(file, "utf8"));
18
+ if (!value || typeof value !== "object" || Array.isArray(value))
19
+ throw new Error("must be an object");
20
+ return value;
20
21
  }
22
+ catch (error) {
23
+ if (error.code === "ENOENT")
24
+ return {};
25
+ throw new Error(`invalid Fileport config ${file}: ${error instanceof Error ? error.message : String(error)}`);
26
+ }
27
+ }
28
+ export function writeConfigFile(value, file = configPath()) {
29
+ const dir = path.dirname(file);
30
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
31
+ fs.chmodSync(dir, 0o700);
32
+ const temp = `${file}.${process.pid}.tmp`;
33
+ let fd;
34
+ try {
35
+ fd = fs.openSync(temp, "wx", 0o600);
36
+ fs.writeFileSync(fd, `${JSON.stringify(value, null, 2)}\n`);
37
+ fs.fsyncSync(fd);
38
+ fs.closeSync(fd);
39
+ fd = undefined;
40
+ fs.renameSync(temp, file);
41
+ fs.chmodSync(file, 0o600);
42
+ const directory = fs.openSync(dir, "r");
43
+ try {
44
+ fs.fsyncSync(directory);
45
+ }
46
+ finally {
47
+ fs.closeSync(directory);
48
+ }
49
+ }
50
+ finally {
51
+ if (fd !== undefined)
52
+ try {
53
+ fs.closeSync(fd);
54
+ }
55
+ catch { }
56
+ try {
57
+ fs.unlinkSync(temp);
58
+ }
59
+ catch { }
60
+ }
61
+ }
62
+ export function loadConfig(env = process.env, overrides = {}) {
63
+ const stateHome = env.XDG_STATE_HOME || path.join(os.homedir(), ".local", "state"), file = readConfigFile(configPath(env));
64
+ const publicRaw = overrides.publicBaseUrl ?? env.FILEPORT_PUBLIC_BASE_URL ?? file.public?.url ?? undefined;
65
+ const publicBaseUrl = publicRaw ? normalizePublicUrl(publicRaw).toString().replace(/\/$/, "") : undefined;
21
66
  const packagedDufs = fileURLToPath(new URL("../vendor/dufs", import.meta.url));
22
- return {
23
- stateDir: path.resolve(env.FILEPORT_STATE_DIR || path.join(stateHome, "fileport")),
24
- host: env.FILEPORT_HOST || "0.0.0.0",
25
- port: integer(env.FILEPORT_PORT, 7892),
26
- dufsBin: path.resolve(env.FILEPORT_DUFS_BIN || packagedDufs),
27
- publicBaseUrl,
28
- };
67
+ return { stateDir: path.resolve(env.FILEPORT_STATE_DIR || path.join(stateHome, "fileport")), host: overrides.host ?? env.FILEPORT_HOST ?? file.bind?.host ?? "0.0.0.0", port: validPort(overrides.port ?? env.FILEPORT_PORT ?? file.bind?.port, 7892), dufsBin: path.resolve(env.FILEPORT_DUFS_BIN || packagedDufs), publicBaseUrl, configFile: configPath(env) };
29
68
  }
30
69
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,SAAS,OAAO,CAAC,KAAyB,EAAE,QAAgB;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IACzG,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnF,IAAI,aAAa,GAAG,GAAG,CAAC,wBAAwB,CAAC;IACjD,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC3H,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAClF,IAAI,EAAE,GAAG,CAAC,aAAa,IAAI,SAAS;QACpC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;QACtC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,YAAY,CAAC;QAC5D,aAAa;KACd,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/gateway.d.ts CHANGED
@@ -1,9 +1,11 @@
1
+ import { PublicAddressResolver } from "./network.js";
1
2
  import { ShareRegistry } from "./registry.js";
2
3
  import { SaveManager } from "./save.js";
3
4
  import type { FileportConfig } from "./types.js";
4
5
  import { DufsWorkerManager } from "./workers.js";
5
6
  export declare class Gateway {
6
7
  readonly config: FileportConfig;
8
+ readonly addressResolver: PublicAddressResolver;
7
9
  readonly registry: ShareRegistry;
8
10
  readonly workers: DufsWorkerManager;
9
11
  readonly saves: SaveManager;
@@ -12,8 +14,12 @@ export declare class Gateway {
12
14
  readonly controlSocket: string;
13
15
  private lockFile?;
14
16
  private readonly lockPath;
15
- constructor(config: FileportConfig);
17
+ private publicSnapshot?;
18
+ constructor(config: FileportConfig, addressResolver?: PublicAddressResolver);
16
19
  start(): Promise<void>;
20
+ private cleanupFailedStart;
21
+ private probeListener;
22
+ private probeHost;
17
23
  private handleControl;
18
24
  private handlePublic;
19
25
  close(): Promise<void>;
package/dist/gateway.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import fs from "node:fs/promises";
2
2
  import http from "node:http";
3
3
  import path from "node:path";
4
+ import { PublicAddressError, PublicAddressResolver } from "./network.js";
4
5
  import { authorizeSharePath } from "./paths.js";
5
6
  import { proxyToUnixSocket } from "./proxy.js";
6
7
  import { ShareRegistry } from "./registry.js";
@@ -21,6 +22,7 @@ catch {
21
22
  } }
22
23
  export class Gateway {
23
24
  config;
25
+ addressResolver;
24
26
  registry;
25
27
  workers;
26
28
  saves = new SaveManager();
@@ -29,8 +31,10 @@ export class Gateway {
29
31
  controlSocket;
30
32
  lockFile;
31
33
  lockPath;
32
- constructor(config) {
34
+ publicSnapshot;
35
+ constructor(config, addressResolver = new PublicAddressResolver()) {
33
36
  this.config = config;
37
+ this.addressResolver = addressResolver;
34
38
  this.registry = new ShareRegistry(config.stateDir);
35
39
  this.workers = new DufsWorkerManager(config.stateDir, config.dufsBin);
36
40
  this.controlSocket = path.join(config.stateDir, "control.sock");
@@ -56,37 +60,94 @@ export class Gateway {
56
60
  await fs.unlink(this.lockPath);
57
61
  this.lockFile = await fs.open(this.lockPath, "wx", 0o600);
58
62
  }
59
- await this.lockFile.writeFile(`${process.pid}\n`);
60
- await this.lockFile.sync();
61
- await this.registry.load();
62
63
  try {
63
- await fs.unlink(this.controlSocket);
64
+ await this.lockFile.writeFile(`${process.pid}\n`);
65
+ await this.lockFile.sync();
66
+ await this.registry.load();
67
+ this.publicSnapshot = await this.addressResolver.inspect({ host: this.config.host, port: this.config.port, publicBaseUrl: this.config.publicBaseUrl }, true);
68
+ try {
69
+ await fs.unlink(this.controlSocket);
70
+ }
71
+ catch (error) {
72
+ if (error.code !== "ENOENT")
73
+ throw error;
74
+ }
75
+ this.publicServer = http.createServer((req, res) => { void this.handlePublic(req, res).catch(error => { if (!res.headersSent)
76
+ json(res, 500, { error: "internal_error" });
77
+ else
78
+ res.destroy(); console.error(error); }); });
79
+ this.controlServer = http.createServer((req, res) => { void this.handleControl(req, res).catch(error => json(res, error instanceof SaveError ? error.status : error instanceof PublicAddressError ? 422 : 400, { error: error instanceof SaveError ? error.code : error instanceof PublicAddressError ? error.code : error instanceof Error ? error.message : String(error), message: error instanceof Error ? error.message : undefined })); });
80
+ const listeners = await Promise.allSettled([
81
+ new Promise((resolve, reject) => { this.publicServer.once("error", reject); this.publicServer.listen(this.config.port, this.config.host, resolve); }),
82
+ new Promise((resolve, reject) => { this.controlServer.once("error", reject); this.controlServer.listen(this.controlSocket, resolve); }),
83
+ ]);
84
+ const failed = listeners.find(result => result.status === "rejected");
85
+ if (failed)
86
+ throw failed.reason;
87
+ await fs.chmod(this.controlSocket, 0o600);
88
+ await this.probeListener();
64
89
  }
65
90
  catch (error) {
66
- if (error.code !== "ENOENT")
67
- throw error;
91
+ await this.cleanupFailedStart();
92
+ throw error;
93
+ }
94
+ }
95
+ async cleanupFailedStart() {
96
+ const close = async (server) => { if (!server?.listening)
97
+ return; await new Promise(resolve => server.close(() => resolve())); };
98
+ await Promise.allSettled([close(this.publicServer), close(this.controlServer), this.workers.close()]);
99
+ try {
100
+ await fs.unlink(this.controlSocket);
101
+ }
102
+ catch { }
103
+ try {
104
+ await this.lockFile?.close();
105
+ }
106
+ catch { }
107
+ finally {
108
+ this.lockFile = undefined;
109
+ }
110
+ try {
111
+ await fs.unlink(this.lockPath);
68
112
  }
69
- this.publicServer = http.createServer((req, res) => { void this.handlePublic(req, res).catch((error) => { if (!res.headersSent)
70
- json(res, 500, { error: "internal_error" });
71
- else
72
- res.destroy(); console.error(error); }); });
73
- this.controlServer = http.createServer((req, res) => { void this.handleControl(req, res).catch((error) => json(res, error instanceof SaveError ? error.status : 400, { error: error instanceof SaveError ? error.code : error instanceof Error ? error.message : String(error) })); });
74
- await Promise.all([
75
- new Promise((resolve, reject) => { this.publicServer.once("error", reject); this.publicServer.listen(this.config.port, this.config.host, resolve); }),
76
- new Promise((resolve, reject) => { this.controlServer.once("error", reject); this.controlServer.listen(this.controlSocket, resolve); }),
77
- ]);
78
- await fs.chmod(this.controlSocket, 0o600);
113
+ catch { }
114
+ }
115
+ async probeListener() {
116
+ const primary = this.config.host === "0.0.0.0" ? "127.0.0.1" : this.config.host === "::" ? "::1" : this.config.host;
117
+ const advertised = this.publicSnapshot?.dns?.resolved ?? (this.publicSnapshot?.advertisedAddress?.kind === "configured-ip" || this.publicSnapshot?.advertisedAddress?.kind === "lan-ip" ? [this.publicSnapshot.advertisedAddress.host] : []);
118
+ for (const host of [...new Set([primary, ...advertised])])
119
+ await this.probeHost(host);
79
120
  }
121
+ probeHost(host) { return new Promise((resolve, reject) => { const request = http.request({ host, port: this.config.port, path: "/healthz", method: "GET", timeout: 2000 }, response => { response.resume(); response.once("end", () => response.statusCode === 200 ? resolve() : reject(new Error(`health probe ${host} returned ${response.statusCode}`))); }); request.once("timeout", () => request.destroy(new Error(`health probe ${host} timeout`))); request.once("error", reject); request.end(); }); }
80
122
  async handleControl(req, res) {
81
123
  const url = new URL(req.url || "/", "http://localhost");
82
124
  if (req.method === "POST" && url.pathname === "/shares") {
125
+ const snapshot = await this.addressResolver.inspect({ host: this.config.host, port: this.config.port, publicBaseUrl: this.config.publicBaseUrl }, true);
126
+ if (!snapshot.publicBaseUrl)
127
+ throw new PublicAddressError("NO_LAN_ADDRESS", "no LAN IPv4 address found; connect a network or configure public.url");
128
+ this.publicSnapshot = snapshot;
83
129
  const input = await body(req);
84
130
  const share = await this.registry.create(input.path, { permission: input.permission, expiresAt: input.expiresAt });
85
- const base = this.config.publicBaseUrl || `http://127.0.0.1:${this.config.port}`;
86
- return json(res, 201, { share, url: `${base}/s/${share.id}/` });
131
+ return json(res, 201, { share, url: `${snapshot.publicBaseUrl}/s/${share.id}/`, publicBaseUrl: snapshot.publicBaseUrl, advertisedAddress: snapshot.advertisedAddress });
87
132
  }
88
133
  if (req.method === "GET" && url.pathname === "/shares")
89
134
  return json(res, 200, { shares: this.registry.list() });
135
+ if (req.method === "GET" && url.pathname === "/doctor") {
136
+ try {
137
+ this.publicSnapshot = await this.addressResolver.inspect({ host: this.config.host, port: this.config.port, publicBaseUrl: this.config.publicBaseUrl }, true);
138
+ return json(res, 200, { bind: { host: this.config.host, port: this.config.port }, ...this.publicSnapshot });
139
+ }
140
+ catch (error) {
141
+ return json(res, 200, { status: "error", bind: { host: this.config.host, port: this.config.port }, error: error instanceof PublicAddressError ? { code: error.code, message: error.message } : { code: "NETWORK_ERROR", message: String(error) } });
142
+ }
143
+ }
144
+ if (req.method === "GET" && url.pathname === "/status")
145
+ return json(res, 200, { status: "ready", protocolVersion: 1, pid: process.pid, bind: { host: this.config.host, port: this.config.port }, publicBaseUrl: this.publicSnapshot?.publicBaseUrl, advertisedAddress: this.publicSnapshot?.advertisedAddress, public: this.publicSnapshot, shares: this.registry.list().length });
146
+ if (req.method === "POST" && url.pathname === "/shutdown") {
147
+ json(res, 200, { ok: true, pid: process.pid });
148
+ setImmediate(() => { void this.close(); });
149
+ return;
150
+ }
90
151
  const revoke = url.pathname.match(/^\/shares\/([A-Za-z0-9_-]+)$/);
91
152
  if (req.method === "DELETE" && revoke)
92
153
  return json(res, (await this.registry.revoke(revoke[1])) ? 200 : 404, { ok: true });
@@ -165,7 +226,7 @@ export class Gateway {
165
226
  await proxyToUnixSocket(req, res, worker.socket, `/${upstreamRelative}${query}`, `/s/${share.id}/fs/`);
166
227
  }
167
228
  async close() {
168
- const close = (server) => server ? new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve())) : Promise.resolve();
229
+ const close = (server) => server?.listening ? new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve())) : Promise.resolve();
169
230
  await Promise.all([close(this.publicServer), close(this.controlServer)]);
170
231
  await this.workers.close();
171
232
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import os from "node:os";
2
+ import type { NetworkInterfaceInfo } from "node:os";
3
+ export interface AddressCandidate {
4
+ interface: string;
5
+ address: string;
6
+ family: "IPv4" | "IPv6";
7
+ rank: number;
8
+ reason: string;
9
+ }
10
+ export interface DnsSnapshot {
11
+ hostname: string;
12
+ cnameChain: string[];
13
+ resolved: string[];
14
+ localMatches: string[];
15
+ checkedAt: string;
16
+ }
17
+ export interface AdvertisedAddress {
18
+ kind: "lan-ip" | "configured-hostname" | "configured-ip" | "local-only";
19
+ host: string;
20
+ validatedAt: string;
21
+ }
22
+ export interface PublicSnapshot {
23
+ status: "ok" | "degraded" | "local-only";
24
+ publicBaseUrl?: string;
25
+ selectedLanIp?: string;
26
+ candidates: AddressCandidate[];
27
+ advertisedAddress?: AdvertisedAddress;
28
+ dns?: DnsSnapshot;
29
+ warnings: string[];
30
+ }
31
+ export interface NetworkAdapter {
32
+ interfaces(): NodeJS.Dict<NetworkInterfaceInfo[]>;
33
+ defaultInterface(): Promise<string | undefined>;
34
+ resolve4(hostname: string): Promise<string[]>;
35
+ resolve6(hostname: string): Promise<string[]>;
36
+ resolveCname(hostname: string): Promise<string[]>;
37
+ now(): Date;
38
+ }
39
+ export declare class PublicAddressError extends Error {
40
+ readonly code: string;
41
+ constructor(code: string, message: string);
42
+ }
43
+ export declare class SystemNetworkAdapter implements NetworkAdapter {
44
+ interfaces(): NodeJS.Dict<os.NetworkInterfaceInfo[]>;
45
+ defaultInterface(): Promise<string | undefined>;
46
+ resolve4(hostname: string): Promise<string[]>;
47
+ resolve6(hostname: string): Promise<string[]>;
48
+ resolveCname(hostname: string): Promise<string[]>;
49
+ now(): Date;
50
+ }
51
+ export declare function localAddresses(adapter: NetworkAdapter): Set<string>;
52
+ export declare function lanCandidates(adapter: NetworkAdapter): Promise<AddressCandidate[]>;
53
+ export declare class PublicAddressResolver {
54
+ private readonly adapter;
55
+ private readonly ttlMs;
56
+ private cache?;
57
+ constructor(adapter?: NetworkAdapter, ttlMs?: number);
58
+ inspect(input: {
59
+ host: string;
60
+ port: number;
61
+ publicBaseUrl?: string;
62
+ }, fresh?: boolean): Promise<PublicSnapshot>;
63
+ }
64
+ export declare function normalizePublicUrl(value: string): URL;
@@ -0,0 +1,190 @@
1
+ import dns from "node:dns/promises";
2
+ import fs from "node:fs/promises";
3
+ import net from "node:net";
4
+ import os from "node:os";
5
+ export class PublicAddressError extends Error {
6
+ code;
7
+ constructor(code, message) {
8
+ super(message);
9
+ this.code = code;
10
+ }
11
+ }
12
+ function isPrivate4(ip) {
13
+ const [a, b] = ip.split(".").map(Number);
14
+ return a === 10 || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168);
15
+ }
16
+ function validLan4(ip) {
17
+ const [a, b] = ip.split(".").map(Number);
18
+ return net.isIPv4(ip) && a !== 0 && a !== 127 && !(a === 169 && b === 254) && a < 224;
19
+ }
20
+ function ignoredInterface(name) { return /^(lo|docker\d*|br-|veth|virbr|tun|tap|wg|tailscale|cni|flannel)/i.test(name); }
21
+ function normalizeIp(ip) { return ip.toLowerCase().replace(/%.+$/, ""); }
22
+ export class SystemNetworkAdapter {
23
+ interfaces() { return os.networkInterfaces(); }
24
+ async defaultInterface() {
25
+ if (process.platform !== "linux")
26
+ return undefined;
27
+ try {
28
+ const rows = (await fs.readFile("/proc/net/route", "utf8")).trim().split("\n").slice(1);
29
+ return rows.map(row => row.trim().split(/\s+/)).find(cols => cols[1] === "00000000" && (Number.parseInt(cols[3], 16) & 2) !== 0)?.[0];
30
+ }
31
+ catch {
32
+ return undefined;
33
+ }
34
+ }
35
+ resolve4(hostname) { return dns.resolve4(hostname); }
36
+ resolve6(hostname) { return dns.resolve6(hostname); }
37
+ resolveCname(hostname) { return dns.resolveCname(hostname); }
38
+ now() { return new Date(); }
39
+ }
40
+ export function localAddresses(adapter) {
41
+ const values = new Set();
42
+ for (const infos of Object.values(adapter.interfaces()))
43
+ for (const info of infos ?? [])
44
+ values.add(normalizeIp(info.address));
45
+ values.add("127.0.0.1");
46
+ values.add("::1");
47
+ return values;
48
+ }
49
+ export async function lanCandidates(adapter) {
50
+ const preferred = await adapter.defaultInterface();
51
+ const result = [];
52
+ for (const [name, infos] of Object.entries(adapter.interfaces())) {
53
+ if (ignoredInterface(name))
54
+ continue;
55
+ for (const info of infos ?? []) {
56
+ const family = String(info.family);
57
+ if (family !== "IPv4" || info.internal || !validLan4(info.address))
58
+ continue;
59
+ const rank = (name === preferred ? 0 : 100) + (isPrivate4(info.address) ? 0 : 10);
60
+ result.push({ interface: name, address: info.address, family: "IPv4", rank, reason: name === preferred ? "default-route-interface" : isPrivate4(info.address) ? "private-lan-ipv4" : "global-ipv4" });
61
+ }
62
+ }
63
+ return result.sort((a, b) => a.rank - b.rank || a.interface.localeCompare(b.interface) || a.address.localeCompare(b.address));
64
+ }
65
+ function isShareableResolvedAddress(address) {
66
+ const ip = normalizeIp(address);
67
+ if (net.isIPv4(ip)) {
68
+ const [a, b] = ip.split(".").map(Number);
69
+ return a !== 0 && a !== 127 && !(a === 169 && b === 254) && a < 224;
70
+ }
71
+ if (net.isIPv6(ip))
72
+ return ip !== "::" && ip !== "::1" && !ip.startsWith("fe80:") && !ip.startsWith("ff");
73
+ return false;
74
+ }
75
+ function bindCovers(host, address) {
76
+ const bind = normalizeIp(host), target = normalizeIp(address);
77
+ if (bind === "0.0.0.0")
78
+ return net.isIPv4(target);
79
+ if (bind === "::")
80
+ return net.isIP(target) !== 0;
81
+ return bind === target;
82
+ }
83
+ async function cnameChain(hostname, adapter) {
84
+ const chain = [];
85
+ const seen = new Set([hostname.toLowerCase()]);
86
+ let current = hostname;
87
+ for (let i = 0; i < 8; i++) {
88
+ let names;
89
+ try {
90
+ names = await adapter.resolveCname(current);
91
+ }
92
+ catch (error) {
93
+ const code = error.code;
94
+ if (["ENODATA", "ENOTFOUND", "ENODOMAIN"].includes(code ?? ""))
95
+ return chain;
96
+ throw error;
97
+ }
98
+ if (!names.length)
99
+ return chain;
100
+ const next = names[0].toLowerCase();
101
+ if (seen.has(next))
102
+ throw new PublicAddressError("DNS_CNAME_LOOP", `CNAME loop while resolving ${hostname}`);
103
+ chain.push(next);
104
+ seen.add(next);
105
+ current = next;
106
+ }
107
+ throw new PublicAddressError("DNS_CNAME_LIMIT", `CNAME chain for ${hostname} exceeds 8 hops`);
108
+ }
109
+ async function resolveAll(hostname, adapter) {
110
+ const chain = await cnameChain(hostname, adapter);
111
+ const target = chain.at(-1) ?? hostname;
112
+ const settled = await Promise.allSettled([adapter.resolve4(target), adapter.resolve6(target)]);
113
+ const addresses = [...new Set(settled.flatMap(value => value.status === "fulfilled" ? value.value : []).map(normalizeIp))].sort();
114
+ if (!addresses.length) {
115
+ const reason = settled.find(value => value.status === "rejected");
116
+ const code = reason?.reason?.code ?? "DNS_EMPTY";
117
+ throw new PublicAddressError("DNS_LOOKUP_FAILED", `cannot verify public host ${hostname} (${code}); refusing to issue share URL`);
118
+ }
119
+ return { addresses, chain };
120
+ }
121
+ export class PublicAddressResolver {
122
+ adapter;
123
+ ttlMs;
124
+ cache;
125
+ constructor(adapter = new SystemNetworkAdapter(), ttlMs = 30_000) {
126
+ this.adapter = adapter;
127
+ this.ttlMs = ttlMs;
128
+ }
129
+ async inspect(input, fresh = false) {
130
+ const key = JSON.stringify(input), now = this.adapter.now();
131
+ if (!fresh && this.cache?.key === key && now.getTime() - this.cache.at < this.ttlMs)
132
+ return this.cache.snapshot;
133
+ const candidates = await lanCandidates(this.adapter), warnings = [];
134
+ let snapshot;
135
+ if (!input.publicBaseUrl) {
136
+ const selected = candidates.find(candidate => bindCovers(input.host, candidate.address));
137
+ snapshot = selected ? { status: "ok", publicBaseUrl: `http://${selected.address}:${input.port}`, selectedLanIp: selected.address, candidates, advertisedAddress: { kind: "lan-ip", host: selected.address, validatedAt: now.toISOString() }, warnings }
138
+ : { status: "local-only", publicBaseUrl: undefined, candidates, warnings: [candidates.length ? `bind host ${input.host} does not cover any LAN IPv4 candidate` : "no LAN IPv4 address found; connect a network or configure public.url"] };
139
+ }
140
+ else {
141
+ const url = normalizePublicUrl(input.publicBaseUrl);
142
+ const expectedPort = input.port === 80 ? "" : String(input.port);
143
+ if (url.port !== expectedPort)
144
+ throw new PublicAddressError("PUBLIC_PORT_MISMATCH", `public URL port ${url.port || 80} does not match listener port ${input.port}`);
145
+ const hostname = url.hostname.replace(/^\[|\]$/g, "");
146
+ const locals = localAddresses(this.adapter);
147
+ const ipKind = net.isIP(hostname);
148
+ if (ipKind) {
149
+ const normalized = normalizeIp(hostname);
150
+ if (!locals.has(normalized))
151
+ throw new PublicAddressError("PUBLIC_IP_NOT_LOCAL", `public IP ${hostname} is not assigned to this machine`);
152
+ if (!bindCovers(input.host, normalized))
153
+ throw new PublicAddressError("PUBLIC_IP_NOT_BOUND", `bind host ${input.host} does not cover public IP ${hostname}`);
154
+ snapshot = { status: "ok", publicBaseUrl: url.toString().replace(/\/$/, ""), candidates, advertisedAddress: { kind: normalized === "127.0.0.1" || normalized === "::1" ? "local-only" : "configured-ip", host: hostname, validatedAt: now.toISOString() }, warnings };
155
+ }
156
+ else {
157
+ const { addresses, chain } = await resolveAll(hostname, this.adapter), matches = addresses.filter(a => locals.has(a));
158
+ const unshareable = addresses.filter(a => !isShareableResolvedAddress(a));
159
+ if (unshareable.length)
160
+ throw new PublicAddressError("DNS_UNSHAREABLE_ADDRESS", `public host ${hostname} resolves to non-shareable addresses [${unshareable.join(", ")}]`);
161
+ const nonLocal = addresses.filter(a => !locals.has(a));
162
+ if (nonLocal.length)
163
+ throw new PublicAddressError("DNS_NOT_ALL_LOCAL", `public host ${hostname} resolves to [${addresses.join(", ")}]; non-local addresses [${nonLocal.join(", ")}] are forbidden`);
164
+ const uncovered = addresses.filter(a => !bindCovers(input.host, a));
165
+ if (uncovered.length)
166
+ throw new PublicAddressError("DNS_NOT_BOUND", `bind host ${input.host} does not cover resolved addresses [${uncovered.join(", ")}]`);
167
+ snapshot = { status: "ok", publicBaseUrl: url.toString().replace(/\/$/, ""), candidates, advertisedAddress: { kind: "configured-hostname", host: hostname, validatedAt: now.toISOString() }, dns: { hostname, cnameChain: chain, resolved: addresses, localMatches: matches, checkedAt: now.toISOString() }, warnings };
168
+ }
169
+ }
170
+ this.cache = { key, at: now.getTime(), snapshot };
171
+ return snapshot;
172
+ }
173
+ }
174
+ export function normalizePublicUrl(value) {
175
+ let url;
176
+ try {
177
+ url = new URL(value);
178
+ }
179
+ catch {
180
+ throw new PublicAddressError("INVALID_PUBLIC_URL", `invalid public URL: ${value}`);
181
+ }
182
+ if (url.protocol !== "http:")
183
+ throw new PublicAddressError("INVALID_PUBLIC_URL", "Fileport supports HTTP only");
184
+ if (url.username || url.password || url.search || url.hash)
185
+ throw new PublicAddressError("INVALID_PUBLIC_URL", "public URL must not contain userinfo, query, or fragment");
186
+ if (url.pathname !== "/" && url.pathname !== "")
187
+ throw new PublicAddressError("INVALID_PUBLIC_URL", "public URL must not contain a path");
188
+ return url;
189
+ }
190
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -15,4 +15,5 @@ export interface FileportConfig {
15
15
  port: number;
16
16
  dufsBin: string;
17
17
  publicBaseUrl?: string;
18
+ configFile: string;
18
19
  }
@@ -0,0 +1,38 @@
1
+ # Network advertisement, DNS validation, and CLI contract
2
+
3
+ ## Bind versus advertised URL
4
+
5
+ `bind.host`/`bind.port` control the HTTP listener. `public.url` controls only generated share URLs. A hostname is never passed to `listen()`.
6
+
7
+ Priority: command flags > environment > `~/.config/fileport/config.json` > defaults.
8
+
9
+ ```json
10
+ {
11
+ "bind": { "host": "0.0.0.0", "port": 7892 },
12
+ "public": { "url": "http://files.example.com:7892", "dnsPolicy": "all-local" }
13
+ }
14
+ ```
15
+
16
+ The config directory is 0700 and file 0600. Restart Fileport after persistent config changes.
17
+
18
+ ## Automatic LAN URL
19
+
20
+ Without `public.url`, Fileport selects a non-loopback IPv4 on the default-route interface, excluding link-local and common virtual interfaces. Private IPv4 is preferred. IPv6 is used only when explicitly configured. If no listener-covered LAN IPv4 exists, the daemon may run local-only but new shares fail closed.
21
+
22
+ ## Strict DNS policy
23
+
24
+ Configured hostnames are resolved through CNAME (maximum eight hops), A, and AAAA. Every final address must:
25
+
26
+ 1. be a shareable non-loopback address;
27
+ 2. exist on a local network interface; and
28
+ 3. be covered by the listener.
29
+
30
+ Mixed local/remote DNS is rejected. Dual-stack DNS requires a dual-stack listener such as `bind.host="::"`. DNS is checked at startup and before each new share. Existing capabilities are not rewritten if DNS later drifts.
31
+
32
+ ## Agent contract
33
+
34
+ All operational commands accept `--json`. In JSON mode stdout contains exactly one JSON object; diagnostics use stderr. Default `share` stdout remains the URL only.
35
+
36
+ Exit codes: 0 success, 2 usage, 3 invalid config, 4 DNS/public-address validation, 5 daemon/bind/runtime unavailable, 6 missing share.
37
+
38
+ Use `fileport doctor --json` to inspect candidates, selected address, DNS chain/resolution/local matches, and warnings.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fileport-gateway",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Secure Agent Artifact Gateway with capability URLs, strict saves, and Dufs-backed file serving.",
5
5
  "type": "module",
6
6
  "bin": {