@nocobase/plugin-idp-oauth 2.1.0-alpha.17 → 2.1.0-alpha.19

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 (221) hide show
  1. package/build.config.ts +1 -1
  2. package/dist/externalVersion.js +6 -4
  3. package/dist/node_modules/light-my-request/package.json +1 -1
  4. package/dist/node_modules/undici/LICENSE +21 -0
  5. package/dist/node_modules/undici/README.md +741 -0
  6. package/dist/node_modules/undici/docs/docs/api/Agent.md +84 -0
  7. package/dist/node_modules/undici/docs/docs/api/BalancedPool.md +99 -0
  8. package/dist/node_modules/undici/docs/docs/api/CacheStorage.md +30 -0
  9. package/dist/node_modules/undici/docs/docs/api/CacheStore.md +164 -0
  10. package/dist/node_modules/undici/docs/docs/api/Client.md +285 -0
  11. package/dist/node_modules/undici/docs/docs/api/ClientStats.md +27 -0
  12. package/dist/node_modules/undici/docs/docs/api/Connector.md +115 -0
  13. package/dist/node_modules/undici/docs/docs/api/ContentType.md +57 -0
  14. package/dist/node_modules/undici/docs/docs/api/Cookies.md +101 -0
  15. package/dist/node_modules/undici/docs/docs/api/Debug.md +62 -0
  16. package/dist/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +315 -0
  17. package/dist/node_modules/undici/docs/docs/api/Dispatcher.md +1392 -0
  18. package/dist/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +159 -0
  19. package/dist/node_modules/undici/docs/docs/api/Errors.md +49 -0
  20. package/dist/node_modules/undici/docs/docs/api/EventSource.md +45 -0
  21. package/dist/node_modules/undici/docs/docs/api/Fetch.md +60 -0
  22. package/dist/node_modules/undici/docs/docs/api/GlobalInstallation.md +139 -0
  23. package/dist/node_modules/undici/docs/docs/api/H2CClient.md +263 -0
  24. package/dist/node_modules/undici/docs/docs/api/MockAgent.md +603 -0
  25. package/dist/node_modules/undici/docs/docs/api/MockCallHistory.md +197 -0
  26. package/dist/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +43 -0
  27. package/dist/node_modules/undici/docs/docs/api/MockClient.md +81 -0
  28. package/dist/node_modules/undici/docs/docs/api/MockErrors.md +12 -0
  29. package/dist/node_modules/undici/docs/docs/api/MockPool.md +555 -0
  30. package/dist/node_modules/undici/docs/docs/api/Pool.md +84 -0
  31. package/dist/node_modules/undici/docs/docs/api/PoolStats.md +35 -0
  32. package/dist/node_modules/undici/docs/docs/api/ProxyAgent.md +229 -0
  33. package/dist/node_modules/undici/docs/docs/api/RedirectHandler.md +93 -0
  34. package/dist/node_modules/undici/docs/docs/api/RetryAgent.md +50 -0
  35. package/dist/node_modules/undici/docs/docs/api/RetryHandler.md +118 -0
  36. package/dist/node_modules/undici/docs/docs/api/RoundRobinPool.md +145 -0
  37. package/dist/node_modules/undici/docs/docs/api/SnapshotAgent.md +616 -0
  38. package/dist/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +274 -0
  39. package/dist/node_modules/undici/docs/docs/api/Util.md +25 -0
  40. package/dist/node_modules/undici/docs/docs/api/WebSocket.md +141 -0
  41. package/dist/node_modules/undici/docs/docs/api/api-lifecycle.md +91 -0
  42. package/dist/node_modules/undici/docs/docs/best-practices/client-certificate.md +64 -0
  43. package/dist/node_modules/undici/docs/docs/best-practices/crawling.md +58 -0
  44. package/dist/node_modules/undici/docs/docs/best-practices/mocking-request.md +190 -0
  45. package/dist/node_modules/undici/docs/docs/best-practices/proxy.md +127 -0
  46. package/dist/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +224 -0
  47. package/dist/node_modules/undici/docs/docs/best-practices/writing-tests.md +63 -0
  48. package/dist/node_modules/undici/index-fetch.js +65 -0
  49. package/dist/node_modules/undici/index.d.ts +3 -0
  50. package/dist/node_modules/undici/index.js +234 -0
  51. package/dist/node_modules/undici/lib/api/abort-signal.js +59 -0
  52. package/dist/node_modules/undici/lib/api/api-connect.js +110 -0
  53. package/dist/node_modules/undici/lib/api/api-pipeline.js +252 -0
  54. package/dist/node_modules/undici/lib/api/api-request.js +214 -0
  55. package/dist/node_modules/undici/lib/api/api-stream.js +209 -0
  56. package/dist/node_modules/undici/lib/api/api-upgrade.js +111 -0
  57. package/dist/node_modules/undici/lib/api/index.js +7 -0
  58. package/dist/node_modules/undici/lib/api/readable.js +580 -0
  59. package/dist/node_modules/undici/lib/cache/memory-cache-store.js +234 -0
  60. package/dist/node_modules/undici/lib/cache/sqlite-cache-store.js +461 -0
  61. package/dist/node_modules/undici/lib/core/connect.js +137 -0
  62. package/dist/node_modules/undici/lib/core/constants.js +143 -0
  63. package/dist/node_modules/undici/lib/core/diagnostics.js +227 -0
  64. package/dist/node_modules/undici/lib/core/errors.js +477 -0
  65. package/dist/node_modules/undici/lib/core/request.js +438 -0
  66. package/dist/node_modules/undici/lib/core/socks5-client.js +407 -0
  67. package/dist/node_modules/undici/lib/core/socks5-utils.js +203 -0
  68. package/dist/node_modules/undici/lib/core/symbols.js +75 -0
  69. package/dist/node_modules/undici/lib/core/tree.js +160 -0
  70. package/dist/node_modules/undici/lib/core/util.js +992 -0
  71. package/dist/node_modules/undici/lib/dispatcher/agent.js +158 -0
  72. package/dist/node_modules/undici/lib/dispatcher/balanced-pool.js +219 -0
  73. package/dist/node_modules/undici/lib/dispatcher/client-h1.js +1610 -0
  74. package/dist/node_modules/undici/lib/dispatcher/client-h2.js +995 -0
  75. package/dist/node_modules/undici/lib/dispatcher/client.js +659 -0
  76. package/dist/node_modules/undici/lib/dispatcher/dispatcher-base.js +165 -0
  77. package/dist/node_modules/undici/lib/dispatcher/dispatcher.js +48 -0
  78. package/dist/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +146 -0
  79. package/dist/node_modules/undici/lib/dispatcher/fixed-queue.js +135 -0
  80. package/dist/node_modules/undici/lib/dispatcher/h2c-client.js +51 -0
  81. package/dist/node_modules/undici/lib/dispatcher/pool-base.js +214 -0
  82. package/dist/node_modules/undici/lib/dispatcher/pool.js +118 -0
  83. package/dist/node_modules/undici/lib/dispatcher/proxy-agent.js +318 -0
  84. package/dist/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
  85. package/dist/node_modules/undici/lib/dispatcher/round-robin-pool.js +137 -0
  86. package/dist/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +249 -0
  87. package/dist/node_modules/undici/lib/encoding/index.js +33 -0
  88. package/dist/node_modules/undici/lib/global.js +50 -0
  89. package/dist/node_modules/undici/lib/handler/cache-handler.js +578 -0
  90. package/dist/node_modules/undici/lib/handler/cache-revalidation-handler.js +124 -0
  91. package/dist/node_modules/undici/lib/handler/decorator-handler.js +67 -0
  92. package/dist/node_modules/undici/lib/handler/deduplication-handler.js +460 -0
  93. package/dist/node_modules/undici/lib/handler/redirect-handler.js +238 -0
  94. package/dist/node_modules/undici/lib/handler/retry-handler.js +394 -0
  95. package/dist/node_modules/undici/lib/handler/unwrap-handler.js +100 -0
  96. package/dist/node_modules/undici/lib/handler/wrap-handler.js +105 -0
  97. package/dist/node_modules/undici/lib/interceptor/cache.js +495 -0
  98. package/dist/node_modules/undici/lib/interceptor/decompress.js +259 -0
  99. package/dist/node_modules/undici/lib/interceptor/deduplicate.js +117 -0
  100. package/dist/node_modules/undici/lib/interceptor/dns.js +571 -0
  101. package/dist/node_modules/undici/lib/interceptor/dump.js +112 -0
  102. package/dist/node_modules/undici/lib/interceptor/redirect.js +21 -0
  103. package/dist/node_modules/undici/lib/interceptor/response-error.js +95 -0
  104. package/dist/node_modules/undici/lib/interceptor/retry.js +19 -0
  105. package/dist/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  106. package/dist/node_modules/undici/lib/llhttp/constants.d.ts +195 -0
  107. package/dist/node_modules/undici/lib/llhttp/constants.js +531 -0
  108. package/dist/node_modules/undici/lib/llhttp/llhttp-wasm.js +15 -0
  109. package/dist/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +15 -0
  110. package/dist/node_modules/undici/lib/llhttp/utils.d.ts +2 -0
  111. package/dist/node_modules/undici/lib/llhttp/utils.js +12 -0
  112. package/dist/node_modules/undici/lib/mock/mock-agent.js +232 -0
  113. package/dist/node_modules/undici/lib/mock/mock-call-history.js +248 -0
  114. package/dist/node_modules/undici/lib/mock/mock-client.js +68 -0
  115. package/dist/node_modules/undici/lib/mock/mock-errors.js +29 -0
  116. package/dist/node_modules/undici/lib/mock/mock-interceptor.js +209 -0
  117. package/dist/node_modules/undici/lib/mock/mock-pool.js +68 -0
  118. package/dist/node_modules/undici/lib/mock/mock-symbols.js +32 -0
  119. package/dist/node_modules/undici/lib/mock/mock-utils.js +486 -0
  120. package/dist/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
  121. package/dist/node_modules/undici/lib/mock/snapshot-agent.js +353 -0
  122. package/dist/node_modules/undici/lib/mock/snapshot-recorder.js +588 -0
  123. package/dist/node_modules/undici/lib/mock/snapshot-utils.js +158 -0
  124. package/dist/node_modules/undici/lib/util/cache.js +407 -0
  125. package/dist/node_modules/undici/lib/util/date.js +653 -0
  126. package/dist/node_modules/undici/lib/util/promise.js +28 -0
  127. package/dist/node_modules/undici/lib/util/runtime-features.js +124 -0
  128. package/dist/node_modules/undici/lib/util/stats.js +32 -0
  129. package/dist/node_modules/undici/lib/util/timers.js +425 -0
  130. package/dist/node_modules/undici/lib/web/cache/cache.js +864 -0
  131. package/dist/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
  132. package/dist/node_modules/undici/lib/web/cache/util.js +45 -0
  133. package/dist/node_modules/undici/lib/web/cookies/constants.js +12 -0
  134. package/dist/node_modules/undici/lib/web/cookies/index.js +199 -0
  135. package/dist/node_modules/undici/lib/web/cookies/parse.js +322 -0
  136. package/dist/node_modules/undici/lib/web/cookies/util.js +282 -0
  137. package/dist/node_modules/undici/lib/web/eventsource/eventsource-stream.js +399 -0
  138. package/dist/node_modules/undici/lib/web/eventsource/eventsource.js +501 -0
  139. package/dist/node_modules/undici/lib/web/eventsource/util.js +29 -0
  140. package/dist/node_modules/undici/lib/web/fetch/LICENSE +21 -0
  141. package/dist/node_modules/undici/lib/web/fetch/body.js +509 -0
  142. package/dist/node_modules/undici/lib/web/fetch/constants.js +131 -0
  143. package/dist/node_modules/undici/lib/web/fetch/data-url.js +596 -0
  144. package/dist/node_modules/undici/lib/web/fetch/formdata-parser.js +575 -0
  145. package/dist/node_modules/undici/lib/web/fetch/formdata.js +259 -0
  146. package/dist/node_modules/undici/lib/web/fetch/global.js +40 -0
  147. package/dist/node_modules/undici/lib/web/fetch/headers.js +719 -0
  148. package/dist/node_modules/undici/lib/web/fetch/index.js +2397 -0
  149. package/dist/node_modules/undici/lib/web/fetch/request.js +1115 -0
  150. package/dist/node_modules/undici/lib/web/fetch/response.js +641 -0
  151. package/dist/node_modules/undici/lib/web/fetch/util.js +1520 -0
  152. package/dist/node_modules/undici/lib/web/infra/index.js +229 -0
  153. package/dist/node_modules/undici/lib/web/subresource-integrity/Readme.md +9 -0
  154. package/dist/node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js +307 -0
  155. package/dist/node_modules/undici/lib/web/webidl/index.js +1006 -0
  156. package/dist/node_modules/undici/lib/web/websocket/connection.js +329 -0
  157. package/dist/node_modules/undici/lib/web/websocket/constants.js +126 -0
  158. package/dist/node_modules/undici/lib/web/websocket/events.js +331 -0
  159. package/dist/node_modules/undici/lib/web/websocket/frame.js +133 -0
  160. package/dist/node_modules/undici/lib/web/websocket/permessage-deflate.js +118 -0
  161. package/dist/node_modules/undici/lib/web/websocket/receiver.js +450 -0
  162. package/dist/node_modules/undici/lib/web/websocket/sender.js +109 -0
  163. package/dist/node_modules/undici/lib/web/websocket/stream/websocketerror.js +104 -0
  164. package/dist/node_modules/undici/lib/web/websocket/stream/websocketstream.js +497 -0
  165. package/dist/node_modules/undici/lib/web/websocket/util.js +347 -0
  166. package/dist/node_modules/undici/lib/web/websocket/websocket.js +751 -0
  167. package/dist/node_modules/undici/package.json +152 -0
  168. package/dist/node_modules/undici/scripts/strip-comments.js +10 -0
  169. package/dist/node_modules/undici/types/README.md +6 -0
  170. package/dist/node_modules/undici/types/agent.d.ts +32 -0
  171. package/dist/node_modules/undici/types/api.d.ts +43 -0
  172. package/dist/node_modules/undici/types/balanced-pool.d.ts +30 -0
  173. package/dist/node_modules/undici/types/cache-interceptor.d.ts +179 -0
  174. package/dist/node_modules/undici/types/cache.d.ts +36 -0
  175. package/dist/node_modules/undici/types/client-stats.d.ts +15 -0
  176. package/dist/node_modules/undici/types/client.d.ts +123 -0
  177. package/dist/node_modules/undici/types/connector.d.ts +36 -0
  178. package/dist/node_modules/undici/types/content-type.d.ts +21 -0
  179. package/dist/node_modules/undici/types/cookies.d.ts +30 -0
  180. package/dist/node_modules/undici/types/diagnostics-channel.d.ts +74 -0
  181. package/dist/node_modules/undici/types/dispatcher.d.ts +273 -0
  182. package/dist/node_modules/undici/types/env-http-proxy-agent.d.ts +22 -0
  183. package/dist/node_modules/undici/types/errors.d.ts +177 -0
  184. package/dist/node_modules/undici/types/eventsource.d.ts +66 -0
  185. package/dist/node_modules/undici/types/fetch.d.ts +231 -0
  186. package/dist/node_modules/undici/types/formdata.d.ts +114 -0
  187. package/dist/node_modules/undici/types/global-dispatcher.d.ts +9 -0
  188. package/dist/node_modules/undici/types/global-origin.d.ts +7 -0
  189. package/dist/node_modules/undici/types/h2c-client.d.ts +73 -0
  190. package/dist/node_modules/undici/types/handlers.d.ts +14 -0
  191. package/dist/node_modules/undici/types/header.d.ts +160 -0
  192. package/dist/node_modules/undici/types/index.d.ts +91 -0
  193. package/dist/node_modules/undici/types/interceptors.d.ts +80 -0
  194. package/dist/node_modules/undici/types/mock-agent.d.ts +68 -0
  195. package/dist/node_modules/undici/types/mock-call-history.d.ts +111 -0
  196. package/dist/node_modules/undici/types/mock-client.d.ts +27 -0
  197. package/dist/node_modules/undici/types/mock-errors.d.ts +12 -0
  198. package/dist/node_modules/undici/types/mock-interceptor.d.ts +94 -0
  199. package/dist/node_modules/undici/types/mock-pool.d.ts +27 -0
  200. package/dist/node_modules/undici/types/patch.d.ts +29 -0
  201. package/dist/node_modules/undici/types/pool-stats.d.ts +19 -0
  202. package/dist/node_modules/undici/types/pool.d.ts +41 -0
  203. package/dist/node_modules/undici/types/proxy-agent.d.ts +29 -0
  204. package/dist/node_modules/undici/types/readable.d.ts +68 -0
  205. package/dist/node_modules/undici/types/retry-agent.d.ts +8 -0
  206. package/dist/node_modules/undici/types/retry-handler.d.ts +125 -0
  207. package/dist/node_modules/undici/types/round-robin-pool.d.ts +41 -0
  208. package/dist/node_modules/undici/types/snapshot-agent.d.ts +109 -0
  209. package/dist/node_modules/undici/types/socks5-proxy-agent.d.ts +25 -0
  210. package/dist/node_modules/undici/types/util.d.ts +18 -0
  211. package/dist/node_modules/undici/types/utility.d.ts +7 -0
  212. package/dist/node_modules/undici/types/webidl.d.ts +347 -0
  213. package/dist/node_modules/undici/types/websocket.d.ts +188 -0
  214. package/dist/server/collections/oidcStates.d.ts +10 -0
  215. package/dist/server/collections/oidcStates.js +96 -0
  216. package/dist/server/db-adapter.d.ts +25 -0
  217. package/dist/server/db-adapter.js +156 -0
  218. package/dist/server/service.js +11 -10
  219. package/package.json +2 -2
  220. package/dist/server/cache-adapter.d.ts +0 -33
  221. package/dist/server/cache-adapter.js +0 -159
@@ -0,0 +1,214 @@
1
+ 'use strict'
2
+
3
+ const { PoolStats } = require('../util/stats.js')
4
+ const DispatcherBase = require('./dispatcher-base')
5
+ const FixedQueue = require('./fixed-queue')
6
+ const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require('../core/symbols')
7
+
8
+ const kClients = Symbol('clients')
9
+ const kNeedDrain = Symbol('needDrain')
10
+ const kQueue = Symbol('queue')
11
+ const kClosedResolve = Symbol('closed resolve')
12
+ const kOnDrain = Symbol('onDrain')
13
+ const kOnConnect = Symbol('onConnect')
14
+ const kOnDisconnect = Symbol('onDisconnect')
15
+ const kOnConnectionError = Symbol('onConnectionError')
16
+ const kGetDispatcher = Symbol('get dispatcher')
17
+ const kAddClient = Symbol('add client')
18
+ const kRemoveClient = Symbol('remove client')
19
+
20
+ class PoolBase extends DispatcherBase {
21
+ [kQueue] = new FixedQueue();
22
+
23
+ [kQueued] = 0;
24
+
25
+ [kClients] = [];
26
+
27
+ [kNeedDrain] = false;
28
+
29
+ [kOnDrain] (client, origin, targets) {
30
+ const queue = this[kQueue]
31
+
32
+ let needDrain = false
33
+
34
+ while (!needDrain) {
35
+ const item = queue.shift()
36
+ if (!item) {
37
+ break
38
+ }
39
+ this[kQueued]--
40
+ needDrain = !client.dispatch(item.opts, item.handler)
41
+ }
42
+
43
+ client[kNeedDrain] = needDrain
44
+
45
+ if (!needDrain && this[kNeedDrain]) {
46
+ this[kNeedDrain] = false
47
+ this.emit('drain', origin, [this, ...targets])
48
+ }
49
+
50
+ if (this[kClosedResolve] && queue.isEmpty()) {
51
+ const closeAll = []
52
+ for (let i = 0; i < this[kClients].length; i++) {
53
+ const client = this[kClients][i]
54
+ if (!client.destroyed) {
55
+ closeAll.push(client.close())
56
+ }
57
+ }
58
+ return Promise.all(closeAll)
59
+ .then(this[kClosedResolve])
60
+ }
61
+ }
62
+
63
+ [kOnConnect] = (origin, targets) => {
64
+ this.emit('connect', origin, [this, ...targets])
65
+ };
66
+
67
+ [kOnDisconnect] = (origin, targets, err) => {
68
+ this.emit('disconnect', origin, [this, ...targets], err)
69
+ };
70
+
71
+ [kOnConnectionError] = (origin, targets, err) => {
72
+ this.emit('connectionError', origin, [this, ...targets], err)
73
+ }
74
+
75
+ get [kBusy] () {
76
+ return this[kNeedDrain]
77
+ }
78
+
79
+ get [kConnected] () {
80
+ let ret = 0
81
+ for (const { [kConnected]: connected } of this[kClients]) {
82
+ ret += connected
83
+ }
84
+ return ret
85
+ }
86
+
87
+ get [kFree] () {
88
+ let ret = 0
89
+ for (const { [kConnected]: connected, [kNeedDrain]: needDrain } of this[kClients]) {
90
+ ret += connected && !needDrain
91
+ }
92
+ return ret
93
+ }
94
+
95
+ get [kPending] () {
96
+ let ret = this[kQueued]
97
+ for (const { [kPending]: pending } of this[kClients]) {
98
+ ret += pending
99
+ }
100
+ return ret
101
+ }
102
+
103
+ get [kRunning] () {
104
+ let ret = 0
105
+ for (const { [kRunning]: running } of this[kClients]) {
106
+ ret += running
107
+ }
108
+ return ret
109
+ }
110
+
111
+ get [kSize] () {
112
+ let ret = this[kQueued]
113
+ for (const { [kSize]: size } of this[kClients]) {
114
+ ret += size
115
+ }
116
+ return ret
117
+ }
118
+
119
+ get stats () {
120
+ return new PoolStats(this)
121
+ }
122
+
123
+ [kClose] () {
124
+ if (this[kQueue].isEmpty()) {
125
+ const closeAll = []
126
+ for (let i = 0; i < this[kClients].length; i++) {
127
+ const client = this[kClients][i]
128
+ if (!client.destroyed) {
129
+ closeAll.push(client.close())
130
+ }
131
+ }
132
+ return Promise.all(closeAll)
133
+ } else {
134
+ return new Promise((resolve) => {
135
+ this[kClosedResolve] = resolve
136
+ })
137
+ }
138
+ }
139
+
140
+ [kDestroy] (err) {
141
+ while (true) {
142
+ const item = this[kQueue].shift()
143
+ if (!item) {
144
+ break
145
+ }
146
+ item.handler.onError(err)
147
+ }
148
+
149
+ const destroyAll = new Array(this[kClients].length)
150
+ for (let i = 0; i < this[kClients].length; i++) {
151
+ destroyAll[i] = this[kClients][i].destroy(err)
152
+ }
153
+ return Promise.all(destroyAll)
154
+ }
155
+
156
+ [kDispatch] (opts, handler) {
157
+ const dispatcher = this[kGetDispatcher]()
158
+
159
+ if (!dispatcher) {
160
+ this[kNeedDrain] = true
161
+ this[kQueue].push({ opts, handler })
162
+ this[kQueued]++
163
+ } else if (!dispatcher.dispatch(opts, handler)) {
164
+ dispatcher[kNeedDrain] = true
165
+ this[kNeedDrain] = !this[kGetDispatcher]()
166
+ }
167
+
168
+ return !this[kNeedDrain]
169
+ }
170
+
171
+ [kAddClient] (client) {
172
+ client
173
+ .on('drain', this[kOnDrain].bind(this, client))
174
+ .on('connect', this[kOnConnect])
175
+ .on('disconnect', this[kOnDisconnect])
176
+ .on('connectionError', this[kOnConnectionError])
177
+
178
+ this[kClients].push(client)
179
+
180
+ if (this[kNeedDrain]) {
181
+ queueMicrotask(() => {
182
+ if (this[kNeedDrain]) {
183
+ this[kOnDrain](client, client[kUrl], [client, this])
184
+ }
185
+ })
186
+ }
187
+
188
+ return this
189
+ }
190
+
191
+ [kRemoveClient] (client) {
192
+ client.close(() => {
193
+ const idx = this[kClients].indexOf(client)
194
+ if (idx !== -1) {
195
+ this[kClients].splice(idx, 1)
196
+ }
197
+ })
198
+
199
+ this[kNeedDrain] = this[kClients].some(dispatcher => (
200
+ !dispatcher[kNeedDrain] &&
201
+ dispatcher.closed !== true &&
202
+ dispatcher.destroyed !== true
203
+ ))
204
+ }
205
+ }
206
+
207
+ module.exports = {
208
+ PoolBase,
209
+ kClients,
210
+ kNeedDrain,
211
+ kAddClient,
212
+ kRemoveClient,
213
+ kGetDispatcher
214
+ }
@@ -0,0 +1,118 @@
1
+ 'use strict'
2
+
3
+ const {
4
+ PoolBase,
5
+ kClients,
6
+ kNeedDrain,
7
+ kAddClient,
8
+ kGetDispatcher,
9
+ kRemoveClient
10
+ } = require('./pool-base')
11
+ const Client = require('./client')
12
+ const {
13
+ InvalidArgumentError
14
+ } = require('../core/errors')
15
+ const util = require('../core/util')
16
+ const { kUrl } = require('../core/symbols')
17
+ const buildConnector = require('../core/connect')
18
+
19
+ const kOptions = Symbol('options')
20
+ const kConnections = Symbol('connections')
21
+ const kFactory = Symbol('factory')
22
+
23
+ function defaultFactory (origin, opts) {
24
+ return new Client(origin, opts)
25
+ }
26
+
27
+ class Pool extends PoolBase {
28
+ constructor (origin, {
29
+ connections,
30
+ factory = defaultFactory,
31
+ connect,
32
+ connectTimeout,
33
+ tls,
34
+ maxCachedSessions,
35
+ socketPath,
36
+ autoSelectFamily,
37
+ autoSelectFamilyAttemptTimeout,
38
+ allowH2,
39
+ clientTtl,
40
+ ...options
41
+ } = {}) {
42
+ if (connections != null && (!Number.isFinite(connections) || connections < 0)) {
43
+ throw new InvalidArgumentError('invalid connections')
44
+ }
45
+
46
+ if (typeof factory !== 'function') {
47
+ throw new InvalidArgumentError('factory must be a function.')
48
+ }
49
+
50
+ if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {
51
+ throw new InvalidArgumentError('connect must be a function or an object')
52
+ }
53
+
54
+ if (typeof connect !== 'function') {
55
+ connect = buildConnector({
56
+ ...tls,
57
+ maxCachedSessions,
58
+ allowH2,
59
+ socketPath,
60
+ timeout: connectTimeout,
61
+ ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),
62
+ ...connect
63
+ })
64
+ }
65
+
66
+ super()
67
+
68
+ this[kConnections] = connections || null
69
+ this[kUrl] = util.parseOrigin(origin)
70
+ this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath }
71
+ this[kOptions].interceptors = options.interceptors
72
+ ? { ...options.interceptors }
73
+ : undefined
74
+ this[kFactory] = factory
75
+
76
+ this.on('connect', (origin, targets) => {
77
+ if (clientTtl != null && clientTtl > 0) {
78
+ for (const target of targets) {
79
+ Object.assign(target, { ttl: Date.now() })
80
+ }
81
+ }
82
+ })
83
+
84
+ this.on('connectionError', (origin, targets, error) => {
85
+ // If a connection error occurs, we remove the client from the pool,
86
+ // and emit a connectionError event. They will not be re-used.
87
+ // Fixes https://github.com/nodejs/undici/issues/3895
88
+ for (const target of targets) {
89
+ // Do not use kRemoveClient here, as it will close the client,
90
+ // but the client cannot be closed in this state.
91
+ const idx = this[kClients].indexOf(target)
92
+ if (idx !== -1) {
93
+ this[kClients].splice(idx, 1)
94
+ }
95
+ }
96
+ })
97
+ }
98
+
99
+ [kGetDispatcher] () {
100
+ const clientTtlOption = this[kOptions].clientTtl
101
+ for (const client of this[kClients]) {
102
+ // check ttl of client and if it's stale, remove it from the pool
103
+ if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {
104
+ this[kRemoveClient](client)
105
+ } else if (!client[kNeedDrain]) {
106
+ return client
107
+ }
108
+ }
109
+
110
+ if (!this[kConnections] || this[kClients].length < this[kConnections]) {
111
+ const dispatcher = this[kFactory](this[kUrl], this[kOptions])
112
+ this[kAddClient](dispatcher)
113
+ return dispatcher
114
+ }
115
+ }
116
+ }
117
+
118
+ module.exports = Pool
@@ -0,0 +1,318 @@
1
+ 'use strict'
2
+
3
+ const { kProxy, kClose, kDestroy, kDispatch } = require('../core/symbols')
4
+ const Agent = require('./agent')
5
+ const Pool = require('./pool')
6
+ const DispatcherBase = require('./dispatcher-base')
7
+ const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require('../core/errors')
8
+ const buildConnector = require('../core/connect')
9
+ const Client = require('./client')
10
+ const { channels } = require('../core/diagnostics')
11
+ const Socks5ProxyAgent = require('./socks5-proxy-agent')
12
+
13
+ const kAgent = Symbol('proxy agent')
14
+ const kClient = Symbol('proxy client')
15
+ const kProxyHeaders = Symbol('proxy headers')
16
+ const kRequestTls = Symbol('request tls settings')
17
+ const kProxyTls = Symbol('proxy tls settings')
18
+ const kConnectEndpoint = Symbol('connect endpoint function')
19
+ const kTunnelProxy = Symbol('tunnel proxy')
20
+
21
+ function defaultProtocolPort (protocol) {
22
+ return protocol === 'https:' ? 443 : 80
23
+ }
24
+
25
+ function defaultFactory (origin, opts) {
26
+ return new Pool(origin, opts)
27
+ }
28
+
29
+ const noop = () => {}
30
+
31
+ function defaultAgentFactory (origin, opts) {
32
+ if (opts.connections === 1) {
33
+ return new Client(origin, opts)
34
+ }
35
+ return new Pool(origin, opts)
36
+ }
37
+
38
+ class Http1ProxyWrapper extends DispatcherBase {
39
+ #client
40
+
41
+ constructor (proxyUrl, { headers = {}, connect, factory }) {
42
+ if (!proxyUrl) {
43
+ throw new InvalidArgumentError('Proxy URL is mandatory')
44
+ }
45
+
46
+ super()
47
+
48
+ this[kProxyHeaders] = headers
49
+ if (factory) {
50
+ this.#client = factory(proxyUrl, { connect })
51
+ } else {
52
+ this.#client = new Client(proxyUrl, { connect })
53
+ }
54
+ }
55
+
56
+ [kDispatch] (opts, handler) {
57
+ const onHeaders = handler.onHeaders
58
+ handler.onHeaders = function (statusCode, data, resume) {
59
+ if (statusCode === 407) {
60
+ if (typeof handler.onError === 'function') {
61
+ handler.onError(new InvalidArgumentError('Proxy Authentication Required (407)'))
62
+ }
63
+ return
64
+ }
65
+ if (onHeaders) onHeaders.call(this, statusCode, data, resume)
66
+ }
67
+
68
+ // Rewrite request as an HTTP1 Proxy request, without tunneling.
69
+ const {
70
+ origin,
71
+ path = '/',
72
+ headers = {}
73
+ } = opts
74
+
75
+ opts.path = origin + path
76
+
77
+ if (!('host' in headers) && !('Host' in headers)) {
78
+ const { host } = new URL(origin)
79
+ headers.host = host
80
+ }
81
+ opts.headers = { ...this[kProxyHeaders], ...headers }
82
+
83
+ return this.#client[kDispatch](opts, handler)
84
+ }
85
+
86
+ [kClose] () {
87
+ return this.#client.close()
88
+ }
89
+
90
+ [kDestroy] (err) {
91
+ return this.#client.destroy(err)
92
+ }
93
+ }
94
+
95
+ class ProxyAgent extends DispatcherBase {
96
+ constructor (opts) {
97
+ if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) {
98
+ throw new InvalidArgumentError('Proxy uri is mandatory')
99
+ }
100
+
101
+ const { clientFactory = defaultFactory } = opts
102
+ if (typeof clientFactory !== 'function') {
103
+ throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')
104
+ }
105
+
106
+ const { proxyTunnel = true } = opts
107
+
108
+ super()
109
+
110
+ const url = this.#getUrl(opts)
111
+ const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url
112
+
113
+ this[kProxy] = { uri: href, protocol }
114
+ this[kRequestTls] = opts.requestTls
115
+ this[kProxyTls] = opts.proxyTls
116
+ this[kProxyHeaders] = opts.headers || {}
117
+ this[kTunnelProxy] = proxyTunnel
118
+
119
+ if (opts.auth && opts.token) {
120
+ throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')
121
+ } else if (opts.auth) {
122
+ /* @deprecated in favour of opts.token */
123
+ this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`
124
+ } else if (opts.token) {
125
+ this[kProxyHeaders]['proxy-authorization'] = opts.token
126
+ } else if (username && password) {
127
+ this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`
128
+ }
129
+
130
+ const connect = buildConnector({ ...opts.proxyTls })
131
+ this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })
132
+
133
+ const agentFactory = opts.factory || defaultAgentFactory
134
+ const factory = (origin, options) => {
135
+ const { protocol } = new URL(origin)
136
+
137
+ // Handle SOCKS5 proxy
138
+ if (this[kProxy].protocol === 'socks5:' || this[kProxy].protocol === 'socks:') {
139
+ return new Socks5ProxyAgent(this[kProxy].uri, {
140
+ headers: this[kProxyHeaders],
141
+ connect,
142
+ factory: agentFactory,
143
+ username: opts.username || username,
144
+ password: opts.password || password,
145
+ proxyTls: opts.proxyTls
146
+ })
147
+ }
148
+
149
+ if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') {
150
+ return new Http1ProxyWrapper(this[kProxy].uri, {
151
+ headers: this[kProxyHeaders],
152
+ connect,
153
+ factory: agentFactory
154
+ })
155
+ }
156
+ return agentFactory(origin, options)
157
+ }
158
+
159
+ // For SOCKS5 proxies, we don't need a client to the proxy itself
160
+ // The SOCKS5 connection is handled within Socks5ProxyAgent
161
+ if (protocol === 'socks5:' || protocol === 'socks:') {
162
+ this[kClient] = null
163
+ } else {
164
+ this[kClient] = clientFactory(url, { connect })
165
+ }
166
+
167
+ this[kAgent] = new Agent({
168
+ ...opts,
169
+ factory,
170
+ connect: async (opts, callback) => {
171
+ // SOCKS5 proxies handle their own connections via Socks5ProxyAgent,
172
+ // so this connect function should never be called for them.
173
+ if (!this[kClient]) {
174
+ callback(new InvalidArgumentError('Cannot establish tunnel connection without a proxy client'))
175
+ return
176
+ }
177
+
178
+ let requestedPath = opts.host
179
+ if (!opts.port) {
180
+ requestedPath += `:${defaultProtocolPort(opts.protocol)}`
181
+ }
182
+ try {
183
+ const connectParams = {
184
+ origin,
185
+ port,
186
+ path: requestedPath,
187
+ signal: opts.signal,
188
+ headers: {
189
+ ...this[kProxyHeaders],
190
+ host: opts.host,
191
+ ...(opts.connections == null || opts.connections > 0 ? { 'proxy-connection': 'keep-alive' } : {})
192
+ },
193
+ servername: this[kProxyTls]?.servername || proxyHostname
194
+ }
195
+ const { socket, statusCode } = await this[kClient].connect(connectParams)
196
+ if (statusCode !== 200) {
197
+ socket.on('error', noop).destroy()
198
+ callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))
199
+ return
200
+ }
201
+
202
+ if (channels.proxyConnected.hasSubscribers) {
203
+ channels.proxyConnected.publish({
204
+ socket,
205
+ connectParams
206
+ })
207
+ }
208
+
209
+ if (opts.protocol !== 'https:') {
210
+ callback(null, socket)
211
+ return
212
+ }
213
+ let servername
214
+ if (this[kRequestTls]) {
215
+ servername = this[kRequestTls].servername
216
+ } else {
217
+ servername = opts.servername
218
+ }
219
+ this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback)
220
+ } catch (err) {
221
+ if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
222
+ // Throw a custom error to avoid loop in client.js#connect
223
+ callback(new SecureProxyConnectionError(err))
224
+ } else {
225
+ callback(err)
226
+ }
227
+ }
228
+ }
229
+ })
230
+ }
231
+
232
+ dispatch (opts, handler) {
233
+ const headers = buildHeaders(opts.headers)
234
+ throwIfProxyAuthIsSent(headers)
235
+
236
+ if (headers && !('host' in headers) && !('Host' in headers)) {
237
+ const { host } = new URL(opts.origin)
238
+ headers.host = host
239
+ }
240
+
241
+ return this[kAgent].dispatch(
242
+ {
243
+ ...opts,
244
+ headers
245
+ },
246
+ handler
247
+ )
248
+ }
249
+
250
+ /**
251
+ * @param {import('../../types/proxy-agent').ProxyAgent.Options | string | URL} opts
252
+ * @returns {URL}
253
+ */
254
+ #getUrl (opts) {
255
+ if (typeof opts === 'string') {
256
+ return new URL(opts)
257
+ } else if (opts instanceof URL) {
258
+ return opts
259
+ } else {
260
+ return new URL(opts.uri)
261
+ }
262
+ }
263
+
264
+ [kClose] () {
265
+ const promises = [this[kAgent].close()]
266
+ if (this[kClient]) {
267
+ promises.push(this[kClient].close())
268
+ }
269
+ return Promise.all(promises)
270
+ }
271
+
272
+ [kDestroy] () {
273
+ const promises = [this[kAgent].destroy()]
274
+ if (this[kClient]) {
275
+ promises.push(this[kClient].destroy())
276
+ }
277
+ return Promise.all(promises)
278
+ }
279
+ }
280
+
281
+ /**
282
+ * @param {string[] | Record<string, string>} headers
283
+ * @returns {Record<string, string>}
284
+ */
285
+ function buildHeaders (headers) {
286
+ // When using undici.fetch, the headers list is stored
287
+ // as an array.
288
+ if (Array.isArray(headers)) {
289
+ /** @type {Record<string, string>} */
290
+ const headersPair = {}
291
+
292
+ for (let i = 0; i < headers.length; i += 2) {
293
+ headersPair[headers[i]] = headers[i + 1]
294
+ }
295
+
296
+ return headersPair
297
+ }
298
+
299
+ return headers
300
+ }
301
+
302
+ /**
303
+ * @param {Record<string, string>} headers
304
+ *
305
+ * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers
306
+ * Nevertheless, it was changed and to avoid a security vulnerability by end users
307
+ * this check was created.
308
+ * It should be removed in the next major version for performance reasons
309
+ */
310
+ function throwIfProxyAuthIsSent (headers) {
311
+ const existProxyAuth = headers && Object.keys(headers)
312
+ .find((key) => key.toLowerCase() === 'proxy-authorization')
313
+ if (existProxyAuth) {
314
+ throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')
315
+ }
316
+ }
317
+
318
+ module.exports = ProxyAgent
@@ -0,0 +1,35 @@
1
+ 'use strict'
2
+
3
+ const Dispatcher = require('./dispatcher')
4
+ const RetryHandler = require('../handler/retry-handler')
5
+
6
+ class RetryAgent extends Dispatcher {
7
+ #agent = null
8
+ #options = null
9
+ constructor (agent, options = {}) {
10
+ super(options)
11
+ this.#agent = agent
12
+ this.#options = options
13
+ }
14
+
15
+ dispatch (opts, handler) {
16
+ const retry = new RetryHandler({
17
+ ...opts,
18
+ retryOptions: this.#options
19
+ }, {
20
+ dispatch: this.#agent.dispatch.bind(this.#agent),
21
+ handler
22
+ })
23
+ return this.#agent.dispatch(opts, retry)
24
+ }
25
+
26
+ close () {
27
+ return this.#agent.close()
28
+ }
29
+
30
+ destroy () {
31
+ return this.#agent.destroy()
32
+ }
33
+ }
34
+
35
+ module.exports = RetryAgent