fileport-gateway 0.1.2 → 0.1.4

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>;