proxy-pool-manager 1.0.8 → 1.0.10

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
@@ -4,12 +4,11 @@
4
4
 
5
5
  ## ✨ 特性
6
6
 
7
- - 🪶 **轻量级模式**:无需 MongoDB,仅使用请求和队列功能
8
- - 🔄 **智能代理管理**:支持从 MongoDB 加载代理,自动验证和轮换(可选)
7
+ - 🪶 **内存代理**:代理列表由 `proxies` 传入,只保存在进程内存中
8
+ - 🔄 **自动轮换**:请求失败时按策略切换到下一条代理
9
9
  - 🌐 **HTTP 请求封装**:内置 HTTP 客户端,支持自动代理切换或直接指定代理
10
10
  - 📊 **代理健康检查**:自动检测代理可用性,支持自定义检测规则(可选)
11
11
  - 🎯 **多种代理策略**:支持顺序、随机、故障转移三种策略
12
- - 📦 **批量操作**:支持批量插入和管理代理
13
12
  - 🔍 **日志系统**:基于 Winston 的完整日志记录
14
13
  - ⚡ **异步队列**:高效的异步任务处理机制
15
14
  - 🛡️ **类型安全**:完整的 TypeScript 类型定义
@@ -22,58 +21,52 @@ npm install proxy-pool-manager
22
21
 
23
22
  ## 🚀 快速开始
24
23
 
25
- ### 轻量级模式(推荐,无需 MongoDB)
24
+ ### 只发请求
26
25
 
27
- 如果你只需要使用 HTTP 请求和队列功能,不需要代理管理,可以使用轻量级模式:
26
+ 不需要代理池时,只创建请求客户端:
28
27
 
29
28
  ```typescript
30
29
  import { createProxyRequest } from 'proxy-pool-manager';
31
30
 
32
- // 创建轻量级 SDK 实例(不连接 MongoDB)
33
31
  const sdk = await createProxyRequest({
34
32
  maxRetries: 3,
35
33
  timeout: 30,
36
34
  logLevel: 'info'
37
35
  });
38
36
 
39
- // 发送 GET 请求
40
37
  const response = await sdk.get('https://api.example.com/data', {
41
38
  params: { page: 1 }
42
39
  });
43
40
 
44
- // 在请求中直接指定代理(可选)
45
41
  const responseWithProxy = await sdk.post('http://your-api.com/request', {
46
42
  url: 'https://api.example.com/data',
47
43
  method: 'GET',
48
- proxy: 'http://proxy.example.com:8080', // 直接指定代理
44
+ proxy: 'http://proxy.example.com:8080',
49
45
  timeout: 10
50
46
  });
51
47
 
52
48
  console.log(response.data);
53
49
  ```
54
50
 
55
- ### 轻量级模式 + 代理数组(支持异常时自动轮换)
51
+ ### 传入代理数组(失败时自动轮换)
56
52
 
57
- 如果你需要代理管理但不想连接 MongoDB,可以传入代理数组:
53
+ 代理只存在当前进程内存中,进程退出后清空。
58
54
 
59
55
  ```typescript
60
56
  import { createProxyRequest } from 'proxy-pool-manager';
61
57
 
62
- // 创建轻量级 SDK 实例 + 代理数组(不连接 MongoDB)
63
58
  const sdk = await createProxyRequest({
64
59
  proxies: [
65
60
  'proxy1.example.com:8080:user1:pass1',
66
61
  'proxy2.example.com:8080:user2:pass2',
67
62
  'proxy3.example.com:8080:user3:pass3'
68
63
  ],
69
- proxyStrategy: 'sequential', // 顺序策略
64
+ proxyStrategy: 'sequential',
70
65
  maxRetries: 3,
71
66
  timeout: 30,
72
67
  logLevel: 'info'
73
68
  });
74
69
 
75
- // 发送请求,会自动使用代理管理器选择的代理
76
- // 如果代理失败,会自动轮换到下一个代理并重试
77
70
  const response = await sdk.post('http://your-api.com/request', {
78
71
  url: 'https://api.example.com/data',
79
72
  method: 'GET',
@@ -84,84 +77,10 @@ console.log('当前使用的代理:', sdk.getCurrentProxy());
84
77
  console.log('可用代理列表:', sdk.getAvailableProxies());
85
78
  ```
86
79
 
87
- ### 完整模式(包含代理管理功能)
88
-
89
- 如果需要代理管理功能(自动轮换、健康检查等),需要提供 MongoDB 连接:
90
-
91
- ```typescript
92
- import { createProxyRequest } from 'proxy-pool-manager';
93
-
94
- // 创建完整 SDK 实例(包含代理管理)
95
- const sdk = await createProxyRequest({
96
- mongoUri: 'mongodb://localhost:27017/proxy_db',
97
- proxyStrategy: 'sequential',
98
- logLevel: 'info',
99
- timeout: 30,
100
- proxyCheckOptions: {
101
- mainUrl: 'http://example.com/check',
102
- timeout: 10,
103
- }
104
- });
105
-
106
- // 发送 GET 请求(自动使用代理管理器选择的代理)
107
- const response = await sdk.get('https://api.example.com/data', {
108
- params: { page: 1 }
109
- });
110
-
111
- // 或者为特定请求指定代理(优先级高于自动选择)
112
- const responseWithSpecificProxy = await sdk.post('http://your-api.com/request', {
113
- url: 'https://api.example.com/data',
114
- method: 'GET',
115
- proxy: 'http://specific-proxy.com:8080', // 请求级代理优先
116
- timeout: 10
117
- });
118
-
119
- console.log(response.data);
120
- ```
121
-
122
- ### 完整模式 + 代理数组(支持异常时自动轮换)
123
-
124
- 如果需要代理管理功能,并且想预先设置代理列表:
80
+ ### 追加代理
125
81
 
126
82
  ```typescript
127
- import { createProxyRequest } from 'proxy-pool-manager';
128
-
129
- // 创建完整 SDK 实例 + 代理数组(连接 MongoDB)
130
- const sdk = await createProxyRequest({
131
- mongoUri: 'mongodb://localhost:27017/proxy_db',
132
- proxies: [
133
- 'proxy1.example.com:8080:user1:pass1',
134
- 'proxy2.example.com:8080:user2:pass2',
135
- 'proxy3.example.com:8080:user3:pass3'
136
- ],
137
- proxyStrategy: 'failover', // 故障转移策略
138
- maxRetries: 3,
139
- timeout: 30,
140
- proxyCheckOptions: {
141
- mainUrl: 'http://example.com/check',
142
- timeout: 10,
143
- }
144
- });
145
-
146
- // 代理会被保存到 MongoDB,并支持自动轮换
147
- // 如果请求失败,会自动轮换到下一个代理并重试
148
- const response = await sdk.get('https://api.example.com/data');
149
- ```
150
-
151
- ### 添加代理
152
-
153
- ```typescript
154
- // 添加单个代理
155
83
  await sdk.addProxy('proxy.example.com:8080:username:password');
156
-
157
- // 批量添加代理
158
- const count = await sdk.bulkInsertProxies([
159
- 'proxy1.example.com:8080:user1:pass1',
160
- 'proxy2.example.com:8080:user2:pass2',
161
- 'proxy3.example.com:8080:user3:pass3',
162
- ]);
163
-
164
- console.log(`成功添加 ${count} 个代理`);
165
84
  ```
166
85
 
167
86
  ### HTTP 请求方法
@@ -213,21 +132,19 @@ const customResponse = await sdk.request({
213
132
 
214
133
  ```typescript
215
134
  interface SDKOptions {
216
- mongoUri?: string; // MongoDB 连接 URI(可选,启用代理管理时需要)
217
135
  maxRetries?: number; // 最大重试次数,默认 3
218
136
  timeout?: number; // 请求超时时间(秒),默认 30
219
137
  proxyStrategy?: ProxyStrategy; // 代理策略,默认 'sequential'
220
138
  logLevel?: LogLevel; // 日志级别,默认 'info'
221
139
  instanceId?: string; // 实例 ID,用于多实例场景
222
- proxies?: string[]; // 代理数组,支持异常时自动轮换
140
+ proxies?: string[]; // 代理数组,只保存在内存中
223
141
  proxy?: string; // 单个代理
224
142
  retryDelay?: number; // 重试间隔(毫秒),默认使用指数退避策略
225
143
  retryDelayBase?: number; // 指数退避的基础延迟(毫秒),默认 1000
226
144
  retryDelayMultiplier?: number; // 指数退避的倍数,默认 2
227
145
  proxyCheckEnabled?: boolean; // 是否启用代理检查,默认 true
228
- proxyLimit?: number; // 代理加载限制,0 表示不加载,默认 0
229
- proxyCheckOptions?: { // 代理检查配置(启用代理管理时需要)
230
- mainUrl: string; // 代理检查主 URL(启用代理管理时必需)
146
+ proxyCheckOptions?: { // 代理检查配置(启用健康检查时需要)
147
+ mainUrl: string; // 代理检查主 URL(启用代理检查时必需)
231
148
  testUrls?: string[]; // 额外的测试 URL
232
149
  timeout?: number; // 检查超时时间(秒)
233
150
  successStatusCodes?: number[]; // 成功状态码列表
@@ -240,12 +157,9 @@ interface SDKOptions {
240
157
 
241
158
  **配置说明:**
242
159
 
243
- - **轻量级模式**:不提供 `mongoUri` 和 `proxyCheckOptions`,SDK 将以轻量级模式运行,不连接 MongoDB,不初始化代理管理功能
244
- - **轻量级模式 + 代理数组**:提供 `proxies` 或 `proxy` 但不提供 `mongoUri`,SDK 将以轻量级模式运行,代理仅存储在内存中,支持异常时自动轮换
245
- - **完整模式**:提供 `mongoUri` 或 `proxyCheckOptions`,SDK 将启用代理管理功能
246
- - **完整模式 + 代理数组**:同时提供 `mongoUri` 和 `proxies`,代理会被保存到 MongoDB,并支持异常时自动轮换
247
- - **禁用代理检查**:设置 `proxyCheckEnabled: false` 可禁用代理检查
248
- - **不加载代理**:设置 `proxyLimit: 0` 可不从数据库加载代理
160
+ - 不传 `proxies` / `proxy` / `proxyCheckOptions` 时,只提供 HTTP 请求,不启用代理池
161
+ - 传入 `proxies` 或 `proxy` 后启用代理池,列表只在内存中
162
+ - 设置 `proxyCheckEnabled: false` 可禁用代理健康检查
249
163
 
250
164
  #### 方法
251
165
 
@@ -271,10 +185,6 @@ interface SDKOptions {
271
185
  - `getProxyDetails(proxyUrl: string): ProxyItem | undefined` - 获取代理详情
272
186
  - `hasProxyManagement(): boolean` - 检查是否启用了代理管理功能
273
187
 
274
- ##### 批量操作
275
-
276
- - `bulkInsertProxies(proxyUrls: string[]): Promise<number>` - 批量插入代理
277
-
278
188
  ##### 统计信息
279
189
 
280
190
  - `getProxyStats(): Promise<ProxyStats>` - 获取代理统计信息
@@ -376,7 +286,7 @@ const response3 = await sdk.get('https://api.example.com/data');
376
286
  - 根据代理的历史表现(失败率、响应时间)自动选择最优代理
377
287
  - 优先使用失败率低、响应时间短的代理
378
288
  - 适合需要高可用性和性能的场景
379
- - **不需要 MongoDB**:统计信息存储在内存中,实时更新
289
+ - 统计信息只存在内存中,进程重启后清空
380
290
 
381
291
  **选择优先级:**
382
292
 
@@ -390,55 +300,25 @@ const response3 = await sdk.get('https://api.example.com/data');
390
300
  - 代理质量差异较大,需要自动选择最优代理
391
301
  - 需要自动排除故障代理
392
302
  - 对请求成功率要求较高的场景
393
- - **轻量级模式**:不需要 MongoDB,仅使用内存统计
394
303
 
395
304
  **示例:**
396
305
 
397
306
  ```typescript
398
- // 轻量级模式 + failover(不需要 MongoDB)
399
- const sdk1 = await createProxyRequest({
400
- proxies: [
401
- 'proxy1.example.com:8080:user1:pass1', // 高质量代理
402
- 'proxy2.example.com:8080:user2:pass2', // 中等质量代理
403
- 'proxy3.example.com:8080:user3:pass3' // 低质量代理
404
- ],
405
- proxyStrategy: 'failover' // 不需要 MongoDB,统计信息存储在内存中
406
- });
407
-
408
- // 自动选择最优代理(失败率低、响应时间短)
409
- const response = await sdk1.get('https://api.example.com/data');
410
- ```
411
-
412
- ```typescript
413
- // 完整模式 + failover(使用 MongoDB 持久化统计信息)
414
- const sdk2 = await createProxyRequest({
415
- mongoUri: 'mongodb://localhost:27017/proxy_db',
307
+ const sdk = await createProxyRequest({
416
308
  proxies: [
417
309
  'proxy1.example.com:8080:user1:pass1',
418
310
  'proxy2.example.com:8080:user2:pass2',
419
311
  'proxy3.example.com:8080:user3:pass3'
420
312
  ],
421
- proxyStrategy: 'failover',
422
- proxyCheckOptions: {
423
- mainUrl: 'http://example.com/check'
424
- }
313
+ proxyStrategy: 'failover'
425
314
  });
426
315
 
427
- // 统计信息会被持久化到 MongoDB,重启后仍然保留历史数据
428
- const response = await sdk2.get('https://api.example.com/data');
316
+ const response = await sdk.get('https://api.example.com/data');
429
317
  ```
430
318
 
431
319
  **统计信息说明:**
432
320
 
433
- - **内存模式**(不提供 `mongoUri`):
434
- - 统计信息存储在内存中,实时更新
435
- - 重启后统计信息会重置
436
- - 适合临时使用或单次运行场景
437
-
438
- - **持久化模式**(提供 `mongoUri`):
439
- - 统计信息会保存到 MongoDB
440
- - 重启后仍然保留历史数据
441
- - 适合长期运行或需要历史数据的场景
321
+ 失败次数和响应时间只记在内存里,进程重启后重新计算。
442
322
 
443
323
  **轮换机制:**
444
324
 
@@ -470,10 +350,8 @@ const response = await sdk2.get('https://api.example.com/data');
470
350
 
471
351
  **重要说明:**
472
352
 
473
- - ✅ **不需要 MongoDB**:failover 策略可以在轻量级模式下使用,统计信息存储在内存中
474
- - ✅ **实时更新**:每次请求后,统计信息会立即更新(成功/失败次数、响应时间等)
475
- - ✅ **自动学习**:随着请求的进行,系统会自动学习每个代理的质量,并优先使用高质量代理
476
- - 💡 **MongoDB 的作用**:如果提供 MongoDB,统计信息会被持久化,重启后仍然保留历史数据,有助于更快地识别高质量代理
353
+ - 每次请求后统计会立即更新
354
+ - 连续失败超过阈值的代理会被标成无效,成功后再恢复
477
355
 
478
356
  ### 重试间隔配置
479
357
 
@@ -564,84 +442,23 @@ const sdk = await createProxyRequest({
564
442
  logLevel: 'info'
565
443
  });
566
444
 
567
- // 直接使用,无需 MongoDB
445
+ // 不传 proxies 时只发请求
568
446
  const response = await sdk.get('https://api.example.com/data');
569
447
  ```
570
448
 
571
- #### 场景 2:需要临时使用代理
449
+ #### 场景 2:单次请求指定代理
572
450
 
573
451
  ```typescript
574
- // 轻量级模式 + 直接指定代理
575
452
  const sdk = await createProxyRequest({
576
453
  maxRetries: 3,
577
454
  timeout: 30
578
455
  });
579
456
 
580
- // 在请求中直接指定代理
581
457
  const response = await sdk.post('http://your-api.com/request', {
582
458
  url: 'https://api.example.com/data',
583
459
  method: 'GET',
584
- proxy: 'http://proxy.example.com:8080:user:pass' // 直接指定代理
585
- });
586
- ```
587
-
588
- #### 场景 2.5:使用代理数组 + 异常时自动轮换(推荐)
589
-
590
- ```typescript
591
- // 轻量级模式 + 代理数组(不连接 MongoDB)
592
- const sdk = await createProxyRequest({
593
- proxies: [
594
- 'proxy1.example.com:8080:user1:pass1',
595
- 'proxy2.example.com:8080:user2:pass2',
596
- 'proxy3.example.com:8080:user3:pass3'
597
- ],
598
- proxyStrategy: 'failover', // 故障转移策略
599
- maxRetries: 3,
600
- timeout: 30
601
- });
602
-
603
- // 发送请求,如果代理失败会自动轮换到下一个代理
604
- const response = await sdk.post('http://your-api.com/request', {
605
- url: 'https://api.example.com/data',
606
- method: 'GET',
607
- timeout: 10
608
- });
609
- ```
610
-
611
- #### 场景 3:需要代理管理功能
612
-
613
- ```typescript
614
- // 完整模式,启用代理管理
615
- const sdk = await createProxyRequest({
616
- mongoUri: 'mongodb://localhost:27017/proxy_db',
617
- proxyCheckOptions: {
618
- mainUrl: 'http://example.com/check',
619
- timeout: 10,
620
- }
621
- });
622
-
623
- // 添加代理到管理器
624
- await sdk.addProxy('proxy1.example.com:8080:user1:pass1');
625
-
626
- // 自动使用代理管理器选择的代理
627
- const response = await sdk.get('https://api.example.com/data');
628
- ```
629
-
630
- #### 场景 4:禁用代理检查,但仍使用代理管理
631
-
632
- ```typescript
633
- // 使用代理管理,但禁用代理检查
634
- const sdk = await createProxyRequest({
635
- mongoUri: 'mongodb://localhost:27017/proxy_db',
636
- proxyCheckEnabled: false, // 禁用代理检查
637
- proxyLimit: 0, // 不加载代理
638
- proxyCheckOptions: {
639
- mainUrl: 'http://example.com/check', // 仍然需要提供(用于后续启用)
640
- }
460
+ proxy: 'http://proxy.example.com:8080:user:pass'
641
461
  });
642
-
643
- // 手动添加代理,不进行自动检查
644
- await sdk.addProxy('proxy.example.com:8080:user:pass');
645
462
  ```
646
463
 
647
464
  ### 多实例场景
@@ -649,21 +466,14 @@ await sdk.addProxy('proxy.example.com:8080:user:pass');
649
466
  ```typescript
650
467
  import { initializeServices } from 'proxy-pool-manager';
651
468
 
652
- // 创建多个独立的 SDK 实例
653
469
  const sdk1 = await initializeServices({
654
- mongoUri: 'mongodb://localhost:27017/proxy_db',
655
- instanceId: 'instance-1',
656
- proxyCheckOptions: {
657
- mainUrl: 'http://example.com/check'
658
- }
470
+ proxies: ['proxy1.example.com:8080:user1:pass1'],
471
+ instanceId: 'instance-1'
659
472
  });
660
473
 
661
474
  const sdk2 = await initializeServices({
662
- mongoUri: 'mongodb://localhost:27017/proxy_db',
663
- instanceId: 'instance-2',
664
- proxyCheckOptions: {
665
- mainUrl: 'http://example.com/check'
666
- }
475
+ proxies: ['proxy2.example.com:8080:user2:pass2'],
476
+ instanceId: 'instance-2'
667
477
  });
668
478
  ```
669
479
 
@@ -671,7 +481,7 @@ const sdk2 = await initializeServices({
671
481
 
672
482
  ```typescript
673
483
  const sdk = await createProxyRequest({
674
- mongoUri: 'mongodb://localhost:27017/proxy_db',
484
+ proxies: ['proxy1.example.com:8080:user1:pass1'],
675
485
  proxyCheckOptions: {
676
486
  mainUrl: 'https://httpbin.org/ip',
677
487
  testUrls: [
@@ -680,9 +490,9 @@ const sdk = await createProxyRequest({
680
490
  ],
681
491
  timeout: 15,
682
492
  successStatusCodes: [200, 201],
683
- checkInterval: 60000, // 每分钟检查一次
684
- maxConsecutiveFails: 3, // 连续失败3次后标记为无效
685
- maxResponseTime: 5000 // 最大响应时间5秒
493
+ checkInterval: 60000,
494
+ maxConsecutiveFails: 3,
495
+ maxResponseTime: 5000
686
496
  }
687
497
  });
688
498
  ```
@@ -703,7 +513,7 @@ const response = await sdk.post('http://your-api.com/request', {
703
513
  });
704
514
  ```
705
515
 
706
- #### 2. 直接指定代理(轻量级模式和完整模式都支持)
516
+ #### 2. 直接指定代理
707
517
 
708
518
  ```typescript
709
519
  // 为特定请求指定代理
@@ -742,7 +552,7 @@ console.log('当前代理:', sdk.getCurrentProxy());
742
552
  console.log('可用代理:', sdk.getAvailableProxies());
743
553
  ```
744
554
 
745
- #### 4. 自动使用代理管理器选择的代理(完整模式)
555
+ #### 4. 自动使用代理池选出的代理
746
556
 
747
557
  ```typescript
748
558
  // 先添加代理到管理器
@@ -858,26 +668,6 @@ console.log({
858
668
  });
859
669
  ```
860
670
 
861
- ### 批量插入代理
862
-
863
- ```typescript
864
- import { bulkInsertProxyUrls } from 'proxy-pool-manager';
865
-
866
- const count = await bulkInsertProxyUrls({
867
- mongoUri: 'mongodb://localhost:27017/proxy_db',
868
- proxyUrls: [
869
- 'proxy1.com:8080:user1:pass1',
870
- 'proxy2.com:8080:user2:pass2',
871
- // ... 更多代理
872
- ],
873
- batchSize: 500, // 每批处理500个
874
- concurrency: 4, // 并发4个批次
875
- logLevel: 'info'
876
- });
877
-
878
- console.log(`成功插入 ${count} 个代理`);
879
- ```
880
-
881
671
  ## 📋 异步队列使用
882
672
 
883
673
  `AsyncQueueSingleton` 是一个强大的异步任务队列管理器,支持并发控制、优先级任务、多实例等特性。
@@ -1207,24 +997,6 @@ interface AsyncQueueOptions<T> {
1207
997
  }
1208
998
  ```
1209
999
 
1210
- ## 🗄️ MongoDB 数据结构
1211
-
1212
- 代理数据存储在 MongoDB 中,集合结构如下:
1213
-
1214
- ```typescript
1215
- interface ProxyDocument {
1216
- url: string; // 代理 URL(格式:host:port:username:password)
1217
- totalRequests: number; // 总请求数
1218
- failCount: number; // 失败次数
1219
- avgResponseTime: number; // 平均响应时间(毫秒)
1220
- lastCheckTime: number; // 最后检查时间(时间戳)
1221
- consecutiveFails: number; // 连续失败次数
1222
- status: 'valid' | 'invalid'; // 状态
1223
- createdAt: Date; // 创建时间
1224
- updatedAt: Date; // 更新时间
1225
- }
1226
- ```
1227
-
1228
1000
  ## 📝 类型定义
1229
1001
 
1230
1002
  完整的 TypeScript 类型定义已包含在包中:
@@ -1242,24 +1014,10 @@ import type {
1242
1014
 
1243
1015
  ## ⚠️ 注意事项
1244
1016
 
1245
- 1. **轻量级模式 vs 完整模式**:
1246
- - **轻量级模式**:不提供 `mongoUri` 和 `proxyCheckOptions`,不连接 MongoDB,仅使用请求和队列功能
1247
- - **完整模式**:提供 `mongoUri` 或 `proxyCheckOptions`,启用代理管理功能,需要 MongoDB 连接
1248
-
1249
- 2. **MongoDB 连接**:仅在启用代理管理功能时需要,确保 MongoDB 服务正在运行且连接 URI 正确
1250
-
1251
- 3. **代理格式**:代理 URL 格式为 `host:port:username:password` 或 `http://host:port:username:password`
1252
-
1253
- 4. **代理使用**:
1254
- - 轻量级模式下,只能通过 `options.proxy` 直接指定代理
1255
- - 完整模式下,可以自动使用代理管理器选择的代理,也可以直接指定代理(优先级更高)
1256
-
1257
- 5. **初始化等待**:SDK 初始化是异步的,使用 `waitForReady()` 确保初始化完成
1258
-
1259
- 6. **资源清理**:使用完毕后调用 `destroy()` 方法清理资源
1260
-
1261
- 7. **并发限制**:代理检查的并发数可通过 `maxConcurrentChecks` 配置
1262
-
1263
- 8. **禁用功能**:
1264
- - 设置 `proxyCheckEnabled: false` 可禁用代理检查
1265
- - 设置 `proxyLimit: 0` 可不从数据库加载代理
1017
+ 1. **代理池**:传入 `proxies` 或 `proxy` 后启用。列表和失败计数只在内存中,进程退出后清空。不传则只发 HTTP 请求。
1018
+ 2. **代理格式**:`host:port:username:password`,或 `http://user:pass@host:port`
1019
+ 3. **代理使用**:请求级 `options.proxy` 优先于代理池自动选择;`noProxy: true` 强制直连。
1020
+ 4. **初始化等待**:SDK 初始化是异步的,使用 `waitForReady()` 确保初始化完成
1021
+ 5. **资源清理**:使用完毕后调用 `destroy()` 方法清理资源
1022
+ 6. **并发限制**:代理检查的并发数可通过 `maxConcurrentChecks` 配置
1023
+ 7. **禁用健康检查**:设置 `proxyCheckEnabled: false`
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e={171:e=>{e.exports=require("winston-daily-rotate-file")},298:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getFormattedDate=function(e=!1){const t=new Date,r=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0");return e?`${r}-${s}-${n} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`:`${r}-${s}-${n}`},t.getMainDirectory=function(){const e=r(928);return r.c[r.s]?e.dirname(r.c[r.s].filename):process.cwd()}},306:e=>{e.exports=require("winston")},330:e=>{e.exports=JSON.parse('{"name":"proxy-pool-manager","version":"1.0.10","description":"proxy manager","main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs","types":"./dist/index.d.ts"}},"files":["dist","package.json"],"scripts":{"build":"webpack --mode=production && tsc --emitDeclarationOnly --outDir dist && node scripts/generate-esm-wrapper.js","dev":"webpack --mode=development","watch":"webpack --watch --mode=development","build:analyze":"webpack --mode=production --analyze","prepublishOnly":"npm run build"},"author":"memeak","license":"ISC","devDependencies":{"@types/node":"^22.5.4","@webpack-cli/generators":"^3.0.7","clean-webpack-plugin":"^4.0.0","ts-loader":"^9.5.1","typescript":"^5.6.2","webpack":"^5.94.0","webpack-cli":"^5.1.4"},"dependencies":{"async":"^3.2.6","node-fetch":"^2.7.0","winston":"^3.18.3","winston-daily-rotate-file":"^5.0.0"},"packageManager":"pnpm@10.18.2+sha512.9fb969fa749b3ade6035e0f109f0b8a60b5d08a1a87fdf72e337da90dcc93336e2280ca4e44f2358a649b83c17959e9993e777c2080879f3801e6f0d999ad3dd"}')},378:function(e,t,r){var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Request=void 0;const n=s(r(867)),i=r(388);class o{constructor(e={}){if(this.proxyManager=null,this.hasProxyManager=!1,void 0!==e.maxRetries&&(e.maxRetries<0||!Number.isInteger(e.maxRetries)))throw new Error("maxRetries 必须是非负整数");if(void 0!==e.timeout&&e.timeout<=0)throw new Error("timeout 必须是正数");if(void 0!==e.retryDelay&&e.retryDelay<0)throw new Error("retryDelay 必须是非负数");if(void 0!==e.retryDelayBase&&e.retryDelayBase<=0)throw new Error("retryDelayBase 必须是正数");if(void 0!==e.retryDelayMultiplier&&e.retryDelayMultiplier<=0)throw new Error("retryDelayMultiplier 必须是正数");this.maxRetries=e.maxRetries??3,this.timeout=e.timeout??30,this.logLevel=e.logLevel||"none",this.proxyStrategy=e.proxyStrategy||"sequential",this.retryDelay=e.retryDelay??null,this.retryDelayBase=e.retryDelayBase??1e3,this.retryDelayMultiplier=e.retryDelayMultiplier??2;try{const t=e.instanceId||"default";this.proxyManager=i.ServiceLocator.get(`ProxyManager-${t}`),this.hasProxyManager=!0,this.log("info","成功获取 ProxyManager 实例",{instanceId:t})}catch(t){this.hasProxyManager=!1,this.log("info","ProxyManager 未初始化,将以轻量级模式运行(不使用代理管理功能)",{instanceId:e.instanceId||"default"})}}setLogLevel(e){try{i.ServiceLocator.get("DebugManager").setLogLevel(e),this.log("info",`设置日志等级: ${e}`)}catch(e){console.warn("DebugManager未注册,无法设置日志等级")}}getLogLevel(){try{return i.ServiceLocator.get("DebugManager").getLogLevel()}catch(e){return"info"}}log(e,t,r){try{const s=i.ServiceLocator.get("DebugManager");e.toUpperCase(),s.log(e,`[Request] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${n} [Request] ${t}`,r||"")}}async selectProxy(e){if(!0===e.options.noProxy)return this.log("info","noProxy 为 true,强制直连",{}),null;if(e.options.proxy){const t=e.options.proxy;return this.hasProxyManager&&this.proxyManager&&await this.proxyManager.addProxy(t).catch(()=>{}),this.log("info","使用请求级别代理",{proxy:t}),t}if(!this.hasProxyManager||!this.proxyManager)return null;const t=this.proxyManager.getProxiesCount();if(0===t)return null;const r=this.proxyManager.getAvailableProxy();return r&&this.log("info","使用策略选择代理",{proxy:r,strategy:this.proxyManager.getProxyStrategy(),index:this.proxyManager.getCurrentProxyIndex()+1,total:t}),r}async executeSingleRequest(e,t){const r=e.options.timeout||this.timeout,s=1e3*r;try{const i=await this.selectProxy(e),o={method:e.method,headers:{},signal:AbortSignal.timeout(s)},a=e.options?{...e.options}:{};i&&(a.proxy=i),Object.keys(a).length>0&&(o.body=JSON.stringify(a),o.headers["Content-Type"]="application/json"),this.log("info",`开始请求 ${e.url} (尝试 ${t}/${this.maxRetries})`,{method:e.method,timeout:r,hasProxy:!!i});const c=Date.now(),l=await(0,n.default)(e.url,o),u=Date.now()-c;if(!l.ok)throw new Error(`HTTP Error: ${l.status} ${l.statusText}`);const h=await l.text();let g;try{g=JSON.parse(h)}catch{g=h}const y={status_code:l.status,success:l.ok,headers:Object.fromEntries(l.headers.entries()),data:g,error:l.ok?void 0:h,timestamp:(new Date).toISOString()};if(this.hasProxyManager&&this.proxyManager){const e=this.proxyManager.getCurrentProxy();e&&await this.proxyManager.recordProxyUsage(e,y.success,u).catch(()=>{})}return y}catch(s){if("TimeoutError"===s.name||"AbortError"===s.name)throw this.log("warn",`请求超时 (${r}s)`,{url:e.url,attempt:t}),new Error(`请求超时: ${r}秒`);if(this.hasProxyManager&&this.proxyManager){const e=this.proxyManager.getCurrentProxy();e&&this.proxyManager.shouldRotateProxy(s)&&(this.log("error",`代理 ${e} 出现问题,尝试轮换`,{error:s.message}),await this.proxyManager.rotateProxy().catch(()=>{}))}throw s}}isValidStatusCode(e){return e>=200&&e<300}async get(e,t={}){let r=e;return t.params&&Object.keys(t.params).length>0&&(r=`${e}?${new URLSearchParams(t.params).toString()}`),this.request({url:r,method:"GET",options:t})}async post(e,t={}){return this.request({url:e,method:"POST",options:t})}async put(e,t={}){return this.request({url:e,method:"PUT",options:t})}async delete(e,t={}){return this.request({url:e,method:"DELETE",options:t})}async patch(e,t={}){return this.request({url:e,method:"PATCH",options:t})}async request(e){const t={url:e.url,method:e.method,options:{...e.options,timeout:e.options.timeout||this.timeout}};for(let e=1;e<=this.maxRetries;e++)try{const r=await this.executeSingleRequest(t,e),s={status:r.status_code,statusText:this.getStatusText(r.status_code),headers:r.headers||{},error:r.error?String(r.error):null,errors:[],data:r.data,text:()=>"string"==typeof r.data?r.data:JSON.stringify(r.data),json:()=>r.data,buffer:()=>Buffer.from("string"==typeof r.data?r.data:JSON.stringify(r.data||{}))};return this.log("info","请求成功",{url:t.url,status:s.status,attempt:e}),s}catch(r){const s=r.message;if(this.log("error","请求失败",{attempt:e,maxRetries:this.maxRetries,url:t.url,error:s}),(s.includes("超时")||"TimeoutError"===r.name)&&this.log("warn",`请求超时,尝试 ${e}/${this.maxRetries}`),!t.options.noProxy&&this.hasProxyManager&&this.proxyManager&&e<this.maxRetries){if(0===this.proxyManager.getAvailableProxiesList().length){this.log("warn","无可用代理,停止重试");break}if(!t.options.proxy&&this.proxyManager.shouldRotateProxy(r)){const e=await this.proxyManager.rotateProxy().catch(()=>null);e&&this.log("info",`代理轮换成功,使用新代理: ${e}`)}}if(e<this.maxRetries){let t;null!==this.retryDelay?(t=this.retryDelay,this.log("info",`等待 ${t}ms 后重试(固定间隔)`)):(t=this.retryDelayBase*Math.pow(this.retryDelayMultiplier,e-1),this.log("info",`等待 ${t}ms 后重试(指数退避:基础 ${this.retryDelayBase}ms,倍数 ${this.retryDelayMultiplier})`)),await new Promise(e=>setTimeout(e,t))}}throw new Error(`${e.options.url} 请求失败,已尝试 ${this.maxRetries} 次都失败了`)}getStatusText(e){return{200:"OK",201:"Created",202:"Accepted",204:"No Content",400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",500:"Internal Server Error",502:"Bad Gateway",503:"Service Unavailable"}[e]||`Status ${e}`}getCurrentProxy(){return this.hasProxyManager&&this.proxyManager?this.proxyManager.getCurrentProxy():null}async rotateProxy(){if(!this.hasProxyManager||!this.proxyManager)throw new Error("ProxyManager 未初始化,无法轮换代理");return await this.proxyManager.rotateProxy()}resetProxyUsage(){this.hasProxyManager&&this.proxyManager&&this.proxyManager.resetProxyUsage()}setProxyStrategy(e){if(!this.hasProxyManager||!this.proxyManager)throw new Error("ProxyManager 未初始化,无法设置代理策略");this.proxyManager.setProxyStrategy(e)}async checkProxy(e){if(!this.hasProxyManager||!this.proxyManager)throw new Error("ProxyManager 未初始化,无法检查代理");return this.proxyManager.checkProxy(e)}getAvailableProxiesList(){return this.hasProxyManager&&this.proxyManager?this.proxyManager.getAvailableProxiesList():[]}hasProxyManagement(){return this.hasProxyManager}}t.Request=o,t.default=o},388:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceLocator=void 0;class r{static shouldLog(e){try{if(this.services.has("DebugManager")){const t=this.services.get("DebugManager");if(t&&"function"==typeof t.getLogLevel){const r=t.getLogLevel(),s={none:0,error:1,warn:2,info:3,debug:4,verbose:5},n=s[r]||0;return(s[e]||0)<=n}}}catch(e){}return"error"===e||"warn"===e}static shouldLogForService(e,t){if(["DebugManager","AsyncQueue"].includes(e)&&("debug"===t||"verbose"===t)){try{if(this.services.has("DebugManager")){const e=this.services.get("DebugManager");if(e&&"function"==typeof e.getLogLevel)return"verbose"===e.getLogLevel()}}catch(e){}return!1}return this.shouldLog(t)}static get(e){if(this.services.has(e)){const t=this.services.get(e);return this.shouldLogForService(e,"debug")&&this.log("debug",`返回已注册的服务实例: ${e}`,{serviceType:this.getServiceType(t)}),t}if(this.dependencies.has(e)){this.shouldLogForService(e,"debug")&&this.log("debug",`通过工厂创建服务: ${e}`);const t=this.dependencies.get(e)();return this.services.set(e,t),this.shouldLogForService(e,"debug")&&this.log("debug",`工厂创建服务完成: ${e}`,{serviceType:this.getServiceType(t)}),t}const t=new Error(`[ServiceLocator] 服务未注册: ${e}`);throw this.log("error","服务未注册",{serviceName:e,availableServices:this.getAvailableServiceNames(),error:t.message}),t}static has(e){const t=this.services.has(e)||this.dependencies.has(e);return this.shouldLogForService(e,"debug")&&this.log("debug",`检查服务存在性: ${e}`,{exists:t,hasInstance:this.services.has(e),hasFactory:this.dependencies.has(e)}),t}static register(e,t){this.services.set(e,t),this.shouldLogForService(e,"info")&&this.log("info",`注册服务: ${e}`,{serviceType:this.getServiceType(t),hasFactory:this.dependencies.has(e)})}static registerFactory(e,t){this.dependencies.set(e,t),this.shouldLogForService(e,"info")&&this.log("info",`注册服务工厂: ${e}`,{hasExistingInstance:this.services.has(e)})}static log(e,t,r){if(!this.shouldLog(e))return;try{if(this.services.has("DebugManager")){const s=this.services.get("DebugManager");if(s&&"function"==typeof s.log)return e.toUpperCase(),void s.log(e,`[ServiceLocator] ${t}`,r)}}catch(e){}const s=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${s} [ServiceLocator] ${t}`,r||"")}static getAvailableServiceNames(){const e=Array.from(this.services.keys()),t=Array.from(this.dependencies.keys()),r=[...new Set([...e,...t])];return this.shouldLog("debug")&&this.log("debug","获取可用服务名称",{total:r.length,services:e,factories:t}),r}static getStats(){const e=Array.from(this.services.keys()),t=Array.from(this.dependencies.keys()),r={totalServices:e.length,totalFactories:t.length,serviceNames:e,factoryNames:t};return this.shouldLog("debug")&&this.log("debug","服务统计",r),r}static isInitialized(){const e=this.has("DebugManager");return this.shouldLog("debug")&&this.log("debug","检查服务定位器初始化状态",{hasDebugManager:e,totalServices:this.services.size,totalFactories:this.dependencies.size}),e}static getServiceType(e){return e?e.constructor&&e.constructor.name?e.constructor.name:"function"==typeof e?"Function":Array.isArray(e)?"Array":"object"==typeof e?"Object":typeof e:"null"}static registerMultiple(e){const t=Object.keys(e);this.log("info","批量注册服务",{count:t.length,services:t}),Object.entries(e).forEach(([e,t])=>{this.register(e,t)})}static safeGet(e,t){try{return this.get(e)}catch(r){return this.log("warn",`安全获取服务失败: ${e}`,{error:r.message,usingDefault:void 0!==t}),t}}static reset(){this.services.clear(),this.dependencies.clear(),this.log("info","服务定位器已重置")}static initialize(){this.log("info","服务定位器初始化",{nodeEnv:"production"})}static clear(){const e=this.services.size,t=this.dependencies.size;this.services.clear(),this.dependencies.clear(),this.log("info","所有服务已清除",{clearedServices:e,clearedFactories:t})}static removeService(e){const t=this.services.has(e),r=this.dependencies.has(e);return this.services.delete(e),this.dependencies.delete(e),!(!t&&!r||(this.log("info",`移除服务: ${e}`,{hadService:t,hadFactory:r}),0))}static getExistingInstance(e){if(this.services.has(e))return this.services.get(e)}static hasOnlyFactory(e){return!this.services.has(e)&&this.dependencies.has(e)}static getCounts(){const e=this.services.size,t=this.dependencies.size,r=e+t;return this.shouldLog("debug")&&this.log("debug","服务数量统计",{instances:e,factories:t,total:r}),{instances:e,factories:t,total:r}}}t.ServiceLocator=r,r.services=new Map,r.dependencies=new Map},435:function(e,t,r){var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getMainDirectory=t.getFormattedDate=t.VERSION=t.ProxyRequestSDK=t.AsyncQueueSingleton=t.DebugManager=t.ServiceLocator=t.ProxyManager=t.Request=void 0,t.initializeServices=h,t.createProxyRequest=async function(e){return await h(e)},t.registerCoreServices=function(e={}){const t=e.instanceId||`core-${Date.now()}`,r=c.DebugManager.getInstance();e.logLevel&&r.setLogLevel(e.logLevel),a.ServiceLocator.register("DebugManager",r);const s=l.AsyncQueueSingleton.getInstance(t,{logLevel:e.logLevel});a.ServiceLocator.register(`AsyncQueue-${t}`,s);const n=o.ProxyManager.getInstance({proxies:e.proxies,proxy:e.proxy,logLevel:e.logLevel,instanceId:t});a.ServiceLocator.register(`ProxyManager-${t}`,n);const u=new i.Request({logLevel:e.logLevel,instanceId:t});a.ServiceLocator.register(`Request-${t}`,u)},t.registerRequestFactory=function(e,t){const r=t||`factory-${Date.now()}`;a.ServiceLocator.registerFactory(`Request-${r}`,e)},t.registerProxyManagerFactory=function(e,t){const r=t||`factory-${Date.now()}`;a.ServiceLocator.registerFactory(`ProxyManager-${r}`,e)},t.getStandaloneServices=function(e={}){const t=e.instanceId||`standalone-${Date.now()}`,r=l.AsyncQueueSingleton.getInstance(`standalone-${t}`,{logLevel:e.logLevel});return{proxyManager:o.ProxyManager.getInstance({proxies:e.proxies,proxy:e.proxy,logLevel:e.logLevel,instanceId:t}),request:new i.Request({logLevel:e.logLevel,instanceId:t}),asyncQueue:r}},t.cleanupServices=function(){a.ServiceLocator.clear(),l.AsyncQueueSingleton.destroyAllInstances(),o.ProxyManager.resetInstance()},t.checkServicesHealth=async function(e){try{const t=e||"default",r={DebugManager:a.ServiceLocator.has("DebugManager"),[`ProxyManager-${t}`]:a.ServiceLocator.has(`ProxyManager-${t}`),[`Request-${t}`]:a.ServiceLocator.has(`Request-${t}`),[`AsyncQueue-${t}`]:a.ServiceLocator.has(`AsyncQueue-${t}`)},s=l.AsyncQueueSingleton.getInstanceNames();return{proxyManager:a.ServiceLocator.has(`ProxyManager-${t}`),asyncQueues:s,services:r}}catch(e){return{proxyManager:!1,asyncQueues:[],services:{}}}};const n=s(r(330)),i=r(378);Object.defineProperty(t,"Request",{enumerable:!0,get:function(){return i.Request}});const o=r(696);Object.defineProperty(t,"ProxyManager",{enumerable:!0,get:function(){return o.ProxyManager}});const a=r(388);Object.defineProperty(t,"ServiceLocator",{enumerable:!0,get:function(){return a.ServiceLocator}});const c=r(577);Object.defineProperty(t,"DebugManager",{enumerable:!0,get:function(){return c.DebugManager}});const l=r(892);Object.defineProperty(t,"AsyncQueueSingleton",{enumerable:!0,get:function(){return l.AsyncQueueSingleton}});class u{constructor(e){this.proxyManagerInstance=null,this.isInitialized=!1,this.instanceId=e.instanceId||`sdk-${Date.now()}`,e.logLevel&&this.setLogLevel(e.logLevel);const t=!!(e.proxies&&e.proxies.length>0)||!!e.proxy;if((e.proxyCheckOptions||t)&&!t&&!e.proxyCheckOptions?.mainUrl&&!1!==e.proxyCheckEnabled)throw new Error("启用代理管理功能时,proxyCheckOptions.mainUrl 必须设置(除非 proxyCheckEnabled 为 false 或提供了代理数组)");if(!a.ServiceLocator.has("DebugManager")){const t=c.DebugManager.getInstance();e.logLevel&&t.setLogLevel(e.logLevel),a.ServiceLocator.register("DebugManager",t),this.log("info","注册 DebugManager")}if(!a.ServiceLocator.has(`AsyncQueue-${this.instanceId}`)){const t=l.AsyncQueueSingleton.getInstance(this.instanceId,{logLevel:e.logLevel});a.ServiceLocator.register(`AsyncQueue-${this.instanceId}`,t),this.log("info","注册 AsyncQueue",{instanceId:this.instanceId})}try{if(!a.ServiceLocator.has(`Request-${this.instanceId}`))throw new Error("Request 服务未注册。请使用 createProxyRequest() 或 initializeServices() 创建 SDK 实例,不要直接 new ProxyRequestSDK()。");this.requestInstance=a.ServiceLocator.get(`Request-${this.instanceId}`),a.ServiceLocator.has(`ProxyManager-${this.instanceId}`)?(this.proxyManagerInstance=a.ServiceLocator.get(`ProxyManager-${this.instanceId}`),this.log("info","使用已注册的服务实例(包含代理管理)",{instanceId:this.instanceId})):(this.proxyManagerInstance=null,this.log("info","使用已注册的服务实例(轻量级模式,无代理管理)",{instanceId:this.instanceId}))}catch(e){const t=e?.message||String(e);if(t.includes("请使用 createProxyRequest"))throw e;throw this.log("error","服务未正确初始化",{error:t}),new Error(`服务初始化失败: ${t}。请使用 createProxyRequest() 或 initializeServices() 创建实例。`)}this.initializeAsync(e).catch(e=>{console.error("SDK初始化失败:",e)})}log(e,t,r){try{const s=a.ServiceLocator.get("DebugManager");e.toUpperCase(),s.log(e,`[ProxyRequestSDK:${this.instanceId}] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e?console.debug:console.info)(`${n} [ProxyRequestSDK:${this.instanceId}] ${t}`,r||"")}}async initializeAsync(e){try{this.proxyManagerInstance&&await this.proxyManagerInstance.waitForInitialization(),this.isInitialized=!0,this.log("info","初始化完成",{hasProxyManagement:!!this.proxyManagerInstance})}catch(e){throw this.log("error","初始化失败:",e),e}}async waitForReady(){for(;!this.isInitialized;)await new Promise(e=>setTimeout(e,100))}setLogLevel(e){try{a.ServiceLocator.get("DebugManager").setLogLevel(e),this.log("info",`设置日志等级: ${e}`)}catch(e){console.warn("DebugManager未注册,无法设置日志等级")}}getLogLevel(){try{return a.ServiceLocator.get("DebugManager").getLogLevel()}catch(e){return"info"}}getServiceInfo(){const e=["DebugManager",`ProxyManager-${this.instanceId}`,`Request-${this.instanceId}`,`AsyncQueue-${this.instanceId}`],t={};return e.forEach(e=>{t[e]=a.ServiceLocator.has(e)}),l.AsyncQueueSingleton.getInstanceNames().forEach(e=>{t[`AsyncQueue:${e}`]=!0}),t.hasProxyManagement=this.hasProxyManagement(),t}async get(e,t,r){await this.waitForReady();const s={...r,params:t?{...r?.params,...t}:r?.params};return this.requestInstance.get(e,s)}async post(e,t){return await this.waitForReady(),this.requestInstance.post(e,t)}async put(e,t){return await this.waitForReady(),this.requestInstance.put(e,t)}async delete(e,t){return await this.waitForReady(),this.requestInstance.delete(e,t)}async patch(e,t){return await this.waitForReady(),this.requestInstance.patch(e,t)}async request(e){return await this.waitForReady(),this.requestInstance.request({url:e.url,method:e.method||"GET",options:e.options||{}})}async addProxy(e){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 proxies 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.addProxy(e)}async deleteProxy(e){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 proxies 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.deleteProxy(e)}getAvailableProxies(){return this.proxyManagerInstance?this.proxyManagerInstance.getAvailableProxiesList():[]}getCurrentProxy(){return this.proxyManagerInstance?this.proxyManagerInstance.getCurrentProxy():null}async rotateProxy(){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 proxies 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.rotateProxy()}setProxyStrategy(e){if(!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 proxies 或 proxyCheckOptions 来启用此功能");this.proxyManagerInstance.setProxyStrategy(e)}async checkProxy(e){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 proxies 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.checkProxy(e)}async triggerProxyCheck(){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 proxies 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.triggerProxyCheck()}hasProxyManagement(){return!!this.proxyManagerInstance}async getProxyStats(){if(await this.waitForReady(),!this.proxyManagerInstance)return{total:0,valid:0,invalid:0,available:0};const e=this.getAvailableProxies(),t=this.proxyManagerInstance?this.proxyManagerInstance.getProxiesCount():0;return{total:t,valid:e.length,invalid:t-e.length,available:e.length}}getProxyDetails(e){if(this.proxyManagerInstance)return this.proxyManagerInstance.getProxyDetails(e)}getQueueStats(){if(!this.proxyManagerInstance)throw new Error("代理管理功能未启用,无法获取队列统计");return this.proxyManagerInstance.getQueueStats()}getInstanceId(){return this.instanceId}async destroy(){this.log("info","开始清理资源"),[`ProxyManager-${this.instanceId}`,`Request-${this.instanceId}`,`AsyncQueue-${this.instanceId}`].forEach(e=>{a.ServiceLocator.has(e)&&(a.ServiceLocator.removeService(e),this.log("info",`清理服务: ${e}`))}),l.AsyncQueueSingleton.destroyInstance(this.instanceId),this.proxyManagerInstance&&(await this.proxyManagerInstance.destroy(),this.proxyManagerInstance=null),this.isInitialized=!1,this.log("info","资源清理完成")}}async function h(e){const t=e.instanceId||`instance-${Date.now()}`,r=!!(e.proxies&&e.proxies.length>0)||!!e.proxy,s=!(!e.proxyCheckOptions&&!r);if(s&&!r&&void 0===e.proxyCheckOptions?.mainUrl&&!1!==e.proxyCheckEnabled)throw new Error("启用代理管理功能时,proxyCheckOptions.mainUrl 必须设置(除非 proxyCheckEnabled 为 false 或提供了代理数组)");let n;[`ProxyManager-${t}`,`Request-${t}`,`AsyncQueue-${t}`].forEach(e=>{if(a.ServiceLocator.has(e)){if(e.startsWith("ProxyManager-"))try{const t=a.ServiceLocator.get(e);t&&"function"==typeof t.destroy&&t.destroy().catch(e=>{console.warn(`清理 ProxyManager 失败: ${e.message}`)})}catch(e){console.warn(`获取 ProxyManager 服务失败: ${e.message}`)}if(e.startsWith("AsyncQueue-")){const t=e.replace("AsyncQueue-","");l.AsyncQueueSingleton.destroyInstance(t)}a.ServiceLocator.removeService(e)}}),a.ServiceLocator.initialize(),a.ServiceLocator.has("DebugManager")?(n=a.ServiceLocator.get("DebugManager"),e.logLevel&&n.setLogLevel(e.logLevel)):(n=c.DebugManager.getInstance(),e.logLevel&&n.setLogLevel(e.logLevel),a.ServiceLocator.register("DebugManager",n));const h=`AsyncQueue-${t}`;let g;if(l.AsyncQueueSingleton.hasInstance(t)){if(g=l.AsyncQueueSingleton.getExistingInstance(t),g&&void 0!==e.logLevel)try{const t=a.ServiceLocator.get("DebugManager");e.logLevel&&t.setLogLevel(e.logLevel)}catch(e){console.warn("DebugManager未注册,无法更新debug状态")}}else g=l.AsyncQueueSingleton.getInstance(t,{logLevel:e.logLevel});a.ServiceLocator.register(h,g);let y=null;const d=`ProxyManager-${t}`;if(s)a.ServiceLocator.has(d)?(y=a.ServiceLocator.get(d),e.proxyStrategy&&y.setProxyStrategy(e.proxyStrategy),e.maxConcurrentChecks&&y.setMaxConcurrentChecks(e.maxConcurrentChecks)):y=o.ProxyManager.getInstance({proxies:e.proxies,proxy:e.proxy,proxyStrategy:e.proxyStrategy,maxConcurrentChecks:e.maxConcurrentChecks,logLevel:e.logLevel,proxyCheckOptions:e.proxyCheckOptions,proxyCheckEnabled:e.proxyCheckEnabled,instanceId:t}),await y.waitForInitialization(),a.ServiceLocator.register(d,y);else try{a.ServiceLocator.get("DebugManager").log("info","以轻量级模式运行(不使用代理管理功能)",{instanceId:t})}catch(e){console.info("以轻量级模式运行(不使用代理管理功能)",{instanceId:t})}const p=`Request-${t}`;let x;if(x=a.ServiceLocator.has(p)?a.ServiceLocator.get(p):new i.Request({maxRetries:e.maxRetries,timeout:e.timeout,logLevel:e.logLevel,retryDelay:e.retryDelay,retryDelayBase:e.retryDelayBase,retryDelayMultiplier:e.retryDelayMultiplier,instanceId:t}),a.ServiceLocator.register(p,x),e.logLevel&&"none"!==e.logLevel&&"error"!==e.logLevel)try{a.ServiceLocator.get("DebugManager").log("info","服务初始化完成",{instanceId:t,hasProxyManagement:s,proxyCount:y?y.getProxiesCount():0})}catch(e){console.info("服务初始化完成",{instanceId:t,hasProxyManagement:s,proxyCount:y?y.getProxiesCount():0})}return new u({...e,instanceId:t})}t.ProxyRequestSDK=u,t.default=u,t.VERSION=n.default.version;var g=r(298);Object.defineProperty(t,"getFormattedDate",{enumerable:!0,get:function(){return g.getFormattedDate}}),Object.defineProperty(t,"getMainDirectory",{enumerable:!0,get:function(){return g.getMainDirectory}})},577:function(e,t,r){var s,n=this&&this.__createBinding||(Object.create?function(e,t,r,s){void 0===s&&(s=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,n)}:function(e,t,r,s){void 0===s&&(s=r),e[s]=t[r]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=s(e),o=0;o<r.length;o++)"default"!==r[o]&&n(t,e,r[o]);return i(t,e),t});Object.defineProperty(t,"__esModule",{value:!0}),t.safeLog=t.debugManager=t.DebugManager=void 0;const a=o(r(896)),c=o(r(928)),l=o(r(306));r(171);class u{constructor(){this.logLevel="info",this.logLevelPriority={none:0,error:1,warn:2,info:3,debug:4,verbose:5},this.initializeLogger()}static getInstance(){return u.instance||(u.instance=new u),u.instance}initializeLogger(){const e=c.join(process.cwd(),"logs");a.existsSync(e)||a.mkdirSync(e,{recursive:!0});const t=l.format.combine(l.format.timestamp({format:"YYYY-MM-DD HH:mm:ss"}),l.format.printf(({timestamp:e,level:t,message:r,...s})=>{let n=`${e} [${t.toUpperCase()}] ${r}`;if(Object.keys(s).length>0){const{timestamp:e,level:t,message:r,...i}=s;if(Object.keys(i).length>0)try{n+=` | ${JSON.stringify(i)}`}catch{n+=` | ${String(i)}`}}return n}));this.logger=l.createLogger({level:this.getWinstonLevel(this.logLevel),format:t,transports:[new l.transports.Console({format:t}),new l.transports.DailyRotateFile({filename:c.join(e,"%DATE%.log"),format:t,datePattern:"YYYY/MM/DD",maxFiles:null})]})}getWinstonLevel(e){return{none:"error",error:"error",warn:"warn",info:"info",debug:"debug",verbose:"verbose"}[e]}setLogLevel(e){this.logLevel=e,this.logger.level=this.getWinstonLevel(e)}getLogLevel(){return this.logLevel}logInternal(e,t,r){const s=`[${e.toUpperCase()}]`;this.logger.log(this.getWinstonLevel(e),`${s} [DebugManager] ${t}`,r)}log(e,t,r){this.logger.log(this.getWinstonLevel(e),t,r)}error(e,t){this.log("error",e,t)}warn(e,t){this.log("warn",e,t)}info(e,t){this.log("info",e,t)}debug(e,t){this.log("debug",e,t)}verbose(e,t){this.log("verbose",e,t)}}t.DebugManager=u,t.debugManager=u.getInstance(),t.safeLog=t.debugManager.log.bind(t.debugManager)},626:e=>{e.exports=require("async")},696:function(e,t,r){var s,n=this&&this.__createBinding||(Object.create?function(e,t,r,s){void 0===s&&(s=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,n)}:function(e,t,r,s){void 0===s&&(s=r),e[s]=t[r]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=s(e),o=0;o<r.length;o++)"default"!==r[o]&&n(t,e,r[o]);return i(t,e),t});Object.defineProperty(t,"__esModule",{value:!0}),t.ProxyManager=void 0;const a=r(892),c=r(388);class l{constructor(e={}){this.isInitialized=!1,this.initializationPromise=null,this.instanceId=e.instanceId||`proxy-pool-manager-${Date.now()}`,this.logLevel=e.logLevel||"none",this.proxyCheckEnabled=e.proxyCheckEnabled??!0,this.proxyStrategy=e.proxyStrategy??"sequential",this.availableProxies=new Set,this.checkInProgress=new Set,this.maxConcurrentChecks=e.maxConcurrentChecks??5,this.asyncQueue=a.AsyncQueueSingleton.getInstance(this.instanceId,{concurrency:this.maxConcurrentChecks,autoStart:!0,logLevel:this.logLevel,onDrain:()=>{this.log("info","所有代理检测任务完成")},onError:e=>{this.log("error","代理检测任务出错:",e)},onSuccess:e=>{},taskHandler:async e=>(await new Promise(e=>setTimeout(e,1e3)),await this.taskHandler(e))}),this.proxies=[],Array.isArray(e.proxies)?e.proxies.forEach(e=>{this.addProxySync(e)}):e.proxy&&this.addProxySync(e.proxy),this.proxyCheckOptions={mainUrl:e.proxyCheckOptions?.mainUrl||"",testUrls:e.proxyCheckOptions?.testUrls??["http://httpbin.org/ip","http://api.ipify.org?format=json","http://ipinfo.io/json"],timeout:e.proxyCheckOptions?.timeout??5,successStatusCodes:e.proxyCheckOptions?.successStatusCodes??[200],checkInterval:e.proxyCheckOptions?.checkInterval??6e4,maxConsecutiveFails:e.proxyCheckOptions?.maxConsecutiveFails??3,maxResponseTime:e.proxyCheckOptions?.maxResponseTime??2e3},this.currentProxyIndex=0,this.usedProxies=new Set,this.initializationPromise=this.initializeAsync()}async initializeAsync(){try{this.isInitialized=!0,this.log("info",`ProxyManager初始化完成,加载了 ${this.proxies.length} 个代理`)}catch(e){throw this.log("error","ProxyManager初始化失败:",e),e}}async waitForInitialization(){if(!this.isInitialized){if(!this.initializationPromise)throw new Error("ProxyManager未正确初始化");await this.initializationPromise}}addProxySync(e){if(!this.proxies.find(t=>t.url===e)){const t={url:e,totalRequests:0,failCount:0,avgResponseTime:0,lastCheckTime:Date.now(),consecutiveFails:0,status:"valid"};this.proxies.push(t),this.availableProxies.add(e)}}static getInstance(e={}){const t=e.instanceId||`proxy-pool-manager-${Date.now()}`;if(l.instances.has(t))return l.instances.get(t);l.instanceLock=!0;try{if(l.instances.has(t))return l.instances.get(t);const r=new l({...e,instanceId:t});return l.instances.set(t,r),r}finally{l.instanceLock=!1}}static resetInstance(e){if(void 0!==e){const t=l.instances.get(e);t&&(t.destroy(),l.instances.delete(e))}else l.instances.forEach(e=>e.destroy()),l.instances.clear()}log(e,t,r){try{const s=c.ServiceLocator.get("DebugManager");e.toUpperCase(),s.log(e,`[ProxyManager] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${n} [ProxyManager] ${t}`,r||"")}}setLogLevel(e){try{c.ServiceLocator.get("DebugManager").setLogLevel(e),this.log("info",`设置日志等级: ${e}`)}catch(e){console.warn("DebugManager未注册,无法设置日志等级")}}getLogLevel(){try{return c.ServiceLocator.get("DebugManager").getLogLevel()}catch(e){return"info"}}async addProxy(e){if(!e?.trim())throw new Error("代理URL不能为空");await this.waitForInitialization();const t=this.proxies.find(t=>t.url===e);if(t)return this.log("info","代理已存在于内存中",{proxy:e}),t;const r={url:e,totalRequests:0,failCount:0,avgResponseTime:0,lastCheckTime:Date.now(),consecutiveFails:0,status:"valid"};return this.proxies.push(r),this.availableProxies.add(e),this.log("info","添加新代理",{proxy:e}),r}async deleteProxy(e){await this.waitForInitialization();const t=this.proxies.findIndex(t=>t.url===e);return-1!==t&&(this.proxies.splice(t,1),this.availableProxies.delete(e),this.log("info","从内存中删除代理",{proxy:e}),!0)}async deleteInvalidProxies(){await this.waitForInitialization();const e=this.proxies.filter(e=>"invalid"===e.status).length;return this.proxies=this.proxies.filter(e=>"valid"===e.status),this.availableProxies.clear(),this.proxies.forEach(e=>this.availableProxies.add(e.url)),this.log("info","从内存中删除无效代理",{count:e}),e}async standaloneProxyCheck(e,t,s,n){const{default:i}=await Promise.resolve().then(()=>o(r(867)));try{const r=new AbortController,o=setTimeout(()=>r.abort(),1e3*n),a={method:"POST",headers:{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"}};let c={url:s,method:"GET"};e&&(c.proxy=e,c.impersonate="chrome",c.timeout=n,a.body=JSON.stringify(c),a.headers["Content-Type"]="application/json");const l=await i(t,a),u=await l.text();let h;clearTimeout(o);try{h=JSON.parse(u)}catch{h=u}const g={status_code:l.status,success:l.ok,headers:Object.fromEntries(l.headers.entries()),data:h,error:l.ok?void 0:u,timestamp:(new Date).toISOString()},y=l.ok&&this.proxyCheckOptions.successStatusCodes.includes(g.status_code);return y?this.log("info","代理检测成功",{proxy:e,status:g.status_code,result:JSON.stringify(g.data)}):this.log("error","代理检测状态码不符",{proxy:e,statusCode:g.status_code,expected:this.proxyCheckOptions.successStatusCodes}),y}catch(t){return this.log("error","代理检测请求失败",{proxy:e,error:t.message}),!1}}async taskHandler(e){const t=Date.now();try{const r=this.proxyCheckOptions.testUrls[Math.floor(Math.random()*this.proxyCheckOptions.testUrls.length)],s=await this.standaloneProxyCheck(e.url,this.proxyCheckOptions.mainUrl,r,this.proxyCheckOptions.timeout),n=Date.now()-t;return e.totalRequests++,e.lastCheckTime=Date.now(),s?(e.avgResponseTime=(e.avgResponseTime*(e.totalRequests-1)+n)/e.totalRequests,e.consecutiveFails=0):(e.failCount++,e.consecutiveFails++),{proxy:e,isAvailable:s,responseTime:n}}catch(r){return this.log("error","代理检测出错",{proxy:e.url,error:r.message}),e.totalRequests++,e.failCount++,e.consecutiveFails++,e.lastCheckTime=Date.now(),{proxy:e,isAvailable:!1,responseTime:Date.now()-t}}}async checkAllProxies(){const e=this.proxies.filter(e=>"valid"===e.status);this.log("info",`开始批量检测代理,共 ${e.length} 个代理,最大并发数: ${this.maxConcurrentChecks}`),this.asyncQueue.updateConcurrency(this.maxConcurrentChecks);const t=[];try{const r=await this.asyncQueue.addBatch(e);t.push(...r),t.forEach(e=>{e.proxy.totalRequests>=2&&(e.proxy.failCount,e.proxy.totalRequests),e.proxy.failCount||e.proxy.avgResponseTime>this.proxyCheckOptions.maxResponseTime?(e.proxy.status="invalid",this.availableProxies.delete(e.proxy.url)):e.proxy.status="valid"});const s=e.filter(e=>"valid"===e.status).length,n=e.length-s;this.log("info","批量代理检测完成",{total:e.length,valid:s,invalid:n})}catch(e){this.log("error","批量代理检测失败",{error:e.message})}}getCurrentProxy(){return 0===this.proxies.length?null:this.proxies[this.currentProxyIndex].url}selectProxy(){const e=this.proxies.filter(e=>"valid"===e.status);if(0===e.length)return this.proxies.length>0?(this.currentProxyIndex=0,this.proxies[0].url):null;let t;switch(this.proxyStrategy){case"sequential":t=this.currentProxyIndex%e.length,this.currentProxyIndex=(t+1)%e.length;break;case"random":this.usedProxies.size>=e.length&&this.usedProxies.clear();const r=Array.from({length:e.length},(e,t)=>t).filter(e=>!this.usedProxies.has(e));t=r.length>0?r[Math.floor(Math.random()*r.length)]:Math.floor(Math.random()*e.length),this.usedProxies.add(t),this.currentProxyIndex=t;break;case"failover":const s=[...e].sort((e,t)=>{if(e.consecutiveFails!==t.consecutiveFails)return e.consecutiveFails-t.consecutiveFails;const r=e.totalRequests>0?e.failCount/e.totalRequests:0,s=t.totalRequests>0?t.failCount/t.totalRequests:0;return r!==s?r-s:e.avgResponseTime-t.avgResponseTime});t=this.proxies.findIndex(e=>e.url===s[0].url),this.currentProxyIndex=t;break;default:t=this.currentProxyIndex%e.length}return e[t].url}async rotateProxy(){if(0===this.proxies.filter(e=>"valid"===e.status).length)return this.proxies.length>0?(this.currentProxyIndex=0,this.log("info","无有效代理,默认使用第一个代理",{proxy:this.proxies[0].url}),this.proxies[0].url):null;const e=this.proxies[this.currentProxyIndex];e.failCount++,e.totalRequests++,e.consecutiveFails++,e.consecutiveFails>=this.proxyCheckOptions.maxConsecutiveFails&&(e.status="invalid",this.availableProxies.delete(e.url));const t=this.proxies.filter(e=>"valid"===e.status);if(0===t.length)return this.proxies.length>0?(this.currentProxyIndex=0,this.log("info","无有效代理,默认使用第一个代理",{proxy:this.proxies[0].url}),this.proxies[0].url):null;this.currentProxyIndex=(this.currentProxyIndex+1)%t.length;const r=t[this.currentProxyIndex];return this.log("info","轮换代理",{from:e.url,to:r.url,consecutiveFails:e.consecutiveFails}),r.url}async recordProxyUsage(e,t,r){const s=this.proxies.find(t=>t.url===e);s&&(s.totalRequests++,t?(s.avgResponseTime=(s.avgResponseTime*(s.totalRequests-1)+r)/s.totalRequests,s.consecutiveFails=0):(s.failCount++,s.consecutiveFails++),s.lastCheckTime=Date.now(),t&&"invalid"===s.status&&(s.status="valid",this.availableProxies.add(s.url)))}resetProxyUsage(){this.usedProxies.clear(),this.log("info","重置代理使用记录")}setProxyStrategy(e){this.proxyStrategy=e,this.resetProxyUsage(),this.log("info","设置代理策略",{strategy:e})}async enhancedProxyCheck(e){if(!this.proxyCheckEnabled)return!0;if(this.checkInProgress.has(e))return!0;try{this.checkInProgress.add(e);const t=this.proxyCheckOptions.testUrls[Math.floor(Math.random()*this.proxyCheckOptions.testUrls.length)],r=Date.now(),s=await this.standaloneProxyCheck(e,this.proxyCheckOptions.mainUrl,t,this.proxyCheckOptions.timeout),n=Date.now()-r;return s&&n>this.proxyCheckOptions.maxResponseTime?(this.log("error","代理响应时间过长",{proxy:e,responseTime:n,threshold:this.proxyCheckOptions.maxResponseTime}),!1):s}catch(t){return this.log("error","代理检测异常",{proxy:e,error:t.message}),!1}finally{this.checkInProgress.delete(e)}}setMaxConcurrentChecks(e){e>0&&(this.maxConcurrentChecks=e,this.asyncQueue.updateConcurrency(e),this.log("info","更新最大并发检查数",{maxConcurrentChecks:e}))}getQueueStats(){return this.asyncQueue.stats}pauseProxyChecks(){this.asyncQueue.pause(),this.log("info","代理检测队列已暂停")}resumeProxyChecks(){this.asyncQueue.resume(),this.log("info","代理检测队列已恢复")}async checkProxy(e){const t=e||this.getCurrentProxy();if(!t)return!1;const r=await this.enhancedProxyCheck(t),s=this.proxies.find(e=>e.url===t);return s&&(s.status=r?"valid":"invalid",r?this.availableProxies.add(t):this.availableProxies.delete(t)),this.log("info","代理检查完成",{proxy:t,result:r}),r}getAvailableProxy(){const e=this.proxies.filter(e=>"valid"===e.status);if(0===e.length)return this.proxies.length>0?(this.currentProxyIndex=0,this.log("info","所有代理均不可用,默认使用第一个代理",{proxy:this.proxies[0].url}),this.proxies[0].url):null;const t=this.selectProxy();return this.log("info","获取代理",{proxy:t,strategy:this.proxyStrategy,available:e.length}),t}shouldRotateProxy(e){if(0===this.proxies.filter(e=>"valid"===e.status).length)return!1;if(!e||!e.message)return!1;const t=e.message.toLowerCase();return["proxy","connect","connection","timeout","socket","网络","连接","ETIMEDOUT","ECONNREFUSED"].some(e=>t.includes(e))}async triggerProxyCheck(){await this.waitForInitialization(),this.log("info","手动触发代理检测"),await this.checkAllProxies()}getAvailableProxiesList(){const e=this.proxies.filter(e=>"valid"===e.status).map(e=>e.url);return 0===e.length&&this.proxies.length>0?[this.proxies[0].url]:e}getProxyDetails(e){return this.proxies.find(t=>t.url===e)}getProxiesCount(){return this.proxies.length}getProxyStrategy(){return this.proxyStrategy}getCurrentProxyIndex(){return this.currentProxyIndex}async destroy(){if(this.checkInProgress.clear(),this.usedProxies.clear(),this.proxies=[],this.availableProxies.clear(),this.asyncQueue){const e=this.asyncQueue.getName();this.asyncQueue.pause(),a.AsyncQueueSingleton.destroyInstance(e)}this.isInitialized=!1,this.initializationPromise=null,l.instances.delete(this.instanceId),this.log("info","ProxyManager 已完全销毁")}}t.ProxyManager=l,l.instances=new Map,l.instanceLock=!1},867:e=>{e.exports=require("node-fetch")},892:function(e,t,r){var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.AsyncQueueSingleton=void 0;const n=s(r(626)),i=r(388);class o{constructor(e="default",t={}){this.queue=null,this.isInitialized=!1,this.logLevel="info",this.instanceName=e,this.logLevel=t.logLevel||"info",this.concurrency=t.concurrency||100,this.autoStart=!1!==t.autoStart,this.onDrain=t.onDrain||(()=>{this.log("info","所有任务完成")}),this.onError=t.onError||(e=>{this.log("error","任务错误:",e)}),this.onSuccess=t.onSuccess||(e=>{}),this.taskHandler=t.taskHandler||this.defaultTaskHandler,this.initializeQueue()}async defaultTaskHandler(e){return await new Promise(e=>setTimeout(e,1e3)),this.log("debug",`[${this.instanceName}] 剩余任务${this.queue?.length()} 运行任务数${this.queue?.running()}`),`运行成功 - ${this.instanceName}`}initializeQueue(){this.isInitialized||(this.queue=n.default.queue(async e=>await this.taskHandler(e),this.concurrency),this.queue.drain(()=>{this.onDrain()}),this.autoStart||this.queue.pause(),this.isInitialized=!0,this.log("info","队列初始化完成",{concurrency:this.concurrency,autoStart:this.autoStart}))}add(e,t=0){return new Promise((r,s)=>{if(!this.queue)return void s(new Error(`[${this.instanceName}] 队列未初始化`));const n=(t,n)=>{t?(this.log("error","任务执行失败",{task:e,error:t.message}),s(t)):(this.onSuccess(n),r(n))};t>0?this.queue.unshift(e,n):this.queue.push(e,n),this.log("debug","添加任务",{task:e,priority:t,queueLength:this.queue.length(),running:this.queue.running()})})}addBatch(e,t=0){return this.log("info","批量添加任务",{count:e.length,priority:t,instance:this.instanceName}),Promise.all(e.map(e=>this.add(e,t)))}updateConcurrency(e){if(e>0&&e!==this.concurrency&&this.queue){const t=this.concurrency;this.concurrency=e,this.queue.concurrency=e,this.log("info","更新并发数",{from:t,to:e,instance:this.instanceName})}}pause(){return this.queue?.pause(),this.log("info","队列暂停",{instance:this.instanceName}),this}resume(){return this.queue?.resume(),this.log("info","队列恢复",{instance:this.instanceName}),this}get length(){return this.queue?.length()||0}get running(){return this.queue?.running()||0}get workersList(){return this.queue?.workersList()||[]}get idle(){return this.queue?.idle()||!1}get stats(){return{length:this.length,running:this.running,concurrency:this.concurrency,idle:this.idle}}getName(){return this.instanceName}setTaskHandler(e){this.taskHandler=e,this.log("info","任务处理器已更新",{instance:this.instanceName})}destroy(){this.queue&&(this.queue.kill(),this.queue=null),this.isInitialized=!1,this.log("info","队列已销毁",{instance:this.instanceName})}log(e,t,r){try{const s=i.ServiceLocator.get("DebugManager");e.toUpperCase(),s.log(e,`[AsyncQueue:${this.instanceName}] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${n} [AsyncQueue:${this.instanceName}] ${t}`,r||"")}}setLogLevel(e){this.logLevel=e;try{i.ServiceLocator.get("DebugManager").setLogLevel(e)}catch(e){console.warn("DebugManager未注册,无法设置日志等级")}this.log("info",`设置日志等级: ${e}`)}getLogLevel(){return this.logLevel}static getInstance(e="default",t={}){if(o.instances.has(e)){const r=o.instances.get(e);if(r.isInitialized&&r.queue)return void 0!==t.logLevel&&t.logLevel!==r.logLevel&&r.setLogLevel(t.logLevel),t.concurrency&&t.concurrency!==r.concurrency&&r.updateConcurrency(t.concurrency),r;o.instances.delete(e)}const r=new o(e,t);return o.instances.set(e,r),r}static getInstanceNames(){return Array.from(o.instances.keys())}static getAllInstancesStats(){const e={};return o.instances.forEach((t,r)=>{e[r]=t.stats}),e}static destroyInstance(e="default"){if(o.instances.has(e)){const t=o.instances.get(e);t?.isInitialized&&t.queue&&t.destroy(),o.instances.delete(e),console.log(`[AsyncQueue] 已销毁实例: ${e}`)}}static destroyAllInstances(){const e=Array.from(o.instances.keys());e.forEach(e=>{o.destroyInstance(e)}),console.log(`[AsyncQueue] 已销毁所有实例: ${e.join(", ")}`)}static hasInstance(e="default"){return o.instances.has(e)}static getExistingInstance(e="default"){return o.instances.get(e)||null}debug(e,t){this.log("debug",e,t)}info(e,t){this.log("info",e,t)}warn(e,t){this.log("warn",e,t)}error(e,t){this.log("error",e,t)}verbose(e,t){this.log("verbose",e,t)}}t.AsyncQueueSingleton=o,o.instances=new Map},896:e=>{e.exports=require("fs")},928:e=>{e.exports=require("path")}},t={};function r(s){var n=t[s];if(void 0!==n)return n.exports;var i=t[s]={exports:{}};return e[s].call(i.exports,i,i.exports,r),i.exports}r.c=t;var s=r(r.s=435);module.exports=s})();
package/dist/index.d.ts CHANGED
@@ -1,21 +1,17 @@
1
- import { ProxyUrlBulkInsertManager } from './ProxyUrlBulkInsertManager';
2
1
  import { Request } from './Request';
3
2
  import { ProxyManager } from './proxyManager';
4
- import { MongoProxyManager } from './mongoUtils';
5
3
  import { ServiceLocator } from './ServiceLocator';
6
4
  import { DebugManager } from './DebugManager';
7
5
  import { AsyncQueueSingleton } from './AsyncQueue';
8
- import type { RequestOptions, HttpResponse, BrowserImpersonate, ProxyStrategy, ProxyItem, ProxyCheckOptions, ProxyManagerOptions, MongoConfig, LogLevel } from './types';
9
- export { ProxyUrlBulkInsertManager, Request, ProxyManager, MongoProxyManager, ServiceLocator, DebugManager, AsyncQueueSingleton };
10
- export type { RequestOptions, HttpResponse, BrowserImpersonate, ProxyStrategy, ProxyItem, ProxyCheckOptions, ProxyManagerOptions, MongoConfig };
6
+ import type { RequestOptions, HttpResponse, BrowserImpersonate, ProxyStrategy, ProxyItem, ProxyCheckOptions, ProxyManagerOptions, LogLevel } from './types';
7
+ export { Request, ProxyManager, ServiceLocator, DebugManager, AsyncQueueSingleton };
8
+ export type { RequestOptions, HttpResponse, BrowserImpersonate, ProxyStrategy, ProxyItem, ProxyCheckOptions, ProxyManagerOptions };
11
9
  export declare class ProxyRequestSDK {
12
10
  private requestInstance;
13
11
  private proxyManagerInstance;
14
- private bulkInsertManager;
15
12
  private isInitialized;
16
13
  private instanceId;
17
14
  constructor(options: {
18
- mongoUri?: string;
19
15
  maxRetries?: number;
20
16
  timeout?: number;
21
17
  proxyStrategy?: ProxyStrategy;
@@ -35,7 +31,6 @@ export declare class ProxyRequestSDK {
35
31
  maxResponseTime?: number;
36
32
  };
37
33
  proxyCheckEnabled?: boolean;
38
- proxyLimit?: number;
39
34
  instanceId?: string;
40
35
  });
41
36
  /**
@@ -85,7 +80,6 @@ export declare class ProxyRequestSDK {
85
80
  * 检查是否启用了代理管理功能
86
81
  */
87
82
  hasProxyManagement(): boolean;
88
- bulkInsertProxies(proxyUrls: string[]): Promise<number>;
89
83
  getProxyStats(): Promise<{
90
84
  total: number;
91
85
  valid: number;
@@ -102,8 +96,6 @@ export default ProxyRequestSDK;
102
96
  * 安全的服务初始化函数,确保正确的初始化顺序
103
97
  */
104
98
  export declare function initializeServices(options: {
105
- mongoUri?: string;
106
- proxyLimit?: number;
107
99
  maxRetries?: number;
108
100
  maxConcurrentChecks?: number;
109
101
  timeout?: number;
@@ -127,7 +119,6 @@ export declare function initializeServices(options: {
127
119
  instanceId?: string;
128
120
  }): Promise<ProxyRequestSDK>;
129
121
  export declare function createProxyRequest(options: {
130
- mongoUri?: string;
131
122
  maxRetries?: number;
132
123
  timeout?: number;
133
124
  maxConcurrentChecks?: number;
@@ -148,36 +139,28 @@ export declare function createProxyRequest(options: {
148
139
  maxResponseTime?: number;
149
140
  };
150
141
  proxyCheckEnabled?: boolean;
151
- proxyLimit?: number;
152
142
  instanceId?: string;
153
143
  }): Promise<ProxyRequestSDK>;
154
- export declare function registerCoreServices(options: {
155
- mongoUri: string;
144
+ export declare function registerCoreServices(options?: {
156
145
  logLevel?: LogLevel;
157
146
  instanceId?: string;
147
+ proxies?: string[];
148
+ proxy?: string;
158
149
  }): void;
159
150
  export declare function registerRequestFactory(factory: () => Request, instanceId?: string): void;
160
151
  export declare function registerProxyManagerFactory(factory: () => ProxyManager, instanceId?: string): void;
161
- export declare function bulkInsertProxyUrls(options: {
162
- mongoUri: string;
163
- proxyUrls: string[];
164
- batchSize?: number;
165
- concurrency?: number;
166
- logLevel?: LogLevel;
167
- }): Promise<number>;
168
- export declare function getStandaloneServices(options: {
169
- mongoUri: string;
152
+ export declare function getStandaloneServices(options?: {
170
153
  logLevel?: LogLevel;
171
154
  instanceId?: string;
155
+ proxies?: string[];
156
+ proxy?: string;
172
157
  }): {
173
158
  proxyManager: ProxyManager;
174
159
  request: Request;
175
- mongoManager: MongoProxyManager;
176
160
  asyncQueue: AsyncQueueSingleton;
177
161
  };
178
162
  export declare function cleanupServices(): void;
179
- export declare function checkServicesHealth(mongoUri: string, instanceId?: string): Promise<{
180
- mongo: boolean;
163
+ export declare function checkServicesHealth(instanceId?: string): Promise<{
181
164
  proxyManager: boolean;
182
165
  asyncQueues: string[];
183
166
  services: Record<string, boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.mjs ADDED
@@ -0,0 +1,24 @@
1
+ // 自动生成 —— 勿手动编辑,由 scripts/generate-esm-wrapper.js 生成
2
+ import cjs from './index.cjs';
3
+
4
+ // 重新导出所有命名导出,使 ESM import { createProxyRequest } 可用
5
+ export const ProxyRequestSDK = cjs.ProxyRequestSDK;
6
+ export const createProxyRequest = cjs.createProxyRequest;
7
+ export const initializeServices = cjs.initializeServices;
8
+ export const registerCoreServices = cjs.registerCoreServices;
9
+ export const registerRequestFactory = cjs.registerRequestFactory;
10
+ export const registerProxyManagerFactory = cjs.registerProxyManagerFactory;
11
+ export const getStandaloneServices = cjs.getStandaloneServices;
12
+ export const cleanupServices = cjs.cleanupServices;
13
+ export const checkServicesHealth = cjs.checkServicesHealth;
14
+ export const VERSION = cjs.VERSION;
15
+ export const Request = cjs.Request;
16
+ export const ProxyManager = cjs.ProxyManager;
17
+ export const ServiceLocator = cjs.ServiceLocator;
18
+ export const DebugManager = cjs.DebugManager;
19
+ export const AsyncQueueSingleton = cjs.AsyncQueueSingleton;
20
+ export const getFormattedDate = cjs.getFormattedDate;
21
+ export const getMainDirectory = cjs.getMainDirectory;
22
+
23
+ // 保持 default 导出兼容
24
+ export default cjs;
@@ -5,7 +5,6 @@ export declare class ProxyManager {
5
5
  private readonly instanceId;
6
6
  private proxies;
7
7
  private currentProxyIndex;
8
- private proxyLimit;
9
8
  private proxyCheckEnabled;
10
9
  private proxyStrategy;
11
10
  private usedProxies;
@@ -13,15 +12,9 @@ export declare class ProxyManager {
13
12
  private availableProxies;
14
13
  private checkInProgress;
15
14
  private maxConcurrentChecks;
16
- private mongoClient;
17
15
  private asyncQueue;
18
16
  private isInitialized;
19
17
  private initializationPromise;
20
- private needsMongoDB;
21
- private currentPage;
22
- private pageSize;
23
- private hasMorePages;
24
- private totalLoaded;
25
18
  private logLevel;
26
19
  private constructor();
27
20
  /**
@@ -48,31 +41,6 @@ export declare class ProxyManager {
48
41
  * 获取当前日志等级
49
42
  */
50
43
  getLogLevel(): LogLevel;
51
- /**
52
- * 从数据库加载代理(支持分页查询)
53
- * @param limit 最大加载数量,默认 0 表示加载全部
54
- * @param query 查询条件
55
- * @param forceReset 是否强制重置分页(从第一页开始)
56
- */
57
- private loadProxiesFromDB;
58
- /**
59
- * 手动加载下一页代理
60
- */
61
- loadNextPage(): Promise<number>;
62
- /**
63
- * 重置分页状态并重新加载第一页
64
- */
65
- resetPagination(): Promise<void>;
66
- /**
67
- * 获取分页状态信息
68
- */
69
- getPaginationInfo(): {
70
- currentPage: number;
71
- pageSize: number;
72
- hasMorePages: boolean;
73
- totalLoaded: number;
74
- totalInMemory: number;
75
- };
76
44
  /**
77
45
  * 添加新代理
78
46
  */
@@ -82,8 +50,8 @@ export declare class ProxyManager {
82
50
  */
83
51
  deleteProxy(proxyUrl: string): Promise<boolean>;
84
52
  /**
85
- * 删除所有无效代理
86
- */
53
+ * 删除所有无效代理
54
+ */
87
55
  deleteInvalidProxies(): Promise<number>;
88
56
  /**
89
57
  * 独立的代理检测方法,不依赖Request服务
@@ -1 +1 @@
1
- {"version":3,"file":"proxyManager.d.ts","sourceRoot":"","sources":["../src/proxyManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxyManager.d.ts","sourceRoot":"","sources":["../src/proxyManager.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -31,14 +31,11 @@ export interface ProxyManagerOptions {
31
31
  proxyStrategy?: ProxyStrategy;
32
32
  timeout?: number;
33
33
  proxyCheckOptions?: ProxyCheckOptions;
34
- mongoUri?: string;
35
34
  maxConcurrentChecks?: number;
36
- proxyLimit?: number;
37
35
  instanceId?: string;
38
36
  }
39
37
  export interface RequestInitOptions {
40
38
  logLevel?: LogLevel;
41
- mongoUri?: string;
42
39
  proxyStrategy?: ProxyStrategy;
43
40
  maxRetries?: number;
44
41
  timeout?: number;
@@ -88,10 +85,6 @@ export interface PythonResponse {
88
85
  error?: unknown;
89
86
  timestamp: string;
90
87
  }
91
- export interface MongoConfig {
92
- uri: string;
93
- logLevel?: LogLevel;
94
- }
95
88
  export interface AsyncQueueOptions<T = any> {
96
89
  logLevel?: LogLevel;
97
90
  concurrency?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,23 @@
1
1
  {
2
2
  "name": "proxy-pool-manager",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "proxy manager",
5
- "main": "./dist/index.js",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
6
7
  "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.cjs",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
7
15
  "files": [
8
16
  "dist",
9
17
  "package.json"
10
18
  ],
11
19
  "scripts": {
12
- "build": "webpack --mode=production && tsc --emitDeclarationOnly --outDir dist",
20
+ "build": "webpack --mode=production && tsc --emitDeclarationOnly --outDir dist && node scripts/generate-esm-wrapper.js",
13
21
  "dev": "webpack --mode=development",
14
22
  "watch": "webpack --watch --mode=development",
15
23
  "build:analyze": "webpack --mode=production --analyze",
@@ -28,7 +36,6 @@
28
36
  },
29
37
  "dependencies": {
30
38
  "async": "^3.2.6",
31
- "mongoose": "^7.8.7",
32
39
  "node-fetch": "^2.7.0",
33
40
  "winston": "^3.18.3",
34
41
  "winston-daily-rotate-file": "^5.0.0"
@@ -1,38 +0,0 @@
1
- import { LogLevel } from "./types";
2
- import { MongoProxyManager } from "./mongoUtils";
3
- export declare class ProxyUrlBulkInsertManager {
4
- private mongoManager;
5
- private batchSize;
6
- private concurrency;
7
- private debug;
8
- constructor(mongoManager: MongoProxyManager, batchSize?: number, concurrency?: number, logLevel?: LogLevel);
9
- setLogLevel(level: LogLevel): void;
10
- getLogLevel(): LogLevel;
11
- /**
12
- * 自动设置 debug 模式(仅在 debug 为 true 时注册)
13
- */
14
- private setDebugMode;
15
- /**
16
- * 统一的日志记录方法(通过服务定位器)
17
- */
18
- private log;
19
- /**
20
- * 将URL数组拆分为多个批次
21
- */
22
- private chunkArray;
23
- /**
24
- * 并发处理批次
25
- */
26
- private processInBatches;
27
- /**
28
- * 从URL数组批量插入代理,仅添加数据库中不存在的记录
29
- * @param proxyUrls 代理URL字符串数组
30
- * @returns 实际插入的数量
31
- */
32
- bulkInsertFromUrls(proxyUrls: string[]): Promise<number>;
33
- /**
34
- * 处理单个URL批次,仅插入不存在的代理
35
- */
36
- private processUrlBatch;
37
- }
38
- //# sourceMappingURL=ProxyUrlBulkInsertManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProxyUrlBulkInsertManager.d.ts","sourceRoot":"","sources":["../src/ProxyUrlBulkInsertManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAIjD,qBAAa,yBAAyB;IAClC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAU;gBAInB,YAAY,EAAE,iBAAiB,EAC/B,SAAS,GAAE,MAAY,EACvB,WAAW,GAAE,MAAU,EACvB,QAAQ,CAAC,EAAE,QAAQ;IAchB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAYlC,WAAW,IAAI,QAAQ;IAS9B;;GAED;IACC,OAAO,CAAC,YAAY;IA6BpB;;OAEG;IACH,OAAO,CAAC,GAAG;IAgBX;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;YACW,gBAAgB;IA2C9B;;;;OAIG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IA4B9D;;OAEG;YACW,eAAe;CA2ChC"}
package/dist/index.js DELETED
@@ -1 +0,0 @@
1
- (()=>{"use strict";var e={171:e=>{e.exports=require("winston-daily-rotate-file")},298:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getFormattedDate=function(e=!1){const t=new Date,r=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0");return e?`${r}-${s}-${n} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`:`${r}-${s}-${n}`},t.getMainDirectory=function(){const e=r(928);return r.c[r.s]?e.dirname(r.c[r.s].filename):process.cwd()}},306:e=>{e.exports=require("winston")},330:e=>{e.exports=JSON.parse('{"name":"proxy-pool-manager","version":"1.0.8","description":"proxy manager","main":"./dist/index.js","types":"./dist/index.d.ts","files":["dist","package.json"],"scripts":{"build":"webpack --mode=production && tsc --emitDeclarationOnly --outDir dist","dev":"webpack --mode=development","watch":"webpack --watch --mode=development","build:analyze":"webpack --mode=production --analyze","prepublishOnly":"npm run build"},"author":"memeak","license":"ISC","devDependencies":{"@types/node":"^22.5.4","@webpack-cli/generators":"^3.0.7","clean-webpack-plugin":"^4.0.0","ts-loader":"^9.5.1","typescript":"^5.6.2","webpack":"^5.94.0","webpack-cli":"^5.1.4"},"dependencies":{"async":"^3.2.6","mongoose":"^7.8.7","node-fetch":"^2.7.0","winston":"^3.18.3","winston-daily-rotate-file":"^5.0.0"},"packageManager":"pnpm@10.18.2+sha512.9fb969fa749b3ade6035e0f109f0b8a60b5d08a1a87fdf72e337da90dcc93336e2280ca4e44f2358a649b83c17959e9993e777c2080879f3801e6f0d999ad3dd"}')},331:e=>{e.exports=require("mongoose")},378:function(e,t,r){var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Request=void 0;const n=s(r(867)),o=r(388);class i{constructor(e={}){if(this.proxyManager=null,this.hasProxyManager=!1,void 0!==e.maxRetries&&(e.maxRetries<0||!Number.isInteger(e.maxRetries)))throw new Error("maxRetries 必须是非负整数");if(void 0!==e.timeout&&e.timeout<=0)throw new Error("timeout 必须是正数");if(void 0!==e.retryDelay&&e.retryDelay<0)throw new Error("retryDelay 必须是非负数");if(void 0!==e.retryDelayBase&&e.retryDelayBase<=0)throw new Error("retryDelayBase 必须是正数");if(void 0!==e.retryDelayMultiplier&&e.retryDelayMultiplier<=0)throw new Error("retryDelayMultiplier 必须是正数");this.maxRetries=e.maxRetries??3,this.timeout=e.timeout??30,this.logLevel=e.logLevel||"none",this.proxyStrategy=e.proxyStrategy||"sequential",this.retryDelay=e.retryDelay??null,this.retryDelayBase=e.retryDelayBase??1e3,this.retryDelayMultiplier=e.retryDelayMultiplier??2;try{const t=e.instanceId||"default";this.proxyManager=o.ServiceLocator.get(`ProxyManager-${t}`),this.hasProxyManager=!0,this.log("info","成功获取 ProxyManager 实例",{instanceId:t})}catch(t){this.hasProxyManager=!1,this.log("info","ProxyManager 未初始化,将以轻量级模式运行(不使用代理管理功能)",{instanceId:e.instanceId||"default"})}}setLogLevel(e){try{o.ServiceLocator.get("DebugManager").setLogLevel(e),this.log("info",`设置日志等级: ${e}`)}catch(e){console.warn("DebugManager未注册,无法设置日志等级")}}getLogLevel(){try{return o.ServiceLocator.get("DebugManager").getLogLevel()}catch(e){return"info"}}log(e,t,r){try{const s=o.ServiceLocator.get("DebugManager");e.toUpperCase(),s.log(e,`[Request] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${n} [Request] ${t}`,r||"")}}async selectProxy(e){if(!0===e.options.noProxy)return this.log("info","noProxy 为 true,强制直连",{}),null;if(e.options.proxy){const t=e.options.proxy;return this.hasProxyManager&&this.proxyManager&&await this.proxyManager.addProxy(t).catch(()=>{}),this.log("info","使用请求级别代理",{proxy:t}),t}if(!this.hasProxyManager||!this.proxyManager)return null;const t=this.proxyManager.getProxiesCount();if(0===t)return null;const r=this.proxyManager.getAvailableProxy();return r&&this.log("info","使用策略选择代理",{proxy:r,strategy:this.proxyManager.getProxyStrategy(),index:this.proxyManager.getCurrentProxyIndex()+1,total:t}),r}async executeSingleRequest(e,t){const r=e.options.timeout||this.timeout,s=1e3*r;try{const o=await this.selectProxy(e),i={method:e.method,headers:{},signal:AbortSignal.timeout(s)},a=e.options?{...e.options}:{};o&&(a.proxy=o),Object.keys(a).length>0&&(i.body=JSON.stringify(a),i.headers["Content-Type"]="application/json"),this.log("info",`开始请求 ${e.url} (尝试 ${t}/${this.maxRetries})`,{method:e.method,timeout:r,hasProxy:!!o});const c=Date.now(),l=await(0,n.default)(e.url,i),h=Date.now()-c;if(!l.ok)throw new Error(`HTTP Error: ${l.status} ${l.statusText}`);const u=await l.text();let g;try{g=JSON.parse(u)}catch{g=u}const y={status_code:l.status,success:l.ok,headers:Object.fromEntries(l.headers.entries()),data:g,error:l.ok?void 0:u,timestamp:(new Date).toISOString()};if(this.hasProxyManager&&this.proxyManager){const e=this.proxyManager.getCurrentProxy();e&&await this.proxyManager.recordProxyUsage(e,y.success,h).catch(()=>{})}return y}catch(s){if("TimeoutError"===s.name||"AbortError"===s.name)throw this.log("warn",`请求超时 (${r}s)`,{url:e.url,attempt:t}),new Error(`请求超时: ${r}秒`);if(this.hasProxyManager&&this.proxyManager){const e=this.proxyManager.getCurrentProxy();e&&this.proxyManager.shouldRotateProxy(s)&&(this.log("error",`代理 ${e} 出现问题,尝试轮换`,{error:s.message}),await this.proxyManager.rotateProxy().catch(()=>{}))}throw s}}isValidStatusCode(e){return e>=200&&e<300}async get(e,t={}){let r=e;return t.params&&Object.keys(t.params).length>0&&(r=`${e}?${new URLSearchParams(t.params).toString()}`),this.request({url:r,method:"GET",options:t})}async post(e,t={}){return this.request({url:e,method:"POST",options:t})}async put(e,t={}){return this.request({url:e,method:"PUT",options:t})}async delete(e,t={}){return this.request({url:e,method:"DELETE",options:t})}async patch(e,t={}){return this.request({url:e,method:"PATCH",options:t})}async request(e){const t={url:e.url,method:e.method,options:{...e.options,timeout:e.options.timeout||this.timeout}};for(let e=1;e<=this.maxRetries;e++)try{const r=await this.executeSingleRequest(t,e),s={status:r.status_code,statusText:this.getStatusText(r.status_code),headers:r.headers||{},error:r.error?String(r.error):null,errors:[],data:r.data,text:()=>"string"==typeof r.data?r.data:JSON.stringify(r.data),json:()=>r.data,buffer:()=>Buffer.from("string"==typeof r.data?r.data:JSON.stringify(r.data||{}))};return this.log("info","请求成功",{url:t.url,status:s.status,attempt:e}),s}catch(r){const s=r.message;if(this.log("error","请求失败",{attempt:e,maxRetries:this.maxRetries,url:t.url,error:s}),(s.includes("超时")||"TimeoutError"===r.name)&&this.log("warn",`请求超时,尝试 ${e}/${this.maxRetries}`),!t.options.noProxy&&this.hasProxyManager&&this.proxyManager&&e<this.maxRetries){if(0===this.proxyManager.getAvailableProxiesList().length){this.log("warn","无可用代理,停止重试");break}if(!t.options.proxy&&this.proxyManager.shouldRotateProxy(r)){const e=await this.proxyManager.rotateProxy().catch(()=>null);e&&this.log("info",`代理轮换成功,使用新代理: ${e}`)}}if(e<this.maxRetries){let t;null!==this.retryDelay?(t=this.retryDelay,this.log("info",`等待 ${t}ms 后重试(固定间隔)`)):(t=this.retryDelayBase*Math.pow(this.retryDelayMultiplier,e-1),this.log("info",`等待 ${t}ms 后重试(指数退避:基础 ${this.retryDelayBase}ms,倍数 ${this.retryDelayMultiplier})`)),await new Promise(e=>setTimeout(e,t))}}throw new Error(`${e.options.url} 请求失败,已尝试 ${this.maxRetries} 次都失败了`)}getStatusText(e){return{200:"OK",201:"Created",202:"Accepted",204:"No Content",400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",500:"Internal Server Error",502:"Bad Gateway",503:"Service Unavailable"}[e]||`Status ${e}`}getCurrentProxy(){return this.hasProxyManager&&this.proxyManager?this.proxyManager.getCurrentProxy():null}async rotateProxy(){if(!this.hasProxyManager||!this.proxyManager)throw new Error("ProxyManager 未初始化,无法轮换代理");return await this.proxyManager.rotateProxy()}resetProxyUsage(){this.hasProxyManager&&this.proxyManager&&this.proxyManager.resetProxyUsage()}setProxyStrategy(e){if(!this.hasProxyManager||!this.proxyManager)throw new Error("ProxyManager 未初始化,无法设置代理策略");this.proxyManager.setProxyStrategy(e)}async checkProxy(e){if(!this.hasProxyManager||!this.proxyManager)throw new Error("ProxyManager 未初始化,无法检查代理");return this.proxyManager.checkProxy(e)}getAvailableProxiesList(){return this.hasProxyManager&&this.proxyManager?this.proxyManager.getAvailableProxiesList():[]}hasProxyManagement(){return this.hasProxyManager}}t.Request=i,t.default=i},388:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceLocator=void 0;class r{static shouldLog(e){try{if(this.services.has("DebugManager")){const t=this.services.get("DebugManager");if(t&&"function"==typeof t.getLogLevel){const r=t.getLogLevel(),s={none:0,error:1,warn:2,info:3,debug:4,verbose:5},n=s[r]||0;return(s[e]||0)<=n}}}catch(e){}return"error"===e||"warn"===e}static shouldLogForService(e,t){if(["DebugManager","AsyncQueue"].includes(e)&&("debug"===t||"verbose"===t)){try{if(this.services.has("DebugManager")){const e=this.services.get("DebugManager");if(e&&"function"==typeof e.getLogLevel)return"verbose"===e.getLogLevel()}}catch(e){}return!1}return this.shouldLog(t)}static get(e){if(this.services.has(e)){const t=this.services.get(e);return this.shouldLogForService(e,"debug")&&this.log("debug",`返回已注册的服务实例: ${e}`,{serviceType:this.getServiceType(t)}),t}if(this.dependencies.has(e)){this.shouldLogForService(e,"debug")&&this.log("debug",`通过工厂创建服务: ${e}`);const t=this.dependencies.get(e)();return this.services.set(e,t),this.shouldLogForService(e,"debug")&&this.log("debug",`工厂创建服务完成: ${e}`,{serviceType:this.getServiceType(t)}),t}const t=new Error(`[ServiceLocator] 服务未注册: ${e}`);throw this.log("error","服务未注册",{serviceName:e,availableServices:this.getAvailableServiceNames(),error:t.message}),t}static has(e){const t=this.services.has(e)||this.dependencies.has(e);return this.shouldLogForService(e,"debug")&&this.log("debug",`检查服务存在性: ${e}`,{exists:t,hasInstance:this.services.has(e),hasFactory:this.dependencies.has(e)}),t}static register(e,t){this.services.set(e,t),this.shouldLogForService(e,"info")&&this.log("info",`注册服务: ${e}`,{serviceType:this.getServiceType(t),hasFactory:this.dependencies.has(e)})}static registerFactory(e,t){this.dependencies.set(e,t),this.shouldLogForService(e,"info")&&this.log("info",`注册服务工厂: ${e}`,{hasExistingInstance:this.services.has(e)})}static log(e,t,r){if(!this.shouldLog(e))return;try{if(this.services.has("DebugManager")){const s=this.services.get("DebugManager");if(s&&"function"==typeof s.log)return e.toUpperCase(),void s.log(e,`[ServiceLocator] ${t}`,r)}}catch(e){}const s=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${s} [ServiceLocator] ${t}`,r||"")}static getAvailableServiceNames(){const e=Array.from(this.services.keys()),t=Array.from(this.dependencies.keys()),r=[...new Set([...e,...t])];return this.shouldLog("debug")&&this.log("debug","获取可用服务名称",{total:r.length,services:e,factories:t}),r}static getStats(){const e=Array.from(this.services.keys()),t=Array.from(this.dependencies.keys()),r={totalServices:e.length,totalFactories:t.length,serviceNames:e,factoryNames:t};return this.shouldLog("debug")&&this.log("debug","服务统计",r),r}static isInitialized(){const e=this.has("DebugManager");return this.shouldLog("debug")&&this.log("debug","检查服务定位器初始化状态",{hasDebugManager:e,totalServices:this.services.size,totalFactories:this.dependencies.size}),e}static getServiceType(e){return e?e.constructor&&e.constructor.name?e.constructor.name:"function"==typeof e?"Function":Array.isArray(e)?"Array":"object"==typeof e?"Object":typeof e:"null"}static registerMultiple(e){const t=Object.keys(e);this.log("info","批量注册服务",{count:t.length,services:t}),Object.entries(e).forEach(([e,t])=>{this.register(e,t)})}static safeGet(e,t){try{return this.get(e)}catch(r){return this.log("warn",`安全获取服务失败: ${e}`,{error:r.message,usingDefault:void 0!==t}),t}}static reset(){this.services.clear(),this.dependencies.clear(),this.log("info","服务定位器已重置")}static initialize(){this.log("info","服务定位器初始化",{nodeEnv:"production"})}static clear(){const e=this.services.size,t=this.dependencies.size;this.services.clear(),this.dependencies.clear(),this.log("info","所有服务已清除",{clearedServices:e,clearedFactories:t})}static removeService(e){const t=this.services.has(e),r=this.dependencies.has(e);return this.services.delete(e),this.dependencies.delete(e),!(!t&&!r||(this.log("info",`移除服务: ${e}`,{hadService:t,hadFactory:r}),0))}static getExistingInstance(e){if(this.services.has(e))return this.services.get(e)}static hasOnlyFactory(e){return!this.services.has(e)&&this.dependencies.has(e)}static getCounts(){const e=this.services.size,t=this.dependencies.size,r=e+t;return this.shouldLog("debug")&&this.log("debug","服务数量统计",{instances:e,factories:t,total:r}),{instances:e,factories:t,total:r}}}t.ServiceLocator=r,r.services=new Map,r.dependencies=new Map},392:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ProxyUrlBulkInsertManager=void 0;const s=r(388);t.ProxyUrlBulkInsertManager=class{constructor(e,t=500,r=4,s){this.mongoManager=e,this.batchSize=t,this.concurrency=r,s&&this.setLogLevel(s)}setLogLevel(e){try{s.ServiceLocator.get("DebugManager").setLogLevel(e),this.debug="debug"===e||"verbose"===e,this.log("info",`设置日志等级: ${e}`)}catch(e){console.warn("DebugManager未注册,无法设置日志等级")}}getLogLevel(){try{return s.ServiceLocator.get("DebugManager").getLogLevel()}catch(e){return this.debug?"debug":"info"}}setDebugMode(e){if(this.debug=e,this.debug)try{let t;try{t=s.ServiceLocator.get("DebugManager")}catch(e){const{DebugManager:n}=r(577);t=n.getInstance(),s.ServiceLocator.register("DebugManager",t),this.log("info","自动注册 DebugManager")}t.setLogLevel(e?"debug":"info"),this.log("info","ProxyUrlBulkInsertManager debug 模式已开启")}catch(e){console.warn("[ProxyUrlBulkInsertManager] DebugManager 自动注册失败,使用本地 debug 模式")}}log(e,t,r){try{const n=s.ServiceLocator.get("DebugManager");e.toUpperCase(),n.log(e,`[ProxyUrlBulkInsertManager] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${n} [ProxyUrlBulkInsertManager] ${t}`,r||"")}}chunkArray(e,t){const r=[];for(let s=0;s<e.length;s+=t)r.push(e.slice(s,s+t));return r}async processInBatches(e,t){let r=0;const s=[];for(const n of e){s.length>=this.concurrency&&await Promise.race(s);const o=t(n).then(t=>{r+=t;const s=Math.round(r/e.flat().length*100);return this.debug&&this.log("info",`已处理 ${r} 条记录 (${s}%)`),t}).catch(e=>{throw this.debug&&this.log("error",`批次处理失败: ${e.message}`),e});s.push(o),s.forEach((e,t)=>{e.then(()=>s.splice(t,1))})}return await Promise.all(s),r}async bulkInsertFromUrls(e){if(0===e.length)return 0;const t=[...new Set(e)];t.length!==e.length&&this.debug&&this.log("info",`检测到 ${e.length-t.length} 个重复URL,已自动去重`),this.debug&&this.log("info",`开始处理 ${t.length} 个代理URL,仅插入不存在的记录`);const r=this.chunkArray(t,this.batchSize);return this.debug&&this.log("info",`拆分为 ${r.length} 个批次,每批 ${this.batchSize} 条`),this.processInBatches(r,e=>this.processUrlBatch(e))}async processUrlBatch(e){if(0===e.length)return 0;const t=await this.mongoManager.findAll({url:{$in:e}}),r=new Set(t.map(e=>e.url)),s=e.filter(e=>!r.has(e));if(0===s.length)return this.debug&&this.log("info",`批次中所有 ${e.length} 个代理已存在,无需插入`),0;const n=s.map(e=>({url:e,totalRequests:0,failCount:0,avgResponseTime:0,lastCheckTime:Date.now(),consecutiveFails:0,status:"valid"}));try{const e=await this.mongoManager.bulkInsert(n);return this.debug&&this.log("info",`批次插入完成,新增 ${e.insertedCount} 个代理`),e.insertedCount}catch(e){throw this.debug&&this.log("error",`批次插入失败: ${e.message}`),e}}}},435:function(e,t,r){var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getMainDirectory=t.getFormattedDate=t.VERSION=t.ProxyRequestSDK=t.AsyncQueueSingleton=t.DebugManager=t.ServiceLocator=t.MongoProxyManager=t.ProxyManager=t.Request=t.ProxyUrlBulkInsertManager=void 0,t.initializeServices=y,t.createProxyRequest=async function(e){return await y(e)},t.registerCoreServices=function(e){const t=e.instanceId||`core-${Date.now()}`,r=h.DebugManager.getInstance();e.logLevel&&r.setLogLevel(e.logLevel),l.ServiceLocator.register("DebugManager",r);const s=u.AsyncQueueSingleton.getInstance(t,{logLevel:e.logLevel});l.ServiceLocator.register(`AsyncQueue-${t}`,s);const n=a.ProxyManager.getInstance({mongoUri:e.mongoUri,logLevel:e.logLevel,instanceId:t});l.ServiceLocator.register(`ProxyManager-${t}`,n);const o=new i.Request({mongoUri:e.mongoUri,logLevel:e.logLevel,instanceId:t});l.ServiceLocator.register(`Request-${t}`,o)},t.registerRequestFactory=function(e,t){const r=t||`factory-${Date.now()}`;l.ServiceLocator.registerFactory(`Request-${r}`,e)},t.registerProxyManagerFactory=function(e,t){const r=t||`factory-${Date.now()}`;l.ServiceLocator.registerFactory(`ProxyManager-${r}`,e)},t.bulkInsertProxyUrls=async function(e){const t=new o.ProxyUrlBulkInsertManager(c.MongoProxyManager.getInstance({uri:e.mongoUri,logLevel:e.logLevel}),e.batchSize||500,e.concurrency||4,e.logLevel);return await t.bulkInsertFromUrls(e.proxyUrls)},t.getStandaloneServices=function(e){const t=e.instanceId||`standalone-${Date.now()}`,r=c.MongoProxyManager.getInstance({uri:e.mongoUri,logLevel:e.logLevel}),s=u.AsyncQueueSingleton.getInstance(`standalone-${t}`,{logLevel:e.logLevel});return{proxyManager:a.ProxyManager.getInstance({mongoUri:e.mongoUri,logLevel:e.logLevel,instanceId:t}),request:new i.Request({mongoUri:e.mongoUri,logLevel:e.logLevel,instanceId:t}),mongoManager:r,asyncQueue:s}},t.cleanupServices=function(){l.ServiceLocator.clear(),u.AsyncQueueSingleton.destroyAllInstances(),a.ProxyManager.resetInstance()},t.checkServicesHealth=async function(e,t){try{const r=c.MongoProxyManager.getInstance({uri:e}),s=await r.checkConnection(),n=t||"default",o={DebugManager:l.ServiceLocator.has("DebugManager"),[`ProxyManager-${n}`]:l.ServiceLocator.has(`ProxyManager-${n}`),[`Request-${n}`]:l.ServiceLocator.has(`Request-${n}`),[`AsyncQueue-${n}`]:l.ServiceLocator.has(`AsyncQueue-${n}`)},i=u.AsyncQueueSingleton.getInstanceNames();return{mongo:s,proxyManager:l.ServiceLocator.has(`ProxyManager-${n}`),asyncQueues:i,services:o}}catch(e){return{mongo:!1,proxyManager:!1,asyncQueues:[],services:{}}}};const n=s(r(330)),o=r(392);Object.defineProperty(t,"ProxyUrlBulkInsertManager",{enumerable:!0,get:function(){return o.ProxyUrlBulkInsertManager}});const i=r(378);Object.defineProperty(t,"Request",{enumerable:!0,get:function(){return i.Request}});const a=r(696);Object.defineProperty(t,"ProxyManager",{enumerable:!0,get:function(){return a.ProxyManager}});const c=r(862);Object.defineProperty(t,"MongoProxyManager",{enumerable:!0,get:function(){return c.MongoProxyManager}});const l=r(388);Object.defineProperty(t,"ServiceLocator",{enumerable:!0,get:function(){return l.ServiceLocator}});const h=r(577);Object.defineProperty(t,"DebugManager",{enumerable:!0,get:function(){return h.DebugManager}});const u=r(892);Object.defineProperty(t,"AsyncQueueSingleton",{enumerable:!0,get:function(){return u.AsyncQueueSingleton}});class g{constructor(e){this.proxyManagerInstance=null,this.bulkInsertManager=null,this.isInitialized=!1,this.instanceId=e.instanceId||`sdk-${Date.now()}`,e.logLevel&&this.setLogLevel(e.logLevel);const t=!!(e.proxies&&e.proxies.length>0)||!!e.proxy;if((e.mongoUri||e.proxyCheckOptions||t)&&!t&&!e.proxyCheckOptions?.mainUrl&&!1!==e.proxyCheckEnabled)throw new Error("启用代理管理功能时,proxyCheckOptions.mainUrl 必须设置(除非 proxyCheckEnabled 为 false 或提供了代理数组)");if(!l.ServiceLocator.has("DebugManager")){const t=h.DebugManager.getInstance();e.logLevel&&t.setLogLevel(e.logLevel),l.ServiceLocator.register("DebugManager",t),this.log("info","注册 DebugManager")}if(!l.ServiceLocator.has(`AsyncQueue-${this.instanceId}`)){const t=u.AsyncQueueSingleton.getInstance(this.instanceId,{logLevel:e.logLevel});l.ServiceLocator.register(`AsyncQueue-${this.instanceId}`,t),this.log("info","注册 AsyncQueue",{instanceId:this.instanceId})}try{if(!l.ServiceLocator.has(`Request-${this.instanceId}`))throw new Error("Request 服务未注册。请使用 createProxyRequest() 或 initializeServices() 创建 SDK 实例,不要直接 new ProxyRequestSDK()。");this.requestInstance=l.ServiceLocator.get(`Request-${this.instanceId}`),l.ServiceLocator.has(`ProxyManager-${this.instanceId}`)?(this.proxyManagerInstance=l.ServiceLocator.get(`ProxyManager-${this.instanceId}`),this.log("info","使用已注册的服务实例(包含代理管理)",{instanceId:this.instanceId})):(this.proxyManagerInstance=null,this.log("info","使用已注册的服务实例(轻量级模式,无代理管理)",{instanceId:this.instanceId}))}catch(e){const t=e?.message||String(e);if(t.includes("请使用 createProxyRequest"))throw e;throw this.log("error","服务未正确初始化",{error:t}),new Error(`服务初始化失败: ${t}。请使用 createProxyRequest() 或 initializeServices() 创建实例。`)}e.mongoUri&&(this.bulkInsertManager=new o.ProxyUrlBulkInsertManager(c.MongoProxyManager.getInstance({uri:e.mongoUri}),500,4,e.logLevel)),this.initializeAsync(e).catch(e=>{console.error("SDK初始化失败:",e)})}log(e,t,r){try{const s=l.ServiceLocator.get("DebugManager");e.toUpperCase(),s.log(e,`[ProxyRequestSDK:${this.instanceId}] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e?console.debug:console.info)(`${n} [ProxyRequestSDK:${this.instanceId}] ${t}`,r||"")}}async initializeAsync(e){try{this.proxyManagerInstance&&await this.proxyManagerInstance.waitForInitialization(),this.isInitialized=!0,this.log("info","初始化完成",{hasProxyManagement:!!this.proxyManagerInstance})}catch(e){throw this.log("error","初始化失败:",e),e}}async waitForReady(){for(;!this.isInitialized;)await new Promise(e=>setTimeout(e,100))}setLogLevel(e){try{l.ServiceLocator.get("DebugManager").setLogLevel(e),this.log("info",`设置日志等级: ${e}`)}catch(e){console.warn("DebugManager未注册,无法设置日志等级")}}getLogLevel(){try{return l.ServiceLocator.get("DebugManager").getLogLevel()}catch(e){return"info"}}getServiceInfo(){const e=["DebugManager",`ProxyManager-${this.instanceId}`,`Request-${this.instanceId}`,`AsyncQueue-${this.instanceId}`],t={};return e.forEach(e=>{t[e]=l.ServiceLocator.has(e)}),u.AsyncQueueSingleton.getInstanceNames().forEach(e=>{t[`AsyncQueue:${e}`]=!0}),t.hasProxyManagement=this.hasProxyManagement(),t}async get(e,t,r){await this.waitForReady();const s={...r,params:t?{...r?.params,...t}:r?.params};return this.requestInstance.get(e,s)}async post(e,t){return await this.waitForReady(),this.requestInstance.post(e,t)}async put(e,t){return await this.waitForReady(),this.requestInstance.put(e,t)}async delete(e,t){return await this.waitForReady(),this.requestInstance.delete(e,t)}async patch(e,t){return await this.waitForReady(),this.requestInstance.patch(e,t)}async request(e){return await this.waitForReady(),this.requestInstance.request({url:e.url,method:e.method||"GET",options:e.options||{}})}async addProxy(e){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 mongoUri 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.addProxy(e)}async deleteProxy(e){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 mongoUri 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.deleteProxy(e)}getAvailableProxies(){return this.proxyManagerInstance?this.proxyManagerInstance.getAvailableProxiesList():[]}getCurrentProxy(){return this.proxyManagerInstance?this.proxyManagerInstance.getCurrentProxy():null}async rotateProxy(){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 mongoUri 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.rotateProxy()}setProxyStrategy(e){if(!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 mongoUri 或 proxyCheckOptions 来启用此功能");this.proxyManagerInstance.setProxyStrategy(e)}async checkProxy(e){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 mongoUri 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.checkProxy(e)}async triggerProxyCheck(){if(await this.waitForReady(),!this.proxyManagerInstance)throw new Error("代理管理功能未启用,请提供 mongoUri 或 proxyCheckOptions 来启用此功能");return this.proxyManagerInstance.triggerProxyCheck()}hasProxyManagement(){return!!this.proxyManagerInstance}async bulkInsertProxies(e){if(await this.waitForReady(),!this.bulkInsertManager)throw new Error("批量插入功能需要提供 mongoUri");return this.bulkInsertManager.bulkInsertFromUrls(e)}async getProxyStats(){if(await this.waitForReady(),!this.proxyManagerInstance)return{total:0,valid:0,invalid:0,available:0};const e=this.getAvailableProxies(),t=this.proxyManagerInstance?this.proxyManagerInstance.getProxiesCount():0;return{total:t,valid:e.length,invalid:t-e.length,available:e.length}}getProxyDetails(e){if(this.proxyManagerInstance)return this.proxyManagerInstance.getProxyDetails(e)}getQueueStats(){if(!this.proxyManagerInstance)throw new Error("代理管理功能未启用,无法获取队列统计");return this.proxyManagerInstance.getQueueStats()}getInstanceId(){return this.instanceId}async destroy(){this.log("info","开始清理资源"),this.bulkInsertManager&&("function"==typeof this.bulkInsertManager.destroy&&await this.bulkInsertManager.destroy(),this.bulkInsertManager=null),[`ProxyManager-${this.instanceId}`,`Request-${this.instanceId}`,`AsyncQueue-${this.instanceId}`].forEach(e=>{l.ServiceLocator.has(e)&&(l.ServiceLocator.removeService(e),this.log("info",`清理服务: ${e}`))}),u.AsyncQueueSingleton.destroyInstance(this.instanceId),this.proxyManagerInstance&&(await this.proxyManagerInstance.destroy(),this.proxyManagerInstance=null),this.isInitialized=!1,this.log("info","资源清理完成")}}async function y(e){const t=e.instanceId||`instance-${Date.now()}`,r=!!(e.proxies&&e.proxies.length>0)||!!e.proxy,s=!!(e.mongoUri||e.proxyCheckOptions||r);if(s&&!r&&void 0===e.proxyCheckOptions?.mainUrl&&!1!==e.proxyCheckEnabled)throw new Error("启用代理管理功能时,proxyCheckOptions.mainUrl 必须设置(除非 proxyCheckEnabled 为 false 或提供了代理数组)");let n;[`ProxyManager-${t}`,`Request-${t}`,`AsyncQueue-${t}`].forEach(e=>{if(l.ServiceLocator.has(e)){if(e.startsWith("ProxyManager-"))try{const t=l.ServiceLocator.get(e);t&&"function"==typeof t.destroy&&t.destroy().catch(e=>{console.warn(`清理 ProxyManager 失败: ${e.message}`)})}catch(e){console.warn(`获取 ProxyManager 服务失败: ${e.message}`)}if(e.startsWith("AsyncQueue-")){const t=e.replace("AsyncQueue-","");u.AsyncQueueSingleton.destroyInstance(t)}l.ServiceLocator.removeService(e)}}),l.ServiceLocator.initialize(),l.ServiceLocator.has("DebugManager")?(n=l.ServiceLocator.get("DebugManager"),e.logLevel&&n.setLogLevel(e.logLevel)):(n=h.DebugManager.getInstance(),e.logLevel&&n.setLogLevel(e.logLevel),l.ServiceLocator.register("DebugManager",n));const o=`AsyncQueue-${t}`;let c;if(u.AsyncQueueSingleton.hasInstance(t)){if(c=u.AsyncQueueSingleton.getExistingInstance(t),c&&void 0!==e.logLevel)try{const t=l.ServiceLocator.get("DebugManager");e.logLevel&&t.setLogLevel(e.logLevel)}catch(e){console.warn("DebugManager未注册,无法更新debug状态")}}else c=u.AsyncQueueSingleton.getInstance(t,{logLevel:e.logLevel});l.ServiceLocator.register(o,c);let y=null;const d=`ProxyManager-${t}`;if(s)l.ServiceLocator.has(d)?(y=l.ServiceLocator.get(d),e.proxyStrategy&&y.setProxyStrategy(e.proxyStrategy),e.maxConcurrentChecks&&y.setMaxConcurrentChecks(e.maxConcurrentChecks)):y=a.ProxyManager.getInstance({mongoUri:e.mongoUri,proxies:e.proxies,proxy:e.proxy,proxyLimit:e.proxyLimit,proxyStrategy:e.proxyStrategy,maxConcurrentChecks:e.maxConcurrentChecks,logLevel:e.logLevel,proxyCheckOptions:e.proxyCheckOptions,proxyCheckEnabled:e.proxyCheckEnabled,instanceId:t}),await y.waitForInitialization(),l.ServiceLocator.register(d,y);else try{l.ServiceLocator.get("DebugManager").log("info","以轻量级模式运行(不使用代理管理功能)",{instanceId:t})}catch(e){console.info("以轻量级模式运行(不使用代理管理功能)",{instanceId:t})}const p=`Request-${t}`;let x;if(x=l.ServiceLocator.has(p)?l.ServiceLocator.get(p):new i.Request({maxRetries:e.maxRetries,timeout:e.timeout,logLevel:e.logLevel,retryDelay:e.retryDelay,retryDelayBase:e.retryDelayBase,retryDelayMultiplier:e.retryDelayMultiplier,instanceId:t}),l.ServiceLocator.register(p,x),e.logLevel&&"none"!==e.logLevel&&"error"!==e.logLevel)try{l.ServiceLocator.get("DebugManager").log("info","服务初始化完成",{instanceId:t,mongoUri:e.mongoUri,hasProxyManagement:s,proxyCount:y?y.getProxiesCount():0})}catch(r){console.info("服务初始化完成",{instanceId:t,mongoUri:e.mongoUri,hasProxyManagement:s,proxyCount:y?y.getProxiesCount():0})}return new g({...e,instanceId:t})}t.ProxyRequestSDK=g,t.default=g,t.VERSION=n.default.version;var d=r(298);Object.defineProperty(t,"getFormattedDate",{enumerable:!0,get:function(){return d.getFormattedDate}}),Object.defineProperty(t,"getMainDirectory",{enumerable:!0,get:function(){return d.getMainDirectory}})},577:function(e,t,r){var s,n=this&&this.__createBinding||(Object.create?function(e,t,r,s){void 0===s&&(s=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,n)}:function(e,t,r,s){void 0===s&&(s=r),e[s]=t[r]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=s(e),i=0;i<r.length;i++)"default"!==r[i]&&n(t,e,r[i]);return o(t,e),t});Object.defineProperty(t,"__esModule",{value:!0}),t.safeLog=t.debugManager=t.DebugManager=void 0;const a=i(r(896)),c=i(r(928)),l=i(r(306));r(171);class h{constructor(){this.logLevel="info",this.logLevelPriority={none:0,error:1,warn:2,info:3,debug:4,verbose:5},this.initializeLogger()}static getInstance(){return h.instance||(h.instance=new h),h.instance}initializeLogger(){const e=c.join(process.cwd(),"logs");a.existsSync(e)||a.mkdirSync(e,{recursive:!0});const t=l.format.combine(l.format.timestamp({format:"YYYY-MM-DD HH:mm:ss"}),l.format.printf(({timestamp:e,level:t,message:r,...s})=>{let n=`${e} [${t.toUpperCase()}] ${r}`;if(Object.keys(s).length>0){const{timestamp:e,level:t,message:r,...o}=s;if(Object.keys(o).length>0)try{n+=` | ${JSON.stringify(o)}`}catch{n+=` | ${String(o)}`}}return n}));this.logger=l.createLogger({level:this.getWinstonLevel(this.logLevel),format:t,transports:[new l.transports.Console({format:t}),new l.transports.DailyRotateFile({filename:c.join(e,"%DATE%.log"),format:t,datePattern:"YYYY/MM/DD",maxFiles:null})]})}getWinstonLevel(e){return{none:"error",error:"error",warn:"warn",info:"info",debug:"debug",verbose:"verbose"}[e]}setLogLevel(e){this.logLevel=e,this.logger.level=this.getWinstonLevel(e)}getLogLevel(){return this.logLevel}logInternal(e,t,r){const s=`[${e.toUpperCase()}]`;this.logger.log(this.getWinstonLevel(e),`${s} [DebugManager] ${t}`,r)}log(e,t,r){this.logger.log(this.getWinstonLevel(e),t,r)}error(e,t){this.log("error",e,t)}warn(e,t){this.log("warn",e,t)}info(e,t){this.log("info",e,t)}debug(e,t){this.log("debug",e,t)}verbose(e,t){this.log("verbose",e,t)}}t.DebugManager=h,t.debugManager=h.getInstance(),t.safeLog=t.debugManager.log.bind(t.debugManager)},626:e=>{e.exports=require("async")},696:function(e,t,r){var s,n=this&&this.__createBinding||(Object.create?function(e,t,r,s){void 0===s&&(s=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,n)}:function(e,t,r,s){void 0===s&&(s=r),e[s]=t[r]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=s(e),i=0;i<r.length;i++)"default"!==r[i]&&n(t,e,r[i]);return o(t,e),t});Object.defineProperty(t,"__esModule",{value:!0}),t.ProxyManager=void 0;const a=r(862),c=r(892),l=r(388);class h{constructor(e={}){this.mongoClient=null,this.isInitialized=!1,this.initializationPromise=null,this.needsMongoDB=!0,this.currentPage=0,this.pageSize=2e3,this.hasMorePages=!0,this.totalLoaded=0,this.instanceId=e.instanceId||`proxy-pool-manager-${Date.now()}`,this.logLevel=e.logLevel||"none",this.proxyCheckEnabled=e.proxyCheckEnabled??!0,this.proxyStrategy=e.proxyStrategy??"sequential",this.availableProxies=new Set,this.checkInProgress=new Set,this.maxConcurrentChecks=e.maxConcurrentChecks??5,this.proxyLimit=e.proxyLimit??0;const t=Array.isArray(e.proxies)&&e.proxies.length>0||!!e.proxy,r=0!==this.proxyLimit||t||this.proxyCheckEnabled;if(!e.mongoUri&&r&&0!==this.proxyLimit&&!t)throw new Error("ProxyManager实例化时,mongoUri 未设置(需要从数据库加载代理)");e.mongoUri?(this.mongoClient=a.MongoProxyManager.getInstance({uri:e.mongoUri}),this.needsMongoDB=!0):(this.needsMongoDB=!1,this.log("info","未提供 mongoUri,将跳过 MongoDB 连接(仅使用内存中的代理)")),this.asyncQueue=c.AsyncQueueSingleton.getInstance(this.instanceId,{concurrency:this.maxConcurrentChecks,autoStart:!0,logLevel:this.logLevel,onDrain:()=>{this.log("info","所有代理检测任务完成")},onError:e=>{this.log("error","代理检测任务出错:",e)},onSuccess:e=>{},taskHandler:async e=>(await new Promise(e=>setTimeout(e,1e3)),await this.taskHandler(e))}),this.proxies=[],Array.isArray(e.proxies)?e.proxies.forEach(e=>{this.addProxySync(e)}):e.proxy&&this.addProxySync(e.proxy),this.proxyCheckOptions={mainUrl:e.proxyCheckOptions?.mainUrl||"",testUrls:e.proxyCheckOptions?.testUrls??["http://httpbin.org/ip","http://api.ipify.org?format=json","http://ipinfo.io/json"],timeout:e.proxyCheckOptions?.timeout??5,successStatusCodes:e.proxyCheckOptions?.successStatusCodes??[200],checkInterval:e.proxyCheckOptions?.checkInterval??6e4,maxConsecutiveFails:e.proxyCheckOptions?.maxConsecutiveFails??3,maxResponseTime:e.proxyCheckOptions?.maxResponseTime??2e3},this.currentProxyIndex=0,this.usedProxies=new Set,this.initializationPromise=this.initializeAsync()}async initializeAsync(){try{this.needsMongoDB&&this.mongoClient?(await this.mongoClient.ensureConnected(),0!==this.proxyLimit?await this.loadProxiesFromDB():this.log("info","proxyLimit 设置为 0,跳过从数据库加载代理")):this.log("info","跳过 MongoDB 连接(不需要代理管理功能)"),this.isInitialized=!0,this.log("info",`ProxyManager初始化完成,加载了 ${this.proxies.length} 个代理`)}catch(e){throw this.log("error","ProxyManager初始化失败:",e),e}}async waitForInitialization(){if(!this.isInitialized){if(!this.initializationPromise)throw new Error("ProxyManager未正确初始化");await this.initializationPromise}}addProxySync(e){if(!this.proxies.find(t=>t.url===e)){const t={url:e,totalRequests:0,failCount:0,avgResponseTime:0,lastCheckTime:Date.now(),consecutiveFails:0,status:"valid"};this.proxies.push(t),this.availableProxies.add(e),this.mongoClient&&this.mongoClient.upsert(t).catch(t=>{this.log("error",`保存代理到数据库失败: ${e}`,t)})}}static getInstance(e={}){const t=e.instanceId||`proxy-pool-manager-${Date.now()}`;if(h.instances.has(t))return h.instances.get(t);h.instanceLock=!0;try{if(h.instances.has(t))return h.instances.get(t);const r=new h({...e,instanceId:t});return h.instances.set(t,r),r}finally{h.instanceLock=!1}}static resetInstance(e){if(void 0!==e){const t=h.instances.get(e);t&&(t.destroy(),h.instances.delete(e))}else h.instances.forEach(e=>e.destroy()),h.instances.clear()}log(e,t,r){try{const s=l.ServiceLocator.get("DebugManager");e.toUpperCase(),s.log(e,`[ProxyManager] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${n} [ProxyManager] ${t}`,r||"")}}setLogLevel(e){try{l.ServiceLocator.get("DebugManager").setLogLevel(e),this.log("info",`设置日志等级: ${e}`)}catch(e){console.warn("DebugManager未注册,无法设置日志等级")}}getLogLevel(){try{return l.ServiceLocator.get("DebugManager").getLogLevel()}catch(e){return"info"}}async loadProxiesFromDB(e={},t=!1){try{if(t&&(this.currentPage=0,this.totalLoaded=0,this.hasMorePages=!0,this.proxies=[],this.log("info","重置分页查询状态")),!this.hasMorePages&&!t)return void this.log("info","没有更多代理可加载");const r={status:"valid",...e};if(!this.mongoClient)return this.log("info","MongoDB 客户端未初始化,跳过代理加载"),void(this.hasMorePages=!1);if(0===this.proxyLimit)return this.log("info","proxyLimit 为 0,跳过代理加载"),void(this.hasMorePages=!1);const s=this.currentPage*this.pageSize,n=this.proxyLimit>0?Math.min(this.proxyLimit,this.pageSize):this.pageSize;this.log("debug","分页查询代理",{page:this.currentPage+1,pageSize:n,skip:s,query:r});const o=await this.mongoClient.findLimited(r,n,s);if(o.length<n?(this.hasMorePages=!1,this.log("info",`已加载最后一页,共 ${o.length} 个代理`)):(this.hasMorePages=!0,this.currentPage++,this.log("info",`加载第 ${this.currentPage} 页,共 ${o.length} 个代理`)),this.totalLoaded+=o.length,1===this.currentPage||t)this.proxies=o;else{const e=new Set(this.proxies.map(e=>e.url)),t=o.filter(t=>!e.has(t.url));this.proxies.push(...t)}this.availableProxies.clear(),this.proxies.forEach(e=>this.availableProxies.add(e.url)),this.log("info","从数据库加载代理完成",{totalInMemory:this.proxies.length,available:this.availableProxies.size,currentPage:this.currentPage,hasMorePages:this.hasMorePages,totalLoaded:this.totalLoaded})}catch(e){throw this.log("error","从数据库加载代理失败:",e.message),e}}async loadNextPage(){if(await this.waitForInitialization(),!this.hasMorePages)return this.log("info","没有更多代理页面,返回第一页"),await this.loadProxiesFromDB({},!0),this.proxies.length;const e=this.proxies.length;return await this.loadProxiesFromDB({},!1),this.proxies.length-e}async resetPagination(){await this.waitForInitialization(),await this.loadProxiesFromDB({},!0)}getPaginationInfo(){return{currentPage:this.currentPage,pageSize:this.pageSize,hasMorePages:this.hasMorePages,totalLoaded:this.totalLoaded,totalInMemory:this.proxies.length}}async addProxy(e){if(!e?.trim())throw new Error("代理URL不能为空");await this.waitForInitialization();let t=this.proxies.find(t=>t.url===e);if(t)return this.log("info","代理已存在于内存中",{proxy:e}),t;if(this.mongoClient&&(t=await this.mongoClient.findByUrl(e),t))return"valid"===t.status&&(this.proxies.push(t),this.availableProxies.add(e),this.log("info","从数据库加载现有代理",{proxy:e,status:t.status})),t;const r={url:e,totalRequests:0,failCount:0,avgResponseTime:0,lastCheckTime:Date.now(),consecutiveFails:0,status:"valid"},s=this.mongoClient?await this.mongoClient.upsert(r):r;return this.proxies.push(s),this.availableProxies.add(e),this.log("info","添加新代理到数据库",{proxy:e}),s}async deleteProxy(e){if(await this.waitForInitialization(),!this.mongoClient){const t=this.proxies.findIndex(t=>t.url===e);return-1!==t&&(this.proxies.splice(t,1),this.availableProxies.delete(e),this.log("info","从内存中删除代理",{proxy:e}),!0)}const t=await this.mongoClient.delete(e);return t&&(this.proxies=this.proxies.filter(t=>t.url!==e),this.availableProxies.delete(e),this.log("info","删除代理",{proxy:e})),t}async deleteInvalidProxies(){if(await this.waitForInitialization(),!this.mongoClient){const e=this.proxies.filter(e=>"invalid"===e.status).length;return this.proxies=this.proxies.filter(e=>"valid"===e.status),this.availableProxies.clear(),this.proxies.forEach(e=>this.availableProxies.add(e.url)),this.log("info","从内存中删除无效代理",{count:e}),e}const e=await this.mongoClient.deleteInvalidProxies();return this.log("info","删除无效代理完成",{count:e}),e}async standaloneProxyCheck(e,t,s,n){const{default:o}=await Promise.resolve().then(()=>i(r(867)));try{const r=new AbortController,i=setTimeout(()=>r.abort(),1e3*n),a={method:"POST",headers:{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"}};let c={url:s,method:"GET"};e&&(c.proxy=e,c.impersonate="chrome",c.timeout=n,a.body=JSON.stringify(c),a.headers["Content-Type"]="application/json");const l=await o(t,a),h=await l.text();let u;clearTimeout(i);try{u=JSON.parse(h)}catch{u=h}const g={status_code:l.status,success:l.ok,headers:Object.fromEntries(l.headers.entries()),data:u,error:l.ok?void 0:h,timestamp:(new Date).toISOString()},y=l.ok&&this.proxyCheckOptions.successStatusCodes.includes(g.status_code);return y?this.log("info","代理检测成功",{proxy:e,status:g.status_code,result:JSON.stringify(g.data)}):this.log("error","代理检测状态码不符",{proxy:e,statusCode:g.status_code,expected:this.proxyCheckOptions.successStatusCodes}),y}catch(t){return this.log("error","代理检测请求失败",{proxy:e,error:t.message}),!1}}async taskHandler(e){const t=Date.now();try{const r=this.proxyCheckOptions.testUrls[Math.floor(Math.random()*this.proxyCheckOptions.testUrls.length)],s=await this.standaloneProxyCheck(e.url,this.proxyCheckOptions.mainUrl,r,this.proxyCheckOptions.timeout),n=Date.now()-t;return e.totalRequests++,e.lastCheckTime=Date.now(),s?(e.avgResponseTime=(e.avgResponseTime*(e.totalRequests-1)+n)/e.totalRequests,e.consecutiveFails=0):(e.failCount++,e.consecutiveFails++),{proxy:e,isAvailable:s,responseTime:n}}catch(r){return this.log("error","代理检测出错",{proxy:e.url,error:r.message}),e.totalRequests++,e.failCount++,e.consecutiveFails++,e.lastCheckTime=Date.now(),{proxy:e,isAvailable:!1,responseTime:Date.now()-t}}}async checkAllProxies(){this.mongoClient||this.log("info","MongoDB 客户端未初始化,使用内存中的代理进行检测");let e=this.mongoClient?await this.mongoClient.findAll({status:"valid"}):this.proxies.filter(e=>"valid"===e.status);this.log("info",`开始批量检测代理,共 ${e.length} 个代理,最大并发数: ${this.maxConcurrentChecks}`),this.asyncQueue.updateConcurrency(this.maxConcurrentChecks);const t=[];try{const r=await this.asyncQueue.addBatch(e);t.push(...r),t.forEach(e=>{e.proxy.totalRequests>=2&&(e.proxy.failCount,e.proxy.totalRequests),e.proxy.failCount||e.proxy.avgResponseTime>this.proxyCheckOptions.maxResponseTime?(e.proxy.status="invalid",this.availableProxies.delete(e.proxy.url)):e.proxy.status="valid"}),this.mongoClient&&await this.mongoClient.bulkUpsert(e);const s=e.filter(e=>"valid"===e.status).length,n=e.length-s;this.log("info","批量代理检测完成",{total:e.length,valid:s,invalid:n})}catch(e){this.log("error","批量代理检测失败",{error:e.message})}}getCurrentProxy(){return 0===this.proxies.length?null:this.proxies[this.currentProxyIndex].url}selectProxy(){const e=this.proxies.filter(e=>"valid"===e.status);if(0===e.length)return this.proxies.length>0?(this.currentProxyIndex=0,this.proxies[0].url):null;let t;switch(this.proxyStrategy){case"sequential":t=this.currentProxyIndex%e.length,this.currentProxyIndex=(t+1)%e.length;break;case"random":this.usedProxies.size>=e.length&&this.usedProxies.clear();const r=Array.from({length:e.length},(e,t)=>t).filter(e=>!this.usedProxies.has(e));t=r.length>0?r[Math.floor(Math.random()*r.length)]:Math.floor(Math.random()*e.length),this.usedProxies.add(t),this.currentProxyIndex=t;break;case"failover":const s=[...e].sort((e,t)=>{if(e.consecutiveFails!==t.consecutiveFails)return e.consecutiveFails-t.consecutiveFails;const r=e.totalRequests>0?e.failCount/e.totalRequests:0,s=t.totalRequests>0?t.failCount/t.totalRequests:0;return r!==s?r-s:e.avgResponseTime-t.avgResponseTime});t=this.proxies.findIndex(e=>e.url===s[0].url),this.currentProxyIndex=t;break;default:t=this.currentProxyIndex%e.length}return e[t].url}async rotateProxy(){if(0===this.proxies.filter(e=>"valid"===e.status).length)return this.proxies.length>0?(this.currentProxyIndex=0,this.log("info","无有效代理,默认使用第一个代理",{proxy:this.proxies[0].url}),this.proxies[0].url):null;const e=this.proxies[this.currentProxyIndex];e.failCount++,e.totalRequests++,e.consecutiveFails++,e.consecutiveFails>=this.proxyCheckOptions.maxConsecutiveFails&&(e.status="invalid",this.availableProxies.delete(e.url)),this.mongoClient&&await this.mongoClient.upsert(e);const t=this.proxies.filter(e=>"valid"===e.status);if(0===t.length)return this.proxies.length>0?(this.currentProxyIndex=0,this.log("info","无有效代理,默认使用第一个代理",{proxy:this.proxies[0].url}),this.proxies[0].url):null;this.currentProxyIndex=(this.currentProxyIndex+1)%t.length;const r=t[this.currentProxyIndex];return this.log("info","轮换代理",{from:e.url,to:r.url,consecutiveFails:e.consecutiveFails}),r.url}async recordProxyUsage(e,t,r){const s=this.proxies.find(t=>t.url===e);s&&(s.totalRequests++,t?(s.avgResponseTime=(s.avgResponseTime*(s.totalRequests-1)+r)/s.totalRequests,s.consecutiveFails=0):(s.failCount++,s.consecutiveFails++),s.lastCheckTime=Date.now(),t&&"invalid"===s.status&&(s.status="valid",this.availableProxies.add(s.url)),this.mongoClient&&await this.mongoClient.upsert(s))}resetProxyUsage(){this.usedProxies.clear(),this.log("info","重置代理使用记录")}setProxyStrategy(e){this.proxyStrategy=e,this.resetProxyUsage(),this.log("info","设置代理策略",{strategy:e})}async enhancedProxyCheck(e){if(!this.proxyCheckEnabled)return!0;if(this.checkInProgress.has(e))return!0;try{this.checkInProgress.add(e);const t=this.proxyCheckOptions.testUrls[Math.floor(Math.random()*this.proxyCheckOptions.testUrls.length)],r=Date.now(),s=await this.standaloneProxyCheck(e,this.proxyCheckOptions.mainUrl,t,this.proxyCheckOptions.timeout),n=Date.now()-r;return s&&n>this.proxyCheckOptions.maxResponseTime?(this.log("error","代理响应时间过长",{proxy:e,responseTime:n,threshold:this.proxyCheckOptions.maxResponseTime}),!1):s}catch(t){return this.log("error","代理检测异常",{proxy:e,error:t.message}),!1}finally{this.checkInProgress.delete(e)}}setMaxConcurrentChecks(e){e>0&&(this.maxConcurrentChecks=e,this.asyncQueue.updateConcurrency(e),this.log("info","更新最大并发检查数",{maxConcurrentChecks:e}))}getQueueStats(){return this.asyncQueue.stats}pauseProxyChecks(){this.asyncQueue.pause(),this.log("info","代理检测队列已暂停")}resumeProxyChecks(){this.asyncQueue.resume(),this.log("info","代理检测队列已恢复")}async checkProxy(e){const t=e||this.getCurrentProxy();if(!t)return!1;const r=await this.enhancedProxyCheck(t),s=this.proxies.find(e=>e.url===t);return s&&(s.status=r?"valid":"invalid",r?this.availableProxies.add(t):this.availableProxies.delete(t),this.mongoClient&&await this.mongoClient.upsert(s)),this.log("info","代理检查完成",{proxy:t,result:r}),r}getAvailableProxy(){const e=this.proxies.filter(e=>"valid"===e.status);if(0===e.length)return this.proxies.length>0?(this.currentProxyIndex=0,this.log("info","所有代理均不可用,默认使用第一个代理",{proxy:this.proxies[0].url}),this.proxies[0].url):null;const t=this.selectProxy();return this.log("info","获取代理",{proxy:t,strategy:this.proxyStrategy,available:e.length}),t}shouldRotateProxy(e){if(0===this.proxies.filter(e=>"valid"===e.status).length)return!1;if(!e||!e.message)return!1;const t=e.message.toLowerCase();return["proxy","connect","connection","timeout","socket","网络","连接","ETIMEDOUT","ECONNREFUSED"].some(e=>t.includes(e))}async triggerProxyCheck(){await this.waitForInitialization(),this.log("info","手动触发代理检测"),await this.checkAllProxies()}getAvailableProxiesList(){const e=this.proxies.filter(e=>"valid"===e.status).map(e=>e.url);return 0===e.length&&this.proxies.length>0?[this.proxies[0].url]:e}getProxyDetails(e){return this.proxies.find(t=>t.url===e)}getProxiesCount(){return this.proxies.length}getProxyStrategy(){return this.proxyStrategy}getCurrentProxyIndex(){return this.currentProxyIndex}async destroy(){if(this.checkInProgress.clear(),this.usedProxies.clear(),this.proxies=[],this.availableProxies.clear(),this.asyncQueue){const e=this.asyncQueue.getName();this.asyncQueue.pause(),c.AsyncQueueSingleton.destroyInstance(e)}this.mongoClient&&this.needsMongoDB&&await this.mongoClient.disconnect(),this.isInitialized=!1,this.initializationPromise=null,h.instances.delete(this.instanceId),this.log("info","ProxyManager 已完全销毁")}}t.ProxyManager=h,h.instances=new Map,h.instanceLock=!1},862:function(e,t,r){var s,n=this&&this.__createBinding||(Object.create?function(e,t,r,s){void 0===s&&(s=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,n)}:function(e,t,r,s){void 0===s&&(s=r),e[s]=t[r]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=s(e),i=0;i<r.length;i++)"default"!==r[i]&&n(t,e,r[i]);return o(t,e),t});Object.defineProperty(t,"__esModule",{value:!0}),t.MongoProxyManager=void 0;const a=r(388),c=i(r(331)),l=new c.Schema({url:{type:String,required:!0,unique:!0},totalRequests:{type:Number,default:0},failCount:{type:Number,default:0},avgResponseTime:{type:Number,default:0},lastCheckTime:{type:Number,default:Date.now},consecutiveFails:{type:Number,default:0},status:{type:String,enum:["valid","invalid"],default:"valid"}});l.index({status:1}),l.index({url:1}),l.index({status:1,totalRequests:1});class h{constructor(e){this.isConnected=!1,this.connectPromise=null,this.connectionAttempts=0,this.maxConnectionAttempts=3,this.config=e,this.logLevel=e.logLevel||"none",this.ProxyModel=c.default.model("Proxy",l)}async connectWithRetry(){if(!this.isConnected){if(this.connectPromise)return await this.connectPromise;this.connectPromise=(async()=>{if(1===c.default.connection.readyState)return this.isConnected=!0,void this.log("info","使用现有MongoDB连接");for(;this.connectionAttempts<this.maxConnectionAttempts;)try{return this.connectionAttempts++,this.log("info",`尝试连接MongoDB (${this.connectionAttempts}/${this.maxConnectionAttempts})`),await c.default.connect(this.config.uri,{serverSelectionTimeoutMS:8e3,socketTimeoutMS:45e3,maxPoolSize:10}),this.isConnected=!0,this.connectionAttempts=0,void this.log("info",`MongoDB连接成功: ${this.config.uri}`)}catch(e){if(this.log("warn",`MongoDB连接尝试 ${this.connectionAttempts}/${this.maxConnectionAttempts} 失败: ${e.message}`),this.connectionAttempts>=this.maxConnectionAttempts){const t=new Error(`MongoDB连接失败,已尝试 ${this.maxConnectionAttempts} 次: ${e.message}`);throw this.connectPromise=null,t}await new Promise(e=>setTimeout(e,2e3*this.connectionAttempts))}})();try{await this.connectPromise}finally{this.connectPromise=null}}}static getInstance(e){const t=e.uri;return h.instances.has(t)||h.instances.set(t,new h(e)),h.instances.get(t)}log(e,t,r){try{const s=a.ServiceLocator.get("DebugManager");e.toUpperCase(),s.log(e,`[MongoProxyManager] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${n} [MongoProxyManager] ${t}`,r||"")}}async ensureConnected(){this.isConnected||(this.connectPromise?await this.connectPromise:await this.connectWithRetry())}async connect(){if(!this.isConnected){if(this.connectPromise)return await this.connectPromise;this.connectPromise=(async()=>{try{await c.default.connect(this.config.uri,{serverSelectionTimeoutMS:5e3,socketTimeoutMS:45e3}),this.isConnected=!0,this.log("info",`MongoDB连接成功: ${this.config.uri}`)}catch(e){throw this.log("error",`MongoDB连接失败: ${e.message}`),e}finally{this.connectPromise=null}})(),await this.connectPromise}}async disconnect(){this.isConnected&&(await c.default.disconnect(),this.isConnected=!1,this.log("info","连接已关闭"))}async checkConnection(){try{return await c.default.connection.db.admin().ping(),!0}catch{return!1}}async findAll(e={}){return await this.ensureConnected(),await this.ProxyModel.find(e).lean()}async findByUrl(e){return await this.ensureConnected(),await this.ProxyModel.findOne({url:e}).lean()}async upsert(e){return await this.ensureConnected(),await this.ProxyModel.findOneAndUpdate({url:e.url},{$set:e},{upsert:!0,new:!0}).lean()}async updateByUrl(e,t){if(!e)throw new Error("代理URL不能为空");if(t.url&&t.url!==e)throw new Error("不能通过updateByUrl方法修改代理URL");await this.ensureConnected();const r={$set:t};return await this.ProxyModel.findOneAndUpdate({url:e},r,{new:!0,runValidators:!0}).lean()}async bulkUpsert(e){if(0===e.length)return;await this.ensureConnected();const t=e.map(e=>({updateOne:{filter:{url:e.url},update:{$set:e},upsert:!0}}));await this.ProxyModel.bulkWrite(t)}async bulkUpdateByUrl(e){if(0===e.length)return;await this.ensureConnected();const t=e.map(e=>({updateOne:{filter:{url:e.url},update:{$set:e.data},upsert:!1}}));await this.ProxyModel.bulkWrite(t)}async bulkInsert(e){if(0===e.length)return{insertedCount:0};await this.ensureConnected();try{return{insertedCount:(await this.ProxyModel.insertMany(e,{ordered:!1,rawResult:!0})).insertedCount}}catch(e){if(e.writeErrors&&e.insertedIds)return{insertedCount:e.insertedIds.length};throw e}}async delete(e){return await this.ensureConnected(),(await this.ProxyModel.deleteOne({url:e})).deletedCount>0}async clear(){await this.ensureConnected(),await this.ProxyModel.deleteMany({})}async updateMany(e,t){return await this.ensureConnected(),(await this.ProxyModel.updateMany(e,{$set:t},{runValidators:!0})).modifiedCount}async findLimited(e={},t=0,r=0){await this.ensureConnected();const s=this.ProxyModel.find(e).lean().skip(r);return t>0&&s.limit(t),await s}async deleteInvalidProxies(){await this.ensureConnected();const e=await this.ProxyModel.deleteMany({status:"invalid"});return this.log("info","删除无效代理",{deletedCount:e.deletedCount}),e.deletedCount}async deleteByCondition(e){await this.ensureConnected();const t=await this.ProxyModel.deleteMany(e);return this.log("info","根据条件删除代理",{filter:e,deletedCount:t.deletedCount}),t.deletedCount}async getStats(){return await this.ensureConnected(),(await this.ProxyModel.aggregate([{$group:{_id:null,total:{$sum:1},valid:{$sum:{$cond:[{$eq:["$status","valid"]},1,0]}},invalid:{$sum:{$cond:[{$eq:["$status","invalid"]},1,0]}},avgResponseTime:{$avg:"$avgResponseTime"}}}]))[0]||{total:0,valid:0,invalid:0,avgResponseTime:0}}}t.MongoProxyManager=h,h.instances=new Map},867:e=>{e.exports=require("node-fetch")},892:function(e,t,r){var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.AsyncQueueSingleton=void 0;const n=s(r(626)),o=r(388);class i{constructor(e="default",t={}){this.queue=null,this.isInitialized=!1,this.logLevel="info",this.instanceName=e,this.logLevel=t.logLevel||"info",this.concurrency=t.concurrency||100,this.autoStart=!1!==t.autoStart,this.onDrain=t.onDrain||(()=>{this.log("info","所有任务完成")}),this.onError=t.onError||(e=>{this.log("error","任务错误:",e)}),this.onSuccess=t.onSuccess||(e=>{}),this.taskHandler=t.taskHandler||this.defaultTaskHandler,this.initializeQueue()}async defaultTaskHandler(e){return await new Promise(e=>setTimeout(e,1e3)),this.log("debug",`[${this.instanceName}] 剩余任务${this.queue?.length()} 运行任务数${this.queue?.running()}`),`运行成功 - ${this.instanceName}`}initializeQueue(){this.isInitialized||(this.queue=n.default.queue(async e=>await this.taskHandler(e),this.concurrency),this.queue.drain(()=>{this.onDrain()}),this.autoStart||this.queue.pause(),this.isInitialized=!0,this.log("info","队列初始化完成",{concurrency:this.concurrency,autoStart:this.autoStart}))}add(e,t=0){return new Promise((r,s)=>{if(!this.queue)return void s(new Error(`[${this.instanceName}] 队列未初始化`));const n=(t,n)=>{t?(this.log("error","任务执行失败",{task:e,error:t.message}),s(t)):(this.onSuccess(n),r(n))};t>0?this.queue.unshift(e,n):this.queue.push(e,n),this.log("debug","添加任务",{task:e,priority:t,queueLength:this.queue.length(),running:this.queue.running()})})}addBatch(e,t=0){return this.log("info","批量添加任务",{count:e.length,priority:t,instance:this.instanceName}),Promise.all(e.map(e=>this.add(e,t)))}updateConcurrency(e){if(e>0&&e!==this.concurrency&&this.queue){const t=this.concurrency;this.concurrency=e,this.queue.concurrency=e,this.log("info","更新并发数",{from:t,to:e,instance:this.instanceName})}}pause(){return this.queue?.pause(),this.log("info","队列暂停",{instance:this.instanceName}),this}resume(){return this.queue?.resume(),this.log("info","队列恢复",{instance:this.instanceName}),this}get length(){return this.queue?.length()||0}get running(){return this.queue?.running()||0}get workersList(){return this.queue?.workersList()||[]}get idle(){return this.queue?.idle()||!1}get stats(){return{length:this.length,running:this.running,concurrency:this.concurrency,idle:this.idle}}getName(){return this.instanceName}setTaskHandler(e){this.taskHandler=e,this.log("info","任务处理器已更新",{instance:this.instanceName})}destroy(){this.queue&&(this.queue.kill(),this.queue=null),this.isInitialized=!1,this.log("info","队列已销毁",{instance:this.instanceName})}log(e,t,r){try{const s=o.ServiceLocator.get("DebugManager");e.toUpperCase(),s.log(e,`[AsyncQueue:${this.instanceName}] ${t}`,r)}catch(s){const n=`[${e.toUpperCase()}]`;("error"===e?console.error:"warn"===e?console.warn:"debug"===e||"verbose"===e?console.debug:console.info)(`${n} [AsyncQueue:${this.instanceName}] ${t}`,r||"")}}setLogLevel(e){this.logLevel=e;try{o.ServiceLocator.get("DebugManager").setLogLevel(e)}catch(e){console.warn("DebugManager未注册,无法设置日志等级")}this.log("info",`设置日志等级: ${e}`)}getLogLevel(){return this.logLevel}static getInstance(e="default",t={}){if(i.instances.has(e)){const r=i.instances.get(e);if(r.isInitialized&&r.queue)return void 0!==t.logLevel&&t.logLevel!==r.logLevel&&r.setLogLevel(t.logLevel),t.concurrency&&t.concurrency!==r.concurrency&&r.updateConcurrency(t.concurrency),r;i.instances.delete(e)}const r=new i(e,t);return i.instances.set(e,r),r}static getInstanceNames(){return Array.from(i.instances.keys())}static getAllInstancesStats(){const e={};return i.instances.forEach((t,r)=>{e[r]=t.stats}),e}static destroyInstance(e="default"){if(i.instances.has(e)){const t=i.instances.get(e);t?.isInitialized&&t.queue&&t.destroy(),i.instances.delete(e),console.log(`[AsyncQueue] 已销毁实例: ${e}`)}}static destroyAllInstances(){const e=Array.from(i.instances.keys());e.forEach(e=>{i.destroyInstance(e)}),console.log(`[AsyncQueue] 已销毁所有实例: ${e.join(", ")}`)}static hasInstance(e="default"){return i.instances.has(e)}static getExistingInstance(e="default"){return i.instances.get(e)||null}debug(e,t){this.log("debug",e,t)}info(e,t){this.log("info",e,t)}warn(e,t){this.log("warn",e,t)}error(e,t){this.log("error",e,t)}verbose(e,t){this.log("verbose",e,t)}}t.AsyncQueueSingleton=i,i.instances=new Map},896:e=>{e.exports=require("fs")},928:e=>{e.exports=require("path")}},t={};function r(s){var n=t[s];if(void 0!==n)return n.exports;var o=t[s]={exports:{}};return e[s].call(o.exports,o,o.exports,r),o.exports}r.c=t;var s=r(r.s=435);module.exports=s})();
@@ -1,71 +0,0 @@
1
- import { ProxyItem, MongoConfig } from "./types";
2
- import { Document } from "mongoose";
3
- export interface ProxyDocument extends ProxyItem, Document {
4
- }
5
- export declare class MongoProxyManager {
6
- private static instances;
7
- private ProxyModel;
8
- private config;
9
- private isConnected;
10
- private connectPromise;
11
- private logLevel;
12
- private connectionAttempts;
13
- private maxConnectionAttempts;
14
- private constructor();
15
- /**
16
- * 带重试的连接方法
17
- */
18
- private connectWithRetry;
19
- static getInstance(config: MongoConfig): MongoProxyManager;
20
- /**
21
- * 统一的日志记录方法(通过服务定位器)
22
- */
23
- private log;
24
- /**
25
- * 确保连接的方法
26
- */
27
- ensureConnected(): Promise<void>;
28
- connect(): Promise<void>;
29
- disconnect(): Promise<void>;
30
- checkConnection(): Promise<boolean>;
31
- findAll(filter?: Record<string, any>): Promise<ProxyItem[]>;
32
- findByUrl(url: string): Promise<ProxyItem | null>;
33
- upsert(proxy: ProxyItem): Promise<ProxyItem>;
34
- updateByUrl(url: string, updates: Partial<ProxyItem>): Promise<ProxyItem | null>;
35
- bulkUpsert(proxies: ProxyItem[]): Promise<void>;
36
- bulkUpdateByUrl(updates: Array<{
37
- url: string;
38
- data: Partial<ProxyItem>;
39
- }>): Promise<void>;
40
- bulkInsert(proxies: ProxyItem[]): Promise<{
41
- insertedCount: number;
42
- }>;
43
- delete(url: string): Promise<boolean>;
44
- clear(): Promise<void>;
45
- updateMany(filter: Partial<ProxyItem>, updates: Partial<ProxyItem>): Promise<number>;
46
- /**
47
- * 按条件查询代理,并支持限制返回数量
48
- * @param filter 查询条件
49
- * @param limit 最大返回数量,0 表示无限制
50
- * @param skip 跳过的记录数
51
- */
52
- findLimited(filter?: Record<string, any>, limit?: number, skip?: number): Promise<ProxyItem[]>;
53
- /**
54
- * 删除所有状态为 invalid 的代理
55
- */
56
- deleteInvalidProxies(): Promise<number>;
57
- /**
58
- * 根据条件删除代理
59
- */
60
- deleteByCondition(filter: Record<string, any>): Promise<number>;
61
- /**
62
- * 获取代理统计信息
63
- */
64
- getStats(): Promise<{
65
- total: number;
66
- valid: number;
67
- invalid: number;
68
- avgResponseTime: number;
69
- }>;
70
- }
71
- //# sourceMappingURL=mongoUtils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mongoUtils.d.ts","sourceRoot":"","sources":["../src/mongoUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAY,MAAM,SAAS,CAAC;AAE3D,OAAiB,EAAE,QAAQ,EAA8B,MAAM,UAAU,CAAC;AAG1E,MAAM,WAAW,aAAc,SAAQ,SAAS,EAAE,QAAQ;CAAI;AAwB9D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,SAAS,CAA6C;IACrE,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,qBAAqB,CAAa;IAE1C,OAAO;IAOP;;KAEC;YACa,gBAAgB;WAqDhB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB;IASjE;;KAEC;IACD,OAAO,CAAC,GAAG;IAiBX;;KAEC;IACY,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAWhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAUnC,OAAO,CAAC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAO/D,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAOjD,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAW5C,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA0BhF,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/C,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzF,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,UAAU,CACrB,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAC1B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAC1B,OAAO,CAAC,MAAM,CAAC;IAUlB;;;;;OAKG;IACU,WAAW,CACtB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAChC,KAAK,GAAE,MAAU,EACjB,IAAI,GAAE,MAAU,GACf,OAAO,CAAC,SAAS,EAAE,CAAC;IAYvB;;KAEC;IACY,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOpD;;OAEG;IACU,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAO5E;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CAgBH"}