deepv-code 1.0.182 → 1.0.183

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 +635 -635
  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,454 +0,0 @@
1
- 'use strict'
2
-
3
- const { Writable } = require('node:stream')
4
- const assert = require('node:assert')
5
- const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = require('./constants')
6
- const { channels } = require('../../core/diagnostics')
7
- const {
8
- isValidStatusCode,
9
- isValidOpcode,
10
- websocketMessageReceived,
11
- utf8Decode,
12
- isControlFrame,
13
- isTextBinaryFrame,
14
- isContinuationFrame
15
- } = require('./util')
16
- const { failWebsocketConnection } = require('./connection')
17
- const { WebsocketFrameSend } = require('./frame')
18
- const { PerMessageDeflate } = require('./permessage-deflate')
19
-
20
- // This code was influenced by ws released under the MIT license.
21
- // Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
22
- // Copyright (c) 2013 Arnout Kazemier and contributors
23
- // Copyright (c) 2016 Luigi Pinca and contributors
24
-
25
- class ByteParser extends Writable {
26
- #buffers = []
27
- #fragmentsBytes = 0
28
- #byteOffset = 0
29
- #loop = false
30
-
31
- #state = parserStates.INFO
32
-
33
- #info = {}
34
- #fragments = []
35
-
36
- /** @type {Map<string, PerMessageDeflate>} */
37
- #extensions
38
-
39
- /** @type {import('./websocket').Handler} */
40
- #handler
41
-
42
- constructor (handler, extensions) {
43
- super()
44
-
45
- this.#handler = handler
46
- this.#extensions = extensions == null ? new Map() : extensions
47
-
48
- if (this.#extensions.has('permessage-deflate')) {
49
- this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions))
50
- }
51
- }
52
-
53
- /**
54
- * @param {Buffer} chunk
55
- * @param {() => void} callback
56
- */
57
- _write (chunk, _, callback) {
58
- this.#buffers.push(chunk)
59
- this.#byteOffset += chunk.length
60
- this.#loop = true
61
-
62
- this.run(callback)
63
- }
64
-
65
- /**
66
- * Runs whenever a new chunk is received.
67
- * Callback is called whenever there are no more chunks buffering,
68
- * or not enough bytes are buffered to parse.
69
- */
70
- run (callback) {
71
- while (this.#loop) {
72
- if (this.#state === parserStates.INFO) {
73
- // If there aren't enough bytes to parse the payload length, etc.
74
- if (this.#byteOffset < 2) {
75
- return callback()
76
- }
77
-
78
- const buffer = this.consume(2)
79
- const fin = (buffer[0] & 0x80) !== 0
80
- const opcode = buffer[0] & 0x0F
81
- const masked = (buffer[1] & 0x80) === 0x80
82
-
83
- const fragmented = !fin && opcode !== opcodes.CONTINUATION
84
- const payloadLength = buffer[1] & 0x7F
85
-
86
- const rsv1 = buffer[0] & 0x40
87
- const rsv2 = buffer[0] & 0x20
88
- const rsv3 = buffer[0] & 0x10
89
-
90
- if (!isValidOpcode(opcode)) {
91
- failWebsocketConnection(this.#handler, 1002, 'Invalid opcode received')
92
- return callback()
93
- }
94
-
95
- if (masked) {
96
- failWebsocketConnection(this.#handler, 1002, 'Frame cannot be masked')
97
- return callback()
98
- }
99
-
100
- // MUST be 0 unless an extension is negotiated that defines meanings
101
- // for non-zero values. If a nonzero value is received and none of
102
- // the negotiated extensions defines the meaning of such a nonzero
103
- // value, the receiving endpoint MUST _Fail the WebSocket
104
- // Connection_.
105
- // This document allocates the RSV1 bit of the WebSocket header for
106
- // PMCEs and calls the bit the "Per-Message Compressed" bit. On a
107
- // WebSocket connection where a PMCE is in use, this bit indicates
108
- // whether a message is compressed or not.
109
- if (rsv1 !== 0 && !this.#extensions.has('permessage-deflate')) {
110
- failWebsocketConnection(this.#handler, 1002, 'Expected RSV1 to be clear.')
111
- return
112
- }
113
-
114
- if (rsv2 !== 0 || rsv3 !== 0) {
115
- failWebsocketConnection(this.#handler, 1002, 'RSV1, RSV2, RSV3 must be clear')
116
- return
117
- }
118
-
119
- if (fragmented && !isTextBinaryFrame(opcode)) {
120
- // Only text and binary frames can be fragmented
121
- failWebsocketConnection(this.#handler, 1002, 'Invalid frame type was fragmented.')
122
- return
123
- }
124
-
125
- // If we are already parsing a text/binary frame and do not receive either
126
- // a continuation frame or close frame, fail the connection.
127
- if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) {
128
- failWebsocketConnection(this.#handler, 1002, 'Expected continuation frame')
129
- return
130
- }
131
-
132
- if (this.#info.fragmented && fragmented) {
133
- // A fragmented frame can't be fragmented itself
134
- failWebsocketConnection(this.#handler, 1002, 'Fragmented frame exceeded 125 bytes.')
135
- return
136
- }
137
-
138
- // "All control frames MUST have a payload length of 125 bytes or less
139
- // and MUST NOT be fragmented."
140
- if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) {
141
- failWebsocketConnection(this.#handler, 1002, 'Control frame either too large or fragmented')
142
- return
143
- }
144
-
145
- if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) {
146
- failWebsocketConnection(this.#handler, 1002, 'Unexpected continuation frame')
147
- return
148
- }
149
-
150
- if (payloadLength <= 125) {
151
- this.#info.payloadLength = payloadLength
152
- this.#state = parserStates.READ_DATA
153
- } else if (payloadLength === 126) {
154
- this.#state = parserStates.PAYLOADLENGTH_16
155
- } else if (payloadLength === 127) {
156
- this.#state = parserStates.PAYLOADLENGTH_64
157
- }
158
-
159
- if (isTextBinaryFrame(opcode)) {
160
- this.#info.binaryType = opcode
161
- this.#info.compressed = rsv1 !== 0
162
- }
163
-
164
- this.#info.opcode = opcode
165
- this.#info.masked = masked
166
- this.#info.fin = fin
167
- this.#info.fragmented = fragmented
168
- } else if (this.#state === parserStates.PAYLOADLENGTH_16) {
169
- if (this.#byteOffset < 2) {
170
- return callback()
171
- }
172
-
173
- const buffer = this.consume(2)
174
-
175
- this.#info.payloadLength = buffer.readUInt16BE(0)
176
- this.#state = parserStates.READ_DATA
177
- } else if (this.#state === parserStates.PAYLOADLENGTH_64) {
178
- if (this.#byteOffset < 8) {
179
- return callback()
180
- }
181
-
182
- const buffer = this.consume(8)
183
- const upper = buffer.readUInt32BE(0)
184
-
185
- // 2^31 is the maximum bytes an arraybuffer can contain
186
- // on 32-bit systems. Although, on 64-bit systems, this is
187
- // 2^53-1 bytes.
188
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length
189
- // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275
190
- // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e
191
- if (upper > 2 ** 31 - 1) {
192
- failWebsocketConnection(this.#handler, 1009, 'Received payload length > 2^31 bytes.')
193
- return
194
- }
195
-
196
- const lower = buffer.readUInt32BE(4)
197
-
198
- this.#info.payloadLength = (upper << 8) + lower
199
- this.#state = parserStates.READ_DATA
200
- } else if (this.#state === parserStates.READ_DATA) {
201
- if (this.#byteOffset < this.#info.payloadLength) {
202
- return callback()
203
- }
204
-
205
- const body = this.consume(this.#info.payloadLength)
206
-
207
- if (isControlFrame(this.#info.opcode)) {
208
- this.#loop = this.parseControlFrame(body)
209
- this.#state = parserStates.INFO
210
- } else {
211
- if (!this.#info.compressed) {
212
- this.writeFragments(body)
213
-
214
- // If the frame is not fragmented, a message has been received.
215
- // If the frame is fragmented, it will terminate with a fin bit set
216
- // and an opcode of 0 (continuation), therefore we handle that when
217
- // parsing continuation frames, not here.
218
- if (!this.#info.fragmented && this.#info.fin) {
219
- websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments())
220
- }
221
-
222
- this.#state = parserStates.INFO
223
- } else {
224
- this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => {
225
- if (error) {
226
- failWebsocketConnection(this.#handler, 1007, error.message)
227
- return
228
- }
229
-
230
- this.writeFragments(data)
231
-
232
- if (!this.#info.fin) {
233
- this.#state = parserStates.INFO
234
- this.#loop = true
235
- this.run(callback)
236
- return
237
- }
238
-
239
- websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments())
240
-
241
- this.#loop = true
242
- this.#state = parserStates.INFO
243
- this.run(callback)
244
- })
245
-
246
- this.#loop = false
247
- break
248
- }
249
- }
250
- }
251
- }
252
- }
253
-
254
- /**
255
- * Take n bytes from the buffered Buffers
256
- * @param {number} n
257
- * @returns {Buffer}
258
- */
259
- consume (n) {
260
- if (n > this.#byteOffset) {
261
- throw new Error('Called consume() before buffers satiated.')
262
- } else if (n === 0) {
263
- return emptyBuffer
264
- }
265
-
266
- this.#byteOffset -= n
267
-
268
- const first = this.#buffers[0]
269
-
270
- if (first.length > n) {
271
- // replace with remaining buffer
272
- this.#buffers[0] = first.subarray(n, first.length)
273
- return first.subarray(0, n)
274
- } else if (first.length === n) {
275
- // prefect match
276
- return this.#buffers.shift()
277
- } else {
278
- let offset = 0
279
- // If Buffer.allocUnsafe is used, extra copies will be made because the offset is non-zero.
280
- const buffer = Buffer.allocUnsafeSlow(n)
281
- while (offset !== n) {
282
- const next = this.#buffers[0]
283
- const length = next.length
284
-
285
- if (length + offset === n) {
286
- buffer.set(this.#buffers.shift(), offset)
287
- break
288
- } else if (length + offset > n) {
289
- buffer.set(next.subarray(0, n - offset), offset)
290
- this.#buffers[0] = next.subarray(n - offset)
291
- break
292
- } else {
293
- buffer.set(this.#buffers.shift(), offset)
294
- offset += length
295
- }
296
- }
297
-
298
- return buffer
299
- }
300
- }
301
-
302
- writeFragments (fragment) {
303
- this.#fragmentsBytes += fragment.length
304
- this.#fragments.push(fragment)
305
- }
306
-
307
- consumeFragments () {
308
- const fragments = this.#fragments
309
-
310
- if (fragments.length === 1) {
311
- // single fragment
312
- this.#fragmentsBytes = 0
313
- return fragments.shift()
314
- }
315
-
316
- let offset = 0
317
- // If Buffer.allocUnsafe is used, extra copies will be made because the offset is non-zero.
318
- const output = Buffer.allocUnsafeSlow(this.#fragmentsBytes)
319
-
320
- for (let i = 0; i < fragments.length; ++i) {
321
- const buffer = fragments[i]
322
- output.set(buffer, offset)
323
- offset += buffer.length
324
- }
325
-
326
- this.#fragments = []
327
- this.#fragmentsBytes = 0
328
-
329
- return output
330
- }
331
-
332
- parseCloseBody (data) {
333
- assert(data.length !== 1)
334
-
335
- // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5
336
- /** @type {number|undefined} */
337
- let code
338
-
339
- if (data.length >= 2) {
340
- // _The WebSocket Connection Close Code_ is
341
- // defined as the status code (Section 7.4) contained in the first Close
342
- // control frame received by the application
343
- code = data.readUInt16BE(0)
344
- }
345
-
346
- if (code !== undefined && !isValidStatusCode(code)) {
347
- return { code: 1002, reason: 'Invalid status code', error: true }
348
- }
349
-
350
- // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6
351
- /** @type {Buffer} */
352
- let reason = data.subarray(2)
353
-
354
- // Remove BOM
355
- if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {
356
- reason = reason.subarray(3)
357
- }
358
-
359
- try {
360
- reason = utf8Decode(reason)
361
- } catch {
362
- return { code: 1007, reason: 'Invalid UTF-8', error: true }
363
- }
364
-
365
- return { code, reason, error: false }
366
- }
367
-
368
- /**
369
- * Parses control frames.
370
- * @param {Buffer} body
371
- */
372
- parseControlFrame (body) {
373
- const { opcode, payloadLength } = this.#info
374
-
375
- if (opcode === opcodes.CLOSE) {
376
- if (payloadLength === 1) {
377
- failWebsocketConnection(this.#handler, 1002, 'Received close frame with a 1-byte body.')
378
- return false
379
- }
380
-
381
- this.#info.closeInfo = this.parseCloseBody(body)
382
-
383
- if (this.#info.closeInfo.error) {
384
- const { code, reason } = this.#info.closeInfo
385
-
386
- failWebsocketConnection(this.#handler, code, reason)
387
- return false
388
- }
389
-
390
- // Upon receiving such a frame, the other peer sends a
391
- // Close frame in response, if it hasn't already sent one.
392
- if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {
393
- // If an endpoint receives a Close frame and did not previously send a
394
- // Close frame, the endpoint MUST send a Close frame in response. (When
395
- // sending a Close frame in response, the endpoint typically echos the
396
- // status code it received.)
397
- let body = emptyBuffer
398
- if (this.#info.closeInfo.code) {
399
- body = Buffer.allocUnsafe(2)
400
- body.writeUInt16BE(this.#info.closeInfo.code, 0)
401
- }
402
- const closeFrame = new WebsocketFrameSend(body)
403
-
404
- this.#handler.socket.write(closeFrame.createFrame(opcodes.CLOSE))
405
- this.#handler.closeState.add(sentCloseFrameState.SENT)
406
- }
407
-
408
- // Upon either sending or receiving a Close control frame, it is said
409
- // that _The WebSocket Closing Handshake is Started_ and that the
410
- // WebSocket connection is in the CLOSING state.
411
- this.#handler.readyState = states.CLOSING
412
- this.#handler.closeState.add(sentCloseFrameState.RECEIVED)
413
-
414
- return false
415
- } else if (opcode === opcodes.PING) {
416
- // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in
417
- // response, unless it already received a Close frame.
418
- // A Pong frame sent in response to a Ping frame must have identical
419
- // "Application data"
420
-
421
- if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {
422
- const frame = new WebsocketFrameSend(body)
423
-
424
- this.#handler.socket.write(frame.createFrame(opcodes.PONG))
425
-
426
- if (channels.ping.hasSubscribers) {
427
- channels.ping.publish({
428
- payload: body
429
- })
430
- }
431
- }
432
- } else if (opcode === opcodes.PONG) {
433
- // A Pong frame MAY be sent unsolicited. This serves as a
434
- // unidirectional heartbeat. A response to an unsolicited Pong frame is
435
- // not expected.
436
-
437
- if (channels.pong.hasSubscribers) {
438
- channels.pong.publish({
439
- payload: body
440
- })
441
- }
442
- }
443
-
444
- return true
445
- }
446
-
447
- get closingInfo () {
448
- return this.#info.closeInfo
449
- }
450
- }
451
-
452
- module.exports = {
453
- ByteParser
454
- }
@@ -1,109 +0,0 @@
1
- 'use strict'
2
-
3
- const { WebsocketFrameSend } = require('./frame')
4
- const { opcodes, sendHints } = require('./constants')
5
- const FixedQueue = require('../../dispatcher/fixed-queue')
6
-
7
- /**
8
- * @typedef {object} SendQueueNode
9
- * @property {Promise<void> | null} promise
10
- * @property {((...args: any[]) => any)} callback
11
- * @property {Buffer | null} frame
12
- */
13
-
14
- class SendQueue {
15
- /**
16
- * @type {FixedQueue}
17
- */
18
- #queue = new FixedQueue()
19
-
20
- /**
21
- * @type {boolean}
22
- */
23
- #running = false
24
-
25
- /** @type {import('node:net').Socket} */
26
- #socket
27
-
28
- constructor (socket) {
29
- this.#socket = socket
30
- }
31
-
32
- add (item, cb, hint) {
33
- if (hint !== sendHints.blob) {
34
- if (!this.#running) {
35
- // TODO(@tsctx): support fast-path for string on running
36
- if (hint === sendHints.text) {
37
- // special fast-path for string
38
- const { 0: head, 1: body } = WebsocketFrameSend.createFastTextFrame(item)
39
- this.#socket.cork()
40
- this.#socket.write(head)
41
- this.#socket.write(body, cb)
42
- this.#socket.uncork()
43
- } else {
44
- // direct writing
45
- this.#socket.write(createFrame(item, hint), cb)
46
- }
47
- } else {
48
- /** @type {SendQueueNode} */
49
- const node = {
50
- promise: null,
51
- callback: cb,
52
- frame: createFrame(item, hint)
53
- }
54
- this.#queue.push(node)
55
- }
56
- return
57
- }
58
-
59
- /** @type {SendQueueNode} */
60
- const node = {
61
- promise: item.arrayBuffer().then((ab) => {
62
- node.promise = null
63
- node.frame = createFrame(ab, hint)
64
- }),
65
- callback: cb,
66
- frame: null
67
- }
68
-
69
- this.#queue.push(node)
70
-
71
- if (!this.#running) {
72
- this.#run()
73
- }
74
- }
75
-
76
- async #run () {
77
- this.#running = true
78
- const queue = this.#queue
79
- while (!queue.isEmpty()) {
80
- const node = queue.shift()
81
- // wait pending promise
82
- if (node.promise !== null) {
83
- await node.promise
84
- }
85
- // write
86
- this.#socket.write(node.frame, node.callback)
87
- // cleanup
88
- node.callback = node.frame = null
89
- }
90
- this.#running = false
91
- }
92
- }
93
-
94
- function createFrame (data, hint) {
95
- return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.text ? opcodes.TEXT : opcodes.BINARY)
96
- }
97
-
98
- function toBuffer (data, hint) {
99
- switch (hint) {
100
- case sendHints.text:
101
- case sendHints.typedArray:
102
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength)
103
- case sendHints.arrayBuffer:
104
- case sendHints.blob:
105
- return new Uint8Array(data)
106
- }
107
- }
108
-
109
- module.exports = { SendQueue }
@@ -1,83 +0,0 @@
1
- 'use strict'
2
-
3
- const { webidl } = require('../../fetch/webidl')
4
- const { validateCloseCodeAndReason } = require('../util')
5
- const { kConstruct } = require('../../../core/symbols')
6
- const { kEnumerableProperty } = require('../../../core/util')
7
-
8
- class WebSocketError extends DOMException {
9
- #closeCode
10
- #reason
11
-
12
- constructor (message = '', init = undefined) {
13
- message = webidl.converters.DOMString(message, 'WebSocketError', 'message')
14
-
15
- // 1. Set this 's name to " WebSocketError ".
16
- // 2. Set this 's message to message .
17
- super(message, 'WebSocketError')
18
-
19
- if (init === kConstruct) {
20
- return
21
- } else if (init !== null) {
22
- init = webidl.converters.WebSocketCloseInfo(init)
23
- }
24
-
25
- // 3. Let code be init [" closeCode "] if it exists , or null otherwise.
26
- let code = init.closeCode ?? null
27
-
28
- // 4. Let reason be init [" reason "] if it exists , or the empty string otherwise.
29
- const reason = init.reason ?? ''
30
-
31
- // 5. Validate close code and reason with code and reason .
32
- validateCloseCodeAndReason(code, reason)
33
-
34
- // 6. If reason is non-empty, but code is not set, then set code to 1000 ("Normal Closure").
35
- if (reason.length !== 0 && code === null) {
36
- code = 1000
37
- }
38
-
39
- // 7. Set this 's closeCode to code .
40
- this.#closeCode = code
41
-
42
- // 8. Set this 's reason to reason .
43
- this.#reason = reason
44
- }
45
-
46
- get closeCode () {
47
- return this.#closeCode
48
- }
49
-
50
- get reason () {
51
- return this.#reason
52
- }
53
-
54
- /**
55
- * @param {string} message
56
- * @param {number|null} code
57
- * @param {string} reason
58
- */
59
- static createUnvalidatedWebSocketError (message, code, reason) {
60
- const error = new WebSocketError(message, kConstruct)
61
- error.#closeCode = code
62
- error.#reason = reason
63
- return error
64
- }
65
- }
66
-
67
- const { createUnvalidatedWebSocketError } = WebSocketError
68
- delete WebSocketError.createUnvalidatedWebSocketError
69
-
70
- Object.defineProperties(WebSocketError.prototype, {
71
- closeCode: kEnumerableProperty,
72
- reason: kEnumerableProperty,
73
- [Symbol.toStringTag]: {
74
- value: 'WebSocketError',
75
- writable: false,
76
- enumerable: false,
77
- configurable: true
78
- }
79
- })
80
-
81
- webidl.is.WebSocketError = webidl.util.MakeTypeAssertion(WebSocketError)
82
-
83
- module.exports = { WebSocketError, createUnvalidatedWebSocketError }