@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/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
- // --- CLI flags ---
35
- const args = process.argv.slice(2);
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: kraki-relay [options]
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
- async function createAuthProviders() {
98
- // Build a proxy-aware fetcher for GitHub API calls if GITHUB_PROXY is set
99
- let ghFetcher;
100
- if (GITHUB_PROXY) {
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
- const { ProxyAgent } = await import('undici');
103
- const dispatcher = new ProxyAgent(GITHUB_PROXY);
104
- ghFetcher = (input, init) => fetch(input, { ...init, dispatcher });
105
- console.log(` GitHub API proxy: ${GITHUB_PROXY}`);
226
+ console.log(JSON.stringify({
227
+ version: storage.getRegionVersion(),
228
+ regions: storage.getRegions(false),
229
+ }, null, 2));
106
230
  }
107
- catch {
108
- console.warn(` ⚠ GITHUB_PROXY set but undici not available — ignoring`);
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
- const authProviders = await createAuthProviders();
156
- const storage = new Storage(DB_PATH);
157
- // --- Push providers ---
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
- if (PUSH_PROVIDERS.length > 0) {
160
- const pushProviderInstances = [];
161
- for (const provider of PUSH_PROVIDERS) {
162
- switch (provider) {
163
- case 'apns': {
164
- const keyPath = process.env.APNS_KEY_PATH;
165
- const keyId = process.env.APNS_KEY_ID;
166
- const teamId = process.env.APNS_TEAM_ID;
167
- const bundleId = process.env.APNS_BUNDLE_ID;
168
- if (!keyPath || !keyId || !teamId || !bundleId) {
169
- console.error('Error: APNs requires APNS_KEY_PATH, APNS_KEY_ID, APNS_TEAM_ID, APNS_BUNDLE_ID');
170
- process.exit(1);
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
- pushProviderInstances.push(new ApnsProvider({
173
- keyPath, keyId, teamId, bundleId,
174
- environment: process.env.APNS_ENVIRONMENT ?? 'production',
175
- }));
176
- logger.info('APNs push provider configured', { bundleId, environment: process.env.APNS_ENVIRONMENT ?? 'production' });
177
- break;
178
- }
179
- case 'web_push': {
180
- const vapidPublicKey = process.env.VAPID_PUBLIC_KEY;
181
- const vapidPrivateKey = process.env.VAPID_PRIVATE_KEY;
182
- const vapidEmail = process.env.VAPID_EMAIL;
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
- pushProviderInstances.push(new WebPushProvider({ vapidPublicKey, vapidPrivateKey, vapidEmail }));
188
- logger.info('Web Push provider configured', { email: vapidEmail });
189
- break;
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
- pushManager = new PushManager(storage, pushProviderInstances);
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
- auth: AUTH_MODES.join(', '),
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.close();
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"}
@@ -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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"}