@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/Hw.js +43 -0
- package/README.md +122 -21
- package/base.js +1 -1
- package/cn.js +1 -1
- package/global.js +1 -1
- package/package.json +1 -1
- package/v4.js +1 -1
- package/v6.js +1 -1
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,
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
|
335
|
-
-
|
|
336
|
-
-
|
|
384
|
+
- **BGP 路由策略**:中国大陆 ISP 的 BGP 路由策略复杂,Anycast 路由不一定最优
|
|
385
|
+
- **监管要求**:中国大陆 IP 广播需要备案,Anycast 部署门槛高
|
|
386
|
+
- **网络拓扑**:中国大陆网络以省为单位分割,同省不同运营商的延迟可能比跨省同运营商还高
|
|
337
387
|
|
|
338
|
-
|
|
388
|
+
因此中国大陆 CDN 普遍采用 **Unicast + 智能 DNS 调度**:为每个节点分配独立 IP,通过 DNS 返回最优节点。这要求 DNS 能识别用户的运营商和地理位置,正是本工具解决的问题。
|
|
339
389
|
|
|
340
390
|
### 中国友好的免费 CDN 方案
|
|
341
391
|
|
|
342
|
-
解决思路:境外用 Cloudflare
|
|
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
|
|
414
|
+
本工具的作用:将 CDN 的 CNAME 解析为各地区最优 IP,通过 API 同步到华为云 DNS,实现精准调度。
|
|
365
415
|
|
|
366
416
|
### 为什么选华为云 DNS
|
|
367
417
|
|
|
368
|
-
|
|
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
|
-
-
|
|
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
|
|
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 #
|
|
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
|
-
|
|
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=
|
|
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
|
+
{"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};
|