@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,501 @@
1
+ 'use strict'
2
+
3
+ const { pipeline } = require('node:stream')
4
+ const { fetching } = require('../fetch')
5
+ const { makeRequest } = require('../fetch/request')
6
+ const { webidl } = require('../webidl')
7
+ const { EventSourceStream } = require('./eventsource-stream')
8
+ const { parseMIMEType } = require('../fetch/data-url')
9
+ const { createFastMessageEvent } = require('../websocket/events')
10
+ const { isNetworkError } = require('../fetch/response')
11
+ const { kEnumerableProperty } = require('../../core/util')
12
+ const { environmentSettingsObject } = require('../fetch/util')
13
+
14
+ let experimentalWarned = false
15
+
16
+ /**
17
+ * A reconnection time, in milliseconds. This must initially be an implementation-defined value,
18
+ * probably in the region of a few seconds.
19
+ *
20
+ * In Comparison:
21
+ * - Chrome uses 3000ms.
22
+ * - Deno uses 5000ms.
23
+ *
24
+ * @type {3000}
25
+ */
26
+ const defaultReconnectionTime = 3000
27
+
28
+ /**
29
+ * The readyState attribute represents the state of the connection.
30
+ * @typedef ReadyState
31
+ * @type {0|1|2}
32
+ * @readonly
33
+ * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate-dev
34
+ */
35
+
36
+ /**
37
+ * The connection has not yet been established, or it was closed and the user
38
+ * agent is reconnecting.
39
+ * @type {0}
40
+ */
41
+ const CONNECTING = 0
42
+
43
+ /**
44
+ * The user agent has an open connection and is dispatching events as it
45
+ * receives them.
46
+ * @type {1}
47
+ */
48
+ const OPEN = 1
49
+
50
+ /**
51
+ * The connection is not open, and the user agent is not trying to reconnect.
52
+ * @type {2}
53
+ */
54
+ const CLOSED = 2
55
+
56
+ /**
57
+ * Requests for the element will have their mode set to "cors" and their credentials mode set to "same-origin".
58
+ * @type {'anonymous'}
59
+ */
60
+ const ANONYMOUS = 'anonymous'
61
+
62
+ /**
63
+ * Requests for the element will have their mode set to "cors" and their credentials mode set to "include".
64
+ * @type {'use-credentials'}
65
+ */
66
+ const USE_CREDENTIALS = 'use-credentials'
67
+
68
+ /**
69
+ * The EventSource interface is used to receive server-sent events. It
70
+ * connects to a server over HTTP and receives events in text/event-stream
71
+ * format without closing the connection.
72
+ * @extends {EventTarget}
73
+ * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events
74
+ * @api public
75
+ */
76
+ class EventSource extends EventTarget {
77
+ #events = {
78
+ open: null,
79
+ error: null,
80
+ message: null
81
+ }
82
+
83
+ #url
84
+ #withCredentials = false
85
+
86
+ /**
87
+ * @type {ReadyState}
88
+ */
89
+ #readyState = CONNECTING
90
+
91
+ #request = null
92
+ #controller = null
93
+
94
+ #dispatcher
95
+
96
+ /**
97
+ * @type {import('./eventsource-stream').eventSourceSettings}
98
+ */
99
+ #state
100
+
101
+ /**
102
+ * Creates a new EventSource object.
103
+ * @param {string} url
104
+ * @param {EventSourceInit} [eventSourceInitDict={}]
105
+ * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface
106
+ */
107
+ constructor (url, eventSourceInitDict = {}) {
108
+ // 1. Let ev be a new EventSource object.
109
+ super()
110
+
111
+ webidl.util.markAsUncloneable(this)
112
+
113
+ const prefix = 'EventSource constructor'
114
+ webidl.argumentLengthCheck(arguments, 1, prefix)
115
+
116
+ if (!experimentalWarned) {
117
+ experimentalWarned = true
118
+ process.emitWarning('EventSource is experimental, expect them to change at any time.', {
119
+ code: 'UNDICI-ES'
120
+ })
121
+ }
122
+
123
+ url = webidl.converters.USVString(url)
124
+ eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict')
125
+
126
+ this.#dispatcher = eventSourceInitDict.node.dispatcher || eventSourceInitDict.dispatcher
127
+ this.#state = {
128
+ lastEventId: '',
129
+ reconnectionTime: eventSourceInitDict.node.reconnectionTime
130
+ }
131
+
132
+ // 2. Let settings be ev's relevant settings object.
133
+ // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object
134
+ const settings = environmentSettingsObject
135
+
136
+ let urlRecord
137
+
138
+ try {
139
+ // 3. Let urlRecord be the result of encoding-parsing a URL given url, relative to settings.
140
+ urlRecord = new URL(url, settings.settingsObject.baseUrl)
141
+ this.#state.origin = urlRecord.origin
142
+ } catch (e) {
143
+ // 4. If urlRecord is failure, then throw a "SyntaxError" DOMException.
144
+ throw new DOMException(e, 'SyntaxError')
145
+ }
146
+
147
+ // 5. Set ev's url to urlRecord.
148
+ this.#url = urlRecord.href
149
+
150
+ // 6. Let corsAttributeState be Anonymous.
151
+ let corsAttributeState = ANONYMOUS
152
+
153
+ // 7. If the value of eventSourceInitDict's withCredentials member is true,
154
+ // then set corsAttributeState to Use Credentials and set ev's
155
+ // withCredentials attribute to true.
156
+ if (eventSourceInitDict.withCredentials === true) {
157
+ corsAttributeState = USE_CREDENTIALS
158
+ this.#withCredentials = true
159
+ }
160
+
161
+ // 8. Let request be the result of creating a potential-CORS request given
162
+ // urlRecord, the empty string, and corsAttributeState.
163
+ const initRequest = {
164
+ redirect: 'follow',
165
+ keepalive: true,
166
+ // @see https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes
167
+ mode: 'cors',
168
+ credentials: corsAttributeState === 'anonymous'
169
+ ? 'same-origin'
170
+ : 'omit',
171
+ referrer: 'no-referrer'
172
+ }
173
+
174
+ // 9. Set request's client to settings.
175
+ initRequest.client = environmentSettingsObject.settingsObject
176
+
177
+ // 10. User agents may set (`Accept`, `text/event-stream`) in request's header list.
178
+ initRequest.headersList = [['accept', { name: 'accept', value: 'text/event-stream' }]]
179
+
180
+ // 11. Set request's cache mode to "no-store".
181
+ initRequest.cache = 'no-store'
182
+
183
+ // 12. Set request's initiator type to "other".
184
+ initRequest.initiator = 'other'
185
+
186
+ initRequest.urlList = [new URL(this.#url)]
187
+
188
+ // 13. Set ev's request to request.
189
+ this.#request = makeRequest(initRequest)
190
+
191
+ this.#connect()
192
+ }
193
+
194
+ /**
195
+ * Returns the state of this EventSource object's connection. It can have the
196
+ * values described below.
197
+ * @returns {ReadyState}
198
+ * @readonly
199
+ */
200
+ get readyState () {
201
+ return this.#readyState
202
+ }
203
+
204
+ /**
205
+ * Returns the URL providing the event stream.
206
+ * @readonly
207
+ * @returns {string}
208
+ */
209
+ get url () {
210
+ return this.#url
211
+ }
212
+
213
+ /**
214
+ * Returns a boolean indicating whether the EventSource object was
215
+ * instantiated with CORS credentials set (true), or not (false, the default).
216
+ */
217
+ get withCredentials () {
218
+ return this.#withCredentials
219
+ }
220
+
221
+ #connect () {
222
+ if (this.#readyState === CLOSED) return
223
+
224
+ this.#readyState = CONNECTING
225
+
226
+ const fetchParams = {
227
+ request: this.#request,
228
+ dispatcher: this.#dispatcher
229
+ }
230
+
231
+ // 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection.
232
+ const processEventSourceEndOfBody = (response) => {
233
+ if (!isNetworkError(response)) {
234
+ return this.#reconnect()
235
+ }
236
+ }
237
+
238
+ // 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody...
239
+ fetchParams.processResponseEndOfBody = processEventSourceEndOfBody
240
+
241
+ // and processResponse set to the following steps given response res:
242
+ fetchParams.processResponse = (response) => {
243
+ // 1. If res is an aborted network error, then fail the connection.
244
+
245
+ if (isNetworkError(response)) {
246
+ // 1. When a user agent is to fail the connection, the user agent
247
+ // must queue a task which, if the readyState attribute is set to a
248
+ // value other than CLOSED, sets the readyState attribute to CLOSED
249
+ // and fires an event named error at the EventSource object. Once the
250
+ // user agent has failed the connection, it does not attempt to
251
+ // reconnect.
252
+ if (response.aborted) {
253
+ this.close()
254
+ this.dispatchEvent(new Event('error'))
255
+ return
256
+ // 2. Otherwise, if res is a network error, then reestablish the
257
+ // connection, unless the user agent knows that to be futile, in
258
+ // which case the user agent may fail the connection.
259
+ } else {
260
+ this.#reconnect()
261
+ return
262
+ }
263
+ }
264
+
265
+ // 3. Otherwise, if res's status is not 200, or if res's `Content-Type`
266
+ // is not `text/event-stream`, then fail the connection.
267
+ const contentType = response.headersList.get('content-type', true)
268
+ const mimeType = contentType !== null ? parseMIMEType(contentType) : 'failure'
269
+ const contentTypeValid = mimeType !== 'failure' && mimeType.essence === 'text/event-stream'
270
+ if (
271
+ response.status !== 200 ||
272
+ contentTypeValid === false
273
+ ) {
274
+ this.close()
275
+ this.dispatchEvent(new Event('error'))
276
+ return
277
+ }
278
+
279
+ // 4. Otherwise, announce the connection and interpret res's body
280
+ // line by line.
281
+
282
+ // When a user agent is to announce the connection, the user agent
283
+ // must queue a task which, if the readyState attribute is set to a
284
+ // value other than CLOSED, sets the readyState attribute to OPEN
285
+ // and fires an event named open at the EventSource object.
286
+ // @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model
287
+ this.#readyState = OPEN
288
+ this.dispatchEvent(new Event('open'))
289
+
290
+ // If redirected to a different origin, set the origin to the new origin.
291
+ this.#state.origin = response.urlList[response.urlList.length - 1].origin
292
+
293
+ const eventSourceStream = new EventSourceStream({
294
+ eventSourceSettings: this.#state,
295
+ push: (event) => {
296
+ this.dispatchEvent(createFastMessageEvent(
297
+ event.type,
298
+ event.options
299
+ ))
300
+ }
301
+ })
302
+
303
+ pipeline(response.body.stream,
304
+ eventSourceStream,
305
+ (error) => {
306
+ if (
307
+ error?.aborted === false
308
+ ) {
309
+ this.close()
310
+ this.dispatchEvent(new Event('error'))
311
+ }
312
+ })
313
+ }
314
+
315
+ this.#controller = fetching(fetchParams)
316
+ }
317
+
318
+ /**
319
+ * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model
320
+ * @returns {void}
321
+ */
322
+ #reconnect () {
323
+ // When a user agent is to reestablish the connection, the user agent must
324
+ // run the following steps. These steps are run in parallel, not as part of
325
+ // a task. (The tasks that it queues, of course, are run like normal tasks
326
+ // and not themselves in parallel.)
327
+
328
+ // 1. Queue a task to run the following steps:
329
+
330
+ // 1. If the readyState attribute is set to CLOSED, abort the task.
331
+ if (this.#readyState === CLOSED) return
332
+
333
+ // 2. Set the readyState attribute to CONNECTING.
334
+ this.#readyState = CONNECTING
335
+
336
+ // 3. Fire an event named error at the EventSource object.
337
+ this.dispatchEvent(new Event('error'))
338
+
339
+ // 2. Wait a delay equal to the reconnection time of the event source.
340
+ setTimeout(() => {
341
+ // 5. Queue a task to run the following steps:
342
+
343
+ // 1. If the EventSource object's readyState attribute is not set to
344
+ // CONNECTING, then return.
345
+ if (this.#readyState !== CONNECTING) return
346
+
347
+ // 2. Let request be the EventSource object's request.
348
+ // 3. If the EventSource object's last event ID string is not the empty
349
+ // string, then:
350
+ // 1. Let lastEventIDValue be the EventSource object's last event ID
351
+ // string, encoded as UTF-8.
352
+ // 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header
353
+ // list.
354
+ if (this.#state.lastEventId.length) {
355
+ this.#request.headersList.set('last-event-id', this.#state.lastEventId, true)
356
+ }
357
+
358
+ // 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.
359
+ this.#connect()
360
+ }, this.#state.reconnectionTime)?.unref()
361
+ }
362
+
363
+ /**
364
+ * Closes the connection, if any, and sets the readyState attribute to
365
+ * CLOSED.
366
+ */
367
+ close () {
368
+ webidl.brandCheck(this, EventSource)
369
+
370
+ if (this.#readyState === CLOSED) return
371
+ this.#readyState = CLOSED
372
+ this.#controller.abort()
373
+ this.#request = null
374
+ }
375
+
376
+ get onopen () {
377
+ return this.#events.open
378
+ }
379
+
380
+ set onopen (fn) {
381
+ if (this.#events.open) {
382
+ this.removeEventListener('open', this.#events.open)
383
+ }
384
+
385
+ const listener = webidl.converters.EventHandlerNonNull(fn)
386
+
387
+ if (listener !== null) {
388
+ this.addEventListener('open', listener)
389
+ this.#events.open = fn
390
+ } else {
391
+ this.#events.open = null
392
+ }
393
+ }
394
+
395
+ get onmessage () {
396
+ return this.#events.message
397
+ }
398
+
399
+ set onmessage (fn) {
400
+ if (this.#events.message) {
401
+ this.removeEventListener('message', this.#events.message)
402
+ }
403
+
404
+ const listener = webidl.converters.EventHandlerNonNull(fn)
405
+
406
+ if (listener !== null) {
407
+ this.addEventListener('message', listener)
408
+ this.#events.message = fn
409
+ } else {
410
+ this.#events.message = null
411
+ }
412
+ }
413
+
414
+ get onerror () {
415
+ return this.#events.error
416
+ }
417
+
418
+ set onerror (fn) {
419
+ if (this.#events.error) {
420
+ this.removeEventListener('error', this.#events.error)
421
+ }
422
+
423
+ const listener = webidl.converters.EventHandlerNonNull(fn)
424
+
425
+ if (listener !== null) {
426
+ this.addEventListener('error', listener)
427
+ this.#events.error = fn
428
+ } else {
429
+ this.#events.error = null
430
+ }
431
+ }
432
+ }
433
+
434
+ const constantsPropertyDescriptors = {
435
+ CONNECTING: {
436
+ __proto__: null,
437
+ configurable: false,
438
+ enumerable: true,
439
+ value: CONNECTING,
440
+ writable: false
441
+ },
442
+ OPEN: {
443
+ __proto__: null,
444
+ configurable: false,
445
+ enumerable: true,
446
+ value: OPEN,
447
+ writable: false
448
+ },
449
+ CLOSED: {
450
+ __proto__: null,
451
+ configurable: false,
452
+ enumerable: true,
453
+ value: CLOSED,
454
+ writable: false
455
+ }
456
+ }
457
+
458
+ Object.defineProperties(EventSource, constantsPropertyDescriptors)
459
+ Object.defineProperties(EventSource.prototype, constantsPropertyDescriptors)
460
+
461
+ Object.defineProperties(EventSource.prototype, {
462
+ close: kEnumerableProperty,
463
+ onerror: kEnumerableProperty,
464
+ onmessage: kEnumerableProperty,
465
+ onopen: kEnumerableProperty,
466
+ readyState: kEnumerableProperty,
467
+ url: kEnumerableProperty,
468
+ withCredentials: kEnumerableProperty
469
+ })
470
+
471
+ webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([
472
+ {
473
+ key: 'withCredentials',
474
+ converter: webidl.converters.boolean,
475
+ defaultValue: () => false
476
+ },
477
+ {
478
+ key: 'dispatcher', // undici only
479
+ converter: webidl.converters.any
480
+ },
481
+ {
482
+ key: 'node', // undici only
483
+ converter: webidl.dictionaryConverter([
484
+ {
485
+ key: 'reconnectionTime',
486
+ converter: webidl.converters['unsigned long'],
487
+ defaultValue: () => defaultReconnectionTime
488
+ },
489
+ {
490
+ key: 'dispatcher',
491
+ converter: webidl.converters.any
492
+ }
493
+ ]),
494
+ defaultValue: () => ({})
495
+ }
496
+ ])
497
+
498
+ module.exports = {
499
+ EventSource,
500
+ defaultReconnectionTime
501
+ }
@@ -0,0 +1,29 @@
1
+ 'use strict'
2
+
3
+ /**
4
+ * Checks if the given value is a valid LastEventId.
5
+ * @param {string} value
6
+ * @returns {boolean}
7
+ */
8
+ function isValidLastEventId (value) {
9
+ // LastEventId should not contain U+0000 NULL
10
+ return value.indexOf('\u0000') === -1
11
+ }
12
+
13
+ /**
14
+ * Checks if the given value is a base 10 digit.
15
+ * @param {string} value
16
+ * @returns {boolean}
17
+ */
18
+ function isASCIINumber (value) {
19
+ if (value.length === 0) return false
20
+ for (let i = 0; i < value.length; i++) {
21
+ if (value.charCodeAt(i) < 0x30 || value.charCodeAt(i) > 0x39) return false
22
+ }
23
+ return true
24
+ }
25
+
26
+ module.exports = {
27
+ isValidLastEventId,
28
+ isASCIINumber
29
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Ethan Arrowood
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.