@oddessentials/agent-guild 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -0
  3. package/bin/agent-guild-report.mjs +134 -0
  4. package/bin/agent-guild.mjs +240 -0
  5. package/config/providers.default.json +124 -0
  6. package/examples/claude-code-settings.json +48 -0
  7. package/examples/codex-hooks.json +45 -0
  8. package/examples/gemini-settings.json +61 -0
  9. package/examples/grok-hooks.json +55 -0
  10. package/examples/providers.json +27 -0
  11. package/node_modules/@xterm/addon-fit/LICENSE +19 -0
  12. package/node_modules/@xterm/addon-fit/README.md +24 -0
  13. package/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
  14. package/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +1 -0
  15. package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +18 -0
  16. package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +7 -0
  17. package/node_modules/@xterm/addon-fit/package.json +26 -0
  18. package/node_modules/@xterm/addon-fit/src/FitAddon.ts +92 -0
  19. package/node_modules/@xterm/addon-fit/typings/addon-fit.d.ts +55 -0
  20. package/node_modules/@xterm/addon-serialize/README.md +42 -0
  21. package/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
  22. package/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +1 -0
  23. package/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
  24. package/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +7 -0
  25. package/node_modules/@xterm/addon-serialize/package.json +29 -0
  26. package/node_modules/@xterm/addon-serialize/src/SerializeAddon.ts +695 -0
  27. package/node_modules/@xterm/addon-serialize/typings/addon-serialize.d.ts +116 -0
  28. package/node_modules/@xterm/addon-web-links/LICENSE +19 -0
  29. package/node_modules/@xterm/addon-web-links/README.md +21 -0
  30. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js +2 -0
  31. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js.map +1 -0
  32. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs +18 -0
  33. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs.map +7 -0
  34. package/node_modules/@xterm/addon-web-links/package.json +26 -0
  35. package/node_modules/@xterm/addon-web-links/src/WebLinkProvider.ts +199 -0
  36. package/node_modules/@xterm/addon-web-links/src/WebLinksAddon.ts +58 -0
  37. package/node_modules/@xterm/addon-web-links/typings/addon-web-links.d.ts +57 -0
  38. package/node_modules/@xterm/headless/README.md +31 -0
  39. package/node_modules/@xterm/headless/lib-headless/xterm-headless.js +2 -0
  40. package/node_modules/@xterm/headless/lib-headless/xterm-headless.js.map +1 -0
  41. package/node_modules/@xterm/headless/lib-headless/xterm-headless.mjs +46 -0
  42. package/node_modules/@xterm/headless/lib-headless/xterm-headless.mjs.map +7 -0
  43. package/node_modules/@xterm/headless/package.json +29 -0
  44. package/node_modules/@xterm/headless/typings/xterm-headless.d.ts +1385 -0
  45. package/node_modules/@xterm/xterm/LICENSE +21 -0
  46. package/node_modules/@xterm/xterm/README.md +243 -0
  47. package/node_modules/@xterm/xterm/css/xterm.css +285 -0
  48. package/node_modules/@xterm/xterm/lib/xterm.js +2 -0
  49. package/node_modules/@xterm/xterm/lib/xterm.js.map +1 -0
  50. package/node_modules/@xterm/xterm/lib/xterm.mjs +53 -0
  51. package/node_modules/@xterm/xterm/lib/xterm.mjs.map +7 -0
  52. package/node_modules/@xterm/xterm/package.json +111 -0
  53. package/node_modules/@xterm/xterm/src/browser/AccessibilityManager.ts +435 -0
  54. package/node_modules/@xterm/xterm/src/browser/Clipboard.ts +93 -0
  55. package/node_modules/@xterm/xterm/src/browser/ColorContrastCache.ts +34 -0
  56. package/node_modules/@xterm/xterm/src/browser/CoreBrowserTerminal.ts +1339 -0
  57. package/node_modules/@xterm/xterm/src/browser/Linkifier.ts +403 -0
  58. package/node_modules/@xterm/xterm/src/browser/LocalizableStrings.ts +23 -0
  59. package/node_modules/@xterm/xterm/src/browser/OscLinkProvider.ts +129 -0
  60. package/node_modules/@xterm/xterm/src/browser/RenderDebouncer.ts +84 -0
  61. package/node_modules/@xterm/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
  62. package/node_modules/@xterm/xterm/src/browser/Types.ts +226 -0
  63. package/node_modules/@xterm/xterm/src/browser/Viewport.ts +192 -0
  64. package/node_modules/@xterm/xterm/src/browser/decorations/BufferDecorationRenderer.ts +139 -0
  65. package/node_modules/@xterm/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
  66. package/node_modules/@xterm/xterm/src/browser/decorations/OverviewRulerRenderer.ts +214 -0
  67. package/node_modules/@xterm/xterm/src/browser/input/CompositionHelper.ts +248 -0
  68. package/node_modules/@xterm/xterm/src/browser/input/Mouse.ts +54 -0
  69. package/node_modules/@xterm/xterm/src/browser/input/MoveToCell.ts +251 -0
  70. package/node_modules/@xterm/xterm/src/browser/public/Terminal.ts +275 -0
  71. package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRenderer.ts +542 -0
  72. package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +546 -0
  73. package/node_modules/@xterm/xterm/src/browser/renderer/dom/WidthCache.ts +167 -0
  74. package/node_modules/@xterm/xterm/src/browser/renderer/shared/Constants.ts +6 -0
  75. package/node_modules/@xterm/xterm/src/browser/renderer/shared/RendererUtils.ts +95 -0
  76. package/node_modules/@xterm/xterm/src/browser/renderer/shared/SelectionRenderModel.ts +93 -0
  77. package/node_modules/@xterm/xterm/src/browser/renderer/shared/Types.ts +84 -0
  78. package/node_modules/@xterm/xterm/src/browser/selection/SelectionModel.ts +144 -0
  79. package/node_modules/@xterm/xterm/src/browser/selection/Types.ts +15 -0
  80. package/node_modules/@xterm/xterm/src/browser/services/CharSizeService.ts +127 -0
  81. package/node_modules/@xterm/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
  82. package/node_modules/@xterm/xterm/src/browser/services/CoreBrowserService.ts +137 -0
  83. package/node_modules/@xterm/xterm/src/browser/services/LinkProviderService.ts +28 -0
  84. package/node_modules/@xterm/xterm/src/browser/services/MouseService.ts +46 -0
  85. package/node_modules/@xterm/xterm/src/browser/services/RenderService.ts +376 -0
  86. package/node_modules/@xterm/xterm/src/browser/services/SelectionService.ts +1039 -0
  87. package/node_modules/@xterm/xterm/src/browser/services/Services.ts +158 -0
  88. package/node_modules/@xterm/xterm/src/browser/services/ThemeService.ts +198 -0
  89. package/node_modules/@xterm/xterm/src/browser/shared/Constants.ts +8 -0
  90. package/node_modules/@xterm/xterm/src/common/CircularList.ts +241 -0
  91. package/node_modules/@xterm/xterm/src/common/Clone.ts +23 -0
  92. package/node_modules/@xterm/xterm/src/common/Color.ts +376 -0
  93. package/node_modules/@xterm/xterm/src/common/CoreTerminal.ts +283 -0
  94. package/node_modules/@xterm/xterm/src/common/InputHandler.ts +3495 -0
  95. package/node_modules/@xterm/xterm/src/common/MultiKeyMap.ts +42 -0
  96. package/node_modules/@xterm/xterm/src/common/Platform.ts +44 -0
  97. package/node_modules/@xterm/xterm/src/common/SortedList.ts +194 -0
  98. package/node_modules/@xterm/xterm/src/common/TaskQueue.ts +166 -0
  99. package/node_modules/@xterm/xterm/src/common/TypedArrayUtils.ts +17 -0
  100. package/node_modules/@xterm/xterm/src/common/Types.ts +552 -0
  101. package/node_modules/@xterm/xterm/src/common/WindowsMode.ts +27 -0
  102. package/node_modules/@xterm/xterm/src/common/buffer/AttributeData.ts +211 -0
  103. package/node_modules/@xterm/xterm/src/common/buffer/Buffer.ts +662 -0
  104. package/node_modules/@xterm/xterm/src/common/buffer/BufferLine.ts +551 -0
  105. package/node_modules/@xterm/xterm/src/common/buffer/BufferRange.ts +13 -0
  106. package/node_modules/@xterm/xterm/src/common/buffer/BufferReflow.ts +226 -0
  107. package/node_modules/@xterm/xterm/src/common/buffer/BufferSet.ts +134 -0
  108. package/node_modules/@xterm/xterm/src/common/buffer/CellData.ts +94 -0
  109. package/node_modules/@xterm/xterm/src/common/buffer/Constants.ts +157 -0
  110. package/node_modules/@xterm/xterm/src/common/buffer/Marker.ts +43 -0
  111. package/node_modules/@xterm/xterm/src/common/buffer/Types.ts +52 -0
  112. package/node_modules/@xterm/xterm/src/common/data/Charsets.ts +256 -0
  113. package/node_modules/@xterm/xterm/src/common/data/EscapeSequences.ts +153 -0
  114. package/node_modules/@xterm/xterm/src/common/input/Keyboard.ts +373 -0
  115. package/node_modules/@xterm/xterm/src/common/input/TextDecoder.ts +346 -0
  116. package/node_modules/@xterm/xterm/src/common/input/UnicodeV6.ts +145 -0
  117. package/node_modules/@xterm/xterm/src/common/input/WriteBuffer.ts +247 -0
  118. package/node_modules/@xterm/xterm/src/common/input/XParseColor.ts +80 -0
  119. package/node_modules/@xterm/xterm/src/common/parser/Constants.ts +58 -0
  120. package/node_modules/@xterm/xterm/src/common/parser/DcsParser.ts +192 -0
  121. package/node_modules/@xterm/xterm/src/common/parser/EscapeSequenceParser.ts +792 -0
  122. package/node_modules/@xterm/xterm/src/common/parser/OscParser.ts +238 -0
  123. package/node_modules/@xterm/xterm/src/common/parser/Params.ts +229 -0
  124. package/node_modules/@xterm/xterm/src/common/parser/Types.ts +275 -0
  125. package/node_modules/@xterm/xterm/src/common/public/AddonManager.ts +53 -0
  126. package/node_modules/@xterm/xterm/src/common/public/BufferApiView.ts +35 -0
  127. package/node_modules/@xterm/xterm/src/common/public/BufferLineApiView.ts +29 -0
  128. package/node_modules/@xterm/xterm/src/common/public/BufferNamespaceApi.ts +36 -0
  129. package/node_modules/@xterm/xterm/src/common/public/ParserApi.ts +37 -0
  130. package/node_modules/@xterm/xterm/src/common/public/UnicodeApi.ts +27 -0
  131. package/node_modules/@xterm/xterm/src/common/services/BufferService.ts +154 -0
  132. package/node_modules/@xterm/xterm/src/common/services/CharsetService.ts +34 -0
  133. package/node_modules/@xterm/xterm/src/common/services/CoreMouseService.ts +365 -0
  134. package/node_modules/@xterm/xterm/src/common/services/CoreService.ts +92 -0
  135. package/node_modules/@xterm/xterm/src/common/services/DecorationService.ts +140 -0
  136. package/node_modules/@xterm/xterm/src/common/services/InstantiationService.ts +85 -0
  137. package/node_modules/@xterm/xterm/src/common/services/LogService.ts +124 -0
  138. package/node_modules/@xterm/xterm/src/common/services/OptionsService.ts +212 -0
  139. package/node_modules/@xterm/xterm/src/common/services/OscLinkService.ts +115 -0
  140. package/node_modules/@xterm/xterm/src/common/services/ServiceRegistry.ts +49 -0
  141. package/node_modules/@xterm/xterm/src/common/services/Services.ts +396 -0
  142. package/node_modules/@xterm/xterm/src/common/services/UnicodeService.ts +111 -0
  143. package/node_modules/@xterm/xterm/src/vs/base/browser/browser.ts +141 -0
  144. package/node_modules/@xterm/xterm/src/vs/base/browser/canIUse.ts +49 -0
  145. package/node_modules/@xterm/xterm/src/vs/base/browser/dom.ts +2369 -0
  146. package/node_modules/@xterm/xterm/src/vs/base/browser/fastDomNode.ts +316 -0
  147. package/node_modules/@xterm/xterm/src/vs/base/browser/globalPointerMoveMonitor.ts +112 -0
  148. package/node_modules/@xterm/xterm/src/vs/base/browser/iframe.ts +135 -0
  149. package/node_modules/@xterm/xterm/src/vs/base/browser/keyboardEvent.ts +213 -0
  150. package/node_modules/@xterm/xterm/src/vs/base/browser/mouseEvent.ts +229 -0
  151. package/node_modules/@xterm/xterm/src/vs/base/browser/touch.ts +372 -0
  152. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +303 -0
  153. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +114 -0
  154. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +720 -0
  155. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +165 -0
  156. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +114 -0
  157. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +243 -0
  158. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +118 -0
  159. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +116 -0
  160. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/widget.ts +57 -0
  161. package/node_modules/@xterm/xterm/src/vs/base/browser/window.ts +14 -0
  162. package/node_modules/@xterm/xterm/src/vs/base/common/arrays.ts +887 -0
  163. package/node_modules/@xterm/xterm/src/vs/base/common/arraysFind.ts +202 -0
  164. package/node_modules/@xterm/xterm/src/vs/base/common/assert.ts +71 -0
  165. package/node_modules/@xterm/xterm/src/vs/base/common/async.ts +1992 -0
  166. package/node_modules/@xterm/xterm/src/vs/base/common/cancellation.ts +148 -0
  167. package/node_modules/@xterm/xterm/src/vs/base/common/charCode.ts +450 -0
  168. package/node_modules/@xterm/xterm/src/vs/base/common/collections.ts +140 -0
  169. package/node_modules/@xterm/xterm/src/vs/base/common/decorators.ts +130 -0
  170. package/node_modules/@xterm/xterm/src/vs/base/common/equals.ts +146 -0
  171. package/node_modules/@xterm/xterm/src/vs/base/common/errors.ts +303 -0
  172. package/node_modules/@xterm/xterm/src/vs/base/common/event.ts +1778 -0
  173. package/node_modules/@xterm/xterm/src/vs/base/common/functional.ts +32 -0
  174. package/node_modules/@xterm/xterm/src/vs/base/common/hash.ts +316 -0
  175. package/node_modules/@xterm/xterm/src/vs/base/common/iterator.ts +159 -0
  176. package/node_modules/@xterm/xterm/src/vs/base/common/keyCodes.ts +526 -0
  177. package/node_modules/@xterm/xterm/src/vs/base/common/keybindings.ts +284 -0
  178. package/node_modules/@xterm/xterm/src/vs/base/common/lazy.ts +47 -0
  179. package/node_modules/@xterm/xterm/src/vs/base/common/lifecycle.ts +801 -0
  180. package/node_modules/@xterm/xterm/src/vs/base/common/linkedList.ts +142 -0
  181. package/node_modules/@xterm/xterm/src/vs/base/common/map.ts +202 -0
  182. package/node_modules/@xterm/xterm/src/vs/base/common/numbers.ts +98 -0
  183. package/node_modules/@xterm/xterm/src/vs/base/common/observable.ts +76 -0
  184. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/api.ts +31 -0
  185. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/autorun.ts +281 -0
  186. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/base.ts +489 -0
  187. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/debugName.ts +145 -0
  188. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/derived.ts +428 -0
  189. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/lazyObservableValue.ts +146 -0
  190. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/logging.ts +328 -0
  191. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/promise.ts +209 -0
  192. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/utils.ts +610 -0
  193. package/node_modules/@xterm/xterm/src/vs/base/common/platform.ts +281 -0
  194. package/node_modules/@xterm/xterm/src/vs/base/common/scrollable.ts +522 -0
  195. package/node_modules/@xterm/xterm/src/vs/base/common/sequence.ts +34 -0
  196. package/node_modules/@xterm/xterm/src/vs/base/common/stopwatch.ts +43 -0
  197. package/node_modules/@xterm/xterm/src/vs/base/common/strings.ts +557 -0
  198. package/node_modules/@xterm/xterm/src/vs/base/common/symbols.ts +9 -0
  199. package/node_modules/@xterm/xterm/src/vs/base/common/uint.ts +59 -0
  200. package/node_modules/@xterm/xterm/src/vs/patches/nls.ts +90 -0
  201. package/node_modules/@xterm/xterm/src/vs/typings/base-common.d.ts +20 -0
  202. package/node_modules/@xterm/xterm/src/vs/typings/require.d.ts +42 -0
  203. package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-nls.d.ts +36 -0
  204. package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-product.d.ts +33 -0
  205. package/node_modules/@xterm/xterm/typings/xterm.d.ts +1957 -0
  206. package/node_modules/node-addon-api/LICENSE.md +9 -0
  207. package/node_modules/node-addon-api/README.md +319 -0
  208. package/node_modules/node-addon-api/common.gypi +20 -0
  209. package/node_modules/node-addon-api/except.gypi +25 -0
  210. package/node_modules/node-addon-api/index.js +12 -0
  211. package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
  212. package/node_modules/node-addon-api/napi-inl.h +6607 -0
  213. package/node_modules/node-addon-api/napi.h +3201 -0
  214. package/node_modules/node-addon-api/node_addon_api.gyp +32 -0
  215. package/node_modules/node-addon-api/node_api.gyp +9 -0
  216. package/node_modules/node-addon-api/noexcept.gypi +26 -0
  217. package/node_modules/node-addon-api/nothing.c +0 -0
  218. package/node_modules/node-addon-api/package-support.json +21 -0
  219. package/node_modules/node-addon-api/package.json +480 -0
  220. package/node_modules/node-addon-api/tools/README.md +73 -0
  221. package/node_modules/node-addon-api/tools/check-napi.js +99 -0
  222. package/node_modules/node-addon-api/tools/clang-format.js +71 -0
  223. package/node_modules/node-addon-api/tools/conversion.js +301 -0
  224. package/node_modules/node-addon-api/tools/eslint-format.js +79 -0
  225. package/node_modules/node-pty/LICENSE +69 -0
  226. package/node_modules/node-pty/README.md +164 -0
  227. package/node_modules/node-pty/binding.gyp +150 -0
  228. package/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  229. package/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  230. package/node_modules/node-pty/lib/index.js +52 -0
  231. package/node_modules/node-pty/lib/interfaces.js +7 -0
  232. package/node_modules/node-pty/lib/shared/conout.js +10 -0
  233. package/node_modules/node-pty/lib/terminal.js +190 -0
  234. package/node_modules/node-pty/lib/types.js +7 -0
  235. package/node_modules/node-pty/lib/unixTerminal.js +351 -0
  236. package/node_modules/node-pty/lib/utils.js +38 -0
  237. package/node_modules/node-pty/lib/windowsConoutConnection.js +131 -0
  238. package/node_modules/node-pty/lib/windowsPtyAgent.js +344 -0
  239. package/node_modules/node-pty/lib/windowsTerminal.js +209 -0
  240. package/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  241. package/node_modules/node-pty/package.json +66 -0
  242. package/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  243. package/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  244. package/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  245. package/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  246. package/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  247. package/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  248. package/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  249. package/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  250. package/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  251. package/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  252. package/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  253. package/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  254. package/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  255. package/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  256. package/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  257. package/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  258. package/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  259. package/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  260. package/node_modules/node-pty/scripts/post-install.js +76 -0
  261. package/node_modules/node-pty/scripts/prebuild.js +34 -0
  262. package/node_modules/node-pty/src/unix/pty.cc +876 -0
  263. package/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  264. package/node_modules/node-pty/src/win/conpty.cc +616 -0
  265. package/node_modules/node-pty/src/win/conpty.h +41 -0
  266. package/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  267. package/node_modules/node-pty/src/win/path_util.cc +95 -0
  268. package/node_modules/node-pty/src/win/path_util.h +26 -0
  269. package/node_modules/node-pty/third_party/conpty/1.25.260303002/win10-arm64/OpenConsole.exe +0 -0
  270. package/node_modules/node-pty/third_party/conpty/1.25.260303002/win10-arm64/conpty.dll +0 -0
  271. package/node_modules/node-pty/third_party/conpty/1.25.260303002/win10-x64/OpenConsole.exe +0 -0
  272. package/node_modules/node-pty/third_party/conpty/1.25.260303002/win10-x64/conpty.dll +0 -0
  273. package/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  274. package/node_modules/ws/LICENSE +20 -0
  275. package/node_modules/ws/README.md +548 -0
  276. package/node_modules/ws/browser.js +8 -0
  277. package/node_modules/ws/index.js +22 -0
  278. package/node_modules/ws/lib/buffer-util.js +131 -0
  279. package/node_modules/ws/lib/constants.js +19 -0
  280. package/node_modules/ws/lib/event-target.js +292 -0
  281. package/node_modules/ws/lib/extension.js +203 -0
  282. package/node_modules/ws/lib/limiter.js +55 -0
  283. package/node_modules/ws/lib/permessage-deflate.js +530 -0
  284. package/node_modules/ws/lib/receiver.js +743 -0
  285. package/node_modules/ws/lib/sender.js +607 -0
  286. package/node_modules/ws/lib/stream.js +161 -0
  287. package/node_modules/ws/lib/subprotocol.js +62 -0
  288. package/node_modules/ws/lib/validation.js +152 -0
  289. package/node_modules/ws/lib/websocket-server.js +562 -0
  290. package/node_modules/ws/lib/websocket.js +1421 -0
  291. package/node_modules/ws/package.json +74 -0
  292. package/node_modules/ws/wrapper.mjs +21 -0
  293. package/package.json +52 -0
  294. package/src/manager/command-resolver.mjs +140 -0
  295. package/src/manager/config.mjs +94 -0
  296. package/src/manager/install-channels.mjs +268 -0
  297. package/src/manager/main.mjs +136 -0
  298. package/src/manager/providers.mjs +601 -0
  299. package/src/manager/report-shims.mjs +104 -0
  300. package/src/manager/server.mjs +421 -0
  301. package/src/manager/session-manager.mjs +306 -0
  302. package/src/manager/session.mjs +531 -0
  303. package/src/manager/shell-env.mjs +150 -0
  304. package/src/manager/usage.mjs +535 -0
  305. package/src/manager/versions.mjs +62 -0
  306. package/src/report/hooks.mjs +150 -0
  307. package/web/app.js +916 -0
  308. package/web/art/art.css +186 -0
  309. package/web/art/characters/anthropic/idle.png +0 -0
  310. package/web/art/characters/anthropic/locked.png +0 -0
  311. package/web/art/characters/anthropic/working.png +0 -0
  312. package/web/art/characters/google/idle.png +0 -0
  313. package/web/art/characters/google/locked.png +0 -0
  314. package/web/art/characters/google/working.png +0 -0
  315. package/web/art/characters/openai/idle.png +0 -0
  316. package/web/art/characters/openai/locked.png +0 -0
  317. package/web/art/characters/openai/working.png +0 -0
  318. package/web/art/characters/shell/idle.png +0 -0
  319. package/web/art/characters/shell/locked.png +0 -0
  320. package/web/art/characters/shell/working.png +0 -0
  321. package/web/art/characters/xai/idle.png +0 -0
  322. package/web/art/characters/xai/locked.png +0 -0
  323. package/web/art/characters/xai/working.png +0 -0
  324. package/web/art/familiars/aether.png +0 -0
  325. package/web/art/familiars/flame.png +0 -0
  326. package/web/art/familiars/leaf.png +0 -0
  327. package/web/art/familiars/night.png +0 -0
  328. package/web/art/icons/anthropic.png +0 -0
  329. package/web/art/icons/google.png +0 -0
  330. package/web/art/icons/openai.png +0 -0
  331. package/web/art/icons/shell.png +0 -0
  332. package/web/art/icons/xai.png +0 -0
  333. package/web/art/page.png +0 -0
  334. package/web/art/ui/frame.png +0 -0
  335. package/web/art/ui/gem-mana.png +0 -0
  336. package/web/art/ui/gem-vitality.png +0 -0
  337. package/web/art/ui/guild-crest.png +0 -0
  338. package/web/art/ui/level-medallion.png +0 -0
  339. package/web/art/ui/padlock.png +0 -0
  340. package/web/icons/README.md +8 -0
  341. package/web/index.html +154 -0
  342. package/web/styles.css +226 -0
@@ -0,0 +1,1421 @@
1
+ /* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Duplex|Readable$", "caughtErrors": "none" }] */
2
+
3
+ 'use strict';
4
+
5
+ const EventEmitter = require('events');
6
+ const https = require('https');
7
+ const http = require('http');
8
+ const net = require('net');
9
+ const tls = require('tls');
10
+ const { randomBytes, createHash } = require('crypto');
11
+ const { Duplex, Readable } = require('stream');
12
+ const { URL } = require('url');
13
+
14
+ const PerMessageDeflate = require('./permessage-deflate');
15
+ const Receiver = require('./receiver');
16
+ const Sender = require('./sender');
17
+ const { isBlob } = require('./validation');
18
+
19
+ const {
20
+ BINARY_TYPES,
21
+ CLOSE_TIMEOUT,
22
+ EMPTY_BUFFER,
23
+ GUID,
24
+ kForOnEventAttribute,
25
+ kListener,
26
+ kStatusCode,
27
+ kWebSocket,
28
+ NOOP
29
+ } = require('./constants');
30
+ const {
31
+ EventTarget: { addEventListener, removeEventListener }
32
+ } = require('./event-target');
33
+ const { format, parse } = require('./extension');
34
+ const { toBuffer } = require('./buffer-util');
35
+
36
+ const kAborted = Symbol('kAborted');
37
+ const protocolVersions = [8, 13];
38
+ const readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];
39
+ const subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;
40
+
41
+ /**
42
+ * Class representing a WebSocket.
43
+ *
44
+ * @extends EventEmitter
45
+ */
46
+ class WebSocket extends EventEmitter {
47
+ /**
48
+ * Create a new `WebSocket`.
49
+ *
50
+ * @param {(String|URL)} address The URL to which to connect
51
+ * @param {(String|String[])} [protocols] The subprotocols
52
+ * @param {Object} [options] Connection options
53
+ */
54
+ constructor(address, protocols, options) {
55
+ super();
56
+
57
+ this._binaryType = BINARY_TYPES[0];
58
+ this._closeCode = 1006;
59
+ this._closeFrameReceived = false;
60
+ this._closeFrameSent = false;
61
+ this._closeMessage = EMPTY_BUFFER;
62
+ this._closeTimer = null;
63
+ this._errorEmitted = false;
64
+ this._extensions = {};
65
+ this._paused = false;
66
+ this._protocol = '';
67
+ this._readyState = WebSocket.CONNECTING;
68
+ this._receiver = null;
69
+ this._sender = null;
70
+ this._socket = null;
71
+
72
+ if (address !== null) {
73
+ this._bufferedAmount = 0;
74
+ this._isServer = false;
75
+ this._redirects = 0;
76
+
77
+ if (protocols === undefined) {
78
+ if (!options || options.protocols === undefined) {
79
+ protocols = [];
80
+ } else if (Array.isArray(options.protocols)) {
81
+ protocols = options.protocols;
82
+ } else {
83
+ protocols = [options.protocols];
84
+ }
85
+ } else if (!Array.isArray(protocols)) {
86
+ if (typeof protocols === 'object' && protocols !== null) {
87
+ options = protocols;
88
+
89
+ if (options.protocols === undefined) {
90
+ protocols = [];
91
+ } else if (Array.isArray(options.protocols)) {
92
+ protocols = options.protocols;
93
+ } else {
94
+ protocols = [options.protocols];
95
+ }
96
+ } else {
97
+ protocols = [protocols];
98
+ }
99
+ }
100
+
101
+ initAsClient(this, address, protocols, options);
102
+ } else {
103
+ this._autoPong = options.autoPong;
104
+ this._closeTimeout = options.closeTimeout;
105
+ this._isServer = true;
106
+ }
107
+ }
108
+
109
+ /**
110
+ * For historical reasons, the custom "nodebuffer" type is used by the default
111
+ * instead of "blob".
112
+ *
113
+ * @type {String}
114
+ */
115
+ get binaryType() {
116
+ return this._binaryType;
117
+ }
118
+
119
+ set binaryType(type) {
120
+ if (!BINARY_TYPES.includes(type)) return;
121
+
122
+ this._binaryType = type;
123
+
124
+ //
125
+ // Allow to change `binaryType` on the fly.
126
+ //
127
+ if (this._receiver) this._receiver._binaryType = type;
128
+ }
129
+
130
+ /**
131
+ * @type {Number}
132
+ */
133
+ get bufferedAmount() {
134
+ if (!this._socket) return this._bufferedAmount;
135
+
136
+ return this._socket._writableState.length + this._sender._bufferedBytes;
137
+ }
138
+
139
+ /**
140
+ * @type {String}
141
+ */
142
+ get extensions() {
143
+ return Object.keys(this._extensions).join();
144
+ }
145
+
146
+ /**
147
+ * @type {Boolean}
148
+ */
149
+ get isPaused() {
150
+ return this._paused;
151
+ }
152
+
153
+ /**
154
+ * @type {Function}
155
+ */
156
+ /* istanbul ignore next */
157
+ get onclose() {
158
+ return null;
159
+ }
160
+
161
+ /**
162
+ * @type {Function}
163
+ */
164
+ /* istanbul ignore next */
165
+ get onerror() {
166
+ return null;
167
+ }
168
+
169
+ /**
170
+ * @type {Function}
171
+ */
172
+ /* istanbul ignore next */
173
+ get onopen() {
174
+ return null;
175
+ }
176
+
177
+ /**
178
+ * @type {Function}
179
+ */
180
+ /* istanbul ignore next */
181
+ get onmessage() {
182
+ return null;
183
+ }
184
+
185
+ /**
186
+ * @type {String}
187
+ */
188
+ get protocol() {
189
+ return this._protocol;
190
+ }
191
+
192
+ /**
193
+ * @type {Number}
194
+ */
195
+ get readyState() {
196
+ return this._readyState;
197
+ }
198
+
199
+ /**
200
+ * @type {String}
201
+ */
202
+ get url() {
203
+ return this._url;
204
+ }
205
+
206
+ /**
207
+ * Set up the socket and the internal resources.
208
+ *
209
+ * @param {Duplex} socket The network socket between the server and client
210
+ * @param {Buffer} head The first packet of the upgraded stream
211
+ * @param {Object} options Options object
212
+ * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether
213
+ * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted
214
+ * multiple times in the same tick
215
+ * @param {Function} [options.generateMask] The function used to generate the
216
+ * masking key
217
+ * @param {Number} [options.maxBufferedChunks=0] The maximum number of
218
+ * buffered data chunks
219
+ * @param {Number} [options.maxFragments=0] The maximum number of message
220
+ * fragments
221
+ * @param {Number} [options.maxPayload=0] The maximum allowed message size
222
+ * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
223
+ * not to skip UTF-8 validation for text and close messages
224
+ * @private
225
+ */
226
+ setSocket(socket, head, options) {
227
+ const receiver = new Receiver({
228
+ allowSynchronousEvents: options.allowSynchronousEvents,
229
+ binaryType: this.binaryType,
230
+ extensions: this._extensions,
231
+ isServer: this._isServer,
232
+ maxBufferedChunks: options.maxBufferedChunks,
233
+ maxFragments: options.maxFragments,
234
+ maxPayload: options.maxPayload,
235
+ skipUTF8Validation: options.skipUTF8Validation
236
+ });
237
+
238
+ const sender = new Sender(socket, this._extensions, options.generateMask);
239
+
240
+ this._receiver = receiver;
241
+ this._sender = sender;
242
+ this._socket = socket;
243
+
244
+ receiver[kWebSocket] = this;
245
+ sender[kWebSocket] = this;
246
+ socket[kWebSocket] = this;
247
+
248
+ receiver.on('conclude', receiverOnConclude);
249
+ receiver.on('drain', receiverOnDrain);
250
+ receiver.on('error', receiverOnError);
251
+ receiver.on('message', receiverOnMessage);
252
+ receiver.on('ping', receiverOnPing);
253
+ receiver.on('pong', receiverOnPong);
254
+
255
+ sender.onerror = senderOnError;
256
+
257
+ //
258
+ // These methods may not be available if `socket` is just a `Duplex`.
259
+ //
260
+ if (socket.setTimeout) socket.setTimeout(0);
261
+ if (socket.setNoDelay) socket.setNoDelay();
262
+
263
+ if (head.length > 0) socket.unshift(head);
264
+
265
+ socket.on('close', socketOnClose);
266
+ socket.on('data', socketOnData);
267
+ socket.on('end', socketOnEnd);
268
+ socket.on('error', socketOnError);
269
+
270
+ this._readyState = WebSocket.OPEN;
271
+ this.emit('open');
272
+ }
273
+
274
+ /**
275
+ * Emit the `'close'` event.
276
+ *
277
+ * @private
278
+ */
279
+ emitClose() {
280
+ if (!this._socket) {
281
+ this._readyState = WebSocket.CLOSED;
282
+ this.emit('close', this._closeCode, this._closeMessage);
283
+ return;
284
+ }
285
+
286
+ if (this._extensions[PerMessageDeflate.extensionName]) {
287
+ this._extensions[PerMessageDeflate.extensionName].cleanup();
288
+ }
289
+
290
+ this._receiver.removeAllListeners();
291
+ this._readyState = WebSocket.CLOSED;
292
+ this.emit('close', this._closeCode, this._closeMessage);
293
+ }
294
+
295
+ /**
296
+ * Start a closing handshake.
297
+ *
298
+ * +----------+ +-----------+ +----------+
299
+ * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -
300
+ * | +----------+ +-----------+ +----------+ |
301
+ * +----------+ +-----------+ |
302
+ * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING
303
+ * +----------+ +-----------+ |
304
+ * | | | +---+ |
305
+ * +------------------------+-->|fin| - - - -
306
+ * | +---+ | +---+
307
+ * - - - - -|fin|<---------------------+
308
+ * +---+
309
+ *
310
+ * @param {Number} [code] Status code explaining why the connection is closing
311
+ * @param {(String|Buffer)} [data] The reason why the connection is
312
+ * closing
313
+ * @public
314
+ */
315
+ close(code, data) {
316
+ if (this.readyState === WebSocket.CLOSED) return;
317
+ if (this.readyState === WebSocket.CONNECTING) {
318
+ const msg = 'WebSocket was closed before the connection was established';
319
+ abortHandshake(this, this._req, msg);
320
+ return;
321
+ }
322
+
323
+ if (this.readyState === WebSocket.CLOSING) {
324
+ if (
325
+ this._closeFrameSent &&
326
+ (this._closeFrameReceived || this._receiver._writableState.errorEmitted)
327
+ ) {
328
+ this._socket.end();
329
+ }
330
+
331
+ return;
332
+ }
333
+
334
+ this._sender.close(code, data, !this._isServer, (err) => {
335
+ //
336
+ // This error is handled by the `'error'` listener on the socket. We only
337
+ // want to know if the close frame has been sent here.
338
+ //
339
+ if (err) return;
340
+
341
+ this._closeFrameSent = true;
342
+
343
+ if (
344
+ this._closeFrameReceived ||
345
+ this._receiver._writableState.errorEmitted
346
+ ) {
347
+ this._socket.end();
348
+ }
349
+ });
350
+
351
+ this._readyState = WebSocket.CLOSING;
352
+ setCloseTimer(this);
353
+ }
354
+
355
+ /**
356
+ * Pause the socket.
357
+ *
358
+ * @public
359
+ */
360
+ pause() {
361
+ if (
362
+ this.readyState === WebSocket.CONNECTING ||
363
+ this.readyState === WebSocket.CLOSED
364
+ ) {
365
+ return;
366
+ }
367
+
368
+ this._paused = true;
369
+ this._socket.pause();
370
+ }
371
+
372
+ /**
373
+ * Send a ping.
374
+ *
375
+ * @param {*} [data] The data to send
376
+ * @param {Boolean} [mask] Indicates whether or not to mask `data`
377
+ * @param {Function} [cb] Callback which is executed when the ping is sent
378
+ * @public
379
+ */
380
+ ping(data, mask, cb) {
381
+ if (this.readyState === WebSocket.CONNECTING) {
382
+ throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
383
+ }
384
+
385
+ if (typeof data === 'function') {
386
+ cb = data;
387
+ data = mask = undefined;
388
+ } else if (typeof mask === 'function') {
389
+ cb = mask;
390
+ mask = undefined;
391
+ }
392
+
393
+ if (typeof data === 'number') data = data.toString();
394
+
395
+ if (this.readyState !== WebSocket.OPEN) {
396
+ sendAfterClose(this, data, cb);
397
+ return;
398
+ }
399
+
400
+ if (mask === undefined) mask = !this._isServer;
401
+ this._sender.ping(data || EMPTY_BUFFER, mask, cb);
402
+ }
403
+
404
+ /**
405
+ * Send a pong.
406
+ *
407
+ * @param {*} [data] The data to send
408
+ * @param {Boolean} [mask] Indicates whether or not to mask `data`
409
+ * @param {Function} [cb] Callback which is executed when the pong is sent
410
+ * @public
411
+ */
412
+ pong(data, mask, cb) {
413
+ if (this.readyState === WebSocket.CONNECTING) {
414
+ throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
415
+ }
416
+
417
+ if (typeof data === 'function') {
418
+ cb = data;
419
+ data = mask = undefined;
420
+ } else if (typeof mask === 'function') {
421
+ cb = mask;
422
+ mask = undefined;
423
+ }
424
+
425
+ if (typeof data === 'number') data = data.toString();
426
+
427
+ if (this.readyState !== WebSocket.OPEN) {
428
+ sendAfterClose(this, data, cb);
429
+ return;
430
+ }
431
+
432
+ if (mask === undefined) mask = !this._isServer;
433
+ this._sender.pong(data || EMPTY_BUFFER, mask, cb);
434
+ }
435
+
436
+ /**
437
+ * Resume the socket.
438
+ *
439
+ * @public
440
+ */
441
+ resume() {
442
+ if (
443
+ this.readyState === WebSocket.CONNECTING ||
444
+ this.readyState === WebSocket.CLOSED
445
+ ) {
446
+ return;
447
+ }
448
+
449
+ this._paused = false;
450
+ if (!this._receiver._writableState.needDrain) this._socket.resume();
451
+ }
452
+
453
+ /**
454
+ * Send a data message.
455
+ *
456
+ * @param {*} data The message to send
457
+ * @param {Object} [options] Options object
458
+ * @param {Boolean} [options.binary] Specifies whether `data` is binary or
459
+ * text
460
+ * @param {Boolean} [options.compress] Specifies whether or not to compress
461
+ * `data`
462
+ * @param {Boolean} [options.fin=true] Specifies whether the fragment is the
463
+ * last one
464
+ * @param {Boolean} [options.mask] Specifies whether or not to mask `data`
465
+ * @param {Function} [cb] Callback which is executed when data is written out
466
+ * @public
467
+ */
468
+ send(data, options, cb) {
469
+ if (this.readyState === WebSocket.CONNECTING) {
470
+ throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
471
+ }
472
+
473
+ if (typeof options === 'function') {
474
+ cb = options;
475
+ options = {};
476
+ }
477
+
478
+ if (typeof data === 'number') data = data.toString();
479
+
480
+ if (this.readyState !== WebSocket.OPEN) {
481
+ sendAfterClose(this, data, cb);
482
+ return;
483
+ }
484
+
485
+ const opts = {
486
+ binary: typeof data !== 'string',
487
+ mask: !this._isServer,
488
+ compress: true,
489
+ fin: true,
490
+ ...options
491
+ };
492
+
493
+ if (!this._extensions[PerMessageDeflate.extensionName]) {
494
+ opts.compress = false;
495
+ }
496
+
497
+ this._sender.send(data || EMPTY_BUFFER, opts, cb);
498
+ }
499
+
500
+ /**
501
+ * Forcibly close the connection.
502
+ *
503
+ * @public
504
+ */
505
+ terminate() {
506
+ if (this.readyState === WebSocket.CLOSED) return;
507
+ if (this.readyState === WebSocket.CONNECTING) {
508
+ const msg = 'WebSocket was closed before the connection was established';
509
+ abortHandshake(this, this._req, msg);
510
+ return;
511
+ }
512
+
513
+ if (this._socket) {
514
+ this._readyState = WebSocket.CLOSING;
515
+ this._socket.destroy();
516
+ }
517
+ }
518
+ }
519
+
520
+ /**
521
+ * @constant {Number} CONNECTING
522
+ * @memberof WebSocket
523
+ */
524
+ Object.defineProperty(WebSocket, 'CONNECTING', {
525
+ enumerable: true,
526
+ value: readyStates.indexOf('CONNECTING')
527
+ });
528
+
529
+ /**
530
+ * @constant {Number} CONNECTING
531
+ * @memberof WebSocket.prototype
532
+ */
533
+ Object.defineProperty(WebSocket.prototype, 'CONNECTING', {
534
+ enumerable: true,
535
+ value: readyStates.indexOf('CONNECTING')
536
+ });
537
+
538
+ /**
539
+ * @constant {Number} OPEN
540
+ * @memberof WebSocket
541
+ */
542
+ Object.defineProperty(WebSocket, 'OPEN', {
543
+ enumerable: true,
544
+ value: readyStates.indexOf('OPEN')
545
+ });
546
+
547
+ /**
548
+ * @constant {Number} OPEN
549
+ * @memberof WebSocket.prototype
550
+ */
551
+ Object.defineProperty(WebSocket.prototype, 'OPEN', {
552
+ enumerable: true,
553
+ value: readyStates.indexOf('OPEN')
554
+ });
555
+
556
+ /**
557
+ * @constant {Number} CLOSING
558
+ * @memberof WebSocket
559
+ */
560
+ Object.defineProperty(WebSocket, 'CLOSING', {
561
+ enumerable: true,
562
+ value: readyStates.indexOf('CLOSING')
563
+ });
564
+
565
+ /**
566
+ * @constant {Number} CLOSING
567
+ * @memberof WebSocket.prototype
568
+ */
569
+ Object.defineProperty(WebSocket.prototype, 'CLOSING', {
570
+ enumerable: true,
571
+ value: readyStates.indexOf('CLOSING')
572
+ });
573
+
574
+ /**
575
+ * @constant {Number} CLOSED
576
+ * @memberof WebSocket
577
+ */
578
+ Object.defineProperty(WebSocket, 'CLOSED', {
579
+ enumerable: true,
580
+ value: readyStates.indexOf('CLOSED')
581
+ });
582
+
583
+ /**
584
+ * @constant {Number} CLOSED
585
+ * @memberof WebSocket.prototype
586
+ */
587
+ Object.defineProperty(WebSocket.prototype, 'CLOSED', {
588
+ enumerable: true,
589
+ value: readyStates.indexOf('CLOSED')
590
+ });
591
+
592
+ [
593
+ 'binaryType',
594
+ 'bufferedAmount',
595
+ 'extensions',
596
+ 'isPaused',
597
+ 'protocol',
598
+ 'readyState',
599
+ 'url'
600
+ ].forEach((property) => {
601
+ Object.defineProperty(WebSocket.prototype, property, { enumerable: true });
602
+ });
603
+
604
+ //
605
+ // Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.
606
+ // See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface
607
+ //
608
+ ['open', 'error', 'close', 'message'].forEach((method) => {
609
+ Object.defineProperty(WebSocket.prototype, `on${method}`, {
610
+ enumerable: true,
611
+ get() {
612
+ for (const listener of this.listeners(method)) {
613
+ if (listener[kForOnEventAttribute]) return listener[kListener];
614
+ }
615
+
616
+ return null;
617
+ },
618
+ set(handler) {
619
+ for (const listener of this.listeners(method)) {
620
+ if (listener[kForOnEventAttribute]) {
621
+ this.removeListener(method, listener);
622
+ break;
623
+ }
624
+ }
625
+
626
+ if (typeof handler !== 'function') return;
627
+
628
+ this.addEventListener(method, handler, {
629
+ [kForOnEventAttribute]: true
630
+ });
631
+ }
632
+ });
633
+ });
634
+
635
+ WebSocket.prototype.addEventListener = addEventListener;
636
+ WebSocket.prototype.removeEventListener = removeEventListener;
637
+
638
+ module.exports = WebSocket;
639
+
640
+ /**
641
+ * Initialize a WebSocket client.
642
+ *
643
+ * @param {WebSocket} websocket The client to initialize
644
+ * @param {(String|URL)} address The URL to which to connect
645
+ * @param {Array} protocols The subprotocols
646
+ * @param {Object} [options] Connection options
647
+ * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any
648
+ * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple
649
+ * times in the same tick
650
+ * @param {Boolean} [options.autoPong=true] Specifies whether or not to
651
+ * automatically send a pong in response to a ping
652
+ * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to wait
653
+ * for the closing handshake to finish after `websocket.close()` is called
654
+ * @param {Function} [options.finishRequest] A function which can be used to
655
+ * customize the headers of each http request before it is sent
656
+ * @param {Boolean} [options.followRedirects=false] Whether or not to follow
657
+ * redirects
658
+ * @param {Function} [options.generateMask] The function used to generate the
659
+ * masking key
660
+ * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the
661
+ * handshake request
662
+ * @param {Number} [options.maxBufferedChunks=262144] The maximum number of
663
+ * buffered data chunks
664
+ * @param {Number} [options.maxFragments=16384] The maximum number of message
665
+ * fragments
666
+ * @param {Number} [options.maxPayload=104857600] The maximum allowed message
667
+ * size
668
+ * @param {Number} [options.maxRedirects=10] The maximum number of redirects
669
+ * allowed
670
+ * @param {String} [options.origin] Value of the `Origin` or
671
+ * `Sec-WebSocket-Origin` header
672
+ * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable
673
+ * permessage-deflate
674
+ * @param {Number} [options.protocolVersion=13] Value of the
675
+ * `Sec-WebSocket-Version` header
676
+ * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
677
+ * not to skip UTF-8 validation for text and close messages
678
+ * @private
679
+ */
680
+ function initAsClient(websocket, address, protocols, options) {
681
+ const opts = {
682
+ allowSynchronousEvents: true,
683
+ autoPong: true,
684
+ closeTimeout: CLOSE_TIMEOUT,
685
+ protocolVersion: protocolVersions[1],
686
+ maxBufferedChunks: 256 * 1024,
687
+ maxFragments: 16 * 1024,
688
+ maxPayload: 100 * 1024 * 1024,
689
+ skipUTF8Validation: false,
690
+ perMessageDeflate: true,
691
+ followRedirects: false,
692
+ maxRedirects: 10,
693
+ ...options,
694
+ socketPath: undefined,
695
+ hostname: undefined,
696
+ protocol: undefined,
697
+ protocols: undefined,
698
+ timeout: undefined,
699
+ method: 'GET',
700
+ host: undefined,
701
+ path: undefined,
702
+ port: undefined
703
+ };
704
+
705
+ websocket._autoPong = opts.autoPong;
706
+ websocket._closeTimeout = opts.closeTimeout;
707
+
708
+ if (!protocolVersions.includes(opts.protocolVersion)) {
709
+ throw new RangeError(
710
+ `Unsupported protocol version: ${opts.protocolVersion} ` +
711
+ `(supported versions: ${protocolVersions.join(', ')})`
712
+ );
713
+ }
714
+
715
+ let parsedUrl;
716
+
717
+ if (address instanceof URL) {
718
+ parsedUrl = address;
719
+ } else {
720
+ try {
721
+ parsedUrl = new URL(address);
722
+ } catch {
723
+ throw new SyntaxError(`Invalid URL: ${address}`);
724
+ }
725
+ }
726
+
727
+ if (parsedUrl.protocol === 'http:') {
728
+ parsedUrl.protocol = 'ws:';
729
+ } else if (parsedUrl.protocol === 'https:') {
730
+ parsedUrl.protocol = 'wss:';
731
+ }
732
+
733
+ websocket._url = parsedUrl.href;
734
+
735
+ const isSecure = parsedUrl.protocol === 'wss:';
736
+ const isIpcUrl = parsedUrl.protocol === 'ws+unix:';
737
+ let invalidUrlMessage;
738
+
739
+ if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {
740
+ invalidUrlMessage =
741
+ 'The URL\'s protocol must be one of "ws:", "wss:", ' +
742
+ '"http:", "https:", or "ws+unix:"';
743
+ } else if (isIpcUrl && !parsedUrl.pathname) {
744
+ invalidUrlMessage = "The URL's pathname is empty";
745
+ } else if (parsedUrl.hash) {
746
+ invalidUrlMessage = 'The URL contains a fragment identifier';
747
+ }
748
+
749
+ if (invalidUrlMessage) {
750
+ const err = new SyntaxError(invalidUrlMessage);
751
+
752
+ if (websocket._redirects === 0) {
753
+ throw err;
754
+ } else {
755
+ emitErrorAndClose(websocket, err);
756
+ return;
757
+ }
758
+ }
759
+
760
+ const defaultPort = isSecure ? 443 : 80;
761
+ const key = randomBytes(16).toString('base64');
762
+ const request = isSecure ? https.request : http.request;
763
+ const protocolSet = new Set();
764
+ let perMessageDeflate;
765
+
766
+ opts.createConnection =
767
+ opts.createConnection || (isSecure ? tlsConnect : netConnect);
768
+ opts.defaultPort = opts.defaultPort || defaultPort;
769
+ opts.port = parsedUrl.port || defaultPort;
770
+ opts.host = parsedUrl.hostname.startsWith('[')
771
+ ? parsedUrl.hostname.slice(1, -1)
772
+ : parsedUrl.hostname;
773
+ opts.headers = {
774
+ ...opts.headers,
775
+ 'Sec-WebSocket-Version': opts.protocolVersion,
776
+ 'Sec-WebSocket-Key': key,
777
+ Connection: 'Upgrade',
778
+ Upgrade: 'websocket'
779
+ };
780
+ opts.path = parsedUrl.pathname + parsedUrl.search;
781
+ opts.timeout = opts.handshakeTimeout;
782
+
783
+ if (opts.perMessageDeflate) {
784
+ perMessageDeflate = new PerMessageDeflate({
785
+ ...opts.perMessageDeflate,
786
+ isServer: false,
787
+ maxPayload: opts.maxPayload
788
+ });
789
+ opts.headers['Sec-WebSocket-Extensions'] = format({
790
+ [PerMessageDeflate.extensionName]: perMessageDeflate.offer()
791
+ });
792
+ }
793
+ if (protocols.length) {
794
+ for (const protocol of protocols) {
795
+ if (
796
+ typeof protocol !== 'string' ||
797
+ !subprotocolRegex.test(protocol) ||
798
+ protocolSet.has(protocol)
799
+ ) {
800
+ throw new SyntaxError(
801
+ 'An invalid or duplicated subprotocol was specified'
802
+ );
803
+ }
804
+
805
+ protocolSet.add(protocol);
806
+ }
807
+
808
+ opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');
809
+ }
810
+ if (opts.origin) {
811
+ if (opts.protocolVersion < 13) {
812
+ opts.headers['Sec-WebSocket-Origin'] = opts.origin;
813
+ } else {
814
+ opts.headers.Origin = opts.origin;
815
+ }
816
+ }
817
+ if (parsedUrl.username || parsedUrl.password) {
818
+ opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;
819
+ }
820
+
821
+ if (isIpcUrl) {
822
+ const parts = opts.path.split(':');
823
+
824
+ opts.socketPath = parts[0];
825
+ opts.path = parts[1];
826
+ }
827
+
828
+ let req;
829
+
830
+ if (opts.followRedirects) {
831
+ if (websocket._redirects === 0) {
832
+ websocket._originalIpc = isIpcUrl;
833
+ websocket._originalSecure = isSecure;
834
+ websocket._originalHostOrSocketPath = isIpcUrl
835
+ ? opts.socketPath
836
+ : parsedUrl.host;
837
+
838
+ const headers = options && options.headers;
839
+
840
+ //
841
+ // Shallow copy the user provided options so that headers can be changed
842
+ // without mutating the original object.
843
+ //
844
+ options = { ...options, headers: {} };
845
+
846
+ if (headers) {
847
+ for (const [key, value] of Object.entries(headers)) {
848
+ options.headers[key.toLowerCase()] = value;
849
+ }
850
+ }
851
+ } else if (websocket.listenerCount('redirect') === 0) {
852
+ const isSameHost = isIpcUrl
853
+ ? websocket._originalIpc
854
+ ? opts.socketPath === websocket._originalHostOrSocketPath
855
+ : false
856
+ : websocket._originalIpc
857
+ ? false
858
+ : parsedUrl.host === websocket._originalHostOrSocketPath;
859
+
860
+ if (!isSameHost || (websocket._originalSecure && !isSecure)) {
861
+ //
862
+ // Match curl 7.77.0 behavior and drop the following headers. These
863
+ // headers are also dropped when following a redirect to a subdomain.
864
+ //
865
+ delete opts.headers.authorization;
866
+ delete opts.headers.cookie;
867
+
868
+ if (!isSameHost) delete opts.headers.host;
869
+
870
+ opts.auth = undefined;
871
+ }
872
+ }
873
+
874
+ //
875
+ // Match curl 7.77.0 behavior and make the first `Authorization` header win.
876
+ // If the `Authorization` header is set, then there is nothing to do as it
877
+ // will take precedence.
878
+ //
879
+ if (opts.auth && !options.headers.authorization) {
880
+ options.headers.authorization =
881
+ 'Basic ' + Buffer.from(opts.auth).toString('base64');
882
+ }
883
+
884
+ req = websocket._req = request(opts);
885
+
886
+ if (websocket._redirects) {
887
+ //
888
+ // Unlike what is done for the `'upgrade'` event, no early exit is
889
+ // triggered here if the user calls `websocket.close()` or
890
+ // `websocket.terminate()` from a listener of the `'redirect'` event. This
891
+ // is because the user can also call `request.destroy()` with an error
892
+ // before calling `websocket.close()` or `websocket.terminate()` and this
893
+ // would result in an error being emitted on the `request` object with no
894
+ // `'error'` event listeners attached.
895
+ //
896
+ websocket.emit('redirect', websocket.url, req);
897
+ }
898
+ } else {
899
+ req = websocket._req = request(opts);
900
+ }
901
+
902
+ if (opts.timeout) {
903
+ req.on('timeout', () => {
904
+ abortHandshake(websocket, req, 'Opening handshake has timed out');
905
+ });
906
+ }
907
+
908
+ req.on('error', (err) => {
909
+ if (req === null || req[kAborted]) return;
910
+
911
+ req = websocket._req = null;
912
+ emitErrorAndClose(websocket, err);
913
+ });
914
+
915
+ req.on('response', (res) => {
916
+ const location = res.headers.location;
917
+ const statusCode = res.statusCode;
918
+
919
+ if (
920
+ location &&
921
+ opts.followRedirects &&
922
+ statusCode >= 300 &&
923
+ statusCode < 400
924
+ ) {
925
+ if (++websocket._redirects > opts.maxRedirects) {
926
+ abortHandshake(websocket, req, 'Maximum redirects exceeded');
927
+ return;
928
+ }
929
+
930
+ req.abort();
931
+
932
+ let addr;
933
+
934
+ try {
935
+ addr = new URL(location, address);
936
+ } catch (e) {
937
+ const err = new SyntaxError(`Invalid URL: ${location}`);
938
+ emitErrorAndClose(websocket, err);
939
+ return;
940
+ }
941
+
942
+ initAsClient(websocket, addr, protocols, options);
943
+ } else if (!websocket.emit('unexpected-response', req, res)) {
944
+ abortHandshake(
945
+ websocket,
946
+ req,
947
+ `Unexpected server response: ${res.statusCode}`
948
+ );
949
+ }
950
+ });
951
+
952
+ req.on('upgrade', (res, socket, head) => {
953
+ websocket.emit('upgrade', res);
954
+
955
+ //
956
+ // The user may have closed the connection from a listener of the
957
+ // `'upgrade'` event.
958
+ //
959
+ if (websocket.readyState !== WebSocket.CONNECTING) return;
960
+
961
+ req = websocket._req = null;
962
+
963
+ const upgrade = res.headers.upgrade;
964
+
965
+ if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {
966
+ abortHandshake(websocket, socket, 'Invalid Upgrade header');
967
+ return;
968
+ }
969
+
970
+ const digest = createHash('sha1')
971
+ .update(key + GUID)
972
+ .digest('base64');
973
+
974
+ if (res.headers['sec-websocket-accept'] !== digest) {
975
+ abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');
976
+ return;
977
+ }
978
+
979
+ const serverProt = res.headers['sec-websocket-protocol'];
980
+ let protError;
981
+
982
+ if (serverProt !== undefined) {
983
+ if (!protocolSet.size) {
984
+ protError = 'Server sent a subprotocol but none was requested';
985
+ } else if (!protocolSet.has(serverProt)) {
986
+ protError = 'Server sent an invalid subprotocol';
987
+ }
988
+ } else if (protocolSet.size) {
989
+ protError = 'Server sent no subprotocol';
990
+ }
991
+
992
+ if (protError) {
993
+ abortHandshake(websocket, socket, protError);
994
+ return;
995
+ }
996
+
997
+ if (serverProt) websocket._protocol = serverProt;
998
+
999
+ const secWebSocketExtensions = res.headers['sec-websocket-extensions'];
1000
+
1001
+ if (secWebSocketExtensions !== undefined) {
1002
+ if (!perMessageDeflate) {
1003
+ const message =
1004
+ 'Server sent a Sec-WebSocket-Extensions header but no extension ' +
1005
+ 'was requested';
1006
+ abortHandshake(websocket, socket, message);
1007
+ return;
1008
+ }
1009
+
1010
+ let extensions;
1011
+
1012
+ try {
1013
+ extensions = parse(secWebSocketExtensions);
1014
+ } catch (err) {
1015
+ const message = 'Invalid Sec-WebSocket-Extensions header';
1016
+ abortHandshake(websocket, socket, message);
1017
+ return;
1018
+ }
1019
+
1020
+ const extensionNames = Object.keys(extensions);
1021
+
1022
+ if (
1023
+ extensionNames.length !== 1 ||
1024
+ extensionNames[0] !== PerMessageDeflate.extensionName
1025
+ ) {
1026
+ const message = 'Server indicated an extension that was not requested';
1027
+ abortHandshake(websocket, socket, message);
1028
+ return;
1029
+ }
1030
+
1031
+ try {
1032
+ perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);
1033
+ } catch (err) {
1034
+ const message = 'Invalid Sec-WebSocket-Extensions header';
1035
+ abortHandshake(websocket, socket, message);
1036
+ return;
1037
+ }
1038
+
1039
+ websocket._extensions[PerMessageDeflate.extensionName] =
1040
+ perMessageDeflate;
1041
+ }
1042
+
1043
+ websocket.setSocket(socket, head, {
1044
+ allowSynchronousEvents: opts.allowSynchronousEvents,
1045
+ generateMask: opts.generateMask,
1046
+ maxBufferedChunks: opts.maxBufferedChunks,
1047
+ maxFragments: opts.maxFragments,
1048
+ maxPayload: opts.maxPayload,
1049
+ skipUTF8Validation: opts.skipUTF8Validation
1050
+ });
1051
+ });
1052
+
1053
+ if (opts.finishRequest) {
1054
+ opts.finishRequest(req, websocket);
1055
+ } else {
1056
+ req.end();
1057
+ }
1058
+ }
1059
+
1060
+ /**
1061
+ * Emit the `'error'` and `'close'` events.
1062
+ *
1063
+ * @param {WebSocket} websocket The WebSocket instance
1064
+ * @param {Error} The error to emit
1065
+ * @private
1066
+ */
1067
+ function emitErrorAndClose(websocket, err) {
1068
+ websocket._readyState = WebSocket.CLOSING;
1069
+ //
1070
+ // The following assignment is practically useless and is done only for
1071
+ // consistency.
1072
+ //
1073
+ websocket._errorEmitted = true;
1074
+ websocket.emit('error', err);
1075
+ websocket.emitClose();
1076
+ }
1077
+
1078
+ /**
1079
+ * Create a `net.Socket` and initiate a connection.
1080
+ *
1081
+ * @param {Object} options Connection options
1082
+ * @return {net.Socket} The newly created socket used to start the connection
1083
+ * @private
1084
+ */
1085
+ function netConnect(options) {
1086
+ options.path = options.socketPath;
1087
+ return net.connect(options);
1088
+ }
1089
+
1090
+ /**
1091
+ * Create a `tls.TLSSocket` and initiate a connection.
1092
+ *
1093
+ * @param {Object} options Connection options
1094
+ * @return {tls.TLSSocket} The newly created socket used to start the connection
1095
+ * @private
1096
+ */
1097
+ function tlsConnect(options) {
1098
+ options.path = undefined;
1099
+
1100
+ if (!options.servername && options.servername !== '') {
1101
+ options.servername = net.isIP(options.host) ? '' : options.host;
1102
+ }
1103
+
1104
+ return tls.connect(options);
1105
+ }
1106
+
1107
+ /**
1108
+ * Abort the handshake and emit an error.
1109
+ *
1110
+ * @param {WebSocket} websocket The WebSocket instance
1111
+ * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to
1112
+ * abort or the socket to destroy
1113
+ * @param {String} message The error message
1114
+ * @private
1115
+ */
1116
+ function abortHandshake(websocket, stream, message) {
1117
+ websocket._readyState = WebSocket.CLOSING;
1118
+
1119
+ const err = new Error(message);
1120
+ Error.captureStackTrace(err, abortHandshake);
1121
+
1122
+ if (stream.setHeader) {
1123
+ stream[kAborted] = true;
1124
+ stream.abort();
1125
+
1126
+ if (stream.socket && !stream.socket.destroyed) {
1127
+ //
1128
+ // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if
1129
+ // called after the request completed. See
1130
+ // https://github.com/websockets/ws/issues/1869.
1131
+ //
1132
+ stream.socket.destroy();
1133
+ }
1134
+
1135
+ process.nextTick(emitErrorAndClose, websocket, err);
1136
+ } else {
1137
+ stream.destroy(err);
1138
+ stream.once('error', websocket.emit.bind(websocket, 'error'));
1139
+ stream.once('close', websocket.emitClose.bind(websocket));
1140
+ }
1141
+ }
1142
+
1143
+ /**
1144
+ * Handle cases where the `ping()`, `pong()`, or `send()` methods are called
1145
+ * when the `readyState` attribute is `CLOSING` or `CLOSED`.
1146
+ *
1147
+ * @param {WebSocket} websocket The WebSocket instance
1148
+ * @param {*} [data] The data to send
1149
+ * @param {Function} [cb] Callback
1150
+ * @private
1151
+ */
1152
+ function sendAfterClose(websocket, data, cb) {
1153
+ if (data) {
1154
+ const length = isBlob(data) ? data.size : toBuffer(data).length;
1155
+
1156
+ //
1157
+ // The `_bufferedAmount` property is used only when the peer is a client and
1158
+ // the opening handshake fails. Under these circumstances, in fact, the
1159
+ // `setSocket()` method is not called, so the `_socket` and `_sender`
1160
+ // properties are set to `null`.
1161
+ //
1162
+ if (websocket._socket) websocket._sender._bufferedBytes += length;
1163
+ else websocket._bufferedAmount += length;
1164
+ }
1165
+
1166
+ if (cb) {
1167
+ const err = new Error(
1168
+ `WebSocket is not open: readyState ${websocket.readyState} ` +
1169
+ `(${readyStates[websocket.readyState]})`
1170
+ );
1171
+ process.nextTick(cb, err);
1172
+ }
1173
+ }
1174
+
1175
+ /**
1176
+ * The listener of the `Receiver` `'conclude'` event.
1177
+ *
1178
+ * @param {Number} code The status code
1179
+ * @param {Buffer} reason The reason for closing
1180
+ * @private
1181
+ */
1182
+ function receiverOnConclude(code, reason) {
1183
+ const websocket = this[kWebSocket];
1184
+
1185
+ websocket._closeFrameReceived = true;
1186
+ websocket._closeMessage = reason;
1187
+ websocket._closeCode = code;
1188
+
1189
+ if (websocket._socket[kWebSocket] === undefined) return;
1190
+
1191
+ websocket._socket.removeListener('data', socketOnData);
1192
+ process.nextTick(resume, websocket._socket);
1193
+
1194
+ if (code === 1005) websocket.close();
1195
+ else websocket.close(code, reason);
1196
+ }
1197
+
1198
+ /**
1199
+ * The listener of the `Receiver` `'drain'` event.
1200
+ *
1201
+ * @private
1202
+ */
1203
+ function receiverOnDrain() {
1204
+ const websocket = this[kWebSocket];
1205
+
1206
+ if (!websocket.isPaused) websocket._socket.resume();
1207
+ }
1208
+
1209
+ /**
1210
+ * The listener of the `Receiver` `'error'` event.
1211
+ *
1212
+ * @param {(RangeError|Error)} err The emitted error
1213
+ * @private
1214
+ */
1215
+ function receiverOnError(err) {
1216
+ const websocket = this[kWebSocket];
1217
+
1218
+ if (websocket._socket[kWebSocket] !== undefined) {
1219
+ websocket._socket.removeListener('data', socketOnData);
1220
+
1221
+ //
1222
+ // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See
1223
+ // https://github.com/websockets/ws/issues/1940.
1224
+ //
1225
+ process.nextTick(resume, websocket._socket);
1226
+
1227
+ websocket.close(err[kStatusCode]);
1228
+ }
1229
+
1230
+ if (!websocket._errorEmitted) {
1231
+ websocket._errorEmitted = true;
1232
+ websocket.emit('error', err);
1233
+ }
1234
+ }
1235
+
1236
+ /**
1237
+ * The listener of the `Receiver` `'finish'` event.
1238
+ *
1239
+ * @private
1240
+ */
1241
+ function receiverOnFinish() {
1242
+ this[kWebSocket].emitClose();
1243
+ }
1244
+
1245
+ /**
1246
+ * The listener of the `Receiver` `'message'` event.
1247
+ *
1248
+ * @param {Buffer|ArrayBuffer|Buffer[])} data The message
1249
+ * @param {Boolean} isBinary Specifies whether the message is binary or not
1250
+ * @private
1251
+ */
1252
+ function receiverOnMessage(data, isBinary) {
1253
+ this[kWebSocket].emit('message', data, isBinary);
1254
+ }
1255
+
1256
+ /**
1257
+ * The listener of the `Receiver` `'ping'` event.
1258
+ *
1259
+ * @param {Buffer} data The data included in the ping frame
1260
+ * @private
1261
+ */
1262
+ function receiverOnPing(data) {
1263
+ const websocket = this[kWebSocket];
1264
+
1265
+ if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);
1266
+ websocket.emit('ping', data);
1267
+ }
1268
+
1269
+ /**
1270
+ * The listener of the `Receiver` `'pong'` event.
1271
+ *
1272
+ * @param {Buffer} data The data included in the pong frame
1273
+ * @private
1274
+ */
1275
+ function receiverOnPong(data) {
1276
+ this[kWebSocket].emit('pong', data);
1277
+ }
1278
+
1279
+ /**
1280
+ * Resume a readable stream
1281
+ *
1282
+ * @param {Readable} stream The readable stream
1283
+ * @private
1284
+ */
1285
+ function resume(stream) {
1286
+ stream.resume();
1287
+ }
1288
+
1289
+ /**
1290
+ * The `Sender` error event handler.
1291
+ *
1292
+ * @param {Error} The error
1293
+ * @private
1294
+ */
1295
+ function senderOnError(err) {
1296
+ const websocket = this[kWebSocket];
1297
+
1298
+ if (websocket.readyState === WebSocket.CLOSED) return;
1299
+ if (websocket.readyState === WebSocket.OPEN) {
1300
+ websocket._readyState = WebSocket.CLOSING;
1301
+ setCloseTimer(websocket);
1302
+ }
1303
+
1304
+ //
1305
+ // `socket.end()` is used instead of `socket.destroy()` to allow the other
1306
+ // peer to finish sending queued data. There is no need to set a timer here
1307
+ // because `CLOSING` means that it is already set or not needed.
1308
+ //
1309
+ this._socket.end();
1310
+
1311
+ if (!websocket._errorEmitted) {
1312
+ websocket._errorEmitted = true;
1313
+ websocket.emit('error', err);
1314
+ }
1315
+ }
1316
+
1317
+ /**
1318
+ * Set a timer to destroy the underlying raw socket of a WebSocket.
1319
+ *
1320
+ * @param {WebSocket} websocket The WebSocket instance
1321
+ * @private
1322
+ */
1323
+ function setCloseTimer(websocket) {
1324
+ websocket._closeTimer = setTimeout(
1325
+ websocket._socket.destroy.bind(websocket._socket),
1326
+ websocket._closeTimeout
1327
+ );
1328
+ }
1329
+
1330
+ /**
1331
+ * The listener of the socket `'close'` event.
1332
+ *
1333
+ * @private
1334
+ */
1335
+ function socketOnClose() {
1336
+ const websocket = this[kWebSocket];
1337
+
1338
+ this.removeListener('close', socketOnClose);
1339
+ this.removeListener('data', socketOnData);
1340
+ this.removeListener('end', socketOnEnd);
1341
+
1342
+ websocket._readyState = WebSocket.CLOSING;
1343
+
1344
+ //
1345
+ // The close frame might not have been received or the `'end'` event emitted,
1346
+ // for example, if the socket was destroyed due to an error. Ensure that the
1347
+ // `receiver` stream is closed after writing any remaining buffered data to
1348
+ // it. If the readable side of the socket is in flowing mode then there is no
1349
+ // buffered data as everything has been already written. If instead, the
1350
+ // socket is paused, any possible buffered data will be read as a single
1351
+ // chunk.
1352
+ //
1353
+ if (
1354
+ !this._readableState.endEmitted &&
1355
+ !websocket._closeFrameReceived &&
1356
+ !websocket._receiver._writableState.errorEmitted &&
1357
+ this._readableState.length !== 0
1358
+ ) {
1359
+ const chunk = this.read(this._readableState.length);
1360
+
1361
+ websocket._receiver.write(chunk);
1362
+ }
1363
+
1364
+ websocket._receiver.end();
1365
+
1366
+ this[kWebSocket] = undefined;
1367
+
1368
+ clearTimeout(websocket._closeTimer);
1369
+
1370
+ if (
1371
+ websocket._receiver._writableState.finished ||
1372
+ websocket._receiver._writableState.errorEmitted
1373
+ ) {
1374
+ websocket.emitClose();
1375
+ } else {
1376
+ websocket._receiver.on('error', receiverOnFinish);
1377
+ websocket._receiver.on('finish', receiverOnFinish);
1378
+ }
1379
+ }
1380
+
1381
+ /**
1382
+ * The listener of the socket `'data'` event.
1383
+ *
1384
+ * @param {Buffer} chunk A chunk of data
1385
+ * @private
1386
+ */
1387
+ function socketOnData(chunk) {
1388
+ if (!this[kWebSocket]._receiver.write(chunk)) {
1389
+ this.pause();
1390
+ }
1391
+ }
1392
+
1393
+ /**
1394
+ * The listener of the socket `'end'` event.
1395
+ *
1396
+ * @private
1397
+ */
1398
+ function socketOnEnd() {
1399
+ const websocket = this[kWebSocket];
1400
+
1401
+ websocket._readyState = WebSocket.CLOSING;
1402
+ websocket._receiver.end();
1403
+ this.end();
1404
+ }
1405
+
1406
+ /**
1407
+ * The listener of the socket `'error'` event.
1408
+ *
1409
+ * @private
1410
+ */
1411
+ function socketOnError() {
1412
+ const websocket = this[kWebSocket];
1413
+
1414
+ this.removeListener('error', socketOnError);
1415
+ this.on('error', NOOP);
1416
+
1417
+ if (websocket) {
1418
+ websocket._readyState = WebSocket.CLOSING;
1419
+ this.destroy();
1420
+ }
1421
+ }