@kraki/head 0.10.4 → 0.11.1
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/dist/account-api.d.ts +35 -0
- package/dist/account-api.js +254 -0
- package/dist/account-api.js.map +1 -0
- package/dist/auth-backend.d.ts +93 -0
- package/dist/auth-backend.js +11 -0
- package/dist/auth-backend.js.map +1 -0
- package/dist/cli.js +251 -58
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/ip-geo.d.ts +22 -0
- package/dist/ip-geo.js +89 -0
- package/dist/ip-geo.js.map +1 -0
- package/dist/local-auth-backend.d.ts +109 -0
- package/dist/local-auth-backend.js +421 -0
- package/dist/local-auth-backend.js.map +1 -0
- package/dist/remote-auth-backend.d.ts +48 -0
- package/dist/remote-auth-backend.js +89 -0
- package/dist/remote-auth-backend.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.js +154 -24
- package/dist/server.js.map +1 -1
- package/dist/storage.d.ts +44 -1
- package/dist/storage.js +220 -9
- package/dist/storage.js.map +1 -1
- package/package.json +2 -3
package/dist/cli.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* LOG_PATH Log file path (optional)
|
|
18
18
|
*/
|
|
19
19
|
import { config as dotenvConfig } from 'dotenv';
|
|
20
|
-
import { readFileSync } from 'fs';
|
|
20
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
21
21
|
import { resolve, dirname } from 'path';
|
|
22
22
|
import { fileURLToPath } from 'url';
|
|
23
23
|
// Load .env from the head package directory (works regardless of cwd)
|
|
@@ -31,13 +31,23 @@ import { HeadServer } from './server.js';
|
|
|
31
31
|
import { GitHubAuthProvider, OpenAuthProvider, ApiKeyAuthProvider, ThrottledAuthProvider, safeEqual } from './auth.js';
|
|
32
32
|
import { Logger, setGlobalLogger } from './logger.js';
|
|
33
33
|
import { PushManager, ApnsProvider, WebPushProvider } from './push/index.js';
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
import { LocalAuthBackend } from './local-auth-backend.js';
|
|
35
|
+
import { RemoteAuthBackend } from './remote-auth-backend.js';
|
|
36
|
+
import { AccountApi } from './account-api.js';
|
|
37
|
+
// --- CLI flags / subcommands ---
|
|
38
|
+
const rawArgs = process.argv.slice(2);
|
|
39
|
+
const COMMAND = rawArgs[0] && !rawArgs[0].startsWith('-') ? rawArgs[0] : 'start';
|
|
40
|
+
const args = COMMAND === 'start' ? rawArgs : rawArgs.slice(1);
|
|
41
|
+
const ENV_PATH = resolve(__dirname, '..', '.env');
|
|
36
42
|
if (args.includes('--help') || args.includes('-h')) {
|
|
37
43
|
console.log(`
|
|
38
44
|
🦑 @kraki/head v${VERSION} — CLI entry point for the Kraki relay server.
|
|
39
45
|
|
|
40
|
-
Usage:
|
|
46
|
+
Usage:
|
|
47
|
+
kraki-relay start [options]
|
|
48
|
+
kraki-relay register-edge
|
|
49
|
+
kraki-relay join --main <https-url> --token <token> --region <code> --relay-url <wss-url>
|
|
50
|
+
kraki-relay list-regions [--db <path>]
|
|
41
51
|
|
|
42
52
|
Options:
|
|
43
53
|
--port <n> Server port (default: 4000, env: PORT)
|
|
@@ -49,10 +59,19 @@ if (args.includes('--help') || args.includes('-h')) {
|
|
|
49
59
|
--help, -h Show this help
|
|
50
60
|
--version, -v Show version
|
|
51
61
|
|
|
62
|
+
Multi-region (connected mode):
|
|
63
|
+
--mode <name> main | edge (env: HEAD_MODE)
|
|
64
|
+
--account-url <url> Remote account service URL (env: ACCOUNT_URL)
|
|
65
|
+
When set, auth is delegated to the account service.
|
|
66
|
+
--service-key <key> Service API key for account service (env: SERVICE_KEY)
|
|
67
|
+
--region <name> This head's region identifier (env: REGION)
|
|
68
|
+
--public-relay-url <url> Public relay URL for this head (env: PUBLIC_RELAY_URL)
|
|
69
|
+
--region-urls <json> Region → relay URL map, JSON (env: REGION_URLS, legacy fallback)
|
|
70
|
+
Example: '{"us":"wss://us.example.com","cn":"wss://cn.example.com"}'
|
|
71
|
+
|
|
52
72
|
GitHub OAuth (env only, for web login):
|
|
53
73
|
GITHUB_CLIENT_ID GitHub OAuth App client ID
|
|
54
74
|
GITHUB_CLIENT_SECRET GitHub OAuth App client secret
|
|
55
|
-
GITHUB_PROXY HTTP/SOCKS proxy for GitHub API calls (e.g. http://127.0.0.1:1081)
|
|
56
75
|
|
|
57
76
|
APNs push notifications (env only):
|
|
58
77
|
APNS_KEY_PATH Path to .p8 private key file
|
|
@@ -89,25 +108,140 @@ const API_KEY = process.env.API_KEY;
|
|
|
89
108
|
const ADMIN_KEY = flag('admin-key', process.env.ADMIN_KEY || '');
|
|
90
109
|
const GITHUB_CLIENT_ID = process.env.GITHUB_CLIENT_ID;
|
|
91
110
|
const GITHUB_CLIENT_SECRET = process.env.GITHUB_CLIENT_SECRET;
|
|
92
|
-
const GITHUB_PROXY = process.env.GITHUB_PROXY;
|
|
93
111
|
const PAIRING = process.env.PAIRING_ENABLED !== 'false'; // default true
|
|
94
112
|
const LOG_LEVEL = flag('log', process.env.LOG_LEVEL || 'info');
|
|
95
113
|
const LOG_PATH = process.env.LOG_PATH;
|
|
96
114
|
const PUSH_PROVIDERS = flag('push', process.env.PUSH_PROVIDERS || '').split(',').map(s => s.trim()).filter(Boolean);
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
115
|
+
// --- Multi-region flags ---
|
|
116
|
+
const MODE = flag('mode', process.env.HEAD_MODE || process.env.MODE || '');
|
|
117
|
+
const ACCOUNT_URL = flag('account-url', process.env.ACCOUNT_URL || '');
|
|
118
|
+
const SERVICE_KEY = flag('service-key', process.env.SERVICE_KEY || '');
|
|
119
|
+
const REGION = flag('region', process.env.REGION || '');
|
|
120
|
+
const PUBLIC_RELAY_URL = flag('public-relay-url', process.env.PUBLIC_RELAY_URL || '');
|
|
121
|
+
const REGION_DISPLAY_NAME = flag('display-name', process.env.REGION_DISPLAY_NAME || '');
|
|
122
|
+
const MAIN_URL = flag('main-url', process.env.MAIN_URL || '');
|
|
123
|
+
const REGION_URLS_RAW = flag('region-urls', process.env.REGION_URLS || '');
|
|
124
|
+
let REGION_URLS = {};
|
|
125
|
+
if (REGION_URLS_RAW) {
|
|
126
|
+
try {
|
|
127
|
+
REGION_URLS = JSON.parse(REGION_URLS_RAW);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
console.error('Error: --region-urls must be valid JSON');
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const IS_CONNECTED_MODE = MODE === 'edge' ? true : MODE === 'main' ? false : !!ACCOUNT_URL;
|
|
135
|
+
function normalizeBaseUrl(url) {
|
|
136
|
+
return url.replace(/\/+$/, '');
|
|
137
|
+
}
|
|
138
|
+
function formatEnvValue(value) {
|
|
139
|
+
return /^[A-Za-z0-9_./:@-]+$/.test(value) ? value : JSON.stringify(value);
|
|
140
|
+
}
|
|
141
|
+
function upsertEnvFile(path, updates) {
|
|
142
|
+
const existing = existsSync(path) ? readFileSync(path, 'utf-8').split(/\r?\n/) : [];
|
|
143
|
+
const byKey = new Map(Object.entries(updates).filter(([, value]) => value !== ''));
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
const nextLines = existing.map((line) => {
|
|
146
|
+
const match = line.match(/^([A-Z0-9_]+)=/);
|
|
147
|
+
if (!match)
|
|
148
|
+
return line;
|
|
149
|
+
const key = match[1];
|
|
150
|
+
const replacement = byKey.get(key);
|
|
151
|
+
if (replacement === undefined)
|
|
152
|
+
return line;
|
|
153
|
+
seen.add(key);
|
|
154
|
+
return `${key}=${formatEnvValue(replacement)}`;
|
|
155
|
+
});
|
|
156
|
+
for (const [key, value] of byKey.entries()) {
|
|
157
|
+
if (!seen.has(key))
|
|
158
|
+
nextLines.push(`${key}=${formatEnvValue(value)}`);
|
|
159
|
+
}
|
|
160
|
+
writeFileSync(path, `${nextLines.filter(line => line.trim().length > 0).join('\n')}\n`, 'utf-8');
|
|
161
|
+
}
|
|
162
|
+
async function runSubcommand() {
|
|
163
|
+
if (COMMAND === 'start')
|
|
164
|
+
return;
|
|
165
|
+
if (COMMAND === 'register-edge') {
|
|
166
|
+
if (IS_CONNECTED_MODE) {
|
|
167
|
+
console.error('register-edge is only available on the main/standalone head');
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
const storage = new Storage(DB_PATH);
|
|
171
|
+
try {
|
|
172
|
+
const issued = storage.issueEdgeJoinToken();
|
|
173
|
+
console.log(JSON.stringify({
|
|
174
|
+
token: issued.token,
|
|
175
|
+
expiresIn: issued.expiresIn,
|
|
176
|
+
}, null, 2));
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
storage.close();
|
|
180
|
+
}
|
|
181
|
+
process.exit(0);
|
|
182
|
+
}
|
|
183
|
+
if (COMMAND === 'join') {
|
|
184
|
+
const token = flag('token', process.env.JOIN_TOKEN || '');
|
|
185
|
+
const main = flag('main', MAIN_URL);
|
|
186
|
+
const joinRegion = flag('region', REGION);
|
|
187
|
+
const joinRelayUrl = flag('relay-url', PUBLIC_RELAY_URL);
|
|
188
|
+
const joinDisplayName = flag('display-name', REGION_DISPLAY_NAME);
|
|
189
|
+
if (!token || !main || !joinRegion || !joinRelayUrl) {
|
|
190
|
+
console.error('Usage: kraki-relay join --main <https-url> --token <token> --region <code> --relay-url <wss-url> [--display-name <name>]');
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
let response;
|
|
194
|
+
let data;
|
|
195
|
+
try {
|
|
196
|
+
response = await fetch(`${normalizeBaseUrl(main)}/api/edge/join`, {
|
|
197
|
+
method: 'POST',
|
|
198
|
+
headers: { 'Content-Type': 'application/json' },
|
|
199
|
+
body: JSON.stringify({ token, region: joinRegion, relayUrl: joinRelayUrl, displayName: joinDisplayName || undefined }),
|
|
200
|
+
signal: AbortSignal.timeout(15_000),
|
|
201
|
+
});
|
|
202
|
+
data = await response.json();
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
console.error(`Edge join failed: ${err.message}`);
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
if (!response.ok || !data.ok || !data.region || !data.relayUrl || !data.serviceKey) {
|
|
209
|
+
console.error(`Edge join failed: ${data.message ?? `HTTP ${response.status}`}`);
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
upsertEnvFile(ENV_PATH, {
|
|
213
|
+
HEAD_MODE: 'edge',
|
|
214
|
+
ACCOUNT_URL: normalizeBaseUrl(main),
|
|
215
|
+
SERVICE_KEY: data.serviceKey,
|
|
216
|
+
REGION: data.region,
|
|
217
|
+
PUBLIC_RELAY_URL: data.relayUrl,
|
|
218
|
+
});
|
|
219
|
+
console.log(`Joined main at ${normalizeBaseUrl(main)} as region "${data.region}".`);
|
|
220
|
+
console.log(`Saved ACCOUNT_URL, SERVICE_KEY, REGION, and PUBLIC_RELAY_URL to ${ENV_PATH}`);
|
|
221
|
+
process.exit(0);
|
|
222
|
+
}
|
|
223
|
+
if (COMMAND === 'list-regions') {
|
|
224
|
+
const storage = new Storage(DB_PATH);
|
|
101
225
|
try {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
226
|
+
console.log(JSON.stringify({
|
|
227
|
+
version: storage.getRegionVersion(),
|
|
228
|
+
regions: storage.getRegions(false),
|
|
229
|
+
}, null, 2));
|
|
106
230
|
}
|
|
107
|
-
|
|
108
|
-
|
|
231
|
+
finally {
|
|
232
|
+
storage.close();
|
|
109
233
|
}
|
|
234
|
+
process.exit(0);
|
|
110
235
|
}
|
|
236
|
+
console.error(`Unknown command "${COMMAND}". Use --help for usage.`);
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
await runSubcommand();
|
|
240
|
+
if (IS_CONNECTED_MODE && !ACCOUNT_URL) {
|
|
241
|
+
console.error('Error: --account-url is required in edge/connected mode');
|
|
242
|
+
process.exit(1);
|
|
243
|
+
}
|
|
244
|
+
async function createAuthProviders() {
|
|
111
245
|
const providers = new Map();
|
|
112
246
|
for (const mode of AUTH_MODES) {
|
|
113
247
|
switch (mode) {
|
|
@@ -120,7 +254,6 @@ async function createAuthProviders() {
|
|
|
120
254
|
const ghProvider = new GitHubAuthProvider({
|
|
121
255
|
clientId: GITHUB_CLIENT_ID,
|
|
122
256
|
clientSecret: GITHUB_CLIENT_SECRET,
|
|
123
|
-
...(ghFetcher && { fetcher: ghFetcher }),
|
|
124
257
|
});
|
|
125
258
|
providers.set('github', new ThrottledAuthProvider(ghProvider));
|
|
126
259
|
if (GITHUB_CLIENT_ID && GITHUB_CLIENT_SECRET) {
|
|
@@ -151,59 +284,115 @@ const logger = new Logger({
|
|
|
151
284
|
stdout: true,
|
|
152
285
|
});
|
|
153
286
|
setGlobalLogger(logger);
|
|
154
|
-
logger.info('Kraki Head starting...');
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
287
|
+
logger.info('Kraki Head starting...', { mode: IS_CONNECTED_MODE ? 'connected' : 'standalone', region: REGION || '(none)' });
|
|
288
|
+
// --- Auth backend setup ---
|
|
289
|
+
let authBackend;
|
|
290
|
+
let accountApi;
|
|
291
|
+
let storage;
|
|
158
292
|
let pushManager;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
293
|
+
let directAuthProviders;
|
|
294
|
+
if (IS_CONNECTED_MODE) {
|
|
295
|
+
// Connected mode: delegate auth to remote account service
|
|
296
|
+
if (!SERVICE_KEY) {
|
|
297
|
+
console.error('Error: --service-key required when --account-url is set');
|
|
298
|
+
process.exit(1);
|
|
299
|
+
}
|
|
300
|
+
const remoteBackend = new RemoteAuthBackend({ accountUrl: ACCOUNT_URL, serviceKey: SERVICE_KEY });
|
|
301
|
+
authBackend = remoteBackend;
|
|
302
|
+
// Fetch config from account service
|
|
303
|
+
await remoteBackend.refreshConfig();
|
|
304
|
+
logger.info('Connected to account service', { url: ACCOUNT_URL, region: REGION });
|
|
305
|
+
// Connected mode still needs local storage for devices, pending, push tokens
|
|
306
|
+
storage = new Storage(DB_PATH);
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
// Standalone mode: local auth + expose account API
|
|
310
|
+
const authProviders = await createAuthProviders();
|
|
311
|
+
directAuthProviders = authProviders;
|
|
312
|
+
storage = new Storage(DB_PATH);
|
|
313
|
+
if (REGION && PUBLIC_RELAY_URL) {
|
|
314
|
+
storage.upsertRegion(REGION, PUBLIC_RELAY_URL, REGION_DISPLAY_NAME || REGION, true);
|
|
315
|
+
}
|
|
316
|
+
// Push providers (standalone only — in connected mode, push is handled by the account service's head)
|
|
317
|
+
if (PUSH_PROVIDERS.length > 0) {
|
|
318
|
+
const pushProviderInstances = [];
|
|
319
|
+
for (const provider of PUSH_PROVIDERS) {
|
|
320
|
+
switch (provider) {
|
|
321
|
+
case 'apns': {
|
|
322
|
+
const keyPath = process.env.APNS_KEY_PATH;
|
|
323
|
+
const keyId = process.env.APNS_KEY_ID;
|
|
324
|
+
const teamId = process.env.APNS_TEAM_ID;
|
|
325
|
+
const bundleId = process.env.APNS_BUNDLE_ID;
|
|
326
|
+
if (!keyPath || !keyId || !teamId || !bundleId) {
|
|
327
|
+
console.error('Error: APNs requires APNS_KEY_PATH, APNS_KEY_ID, APNS_TEAM_ID, APNS_BUNDLE_ID');
|
|
328
|
+
process.exit(1);
|
|
329
|
+
}
|
|
330
|
+
pushProviderInstances.push(new ApnsProvider({
|
|
331
|
+
keyPath, keyId, teamId, bundleId,
|
|
332
|
+
environment: process.env.APNS_ENVIRONMENT ?? 'production',
|
|
333
|
+
}));
|
|
334
|
+
logger.info('APNs push provider configured', { bundleId, environment: process.env.APNS_ENVIRONMENT ?? 'production' });
|
|
335
|
+
break;
|
|
171
336
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if (!vapidPublicKey || !vapidPrivateKey || !vapidEmail) {
|
|
184
|
-
console.error('Error: Web Push requires VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_EMAIL');
|
|
185
|
-
process.exit(1);
|
|
337
|
+
case 'web_push': {
|
|
338
|
+
const vapidPublicKey = process.env.VAPID_PUBLIC_KEY;
|
|
339
|
+
const vapidPrivateKey = process.env.VAPID_PRIVATE_KEY;
|
|
340
|
+
const vapidEmail = process.env.VAPID_EMAIL;
|
|
341
|
+
if (!vapidPublicKey || !vapidPrivateKey || !vapidEmail) {
|
|
342
|
+
console.error('Error: Web Push requires VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_EMAIL');
|
|
343
|
+
process.exit(1);
|
|
344
|
+
}
|
|
345
|
+
pushProviderInstances.push(new WebPushProvider({ vapidPublicKey, vapidPrivateKey, vapidEmail }));
|
|
346
|
+
logger.info('Web Push provider configured', { email: vapidEmail });
|
|
347
|
+
break;
|
|
186
348
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
349
|
+
default:
|
|
350
|
+
console.error(`Error: Unknown push provider '${provider}'. Use: apns, web_push`);
|
|
351
|
+
process.exit(1);
|
|
190
352
|
}
|
|
191
|
-
default:
|
|
192
|
-
console.error(`Error: Unknown push provider '${provider}'. Use: apns, web_push`);
|
|
193
|
-
process.exit(1);
|
|
194
353
|
}
|
|
354
|
+
pushManager = new PushManager(storage, pushProviderInstances);
|
|
195
355
|
}
|
|
196
|
-
|
|
356
|
+
const localBackend = new LocalAuthBackend({
|
|
357
|
+
storage,
|
|
358
|
+
authProviders,
|
|
359
|
+
pairingEnabled: PAIRING,
|
|
360
|
+
pushManager,
|
|
361
|
+
region: REGION || undefined,
|
|
362
|
+
regionUrls: REGION_URLS,
|
|
363
|
+
});
|
|
364
|
+
authBackend = localBackend;
|
|
365
|
+
// Expose account API for public region discovery / login-first flows.
|
|
366
|
+
// If SERVICE_KEY is configured it acts as an admin credential; registered
|
|
367
|
+
// edges can also authenticate with their issued per-region service key.
|
|
368
|
+
accountApi = new AccountApi({ authBackend: localBackend, serviceKey: SERVICE_KEY || undefined });
|
|
369
|
+
logger.info('Account API enabled', { adminKeyConfigured: !!SERVICE_KEY });
|
|
197
370
|
}
|
|
198
371
|
const head = new HeadServer(storage, {
|
|
199
|
-
authProviders,
|
|
372
|
+
authProviders: IS_CONNECTED_MODE ? undefined : directAuthProviders,
|
|
200
373
|
pairingEnabled: PAIRING,
|
|
201
374
|
version: VERSION,
|
|
202
375
|
pushManager,
|
|
376
|
+
authBackend,
|
|
377
|
+
region: REGION || undefined,
|
|
203
378
|
});
|
|
204
379
|
const startedAt = Date.now();
|
|
205
|
-
const httpServer = createServer((req, res) => {
|
|
380
|
+
const httpServer = createServer(async (req, res) => {
|
|
206
381
|
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
382
|
+
// Account API routes (standalone mode only)
|
|
383
|
+
if (accountApi && url.pathname.startsWith('/api/')) {
|
|
384
|
+
try {
|
|
385
|
+
const handled = await accountApi.handleRequest(req, res);
|
|
386
|
+
if (handled)
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
catch (err) {
|
|
390
|
+
logger.error('Account API error', { error: err.message });
|
|
391
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
392
|
+
res.end(JSON.stringify({ error: 'internal_error' }));
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
207
396
|
if (url.pathname === '/admin/stats') {
|
|
208
397
|
// CORS for cross-origin admin portal
|
|
209
398
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
@@ -241,15 +430,19 @@ head.attach(httpServer);
|
|
|
241
430
|
httpServer.listen(PORT, () => {
|
|
242
431
|
logger.info(`Kraki Head listening on port ${PORT}`, {
|
|
243
432
|
ws: `ws://localhost:${PORT}`,
|
|
244
|
-
|
|
433
|
+
mode: IS_CONNECTED_MODE ? 'connected' : 'standalone',
|
|
434
|
+
auth: IS_CONNECTED_MODE ? '(delegated)' : AUTH_MODES.join(', '),
|
|
245
435
|
pairing: PAIRING,
|
|
246
436
|
db: DB_PATH,
|
|
437
|
+
region: REGION || '(none)',
|
|
438
|
+
publicRelayUrl: PUBLIC_RELAY_URL || '(none)',
|
|
439
|
+
accountApi: !!accountApi,
|
|
247
440
|
});
|
|
248
441
|
});
|
|
249
442
|
async function shutdown() {
|
|
250
443
|
logger.info('Shutting down...');
|
|
251
444
|
head.close();
|
|
252
|
-
storage
|
|
445
|
+
storage?.close();
|
|
253
446
|
logger.close();
|
|
254
447
|
httpServer.close();
|
|
255
448
|
process.exit(0);
|
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/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { Storage } from './storage.js';
|
|
2
|
-
export type { StoredDevice, StoredUser, StoredPushToken } from './storage.js';
|
|
2
|
+
export type { StoredDevice, StoredUser, StoredPushToken, StoredRegion } from './storage.js';
|
|
3
3
|
export { HeadServer } from './server.js';
|
|
4
4
|
export type { HeadServerOptions } from './server.js';
|
|
5
5
|
export { GitHubAuthProvider, OpenAuthProvider, ApiKeyAuthProvider, ThrottledAuthProvider } from './auth.js';
|
|
@@ -8,3 +8,11 @@ export { Logger, getLogger, setGlobalLogger } from './logger.js';
|
|
|
8
8
|
export type { LoggerOptions, LogLevel } from './logger.js';
|
|
9
9
|
export { PushManager, ApnsProvider, WebPushProvider } from './push/index.js';
|
|
10
10
|
export type { PushProvider, PushPayload, PushResult, ApnsConfig, WebPushConfig } from './push/index.js';
|
|
11
|
+
export type { AuthBackend, AuthOutcome as BackendAuthOutcome, ChallengeOutcome, AuthInfoConfig } from './auth-backend.js';
|
|
12
|
+
export { LocalAuthBackend } from './local-auth-backend.js';
|
|
13
|
+
export type { LocalAuthBackendOptions, RegionDirectoryEntry, LoginResolveOutcome, EdgeJoinOutcome } from './local-auth-backend.js';
|
|
14
|
+
export { RemoteAuthBackend } from './remote-auth-backend.js';
|
|
15
|
+
export type { RemoteAuthBackendOptions } from './remote-auth-backend.js';
|
|
16
|
+
export { AccountApi } from './account-api.js';
|
|
17
|
+
export type { AccountApiOptions } from './account-api.js';
|
|
18
|
+
export { getCountryForIp, regionForCountry, suggestRegionForIp } from './ip-geo.js';
|
package/dist/index.js
CHANGED
|
@@ -3,4 +3,8 @@ export { HeadServer } from './server.js';
|
|
|
3
3
|
export { GitHubAuthProvider, OpenAuthProvider, ApiKeyAuthProvider, ThrottledAuthProvider } from './auth.js';
|
|
4
4
|
export { Logger, getLogger, setGlobalLogger } from './logger.js';
|
|
5
5
|
export { PushManager, ApnsProvider, WebPushProvider } from './push/index.js';
|
|
6
|
+
export { LocalAuthBackend } from './local-auth-backend.js';
|
|
7
|
+
export { RemoteAuthBackend } from './remote-auth-backend.js';
|
|
8
|
+
export { AccountApi } from './account-api.js';
|
|
9
|
+
export { getCountryForIp, regionForCountry, suggestRegionForIp } from './ip-geo.js';
|
|
6
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE5G,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE5G,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAK7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/ip-geo.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight IP-based country detection for region auto-assignment.
|
|
3
|
+
*
|
|
4
|
+
* Uses ip-api.com (free, no key, 45 req/min) — called only once per new user.
|
|
5
|
+
* Falls back to the default region on error or timeout.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Look up the country code for an IP address.
|
|
9
|
+
* Returns ISO 3166-1 alpha-2 code (e.g., 'CN', 'US') or undefined on failure.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getCountryForIp(ip: string): Promise<string | undefined>;
|
|
12
|
+
/**
|
|
13
|
+
* Suggest a region for the given country code.
|
|
14
|
+
* Returns the matched region or the default.
|
|
15
|
+
*/
|
|
16
|
+
export declare function regionForCountry(countryCode: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the best region for an IP. Combines geo lookup + country→region mapping.
|
|
19
|
+
* Returns undefined if lookup fails (caller should use their own default).
|
|
20
|
+
*/
|
|
21
|
+
export declare function suggestRegionForIp(ip: string): Promise<string | undefined>;
|
|
22
|
+
export declare function isPrivateIp(ip: string): boolean;
|
package/dist/ip-geo.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight IP-based country detection for region auto-assignment.
|
|
3
|
+
*
|
|
4
|
+
* Uses ip-api.com (free, no key, 45 req/min) — called only once per new user.
|
|
5
|
+
* Falls back to the default region on error or timeout.
|
|
6
|
+
*/
|
|
7
|
+
import { getLogger } from './logger.js';
|
|
8
|
+
const IP_API_TIMEOUT = 3000;
|
|
9
|
+
/**
|
|
10
|
+
* Look up the country code for an IP address.
|
|
11
|
+
* Returns ISO 3166-1 alpha-2 code (e.g., 'CN', 'US') or undefined on failure.
|
|
12
|
+
*/
|
|
13
|
+
export async function getCountryForIp(ip) {
|
|
14
|
+
const logger = getLogger();
|
|
15
|
+
// Skip private/local IPs
|
|
16
|
+
if (isPrivateIp(ip))
|
|
17
|
+
return undefined;
|
|
18
|
+
try {
|
|
19
|
+
const response = await fetch(`http://ip-api.com/json/${encodeURIComponent(ip)}?fields=status,countryCode`, {
|
|
20
|
+
signal: AbortSignal.timeout(IP_API_TIMEOUT),
|
|
21
|
+
});
|
|
22
|
+
const data = await response.json();
|
|
23
|
+
if (data.status === 'success' && data.countryCode) {
|
|
24
|
+
return data.countryCode;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
logger.debug('IP geo lookup failed', { ip, error: err.message });
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
/** Map of country codes to region codes. Extend as new regions are added. */
|
|
33
|
+
const COUNTRY_TO_REGION = {
|
|
34
|
+
// East Asia
|
|
35
|
+
CN: 'china', HK: 'china', MO: 'china', TW: 'china',
|
|
36
|
+
JP: 'china', KR: 'china', MN: 'china',
|
|
37
|
+
// Southeast Asia
|
|
38
|
+
SG: 'china', MY: 'china', TH: 'china', VN: 'china',
|
|
39
|
+
PH: 'china', ID: 'china', MM: 'china', KH: 'china',
|
|
40
|
+
LA: 'china', BN: 'china', TL: 'china',
|
|
41
|
+
// South Asia
|
|
42
|
+
IN: 'china', PK: 'china', BD: 'china', LK: 'china',
|
|
43
|
+
NP: 'china', BT: 'china', MV: 'china',
|
|
44
|
+
// Central Asia
|
|
45
|
+
KZ: 'china', UZ: 'china', KG: 'china', TJ: 'china', TM: 'china',
|
|
46
|
+
// West Asia / Middle East
|
|
47
|
+
AE: 'china', SA: 'china', QA: 'china', BH: 'china', KW: 'china',
|
|
48
|
+
OM: 'china', IR: 'china', IQ: 'china', IL: 'china', JO: 'china',
|
|
49
|
+
LB: 'china', SY: 'china', YE: 'china', AF: 'china',
|
|
50
|
+
// Oceania (closer to Asia than US)
|
|
51
|
+
AU: 'china', NZ: 'china', FJ: 'china', PG: 'china',
|
|
52
|
+
};
|
|
53
|
+
const DEFAULT_REGION = 'us';
|
|
54
|
+
/**
|
|
55
|
+
* Suggest a region for the given country code.
|
|
56
|
+
* Returns the matched region or the default.
|
|
57
|
+
*/
|
|
58
|
+
export function regionForCountry(countryCode) {
|
|
59
|
+
return COUNTRY_TO_REGION[countryCode.toUpperCase()] ?? DEFAULT_REGION;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Resolve the best region for an IP. Combines geo lookup + country→region mapping.
|
|
63
|
+
* Returns undefined if lookup fails (caller should use their own default).
|
|
64
|
+
*/
|
|
65
|
+
export async function suggestRegionForIp(ip) {
|
|
66
|
+
const country = await getCountryForIp(ip);
|
|
67
|
+
if (!country)
|
|
68
|
+
return undefined;
|
|
69
|
+
return regionForCountry(country);
|
|
70
|
+
}
|
|
71
|
+
export function isPrivateIp(ip) {
|
|
72
|
+
// Strip IPv6 prefix
|
|
73
|
+
const clean = ip.replace(/^::ffff:/, '');
|
|
74
|
+
if (clean === '127.0.0.1' || clean === '::1' || clean === 'localhost')
|
|
75
|
+
return true;
|
|
76
|
+
const parts = clean.split('.');
|
|
77
|
+
if (parts.length !== 4)
|
|
78
|
+
return false;
|
|
79
|
+
const first = parseInt(parts[0], 10);
|
|
80
|
+
const second = parseInt(parts[1], 10);
|
|
81
|
+
if (first === 10)
|
|
82
|
+
return true;
|
|
83
|
+
if (first === 172 && second >= 16 && second <= 31)
|
|
84
|
+
return true;
|
|
85
|
+
if (first === 192 && second === 168)
|
|
86
|
+
return true;
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=ip-geo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip-geo.js","sourceRoot":"","sources":["../src/ip-geo.ts"],"names":[],"mappings":"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"}
|