@js0.site/edns 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,6 +17,7 @@
17
17
  - [Features](#features)
18
18
  - [Installation](#installation)
19
19
  - [Usage](#usage)
20
+ - [Huawei Cloud DNS Sync](#huawei-cloud-dns-sync)
20
21
  - [China Regions](#china-regions)
21
22
  - [Global Regions](#global-regions)
22
23
  - [Low-level API](#low-level-api)
@@ -83,7 +84,7 @@ Free resource combination:
83
84
  - **China**: Tencent EdgeOne (free tier) + Alibaba ESA (free tier)
84
85
  - **Routing**: Huawei Cloud DNS (free, supports province/ISP-level routing)
85
86
 
86
- This tool's role: Resolve CDN CNAME to region-optimal IPs, generate static records for GeoDNS import, enabling precise routing.
87
+ This tool's role: Resolve CDN CNAME to region-optimal IPs, sync to Huawei Cloud DNS via API, enabling precise routing.
87
88
 
88
89
  ### Why Huawei Cloud DNS
89
90
 
@@ -108,7 +109,7 @@ Workflow with this tool: Run scripts periodically to fetch latest CDN IPs, updat
108
109
  CNAME flattening resolves CNAME records to A/AAAA records at DNS level. This tool queries DoH (DNS over HTTPS) servers with EDNS Client Subnet (ECS) to obtain region-specific IP addresses for CDN domains.
109
110
 
110
111
  Use cases:
111
- - Generate static DNS records for GeoDNS services (Huawei Cloud DNS, etc.)
112
+ - Sync DNS records to Huawei Cloud DNS for GeoDNS routing
112
113
  - Test CDN node distribution across regions
113
114
  - Analyze DNS resolution behavior from different locations
114
115
 
@@ -120,6 +121,7 @@ Use cases:
120
121
  - Concurrent queries with rate limiting (10 parallel)
121
122
  - Auto-retry on failure (3 attempts)
122
123
  - Smart aggregation: deduplicate IPs by carrier/city/continent hierarchy
124
+ - Huawei Cloud DNS sync: create, update, delete records via API
123
125
 
124
126
  ## Installation
125
127
 
@@ -129,6 +131,40 @@ bun i @js0.site/edns
129
131
 
130
132
  ## Usage
131
133
 
134
+ ### Huawei Cloud DNS Sync
135
+
136
+ Typical scenario: Cloudflare overseas + Tencent EdgeOne / Alibaba ESA in China, routed via Huawei Cloud DNS.
137
+
138
+ ```javascript
139
+ import Hw from "@js0.site/edns/Hw.js";
140
+
141
+ const hw = Hw([ak, sk, endpoint, project_id]);
142
+
143
+ const result = await hw(
144
+ "example.com",
145
+ // China CDN CNAMEs (Tencent EdgeOne + Alibaba ESA)
146
+ ["example.com.cdn.dnsv1.com.cn", "example.com.chinese.cdnhwc2.com"],
147
+ // Global CDN CNAME (Cloudflare SaaS)
148
+ ["cdn.example.workers.dev"],
149
+ );
150
+
151
+ console.log(`add ${result.add}, update ${result.upd}, delete ${result.rm}, unchanged ${result.same}`);
152
+ ```
153
+
154
+ Sync behavior:
155
+ - **Add**: target has record, DNS doesn't → create
156
+ - **Update**: both have record, IPs differ → update in place
157
+ - **Delete**: DNS has record, target doesn't → remove
158
+ - **Unchanged**: IPs match → skip
159
+
160
+ Free CDN combination:
161
+ - **Overseas**: Cloudflare SaaS custom hostname (free, CNAME access)
162
+ - **China Telecom/Unicom**: Tencent EdgeOne (free tier)
163
+ - **China Mobile**: Alibaba ESA (free tier)
164
+ - **Routing**: Huawei Cloud DNS (free, 31 provinces × 3 ISPs)
165
+
166
+ China CDN free tiers are limited; using two providers splits traffic and avoids quota limits.
167
+
132
168
  ### China Regions
133
169
 
134
170
  ```javascript
@@ -185,6 +221,7 @@ bun test/global.js # Global regions
185
221
  bun test/v4.js # IPv4 raw
186
222
  bun test/v6.js # IPv6 raw
187
223
  bun test/verify.js # IP geolocation check
224
+ bun test/hwSet.js # Huawei DNS sync
188
225
  ```
189
226
 
190
227
  ## Architecture
@@ -212,6 +249,12 @@ graph TD
212
249
  GEO[geo/GLOBAL.js] --> GL
213
250
  end
214
251
 
252
+ subgraph Sync
253
+ HW[Hw.js] --> CN
254
+ HW --> GL
255
+ HW --> HWAPI[Huawei Cloud DNS API]
256
+ end
257
+
215
258
  DOH --> DNSPOD[DNSPod]
216
259
  DOH --> ALI[Alibaba DNS]
217
260
  ```
@@ -223,6 +266,7 @@ Call flow:
223
266
  3. `flatten()` iterates lines, constructs DoH queries with ECS parameter
224
267
  4. `queryDoh()` sends HTTP request, parses JSON, filters valid IPs
225
268
  5. High-level modules aggregate/filter results by hierarchy
269
+ 6. `Hw.js` resolves CNAMEs via `cn.js`/`global.js`, syncs to Huawei Cloud DNS
226
270
 
227
271
  ## Directory Structure
228
272
 
@@ -233,6 +277,7 @@ src/
233
277
  ├── v6.js # IPv6 resolver (Alibaba DoH)
234
278
  ├── cn.js # China aggregator
235
279
  ├── global.js # Global aggregator
280
+ ├── Hw.js # Huawei Cloud DNS sync
236
281
  ├── v4/
237
282
  │ ├── CN.js # China ECS IPs (31 provinces × 3 ISPs)
238
283
  │ └── GLOBAL.js # Global ECS IPs (40+ regions)
@@ -248,7 +293,10 @@ test/
248
293
  ├── global.js # Global test
249
294
  ├── v4.js # IPv4 test
250
295
  ├── v6.js # IPv6 test
251
- └── verify.js # Geolocation verification
296
+ ├── verify.js # Geolocation verification
297
+ ├── hwSet.js # Huawei DNS sync test
298
+ ├── hwLines.js # List Huawei DNS lines
299
+ └── hwRateLimit.js # Rate limit test
252
300
  ```
253
301
 
254
302
  ## Tech Stack
@@ -256,6 +304,7 @@ test/
256
304
  - Runtime: Bun / Node.js (ESM)
257
305
  - HTTP: Native fetch API
258
306
  - Concurrency: p-limit
307
+ - DNS Provider: Huawei Cloud SDK
259
308
  - Geolocation: MaxMind GeoLite2 (dev)
260
309
  - Protocol: DNS over HTTPS (RFC 8484), EDNS Client Subnet (RFC 7871)
261
310
 
@@ -295,7 +344,8 @@ We are redefining the development paradigm of the Internet in a componentized wa
295
344
  - [功能](#功能)
296
345
  - [安装](#安装)
297
346
  - [使用](#使用)
298
- - [国内分区](#国内分区)
347
+ - [华为云 DNS 同步](#华为云-dns-同步)
348
+ - [中国大陆分区](#中国大陆分区)
299
349
  - [海外分区](#海外分区)
300
350
  - [底层 API](#底层-api)
301
351
  - [架构](#架构)
@@ -321,25 +371,25 @@ Cloudflare 提供免费的 CNAME 扁平化,但存在问题:
321
371
 
322
372
  1. **解析位置固定**:Cloudflare 从其数据中心发起 DNS 查询,对于中国 CDN,查询来源是海外 IP
323
373
  2. **无 ECS 支持**:查询不携带客户端子网信息,CDN 无法判断真实用户位置
324
- 3. **结果偏差**:中国用户访问时,CDN 返回的是针对海外优化的节点 IP,而非国内最优节点
374
+ 3. **结果偏差**:中国用户访问时,CDN 返回的是针对海外优化的节点 IP,而非中国大陆最优节点
325
375
  4. **单 IP 返回**:扁平化后只返回单个 IP,无法利用多节点负载均衡
326
376
 
327
377
  例如:腾讯云 CDN 的 CNAME 被 Cloudflare 解析时,返回的可能是香港或新加坡节点,而非北京或上海节点。
328
378
 
329
- **为什么海外 CDN 用 Anycast 没问题,国内却不行?**
379
+ **为什么海外 CDN 用 Anycast 没问题,中国大陆却不行?**
330
380
 
331
381
  Anycast 是将同一 IP 广播到多个地理位置,用户自动路由到最近节点。海外 CDN(如 Cloudflare)大量使用 Anycast,效果很好。但中国网络环境特殊:
332
382
 
333
383
  - **运营商互联瓶颈**:电信、移动、联通三大运营商之间互联带宽有限,跨网访问延迟高
334
- - **BGP 路由策略**:国内 ISP 的 BGP 路由策略复杂,Anycast 路由不一定最优
335
- - **监管要求**:国内 IP 广播需要备案,Anycast 部署门槛高
336
- - **网络拓扑**:国内网络以省为单位分割,同省不同运营商的延迟可能比跨省同运营商还高
384
+ - **BGP 路由策略**:中国大陆 ISP 的 BGP 路由策略复杂,Anycast 路由不一定最优
385
+ - **监管要求**:中国大陆 IP 广播需要备案,Anycast 部署门槛高
386
+ - **网络拓扑**:中国大陆网络以省为单位分割,同省不同运营商的延迟可能比跨省同运营商还高
337
387
 
338
- 因此国内 CDN 普遍采用 **Unicast + 智能 DNS 调度**:为每个节点分配独立 IP,通过 DNS 返回最优节点。这要求 DNS 能识别用户的运营商和地理位置,正是本工具解决的问题。
388
+ 因此中国大陆 CDN 普遍采用 **Unicast + 智能 DNS 调度**:为每个节点分配独立 IP,通过 DNS 返回最优节点。这要求 DNS 能识别用户的运营商和地理位置,正是本工具解决的问题。
339
389
 
340
390
  ### 中国友好的免费 CDN 方案
341
391
 
342
- 解决思路:境外用 Cloudflare,境内用国内 CDN,通过 GeoDNS 分流。
392
+ 解决思路:境外用 Cloudflare,中国大陆用国产 CDN,通过 GeoDNS 分流。
343
393
 
344
394
  推荐架构:
345
395
 
@@ -361,11 +411,11 @@ graph TD
361
411
  - **境内**:腾讯云 EdgeOne(免费额度)+ 阿里云 ESA(免费额度)
362
412
  - **调度**:华为云 DNS(免费,支持分省分运营商解析)
363
413
 
364
- 本工具的作用:将 CDN 的 CNAME 解析为各地区最优 IP,生成静态记录导入 GeoDNS,实现精准调度。
414
+ 本工具的作用:将 CDN 的 CNAME 解析为各地区最优 IP,通过 API 同步到华为云 DNS,实现精准调度。
365
415
 
366
416
  ### 为什么选华为云 DNS
367
417
 
368
- 国内主流 DNS 服务商对比:
418
+ 中国大陆主流 DNS 服务商对比:
369
419
 
370
420
  | 服务商 | 免费版分区解析 | 线路覆盖 | API 支持 |
371
421
  |--------|---------------|---------|---------|
@@ -381,12 +431,13 @@ graph TD
381
431
 
382
432
  本工具配合华为云 DNS 使用:定时运行脚本获取 CDN 最新 IP,通过 API 更新解析记录,实现动态 CNAME 扁平化。
383
433
 
434
+
384
435
  ## 简介
385
436
 
386
437
  CNAME 扁平化是在 DNS 层面将 CNAME 记录解析为 A/AAAA 记录。本工具通过 DoH (DNS over HTTPS) 配合 EDNS Client Subnet (ECS) 查询 CDN 域名在不同地区的解析 IP。
387
438
 
388
439
  适用场景:
389
- - GeoDNS 服务(华为云 DNS 等)生成静态解析记录
440
+ - 同步解析记录到华为云 DNS,实现 GeoDNS 调度
390
441
  - 测试 CDN 节点在各地区的分布
391
442
  - 分析不同地理位置的 DNS 解析行为
392
443
 
@@ -394,10 +445,11 @@ CNAME 扁平化是在 DNS 层面将 CNAME 记录解析为 A/AAAA 记录。本工
394
445
 
395
446
  - IPv4 解析:DNSPod DoH (`1.12.12.12`)
396
447
  - IPv6 解析:阿里云 DoH (`dns.alidns.com`)
397
- - 预置 ECS IP:国内 31 省 × 3 运营商 + 海外 40+ 地区
448
+ - 预置 ECS IP:中国大陆 31 省 × 3 运营商 + 海外 40+ 地区
398
449
  - 并发控制:限制 10 并发
399
450
  - 自动重试:失败重试 3 次
400
451
  - 智能聚合:按运营商/城市/洲级层次去重
452
+ - 华为云 DNS 同步:通过 API 创建、更新、删除记录
401
453
 
402
454
  ## 安装
403
455
 
@@ -407,7 +459,41 @@ bun i @js0.site/edns
407
459
 
408
460
  ## 使用
409
461
 
410
- ### 国内分区
462
+ ### 华为云 DNS 同步
463
+
464
+ 典型场景:境外 Cloudflare + 境内腾讯云 EdgeOne / 阿里云 ESA,通过华为云 DNS 分流。
465
+
466
+ ```javascript
467
+ import Hw from "@js0.site/edns/Hw.js";
468
+
469
+ const hw = Hw([ak, sk, endpoint, project_id]);
470
+
471
+ const result = await hw(
472
+ "example.com",
473
+ // 中国大陆 CDN CNAME(腾讯云 EdgeOne + 阿里云 ESA)
474
+ ["example.com.cdn.dnsv1.com.cn", "example.com.chinese.cdnhwc2.com"],
475
+ // 海外 CDN CNAME(Cloudflare SaaS)
476
+ ["cdn.example.workers.dev"],
477
+ );
478
+
479
+ console.log(`添加 ${result.add}, 更新 ${result.upd}, 删除 ${result.rm}, 未变 ${result.same}`);
480
+ ```
481
+
482
+ 同步行为:
483
+ - **添加**:目标有记录,DNS 无 → 创建
484
+ - **更新**:两边都有,IP 不同 → 原地更新
485
+ - **删除**:DNS 有记录,目标无 → 移除
486
+ - **未变**:IP 一致 → 跳过
487
+
488
+ 免费 CDN 组合:
489
+ - **境外**:Cloudflare SaaS 自定义域名(免费,CNAME 接入)
490
+ - **中国大陆电信/联通**:腾讯云 EdgeOne(免费额度)
491
+ - **中国大陆移动**:阿里云 ESA(免费额度)
492
+ - **调度**:华为云 DNS(免费,支持 31 省 × 3 运营商)
493
+
494
+ 中国大陆 CDN 免费额度较小,同时使用两家可分摊流量,避免超限。
495
+
496
+ ### 中国大陆分区
411
497
 
412
498
  ```javascript
413
499
  import cn from "@js0.site/edns/cn.js";
@@ -458,13 +544,15 @@ const cnResult = await flattenV4("cdn.example.com", CN);
458
544
  运行测试:
459
545
 
460
546
  ```bash
461
- bun test/cn.js # 国内分区
547
+ bun test/cn.js # 中国大陆分区
462
548
  bun test/global.js # 海外分区
463
549
  bun test/v4.js # IPv4 原始
464
550
  bun test/v6.js # IPv6 原始
465
551
  bun test/verify.js # IP 归属地校验
552
+ bun test/hwSet.js # 华为云 DNS 同步
466
553
  ```
467
554
 
555
+
468
556
  ## 架构
469
557
 
470
558
  ```mermaid
@@ -490,6 +578,12 @@ graph TD
490
578
  GEO[geo/GLOBAL.js] --> GL
491
579
  end
492
580
 
581
+ subgraph 同步
582
+ HW[Hw.js] --> CN
583
+ HW --> GL
584
+ HW --> HWAPI[华为云 DNS API]
585
+ end
586
+
493
587
  DOH --> DNSPOD[DNSPod]
494
588
  DOH --> ALI[阿里云 DNS]
495
589
  ```
@@ -501,6 +595,8 @@ graph TD
501
595
  3. `flatten()` 遍历线路,构造带 ECS 参数的 DoH 查询
502
596
  4. `queryDoh()` 发送 HTTP 请求,解析 JSON,过滤有效 IP
503
597
  5. 高层模块按层次聚合/过滤结果
598
+ 6. `Hw.js` 通过 `cn.js`/`global.js` 解析 CNAME,同步到华为云 DNS
599
+
504
600
 
505
601
  ## 目录结构
506
602
 
@@ -509,10 +605,11 @@ src/
509
605
  ├── base.js # 核心:queryDoh, flatten, isSubset
510
606
  ├── v4.js # IPv4 解析器 (DNSPod DoH)
511
607
  ├── v6.js # IPv6 解析器 (阿里云 DoH)
512
- ├── cn.js # 国内聚合器
608
+ ├── cn.js # 中国大陆聚合器
513
609
  ├── global.js # 海外聚合器
610
+ ├── Hw.js # 华为云 DNS 同步
514
611
  ├── v4/
515
- │ ├── CN.js # 国内 ECS IP (31 省 × 3 运营商)
612
+ │ ├── CN.js # 中国大陆 ECS IP (31 省 × 3 运营商)
516
613
  │ └── GLOBAL.js # 海外 ECS IP (40+ 地区)
517
614
  ├── v6/
518
615
  │ ├── CN.js # 复用 v4/CN.js
@@ -522,11 +619,14 @@ src/
522
619
 
523
620
  test/
524
621
  ├── lib.js # 测试工具
525
- ├── cn.js # 国内测试
622
+ ├── cn.js # 中国大陆测试
526
623
  ├── global.js # 海外测试
527
624
  ├── v4.js # IPv4 测试
528
625
  ├── v6.js # IPv6 测试
529
- └── verify.js # 归属地校验
626
+ ├── verify.js # 归属地校验
627
+ ├── hwSet.js # 华为云 DNS 同步测试
628
+ ├── hwLines.js # 列出华为云 DNS 线路
629
+ └── hwRateLimit.js # 限流测试
530
630
  ```
531
631
 
532
632
  ## 技术栈
@@ -534,6 +634,7 @@ test/
534
634
  - 运行时:Bun / Node.js (ESM)
535
635
  - HTTP:原生 fetch API
536
636
  - 并发:p-limit
637
+ - DNS 服务商:华为云 SDK
537
638
  - 地理库:MaxMind GeoLite2 (开发依赖)
538
639
  - 协议:DNS over HTTPS (RFC 8484)、EDNS Client Subnet (RFC 7871)
539
640
 
package/base.js CHANGED
@@ -1 +1 @@
1
- var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=(e,t)=>{for(let n of e)if(!t.has(n))return!1;return!0},o=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n)||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},s=async(e,t,n,r,a)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await o(e,{name:t,type:r,edns_client_subnet:u},a)}));return await Promise.all(c),s};export{s as flatten,a as isSubset,o as queryDoh};
1
+ var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=(e,t)=>{for(let n of e)if(!t.has(n))return!1;return!0},o=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n).toSorted()||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},s=async(e,t,n,r,a)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await o(e,{name:t,type:r,edns_client_subnet:u},a)}));return await Promise.all(c),s};export{s as flatten,a as isSubset,o as queryDoh};
package/cn.js CHANGED
@@ -1 +1 @@
1
- var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=(e,t)=>{for(let n of e)if(!t.has(n))return!1;return!0},o=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n)||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},s=async(e,t,n,r,a)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await o(e,{name:t,type:r,edns_client_subnet:u},a)}));return await Promise.all(c),s};var c={Dianxin_Liaoning:`219.148.204.66`,Yidong_Liaoning:`211.137.32.178`,Liantong_Liaoning:`202.96.64.68`,Dianxin_Jilin:`219.149.194.55`,Yidong_Jilin:`211.141.16.99`,Liantong_Jilin:`202.98.0.68`,Dianxin_Heilongjiang:`112.100.100.100`,Yidong_Heilongjiang:`211.137.241.34`,Liantong_Heilongjiang:`202.97.224.68`,Dianxin_Beijing:`219.141.136.10`,Yidong_Beijing:`221.130.33.52`,Liantong_Beijing:`202.106.196.115`,Dianxin_Tianjin:`219.150.32.132`,Yidong_Tianjin:`211.137.160.5`,Liantong_Tianjin:`202.99.96.68`,Dianxin_Hebei:`222.222.222.222`,Yidong_Hebei:`211.138.13.66`,Liantong_Hebei:`202.99.160.68`,Dianxin_Shanxi:`219.149.135.188`,Yidong_Shanxi:`211.138.106.3`,Liantong_Shanxi:`202.99.216.113`,Dianxin_Neimenggu:`219.148.162.31`,Yidong_Neimenggu:`211.138.91.1`,Liantong_Neimenggu:`202.99.224.68`,Dianxin_Hainan:`202.100.192.68`,Yidong_Hainan:`221.176.88.95`,Liantong_Hainan:`221.11.132.2`,Dianxin_Guangdong:`202.96.134.133`,Yidong_Guangdong:`211.139.163.6`,Liantong_Guangdong:`210.21.196.6`,Dianxin_Guangxi:`202.103.225.68`,Yidong_Guangxi:`211.138.245.180`,Liantong_Guangxi:`221.7.128.68`,Dianxin_Fujian:`218.85.152.99`,Yidong_Fujian:`211.138.151.161`,Liantong_Fujian:`218.104.128.106`,Dianxin_Hunan:`222.246.129.80`,Yidong_Hunan:`211.142.210.98`,Liantong_Hunan:`58.20.127.238`,Dianxin_Hubei:`202.103.24.68`,Yidong_Hubei:`211.137.58.20`,Liantong_Hubei:`218.104.111.114`,Dianxin_Henan:`222.85.85.85`,Yidong_Henan:`211.138.24.71`,Liantong_Henan:`202.102.224.68`,Dianxin_Jiangxi:`202.101.224.69`,Yidong_Jiangxi:`211.141.90.68`,Liantong_Jiangxi:`220.248.192.12`,Dianxin_Shanghai:`202.96.209.133`,Yidong_Shanghai:`211.136.112.50`,Liantong_Shanghai:`210.22.70.3`,Dianxin_Jiangsu:`218.2.2.2`,Yidong_Jiangsu:`221.131.143.69`,Liantong_Jiangsu:`221.6.4.66`,Dianxin_Zhejiang:`202.101.172.35`,Yidong_Zhejiang:`211.140.13.188`,Liantong_Zhejiang:`221.12.1.227`,Dianxin_Anhui:`61.132.163.68`,Yidong_Anhui:`211.138.180.2`,Liantong_Anhui:`218.104.78.2`,Dianxin_Shandong:`219.146.1.66`,Yidong_Shandong:`218.201.96.130`,Liantong_Shandong:`202.102.128.68`,Dianxin_Chongqing:`61.128.192.68`,Yidong_Chongqing:`218.201.4.3`,Liantong_Chongqing:`221.5.203.98`,Dianxin_Sichuan:`61.139.2.69`,Yidong_Sichuan:`211.137.82.4`,Liantong_Sichuan:`119.6.6.6`,Dianxin_Guizhou:`202.98.192.67`,Yidong_Guizhou:`211.139.5.29`,Liantong_Guizhou:`221.13.28.234`,Dianxin_Yunnan:`222.172.200.68`,Yidong_Yunnan:`211.139.29.68`,Liantong_Yunnan:`221.3.131.11`,Dianxin_Xizang:`202.98.224.68`,Yidong_Xizang:`211.139.73.34`,Liantong_Xizang:`221.13.65.34`,Dianxin_Shaanxi:`218.30.19.40`,Yidong_Shaanxi:`211.137.130.3`,Liantong_Shaanxi:`221.11.1.67`,Dianxin_Gansu:`202.100.64.68`,Yidong_Gansu:`218.203.160.194`,Liantong_Gansu:`221.7.34.10`,Dianxin_Qinghai:`202.100.128.68`,Yidong_Qinghai:`211.138.75.123`,Liantong_Qinghai:`221.207.58.58`,Dianxin_Ningxia:`222.75.152.129`,Yidong_Ningxia:`218.203.123.116`,Liantong_Ningxia:`211.93.0.81`,Dianxin_Xinjiang:`61.128.114.166`,Yidong_Xinjiang:`218.202.152.130`,Liantong_Xinjiang:`221.7.1.21`,Jiaoyuwang:`202.112.144.30`},l=(e,t)=>s(`https://1.12.12.12/resolve`,e,t,`A`,e=>/^\d+\.\d+\.\d+\.\d+$/.test(e)),u=(e,t)=>s(`https://dns.alidns.com/resolve`,e,t,`AAAA`,e=>e.includes(`:`));const d=[`Dianxin`,`Yidong`,`Liantong`],f=new Set(d),p=(e,t=3)=>Object.entries(e).sort((e,t)=>t[1]-e[1]).slice(0,t).map(([e])=>e),m=e=>{let t={};for(let[n,r]of Object.entries(e)){let e=p(r);e.length&&(t[n]=e)}return t},h=e=>{let t={};for(let[n,r]of Object.entries(e))t[n]=new Set(r);return t},g=e=>{let t={},n={},r={},i={};for(let e of d)n[e]={};for(let[a,o]of Object.entries(e)){let[e,s]=a.split(`_`);if(i[a]=[e,s],!f.has(e))continue;for(let i of o)t[i]=(t[i]||0)+1,n[e][i]=(n[e][i]||0)+1,s&&((r[s]||={})[i]=(r[s][i]||0)+1)}let o=p(t),s=m(n),c=m(r),l=h(s),u=h(c),g=o.length?{CN:o}:{};for(let e of d)s[e]&&(g[e]=s[e]);for(let[e,t]of Object.entries(c))g[e]=t;for(let[t,n]of Object.entries(e)){let[e,r]=i[t];if(!f.has(e)){g[t]=n;continue}if(l[e]&&a(n,l[e])||r&&u[r]&&a(n,u[r]))continue;g[t]=n}return g};var _=async e=>{let[t,n]=await Promise.all([l(e,c),u(e,c)]);return{v4:g(t),v6:g(n)}};export{_ as default};
1
+ var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n).toSorted()||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},o=async(e,t,n,r,o)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await a(e,{name:t,type:r,edns_client_subnet:u},o)}));return await Promise.all(c),s};var s={Dianxin_Liaoning:`219.148.204.66`,Yidong_Liaoning:`211.137.32.178`,Liantong_Liaoning:`202.96.64.68`,Dianxin_Jilin:`219.149.194.55`,Yidong_Jilin:`211.141.16.99`,Liantong_Jilin:`202.98.0.68`,Dianxin_Heilongjiang:`112.100.100.100`,Yidong_Heilongjiang:`211.137.241.34`,Liantong_Heilongjiang:`202.97.224.68`,Dianxin_Beijing:`219.141.136.10`,Yidong_Beijing:`221.130.33.52`,Liantong_Beijing:`202.106.196.115`,Dianxin_Tianjin:`219.150.32.132`,Yidong_Tianjin:`211.137.160.5`,Liantong_Tianjin:`202.99.96.68`,Dianxin_Hebei:`222.222.222.222`,Yidong_Hebei:`211.138.13.66`,Liantong_Hebei:`202.99.160.68`,Dianxin_Shanxi:`219.149.135.188`,Yidong_Shanxi:`211.138.106.3`,Liantong_Shanxi:`202.99.216.113`,Dianxin_Neimenggu:`219.148.162.31`,Yidong_Neimenggu:`211.138.91.1`,Liantong_Neimenggu:`202.99.224.68`,Dianxin_Hainan:`202.100.192.68`,Yidong_Hainan:`221.176.88.95`,Liantong_Hainan:`221.11.132.2`,Dianxin_Guangdong:`202.96.134.133`,Yidong_Guangdong:`211.139.163.6`,Liantong_Guangdong:`210.21.196.6`,Dianxin_Guangxi:`202.103.225.68`,Yidong_Guangxi:`211.138.245.180`,Liantong_Guangxi:`221.7.128.68`,Dianxin_Fujian:`218.85.152.99`,Yidong_Fujian:`211.138.151.161`,Liantong_Fujian:`218.104.128.106`,Dianxin_Hunan:`222.246.129.80`,Yidong_Hunan:`211.142.210.98`,Liantong_Hunan:`58.20.127.238`,Dianxin_Hubei:`202.103.24.68`,Yidong_Hubei:`211.137.58.20`,Liantong_Hubei:`218.104.111.114`,Dianxin_Henan:`222.85.85.85`,Yidong_Henan:`211.138.24.71`,Liantong_Henan:`202.102.224.68`,Dianxin_Jiangxi:`202.101.224.69`,Yidong_Jiangxi:`211.141.90.68`,Liantong_Jiangxi:`220.248.192.12`,Dianxin_Shanghai:`202.96.209.133`,Yidong_Shanghai:`211.136.112.50`,Liantong_Shanghai:`210.22.70.3`,Dianxin_Jiangsu:`218.2.2.2`,Yidong_Jiangsu:`221.131.143.69`,Liantong_Jiangsu:`221.6.4.66`,Dianxin_Zhejiang:`202.101.172.35`,Yidong_Zhejiang:`211.140.13.188`,Liantong_Zhejiang:`221.12.1.227`,Dianxin_Anhui:`61.132.163.68`,Yidong_Anhui:`211.138.180.2`,Liantong_Anhui:`218.104.78.2`,Dianxin_Shandong:`219.146.1.66`,Yidong_Shandong:`218.201.96.130`,Liantong_Shandong:`202.102.128.68`,Dianxin_Chongqing:`61.128.192.68`,Yidong_Chongqing:`218.201.4.3`,Liantong_Chongqing:`221.5.203.98`,Dianxin_Sichuan:`61.139.2.69`,Yidong_Sichuan:`211.137.82.4`,Liantong_Sichuan:`119.6.6.6`,Dianxin_Guizhou:`202.98.192.67`,Yidong_Guizhou:`211.139.5.29`,Liantong_Guizhou:`221.13.28.234`,Dianxin_Yunnan:`222.172.200.68`,Yidong_Yunnan:`211.139.29.68`,Liantong_Yunnan:`221.3.131.11`,Dianxin_Xizang:`202.98.224.68`,Yidong_Xizang:`211.139.73.34`,Liantong_Xizang:`221.13.65.34`,Dianxin_Shaanxi:`218.30.19.40`,Yidong_Shaanxi:`211.137.130.3`,Liantong_Shaanxi:`221.11.1.67`,Dianxin_Gansu:`202.100.64.68`,Yidong_Gansu:`218.203.160.194`,Liantong_Gansu:`221.7.34.10`,Dianxin_Qinghai:`202.100.128.68`,Yidong_Qinghai:`211.138.75.123`,Liantong_Qinghai:`221.207.58.58`,Dianxin_Ningxia:`222.75.152.129`,Yidong_Ningxia:`218.203.123.116`,Liantong_Ningxia:`211.93.0.81`,Dianxin_Xinjiang:`61.128.114.166`,Yidong_Xinjiang:`218.202.152.130`,Liantong_Xinjiang:`221.7.1.21`,Jiaoyuwang:`202.112.144.30`},c=(e,t)=>o(`https://1.12.12.12/resolve`,e,t,`A`,e=>/^\d+\.\d+\.\d+\.\d+$/.test(e)),l=(e,t)=>o(`https://dns.alidns.com/resolve`,e,t,`AAAA`,e=>e.includes(`:`));const u=(e,t=3)=>{let n={};for(let t of Object.values(e))for(let e of t)n[e]=(n[e]||0)+1;return Object.entries(n).sort((e,t)=>t[1]-e[1]).slice(0,t).map(([e])=>e)};var d=async e=>{let[t,n]=await Promise.all([c(e,s),l(e,s)]);return t.CN=u(t),n.CN=u(n),{v4:t,v6:n}};export{d as default};
package/global.js CHANGED
@@ -1 +1 @@
1
- var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=(e,t)=>{for(let n of e)if(!t.has(n))return!1;return!0},o=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n)||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},s=async(e,t,n,r,a)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await o(e,{name:t,type:r,edns_client_subnet:u},a)}));return await Promise.all(c),s};var c={Abroad:`8.8.8.8`,AP:`210.130.0.1`,HK:`202.181.224.2`,MO:`202.175.3.3`,TW:`168.95.1.1`,JP:`210.130.0.1`,KR:`168.126.63.1`,SG:`165.21.83.88`,TH:`203.113.5.130`,MY:`49.236.193.35`,ID:`202.134.0.155`,PH:`121.58.203.4`,VN:`203.162.4.191`,IN:`117.254.160.1`,AE:`94.200.200.200`,TR:`195.175.39.39`,IL:`147.235.225.1`,OA:`139.130.4.5`,AU:`139.130.4.5`,NZ:`202.27.184.3`,EU:`194.150.168.168`,DE:`194.150.168.168`,GB:`158.43.128.1`,FR:`80.67.169.12`,NL:`193.176.144.22`,IT:`217.141.248.10`,ES:`195.235.113.3`,RU:`77.88.8.8`,PL:`194.204.159.1`,SE:`194.17.47.1`,CH:`195.186.1.111`,NA:`64.6.64.6`,US:`64.6.64.6`,CA:`149.112.121.10`,MX:`200.94.0.10`,LA:`200.221.11.101`,BR:`200.221.11.100`,AR:`200.49.130.47`,CL:`200.1.123.46`,AF:`196.216.2.1`,ZA:`169.239.128.40`,EG:`41.128.128.128`},l=(e,t)=>s(`https://1.12.12.12/resolve`,e,t,`A`,e=>/^\d+\.\d+\.\d+\.\d+$/.test(e)),u={Abroad:`2001:4860:4860::8888`,AP:`2001:240::1`,HK:`2403:2c80::1`,TW:`2001:b000:168::1`,JP:`2001:240::1`,KR:`2001:dc5:ad::1`,SG:`2406:3003:2006:1475::1`,IN:`2405:200:1000::1`,OA:`2001:44b8:1::1`,AU:`2001:44b8:1::1`,EU:`2a01:4f8:0:a0a1::add:9999`,DE:`2a01:4f8:0:a0a1::add:9999`,GB:`2a02:c7f:7e2e:6c00::1`,FR:`2001:910:800::12`,NL:`2a02:2770::21a:4aff:fec8:b0d`,RU:`2a02:6b8::feed:0ff`,SE:`2a01:3f0:0:301::1`,CH:`2a02:a90:0:10::11`,NA:`2620:74:1b::1:1`,US:`2620:74:1b::1:1`,CA:`2620:10a:80bb::10`,LA:`2001:12ff::1`,BR:`2804:10:10::10`,AF:`2c0f:fc89:8001::1`,ZA:`2001:4200:1::1`},d=(e,t)=>s(`https://dns.alidns.com/resolve`,e,t,`AAAA`,e=>e.includes(`:`)),f={AP:new Set([`HK`,`MO`,`TW`,`JP`,`KR`,`SG`,`TH`,`MY`,`ID`,`PH`,`VN`,`IN`,`AE`,`TR`,`IL`]),OA:new Set([`AU`,`NZ`,`FJ`,`PG`]),EU:new Set([`DE`,`GB`,`FR`,`NL`,`IT`,`ES`,`RU`,`PL`,`SE`,`CH`,`AT`,`BE`,`CZ`,`DK`,`FI`,`GR`,`HU`,`IE`,`NO`,`PT`,`RO`,`UA`]),NA:new Set([`US`,`CA`,`MX`]),LA:new Set([`BR`,`AR`,`CL`,`CO`,`PE`,`VE`,`EC`,`BO`,`PY`,`UY`]),AF:new Set([`ZA`,`EG`,`NG`,`KE`,`MA`,`GH`,`TZ`,`ET`])};const p=e=>{let t=e.default_view||[];if(!t.length)return e;let n=new Set(t),r={default_view:t},i={};for(let t of Object.keys(f))e[t]&&(i[t]=new Set(e[t]));for(let[t,o]of Object.entries(e)){if(t===`default_view`||a(o,n))continue;let e=!1;for(let[n,r]of Object.entries(f))if(r.has(t)&&i[n]&&a(o,i[n])){e=!0;break}e||(r[t]=o)}return r},m=e=>{let{Abroad:t,...n}=e;return t?{default_view:t,...n}:e};var h=async e=>{let[t,n]=await Promise.all([l(e,m(c)),d(e,m(u))]);return{v4:p(t),v6:p(n)}};export{h as default};
1
+ var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=(e,t)=>{for(let n of e)if(!t.has(n))return!1;return!0},o=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n).toSorted()||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},s=async(e,t,n,r,a)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await o(e,{name:t,type:r,edns_client_subnet:u},a)}));return await Promise.all(c),s};var c={Abroad:`8.8.8.8`,AP:`210.130.0.1`,HK:`202.181.224.2`,MO:`202.175.3.3`,TW:`168.95.1.1`,JP:`210.130.0.1`,KR:`168.126.63.1`,SG:`165.21.83.88`,TH:`203.113.5.130`,MY:`49.236.193.35`,ID:`202.134.0.155`,PH:`121.58.203.4`,VN:`203.162.4.191`,IN:`117.254.160.1`,AE:`94.200.200.200`,TR:`195.175.39.39`,IL:`147.235.225.1`,OA:`139.130.4.5`,AU:`139.130.4.5`,NZ:`202.27.184.3`,EU:`194.150.168.168`,DE:`194.150.168.168`,GB:`158.43.128.1`,FR:`80.67.169.12`,NL:`193.176.144.22`,IT:`217.141.248.10`,ES:`195.235.113.3`,RU:`77.88.8.8`,PL:`194.204.159.1`,SE:`194.17.47.1`,CH:`195.186.1.111`,NA:`64.6.64.6`,US:`64.6.64.6`,CA:`149.112.121.10`,MX:`200.94.0.10`,LA:`200.221.11.101`,BR:`200.221.11.100`,AR:`200.49.130.47`,CL:`200.1.123.46`,AF:`196.216.2.1`,ZA:`169.239.128.40`,EG:`41.128.128.128`},l=(e,t)=>s(`https://1.12.12.12/resolve`,e,t,`A`,e=>/^\d+\.\d+\.\d+\.\d+$/.test(e)),u={Abroad:`2001:4860:4860::8888`,AP:`2001:240::1`,HK:`2403:2c80::1`,TW:`2001:b000:168::1`,JP:`2001:240::1`,KR:`2001:dc5:ad::1`,SG:`2406:3003:2006:1475::1`,IN:`2405:200:1000::1`,OA:`2001:44b8:1::1`,AU:`2001:44b8:1::1`,EU:`2a01:4f8:0:a0a1::add:9999`,DE:`2a01:4f8:0:a0a1::add:9999`,GB:`2a02:c7f:7e2e:6c00::1`,FR:`2001:910:800::12`,NL:`2a02:2770::21a:4aff:fec8:b0d`,RU:`2a02:6b8::feed:0ff`,SE:`2a01:3f0:0:301::1`,CH:`2a02:a90:0:10::11`,NA:`2620:74:1b::1:1`,US:`2620:74:1b::1:1`,CA:`2620:10a:80bb::10`,LA:`2001:12ff::1`,BR:`2804:10:10::10`,AF:`2c0f:fc89:8001::1`,ZA:`2001:4200:1::1`},d=(e,t)=>s(`https://dns.alidns.com/resolve`,e,t,`AAAA`,e=>e.includes(`:`)),f={AP:new Set([`HK`,`MO`,`TW`,`JP`,`KR`,`SG`,`TH`,`MY`,`ID`,`PH`,`VN`,`IN`,`AE`,`TR`,`IL`]),OA:new Set([`AU`,`NZ`,`FJ`,`PG`]),EU:new Set([`DE`,`GB`,`FR`,`NL`,`IT`,`ES`,`RU`,`PL`,`SE`,`CH`,`AT`,`BE`,`CZ`,`DK`,`FI`,`GR`,`HU`,`IE`,`NO`,`PT`,`RO`,`UA`]),NA:new Set([`US`,`CA`,`MX`]),LA:new Set([`BR`,`AR`,`CL`,`CO`,`PE`,`VE`,`EC`,`BO`,`PY`,`UY`]),AF:new Set([`ZA`,`EG`,`NG`,`KE`,`MA`,`GH`,`TZ`,`ET`])};const p=e=>{let t=e.default_view||[];if(!t.length)return e;let n=new Set(t),r={default_view:t},i={};for(let t of Object.keys(f))e[t]&&(i[t]=new Set(e[t]));for(let[t,o]of Object.entries(e)){if(t===`default_view`||a(o,n))continue;let e=!1;for(let[n,r]of Object.entries(f))if(r.has(t)&&i[n]&&a(o,i[n])){e=!0;break}e||(r[t]=o)}return r},m=e=>{let{Abroad:t,...n}=e;return t?{default_view:t,...n}:e};var h=async e=>{let[t,n]=await Promise.all([l(e,m(c)),d(e,m(u))]);return{v4:p(t),v6:p(n)}};export{h as default};
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@js0.site/edns","version":"0.1.1","description":"Geo-aware CNAME flattening via DoH + ECS / 基于 DoH + ECS 的地理感知 CNAME 扁平化","keywords":["dns","doh","ecs","cname","geodns"],"repository":{"type":"git","url":"git+https://github.com/js0-site/js.git"},"homepage":"https://github.com/js0-site/js/tree/main/edns","author":"jssite@googlegroups.com","license":"MulanPSL-2.0","exports":{".":"./lib.js","./*":"./*"},"files":["*"],"type":"module","dependencies":{"maxmind":"^5.0.1","p-limit":"^7.2.0"}}
1
+ {"name":"@js0.site/edns","version":"0.1.2","description":"Geo-aware CNAME flattening via DoH + ECS / 基于 DoH + ECS 的地理感知 CNAME 扁平化","keywords":["dns","doh","ecs","cname","geodns"],"repository":{"type":"git","url":"git+https://github.com/js0-site/js.git"},"homepage":"https://github.com/js0-site/js/tree/main/edns","author":"jssite@googlegroups.com","license":"MulanPSL-2.0","exports":{".":"./lib.js","./*":"./*"},"files":["*"],"type":"module","dependencies":{"@3-/pageiter":"^0.1.2","@3-/sleep":"^0.0.4","@huaweicloud/huaweicloud-sdk-dns":"^3.1.180","maxmind":"^5.0.1","p-limit":"^7.2.0","uuid":"^13.0.0"}}
package/v4.js CHANGED
@@ -1 +1 @@
1
- var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n)||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},o=async(e,t,n,r,o)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await a(e,{name:t,type:r,edns_client_subnet:u},o)}));return await Promise.all(c),s};var s={Dianxin_Liaoning:`219.148.204.66`,Yidong_Liaoning:`211.137.32.178`,Liantong_Liaoning:`202.96.64.68`,Dianxin_Jilin:`219.149.194.55`,Yidong_Jilin:`211.141.16.99`,Liantong_Jilin:`202.98.0.68`,Dianxin_Heilongjiang:`112.100.100.100`,Yidong_Heilongjiang:`211.137.241.34`,Liantong_Heilongjiang:`202.97.224.68`,Dianxin_Beijing:`219.141.136.10`,Yidong_Beijing:`221.130.33.52`,Liantong_Beijing:`202.106.196.115`,Dianxin_Tianjin:`219.150.32.132`,Yidong_Tianjin:`211.137.160.5`,Liantong_Tianjin:`202.99.96.68`,Dianxin_Hebei:`222.222.222.222`,Yidong_Hebei:`211.138.13.66`,Liantong_Hebei:`202.99.160.68`,Dianxin_Shanxi:`219.149.135.188`,Yidong_Shanxi:`211.138.106.3`,Liantong_Shanxi:`202.99.216.113`,Dianxin_Neimenggu:`219.148.162.31`,Yidong_Neimenggu:`211.138.91.1`,Liantong_Neimenggu:`202.99.224.68`,Dianxin_Hainan:`202.100.192.68`,Yidong_Hainan:`221.176.88.95`,Liantong_Hainan:`221.11.132.2`,Dianxin_Guangdong:`202.96.134.133`,Yidong_Guangdong:`211.139.163.6`,Liantong_Guangdong:`210.21.196.6`,Dianxin_Guangxi:`202.103.225.68`,Yidong_Guangxi:`211.138.245.180`,Liantong_Guangxi:`221.7.128.68`,Dianxin_Fujian:`218.85.152.99`,Yidong_Fujian:`211.138.151.161`,Liantong_Fujian:`218.104.128.106`,Dianxin_Hunan:`222.246.129.80`,Yidong_Hunan:`211.142.210.98`,Liantong_Hunan:`58.20.127.238`,Dianxin_Hubei:`202.103.24.68`,Yidong_Hubei:`211.137.58.20`,Liantong_Hubei:`218.104.111.114`,Dianxin_Henan:`222.85.85.85`,Yidong_Henan:`211.138.24.71`,Liantong_Henan:`202.102.224.68`,Dianxin_Jiangxi:`202.101.224.69`,Yidong_Jiangxi:`211.141.90.68`,Liantong_Jiangxi:`220.248.192.12`,Dianxin_Shanghai:`202.96.209.133`,Yidong_Shanghai:`211.136.112.50`,Liantong_Shanghai:`210.22.70.3`,Dianxin_Jiangsu:`218.2.2.2`,Yidong_Jiangsu:`221.131.143.69`,Liantong_Jiangsu:`221.6.4.66`,Dianxin_Zhejiang:`202.101.172.35`,Yidong_Zhejiang:`211.140.13.188`,Liantong_Zhejiang:`221.12.1.227`,Dianxin_Anhui:`61.132.163.68`,Yidong_Anhui:`211.138.180.2`,Liantong_Anhui:`218.104.78.2`,Dianxin_Shandong:`219.146.1.66`,Yidong_Shandong:`218.201.96.130`,Liantong_Shandong:`202.102.128.68`,Dianxin_Chongqing:`61.128.192.68`,Yidong_Chongqing:`218.201.4.3`,Liantong_Chongqing:`221.5.203.98`,Dianxin_Sichuan:`61.139.2.69`,Yidong_Sichuan:`211.137.82.4`,Liantong_Sichuan:`119.6.6.6`,Dianxin_Guizhou:`202.98.192.67`,Yidong_Guizhou:`211.139.5.29`,Liantong_Guizhou:`221.13.28.234`,Dianxin_Yunnan:`222.172.200.68`,Yidong_Yunnan:`211.139.29.68`,Liantong_Yunnan:`221.3.131.11`,Dianxin_Xizang:`202.98.224.68`,Yidong_Xizang:`211.139.73.34`,Liantong_Xizang:`221.13.65.34`,Dianxin_Shaanxi:`218.30.19.40`,Yidong_Shaanxi:`211.137.130.3`,Liantong_Shaanxi:`221.11.1.67`,Dianxin_Gansu:`202.100.64.68`,Yidong_Gansu:`218.203.160.194`,Liantong_Gansu:`221.7.34.10`,Dianxin_Qinghai:`202.100.128.68`,Yidong_Qinghai:`211.138.75.123`,Liantong_Qinghai:`221.207.58.58`,Dianxin_Ningxia:`222.75.152.129`,Yidong_Ningxia:`218.203.123.116`,Liantong_Ningxia:`211.93.0.81`,Dianxin_Xinjiang:`61.128.114.166`,Yidong_Xinjiang:`218.202.152.130`,Liantong_Xinjiang:`221.7.1.21`,Jiaoyuwang:`202.112.144.30`},c={Abroad:`8.8.8.8`,AP:`210.130.0.1`,HK:`202.181.224.2`,MO:`202.175.3.3`,TW:`168.95.1.1`,JP:`210.130.0.1`,KR:`168.126.63.1`,SG:`165.21.83.88`,TH:`203.113.5.130`,MY:`49.236.193.35`,ID:`202.134.0.155`,PH:`121.58.203.4`,VN:`203.162.4.191`,IN:`117.254.160.1`,AE:`94.200.200.200`,TR:`195.175.39.39`,IL:`147.235.225.1`,OA:`139.130.4.5`,AU:`139.130.4.5`,NZ:`202.27.184.3`,EU:`194.150.168.168`,DE:`194.150.168.168`,GB:`158.43.128.1`,FR:`80.67.169.12`,NL:`193.176.144.22`,IT:`217.141.248.10`,ES:`195.235.113.3`,RU:`77.88.8.8`,PL:`194.204.159.1`,SE:`194.17.47.1`,CH:`195.186.1.111`,NA:`64.6.64.6`,US:`64.6.64.6`,CA:`149.112.121.10`,MX:`200.94.0.10`,LA:`200.221.11.101`,BR:`200.221.11.100`,AR:`200.49.130.47`,CL:`200.1.123.46`,AF:`196.216.2.1`,ZA:`169.239.128.40`,EG:`41.128.128.128`},l=(e,t)=>o(`https://1.12.12.12/resolve`,e,t,`A`,e=>/^\d+\.\d+\.\d+\.\d+$/.test(e));export{s as CN,c as GLOBAL,l as default};
1
+ var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n).toSorted()||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},o=async(e,t,n,r,o)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await a(e,{name:t,type:r,edns_client_subnet:u},o)}));return await Promise.all(c),s};var s={Dianxin_Liaoning:`219.148.204.66`,Yidong_Liaoning:`211.137.32.178`,Liantong_Liaoning:`202.96.64.68`,Dianxin_Jilin:`219.149.194.55`,Yidong_Jilin:`211.141.16.99`,Liantong_Jilin:`202.98.0.68`,Dianxin_Heilongjiang:`112.100.100.100`,Yidong_Heilongjiang:`211.137.241.34`,Liantong_Heilongjiang:`202.97.224.68`,Dianxin_Beijing:`219.141.136.10`,Yidong_Beijing:`221.130.33.52`,Liantong_Beijing:`202.106.196.115`,Dianxin_Tianjin:`219.150.32.132`,Yidong_Tianjin:`211.137.160.5`,Liantong_Tianjin:`202.99.96.68`,Dianxin_Hebei:`222.222.222.222`,Yidong_Hebei:`211.138.13.66`,Liantong_Hebei:`202.99.160.68`,Dianxin_Shanxi:`219.149.135.188`,Yidong_Shanxi:`211.138.106.3`,Liantong_Shanxi:`202.99.216.113`,Dianxin_Neimenggu:`219.148.162.31`,Yidong_Neimenggu:`211.138.91.1`,Liantong_Neimenggu:`202.99.224.68`,Dianxin_Hainan:`202.100.192.68`,Yidong_Hainan:`221.176.88.95`,Liantong_Hainan:`221.11.132.2`,Dianxin_Guangdong:`202.96.134.133`,Yidong_Guangdong:`211.139.163.6`,Liantong_Guangdong:`210.21.196.6`,Dianxin_Guangxi:`202.103.225.68`,Yidong_Guangxi:`211.138.245.180`,Liantong_Guangxi:`221.7.128.68`,Dianxin_Fujian:`218.85.152.99`,Yidong_Fujian:`211.138.151.161`,Liantong_Fujian:`218.104.128.106`,Dianxin_Hunan:`222.246.129.80`,Yidong_Hunan:`211.142.210.98`,Liantong_Hunan:`58.20.127.238`,Dianxin_Hubei:`202.103.24.68`,Yidong_Hubei:`211.137.58.20`,Liantong_Hubei:`218.104.111.114`,Dianxin_Henan:`222.85.85.85`,Yidong_Henan:`211.138.24.71`,Liantong_Henan:`202.102.224.68`,Dianxin_Jiangxi:`202.101.224.69`,Yidong_Jiangxi:`211.141.90.68`,Liantong_Jiangxi:`220.248.192.12`,Dianxin_Shanghai:`202.96.209.133`,Yidong_Shanghai:`211.136.112.50`,Liantong_Shanghai:`210.22.70.3`,Dianxin_Jiangsu:`218.2.2.2`,Yidong_Jiangsu:`221.131.143.69`,Liantong_Jiangsu:`221.6.4.66`,Dianxin_Zhejiang:`202.101.172.35`,Yidong_Zhejiang:`211.140.13.188`,Liantong_Zhejiang:`221.12.1.227`,Dianxin_Anhui:`61.132.163.68`,Yidong_Anhui:`211.138.180.2`,Liantong_Anhui:`218.104.78.2`,Dianxin_Shandong:`219.146.1.66`,Yidong_Shandong:`218.201.96.130`,Liantong_Shandong:`202.102.128.68`,Dianxin_Chongqing:`61.128.192.68`,Yidong_Chongqing:`218.201.4.3`,Liantong_Chongqing:`221.5.203.98`,Dianxin_Sichuan:`61.139.2.69`,Yidong_Sichuan:`211.137.82.4`,Liantong_Sichuan:`119.6.6.6`,Dianxin_Guizhou:`202.98.192.67`,Yidong_Guizhou:`211.139.5.29`,Liantong_Guizhou:`221.13.28.234`,Dianxin_Yunnan:`222.172.200.68`,Yidong_Yunnan:`211.139.29.68`,Liantong_Yunnan:`221.3.131.11`,Dianxin_Xizang:`202.98.224.68`,Yidong_Xizang:`211.139.73.34`,Liantong_Xizang:`221.13.65.34`,Dianxin_Shaanxi:`218.30.19.40`,Yidong_Shaanxi:`211.137.130.3`,Liantong_Shaanxi:`221.11.1.67`,Dianxin_Gansu:`202.100.64.68`,Yidong_Gansu:`218.203.160.194`,Liantong_Gansu:`221.7.34.10`,Dianxin_Qinghai:`202.100.128.68`,Yidong_Qinghai:`211.138.75.123`,Liantong_Qinghai:`221.207.58.58`,Dianxin_Ningxia:`222.75.152.129`,Yidong_Ningxia:`218.203.123.116`,Liantong_Ningxia:`211.93.0.81`,Dianxin_Xinjiang:`61.128.114.166`,Yidong_Xinjiang:`218.202.152.130`,Liantong_Xinjiang:`221.7.1.21`,Jiaoyuwang:`202.112.144.30`},c={Abroad:`8.8.8.8`,AP:`210.130.0.1`,HK:`202.181.224.2`,MO:`202.175.3.3`,TW:`168.95.1.1`,JP:`210.130.0.1`,KR:`168.126.63.1`,SG:`165.21.83.88`,TH:`203.113.5.130`,MY:`49.236.193.35`,ID:`202.134.0.155`,PH:`121.58.203.4`,VN:`203.162.4.191`,IN:`117.254.160.1`,AE:`94.200.200.200`,TR:`195.175.39.39`,IL:`147.235.225.1`,OA:`139.130.4.5`,AU:`139.130.4.5`,NZ:`202.27.184.3`,EU:`194.150.168.168`,DE:`194.150.168.168`,GB:`158.43.128.1`,FR:`80.67.169.12`,NL:`193.176.144.22`,IT:`217.141.248.10`,ES:`195.235.113.3`,RU:`77.88.8.8`,PL:`194.204.159.1`,SE:`194.17.47.1`,CH:`195.186.1.111`,NA:`64.6.64.6`,US:`64.6.64.6`,CA:`149.112.121.10`,MX:`200.94.0.10`,LA:`200.221.11.101`,BR:`200.221.11.100`,AR:`200.49.130.47`,CL:`200.1.123.46`,AF:`196.216.2.1`,ZA:`169.239.128.40`,EG:`41.128.128.128`},l=(e,t)=>o(`https://1.12.12.12/resolve`,e,t,`A`,e=>/^\d+\.\d+\.\d+\.\d+$/.test(e));export{s as CN,c as GLOBAL,l as default};
package/v6.js CHANGED
@@ -1 +1 @@
1
- var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n)||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},o=async(e,t,n,r,o)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await a(e,{name:t,type:r,edns_client_subnet:u},o)}));return await Promise.all(c),s};var s={Dianxin_Liaoning:`219.148.204.66`,Yidong_Liaoning:`211.137.32.178`,Liantong_Liaoning:`202.96.64.68`,Dianxin_Jilin:`219.149.194.55`,Yidong_Jilin:`211.141.16.99`,Liantong_Jilin:`202.98.0.68`,Dianxin_Heilongjiang:`112.100.100.100`,Yidong_Heilongjiang:`211.137.241.34`,Liantong_Heilongjiang:`202.97.224.68`,Dianxin_Beijing:`219.141.136.10`,Yidong_Beijing:`221.130.33.52`,Liantong_Beijing:`202.106.196.115`,Dianxin_Tianjin:`219.150.32.132`,Yidong_Tianjin:`211.137.160.5`,Liantong_Tianjin:`202.99.96.68`,Dianxin_Hebei:`222.222.222.222`,Yidong_Hebei:`211.138.13.66`,Liantong_Hebei:`202.99.160.68`,Dianxin_Shanxi:`219.149.135.188`,Yidong_Shanxi:`211.138.106.3`,Liantong_Shanxi:`202.99.216.113`,Dianxin_Neimenggu:`219.148.162.31`,Yidong_Neimenggu:`211.138.91.1`,Liantong_Neimenggu:`202.99.224.68`,Dianxin_Hainan:`202.100.192.68`,Yidong_Hainan:`221.176.88.95`,Liantong_Hainan:`221.11.132.2`,Dianxin_Guangdong:`202.96.134.133`,Yidong_Guangdong:`211.139.163.6`,Liantong_Guangdong:`210.21.196.6`,Dianxin_Guangxi:`202.103.225.68`,Yidong_Guangxi:`211.138.245.180`,Liantong_Guangxi:`221.7.128.68`,Dianxin_Fujian:`218.85.152.99`,Yidong_Fujian:`211.138.151.161`,Liantong_Fujian:`218.104.128.106`,Dianxin_Hunan:`222.246.129.80`,Yidong_Hunan:`211.142.210.98`,Liantong_Hunan:`58.20.127.238`,Dianxin_Hubei:`202.103.24.68`,Yidong_Hubei:`211.137.58.20`,Liantong_Hubei:`218.104.111.114`,Dianxin_Henan:`222.85.85.85`,Yidong_Henan:`211.138.24.71`,Liantong_Henan:`202.102.224.68`,Dianxin_Jiangxi:`202.101.224.69`,Yidong_Jiangxi:`211.141.90.68`,Liantong_Jiangxi:`220.248.192.12`,Dianxin_Shanghai:`202.96.209.133`,Yidong_Shanghai:`211.136.112.50`,Liantong_Shanghai:`210.22.70.3`,Dianxin_Jiangsu:`218.2.2.2`,Yidong_Jiangsu:`221.131.143.69`,Liantong_Jiangsu:`221.6.4.66`,Dianxin_Zhejiang:`202.101.172.35`,Yidong_Zhejiang:`211.140.13.188`,Liantong_Zhejiang:`221.12.1.227`,Dianxin_Anhui:`61.132.163.68`,Yidong_Anhui:`211.138.180.2`,Liantong_Anhui:`218.104.78.2`,Dianxin_Shandong:`219.146.1.66`,Yidong_Shandong:`218.201.96.130`,Liantong_Shandong:`202.102.128.68`,Dianxin_Chongqing:`61.128.192.68`,Yidong_Chongqing:`218.201.4.3`,Liantong_Chongqing:`221.5.203.98`,Dianxin_Sichuan:`61.139.2.69`,Yidong_Sichuan:`211.137.82.4`,Liantong_Sichuan:`119.6.6.6`,Dianxin_Guizhou:`202.98.192.67`,Yidong_Guizhou:`211.139.5.29`,Liantong_Guizhou:`221.13.28.234`,Dianxin_Yunnan:`222.172.200.68`,Yidong_Yunnan:`211.139.29.68`,Liantong_Yunnan:`221.3.131.11`,Dianxin_Xizang:`202.98.224.68`,Yidong_Xizang:`211.139.73.34`,Liantong_Xizang:`221.13.65.34`,Dianxin_Shaanxi:`218.30.19.40`,Yidong_Shaanxi:`211.137.130.3`,Liantong_Shaanxi:`221.11.1.67`,Dianxin_Gansu:`202.100.64.68`,Yidong_Gansu:`218.203.160.194`,Liantong_Gansu:`221.7.34.10`,Dianxin_Qinghai:`202.100.128.68`,Yidong_Qinghai:`211.138.75.123`,Liantong_Qinghai:`221.207.58.58`,Dianxin_Ningxia:`222.75.152.129`,Yidong_Ningxia:`218.203.123.116`,Liantong_Ningxia:`211.93.0.81`,Dianxin_Xinjiang:`61.128.114.166`,Yidong_Xinjiang:`218.202.152.130`,Liantong_Xinjiang:`221.7.1.21`,Jiaoyuwang:`202.112.144.30`},c={Abroad:`2001:4860:4860::8888`,AP:`2001:240::1`,HK:`2403:2c80::1`,TW:`2001:b000:168::1`,JP:`2001:240::1`,KR:`2001:dc5:ad::1`,SG:`2406:3003:2006:1475::1`,IN:`2405:200:1000::1`,OA:`2001:44b8:1::1`,AU:`2001:44b8:1::1`,EU:`2a01:4f8:0:a0a1::add:9999`,DE:`2a01:4f8:0:a0a1::add:9999`,GB:`2a02:c7f:7e2e:6c00::1`,FR:`2001:910:800::12`,NL:`2a02:2770::21a:4aff:fec8:b0d`,RU:`2a02:6b8::feed:0ff`,SE:`2a01:3f0:0:301::1`,CH:`2a02:a90:0:10::11`,NA:`2620:74:1b::1:1`,US:`2620:74:1b::1:1`,CA:`2620:10a:80bb::10`,LA:`2001:12ff::1`,BR:`2804:10:10::10`,AF:`2c0f:fc89:8001::1`,ZA:`2001:4200:1::1`},l=(e,t)=>o(`https://dns.alidns.com/resolve`,e,t,`AAAA`,e=>e.includes(`:`));export{s as CN,c as GLOBAL,l as default};
1
+ var e=class{value;next;constructor(e){this.value=e}},t=class{#head;#tail;#size;constructor(){this.clear()}enqueue(t){let n=new e(t);this.#head?(this.#tail.next=n,this.#tail=n):(this.#head=n,this.#tail=n),this.#size++}dequeue(){let e=this.#head;if(e)return this.#head=this.#head.next,this.#size--,this.#head||(this.#tail=void 0),e.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0}get size(){return this.#size}*[Symbol.iterator](){let e=this.#head;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#head;)yield this.dequeue()}};function n(e){r(e);let n=new t,i=0,a=()=>{i<e&&n.size>0&&(i++,n.dequeue()())},o=()=>{i--,a()},s=async(e,t,n)=>{let r=(async()=>e(...n))();t(r);try{await r}catch{}o()},c=(t,r,o)=>{new Promise(e=>{n.enqueue(e)}).then(s.bind(void 0,t,r,o)),i<e&&a()},l=(e,...t)=>new Promise(n=>{c(e,n,t)});return Object.defineProperties(l,{activeCount:{get:()=>i},pendingCount:{get:()=>n.size},clearQueue:{value(){n.clear()}},concurrency:{get:()=>e,set(t){r(t),e=t,queueMicrotask(()=>{for(;i<e&&n.size>0;)a()})}},map:{async value(e,t){let n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),l}function r(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const i=n(10),a=async(e,t,n)=>{let r=new URL(e);for(let[e,n]of Object.entries(t))r.searchParams.set(e,n);let i;for(let e=0;e<3;e++)try{let e=await fetch(r),t=await e.json();return t.Answer?.map(e=>e.data).filter(n).toSorted()||[]}catch(t){i=t,console.error(`retry ${e+1}/3: ${t}`)}throw i},o=async(e,t,n,r,o)=>{let s={},c=[];for(let[l,u]of Object.entries(n))c.push(i(async()=>{s[l]=await a(e,{name:t,type:r,edns_client_subnet:u},o)}));return await Promise.all(c),s};var s={Dianxin_Liaoning:`219.148.204.66`,Yidong_Liaoning:`211.137.32.178`,Liantong_Liaoning:`202.96.64.68`,Dianxin_Jilin:`219.149.194.55`,Yidong_Jilin:`211.141.16.99`,Liantong_Jilin:`202.98.0.68`,Dianxin_Heilongjiang:`112.100.100.100`,Yidong_Heilongjiang:`211.137.241.34`,Liantong_Heilongjiang:`202.97.224.68`,Dianxin_Beijing:`219.141.136.10`,Yidong_Beijing:`221.130.33.52`,Liantong_Beijing:`202.106.196.115`,Dianxin_Tianjin:`219.150.32.132`,Yidong_Tianjin:`211.137.160.5`,Liantong_Tianjin:`202.99.96.68`,Dianxin_Hebei:`222.222.222.222`,Yidong_Hebei:`211.138.13.66`,Liantong_Hebei:`202.99.160.68`,Dianxin_Shanxi:`219.149.135.188`,Yidong_Shanxi:`211.138.106.3`,Liantong_Shanxi:`202.99.216.113`,Dianxin_Neimenggu:`219.148.162.31`,Yidong_Neimenggu:`211.138.91.1`,Liantong_Neimenggu:`202.99.224.68`,Dianxin_Hainan:`202.100.192.68`,Yidong_Hainan:`221.176.88.95`,Liantong_Hainan:`221.11.132.2`,Dianxin_Guangdong:`202.96.134.133`,Yidong_Guangdong:`211.139.163.6`,Liantong_Guangdong:`210.21.196.6`,Dianxin_Guangxi:`202.103.225.68`,Yidong_Guangxi:`211.138.245.180`,Liantong_Guangxi:`221.7.128.68`,Dianxin_Fujian:`218.85.152.99`,Yidong_Fujian:`211.138.151.161`,Liantong_Fujian:`218.104.128.106`,Dianxin_Hunan:`222.246.129.80`,Yidong_Hunan:`211.142.210.98`,Liantong_Hunan:`58.20.127.238`,Dianxin_Hubei:`202.103.24.68`,Yidong_Hubei:`211.137.58.20`,Liantong_Hubei:`218.104.111.114`,Dianxin_Henan:`222.85.85.85`,Yidong_Henan:`211.138.24.71`,Liantong_Henan:`202.102.224.68`,Dianxin_Jiangxi:`202.101.224.69`,Yidong_Jiangxi:`211.141.90.68`,Liantong_Jiangxi:`220.248.192.12`,Dianxin_Shanghai:`202.96.209.133`,Yidong_Shanghai:`211.136.112.50`,Liantong_Shanghai:`210.22.70.3`,Dianxin_Jiangsu:`218.2.2.2`,Yidong_Jiangsu:`221.131.143.69`,Liantong_Jiangsu:`221.6.4.66`,Dianxin_Zhejiang:`202.101.172.35`,Yidong_Zhejiang:`211.140.13.188`,Liantong_Zhejiang:`221.12.1.227`,Dianxin_Anhui:`61.132.163.68`,Yidong_Anhui:`211.138.180.2`,Liantong_Anhui:`218.104.78.2`,Dianxin_Shandong:`219.146.1.66`,Yidong_Shandong:`218.201.96.130`,Liantong_Shandong:`202.102.128.68`,Dianxin_Chongqing:`61.128.192.68`,Yidong_Chongqing:`218.201.4.3`,Liantong_Chongqing:`221.5.203.98`,Dianxin_Sichuan:`61.139.2.69`,Yidong_Sichuan:`211.137.82.4`,Liantong_Sichuan:`119.6.6.6`,Dianxin_Guizhou:`202.98.192.67`,Yidong_Guizhou:`211.139.5.29`,Liantong_Guizhou:`221.13.28.234`,Dianxin_Yunnan:`222.172.200.68`,Yidong_Yunnan:`211.139.29.68`,Liantong_Yunnan:`221.3.131.11`,Dianxin_Xizang:`202.98.224.68`,Yidong_Xizang:`211.139.73.34`,Liantong_Xizang:`221.13.65.34`,Dianxin_Shaanxi:`218.30.19.40`,Yidong_Shaanxi:`211.137.130.3`,Liantong_Shaanxi:`221.11.1.67`,Dianxin_Gansu:`202.100.64.68`,Yidong_Gansu:`218.203.160.194`,Liantong_Gansu:`221.7.34.10`,Dianxin_Qinghai:`202.100.128.68`,Yidong_Qinghai:`211.138.75.123`,Liantong_Qinghai:`221.207.58.58`,Dianxin_Ningxia:`222.75.152.129`,Yidong_Ningxia:`218.203.123.116`,Liantong_Ningxia:`211.93.0.81`,Dianxin_Xinjiang:`61.128.114.166`,Yidong_Xinjiang:`218.202.152.130`,Liantong_Xinjiang:`221.7.1.21`,Jiaoyuwang:`202.112.144.30`},c={Abroad:`2001:4860:4860::8888`,AP:`2001:240::1`,HK:`2403:2c80::1`,TW:`2001:b000:168::1`,JP:`2001:240::1`,KR:`2001:dc5:ad::1`,SG:`2406:3003:2006:1475::1`,IN:`2405:200:1000::1`,OA:`2001:44b8:1::1`,AU:`2001:44b8:1::1`,EU:`2a01:4f8:0:a0a1::add:9999`,DE:`2a01:4f8:0:a0a1::add:9999`,GB:`2a02:c7f:7e2e:6c00::1`,FR:`2001:910:800::12`,NL:`2a02:2770::21a:4aff:fec8:b0d`,RU:`2a02:6b8::feed:0ff`,SE:`2a01:3f0:0:301::1`,CH:`2a02:a90:0:10::11`,NA:`2620:74:1b::1:1`,US:`2620:74:1b::1:1`,CA:`2620:10a:80bb::10`,LA:`2001:12ff::1`,BR:`2804:10:10::10`,AF:`2c0f:fc89:8001::1`,ZA:`2001:4200:1::1`},l=(e,t)=>o(`https://dns.alidns.com/resolve`,e,t,`AAAA`,e=>e.includes(`:`));export{s as CN,c as GLOBAL,l as default};