js-cloudip 0.1.0

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/index.cjs ADDED
@@ -0,0 +1,610 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ Detector: () => Detector,
34
+ PROVIDER_AWS: () => PROVIDER_AWS,
35
+ PROVIDER_AZURE: () => PROVIDER_AZURE,
36
+ PROVIDER_CLOUDFLARE: () => PROVIDER_CLOUDFLARE,
37
+ PROVIDER_DIGITALOCEAN: () => PROVIDER_DIGITALOCEAN,
38
+ PROVIDER_GCP: () => PROVIDER_GCP,
39
+ PROVIDER_ORACLE: () => PROVIDER_ORACLE,
40
+ checkUpdate: () => checkUpdate,
41
+ clearCache: () => clearCache2,
42
+ getIPs: () => getIPs,
43
+ getProvider: () => getProvider,
44
+ isAws: () => isAws,
45
+ isAzure: () => isAzure,
46
+ isCloudProvider: () => isCloudProvider,
47
+ isCloudflare: () => isCloudflare,
48
+ isDigitalOcean: () => isDigitalOcean,
49
+ isGcp: () => isGcp,
50
+ isOracle: () => isOracle,
51
+ lookup: () => lookup,
52
+ newDetector: () => newDetector,
53
+ providers: () => providers,
54
+ rangeCount: () => rangeCount,
55
+ remoteVersion: () => remoteVersion,
56
+ update: () => update,
57
+ version: () => version
58
+ });
59
+ module.exports = __toCommonJS(index_exports);
60
+
61
+ // src/trie.ts
62
+ var CIDRTrie = class {
63
+ v4 = {};
64
+ v6 = {};
65
+ insert(range) {
66
+ const parsed = parseCIDR(range.cidr);
67
+ if (!parsed) return;
68
+ const root = parsed.bits.length === 32 ? this.v4 : this.v6;
69
+ let node = root;
70
+ for (let i = 0; i < parsed.prefix; i++) {
71
+ const bit = parsed.bits[i] === 1 ? "one" : "zero";
72
+ node[bit] ??= {};
73
+ node = node[bit];
74
+ }
75
+ node.range ??= range;
76
+ }
77
+ lookup(ip) {
78
+ const bits = ipToBits(ip);
79
+ if (!bits) return void 0;
80
+ const root = bits.length === 32 ? this.v4 : this.v6;
81
+ let node = root;
82
+ let best = node.range;
83
+ for (let i = 0; i < bits.length && node; i++) {
84
+ node = bits[i] === 1 ? node.one : node.zero;
85
+ if (node?.range) best = node.range;
86
+ }
87
+ return best;
88
+ }
89
+ };
90
+ function parseCIDR(cidr) {
91
+ const slash = cidr.indexOf("/");
92
+ const ip = slash >= 0 ? cidr.slice(0, slash) : cidr;
93
+ const bits = ipToBits(ip);
94
+ if (!bits) return null;
95
+ const prefix = slash >= 0 ? Number.parseInt(cidr.slice(slash + 1), 10) : bits.length;
96
+ if (!Number.isFinite(prefix) || prefix < 0 || prefix > bits.length) {
97
+ return null;
98
+ }
99
+ return { bits, prefix };
100
+ }
101
+ function ipToBits(ip) {
102
+ return ip.includes(":") ? ipv6ToBits(ip) : ipv4ToBits(ip);
103
+ }
104
+ function ipv4ToBits(ip) {
105
+ const parts = ip.split(".");
106
+ if (parts.length !== 4) return null;
107
+ const bits = [];
108
+ for (const p of parts) {
109
+ const n = Number.parseInt(p, 10);
110
+ if (!Number.isFinite(n) || n < 0 || n > 255) return null;
111
+ for (let i = 7; i >= 0; i--) bits.push(n >> i & 1);
112
+ }
113
+ return bits;
114
+ }
115
+ function ipv6ToBits(ip) {
116
+ const dbl = ip.split("::");
117
+ if (dbl.length > 2) return null;
118
+ const head = dbl[0] ? dbl[0].split(":") : [];
119
+ const tail = dbl[1] ? dbl[1].split(":") : [];
120
+ const missing = 8 - head.length - tail.length;
121
+ if (missing < 0 && dbl.length === 2) return null;
122
+ if (dbl.length === 1 && head.length !== 8) return null;
123
+ const groups = dbl.length === 2 ? [...head, ...Array(missing).fill("0"), ...tail] : head;
124
+ if (groups.length !== 8) return null;
125
+ const bits = [];
126
+ for (const g of groups) {
127
+ const n = Number.parseInt(g || "0", 16);
128
+ if (!Number.isFinite(n) || n < 0 || n > 65535) return null;
129
+ for (let i = 15; i >= 0; i--) bits.push(n >> i & 1);
130
+ }
131
+ return bits;
132
+ }
133
+
134
+ // src/decode.ts
135
+ var import_msgpack = require("@msgpack/msgpack");
136
+ async function gunzip(buf) {
137
+ if (typeof DecompressionStream !== "undefined") {
138
+ const ds = new DecompressionStream("gzip");
139
+ const stream = new Blob([buf]).stream().pipeThrough(ds);
140
+ const out = await new Response(stream).arrayBuffer();
141
+ return new Uint8Array(out);
142
+ }
143
+ const { gunzipSync } = await import("zlib");
144
+ return new Uint8Array(gunzipSync(buf));
145
+ }
146
+ async function decodeDatabase(gzBuf) {
147
+ const raw = await gunzip(gzBuf);
148
+ const obj = (0, import_msgpack.decode)(raw);
149
+ const providers2 = obj.providers;
150
+ const ranges = obj.ranges.map((r) => {
151
+ const provider = providers2[r.p];
152
+ if (!provider) throw new Error(`js-cloudip: unknown provider index ${r.p}`);
153
+ const out = { cidr: r.cidr, provider };
154
+ if (r.r) out.region = r.r;
155
+ if (r.s) out.service = r.s;
156
+ return out;
157
+ });
158
+ return {
159
+ version: obj.version,
160
+ build_time: obj.build_time,
161
+ providers: providers2,
162
+ ranges
163
+ };
164
+ }
165
+ async function sha256Hex(buf) {
166
+ if (typeof crypto !== "undefined" && crypto.subtle) {
167
+ const ab = buf.buffer.slice(
168
+ buf.byteOffset,
169
+ buf.byteOffset + buf.byteLength
170
+ );
171
+ const digest = await crypto.subtle.digest("SHA-256", ab);
172
+ return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, "0")).join("");
173
+ }
174
+ const { createHash } = await import("crypto");
175
+ return createHash("sha256").update(buf).digest("hex");
176
+ }
177
+
178
+ // src/cache.ts
179
+ var isNode = typeof process !== "undefined" && !!process.versions?.node;
180
+ function defaultCacheDir() {
181
+ const home = process.env.HOME || process.env.USERPROFILE || process.env.TMPDIR || "/tmp";
182
+ return `${home}/.cache/js-cloudip`;
183
+ }
184
+ function resolveCacheDir(dir) {
185
+ if (dir === null) return null;
186
+ if (!isNode) return null;
187
+ return dir ?? defaultCacheDir();
188
+ }
189
+ async function readCache(dir) {
190
+ try {
191
+ const { readFile } = await import("fs/promises");
192
+ const path = await import("path");
193
+ const bytes = new Uint8Array(
194
+ await readFile(path.join(dir, "cloudip.msgpack.gz"))
195
+ );
196
+ const meta = JSON.parse(
197
+ await readFile(path.join(dir, "version.json"), "utf8")
198
+ );
199
+ return { version: meta.version, bytes };
200
+ } catch {
201
+ return void 0;
202
+ }
203
+ }
204
+ async function writeCache(dir, data) {
205
+ try {
206
+ const { mkdir, writeFile } = await import("fs/promises");
207
+ const path = await import("path");
208
+ await mkdir(dir, { recursive: true });
209
+ await writeFile(path.join(dir, "cloudip.msgpack.gz"), data.bytes);
210
+ await writeFile(
211
+ path.join(dir, "version.json"),
212
+ JSON.stringify({ version: data.version, storedAt: Date.now() })
213
+ );
214
+ } catch {
215
+ }
216
+ }
217
+ async function cacheAge(dir) {
218
+ try {
219
+ const { readFile } = await import("fs/promises");
220
+ const path = await import("path");
221
+ const meta = JSON.parse(
222
+ await readFile(path.join(dir, "version.json"), "utf8")
223
+ );
224
+ return Date.now() - meta.storedAt;
225
+ } catch {
226
+ return void 0;
227
+ }
228
+ }
229
+ async function clearCache(dir) {
230
+ if (!isNode) return;
231
+ const resolved = resolveCacheDir(dir);
232
+ if (!resolved) return;
233
+ try {
234
+ const { rm } = await import("fs/promises");
235
+ await rm(resolved, { recursive: true, force: true });
236
+ } catch {
237
+ }
238
+ }
239
+
240
+ // src/constants.ts
241
+ var PROVIDER_AWS = "aws";
242
+ var PROVIDER_GCP = "gcp";
243
+ var PROVIDER_AZURE = "azure";
244
+ var PROVIDER_CLOUDFLARE = "cloudflare";
245
+ var PROVIDER_DIGITALOCEAN = "digitalocean";
246
+ var PROVIDER_ORACLE = "oracle";
247
+ var DEFAULT_BASE_URL = "https://raw.githubusercontent.com/rezmoss/cloudip-db/main/data";
248
+ var DEFAULT_DATA_URL = `${DEFAULT_BASE_URL}/cloudip.msgpack.gz`;
249
+ var DEFAULT_VERSION_URL = `${DEFAULT_BASE_URL}/version.json`;
250
+ var HOUR_MS = 60 * 60 * 1e3;
251
+ var DEFAULT_TTL_MS = 24 * HOUR_MS;
252
+
253
+ // src/source.ts
254
+ async function fetchVersion(env = {}) {
255
+ const doFetch = env.fetch ?? globalThis.fetch;
256
+ const url = env.versionURL ?? DEFAULT_VERSION_URL;
257
+ const res = await doFetch(url, { signal: env.signal });
258
+ if (!res.ok) throw new Error(`js-cloudip: version.json HTTP ${res.status} from ${url}`);
259
+ return await res.json();
260
+ }
261
+ async function fetchData(env = {}, verifyAgainst) {
262
+ const doFetch = env.fetch ?? globalThis.fetch;
263
+ const url = env.dataURL ?? DEFAULT_DATA_URL;
264
+ const res = await doFetch(url, { signal: env.signal });
265
+ if (!res.ok) throw new Error(`js-cloudip: data HTTP ${res.status} from ${url}`);
266
+ const bytes = new Uint8Array(await res.arrayBuffer());
267
+ const info = verifyAgainst ?? await fetchVersion(env);
268
+ const raw = await gunzip(bytes);
269
+ const hash = await sha256Hex(raw);
270
+ if (hash !== info.sha256) {
271
+ throw new Error(
272
+ `js-cloudip: sha256 mismatch (expected ${info.sha256}, got ${hash})`
273
+ );
274
+ }
275
+ return { bytes, version: info.version };
276
+ }
277
+
278
+ // src/embedded-loader.ts
279
+ var import_meta = {};
280
+ async function loadEmbeddedGz() {
281
+ if (typeof process === "undefined" || !process.versions?.node) {
282
+ return void 0;
283
+ }
284
+ const { readFile } = await import("fs/promises");
285
+ const path = await import("path");
286
+ const url = await import("url");
287
+ let here;
288
+ try {
289
+ here = path.dirname(url.fileURLToPath(import_meta.url));
290
+ } catch {
291
+ here = typeof __dirname !== "undefined" ? __dirname : process.cwd();
292
+ }
293
+ const candidates = [
294
+ path.join(here, "..", "data", "cloudip.msgpack.gz"),
295
+ path.join(here, "data", "cloudip.msgpack.gz"),
296
+ path.join(process.cwd(), "data", "cloudip.msgpack.gz")
297
+ ];
298
+ for (const p of candidates) {
299
+ try {
300
+ return new Uint8Array(await readFile(p));
301
+ } catch {
302
+ }
303
+ }
304
+ return void 0;
305
+ }
306
+
307
+ // src/detector.ts
308
+ function buildState(db) {
309
+ const trie = new CIDRTrie();
310
+ const byProvider = /* @__PURE__ */ new Map();
311
+ for (const r of db.ranges) {
312
+ trie.insert(r);
313
+ const key = r.provider.toLowerCase();
314
+ let arr = byProvider.get(key);
315
+ if (!arr) {
316
+ arr = [];
317
+ byProvider.set(key, arr);
318
+ }
319
+ const entry = {
320
+ ip_address: r.cidr,
321
+ ip_type: r.cidr.includes(":") ? "ipv6" : "ipv4",
322
+ provider: r.provider
323
+ };
324
+ if (r.region) entry.region = r.region;
325
+ if (r.service) entry.service = r.service;
326
+ arr.push(entry);
327
+ }
328
+ return { db, trie, byProvider };
329
+ }
330
+ var Detector = class {
331
+ state;
332
+ opts;
333
+ autoUpdateTimer;
334
+ constructor(options = {}) {
335
+ const autoUpdateMs = options.autoUpdateMs ?? 0;
336
+ this.opts = {
337
+ dataDir: resolveCacheDir(options.dataDir),
338
+ autoUpdateMs: autoUpdateMs > 0 && autoUpdateMs < HOUR_MS ? HOUR_MS : autoUpdateMs,
339
+ offline: options.offline ?? false,
340
+ fetch: options.fetch,
341
+ dataURL: options.dataURL ?? DEFAULT_DATA_URL,
342
+ versionURL: options.versionURL ?? DEFAULT_VERSION_URL,
343
+ verifySha256: options.verifySha256 ?? true,
344
+ ttlMs: options.ttlMs ?? DEFAULT_TTL_MS,
345
+ signal: options.signal
346
+ };
347
+ }
348
+ async ready() {
349
+ if (this.state) return this;
350
+ await this.loadInitial();
351
+ if (this.opts.autoUpdateMs > 0 && !this.opts.offline) {
352
+ this.autoUpdateTimer = setInterval(() => {
353
+ void this.update().catch(() => void 0);
354
+ }, this.opts.autoUpdateMs);
355
+ const t = this.autoUpdateTimer;
356
+ t.unref?.();
357
+ }
358
+ return this;
359
+ }
360
+ close() {
361
+ if (this.autoUpdateTimer) clearInterval(this.autoUpdateTimer);
362
+ this.autoUpdateTimer = void 0;
363
+ }
364
+ fetchEnv() {
365
+ return {
366
+ fetch: this.opts.fetch,
367
+ dataURL: this.opts.dataURL,
368
+ versionURL: this.opts.versionURL,
369
+ signal: this.opts.signal
370
+ };
371
+ }
372
+ async loadInitial() {
373
+ if (!this.opts.offline) {
374
+ try {
375
+ const fresh = await fetchData(this.fetchEnv());
376
+ const db = await decodeDatabase(fresh.bytes);
377
+ this.state = buildState(db);
378
+ if (this.opts.dataDir) await writeCache(this.opts.dataDir, fresh);
379
+ return;
380
+ } catch {
381
+ }
382
+ }
383
+ if (this.opts.dataDir) {
384
+ const age = await cacheAge(this.opts.dataDir);
385
+ if (age !== void 0 && (this.opts.offline || age <= this.opts.ttlMs)) {
386
+ const cached = await readCache(this.opts.dataDir);
387
+ if (cached) {
388
+ try {
389
+ const db = await decodeDatabase(cached.bytes);
390
+ this.state = buildState(db);
391
+ return;
392
+ } catch {
393
+ }
394
+ }
395
+ } else if (this.opts.dataDir) {
396
+ const cached = await readCache(this.opts.dataDir);
397
+ if (cached) {
398
+ try {
399
+ const db = await decodeDatabase(cached.bytes);
400
+ this.state = buildState(db);
401
+ return;
402
+ } catch {
403
+ }
404
+ }
405
+ }
406
+ }
407
+ const embedded = await loadEmbeddedGz();
408
+ if (embedded) {
409
+ const db = await decodeDatabase(embedded);
410
+ this.state = buildState(db);
411
+ return;
412
+ }
413
+ throw new Error(
414
+ "js-cloudip: no data available (network failed, no cache, no embedded data)"
415
+ );
416
+ }
417
+ async update() {
418
+ if (this.opts.offline) {
419
+ throw new Error("js-cloudip: update disabled in offline mode");
420
+ }
421
+ const fresh = await fetchData(this.fetchEnv());
422
+ const db = await decodeDatabase(fresh.bytes);
423
+ this.state = buildState(db);
424
+ if (this.opts.dataDir) await writeCache(this.opts.dataDir, fresh);
425
+ }
426
+ async checkUpdate() {
427
+ if (this.opts.offline) {
428
+ throw new Error("js-cloudip: update check disabled in offline mode");
429
+ }
430
+ const info = await fetchVersion(this.fetchEnv());
431
+ const local = this.state?.db.version ?? "";
432
+ return { hasUpdate: info.version > local, info };
433
+ }
434
+ async clearCache() {
435
+ await clearCache(this.opts.dataDir);
436
+ }
437
+ requireState() {
438
+ if (!this.state) {
439
+ throw new Error("js-cloudip: detector not ready \u2014 call await detector.ready() first");
440
+ }
441
+ return this.state;
442
+ }
443
+ lookup(ip) {
444
+ const r = this.requireState().trie.lookup(ip);
445
+ if (!r) return { found: false };
446
+ const result = {
447
+ found: true,
448
+ provider: r.provider,
449
+ cidr: r.cidr,
450
+ ip_type: r.cidr.includes(":") ? "ipv6" : "ipv4"
451
+ };
452
+ if (r.region) result.region = r.region;
453
+ if (r.service) result.service = r.service;
454
+ return result;
455
+ }
456
+ getProvider(ip) {
457
+ return this.lookup(ip).provider ?? "";
458
+ }
459
+ isCloudProvider(ip) {
460
+ return this.lookup(ip).found;
461
+ }
462
+ isAws(ip) {
463
+ return this.getProvider(ip) === PROVIDER_AWS;
464
+ }
465
+ isGcp(ip) {
466
+ return this.getProvider(ip) === PROVIDER_GCP;
467
+ }
468
+ isAzure(ip) {
469
+ return this.getProvider(ip) === PROVIDER_AZURE;
470
+ }
471
+ isCloudflare(ip) {
472
+ return this.getProvider(ip) === PROVIDER_CLOUDFLARE;
473
+ }
474
+ isDigitalOcean(ip) {
475
+ return this.getProvider(ip) === PROVIDER_DIGITALOCEAN;
476
+ }
477
+ isOracle(ip) {
478
+ return this.getProvider(ip) === PROVIDER_ORACLE;
479
+ }
480
+ getIPs(providers2) {
481
+ const s = this.requireState();
482
+ if (providers2 === void 0) {
483
+ const all = [];
484
+ for (const arr of s.byProvider.values()) all.push(...arr);
485
+ return all;
486
+ }
487
+ const want = Array.isArray(providers2) ? providers2 : [providers2];
488
+ const out = [];
489
+ for (const p of want) {
490
+ const hit = s.byProvider.get(p.toLowerCase());
491
+ if (hit) out.push(...hit);
492
+ }
493
+ return out;
494
+ }
495
+ version() {
496
+ return this.state?.db.version ?? "";
497
+ }
498
+ buildTime() {
499
+ return this.state?.db.build_time ?? 0;
500
+ }
501
+ rangeCount() {
502
+ return this.state?.db.ranges.length ?? 0;
503
+ }
504
+ providers() {
505
+ return this.state?.db.providers ?? [];
506
+ }
507
+ };
508
+ async function newDetector(options) {
509
+ const d = new Detector(options);
510
+ await d.ready();
511
+ return d;
512
+ }
513
+ async function loadVersion(options = {}) {
514
+ return fetchVersion(options);
515
+ }
516
+
517
+ // src/index.ts
518
+ var defaultDetector;
519
+ var defaultPromise;
520
+ async function getDefault() {
521
+ if (defaultDetector) return defaultDetector;
522
+ if (defaultPromise) return defaultPromise;
523
+ defaultPromise = newDetector().then((d) => {
524
+ defaultDetector = d;
525
+ return d;
526
+ });
527
+ return defaultPromise;
528
+ }
529
+ async function lookup(ip) {
530
+ return (await getDefault()).lookup(ip);
531
+ }
532
+ async function getProvider(ip) {
533
+ return (await getDefault()).getProvider(ip);
534
+ }
535
+ async function isCloudProvider(ip) {
536
+ return (await getDefault()).isCloudProvider(ip);
537
+ }
538
+ async function isAws(ip) {
539
+ return (await getDefault()).isAws(ip);
540
+ }
541
+ async function isGcp(ip) {
542
+ return (await getDefault()).isGcp(ip);
543
+ }
544
+ async function isAzure(ip) {
545
+ return (await getDefault()).isAzure(ip);
546
+ }
547
+ async function isCloudflare(ip) {
548
+ return (await getDefault()).isCloudflare(ip);
549
+ }
550
+ async function isDigitalOcean(ip) {
551
+ return (await getDefault()).isDigitalOcean(ip);
552
+ }
553
+ async function isOracle(ip) {
554
+ return (await getDefault()).isOracle(ip);
555
+ }
556
+ async function getIPs(providers2) {
557
+ return (await getDefault()).getIPs(providers2);
558
+ }
559
+ async function version() {
560
+ return (await getDefault()).version();
561
+ }
562
+ async function rangeCount() {
563
+ return (await getDefault()).rangeCount();
564
+ }
565
+ async function providers() {
566
+ return (await getDefault()).providers();
567
+ }
568
+ async function update() {
569
+ await (await getDefault()).update();
570
+ }
571
+ async function checkUpdate() {
572
+ return (await getDefault()).checkUpdate();
573
+ }
574
+ async function remoteVersion(options) {
575
+ return loadVersion(options);
576
+ }
577
+ async function clearCache2() {
578
+ if (defaultDetector) await defaultDetector.clearCache();
579
+ defaultDetector = void 0;
580
+ defaultPromise = void 0;
581
+ }
582
+ // Annotate the CommonJS export names for ESM import in node:
583
+ 0 && (module.exports = {
584
+ Detector,
585
+ PROVIDER_AWS,
586
+ PROVIDER_AZURE,
587
+ PROVIDER_CLOUDFLARE,
588
+ PROVIDER_DIGITALOCEAN,
589
+ PROVIDER_GCP,
590
+ PROVIDER_ORACLE,
591
+ checkUpdate,
592
+ clearCache,
593
+ getIPs,
594
+ getProvider,
595
+ isAws,
596
+ isAzure,
597
+ isCloudProvider,
598
+ isCloudflare,
599
+ isDigitalOcean,
600
+ isGcp,
601
+ isOracle,
602
+ lookup,
603
+ newDetector,
604
+ providers,
605
+ rangeCount,
606
+ remoteVersion,
607
+ update,
608
+ version
609
+ });
610
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/trie.ts","../src/decode.ts","../src/cache.ts","../src/constants.ts","../src/source.ts","../src/embedded-loader.ts","../src/detector.ts"],"sourcesContent":["import type {\n CheckUpdateResult,\n DetectorOptions,\n IPEntry,\n LookupResult,\n Provider,\n VersionInfo,\n} from './types.js';\nimport { Detector, loadVersion, newDetector } from './detector.js';\n\nexport type {\n CheckUpdateResult,\n Database,\n DetectorOptions,\n IPEntry,\n LookupResult,\n Provider,\n Range,\n VersionInfo,\n} from './types.js';\nexport { Detector, newDetector } from './detector.js';\nexport {\n PROVIDER_AWS,\n PROVIDER_AZURE,\n PROVIDER_CLOUDFLARE,\n PROVIDER_DIGITALOCEAN,\n PROVIDER_GCP,\n PROVIDER_ORACLE,\n} from './constants.js';\n\nlet defaultDetector: Detector | undefined;\nlet defaultPromise: Promise<Detector> | undefined;\n\nasync function getDefault(): Promise<Detector> {\n if (defaultDetector) return defaultDetector;\n if (defaultPromise) return defaultPromise;\n defaultPromise = newDetector().then((d) => {\n defaultDetector = d;\n return d;\n });\n return defaultPromise;\n}\n\nexport async function lookup(ip: string): Promise<LookupResult> {\n return (await getDefault()).lookup(ip);\n}\n\nexport async function getProvider(ip: string): Promise<Provider> {\n return (await getDefault()).getProvider(ip);\n}\n\nexport async function isCloudProvider(ip: string): Promise<boolean> {\n return (await getDefault()).isCloudProvider(ip);\n}\n\nexport async function isAws(ip: string): Promise<boolean> {\n return (await getDefault()).isAws(ip);\n}\n\nexport async function isGcp(ip: string): Promise<boolean> {\n return (await getDefault()).isGcp(ip);\n}\n\nexport async function isAzure(ip: string): Promise<boolean> {\n return (await getDefault()).isAzure(ip);\n}\n\nexport async function isCloudflare(ip: string): Promise<boolean> {\n return (await getDefault()).isCloudflare(ip);\n}\n\nexport async function isDigitalOcean(ip: string): Promise<boolean> {\n return (await getDefault()).isDigitalOcean(ip);\n}\n\nexport async function isOracle(ip: string): Promise<boolean> {\n return (await getDefault()).isOracle(ip);\n}\n\nexport async function getIPs(\n providers?: Provider | Provider[],\n): Promise<IPEntry[]> {\n return (await getDefault()).getIPs(providers);\n}\n\nexport async function version(): Promise<string> {\n return (await getDefault()).version();\n}\n\nexport async function rangeCount(): Promise<number> {\n return (await getDefault()).rangeCount();\n}\n\nexport async function providers(): Promise<readonly Provider[]> {\n return (await getDefault()).providers();\n}\n\nexport async function update(): Promise<void> {\n await (await getDefault()).update();\n}\n\nexport async function checkUpdate(): Promise<CheckUpdateResult> {\n return (await getDefault()).checkUpdate();\n}\n\nexport async function remoteVersion(\n options?: Pick<DetectorOptions, 'fetch' | 'versionURL' | 'signal'>,\n): Promise<VersionInfo> {\n return loadVersion(options);\n}\n\nexport async function clearCache(): Promise<void> {\n if (defaultDetector) await defaultDetector.clearCache();\n defaultDetector = undefined;\n defaultPromise = undefined;\n}\n","import type { Range } from './types.js';\n\ninterface Node {\n zero?: Node;\n one?: Node;\n range?: Range;\n}\n\nexport class CIDRTrie {\n private v4: Node = {};\n private v6: Node = {};\n\n insert(range: Range): void {\n const parsed = parseCIDR(range.cidr);\n if (!parsed) return;\n const root = parsed.bits.length === 32 ? this.v4 : this.v6;\n let node = root;\n for (let i = 0; i < parsed.prefix; i++) {\n const bit = parsed.bits[i] === 1 ? 'one' : 'zero';\n node[bit] ??= {};\n node = node[bit]!;\n }\n node.range ??= range;\n }\n\n lookup(ip: string): Range | undefined {\n const bits = ipToBits(ip);\n if (!bits) return undefined;\n const root = bits.length === 32 ? this.v4 : this.v6;\n let node: Node | undefined = root;\n let best = node.range;\n for (let i = 0; i < bits.length && node; i++) {\n node = bits[i] === 1 ? node.one : node.zero;\n if (node?.range) best = node.range;\n }\n return best;\n }\n}\n\ninterface ParsedCIDR {\n bits: (0 | 1)[];\n prefix: number;\n}\n\nfunction parseCIDR(cidr: string): ParsedCIDR | null {\n const slash = cidr.indexOf('/');\n const ip = slash >= 0 ? cidr.slice(0, slash) : cidr;\n const bits = ipToBits(ip);\n if (!bits) return null;\n const prefix =\n slash >= 0 ? Number.parseInt(cidr.slice(slash + 1), 10) : bits.length;\n if (!Number.isFinite(prefix) || prefix < 0 || prefix > bits.length) {\n return null;\n }\n return { bits, prefix };\n}\n\nfunction ipToBits(ip: string): (0 | 1)[] | null {\n return ip.includes(':') ? ipv6ToBits(ip) : ipv4ToBits(ip);\n}\n\nfunction ipv4ToBits(ip: string): (0 | 1)[] | null {\n const parts = ip.split('.');\n if (parts.length !== 4) return null;\n const bits: (0 | 1)[] = [];\n for (const p of parts) {\n const n = Number.parseInt(p, 10);\n if (!Number.isFinite(n) || n < 0 || n > 255) return null;\n for (let i = 7; i >= 0; i--) bits.push(((n >> i) & 1) as 0 | 1);\n }\n return bits;\n}\n\nfunction ipv6ToBits(ip: string): (0 | 1)[] | null {\n const dbl = ip.split('::');\n if (dbl.length > 2) return null;\n const head = dbl[0] ? dbl[0].split(':') : [];\n const tail = dbl[1] ? dbl[1].split(':') : [];\n const missing = 8 - head.length - tail.length;\n if (missing < 0 && dbl.length === 2) return null;\n if (dbl.length === 1 && head.length !== 8) return null;\n const groups: string[] =\n dbl.length === 2\n ? [...head, ...Array(missing).fill('0'), ...tail]\n : head;\n if (groups.length !== 8) return null;\n const bits: (0 | 1)[] = [];\n for (const g of groups) {\n const n = Number.parseInt(g || '0', 16);\n if (!Number.isFinite(n) || n < 0 || n > 0xffff) return null;\n for (let i = 15; i >= 0; i--) bits.push(((n >> i) & 1) as 0 | 1);\n }\n return bits;\n}\n","import { decode as msgpackDecode } from '@msgpack/msgpack';\nimport type { Database, Range } from './types.js';\n\ninterface RawRange {\n cidr: string;\n p: number;\n r?: string;\n s?: string;\n}\n\ninterface RawDatabase {\n version: string;\n build_time: number;\n providers: string[];\n ranges: RawRange[];\n}\n\nexport async function gunzip(buf: Uint8Array): Promise<Uint8Array> {\n if (typeof DecompressionStream !== 'undefined') {\n const ds = new DecompressionStream('gzip');\n const stream = new Blob([buf as BlobPart]).stream().pipeThrough(ds);\n const out = await new Response(stream).arrayBuffer();\n return new Uint8Array(out);\n }\n const { gunzipSync } = await import('node:zlib');\n return new Uint8Array(gunzipSync(buf));\n}\n\nexport async function decodeDatabase(gzBuf: Uint8Array): Promise<Database> {\n const raw = await gunzip(gzBuf);\n const obj = msgpackDecode(raw) as RawDatabase;\n const providers = obj.providers;\n const ranges: Range[] = obj.ranges.map((r) => {\n const provider = providers[r.p];\n if (!provider) throw new Error(`js-cloudip: unknown provider index ${r.p}`);\n const out: Range = { cidr: r.cidr, provider };\n if (r.r) out.region = r.r;\n if (r.s) out.service = r.s;\n return out;\n });\n return {\n version: obj.version,\n build_time: obj.build_time,\n providers,\n ranges,\n };\n}\n\nexport async function sha256Hex(buf: Uint8Array): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const ab = buf.buffer.slice(\n buf.byteOffset,\n buf.byteOffset + buf.byteLength,\n ) as ArrayBuffer;\n const digest = await crypto.subtle.digest('SHA-256', ab);\n return [...new Uint8Array(digest)]\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n const { createHash } = await import('node:crypto');\n return createHash('sha256').update(buf).digest('hex');\n}\n","const isNode = typeof process !== 'undefined' && !!process.versions?.node;\n\nexport interface CachedData {\n version: string;\n bytes: Uint8Array;\n}\n\nfunction defaultCacheDir(): string {\n const home =\n process.env.HOME || process.env.USERPROFILE || process.env.TMPDIR || '/tmp';\n return `${home}/.cache/js-cloudip`;\n}\n\nexport function resolveCacheDir(dir: string | null | undefined): string | null {\n if (dir === null) return null;\n if (!isNode) return null;\n return dir ?? defaultCacheDir();\n}\n\nexport async function readCache(dir: string): Promise<CachedData | undefined> {\n try {\n const { readFile } = await import('node:fs/promises');\n const path = await import('node:path');\n const bytes = new Uint8Array(\n await readFile(path.join(dir, 'cloudip.msgpack.gz')),\n );\n const meta = JSON.parse(\n await readFile(path.join(dir, 'version.json'), 'utf8'),\n ) as { version: string; storedAt: number };\n return { version: meta.version, bytes };\n } catch {\n return undefined;\n }\n}\n\nexport async function writeCache(\n dir: string,\n data: CachedData,\n): Promise<void> {\n try {\n const { mkdir, writeFile } = await import('node:fs/promises');\n const path = await import('node:path');\n await mkdir(dir, { recursive: true });\n await writeFile(path.join(dir, 'cloudip.msgpack.gz'), data.bytes);\n await writeFile(\n path.join(dir, 'version.json'),\n JSON.stringify({ version: data.version, storedAt: Date.now() }),\n );\n } catch {\n // best-effort\n }\n}\n\nexport async function cacheAge(dir: string): Promise<number | undefined> {\n try {\n const { readFile } = await import('node:fs/promises');\n const path = await import('node:path');\n const meta = JSON.parse(\n await readFile(path.join(dir, 'version.json'), 'utf8'),\n ) as { storedAt: number };\n return Date.now() - meta.storedAt;\n } catch {\n return undefined;\n }\n}\n\nexport async function clearCache(dir?: string | null): Promise<void> {\n if (!isNode) return;\n const resolved = resolveCacheDir(dir);\n if (!resolved) return;\n try {\n const { rm } = await import('node:fs/promises');\n await rm(resolved, { recursive: true, force: true });\n } catch {\n // best-effort\n }\n}\n","export const PROVIDER_AWS = 'aws';\nexport const PROVIDER_GCP = 'gcp';\nexport const PROVIDER_AZURE = 'azure';\nexport const PROVIDER_CLOUDFLARE = 'cloudflare';\nexport const PROVIDER_DIGITALOCEAN = 'digitalocean';\nexport const PROVIDER_ORACLE = 'oracle';\n\nexport const DEFAULT_BASE_URL =\n 'https://raw.githubusercontent.com/rezmoss/cloudip-db/main/data';\nexport const DEFAULT_DATA_URL = `${DEFAULT_BASE_URL}/cloudip.msgpack.gz`;\nexport const DEFAULT_VERSION_URL = `${DEFAULT_BASE_URL}/version.json`;\n\nexport const HOUR_MS = 60 * 60 * 1000;\nexport const DEFAULT_TTL_MS = 24 * HOUR_MS;\n","import type { VersionInfo } from './types.js';\nimport {\n DEFAULT_DATA_URL,\n DEFAULT_VERSION_URL,\n} from './constants.js';\nimport { gunzip, sha256Hex } from './decode.js';\n\nexport interface FetchEnv {\n fetch: typeof fetch;\n dataURL: string;\n versionURL: string;\n signal?: AbortSignal;\n}\n\nexport async function fetchVersion(env: Partial<FetchEnv> = {}): Promise<VersionInfo> {\n const doFetch = env.fetch ?? globalThis.fetch;\n const url = env.versionURL ?? DEFAULT_VERSION_URL;\n const res = await doFetch(url, { signal: env.signal });\n if (!res.ok) throw new Error(`js-cloudip: version.json HTTP ${res.status} from ${url}`);\n return (await res.json()) as VersionInfo;\n}\n\nexport async function fetchData(\n env: Partial<FetchEnv> = {},\n verifyAgainst?: VersionInfo,\n): Promise<{ bytes: Uint8Array; version: string }> {\n const doFetch = env.fetch ?? globalThis.fetch;\n const url = env.dataURL ?? DEFAULT_DATA_URL;\n const res = await doFetch(url, { signal: env.signal });\n if (!res.ok) throw new Error(`js-cloudip: data HTTP ${res.status} from ${url}`);\n const bytes = new Uint8Array(await res.arrayBuffer());\n const info = verifyAgainst ?? (await fetchVersion(env));\n const raw = await gunzip(bytes);\n const hash = await sha256Hex(raw);\n if (hash !== info.sha256) {\n throw new Error(\n `js-cloudip: sha256 mismatch (expected ${info.sha256}, got ${hash})`,\n );\n }\n return { bytes, version: info.version };\n}\n","export async function loadEmbeddedGz(): Promise<Uint8Array | undefined> {\n if (typeof process === 'undefined' || !process.versions?.node) {\n return undefined;\n }\n const { readFile } = await import('node:fs/promises');\n const path = await import('node:path');\n const url = await import('node:url');\n let here: string;\n try {\n here = path.dirname(url.fileURLToPath(import.meta.url));\n } catch {\n here =\n typeof __dirname !== 'undefined' ? __dirname : process.cwd();\n }\n const candidates = [\n path.join(here, '..', 'data', 'cloudip.msgpack.gz'),\n path.join(here, 'data', 'cloudip.msgpack.gz'),\n path.join(process.cwd(), 'data', 'cloudip.msgpack.gz'),\n ];\n for (const p of candidates) {\n try {\n return new Uint8Array(await readFile(p));\n } catch {\n // try next\n }\n }\n return undefined;\n}\n","import type {\n CheckUpdateResult,\n Database,\n DetectorOptions,\n IPEntry,\n LookupResult,\n Provider,\n VersionInfo,\n} from './types.js';\nimport { CIDRTrie } from './trie.js';\nimport { decodeDatabase } from './decode.js';\nimport {\n cacheAge,\n clearCache,\n readCache,\n resolveCacheDir,\n writeCache,\n} from './cache.js';\nimport { fetchData, fetchVersion } from './source.js';\nimport { loadEmbeddedGz } from './embedded-loader.js';\nimport {\n DEFAULT_DATA_URL,\n DEFAULT_TTL_MS,\n DEFAULT_VERSION_URL,\n HOUR_MS,\n PROVIDER_AWS,\n PROVIDER_AZURE,\n PROVIDER_CLOUDFLARE,\n PROVIDER_DIGITALOCEAN,\n PROVIDER_GCP,\n PROVIDER_ORACLE,\n} from './constants.js';\n\ninterface State {\n db: Database;\n trie: CIDRTrie;\n byProvider: Map<string, IPEntry[]>;\n}\n\nfunction buildState(db: Database): State {\n const trie = new CIDRTrie();\n const byProvider = new Map<string, IPEntry[]>();\n for (const r of db.ranges) {\n trie.insert(r);\n const key = r.provider.toLowerCase();\n let arr = byProvider.get(key);\n if (!arr) {\n arr = [];\n byProvider.set(key, arr);\n }\n const entry: IPEntry = {\n ip_address: r.cidr,\n ip_type: r.cidr.includes(':') ? 'ipv6' : 'ipv4',\n provider: r.provider,\n };\n if (r.region) entry.region = r.region;\n if (r.service) entry.service = r.service;\n arr.push(entry);\n }\n return { db, trie, byProvider };\n}\n\nexport class Detector {\n private state?: State;\n private readonly opts: Required<\n Pick<\n DetectorOptions,\n 'autoUpdateMs' | 'offline' | 'dataURL' | 'versionURL' | 'verifySha256' | 'ttlMs'\n >\n > & {\n dataDir: string | null;\n fetch?: typeof fetch;\n signal?: AbortSignal;\n };\n private autoUpdateTimer?: ReturnType<typeof setInterval>;\n\n constructor(options: DetectorOptions = {}) {\n const autoUpdateMs = options.autoUpdateMs ?? 0;\n this.opts = {\n dataDir: resolveCacheDir(options.dataDir),\n autoUpdateMs:\n autoUpdateMs > 0 && autoUpdateMs < HOUR_MS ? HOUR_MS : autoUpdateMs,\n offline: options.offline ?? false,\n fetch: options.fetch,\n dataURL: options.dataURL ?? DEFAULT_DATA_URL,\n versionURL: options.versionURL ?? DEFAULT_VERSION_URL,\n verifySha256: options.verifySha256 ?? true,\n ttlMs: options.ttlMs ?? DEFAULT_TTL_MS,\n signal: options.signal,\n };\n }\n\n async ready(): Promise<this> {\n if (this.state) return this;\n await this.loadInitial();\n if (this.opts.autoUpdateMs > 0 && !this.opts.offline) {\n this.autoUpdateTimer = setInterval(() => {\n void this.update().catch(() => undefined);\n }, this.opts.autoUpdateMs);\n const t = this.autoUpdateTimer as { unref?: () => void };\n t.unref?.();\n }\n return this;\n }\n\n close(): void {\n if (this.autoUpdateTimer) clearInterval(this.autoUpdateTimer);\n this.autoUpdateTimer = undefined;\n }\n\n private fetchEnv() {\n return {\n fetch: this.opts.fetch,\n dataURL: this.opts.dataURL,\n versionURL: this.opts.versionURL,\n signal: this.opts.signal,\n };\n }\n\n private async loadInitial(): Promise<void> {\n if (!this.opts.offline) {\n try {\n const fresh = await fetchData(this.fetchEnv());\n const db = await decodeDatabase(fresh.bytes);\n this.state = buildState(db);\n if (this.opts.dataDir) await writeCache(this.opts.dataDir, fresh);\n return;\n } catch {\n // fall through\n }\n }\n if (this.opts.dataDir) {\n const age = await cacheAge(this.opts.dataDir);\n if (age !== undefined && (this.opts.offline || age <= this.opts.ttlMs)) {\n const cached = await readCache(this.opts.dataDir);\n if (cached) {\n try {\n const db = await decodeDatabase(cached.bytes);\n this.state = buildState(db);\n return;\n } catch {\n // fall through\n }\n }\n } else if (this.opts.dataDir) {\n const cached = await readCache(this.opts.dataDir);\n if (cached) {\n try {\n const db = await decodeDatabase(cached.bytes);\n this.state = buildState(db);\n return;\n } catch {\n // fall through\n }\n }\n }\n }\n const embedded = await loadEmbeddedGz();\n if (embedded) {\n const db = await decodeDatabase(embedded);\n this.state = buildState(db);\n return;\n }\n throw new Error(\n 'js-cloudip: no data available (network failed, no cache, no embedded data)',\n );\n }\n\n async update(): Promise<void> {\n if (this.opts.offline) {\n throw new Error('js-cloudip: update disabled in offline mode');\n }\n const fresh = await fetchData(this.fetchEnv());\n const db = await decodeDatabase(fresh.bytes);\n this.state = buildState(db);\n if (this.opts.dataDir) await writeCache(this.opts.dataDir, fresh);\n }\n\n async checkUpdate(): Promise<CheckUpdateResult> {\n if (this.opts.offline) {\n throw new Error('js-cloudip: update check disabled in offline mode');\n }\n const info = await fetchVersion(this.fetchEnv());\n const local = this.state?.db.version ?? '';\n return { hasUpdate: info.version > local, info };\n }\n\n async clearCache(): Promise<void> {\n await clearCache(this.opts.dataDir);\n }\n\n private requireState(): State {\n if (!this.state) {\n throw new Error('js-cloudip: detector not ready — call await detector.ready() first');\n }\n return this.state;\n }\n\n lookup(ip: string): LookupResult {\n const r = this.requireState().trie.lookup(ip);\n if (!r) return { found: false };\n const result: LookupResult = {\n found: true,\n provider: r.provider,\n cidr: r.cidr,\n ip_type: r.cidr.includes(':') ? 'ipv6' : 'ipv4',\n };\n if (r.region) result.region = r.region;\n if (r.service) result.service = r.service;\n return result;\n }\n\n getProvider(ip: string): Provider {\n return this.lookup(ip).provider ?? '';\n }\n\n isCloudProvider(ip: string): boolean {\n return this.lookup(ip).found;\n }\n\n isAws(ip: string): boolean {\n return this.getProvider(ip) === PROVIDER_AWS;\n }\n isGcp(ip: string): boolean {\n return this.getProvider(ip) === PROVIDER_GCP;\n }\n isAzure(ip: string): boolean {\n return this.getProvider(ip) === PROVIDER_AZURE;\n }\n isCloudflare(ip: string): boolean {\n return this.getProvider(ip) === PROVIDER_CLOUDFLARE;\n }\n isDigitalOcean(ip: string): boolean {\n return this.getProvider(ip) === PROVIDER_DIGITALOCEAN;\n }\n isOracle(ip: string): boolean {\n return this.getProvider(ip) === PROVIDER_ORACLE;\n }\n\n getIPs(providers?: Provider | Provider[]): IPEntry[] {\n const s = this.requireState();\n if (providers === undefined) {\n const all: IPEntry[] = [];\n for (const arr of s.byProvider.values()) all.push(...arr);\n return all;\n }\n const want = Array.isArray(providers) ? providers : [providers];\n const out: IPEntry[] = [];\n for (const p of want) {\n const hit = s.byProvider.get(p.toLowerCase());\n if (hit) out.push(...hit);\n }\n return out;\n }\n\n version(): string {\n return this.state?.db.version ?? '';\n }\n\n buildTime(): number {\n return this.state?.db.build_time ?? 0;\n }\n\n rangeCount(): number {\n return this.state?.db.ranges.length ?? 0;\n }\n\n providers(): readonly Provider[] {\n return this.state?.db.providers ?? [];\n }\n}\n\nexport async function newDetector(options?: DetectorOptions): Promise<Detector> {\n const d = new Detector(options);\n await d.ready();\n return d;\n}\n\nexport async function loadVersion(\n options: Pick<DetectorOptions, 'fetch' | 'versionURL' | 'signal'> = {},\n): Promise<VersionInfo> {\n return fetchVersion(options);\n}\n"],"mappings":"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","names":["clearCache","msgpackDecode","providers","providers","providers","clearCache"]}