deepv-code 1.0.182 → 1.0.185

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 (193) hide show
  1. package/bundle/dvcode.js +757 -753
  2. package/package.json +1 -1
  3. package/bundle/assets/help/README.md +0 -113
  4. package/bundle/assets/sounds/README.md +0 -74
  5. package/bundle/node_modules/undici/LICENSE +0 -21
  6. package/bundle/node_modules/undici/README.md +0 -472
  7. package/bundle/node_modules/undici/docs/docs/api/Agent.md +0 -83
  8. package/bundle/node_modules/undici/docs/docs/api/BalancedPool.md +0 -99
  9. package/bundle/node_modules/undici/docs/docs/api/CacheStorage.md +0 -30
  10. package/bundle/node_modules/undici/docs/docs/api/CacheStore.md +0 -151
  11. package/bundle/node_modules/undici/docs/docs/api/Client.md +0 -281
  12. package/bundle/node_modules/undici/docs/docs/api/ClientStats.md +0 -27
  13. package/bundle/node_modules/undici/docs/docs/api/Connector.md +0 -115
  14. package/bundle/node_modules/undici/docs/docs/api/ContentType.md +0 -57
  15. package/bundle/node_modules/undici/docs/docs/api/Cookies.md +0 -101
  16. package/bundle/node_modules/undici/docs/docs/api/Debug.md +0 -62
  17. package/bundle/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +0 -204
  18. package/bundle/node_modules/undici/docs/docs/api/Dispatcher.md +0 -1200
  19. package/bundle/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +0 -159
  20. package/bundle/node_modules/undici/docs/docs/api/Errors.md +0 -49
  21. package/bundle/node_modules/undici/docs/docs/api/EventSource.md +0 -45
  22. package/bundle/node_modules/undici/docs/docs/api/Fetch.md +0 -52
  23. package/bundle/node_modules/undici/docs/docs/api/H2CClient.md +0 -262
  24. package/bundle/node_modules/undici/docs/docs/api/MockAgent.md +0 -603
  25. package/bundle/node_modules/undici/docs/docs/api/MockCallHistory.md +0 -197
  26. package/bundle/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +0 -43
  27. package/bundle/node_modules/undici/docs/docs/api/MockClient.md +0 -77
  28. package/bundle/node_modules/undici/docs/docs/api/MockErrors.md +0 -12
  29. package/bundle/node_modules/undici/docs/docs/api/MockPool.md +0 -548
  30. package/bundle/node_modules/undici/docs/docs/api/Pool.md +0 -84
  31. package/bundle/node_modules/undici/docs/docs/api/PoolStats.md +0 -35
  32. package/bundle/node_modules/undici/docs/docs/api/ProxyAgent.md +0 -227
  33. package/bundle/node_modules/undici/docs/docs/api/RedirectHandler.md +0 -96
  34. package/bundle/node_modules/undici/docs/docs/api/RetryAgent.md +0 -45
  35. package/bundle/node_modules/undici/docs/docs/api/RetryHandler.md +0 -117
  36. package/bundle/node_modules/undici/docs/docs/api/Util.md +0 -25
  37. package/bundle/node_modules/undici/docs/docs/api/WebSocket.md +0 -85
  38. package/bundle/node_modules/undici/docs/docs/api/api-lifecycle.md +0 -91
  39. package/bundle/node_modules/undici/docs/docs/best-practices/client-certificate.md +0 -64
  40. package/bundle/node_modules/undici/docs/docs/best-practices/mocking-request.md +0 -190
  41. package/bundle/node_modules/undici/docs/docs/best-practices/proxy.md +0 -127
  42. package/bundle/node_modules/undici/docs/docs/best-practices/writing-tests.md +0 -20
  43. package/bundle/node_modules/undici/index-fetch.js +0 -35
  44. package/bundle/node_modules/undici/index.d.ts +0 -3
  45. package/bundle/node_modules/undici/index.js +0 -183
  46. package/bundle/node_modules/undici/lib/api/abort-signal.js +0 -59
  47. package/bundle/node_modules/undici/lib/api/api-connect.js +0 -110
  48. package/bundle/node_modules/undici/lib/api/api-pipeline.js +0 -252
  49. package/bundle/node_modules/undici/lib/api/api-request.js +0 -199
  50. package/bundle/node_modules/undici/lib/api/api-stream.js +0 -209
  51. package/bundle/node_modules/undici/lib/api/api-upgrade.js +0 -110
  52. package/bundle/node_modules/undici/lib/api/index.js +0 -7
  53. package/bundle/node_modules/undici/lib/api/readable.js +0 -558
  54. package/bundle/node_modules/undici/lib/api/util.js +0 -95
  55. package/bundle/node_modules/undici/lib/cache/memory-cache-store.js +0 -234
  56. package/bundle/node_modules/undici/lib/cache/sqlite-cache-store.js +0 -461
  57. package/bundle/node_modules/undici/lib/core/connect.js +0 -164
  58. package/bundle/node_modules/undici/lib/core/constants.js +0 -143
  59. package/bundle/node_modules/undici/lib/core/diagnostics.js +0 -196
  60. package/bundle/node_modules/undici/lib/core/errors.js +0 -244
  61. package/bundle/node_modules/undici/lib/core/request.js +0 -397
  62. package/bundle/node_modules/undici/lib/core/symbols.js +0 -68
  63. package/bundle/node_modules/undici/lib/core/tree.js +0 -160
  64. package/bundle/node_modules/undici/lib/core/util.js +0 -988
  65. package/bundle/node_modules/undici/lib/dispatcher/agent.js +0 -135
  66. package/bundle/node_modules/undici/lib/dispatcher/balanced-pool.js +0 -206
  67. package/bundle/node_modules/undici/lib/dispatcher/client-h1.js +0 -1615
  68. package/bundle/node_modules/undici/lib/dispatcher/client-h2.js +0 -798
  69. package/bundle/node_modules/undici/lib/dispatcher/client.js +0 -614
  70. package/bundle/node_modules/undici/lib/dispatcher/dispatcher-base.js +0 -161
  71. package/bundle/node_modules/undici/lib/dispatcher/dispatcher.js +0 -48
  72. package/bundle/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +0 -151
  73. package/bundle/node_modules/undici/lib/dispatcher/fixed-queue.js +0 -159
  74. package/bundle/node_modules/undici/lib/dispatcher/h2c-client.js +0 -122
  75. package/bundle/node_modules/undici/lib/dispatcher/pool-base.js +0 -191
  76. package/bundle/node_modules/undici/lib/dispatcher/pool.js +0 -118
  77. package/bundle/node_modules/undici/lib/dispatcher/proxy-agent.js +0 -275
  78. package/bundle/node_modules/undici/lib/dispatcher/retry-agent.js +0 -35
  79. package/bundle/node_modules/undici/lib/global.js +0 -32
  80. package/bundle/node_modules/undici/lib/handler/cache-handler.js +0 -448
  81. package/bundle/node_modules/undici/lib/handler/cache-revalidation-handler.js +0 -124
  82. package/bundle/node_modules/undici/lib/handler/decorator-handler.js +0 -67
  83. package/bundle/node_modules/undici/lib/handler/redirect-handler.js +0 -227
  84. package/bundle/node_modules/undici/lib/handler/retry-handler.js +0 -342
  85. package/bundle/node_modules/undici/lib/handler/unwrap-handler.js +0 -96
  86. package/bundle/node_modules/undici/lib/handler/wrap-handler.js +0 -95
  87. package/bundle/node_modules/undici/lib/interceptor/cache.js +0 -372
  88. package/bundle/node_modules/undici/lib/interceptor/dns.js +0 -432
  89. package/bundle/node_modules/undici/lib/interceptor/dump.js +0 -111
  90. package/bundle/node_modules/undici/lib/interceptor/redirect.js +0 -21
  91. package/bundle/node_modules/undici/lib/interceptor/response-error.js +0 -95
  92. package/bundle/node_modules/undici/lib/interceptor/retry.js +0 -19
  93. package/bundle/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  94. package/bundle/node_modules/undici/lib/llhttp/constants.d.ts +0 -97
  95. package/bundle/node_modules/undici/lib/llhttp/constants.js +0 -498
  96. package/bundle/node_modules/undici/lib/llhttp/constants.js.map +0 -1
  97. package/bundle/node_modules/undici/lib/llhttp/llhttp-wasm.js +0 -15
  98. package/bundle/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +0 -15
  99. package/bundle/node_modules/undici/lib/llhttp/utils.d.ts +0 -2
  100. package/bundle/node_modules/undici/lib/llhttp/utils.js +0 -15
  101. package/bundle/node_modules/undici/lib/llhttp/utils.js.map +0 -1
  102. package/bundle/node_modules/undici/lib/mock/mock-agent.js +0 -224
  103. package/bundle/node_modules/undici/lib/mock/mock-call-history.js +0 -248
  104. package/bundle/node_modules/undici/lib/mock/mock-client.js +0 -64
  105. package/bundle/node_modules/undici/lib/mock/mock-errors.js +0 -19
  106. package/bundle/node_modules/undici/lib/mock/mock-interceptor.js +0 -209
  107. package/bundle/node_modules/undici/lib/mock/mock-pool.js +0 -64
  108. package/bundle/node_modules/undici/lib/mock/mock-symbols.js +0 -31
  109. package/bundle/node_modules/undici/lib/mock/mock-utils.js +0 -433
  110. package/bundle/node_modules/undici/lib/mock/pending-interceptors-formatter.js +0 -43
  111. package/bundle/node_modules/undici/lib/util/cache.js +0 -368
  112. package/bundle/node_modules/undici/lib/util/date.js +0 -259
  113. package/bundle/node_modules/undici/lib/util/stats.js +0 -32
  114. package/bundle/node_modules/undici/lib/util/timers.js +0 -423
  115. package/bundle/node_modules/undici/lib/web/cache/cache.js +0 -862
  116. package/bundle/node_modules/undici/lib/web/cache/cachestorage.js +0 -152
  117. package/bundle/node_modules/undici/lib/web/cache/util.js +0 -45
  118. package/bundle/node_modules/undici/lib/web/cookies/constants.js +0 -12
  119. package/bundle/node_modules/undici/lib/web/cookies/index.js +0 -199
  120. package/bundle/node_modules/undici/lib/web/cookies/parse.js +0 -322
  121. package/bundle/node_modules/undici/lib/web/cookies/util.js +0 -282
  122. package/bundle/node_modules/undici/lib/web/eventsource/eventsource-stream.js +0 -399
  123. package/bundle/node_modules/undici/lib/web/eventsource/eventsource.js +0 -484
  124. package/bundle/node_modules/undici/lib/web/eventsource/util.js +0 -37
  125. package/bundle/node_modules/undici/lib/web/fetch/LICENSE +0 -21
  126. package/bundle/node_modules/undici/lib/web/fetch/body.js +0 -532
  127. package/bundle/node_modules/undici/lib/web/fetch/constants.js +0 -131
  128. package/bundle/node_modules/undici/lib/web/fetch/data-url.js +0 -744
  129. package/bundle/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +0 -46
  130. package/bundle/node_modules/undici/lib/web/fetch/formdata-parser.js +0 -501
  131. package/bundle/node_modules/undici/lib/web/fetch/formdata.js +0 -263
  132. package/bundle/node_modules/undici/lib/web/fetch/global.js +0 -40
  133. package/bundle/node_modules/undici/lib/web/fetch/headers.js +0 -719
  134. package/bundle/node_modules/undici/lib/web/fetch/index.js +0 -2258
  135. package/bundle/node_modules/undici/lib/web/fetch/request.js +0 -1099
  136. package/bundle/node_modules/undici/lib/web/fetch/response.js +0 -636
  137. package/bundle/node_modules/undici/lib/web/fetch/util.js +0 -1782
  138. package/bundle/node_modules/undici/lib/web/fetch/webidl.js +0 -740
  139. package/bundle/node_modules/undici/lib/web/websocket/connection.js +0 -325
  140. package/bundle/node_modules/undici/lib/web/websocket/constants.js +0 -126
  141. package/bundle/node_modules/undici/lib/web/websocket/events.js +0 -331
  142. package/bundle/node_modules/undici/lib/web/websocket/frame.js +0 -138
  143. package/bundle/node_modules/undici/lib/web/websocket/permessage-deflate.js +0 -70
  144. package/bundle/node_modules/undici/lib/web/websocket/receiver.js +0 -454
  145. package/bundle/node_modules/undici/lib/web/websocket/sender.js +0 -109
  146. package/bundle/node_modules/undici/lib/web/websocket/stream/websocketerror.js +0 -83
  147. package/bundle/node_modules/undici/lib/web/websocket/stream/websocketstream.js +0 -485
  148. package/bundle/node_modules/undici/lib/web/websocket/util.js +0 -338
  149. package/bundle/node_modules/undici/lib/web/websocket/websocket.js +0 -686
  150. package/bundle/node_modules/undici/package.json +0 -149
  151. package/bundle/node_modules/undici/scripts/strip-comments.js +0 -10
  152. package/bundle/node_modules/undici/types/README.md +0 -6
  153. package/bundle/node_modules/undici/types/agent.d.ts +0 -35
  154. package/bundle/node_modules/undici/types/api.d.ts +0 -43
  155. package/bundle/node_modules/undici/types/balanced-pool.d.ts +0 -29
  156. package/bundle/node_modules/undici/types/cache-interceptor.d.ts +0 -172
  157. package/bundle/node_modules/undici/types/cache.d.ts +0 -36
  158. package/bundle/node_modules/undici/types/client-stats.d.ts +0 -15
  159. package/bundle/node_modules/undici/types/client.d.ts +0 -110
  160. package/bundle/node_modules/undici/types/connector.d.ts +0 -34
  161. package/bundle/node_modules/undici/types/content-type.d.ts +0 -21
  162. package/bundle/node_modules/undici/types/cookies.d.ts +0 -30
  163. package/bundle/node_modules/undici/types/diagnostics-channel.d.ts +0 -66
  164. package/bundle/node_modules/undici/types/dispatcher.d.ts +0 -281
  165. package/bundle/node_modules/undici/types/env-http-proxy-agent.d.ts +0 -21
  166. package/bundle/node_modules/undici/types/errors.d.ts +0 -171
  167. package/bundle/node_modules/undici/types/eventsource.d.ts +0 -61
  168. package/bundle/node_modules/undici/types/fetch.d.ts +0 -210
  169. package/bundle/node_modules/undici/types/formdata.d.ts +0 -108
  170. package/bundle/node_modules/undici/types/global-dispatcher.d.ts +0 -9
  171. package/bundle/node_modules/undici/types/global-origin.d.ts +0 -7
  172. package/bundle/node_modules/undici/types/h2c-client.d.ts +0 -75
  173. package/bundle/node_modules/undici/types/handlers.d.ts +0 -15
  174. package/bundle/node_modules/undici/types/header.d.ts +0 -160
  175. package/bundle/node_modules/undici/types/index.d.ts +0 -75
  176. package/bundle/node_modules/undici/types/interceptors.d.ts +0 -34
  177. package/bundle/node_modules/undici/types/mock-agent.d.ts +0 -68
  178. package/bundle/node_modules/undici/types/mock-call-history.d.ts +0 -111
  179. package/bundle/node_modules/undici/types/mock-client.d.ts +0 -25
  180. package/bundle/node_modules/undici/types/mock-errors.d.ts +0 -12
  181. package/bundle/node_modules/undici/types/mock-interceptor.d.ts +0 -93
  182. package/bundle/node_modules/undici/types/mock-pool.d.ts +0 -25
  183. package/bundle/node_modules/undici/types/patch.d.ts +0 -29
  184. package/bundle/node_modules/undici/types/pool-stats.d.ts +0 -19
  185. package/bundle/node_modules/undici/types/pool.d.ts +0 -41
  186. package/bundle/node_modules/undici/types/proxy-agent.d.ts +0 -29
  187. package/bundle/node_modules/undici/types/readable.d.ts +0 -68
  188. package/bundle/node_modules/undici/types/retry-agent.d.ts +0 -8
  189. package/bundle/node_modules/undici/types/retry-handler.d.ts +0 -116
  190. package/bundle/node_modules/undici/types/util.d.ts +0 -18
  191. package/bundle/node_modules/undici/types/utility.d.ts +0 -7
  192. package/bundle/node_modules/undici/types/webidl.d.ts +0 -266
  193. package/bundle/node_modules/undici/types/websocket.d.ts +0 -184
@@ -1,485 +0,0 @@
1
- 'use strict'
2
-
3
- const { createDeferredPromise, environmentSettingsObject } = require('../../fetch/util')
4
- const { states, opcodes, sentCloseFrameState } = require('../constants')
5
- const { webidl } = require('../../fetch/webidl')
6
- const { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = require('../util')
7
- const { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = require('../connection')
8
- const { types } = require('node:util')
9
- const { channels } = require('../../../core/diagnostics')
10
- const { WebsocketFrameSend } = require('../frame')
11
- const { ByteParser } = require('../receiver')
12
- const { WebSocketError, createUnvalidatedWebSocketError } = require('./websocketerror')
13
- const { utf8DecodeBytes } = require('../../fetch/util')
14
- const { kEnumerableProperty } = require('../../../core/util')
15
-
16
- let emittedExperimentalWarning = false
17
-
18
- class WebSocketStream {
19
- // Each WebSocketStream object has an associated url , which is a URL record .
20
- /** @type {URL} */
21
- #url
22
-
23
- // Each WebSocketStream object has an associated opened promise , which is a promise.
24
- /** @type {ReturnType<typeof createDeferredPromise>} */
25
- #openedPromise
26
-
27
- // Each WebSocketStream object has an associated closed promise , which is a promise.
28
- /** @type {ReturnType<typeof createDeferredPromise>} */
29
- #closedPromise
30
-
31
- // Each WebSocketStream object has an associated readable stream , which is a ReadableStream .
32
- /** @type {ReadableStream} */
33
- #readableStream
34
- /** @type {ReadableStreamDefaultController} */
35
- #readableStreamController
36
-
37
- // Each WebSocketStream object has an associated writable stream , which is a WritableStream .
38
- /** @type {WritableStream} */
39
- #writableStream
40
-
41
- // Each WebSocketStream object has an associated boolean handshake aborted , which is initially false.
42
- #handshakeAborted = false
43
-
44
- /** @type {import('../websocket').Handler} */
45
- #handler = {
46
- // https://whatpr.org/websockets/48/7b748d3...d5570f3.html#feedback-to-websocket-stream-from-the-protocol
47
- onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),
48
- onFail: (_code, _reason) => {},
49
- onMessage: (opcode, data) => this.#onMessage(opcode, data),
50
- onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),
51
- onParserDrain: () => this.#handler.socket.resume(),
52
- onSocketData: (chunk) => {
53
- if (!this.#parser.write(chunk)) {
54
- this.#handler.socket.pause()
55
- }
56
- },
57
- onSocketError: (err) => {
58
- this.#handler.readyState = states.CLOSING
59
-
60
- if (channels.socketError.hasSubscribers) {
61
- channels.socketError.publish(err)
62
- }
63
-
64
- this.#handler.socket.destroy()
65
- },
66
- onSocketClose: () => this.#onSocketClose(),
67
-
68
- readyState: states.CONNECTING,
69
- socket: null,
70
- closeState: new Set(),
71
- controller: null,
72
- wasEverConnected: false
73
- }
74
-
75
- /** @type {import('../receiver').ByteParser} */
76
- #parser
77
-
78
- constructor (url, options = undefined) {
79
- if (!emittedExperimentalWarning) {
80
- process.emitWarning('WebSocketStream is experimental! Expect it to change at any time.', {
81
- code: 'UNDICI-WSS'
82
- })
83
- emittedExperimentalWarning = true
84
- }
85
-
86
- webidl.argumentLengthCheck(arguments, 1, 'WebSocket')
87
-
88
- url = webidl.converters.USVString(url)
89
- if (options !== null) {
90
- options = webidl.converters.WebSocketStreamOptions(options)
91
- }
92
-
93
- // 1. Let baseURL be this 's relevant settings object 's API base URL .
94
- const baseURL = environmentSettingsObject.settingsObject.baseUrl
95
-
96
- // 2. Let urlRecord be the result of getting a URL record given url and baseURL .
97
- const urlRecord = getURLRecord(url, baseURL)
98
-
99
- // 3. Let protocols be options [" protocols "] if it exists , otherwise an empty sequence.
100
- const protocols = options.protocols
101
-
102
- // 4. If any of the values in protocols occur more than once or otherwise fail to match the requirements for elements that comprise the value of ` Sec-WebSocket-Protocol ` fields as defined by The WebSocket Protocol , then throw a " SyntaxError " DOMException . [WSP]
103
- if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {
104
- throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')
105
- }
106
-
107
- if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {
108
- throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')
109
- }
110
-
111
- // 5. Set this 's url to urlRecord .
112
- this.#url = urlRecord.toString()
113
-
114
- // 6. Set this 's opened promise and closed promise to new promises.
115
- this.#openedPromise = createDeferredPromise()
116
- this.#closedPromise = createDeferredPromise()
117
-
118
- // 7. Apply backpressure to the WebSocket.
119
- // TODO
120
-
121
- // 8. If options [" signal "] exists ,
122
- if (options.signal != null) {
123
- // 8.1. Let signal be options [" signal "].
124
- const signal = options.signal
125
-
126
- // 8.2. If signal is aborted , then reject this 's opened promise and closed promise with signal ’s abort reason
127
- // and return.
128
- if (signal.aborted) {
129
- this.#openedPromise.reject(signal.reason)
130
- this.#closedPromise.reject(signal.reason)
131
- return
132
- }
133
-
134
- // 8.3. Add the following abort steps to signal :
135
- signal.addEventListener('abort', () => {
136
- // 8.3.1. If the WebSocket connection is not yet established : [WSP]
137
- if (!isEstablished(this.#handler.readyState)) {
138
- // 8.3.1.1. Fail the WebSocket connection .
139
- failWebsocketConnection(this.#handler)
140
-
141
- // Set this 's ready state to CLOSING .
142
- this.#handler.readyState = states.CLOSING
143
-
144
- // Reject this 's opened promise and closed promise with signal ’s abort reason .
145
- this.#openedPromise.reject(signal.reason)
146
- this.#closedPromise.reject(signal.reason)
147
-
148
- // Set this 's handshake aborted to true.
149
- this.#handshakeAborted = true
150
- }
151
- }, { once: true })
152
- }
153
-
154
- // 9. Let client be this 's relevant settings object .
155
- const client = environmentSettingsObject.settingsObject
156
-
157
- // 10. Run this step in parallel :
158
- // 10.1. Establish a WebSocket connection given urlRecord , protocols , and client . [FETCH]
159
- this.#handler.controller = establishWebSocketConnection(
160
- urlRecord,
161
- protocols,
162
- client,
163
- this.#handler,
164
- options
165
- )
166
- }
167
-
168
- // The url getter steps are to return this 's url , serialized .
169
- get url () {
170
- return this.#url.toString()
171
- }
172
-
173
- // The opened getter steps are to return this 's opened promise .
174
- get opened () {
175
- return this.#openedPromise.promise
176
- }
177
-
178
- // The closed getter steps are to return this 's closed promise .
179
- get closed () {
180
- return this.#closedPromise.promise
181
- }
182
-
183
- // The close( closeInfo ) method steps are:
184
- close (closeInfo = undefined) {
185
- if (closeInfo !== null) {
186
- closeInfo = webidl.converters.WebSocketCloseInfo(closeInfo)
187
- }
188
-
189
- // 1. Let code be closeInfo [" closeCode "] if present, or null otherwise.
190
- const code = closeInfo.closeCode ?? null
191
-
192
- // 2. Let reason be closeInfo [" reason "].
193
- const reason = closeInfo.reason
194
-
195
- // 3. Close the WebSocket with this , code , and reason .
196
- closeWebSocketConnection(this.#handler, code, reason, true)
197
- }
198
-
199
- #write (chunk) {
200
- // 1. Let promise be a new promise created in stream ’s relevant realm .
201
- const promise = createDeferredPromise()
202
-
203
- // 2. Let data be null.
204
- let data = null
205
-
206
- // 3. Let opcode be null.
207
- let opcode = null
208
-
209
- // 4. If chunk is a BufferSource ,
210
- if (ArrayBuffer.isView(chunk) || types.isArrayBuffer(chunk)) {
211
- // 4.1. Set data to a copy of the bytes given chunk .
212
- data = new Uint8Array(ArrayBuffer.isView(chunk) ? new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength) : chunk)
213
-
214
- // 4.2. Set opcode to a binary frame opcode.
215
- opcode = opcodes.BINARY
216
- } else {
217
- // 5. Otherwise,
218
-
219
- // 5.1. Let string be the result of converting chunk to an IDL USVString .
220
- // If this throws an exception, return a promise rejected with the exception.
221
- let string
222
-
223
- try {
224
- string = webidl.converters.DOMString(chunk)
225
- } catch (e) {
226
- promise.reject(e)
227
- return
228
- }
229
-
230
- // 5.2. Set data to the result of UTF-8 encoding string .
231
- data = new TextEncoder().encode(string)
232
-
233
- // 5.3. Set opcode to a text frame opcode.
234
- opcode = opcodes.TEXT
235
- }
236
-
237
- // 6. In parallel,
238
- // 6.1. Wait until there is sufficient buffer space in stream to send the message.
239
-
240
- // 6.2. If the closing handshake has not yet started , Send a WebSocket Message to stream comprised of data using opcode .
241
- if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {
242
- const frame = new WebsocketFrameSend(data)
243
-
244
- this.#handler.socket.write(frame.createFrame(opcode), () => {
245
- promise.resolve(undefined)
246
- })
247
- }
248
-
249
- // 6.3. Queue a global task on the WebSocket task source given stream ’s relevant global object to resolve promise with undefined.
250
- return promise
251
- }
252
-
253
- /** @type {import('../websocket').Handler['onConnectionEstablished']} */
254
- #onConnectionEstablished (response, parsedExtensions) {
255
- this.#handler.socket = response.socket
256
-
257
- const parser = new ByteParser(this.#handler, parsedExtensions)
258
- parser.on('drain', () => this.#handler.onParserDrain())
259
- parser.on('error', (err) => this.#handler.onParserError(err))
260
-
261
- this.#parser = parser
262
-
263
- // 1. Change stream ’s ready state to OPEN (1).
264
- this.#handler.readyState = states.OPEN
265
-
266
- // 2. Set stream ’s was ever connected to true.
267
- // This is done in the opening handshake.
268
-
269
- // 3. Let extensions be the extensions in use .
270
- const extensions = parsedExtensions ?? ''
271
-
272
- // 4. Let protocol be the subprotocol in use .
273
- const protocol = response.headersList.get('sec-websocket-protocol') ?? ''
274
-
275
- // 5. Let pullAlgorithm be an action that pulls bytes from stream .
276
- // 6. Let cancelAlgorithm be an action that cancels stream with reason , given reason .
277
- // 7. Let readable be a new ReadableStream .
278
- // 8. Set up readable with pullAlgorithm and cancelAlgorithm .
279
- const readable = new ReadableStream({
280
- start: (controller) => {
281
- this.#readableStreamController = controller
282
- },
283
- pull (controller) {
284
- let chunk
285
- while (controller.desiredSize > 0 && (chunk = response.socket.read()) !== null) {
286
- controller.enqueue(chunk)
287
- }
288
- },
289
- cancel: (reason) => this.#cancel(reason)
290
- })
291
-
292
- // 9. Let writeAlgorithm be an action that writes chunk to stream , given chunk .
293
- // 10. Let closeAlgorithm be an action that closes stream .
294
- // 11. Let abortAlgorithm be an action that aborts stream with reason , given reason .
295
- // 12. Let writable be a new WritableStream .
296
- // 13. Set up writable with writeAlgorithm , closeAlgorithm , and abortAlgorithm .
297
- const writable = new WritableStream({
298
- write: (chunk) => this.#write(chunk),
299
- close: () => closeWebSocketConnection(this.#handler, null, null),
300
- abort: (reason) => this.#closeUsingReason(reason)
301
- })
302
-
303
- // Set stream ’s readable stream to readable .
304
- this.#readableStream = readable
305
-
306
- // Set stream ’s writable stream to writable .
307
- this.#writableStream = writable
308
-
309
- // Resolve stream ’s opened promise with WebSocketOpenInfo «[ " extensions " → extensions , " protocol " → protocol , " readable " → readable , " writable " → writable ]».
310
- this.#openedPromise.resolve({
311
- extensions,
312
- protocol,
313
- readable,
314
- writable
315
- })
316
- }
317
-
318
- /** @type {import('../websocket').Handler['onMessage']} */
319
- #onMessage (type, data) {
320
- // 1. If stream’s ready state is not OPEN (1), then return.
321
- if (this.#handler.readyState !== states.OPEN) {
322
- return
323
- }
324
-
325
- // 2. Let chunk be determined by switching on type:
326
- // - type indicates that the data is Text
327
- // a new DOMString containing data
328
- // - type indicates that the data is Binary
329
- // a new Uint8Array object, created in the relevant Realm of the
330
- // WebSocketStream object, whose contents are data
331
- let chunk
332
-
333
- if (type === opcodes.TEXT) {
334
- try {
335
- chunk = utf8Decode(data)
336
- } catch {
337
- failWebsocketConnection(this.#handler, 'Received invalid UTF-8 in text frame.')
338
- return
339
- }
340
- } else if (type === opcodes.BINARY) {
341
- chunk = new Uint8Array(data.buffer, data.byteOffset, data.byteLength)
342
- }
343
-
344
- // 3. Enqueue chunk into stream’s readable stream.
345
- this.#readableStreamController.enqueue(chunk)
346
-
347
- // 4. Apply backpressure to the WebSocket.
348
- }
349
-
350
- /** @type {import('../websocket').Handler['onSocketClose']} */
351
- #onSocketClose () {
352
- const wasClean =
353
- this.#handler.closeState.has(sentCloseFrameState.SENT) &&
354
- this.#handler.closeState.has(sentCloseFrameState.RECEIVED)
355
-
356
- // 1. Change the ready state to CLOSED (3).
357
- this.#handler.readyState = states.CLOSED
358
-
359
- // 2. If stream ’s handshake aborted is true, then return.
360
- if (this.#handshakeAborted) {
361
- return
362
- }
363
-
364
- // 3. If stream ’s was ever connected is false, then reject stream ’s opened promise with a new WebSocketError.
365
- if (!this.#handler.wasEverConnected) {
366
- this.#openedPromise.reject(new WebSocketError('Socket never opened'))
367
- }
368
-
369
- const result = this.#parser.closingInfo
370
-
371
- // 4. Let code be the WebSocket connection close code .
372
- // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5
373
- // If this Close control frame contains no status code, _The WebSocket
374
- // Connection Close Code_ is considered to be 1005. If _The WebSocket
375
- // Connection is Closed_ and no Close control frame was received by the
376
- // endpoint (such as could occur if the underlying transport connection
377
- // is lost), _The WebSocket Connection Close Code_ is considered to be
378
- // 1006.
379
- let code = result?.code ?? 1005
380
-
381
- if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {
382
- code = 1006
383
- }
384
-
385
- // 5. Let reason be the result of applying UTF-8 decode without BOM to the WebSocket connection close reason .
386
- const reason = result?.reason == null ? '' : utf8DecodeBytes(Buffer.from(result.reason))
387
-
388
- // 6. If the connection was closed cleanly ,
389
- if (wasClean) {
390
- // 6.1. Close stream ’s readable stream .
391
- this.#readableStream.cancel().catch(() => {})
392
-
393
- // 6.2. Error stream ’s writable stream with an " InvalidStateError " DOMException indicating that a closed WebSocketStream cannot be written to.
394
- if (!this.#writableStream.locked) {
395
- this.#writableStream.abort(new DOMException('A closed WebSocketStream cannot be written to', 'InvalidStateError'))
396
- }
397
-
398
- // 6.3. Resolve stream ’s closed promise with WebSocketCloseInfo «[ " closeCode " → code , " reason " → reason ]».
399
- this.#closedPromise.resolve({
400
- closeCode: code,
401
- reason
402
- })
403
- } else {
404
- // 7. Otherwise,
405
-
406
- // 7.1. Let error be a new WebSocketError whose closeCode is code and reason is reason .
407
- const error = createUnvalidatedWebSocketError('unclean close', code, reason)
408
-
409
- // 7.2. Error stream ’s readable stream with error .
410
- this.#readableStreamController.error(error)
411
-
412
- // 7.3. Error stream ’s writable stream with error .
413
- this.#writableStream.abort(error)
414
-
415
- // 7.4. Reject stream ’s closed promise with error .
416
- this.#closedPromise.reject(error)
417
- }
418
- }
419
-
420
- #closeUsingReason (reason) {
421
- // 1. Let code be null.
422
- let code = null
423
-
424
- // 2. Let reasonString be the empty string.
425
- let reasonString = ''
426
-
427
- // 3. If reason implements WebSocketError ,
428
- if (webidl.is.WebSocketError(reason)) {
429
- // 3.1. Set code to reason ’s closeCode .
430
- code = reason.closeCode
431
-
432
- // 3.2. Set reasonString to reason ’s reason .
433
- reasonString = reason.reason
434
- }
435
-
436
- // 4. Close the WebSocket with stream , code , and reasonString . If this throws an exception,
437
- // discard code and reasonString and close the WebSocket with stream .
438
- closeWebSocketConnection(this.#handler, code, reasonString)
439
- }
440
-
441
- // To cancel a WebSocketStream stream given reason , close using reason giving stream and reason .
442
- #cancel (reason) {
443
- this.#closeUsingReason(reason)
444
- }
445
- }
446
-
447
- Object.defineProperties(WebSocketStream.prototype, {
448
- url: kEnumerableProperty,
449
- opened: kEnumerableProperty,
450
- closed: kEnumerableProperty,
451
- close: kEnumerableProperty,
452
- [Symbol.toStringTag]: {
453
- value: 'WebSocketStream',
454
- writable: false,
455
- enumerable: false,
456
- configurable: true
457
- }
458
- })
459
-
460
- webidl.converters.WebSocketStreamOptions = webidl.dictionaryConverter([
461
- {
462
- key: 'protocols',
463
- converter: webidl.sequenceConverter(webidl.converters.USVString),
464
- defaultValue: () => []
465
- },
466
- {
467
- key: 'signal',
468
- converter: webidl.nullableConverter(webidl.converters.AbortSignal),
469
- defaultValue: () => null
470
- }
471
- ])
472
-
473
- webidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([
474
- {
475
- key: 'closeCode',
476
- converter: (V) => webidl.converters['unsigned short'](V, { enforceRange: true })
477
- },
478
- {
479
- key: 'reason',
480
- converter: webidl.converters.USVString,
481
- defaultValue: () => ''
482
- }
483
- ])
484
-
485
- module.exports = { WebSocketStream }