surgio 2.25.2 → 3.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/bin/dev +17 -0
  2. package/bin/dev.cmd +3 -0
  3. package/bin/run +8 -0
  4. package/bin/run.cmd +3 -0
  5. package/build/base-command.d.ts +18 -0
  6. package/build/base-command.js +74 -0
  7. package/build/commands/check.d.ts +10 -0
  8. package/build/commands/check.js +88 -0
  9. package/build/commands/clean-cache.d.ts +6 -0
  10. package/build/commands/clean-cache.js +29 -0
  11. package/build/commands/doctor.d.ts +6 -0
  12. package/build/commands/doctor.js +21 -0
  13. package/build/commands/generate.d.ts +7 -0
  14. package/build/commands/generate.js +93 -0
  15. package/build/commands/lint.d.ts +6 -0
  16. package/build/commands/lint.js +36 -0
  17. package/build/commands/new.d.ts +6 -0
  18. package/build/commands/new.js +36 -0
  19. package/build/commands/subscriptions.d.ts +7 -0
  20. package/build/commands/subscriptions.js +96 -0
  21. package/build/commands/upload.d.ts +6 -0
  22. package/build/commands/upload.js +87 -0
  23. package/build/config.d.ts +6 -0
  24. package/build/config.js +151 -0
  25. package/build/constant/constant.d.ts +17 -16
  26. package/build/constant/constant.js +3 -2
  27. package/build/constant/env.js +1 -1
  28. package/build/constant/error.js +1 -1
  29. package/build/constant/index.js +1 -1
  30. package/build/generate.d.ts +0 -1
  31. package/build/generate.js +3 -65
  32. package/build/generator/artifact.d.ts +299 -64
  33. package/build/generator/artifact.js +90 -92
  34. package/build/generator/index.d.ts +2 -0
  35. package/build/generator/index.js +19 -0
  36. package/build/generator/template.js +2 -6
  37. package/build/hooks/init.d.ts +3 -0
  38. package/build/hooks/init.js +32 -0
  39. package/build/index.d.ts +55 -53
  40. package/build/index.js +13 -51
  41. package/build/internal.d.ts +4 -0
  42. package/build/internal.js +21 -0
  43. package/build/misc/deprecation.d.ts +1 -6
  44. package/build/misc/deprecation.js +1 -8
  45. package/build/misc/flag_cn.js +1 -1
  46. package/build/provider/BlackSSLProvider.d.ts +4 -3
  47. package/build/provider/BlackSSLProvider.js +24 -16
  48. package/build/provider/ClashProvider.d.ts +7 -10
  49. package/build/provider/ClashProvider.js +165 -76
  50. package/build/provider/CustomProvider.d.ts +4 -3
  51. package/build/provider/CustomProvider.js +81 -50
  52. package/build/provider/Provider.d.ts +9 -22
  53. package/build/provider/Provider.js +31 -69
  54. package/build/provider/ShadowsocksJsonSubscribeProvider.d.ts +4 -5
  55. package/build/provider/ShadowsocksJsonSubscribeProvider.js +27 -21
  56. package/build/provider/ShadowsocksSubscribeProvider.d.ts +5 -8
  57. package/build/provider/ShadowsocksSubscribeProvider.js +30 -27
  58. package/build/provider/ShadowsocksrSubscribeProvider.d.ts +5 -8
  59. package/build/provider/ShadowsocksrSubscribeProvider.js +30 -23
  60. package/build/provider/SsdProvider.d.ts +5 -8
  61. package/build/provider/SsdProvider.js +56 -39
  62. package/build/provider/TrojanProvider.d.ts +5 -8
  63. package/build/provider/TrojanProvider.js +37 -30
  64. package/build/provider/V2rayNSubscribeProvider.d.ts +4 -5
  65. package/build/provider/V2rayNSubscribeProvider.js +61 -33
  66. package/build/provider/index.d.ts +16 -2
  67. package/build/provider/index.js +12 -5
  68. package/build/provider/types.d.ts +10 -1
  69. package/build/provider/types.js +1 -1
  70. package/build/redis.js +1 -1
  71. package/build/types.d.ts +45 -236
  72. package/build/types.js +2 -1
  73. package/build/utils/cache.js +29 -27
  74. package/build/utils/clash.d.ts +204 -3
  75. package/build/utils/clash.js +247 -106
  76. package/build/utils/configurables.d.ts +71 -0
  77. package/build/utils/configurables.js +8 -0
  78. package/build/utils/constant.js +1 -1
  79. package/build/utils/dns.js +1 -1
  80. package/build/utils/doctor.d.ts +2 -0
  81. package/build/utils/doctor.js +38 -0
  82. package/build/utils/env-flag.js +2 -2
  83. package/build/utils/error-helper.d.ts +2 -2
  84. package/build/utils/error-helper.js +30 -16
  85. package/build/utils/filter.d.ts +46 -43
  86. package/build/utils/filter.js +51 -30
  87. package/build/utils/flag.js +1 -1
  88. package/build/utils/http-client.js +38 -5
  89. package/build/utils/index.d.ts +13 -21
  90. package/build/utils/index.js +98 -117
  91. package/build/utils/linter.js +5 -2
  92. package/build/utils/loon.d.ts +3 -2
  93. package/build/utils/loon.js +67 -5
  94. package/build/utils/quantumult.d.ts +3 -3
  95. package/build/utils/quantumult.js +190 -258
  96. package/build/utils/relayable-url.js +1 -1
  97. package/build/utils/remote-snippet.js +3 -4
  98. package/build/utils/ss.js +27 -17
  99. package/build/utils/ssr.js +3 -4
  100. package/build/utils/subscription.js +7 -7
  101. package/build/utils/surfboard.d.ts +3 -2
  102. package/build/utils/surfboard.js +142 -126
  103. package/build/utils/surge.d.ts +4 -2
  104. package/build/utils/surge.js +328 -300
  105. package/build/utils/time.d.ts +1 -0
  106. package/build/utils/time.js +6 -0
  107. package/build/utils/tmp-helper.js +8 -1
  108. package/build/utils/trojan.js +19 -11
  109. package/build/utils/v2ray.js +2 -2
  110. package/build/validators/artifact.d.ts +35 -0
  111. package/build/validators/artifact.js +17 -0
  112. package/build/validators/common.d.ts +121 -0
  113. package/build/validators/common.js +52 -0
  114. package/build/validators/filter.d.ts +10 -0
  115. package/build/validators/filter.js +15 -0
  116. package/build/validators/hooks.d.ts +7 -0
  117. package/build/validators/hooks.js +8 -0
  118. package/build/validators/http.d.ts +137 -0
  119. package/build/validators/http.js +19 -0
  120. package/build/validators/index.d.ts +15 -0
  121. package/build/validators/index.js +32 -0
  122. package/build/validators/provider.d.ts +109 -0
  123. package/build/validators/provider.js +41 -0
  124. package/build/validators/shadowsocks.d.ts +86 -0
  125. package/build/validators/shadowsocks.js +29 -0
  126. package/build/validators/shadowsocksr.d.ts +77 -0
  127. package/build/validators/shadowsocksr.js +19 -0
  128. package/build/validators/snell.d.ts +71 -0
  129. package/build/validators/snell.js +20 -0
  130. package/build/validators/socks5.d.ts +77 -0
  131. package/build/validators/socks5.js +19 -0
  132. package/build/validators/surgio-config.d.ts +307 -0
  133. package/build/validators/surgio-config.js +95 -0
  134. package/build/validators/trojan.d.ts +86 -0
  135. package/build/validators/trojan.js +15 -0
  136. package/build/validators/tuic.d.ts +301 -0
  137. package/build/validators/tuic.js +21 -0
  138. package/build/validators/vmess.d.ts +92 -0
  139. package/build/validators/vmess.js +29 -0
  140. package/build/validators/wireguard.d.ts +123 -0
  141. package/build/validators/wireguard.js +26 -0
  142. package/config.d.ts +1 -0
  143. package/config.js +1 -0
  144. package/constant.d.ts +1 -0
  145. package/constant.js +1 -0
  146. package/generator.d.ts +1 -0
  147. package/generator.js +1 -0
  148. package/hygen-template/artifact/new/index.js +15 -15
  149. package/hygen-template/provider/new/index.js +8 -7
  150. package/hygen-template/template/new/index.js +3 -3
  151. package/index.d.ts +1 -0
  152. package/index.js +1 -0
  153. package/internal.d.ts +1 -0
  154. package/internal.js +1 -0
  155. package/package.json +112 -75
  156. package/provider.d.ts +1 -0
  157. package/provider.js +1 -0
  158. package/utils.d.ts +1 -0
  159. package/utils.js +1 -0
  160. package/bin/surgio.js +0 -8
  161. package/build/command/check.d.ts +0 -9
  162. package/build/command/check.js +0 -79
  163. package/build/command/clean-cache.d.ts +0 -8
  164. package/build/command/clean-cache.js +0 -43
  165. package/build/command/doctor.d.ts +0 -9
  166. package/build/command/doctor.js +0 -63
  167. package/build/command/generate.d.ts +0 -8
  168. package/build/command/generate.js +0 -64
  169. package/build/command/lint.d.ts +0 -7
  170. package/build/command/lint.js +0 -42
  171. package/build/command/new.d.ts +0 -7
  172. package/build/command/new.js +0 -44
  173. package/build/command/subscriptions.d.ts +0 -10
  174. package/build/command/subscriptions.js +0 -87
  175. package/build/command/upload.d.ts +0 -9
  176. package/build/command/upload.js +0 -101
  177. package/build/utils/command.d.ts +0 -2
  178. package/build/utils/command.js +0 -23
  179. package/build/utils/config.d.ts +0 -6
  180. package/build/utils/config.js +0 -245
  181. package/build/utils/patch-proxy.d.ts +0 -1
  182. package/build/utils/patch-proxy.js +0 -19
@@ -22,85 +22,42 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
25
  Object.defineProperty(exports, "__esModule", { value: true });
29
26
  const logger_1 = require("@surgio/logger");
30
- const joi_1 = __importDefault(require("joi"));
31
27
  const constant_1 = require("../constant");
32
- const types_1 = require("../types");
33
28
  const cache_1 = require("../utils/cache");
34
- const config_1 = require("../utils/config");
29
+ const config_1 = require("../config");
35
30
  const env_flag_1 = require("../utils/env-flag");
36
31
  const http_client_1 = __importStar(require("../utils/http-client"));
37
- const subscription_1 = require("../utils/subscription");
38
32
  const utils_1 = require("../utils");
33
+ const validators_1 = require("../validators");
39
34
  const logger = (0, logger_1.createLogger)({
40
35
  service: 'surgio:Provider',
41
36
  });
42
37
  class Provider {
38
+ name;
39
+ type;
40
+ config;
41
+ // 是否支持在订阅中获取用户流量信息
42
+ supportGetSubscriptionUserInfo;
43
+ // 是否传递 Gateway 请求的 User-Agent
44
+ passGatewayRequestUserAgent;
43
45
  constructor(name, config) {
44
46
  this.name = name;
45
- const schema = joi_1.default.object({
46
- type: joi_1.default.string()
47
- .valid(...Object.values(types_1.SupportProviderEnum))
48
- .required(),
49
- nodeFilter: joi_1.default.any().allow(joi_1.default.function(), joi_1.default.object({
50
- filter: joi_1.default.function(),
51
- supportSort: joi_1.default.boolean().strict(),
52
- })),
53
- netflixFilter: joi_1.default.any().allow(joi_1.default.function(), joi_1.default.object({
54
- filter: joi_1.default.function(),
55
- supportSort: joi_1.default.boolean().strict(),
56
- })),
57
- youtubePremiumFilter: joi_1.default.any().allow(joi_1.default.function(), joi_1.default.object({
58
- filter: joi_1.default.function(),
59
- supportSort: joi_1.default.boolean().strict(),
60
- })),
61
- customFilters: joi_1.default.object().pattern(joi_1.default.string(), joi_1.default.any().allow(joi_1.default.function(), joi_1.default.object({
62
- filter: joi_1.default.function(),
63
- supportSort: joi_1.default.boolean().strict(),
64
- }))),
65
- addFlag: joi_1.default.boolean().strict(),
66
- removeExistingFlag: joi_1.default.boolean().strict(),
67
- mptcp: joi_1.default.boolean().strict(),
68
- tfo: joi_1.default.boolean().strict(),
69
- underlyingProxy: joi_1.default.string(),
70
- startPort: joi_1.default.number().integer().min(1024).max(65535),
71
- relayUrl: [joi_1.default.boolean().strict(), joi_1.default.string()],
72
- renameNode: joi_1.default.function(),
73
- requestUserAgent: joi_1.default.string(),
74
- }).unknown();
75
- const { error, value } = schema.validate(config);
47
+ const result = validators_1.ProviderValidator.safeParse(config);
76
48
  // istanbul ignore next
77
- if (error) {
78
- throw error;
49
+ if (!result.success) {
50
+ throw result.error;
79
51
  }
80
52
  this.supportGetSubscriptionUserInfo = false;
81
- [
82
- 'type',
83
- 'nodeFilter',
84
- 'netflixFilter',
85
- 'youtubePremiumFilter',
86
- 'customFilters',
87
- 'addFlag',
88
- 'removeExistingFlag',
89
- 'tfo',
90
- 'mptcp',
91
- 'startPort',
92
- 'renameNode',
93
- 'relayUrl',
94
- 'requestUserAgent',
95
- 'underlyingProxy',
96
- ].forEach((key) => {
97
- this[key] = value[key];
98
- });
53
+ this.config = result.data;
54
+ this.type = result.data.type;
55
+ this.passGatewayRequestUserAgent =
56
+ (0, config_1.getConfig)()?.gateway?.passRequestUserAgent ?? false;
99
57
  }
100
58
  static async requestCacheableResource(url, options = {}) {
101
- var _a, _b;
102
- const cacheType = ((_b = (_a = (0, config_1.getConfig)()) === null || _a === void 0 ? void 0 : _a.cache) === null || _b === void 0 ? void 0 : _b.type) || 'default';
103
- const cacheKey = `${constant_1.CACHE_KEYS.Provider}:${(0, utils_1.toMD5)((0, http_client_1.getUserAgent)(options.requestUserAgent || '') + url)}`;
59
+ const cacheType = (0, config_1.getConfig)()?.cache?.type || 'default';
60
+ const cacheKey = `${constant_1.CACHE_KEYS.Provider}:${(0, utils_1.toMD5)((0, http_client_1.getUserAgent)(options.requestUserAgent) + url)}`;
104
61
  const requestResource = async () => {
105
62
  const headers = {};
106
63
  if (options.requestUserAgent) {
@@ -114,7 +71,7 @@ class Provider {
114
71
  body: res.body,
115
72
  };
116
73
  if (res.headers['subscription-userinfo']) {
117
- subsciptionCacheItem.subscriptionUserinfo = (0, subscription_1.parseSubscriptionUserInfo)(res.headers['subscription-userinfo']);
74
+ subsciptionCacheItem.subscriptionUserinfo = (0, utils_1.parseSubscriptionUserInfo)(res.headers['subscription-userinfo']);
118
75
  logger.debug('%s received subscription userinfo - raw: %s | parsed: %j', url, res.headers['subscription-userinfo'], subsciptionCacheItem.subscriptionUserinfo);
119
76
  }
120
77
  return subsciptionCacheItem;
@@ -142,20 +99,25 @@ class Provider {
142
99
  })();
143
100
  }
144
101
  }
102
+ determineRequestUserAgent(requestUserAgent) {
103
+ return this.passGatewayRequestUserAgent
104
+ ? requestUserAgent || this.config.requestUserAgent
105
+ : this.config.requestUserAgent;
106
+ }
145
107
  get nextPort() {
146
- if (this.startPort) {
147
- return this.startPort++;
108
+ if (this.config.startPort) {
109
+ return this.config.startPort++;
148
110
  }
149
111
  return 0;
150
112
  }
151
113
  // istanbul ignore next
152
- async getSubscriptionUserInfo({} = {}) {
114
+ getSubscriptionUserInfo = async () => {
153
115
  throw new Error('此 Provider 不支持该功能');
154
- }
116
+ };
155
117
  // istanbul ignore next
156
- getNodeList({} = {}) {
118
+ getNodeList = () => {
157
119
  return Promise.resolve([]);
158
- }
120
+ };
159
121
  }
160
122
  exports.default = Provider;
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJvdmlkZXIvUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE4QztBQUM5Qyw4Q0FBc0I7QUFFdEIsMENBQXlDO0FBQ3pDLG9DQUtrQjtBQUNsQiwwQ0FJd0I7QUFDeEIsNENBQTRDO0FBQzVDLGdEQUEyRDtBQUMzRCxvRUFBZ0U7QUFDaEUsd0RBQWtFO0FBQ2xFLG9DQUE4QztBQUU5QyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEVBQUM7SUFDMUIsT0FBTyxFQUFFLGlCQUFpQjtDQUMzQixDQUFDLENBQUM7QUFFSCxNQUFxQixRQUFRO0lBbUIzQixZQUFtQixJQUFZLEVBQUUsTUFBc0I7UUFBcEMsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUM3QixNQUFNLE1BQU0sR0FBRyxhQUFHLENBQUMsTUFBTSxDQUFDO1lBQ3hCLElBQUksRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO2lCQUNmLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQVMsMkJBQW1CLENBQUMsQ0FBQztpQkFDcEQsUUFBUSxFQUFFO1lBQ2IsVUFBVSxFQUFFLGFBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQ3pCLGFBQUcsQ0FBQyxRQUFRLEVBQUUsRUFDZCxhQUFHLENBQUMsTUFBTSxDQUFDO2dCQUNULE1BQU0sRUFBRSxhQUFHLENBQUMsUUFBUSxFQUFFO2dCQUN0QixXQUFXLEVBQUUsYUFBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRTthQUNwQyxDQUFDLENBQ0g7WUFDRCxhQUFhLEVBQUUsYUFBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FDNUIsYUFBRyxDQUFDLFFBQVEsRUFBRSxFQUNkLGFBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQ1QsTUFBTSxFQUFFLGFBQUcsQ0FBQyxRQUFR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
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmlkZXIvUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE2QztBQUU3QywwQ0FBd0M7QUFFeEMsMENBSXVCO0FBQ3ZCLHNDQUFxQztBQUNyQyxnREFBMEQ7QUFDMUQsb0VBQStEO0FBQy9ELG9DQUF3RTtBQUN4RSw4Q0FBaUQ7QUFHakQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxFQUFDO0lBQzFCLE9BQU8sRUFBRSxpQkFBaUI7Q0FDM0IsQ0FBQyxDQUFBO0FBRUYsTUFBOEIsUUFBUTtJQVNQO0lBUmIsSUFBSSxDQUFxQjtJQUN6QixNQUFNLENBQWdCO0lBRXRDLG1CQUFtQjtJQUNaLDhCQUE4QixDQUFTO0lBQzlDLDhCQUE4QjtJQUN2QiwyQkFBMkIsQ0FBUztJQUUzQyxZQUE2QixJQUFZLEVBQUUsTUFBc0I7UUFBcEMsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUN2QyxNQUFNLE1BQU0sR0FBRyw4QkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFbEQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ25CLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQTtTQUNuQjtRQUVELElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUE7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBc0IsQ0FBQTtRQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBQzVCLElBQUksQ0FBQywyQkFBMkI7WUFDOUIsSUFBQSxrQkFBUyxHQUFFLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixJQUFJLEtBQUssQ0FBQTtJQUN2RCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FDbkMsR0FBVyxFQUNYLFVBRUksRUFBRTtRQUVOLE1BQU0sU0FBUyxHQUFHLElBQUEsa0JBQVMsR0FBRSxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksU0FBUyxDQUFBO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLEdBQUcscUJBQVUsQ0FBQyxRQUFRLElBQUksSUFBQSxhQUFLLEVBQzlDLElBQUEsMEJBQVksRUFBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLENBQzdDLEVBQUUsQ0FBQTtRQUNILE1BQU0sZUFBZSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ2pDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtZQUVsQixJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDNUIsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUEsMEJBQVksRUFBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTthQUMvRDtZQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0scUJBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNwQyxZQUFZLEVBQUUsTUFBTTtnQkFDcEIsT0FBTzthQUNSLENBQUMsQ0FBQTtZQUNGLE1BQU0sb0JBQW9CLEdBQXlCO2dCQUNqRCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7YUFDZixDQUFBO1lBRUQsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEVBQUU7Z0JBQ3hDLG9CQUFvQixDQUFDLG9CQUFvQixHQUFHLElBQUEsaUNBQXlCLEVBQ25FLEdBQUcsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQVcsQ0FDL0MsQ0FBQTtnQkFDRCxNQUFNLENBQUMsS0FBSyxDQUNWLDBEQUEwRCxFQUMxRCxHQUFHLEVBQ0gsR0FBRyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUNwQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FDMUMsQ0FBQTthQUNGO1lBRUQsT0FBTyxvQkFBb0IsQ0FBQTtRQUM3QixDQUFDLENBQUE7UUFFRCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDM0IsT0FBTyx5QkFBaUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUNwQyxDQUFDLENBQUUseUJBQWlCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBMEI7Z0JBQzNELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2hCLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxlQUFlLEVBQUUsQ0FBQTtvQkFDcEQseUJBQWlCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO29CQUNyRCxPQUFPLG9CQUFvQixDQUFBO2dCQUM3QixDQUFDLENBQUMsRUFBRSxDQUFBO1NBQ1Q7YUFBTTtZQUNMLE1BQU0sVUFBVSxHQUFHLElBQUksa0JBQVUsRUFBRSxDQUFBO1lBQ25DLE1BQU0sV0FBVyxHQUFHLE1BQU0sVUFBVSxDQUFDLFFBQVEsQ0FDM0MsUUFBUSxDQUNULENBQUE7WUFFRCxPQUFPLFdBQVc7Z0JBQ2hCLENBQUMsQ0FBQyxXQUFXO2dCQUNiLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2hCLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxlQUFlLEVBQUUsQ0FBQTtvQkFDcEQsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsRUFBRTt3QkFDeEQsR0FBRyxFQUFFLElBQUEsbUJBQVcsRUFBQyxJQUFBLGlDQUFzQixHQUFFLENBQUM7cUJBQzNDLENBQUMsQ0FBQTtvQkFDRixPQUFPLG9CQUFvQixDQUFBO2dCQUM3QixDQUFDLENBQUMsRUFBRSxDQUFBO1NBQ1Q7SUFDSCxDQUFDO0lBRU0seUJBQXlCLENBQzlCLGdCQUFxQztRQUVyQyxPQUFPLElBQUksQ0FBQywyQkFBMkI7WUFDckMsQ0FBQyxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO1lBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFBO0lBQ2xDLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7U0FDL0I7UUFDRCxPQUFPLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFFRCx1QkFBdUI7SUFDaEIsdUJBQXVCLEdBQzVCLEtBQUssSUFBSSxFQUFFO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ3RDLENBQUMsQ0FBQTtJQUVILHVCQUF1QjtJQUNoQixXQUFXLEdBQXdCLEdBQUcsRUFBRTtRQUM3QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDNUIsQ0FBQyxDQUFBO0NBQ0Y7QUFuSEQsMkJBbUhDIn0=
@@ -1,12 +1,11 @@
1
1
  import { ShadowsocksJsonSubscribeProviderConfig, ShadowsocksNodeConfig } from '../types';
2
2
  import Provider from './Provider';
3
+ import { GetNodeListFunction } from './types';
3
4
  export default class ShadowsocksJsonSubscribeProvider extends Provider {
5
+ #private;
4
6
  readonly udpRelay?: boolean;
5
- private readonly _url;
6
7
  constructor(name: string, config: ShadowsocksJsonSubscribeProviderConfig);
7
8
  get url(): string;
8
- getNodeList({ requestUserAgent, }?: {
9
- requestUserAgent?: string;
10
- }): ReturnType<typeof getShadowsocksJSONConfig>;
9
+ getNodeList: GetNodeListFunction;
11
10
  }
12
- export declare const getShadowsocksJSONConfig: (url: string, udpRelay?: boolean, requestUserAgent?: string) => Promise<ReadonlyArray<ShadowsocksNodeConfig>>;
11
+ export declare const getShadowsocksJSONConfig: (url: string, udpRelay?: boolean, requestUserAgent?: string) => Promise<Array<ShadowsocksNodeConfig>>;
@@ -5,36 +5,42 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getShadowsocksJSONConfig = void 0;
7
7
  const assert_1 = __importDefault(require("assert"));
8
- const joi_1 = __importDefault(require("joi"));
8
+ const zod_1 = require("zod");
9
9
  const types_1 = require("../types");
10
10
  const relayable_url_1 = __importDefault(require("../utils/relayable-url"));
11
11
  const Provider_1 = __importDefault(require("./Provider"));
12
12
  class ShadowsocksJsonSubscribeProvider extends Provider_1.default {
13
+ #originalUrl;
14
+ udpRelay;
13
15
  constructor(name, config) {
14
16
  super(name, config);
15
- const schema = joi_1.default.object({
16
- url: joi_1.default.string()
17
- .uri({
18
- scheme: [/https?/],
19
- })
20
- .required(),
21
- udpRelay: joi_1.default.boolean().strict(),
22
- }).unknown();
23
- const { error } = schema.validate(config);
17
+ const schema = zod_1.z.object({
18
+ url: zod_1.z.string().url(),
19
+ udpRelay: zod_1.z.boolean().optional(),
20
+ });
21
+ const result = schema.safeParse(config);
24
22
  // istanbul ignore next
25
- if (error) {
26
- throw error;
23
+ if (!result.success) {
24
+ throw result.error;
27
25
  }
28
- this._url = config.url;
29
- this.udpRelay = config.udpRelay;
26
+ this.#originalUrl = result.data.url;
27
+ this.udpRelay = result.data.udpRelay;
30
28
  }
31
29
  // istanbul ignore next
32
30
  get url() {
33
- return (0, relayable_url_1.default)(this._url, this.relayUrl);
34
- }
35
- getNodeList({ requestUserAgent, } = {}) {
36
- return (0, exports.getShadowsocksJSONConfig)(this.url, this.udpRelay, requestUserAgent || this.requestUserAgent);
31
+ return (0, relayable_url_1.default)(this.#originalUrl, this.config.relayUrl);
37
32
  }
33
+ getNodeList = async (params = {}) => {
34
+ const requestUserAgent = this.determineRequestUserAgent(params.requestUserAgent);
35
+ const nodeList = await (0, exports.getShadowsocksJSONConfig)(this.url, this.udpRelay, requestUserAgent);
36
+ if (this.config.hooks?.afterFetchNodeList) {
37
+ const newList = await this.config.hooks.afterFetchNodeList(nodeList, params);
38
+ if (newList) {
39
+ return newList;
40
+ }
41
+ }
42
+ return nodeList;
43
+ };
38
44
  }
39
45
  exports.default = ShadowsocksJsonSubscribeProvider;
40
46
  const getShadowsocksJSONConfig = async (url, udpRelay, requestUserAgent) => {
@@ -57,14 +63,14 @@ const getShadowsocksJSONConfig = async (url, udpRelay, requestUserAgent) => {
57
63
  password: item.password,
58
64
  };
59
65
  if (typeof udpRelay === 'boolean') {
60
- nodeConfig['udp-relay'] = udpRelay;
66
+ nodeConfig.udpRelay = udpRelay;
61
67
  }
62
68
  if (item.plugin === 'obfs-local') {
63
69
  const obfs = item.plugin_opts.match(/obfs=(\w+)/);
64
70
  const obfsHost = item.plugin_opts.match(/obfs-host=(.+)$/);
65
71
  if (obfs) {
66
72
  nodeConfig.obfs = obfs[1];
67
- nodeConfig['obfs-host'] = obfsHost ? obfsHost[1] : 'www.bing.com';
73
+ nodeConfig.obfsHost = obfsHost ? obfsHost[1] : 'www.bing.com';
68
74
  }
69
75
  }
70
76
  return nodeConfig;
@@ -73,4 +79,4 @@ const getShadowsocksJSONConfig = async (url, udpRelay, requestUserAgent) => {
73
79
  return await requestConfigFromRemote();
74
80
  };
75
81
  exports.getShadowsocksJSONConfig = getShadowsocksJSONConfig;
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhZG93c29ja3NKc29uU3Vic2NyaWJlUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJvdmlkZXIvU2hhZG93c29ja3NKc29uU3Vic2NyaWJlUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDhDQUFzQjtBQUN0QixvQ0FJa0I7QUFDbEIsMkVBQWtEO0FBQ2xELDBEQUFrQztBQUVsQyxNQUFxQixnQ0FBaUMsU0FBUSxrQkFBUTtJQUlwRSxZQUFZLElBQVksRUFBRSxNQUE4QztRQUN0RSxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXBCLE1BQU0sTUFBTSxHQUFHLGFBQUcsQ0FBQyxNQUFNLENBQUM7WUFDeEIsR0FBRyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7aUJBQ2QsR0FBRyxDQUFDO2dCQUNILE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQzthQUNuQixDQUFDO2lCQUNELFFBQVEsRUFBRTtZQUNiLFFBQVEsRUFBRSxhQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFO1NBQ2pDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUViLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFDLHVCQUF1QjtRQUN2QixJQUFJLEtBQUssRUFBRTtZQUNULE1BQU0sS0FBSyxDQUFDO1NBQ2I7UUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFBLHVCQUFZLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxFQUNqQixnQkFBZ0IsTUFDaUIsRUFBRTtRQUduQyxPQUFPLElBQUEsZ0NBQXdCLEVBQzdCLElBQUksQ0FBQyxHQUFHLEVBQ1IsSUFBSSxDQUFDLFFBQVEsRUFDYixnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQzFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUEzQ0QsbURBMkNDO0FBRU0sTUFBTSx3QkFBd0IsR0FBRyxLQUFLLEVBQzNDLEdBQVcsRUFDWCxRQUFrQixFQUNsQixnQkFBeUIsRUFDc0IsRUFBRTtJQUNqRCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRTNCLEtBQUssVUFBVSx1QkFBdUI7UUFHcEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxrQkFBUSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRTtZQUM1RCxnQkFBZ0IsRUFBRSxnQkFBZ0IsSUFBSSxjQUFjO1NBQ3JELENBQUMsQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FFdEMsQ0FBQztRQUVGLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUNuQztRQUVELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQXlCLEVBQUU7WUFDeEQsTUFBTSxVQUFVLEdBQVE7Z0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBaUI7Z0JBQ2hDLElBQUksRUFBRSxvQkFBWSxDQUFDLFdBQVc7Z0JBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBZ0I7Z0JBQy9CLElBQUksRUFBRSxJQUFJLENBQUMsV0FBcUI7Z0JBQ2hDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBZ0I7Z0JBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBa0I7YUFDbEMsQ0FBQztZQUVGLElBQUksT0FBTyxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUNqQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQ3BDO1lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRTtnQkFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBRTNELElBQUksSUFBSSxFQUFFO29CQUNSLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztpQkFDbkU7YUFDRjtZQUVELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sTUFBTSx1QkFBdUIsRUFBRSxDQUFDO0FBQ3pDLENBQUMsQ0FBQztBQWpEVyxRQUFBLHdCQUF3Qiw0QkFpRG5DIn0=
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhZG93c29ja3NKc29uU3Vic2NyaWJlUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmlkZXIvU2hhZG93c29ja3NKc29uU3Vic2NyaWJlUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQTJCO0FBQzNCLDZCQUF1QjtBQUV2QixvQ0FJaUI7QUFDakIsMkVBQWlEO0FBQ2pELDBEQUFpQztBQUdqQyxNQUFxQixnQ0FBaUMsU0FBUSxrQkFBUTtJQUMzRCxZQUFZLENBQVE7SUFDYixRQUFRLENBQVU7SUFFbEMsWUFBWSxJQUFZLEVBQUUsTUFBOEM7UUFDdEUsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUVuQixNQUFNLE1BQU0sR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3RCLEdBQUcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFFBQVEsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO1NBQ2pDLENBQUMsQ0FBQTtRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFdkMsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ25CLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQTtTQUNuQjtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUE7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLElBQVcsR0FBRztRQUNaLE9BQU8sSUFBQSx1QkFBWSxFQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM5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
@@ -1,21 +1,18 @@
1
1
  import { ShadowsocksNodeConfig, ShadowsocksSubscribeProviderConfig, SubscriptionUserinfo } from '../types';
2
2
  import Provider from './Provider';
3
+ import { GetNodeListFunction, GetSubscriptionUserInfoFunction } from './types';
3
4
  export default class ShadowsocksSubscribeProvider extends Provider {
5
+ #private;
4
6
  readonly udpRelay?: boolean;
5
- private readonly _url;
6
7
  constructor(name: string, config: ShadowsocksSubscribeProviderConfig);
7
8
  get url(): string;
8
- getSubscriptionUserInfo({ requestUserAgent, }?: {
9
- requestUserAgent?: string;
10
- }): Promise<SubscriptionUserinfo | undefined>;
11
- getNodeList({ requestUserAgent, }?: {
12
- requestUserAgent?: string;
13
- }): Promise<ReadonlyArray<ShadowsocksNodeConfig>>;
9
+ getSubscriptionUserInfo: GetSubscriptionUserInfoFunction;
10
+ getNodeList: GetNodeListFunction;
14
11
  }
15
12
  /**
16
13
  * @see https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html
17
14
  */
18
15
  export declare const getShadowsocksSubscription: (url: string, udpRelay?: boolean, requestUserAgent?: string) => Promise<{
19
- readonly nodeList: ReadonlyArray<ShadowsocksNodeConfig>;
16
+ readonly nodeList: Array<ShadowsocksNodeConfig>;
20
17
  readonly subscriptionUserinfo?: SubscriptionUserinfo | undefined;
21
18
  }>;
@@ -4,51 +4,53 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getShadowsocksSubscription = void 0;
7
- const joi_1 = __importDefault(require("joi"));
8
7
  const assert_1 = __importDefault(require("assert"));
9
- const logger_1 = require("@surgio/logger");
8
+ const zod_1 = require("zod");
10
9
  const utils_1 = require("../utils");
11
10
  const relayable_url_1 = __importDefault(require("../utils/relayable-url"));
12
11
  const ss_1 = require("../utils/ss");
13
12
  const Provider_1 = __importDefault(require("./Provider"));
14
- const logger = (0, logger_1.createLogger)({
15
- service: 'surgio:ShadowsocksSubscribeProvider',
16
- });
17
13
  class ShadowsocksSubscribeProvider extends Provider_1.default {
14
+ udpRelay;
15
+ #originalUrl;
18
16
  constructor(name, config) {
19
17
  super(name, config);
20
- const schema = joi_1.default.object({
21
- url: joi_1.default.string()
22
- .uri({
23
- scheme: [/https?/],
24
- })
25
- .required(),
26
- udpRelay: joi_1.default.boolean().strict(),
27
- }).unknown();
28
- const { error } = schema.validate(config);
18
+ const schema = zod_1.z.object({
19
+ url: zod_1.z.string().url(),
20
+ udpRelay: zod_1.z.boolean().optional(),
21
+ });
22
+ const result = schema.safeParse(config);
29
23
  // istanbul ignore next
30
- if (error) {
31
- throw error;
24
+ if (!result.success) {
25
+ throw result.error;
32
26
  }
33
- this._url = config.url;
34
- this.udpRelay = config.udpRelay;
27
+ this.#originalUrl = result.data.url;
28
+ this.udpRelay = result.data.udpRelay;
35
29
  this.supportGetSubscriptionUserInfo = true;
36
30
  }
37
31
  // istanbul ignore next
38
32
  get url() {
39
- return (0, relayable_url_1.default)(this._url, this.relayUrl);
33
+ return (0, relayable_url_1.default)(this.#originalUrl, this.config.relayUrl);
40
34
  }
41
- async getSubscriptionUserInfo({ requestUserAgent, } = {}) {
42
- const { subscriptionUserinfo } = await (0, exports.getShadowsocksSubscription)(this.url, this.udpRelay, requestUserAgent || this.requestUserAgent);
35
+ getSubscriptionUserInfo = async (params = {}) => {
36
+ const requestUserAgent = this.determineRequestUserAgent(params.requestUserAgent);
37
+ const { subscriptionUserinfo } = await (0, exports.getShadowsocksSubscription)(this.url, this.udpRelay, requestUserAgent);
43
38
  if (subscriptionUserinfo) {
44
39
  return subscriptionUserinfo;
45
40
  }
46
41
  return undefined;
47
- }
48
- async getNodeList({ requestUserAgent, } = {}) {
49
- const { nodeList } = await (0, exports.getShadowsocksSubscription)(this.url, this.udpRelay, requestUserAgent || this.requestUserAgent);
42
+ };
43
+ getNodeList = async (params = {}) => {
44
+ const requestUserAgent = this.determineRequestUserAgent(params.requestUserAgent);
45
+ const { nodeList } = await (0, exports.getShadowsocksSubscription)(this.url, this.udpRelay, requestUserAgent);
46
+ if (this.config.hooks?.afterFetchNodeList) {
47
+ const newList = await this.config.hooks.afterFetchNodeList(nodeList, params);
48
+ if (newList) {
49
+ return newList;
50
+ }
51
+ }
50
52
  return nodeList;
51
- }
53
+ };
52
54
  }
53
55
  exports.default = ShadowsocksSubscribeProvider;
54
56
  /**
@@ -65,7 +67,8 @@ const getShadowsocksSubscription = async (url, udpRelay, requestUserAgent) => {
65
67
  .map((item) => {
66
68
  const nodeConfig = (0, ss_1.parseSSUri)(item);
67
69
  if (udpRelay !== void 0) {
68
- nodeConfig['udp-relay'] = udpRelay;
70
+ ;
71
+ nodeConfig.udpRelay = udpRelay;
69
72
  }
70
73
  return nodeConfig;
71
74
  });
@@ -75,4 +78,4 @@ const getShadowsocksSubscription = async (url, udpRelay, requestUserAgent) => {
75
78
  };
76
79
  };
77
80
  exports.getShadowsocksSubscription = getShadowsocksSubscription;
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhZG93c29ja3NTdWJzY3JpYmVQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9wcm92aWRlci9TaGFkb3dzb2Nrc1N1YnNjcmliZVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhDQUFzQjtBQUN0QixvREFBNEI7QUFDNUIsMkNBQThDO0FBTzlDLG9DQUFzQztBQUN0QywyRUFBa0Q7QUFDbEQsb0NBQXlDO0FBQ3pDLDBEQUFrQztBQUVsQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEVBQUM7SUFDMUIsT0FBTyxFQUFFLHFDQUFxQztDQUMvQyxDQUFDLENBQUM7QUFFSCxNQUFxQiw0QkFBNkIsU0FBUSxrQkFBUTtJQUloRSxZQUFZLElBQVksRUFBRSxNQUEwQztRQUNsRSxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXBCLE1BQU0sTUFBTSxHQUFHLGFBQUcsQ0FBQyxNQUFNLENBQUM7WUFDeEIsR0FBRyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7aUJBQ2QsR0FBRyxDQUFDO2dCQUNILE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQzthQUNuQixDQUFDO2lCQUNELFFBQVEsRUFBRTtZQUNiLFFBQVEsRUFBRSxhQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFO1NBQ2pDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUViLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFDLHVCQUF1QjtRQUN2QixJQUFJLEtBQUssRUFBRTtZQUNULE1BQU0sS0FBSyxDQUFDO1NBQ2I7UUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixJQUFXLEdBQUc7UUFDWixPQUFPLElBQUEsdUJBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU0sS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQ25DLGdCQUFnQixNQUNpQixFQUFFO1FBR25DLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLE1BQU0sSUFBQSxrQ0FBMEIsRUFDL0QsSUFBSSxDQUFDLEdBQUcsRUFDUixJQUFJLENBQUMsUUFBUSxFQUNiLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FDMUMsQ0FBQztRQUVGLElBQUksb0JBQW9CLEVBQUU7WUFDeEIsT0FBTyxvQkFBb0IsQ0FBQztTQUM3QjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQ3ZCLGdCQUFnQixNQUNpQixFQUFFO1FBR25DLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLElBQUEsa0NBQTBCLEVBQ25ELElBQUksQ0FBQyxHQUFHLEVBQ1IsSUFBSSxDQUFDLFFBQVEsRUFDYixnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQzFDLENBQUM7UUFFRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUEvREQsK0NBK0RDO0FBRUQ7O0dBRUc7QUFDSSxNQUFNLDBCQUEwQixHQUFHLEtBQUssRUFDN0MsR0FBVyxFQUNYLFFBQWtCLEVBQ2xCLGdCQUF5QixFQUl4QixFQUFFO0lBQ0gsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUUzQixNQUFNLFFBQVEsR0FBRyxNQUFNLGtCQUFRLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFO1FBQzVELGdCQUFnQjtLQUNqQixDQUFDLENBQUM7SUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFBLGtCQUFVLEVBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztTQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDO1NBQ1gsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEQsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUF5QixFQUFFO1FBQ25DLE1BQU0sVUFBVSxHQUFHLElBQUEsZUFBVSxFQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBDLElBQUksUUFBUSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLFVBQVUsQ0FBQyxXQUFXLENBQWEsR0FBRyxRQUFRLENBQUM7U0FDakQ7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87UUFDTCxRQUFRO1FBQ1Isb0JBQW9CLEVBQUUsUUFBUSxDQUFDLG9CQUFvQjtLQUNwRCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBOUJXLFFBQUEsMEJBQTBCLDhCQThCckMifQ==
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhZG93c29ja3NTdWJzY3JpYmVQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92aWRlci9TaGFkb3dzb2Nrc1N1YnNjcmliZVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUEyQjtBQUMzQiw2QkFBdUI7QUFPdkIsb0NBQXFDO0FBQ3JDLDJFQUFpRDtBQUNqRCxvQ0FBd0M7QUFDeEMsMERBQWlDO0FBR2pDLE1BQXFCLDRCQUE2QixTQUFRLGtCQUFRO0lBQ2hELFFBQVEsQ0FBVTtJQUN6QixZQUFZLENBQVE7SUFFN0IsWUFBWSxJQUFZLEVBQUUsTUFBMEM7UUFDbEUsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUVuQixNQUFNLE1BQU0sR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3RCLEdBQUcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFFBQVEsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO1NBQ2pDLENBQUMsQ0FBQTtRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFdkMsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ25CLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQTtTQUNuQjtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUE7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUNwQyxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFBO0lBQzVDLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFBLHVCQUFZLEVBQUMsSUFBSSxDQUFDLFlBQVks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
@@ -1,18 +1,15 @@
1
1
  import { ShadowsocksrNodeConfig, ShadowsocksrSubscribeProviderConfig, SubscriptionUserinfo } from '../types';
2
2
  import Provider from './Provider';
3
+ import { GetNodeListFunction, GetSubscriptionUserInfoFunction } from './types';
3
4
  export default class ShadowsocksrSubscribeProvider extends Provider {
5
+ #private;
4
6
  readonly udpRelay?: boolean;
5
- private readonly _url;
6
7
  constructor(name: string, config: ShadowsocksrSubscribeProviderConfig);
7
8
  get url(): string;
8
- getSubscriptionUserInfo({ requestUserAgent, }?: {
9
- requestUserAgent?: string;
10
- }): Promise<SubscriptionUserinfo | undefined>;
11
- getNodeList({ requestUserAgent, }?: {
12
- requestUserAgent?: string;
13
- }): Promise<ReadonlyArray<ShadowsocksrNodeConfig>>;
9
+ getSubscriptionUserInfo: GetSubscriptionUserInfoFunction;
10
+ getNodeList: GetNodeListFunction;
14
11
  }
15
12
  export declare const getShadowsocksrSubscription: (url: string, udpRelay?: boolean, requestUserAgent?: string) => Promise<{
16
- readonly nodeList: ReadonlyArray<ShadowsocksrNodeConfig>;
13
+ readonly nodeList: Array<ShadowsocksrNodeConfig>;
17
14
  readonly subscriptionUserinfo?: SubscriptionUserinfo | undefined;
18
15
  }>;
@@ -4,9 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getShadowsocksrSubscription = void 0;
7
- const joi_1 = __importDefault(require("joi"));
8
7
  const logger_1 = require("@surgio/logger");
9
8
  const assert_1 = __importDefault(require("assert"));
9
+ const zod_1 = require("zod");
10
10
  const utils_1 = require("../utils");
11
11
  const relayable_url_1 = __importDefault(require("../utils/relayable-url"));
12
12
  const subscription_1 = require("../utils/subscription");
@@ -16,40 +16,46 @@ const logger = (0, logger_1.createLogger)({
16
16
  service: 'surgio:ShadowsocksrSubscribeProvider',
17
17
  });
18
18
  class ShadowsocksrSubscribeProvider extends Provider_1.default {
19
+ udpRelay;
20
+ #originalUrl;
19
21
  constructor(name, config) {
20
22
  super(name, config);
21
- const schema = joi_1.default.object({
22
- url: joi_1.default.string()
23
- .uri({
24
- scheme: [/https?/],
25
- })
26
- .required(),
27
- udpRelay: joi_1.default.boolean().strict(),
28
- }).unknown();
29
- const { error } = schema.validate(config);
23
+ const schema = zod_1.z.object({
24
+ url: zod_1.z.string().url(),
25
+ udpRelay: zod_1.z.boolean().optional(),
26
+ });
27
+ const result = schema.safeParse(config);
30
28
  // istanbul ignore next
31
- if (error) {
32
- throw error;
29
+ if (!result.success) {
30
+ throw result.error;
33
31
  }
34
- this._url = config.url;
35
- this.udpRelay = config.udpRelay;
32
+ this.#originalUrl = result.data.url;
33
+ this.udpRelay = result.data.udpRelay;
36
34
  this.supportGetSubscriptionUserInfo = true;
37
35
  }
38
36
  // istanbul ignore next
39
37
  get url() {
40
- return (0, relayable_url_1.default)(this._url, this.relayUrl);
38
+ return (0, relayable_url_1.default)(this.#originalUrl, this.config.relayUrl);
41
39
  }
42
- async getSubscriptionUserInfo({ requestUserAgent, } = {}) {
43
- const { subscriptionUserinfo } = await (0, exports.getShadowsocksrSubscription)(this.url, this.udpRelay, requestUserAgent || this.requestUserAgent);
40
+ getSubscriptionUserInfo = async (params = {}) => {
41
+ const requestUserAgent = this.determineRequestUserAgent(params.requestUserAgent);
42
+ const { subscriptionUserinfo } = await (0, exports.getShadowsocksrSubscription)(this.url, this.udpRelay, requestUserAgent);
44
43
  if (subscriptionUserinfo) {
45
44
  return subscriptionUserinfo;
46
45
  }
47
46
  return undefined;
48
- }
49
- async getNodeList({ requestUserAgent, } = {}) {
50
- const { nodeList } = await (0, exports.getShadowsocksrSubscription)(this.url, this.udpRelay, requestUserAgent || this.requestUserAgent);
47
+ };
48
+ getNodeList = async (params = {}) => {
49
+ const requestUserAgent = this.determineRequestUserAgent(params.requestUserAgent);
50
+ const { nodeList } = await (0, exports.getShadowsocksrSubscription)(this.url, this.udpRelay, requestUserAgent);
51
+ if (this.config.hooks?.afterFetchNodeList) {
52
+ const newList = await this.config.hooks.afterFetchNodeList(nodeList, params);
53
+ if (newList) {
54
+ return newList;
55
+ }
56
+ }
51
57
  return nodeList;
52
- }
58
+ };
53
59
  }
54
60
  exports.default = ShadowsocksrSubscribeProvider;
55
61
  const getShadowsocksrSubscription = async (url, udpRelay, requestUserAgent) => {
@@ -63,7 +69,8 @@ const getShadowsocksrSubscription = async (url, udpRelay, requestUserAgent) => {
63
69
  .map((str) => {
64
70
  const nodeConfig = (0, ssr_1.parseSSRUri)(str);
65
71
  if (udpRelay !== void 0) {
66
- nodeConfig['udp-relay'] = udpRelay;
72
+ ;
73
+ nodeConfig.udpRelay = udpRelay;
67
74
  }
68
75
  return nodeConfig;
69
76
  });
@@ -80,4 +87,4 @@ const getShadowsocksrSubscription = async (url, udpRelay, requestUserAgent) => {
80
87
  };
81
88
  };
82
89
  exports.getShadowsocksrSubscription = getShadowsocksrSubscription;
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhZG93c29ja3NyU3Vic2NyaWJlUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJvdmlkZXIvU2hhZG93c29ja3NyU3Vic2NyaWJlUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOENBQXNCO0FBQ3RCLDJDQUE4QztBQUM5QyxvREFBNEI7QUFPNUIsb0NBQXNDO0FBQ3RDLDJFQUFrRDtBQUNsRCx3REFBOEQ7QUFDOUQsc0NBQTJDO0FBQzNDLDBEQUFrQztBQUVsQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEVBQUM7SUFDMUIsT0FBTyxFQUFFLHNDQUFzQztDQUNoRCxDQUFDLENBQUM7QUFFSCxNQUFxQiw2QkFBOEIsU0FBUSxrQkFBUTtJQUlqRSxZQUFZLElBQVksRUFBRSxNQUEyQztRQUNuRSxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXBCLE1BQU0sTUFBTSxHQUFHLGFBQUcsQ0FBQyxNQUFNLENBQUM7WUFDeEIsR0FBRyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7aUJBQ2QsR0FBRyxDQUFDO2dCQUNILE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQzthQUNuQixDQUFDO2lCQUNELFFBQVEsRUFBRTtZQUNiLFFBQVEsRUFBRSxhQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFO1NBQ2pDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUViLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFDLHVCQUF1QjtRQUN2QixJQUFJLEtBQUssRUFBRTtZQUNULE1BQU0sS0FBSyxDQUFDO1NBQ2I7UUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUks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
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhZG93c29ja3NyU3Vic2NyaWJlUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmlkZXIvU2hhZG93c29ja3NyU3Vic2NyaWJlUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkNBQTZDO0FBQzdDLG9EQUEyQjtBQUMzQiw2QkFBdUI7QUFPdkIsb0NBQXFDO0FBQ3JDLDJFQUFpRDtBQUNqRCx3REFBNkQ7QUFDN0Qsc0NBQTBDO0FBQzFDLDBEQUFpQztBQUdqQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEVBQUM7SUFDMUIsT0FBTyxFQUFFLHNDQUFzQztDQUNoRCxDQUFDLENBQUE7QUFFRixNQUFxQiw2QkFBOEIsU0FBUSxrQkFBUTtJQUNqRCxRQUFRLENBQVU7SUFDekIsWUFBWSxDQUFRO0lBRTdCLFlBQVksSUFBWSxFQUFFLE1BQTJDO1FBQ25FLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFFbkIsTUFBTSxNQUFNLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN0QixHQUFHLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUNyQixRQUFRLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtTQUNqQyxDQUFDLENBQUE7UUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRXZDLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNuQixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUE7U0FDbkI7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFBO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUE7UUFDcEMsSUFBSSxDQUFD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
@@ -1,19 +1,16 @@
1
1
  import { ShadowsocksNodeConfig, SsdProviderConfig, SubscriptionUserinfo } from '../types';
2
2
  import Provider from './Provider';
3
+ import { GetNodeListFunction, GetSubscriptionUserInfoFunction } from './types';
3
4
  export default class SsdProvider extends Provider {
4
- readonly _url: string;
5
+ #private;
5
6
  readonly udpRelay?: boolean;
6
7
  constructor(name: string, config: SsdProviderConfig);
7
8
  get url(): string;
8
- getSubscriptionUserInfo({ requestUserAgent, }?: {
9
- requestUserAgent?: string;
10
- }): Promise<SubscriptionUserinfo | undefined>;
11
- getNodeList({ requestUserAgent, }?: {
12
- requestUserAgent?: string;
13
- }): Promise<ReadonlyArray<ShadowsocksNodeConfig>>;
9
+ getSubscriptionUserInfo: GetSubscriptionUserInfoFunction;
10
+ getNodeList: GetNodeListFunction;
14
11
  }
15
12
  export declare const getSsdSubscription: (url: string, udpRelay?: boolean, requestUserAgent?: string) => Promise<{
16
- readonly nodeList: ReadonlyArray<ShadowsocksNodeConfig>;
13
+ readonly nodeList: Array<ShadowsocksNodeConfig>;
17
14
  readonly subscriptionUserinfo?: SubscriptionUserinfo | undefined;
18
15
  }>;
19
16
  export declare const parseSsdConfig: (globalConfig: SsdSubscription, server: SsdServer, udpRelay?: boolean) => ShadowsocksNodeConfig | undefined;