@vscode/component-explorer-cli 0.2.1-17 → 0.2.1-171

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 (281) hide show
  1. package/README.md +130 -12
  2. package/dist/WorktreePool.d.ts +5 -4
  3. package/dist/WorktreePool.d.ts.map +1 -1
  4. package/dist/WorktreePool.js +3 -3
  5. package/dist/WorktreePool.js.map +1 -1
  6. package/dist/_virtual/_build-info.js +1 -1
  7. package/dist/browserPage.d.ts +55 -1
  8. package/dist/browserPage.d.ts.map +1 -1
  9. package/dist/browserPage.js +103 -7
  10. package/dist/browserPage.js.map +1 -1
  11. package/dist/browserPage.test.d.ts +2 -0
  12. package/dist/browserPage.test.d.ts.map +1 -0
  13. package/dist/commands/acceptCommand.d.ts +1 -1
  14. package/dist/commands/acceptCommand.d.ts.map +1 -1
  15. package/dist/commands/acceptCommand.js +21 -14
  16. package/dist/commands/acceptCommand.js.map +1 -1
  17. package/dist/commands/checkStabilityCommand.d.ts +2 -0
  18. package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
  19. package/dist/commands/checkStabilityCommand.js +25 -8
  20. package/dist/commands/checkStabilityCommand.js.map +1 -1
  21. package/dist/commands/compareCommand.d.ts +1 -1
  22. package/dist/commands/compareCommand.d.ts.map +1 -1
  23. package/dist/commands/compareCommand.js +31 -22
  24. package/dist/commands/compareCommand.js.map +1 -1
  25. package/dist/commands/inputArg.d.ts +33 -0
  26. package/dist/commands/inputArg.d.ts.map +1 -0
  27. package/dist/commands/inputArg.js +103 -0
  28. package/dist/commands/inputArg.js.map +1 -0
  29. package/dist/commands/mcpCommand.d.ts.map +1 -1
  30. package/dist/commands/mcpCommand.js +18 -12
  31. package/dist/commands/mcpCommand.js.map +1 -1
  32. package/dist/commands/renderCommand.d.ts +10 -1
  33. package/dist/commands/renderCommand.d.ts.map +1 -1
  34. package/dist/commands/renderCommand.js +390 -61
  35. package/dist/commands/renderCommand.js.map +1 -1
  36. package/dist/commands/renderCommand.test.d.ts +2 -0
  37. package/dist/commands/renderCommand.test.d.ts.map +1 -0
  38. package/dist/commands/serveCommand.d.ts +4 -1
  39. package/dist/commands/serveCommand.d.ts.map +1 -1
  40. package/dist/commands/serveCommand.js +105 -36
  41. package/dist/commands/serveCommand.js.map +1 -1
  42. package/dist/commands/serviceDiffCommitsCommand.d.ts.map +1 -1
  43. package/dist/commands/serviceDiffCommitsCommand.js +10 -9
  44. package/dist/commands/serviceDiffCommitsCommand.js.map +1 -1
  45. package/dist/commands/watchCommand.d.ts +1 -0
  46. package/dist/commands/watchCommand.d.ts.map +1 -1
  47. package/dist/commands/watchCommand.js +31 -20
  48. package/dist/commands/watchCommand.js.map +1 -1
  49. package/dist/comparison.d.ts +4 -3
  50. package/dist/comparison.d.ts.map +1 -1
  51. package/dist/comparison.js +17 -14
  52. package/dist/comparison.js.map +1 -1
  53. package/dist/component-explorer-config.schema.json +55 -2
  54. package/dist/componentExplorer.d.ts +110 -12
  55. package/dist/componentExplorer.d.ts.map +1 -1
  56. package/dist/componentExplorer.js +177 -24
  57. package/dist/componentExplorer.js.map +1 -1
  58. package/dist/config.d.ts +33 -4
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +64 -27
  61. package/dist/config.js.map +1 -1
  62. package/dist/coverage.d.ts +64 -0
  63. package/dist/coverage.d.ts.map +1 -0
  64. package/dist/coverage.js +212 -0
  65. package/dist/coverage.js.map +1 -0
  66. package/dist/daemon/DaemonService.d.ts +5 -199
  67. package/dist/daemon/DaemonService.d.ts.map +1 -1
  68. package/dist/daemon/DaemonService.js +248 -300
  69. package/dist/daemon/DaemonService.js.map +1 -1
  70. package/dist/daemon/approvalStore.d.ts +2 -1
  71. package/dist/daemon/approvalStore.d.ts.map +1 -1
  72. package/dist/daemon/approvalStore.js +4 -3
  73. package/dist/daemon/approvalStore.js.map +1 -1
  74. package/dist/daemon/client.d.ts +76 -5
  75. package/dist/daemon/client.d.ts.map +1 -1
  76. package/dist/daemon/daemonRpc.test.d.ts +2 -0
  77. package/dist/daemon/daemonRpc.test.d.ts.map +1 -0
  78. package/dist/daemon/endpointServer.d.ts +4 -0
  79. package/dist/daemon/endpointServer.d.ts.map +1 -0
  80. package/dist/daemon/endpointServer.js +24 -0
  81. package/dist/daemon/endpointServer.js.map +1 -0
  82. package/dist/daemon/inProcessClient.d.ts +3 -9
  83. package/dist/daemon/inProcessClient.d.ts.map +1 -1
  84. package/dist/daemon/inProcessClient.js +29 -30
  85. package/dist/daemon/inProcessClient.js.map +1 -1
  86. package/dist/daemon/lifecycle.d.ts +5 -5
  87. package/dist/daemon/lifecycle.d.ts.map +1 -1
  88. package/dist/daemon/lifecycle.js +4 -3
  89. package/dist/daemon/lifecycle.js.map +1 -1
  90. package/dist/daemon/pipeClient.d.ts +2 -3
  91. package/dist/daemon/pipeClient.d.ts.map +1 -1
  92. package/dist/daemon/pipeClient.js +93 -194
  93. package/dist/daemon/pipeClient.js.map +1 -1
  94. package/dist/daemon/pipeName.d.ts +3 -3
  95. package/dist/daemon/pipeName.d.ts.map +1 -1
  96. package/dist/daemon/pipeName.js +6 -5
  97. package/dist/daemon/pipeName.js.map +1 -1
  98. package/dist/daemon/pipeServer.d.ts +2 -2
  99. package/dist/daemon/pipeServer.d.ts.map +1 -1
  100. package/dist/daemon/pipeServer.js +79 -70
  101. package/dist/daemon/pipeServer.js.map +1 -1
  102. package/dist/daemon/registerDaemonConnection.d.ts +7 -0
  103. package/dist/daemon/registerDaemonConnection.d.ts.map +1 -0
  104. package/dist/daemon/registerDaemonConnection.js +37 -0
  105. package/dist/daemon/registerDaemonConnection.js.map +1 -0
  106. package/dist/daemon/transports.test.d.ts +2 -0
  107. package/dist/daemon/transports.test.d.ts.map +1 -0
  108. package/dist/daemon/types.d.ts +1655 -8
  109. package/dist/daemon/types.d.ts.map +1 -1
  110. package/dist/daemon/types.js +4 -0
  111. package/dist/daemon/types.js.map +1 -0
  112. package/dist/daemon/version.d.ts +1 -5
  113. package/dist/daemon/version.d.ts.map +1 -1
  114. package/dist/daemon/version.js +3 -7
  115. package/dist/daemon/version.js.map +1 -1
  116. package/dist/dependencyInstaller.d.ts +2 -1
  117. package/dist/dependencyInstaller.d.ts.map +1 -1
  118. package/dist/dependencyInstaller.js +4 -4
  119. package/dist/dependencyInstaller.js.map +1 -1
  120. package/dist/explorerSession.d.ts +5 -1
  121. package/dist/explorerSession.d.ts.map +1 -1
  122. package/dist/explorerSession.js +24 -7
  123. package/dist/explorerSession.js.map +1 -1
  124. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/inspectionHost-BA6ZmC_P.js +2523 -0
  125. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/inspectionHost-BA6ZmC_P.js.map +1 -0
  126. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/src-DYVSK_tz.js +1871 -0
  127. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/src-DYVSK_tz.js.map +1 -0
  128. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/webSocketTransport-Ct4OIdG9.js +220 -0
  129. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/webSocketTransport-Ct4OIdG9.js.map +1 -0
  130. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/node.js +721 -0
  131. package/dist/external/linkrpc/typescript/packages/linkrpc/dist/node.js.map +1 -0
  132. package/dist/git/gitCommitResolver.d.ts +2 -1
  133. package/dist/git/gitCommitResolver.d.ts.map +1 -1
  134. package/dist/git/gitCommitResolver.js +8 -8
  135. package/dist/git/gitCommitResolver.js.map +1 -1
  136. package/dist/git/gitIndexResolver.d.ts +2 -1
  137. package/dist/git/gitIndexResolver.d.ts.map +1 -1
  138. package/dist/git/gitIndexResolver.js +7 -7
  139. package/dist/git/gitIndexResolver.js.map +1 -1
  140. package/dist/git/gitService.d.ts +5 -4
  141. package/dist/git/gitService.d.ts.map +1 -1
  142. package/dist/git/gitService.js.map +1 -1
  143. package/dist/git/gitUtils.d.ts +6 -5
  144. package/dist/git/gitUtils.d.ts.map +1 -1
  145. package/dist/git/gitUtils.js +5 -4
  146. package/dist/git/gitUtils.js.map +1 -1
  147. package/dist/git/gitWorktreeManager.d.ts +15 -14
  148. package/dist/git/gitWorktreeManager.d.ts.map +1 -1
  149. package/dist/git/gitWorktreeManager.js +10 -11
  150. package/dist/git/gitWorktreeManager.js.map +1 -1
  151. package/dist/git/testUtils.d.ts +2 -1
  152. package/dist/git/testUtils.d.ts.map +1 -1
  153. package/dist/index.d.ts +0 -2
  154. package/dist/index.js +10 -1
  155. package/dist/index.js.map +1 -1
  156. package/dist/js-component-explorer/packages/common/dist/daemonRpc.js +165 -0
  157. package/dist/js-component-explorer/packages/common/dist/daemonRpc.js.map +1 -0
  158. package/dist/js-component-explorer/packages/common/dist/explorerUrl.js +21 -0
  159. package/dist/js-component-explorer/packages/common/dist/explorerUrl.js.map +1 -0
  160. package/dist/js-component-explorer/packages/common/dist/renderManifest.js +68 -0
  161. package/dist/js-component-explorer/packages/common/dist/renderManifest.js.map +1 -0
  162. package/dist/js-component-explorer/packages/semver/dist/index.js.map +1 -0
  163. package/dist/manifest.schema.json +44 -16
  164. package/dist/mcp/DaemonAccessor.d.ts +2 -3
  165. package/dist/mcp/DaemonAccessor.d.ts.map +1 -1
  166. package/dist/mcp/McpServer.d.ts +1 -1
  167. package/dist/mcp/McpServer.d.ts.map +1 -1
  168. package/dist/mcp/McpServer.js +252 -159
  169. package/dist/mcp/McpServer.js.map +1 -1
  170. package/dist/path.d.ts +30 -0
  171. package/dist/path.d.ts.map +1 -0
  172. package/dist/path.js +78 -0
  173. package/dist/path.js.map +1 -0
  174. package/dist/processTree.d.ts +6 -1
  175. package/dist/processTree.d.ts.map +1 -1
  176. package/dist/processTree.js +48 -5
  177. package/dist/processTree.js.map +1 -1
  178. package/dist/renderManifest.d.ts +70 -5
  179. package/dist/renderManifest.js +1 -1
  180. package/dist/server/httpServer.d.ts +1 -1
  181. package/dist/server/httpServer.d.ts.map +1 -1
  182. package/dist/server/httpServer.js +4 -8
  183. package/dist/server/httpServer.js.map +1 -1
  184. package/dist/server/serverConfig.d.ts +23 -8
  185. package/dist/server/serverConfig.d.ts.map +1 -1
  186. package/dist/server/serverConfig.js +11 -18
  187. package/dist/server/serverConfig.js.map +1 -1
  188. package/dist/server/viteServer.d.ts +16 -3
  189. package/dist/server/viteServer.d.ts.map +1 -1
  190. package/dist/server/viteServer.js +86 -5
  191. package/dist/server/viteServer.js.map +1 -1
  192. package/dist/storage.d.ts +2 -1
  193. package/dist/storage.d.ts.map +1 -1
  194. package/dist/storage.js +1 -1
  195. package/dist/storage.js.map +1 -1
  196. package/dist/utils.d.ts +3 -30
  197. package/dist/utils.d.ts.map +1 -1
  198. package/dist/utils.js +4 -24
  199. package/dist/utils.js.map +1 -1
  200. package/dist/visualCache.d.ts +2 -1
  201. package/dist/visualCache.d.ts.map +1 -1
  202. package/dist/visualCache.js +4 -3
  203. package/dist/visualCache.js.map +1 -1
  204. package/dist/viteProjectRef.d.ts +4 -12
  205. package/dist/viteProjectRef.d.ts.map +1 -1
  206. package/dist/viteProjectRef.js +9 -17
  207. package/dist/viteProjectRef.js.map +1 -1
  208. package/dist/vscode-observables/observables/dist/disposables.js.map +1 -0
  209. package/dist/vscode-observables/observables/dist/observableInternal/base.js.map +1 -0
  210. package/dist/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +1 -0
  211. package/dist/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +1 -0
  212. package/dist/vscode-observables/observables/dist/observableInternal/debugName.js.map +1 -0
  213. package/dist/vscode-observables/observables/dist/observableInternal/index.js.map +1 -0
  214. package/dist/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +1 -0
  215. package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/debugGetDependencyGraph.js +1 -1
  216. package/dist/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +1 -0
  217. package/dist/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +1 -0
  218. package/dist/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +1 -0
  219. package/dist/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +1 -0
  220. package/dist/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +1 -0
  221. package/dist/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +1 -0
  222. package/dist/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +1 -0
  223. package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js → vscode-observables/observables/dist/observableInternal/reactions/createEffect.js} +9 -5
  224. package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffect.js.map +1 -0
  225. package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js → vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js} +1 -1
  226. package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js.map +1 -0
  227. package/dist/vscode-observables/observables/dist/observableInternal/transaction.js.map +1 -0
  228. package/dist/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +1 -0
  229. package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/utils/utilsCancellation.js +2 -2
  230. package/dist/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +1 -0
  231. package/package.json +18 -15
  232. package/dist/commands/artifactCommand.d.ts +0 -14
  233. package/dist/commands/artifactCommand.d.ts.map +0 -1
  234. package/dist/external/vscode-observables/observables/dist/disposables.js.map +0 -1
  235. package/dist/external/vscode-observables/observables/dist/observableInternal/base.js.map +0 -1
  236. package/dist/external/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +0 -1
  237. package/dist/external/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +0 -1
  238. package/dist/external/vscode-observables/observables/dist/observableInternal/debugName.js.map +0 -1
  239. package/dist/external/vscode-observables/observables/dist/observableInternal/index.js.map +0 -1
  240. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +0 -1
  241. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +0 -1
  242. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +0 -1
  243. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +0 -1
  244. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +0 -1
  245. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +0 -1
  246. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +0 -1
  247. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +0 -1
  248. package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js.map +0 -1
  249. package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js.map +0 -1
  250. package/dist/external/vscode-observables/observables/dist/observableInternal/transaction.js.map +0 -1
  251. package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +0 -1
  252. package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +0 -1
  253. package/dist/formatValue.js +0 -96
  254. package/dist/formatValue.js.map +0 -1
  255. package/dist/packages/common/dist/renderManifest.js +0 -46
  256. package/dist/packages/common/dist/renderManifest.js.map +0 -1
  257. package/dist/packages/semver/dist/index.js.map +0 -1
  258. package/dist/packages/simple-api/dist/chunk-FJ7AVNQE.js +0 -138
  259. package/dist/packages/simple-api/dist/chunk-FJ7AVNQE.js.map +0 -1
  260. package/dist/packages/simple-api/dist/chunk-TTRCY65Z.js +0 -27
  261. package/dist/packages/simple-api/dist/chunk-TTRCY65Z.js.map +0 -1
  262. package/dist/packages/simple-api/dist/chunk-WNXMRXWV.js +0 -28
  263. package/dist/packages/simple-api/dist/chunk-WNXMRXWV.js.map +0 -1
  264. package/dist/packages/simple-api/dist/express.js +0 -104
  265. package/dist/packages/simple-api/dist/express.js.map +0 -1
  266. /package/dist/{packages → js-component-explorer/packages}/semver/dist/index.js +0 -0
  267. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/disposables.js +0 -0
  268. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/base.js +0 -0
  269. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/commonFacade/deps.js +0 -0
  270. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugLocation.js +0 -0
  271. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugName.js +0 -0
  272. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/index.js +0 -0
  273. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/consoleObservableLogger.js +0 -0
  274. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/logging.js +0 -0
  275. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/baseObservable.js +0 -0
  276. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derived.js +0 -0
  277. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derivedImpl.js +0 -0
  278. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableFromEvent.js +0 -0
  279. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableValue.js +0 -0
  280. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/transaction.js +0 -0
  281. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/utils/utils.js +0 -0
@@ -0,0 +1,721 @@
1
+ import { H as parseEndpointUri, B as formatEndpointUri, at as JsonRpcChannel, q as traceMessageTransport } from './chunks/src-DYVSK_tz.js';
2
+ export { ot as Channel, Ot as HUBRPC_META_KEY, kt as HUBRPC_SIGNATURE_KEY, At as HUBRPC_UNSIGNED_KEY, et as LinkRpcConnection, Xt as NonCompliantServerError, st as RpcError, tt as ServiceHandle, G as TransportPair, nt as defaultInterfaceTarget, xt as defaultsInterface, St as directoryInterface, it as isInterfaceTarget, Vt as parseMethodName, wt as schemasInterface, Dt as stripLinkRpcWireMeta, Tt as zServiceIdPattern } from './chunks/src-DYVSK_tz.js';
3
+ import { t as WebSocketTransport, s as runInitializeHandshake, r as openWebSocket$1 } from './chunks/webSocketTransport-Ct4OIdG9.js';
4
+ export { i as INITIALIZE_METHOD } from './chunks/webSocketTransport-Ct4OIdG9.js';
5
+ import { timingSafeEqual } from 'node:crypto';
6
+ import * as http from 'node:http';
7
+ import * as net from 'node:net';
8
+ import 'node:fs/promises';
9
+ import 'node:os';
10
+ import 'node:path';
11
+ import 'node:child_process';
12
+
13
+ /*---------------------------------------------------------------------------------------------
14
+ * Copyright (c) Microsoft Corporation. All rights reserved.
15
+ * Licensed under the MIT License. See License.txt in the project root for license information.
16
+ *--------------------------------------------------------------------------------------------*/
17
+ //#region src/node/ndjsonTransport.ts
18
+ /**
19
+ * Newline-delimited JSON transport over a Node Readable/Writable pair.
20
+ * One JSON value per line, both directions.
21
+ *
22
+ * Not LSP-style headers — those add no value for a private link between two
23
+ * cooperating processes and require a length-prefixed framer.
24
+ */
25
+ var NdjsonTransport = class {
26
+ _input;
27
+ _output;
28
+ _onClose;
29
+ _listener;
30
+ _buffer = [];
31
+ _residual = "";
32
+ _closed = false;
33
+ _onDataEvent = (chunk) => this._onData(chunk);
34
+ _onEndEvent = () => this.dispose();
35
+ constructor(_input, _output, _onClose) {
36
+ this._input = _input;
37
+ this._output = _output;
38
+ this._onClose = _onClose;
39
+ this._input.setEncoding?.("utf8");
40
+ this._input.on("data", this._onDataEvent);
41
+ this._input.on("end", this._onEndEvent);
42
+ this._input.on("close", this._onEndEvent);
43
+ this._input.on("error", this._onEndEvent);
44
+ if (!Object.is(this._output, this._input)) this._output.on("error", this._onEndEvent);
45
+ }
46
+ send(message) {
47
+ if (this._closed) return;
48
+ this._output.write(JSON.stringify(message) + "\n");
49
+ }
50
+ setListener(listener) {
51
+ this._listener = listener;
52
+ if (listener) while (this._buffer.length > 0 && this._listener) {
53
+ const m = this._buffer.shift();
54
+ this._listener(m);
55
+ }
56
+ }
57
+ dispose() {
58
+ if (this._closed) return;
59
+ this._closed = true;
60
+ this._input.removeListener("data", this._onDataEvent);
61
+ this._input.removeListener("end", this._onEndEvent);
62
+ this._input.removeListener("close", this._onEndEvent);
63
+ this._input.removeListener("error", this._onEndEvent);
64
+ this._output.removeListener("error", this._onEndEvent);
65
+ this._listener = void 0;
66
+ this._buffer.length = 0;
67
+ this._residual = "";
68
+ this._onClose?.();
69
+ }
70
+ _onData(chunk) {
71
+ this._residual += chunk;
72
+ let nl;
73
+ while ((nl = this._residual.indexOf("\n")) >= 0) {
74
+ const line = this._residual.slice(0, nl).trim();
75
+ this._residual = this._residual.slice(nl + 1);
76
+ if (!line) continue;
77
+ let parsed;
78
+ try {
79
+ parsed = JSON.parse(line);
80
+ } catch {
81
+ continue;
82
+ }
83
+ this._deliver(parsed);
84
+ }
85
+ }
86
+ _deliver(m) {
87
+ if (this._listener) this._listener(m);
88
+ else this._buffer.push(m);
89
+ }
90
+ };
91
+ //#endregion
92
+ //#region src/node/initialize.ts
93
+ /** Construct NDJSON and complete the shared transport initialization handshake. */
94
+ async function connectNdjson(opts) {
95
+ const role = opts.initialize;
96
+ const closed = new AbortController();
97
+ const baseTransport = new NdjsonTransport(opts.input, opts.output, () => {
98
+ try {
99
+ opts.onClose?.();
100
+ } finally {
101
+ closed.abort(/* @__PURE__ */ new Error("hubrpc::initialize: transport closed during handshake"));
102
+ }
103
+ });
104
+ const transport = opts.trace === void 0 ? baseTransport : traceMessageTransport(baseTransport, opts.trace);
105
+ if (!role) return { transport };
106
+ try {
107
+ const { token } = await runInitializeHandshake(transport, role, {
108
+ handshakeTimeoutMs: opts.handshakeTimeoutMs,
109
+ signal: opts.signal ? AbortSignal.any([closed.signal, opts.signal]) : closed.signal
110
+ });
111
+ return {
112
+ transport,
113
+ ...token !== void 0 ? { token } : {}
114
+ };
115
+ } catch (err) {
116
+ transport.dispose();
117
+ throw err;
118
+ }
119
+ }
120
+ //#endregion
121
+ //#region src/node/webSocketClientTransport.ts
122
+ /** Node-only header extension. The web entry exposes the standard overload. */
123
+ function openWebSocket(url, opts = {}) {
124
+ if (!opts.headers || Object.keys(opts.headers).length === 0) return openWebSocket$1(url);
125
+ return new Promise((resolve, reject) => {
126
+ const ws = new WebSocket(url, { headers: opts.headers });
127
+ const onOpen = () => {
128
+ ws.removeEventListener("error", onError);
129
+ resolve(ws);
130
+ };
131
+ const onError = () => {
132
+ ws.removeEventListener("open", onOpen);
133
+ reject(/* @__PURE__ */ new Error("WebSocket connection failed"));
134
+ };
135
+ ws.addEventListener("open", onOpen, { once: true });
136
+ ws.addEventListener("error", onError, { once: true });
137
+ });
138
+ }
139
+ //#endregion
140
+ //#region src/node/hubClient.ts
141
+ /** Env var the hub publishes for its endpoint (named pipe / UDS path). */
142
+ const LINKRPC_ENDPOINT_VAR = "LINKRPC_ENDPOINT";
143
+ /**
144
+ * Open the hub socket and send the preamble, returning the raw
145
+ * {@link HubChannel} without any signing. Use this when you want to
146
+ * compose identity yourself; otherwise prefer {@link connectToHub}.
147
+ */
148
+ async function openHubChannel(options = {}) {
149
+ const endpoint = options.endpoint ?? process.env["LINKRPC_ENDPOINT"];
150
+ const token = options.token ?? process.env["LINKRPC_TOKEN"] ?? "";
151
+ if (!endpoint) throw new Error(`${LINKRPC_ENDPOINT_VAR} is not set; cannot connect to linkrpc hub.`);
152
+ const closeListeners = /* @__PURE__ */ new Set();
153
+ let closed = false;
154
+ let closeChannel;
155
+ const fireClose = () => {
156
+ if (closed) return;
157
+ closed = true;
158
+ closeChannel?.();
159
+ for (const l of closeListeners) try {
160
+ l();
161
+ } catch {}
162
+ closeListeners.clear();
163
+ };
164
+ const { transport, destroy } = await _openHubTransport(endpoint, token, fireClose);
165
+ const rpc = JsonRpcChannel.createWithClose(transport, { deferRequests: options.deferRequests });
166
+ closeChannel = rpc.close;
167
+ if (closed) rpc.close();
168
+ return Object.assign(rpc.channel, {
169
+ endpoint,
170
+ token,
171
+ resumeRequests: rpc.resumeRequests,
172
+ onClose: (listener) => {
173
+ if (closed) {
174
+ queueMicrotask(listener);
175
+ return { dispose: () => {} };
176
+ }
177
+ closeListeners.add(listener);
178
+ return { dispose: () => closeListeners.delete(listener) };
179
+ },
180
+ close: () => {
181
+ destroy();
182
+ fireClose();
183
+ }
184
+ });
185
+ }
186
+ /** True for `ws://` / `wss://` endpoints (case-insensitive). */
187
+ function _isWebSocketEndpoint(endpoint) {
188
+ return /^wss?:\/\//i.test(endpoint);
189
+ }
190
+ /**
191
+ * Open the underlying transport for {@link openHubChannel}, picking the
192
+ * scheme from the endpoint:
193
+ * - `ws://` / `wss://` → WebSocket; the token is presented via the
194
+ * `hubrpc::initialize` handshake (browsers cannot set request headers).
195
+ * - anything else → named pipe / UDS; the token is presented via the
196
+ * `hubrpc::initialize` handshake the socket server requires.
197
+ *
198
+ * `onClose` fires once when the peer ends the transport.
199
+ */
200
+ async function _openHubTransport(endpoint, token, onClose) {
201
+ if (_isWebSocketEndpoint(endpoint)) {
202
+ const ws = await openWebSocket(endpoint);
203
+ const closed = new AbortController();
204
+ const transport = new WebSocketTransport(ws, () => {
205
+ closed.abort(/* @__PURE__ */ new Error("hubrpc::initialize: transport closed during handshake"));
206
+ onClose();
207
+ });
208
+ const destroy = () => {
209
+ try {
210
+ ws.close();
211
+ } catch {}
212
+ };
213
+ try {
214
+ await runInitializeHandshake(transport, {
215
+ kind: "client",
216
+ token
217
+ }, { signal: closed.signal });
218
+ } catch (err) {
219
+ transport.dispose();
220
+ destroy();
221
+ throw err;
222
+ }
223
+ return {
224
+ transport,
225
+ destroy
226
+ };
227
+ }
228
+ const socket = await _openSocket(endpoint);
229
+ const { transport } = await connectNdjson({
230
+ input: socket,
231
+ output: socket,
232
+ onClose: () => {
233
+ socket.destroy();
234
+ onClose();
235
+ },
236
+ initialize: {
237
+ kind: "client",
238
+ token
239
+ }
240
+ });
241
+ return {
242
+ transport,
243
+ destroy: () => socket.destroy()
244
+ };
245
+ }
246
+ function _openSocket(endpoint) {
247
+ return new Promise((resolve, reject) => {
248
+ const socket = net.createConnection(endpoint);
249
+ const onError = (err) => {
250
+ socket.removeListener("connect", onConnect);
251
+ reject(err);
252
+ };
253
+ const onConnect = () => {
254
+ socket.removeListener("error", onError);
255
+ resolve(socket);
256
+ };
257
+ socket.once("error", onError);
258
+ socket.once("connect", onConnect);
259
+ });
260
+ }
261
+ async function openStdioChannel(options = {}) {
262
+ const closeListeners = /* @__PURE__ */ new Set();
263
+ let closed = false;
264
+ let closeChannel;
265
+ const fireClose = () => {
266
+ if (closed) return;
267
+ closed = true;
268
+ closeChannel?.();
269
+ if (process.stdin.listenerCount("data") === 0) process.stdin.pause();
270
+ for (const l of closeListeners) try {
271
+ l();
272
+ } catch {}
273
+ closeListeners.clear();
274
+ };
275
+ const { transport } = await connectNdjson({
276
+ input: process.stdin,
277
+ output: process.stdout,
278
+ onClose: fireClose
279
+ });
280
+ const rpc = JsonRpcChannel.createWithClose(transport, options);
281
+ closeChannel = rpc.close;
282
+ if (closed) rpc.close();
283
+ return Object.assign(rpc.channel, {
284
+ resumeRequests: rpc.resumeRequests,
285
+ close: fireClose,
286
+ onClose: (listener) => {
287
+ if (closed) {
288
+ queueMicrotask(listener);
289
+ return { dispose: () => {} };
290
+ }
291
+ closeListeners.add(listener);
292
+ return { dispose: () => closeListeners.delete(listener) };
293
+ }
294
+ });
295
+ }
296
+ //#endregion
297
+ //#region src/node/endpoint.ts
298
+ /**
299
+ * Start a Node application's RPC endpoint without imposing argument parsing,
300
+ * signing, service registration, signal handlers, or process-exit policy.
301
+ * Startup and initial onConnection failures reject. A listener isolates failed
302
+ * peers, reports them via onError, and continues accepting other connections.
303
+ */
304
+ async function startEndpoint(options) {
305
+ const configured = (options.endpoint ?? process.env["LINKRPC_ENDPOINT"])?.trim();
306
+ if (!configured) throw new Error(`${LINKRPC_ENDPOINT_VAR} is not set; specify an endpoint.`);
307
+ if (configured === "stdio" || configured === "stdio:") return _startSingle("stdio:", await openStdioChannel({ deferRequests: true }), options);
308
+ const listening = configured.startsWith("listen:");
309
+ const target = parseEndpointUri(listening ? configured.slice(7) : configured);
310
+ if (target.kind !== "socket" && target.kind !== "ws") throw new Error("startEndpoint supports stdio, socket, and LinkRPC WebSocket endpoints only.");
311
+ const token = options.token ?? target.token ?? process.env["LINKRPC_TOKEN"] ?? "";
312
+ const endpoint = formatEndpointUri({
313
+ ...target,
314
+ token: void 0
315
+ });
316
+ if (!listening) return _startSingle(endpoint, await openHubChannel({
317
+ endpoint: target.kind === "socket" ? target.path : target.url,
318
+ token,
319
+ deferRequests: true
320
+ }), options);
321
+ if (!token) throw new Error("Listening endpoints require a nonempty token.");
322
+ return EndpointListener.start(target, token, options);
323
+ }
324
+ async function _startSingle(endpoint, source, options) {
325
+ let finish;
326
+ const closed = new Promise((resolve) => {
327
+ finish = resolve;
328
+ });
329
+ const subscription = source.onClose(finish);
330
+ closed.then(() => subscription.dispose());
331
+ const connection = {
332
+ channel: source,
333
+ closed,
334
+ dispose: () => source.close()
335
+ };
336
+ try {
337
+ await options.onConnection(connection);
338
+ source.resumeRequests();
339
+ return {
340
+ endpoint,
341
+ closed,
342
+ dispose: connection.dispose
343
+ };
344
+ } catch (error) {
345
+ connection.dispose();
346
+ await closed;
347
+ throw error;
348
+ }
349
+ }
350
+ var EndpointListener = class EndpointListener {
351
+ endpoint;
352
+ _server;
353
+ _token;
354
+ _options;
355
+ _webSocketServer;
356
+ _peers = /* @__PURE__ */ new Set();
357
+ _tasks = /* @__PURE__ */ new Set();
358
+ _sockets = /* @__PURE__ */ new Set();
359
+ _disposed = false;
360
+ _finish;
361
+ closed = new Promise((resolve) => {
362
+ this._finish = resolve;
363
+ });
364
+ constructor(endpoint, _server, _token, _options, _webSocketServer) {
365
+ this.endpoint = endpoint;
366
+ this._server = _server;
367
+ this._token = _token;
368
+ this._options = _options;
369
+ this._webSocketServer = _webSocketServer;
370
+ _server.on("connection", (socket) => {
371
+ this._sockets.add(socket);
372
+ socket.on("close", () => this._sockets.delete(socket));
373
+ if (this._disposed) socket.destroy();
374
+ });
375
+ _server.on("error", (error) => {
376
+ this._report(error);
377
+ this.dispose();
378
+ });
379
+ }
380
+ static async start(target, token, options) {
381
+ if (target.kind === "socket") {
382
+ const server = net.createServer();
383
+ await _listen(server, () => server.listen(target.path));
384
+ const owner = new EndpointListener(formatEndpointUri({
385
+ ...target,
386
+ token: void 0
387
+ }), server, token, options);
388
+ server.on("connection", (socket) => {
389
+ const peer = owner._createPeer(() => socket.destroy());
390
+ socket.on("error", (error) => owner._peerError(peer, error));
391
+ socket.on("close", () => peer.dispose());
392
+ owner._accept(peer, () => connectNdjson({
393
+ input: socket,
394
+ output: socket,
395
+ onClose: () => peer.dispose(),
396
+ signal: peer.signal,
397
+ initialize: {
398
+ kind: "server",
399
+ isTokenAccepted: async (candidate) => owner._accepts(candidate)
400
+ }
401
+ }).then((result) => result.transport));
402
+ });
403
+ return owner;
404
+ }
405
+ const url = new URL(target.url);
406
+ if (url.protocol !== "ws:") throw new Error("Listening WebSockets require ws:; terminate TLS at a reverse proxy.");
407
+ if (url.username || url.password || url.search || url.hash) throw new Error("Listening WebSocket URLs cannot contain credentials, query parameters, or fragments.");
408
+ const { WebSocketServer } = await import('ws');
409
+ const server = http.createServer((_request, response) => {
410
+ response.writeHead(426);
411
+ response.end("WebSocket upgrade required");
412
+ });
413
+ await _listen(server, () => server.listen(Number(url.port || 80), url.hostname.replace(/^\[|\]$/g, "")));
414
+ const webSockets = new WebSocketServer({
415
+ server,
416
+ path: url.pathname,
417
+ maxPayload: 16777216
418
+ });
419
+ const address = server.address();
420
+ if (!address || typeof address === "string") {
421
+ server.close();
422
+ throw new Error("WebSocket listener did not bind a TCP address.");
423
+ }
424
+ url.port = String(address.port);
425
+ const owner = new EndpointListener(url.toString(), server, token, options, webSockets);
426
+ webSockets.on("error", (error) => {
427
+ owner._report(error);
428
+ owner.dispose();
429
+ });
430
+ webSockets.on("connection", (socket) => {
431
+ const peer = owner._createPeer(() => socket.terminate());
432
+ socket.on("error", (error) => owner._peerError(peer, error));
433
+ socket.on("close", () => peer.dispose());
434
+ const transport = new WebSocketTransport(socket, () => peer.dispose());
435
+ peer.setTransport(transport);
436
+ owner._accept(peer, async () => {
437
+ await runInitializeHandshake(transport, {
438
+ kind: "server",
439
+ isTokenAccepted: async (candidate) => owner._accepts(candidate)
440
+ }, { signal: peer.signal });
441
+ return transport;
442
+ });
443
+ });
444
+ return owner;
445
+ }
446
+ dispose() {
447
+ if (this._disposed) return;
448
+ this._disposed = true;
449
+ for (const peer of this._peers) peer.dispose();
450
+ for (const socket of this._sockets) socket.destroy();
451
+ const webSocketsClosed = this._webSocketServer ? new Promise((resolve) => this._webSocketServer.close(() => resolve())) : Promise.resolve();
452
+ this._server.close(() => {
453
+ Promise.all([...this._tasks, webSocketsClosed]).then(() => this._finish());
454
+ });
455
+ }
456
+ _accepts(candidate) {
457
+ if (typeof candidate !== "string") return false;
458
+ const expected = Buffer.from(this._token);
459
+ const actual = Buffer.from(candidate);
460
+ return actual.length === expected.length && timingSafeEqual(actual, expected);
461
+ }
462
+ _createPeer(closeSocket) {
463
+ const peer = new ListenerPeer(closeSocket);
464
+ this._peers.add(peer);
465
+ peer.closed.then(() => this._peers.delete(peer));
466
+ if (this._disposed) peer.dispose();
467
+ return peer;
468
+ }
469
+ _accept(peer, open) {
470
+ const task = (async () => {
471
+ try {
472
+ const transport = await open();
473
+ peer.setTransport(transport);
474
+ if (this._disposed || peer.signal.aborted) return;
475
+ const connection = peer.connect();
476
+ await this._options.onConnection(connection);
477
+ peer.resumeRequests();
478
+ } catch (error) {
479
+ const report = !this._disposed;
480
+ peer.dispose();
481
+ if (report) this._report(error);
482
+ }
483
+ })();
484
+ this._tasks.add(task);
485
+ task.then(() => this._tasks.delete(task));
486
+ }
487
+ _peerError(peer, error) {
488
+ if (!peer.signal.aborted && !this._disposed) this._report(error);
489
+ peer.dispose();
490
+ }
491
+ _report(error) {
492
+ const report = this._options.onError ?? ((error) => process.emitWarning(error));
493
+ try {
494
+ report(error instanceof Error ? error : new Error(String(error)));
495
+ } catch (error) {
496
+ process.emitWarning(new Error("startEndpoint onError callback threw", { cause: error }));
497
+ }
498
+ }
499
+ };
500
+ var ListenerPeer = class {
501
+ _closeSocket;
502
+ _abort = new AbortController();
503
+ signal = this._abort.signal;
504
+ _finish;
505
+ closed = new Promise((resolve) => {
506
+ this._finish = resolve;
507
+ });
508
+ _transport;
509
+ _closeChannel;
510
+ _resumeRequests;
511
+ constructor(_closeSocket) {
512
+ this._closeSocket = _closeSocket;
513
+ }
514
+ setTransport(transport) {
515
+ this._transport = transport;
516
+ if (this.signal.aborted) transport.dispose();
517
+ }
518
+ connect() {
519
+ const rpc = JsonRpcChannel.createWithClose(this._transport, { deferRequests: true });
520
+ this._closeChannel = rpc.close;
521
+ this._resumeRequests = rpc.resumeRequests;
522
+ return {
523
+ channel: rpc.channel,
524
+ closed: this.closed,
525
+ dispose: () => this.dispose()
526
+ };
527
+ }
528
+ resumeRequests() {
529
+ this._resumeRequests?.();
530
+ }
531
+ dispose() {
532
+ if (this.signal.aborted) return;
533
+ this._abort.abort(/* @__PURE__ */ new Error("Endpoint connection closed"));
534
+ this._closeChannel?.();
535
+ this._transport?.dispose();
536
+ this._closeSocket();
537
+ this._finish();
538
+ }
539
+ };
540
+ function _listen(server, listen) {
541
+ return new Promise((resolve, reject) => {
542
+ const onError = (error) => {
543
+ server.removeListener("listening", onListening);
544
+ reject(error);
545
+ };
546
+ const onListening = () => {
547
+ server.removeListener("error", onError);
548
+ resolve();
549
+ };
550
+ server.once("error", onError);
551
+ server.once("listening", onListening);
552
+ try {
553
+ listen();
554
+ } catch (error) {
555
+ server.removeListener("error", onError);
556
+ server.removeListener("listening", onListening);
557
+ reject(error);
558
+ }
559
+ });
560
+ }
561
+ //#endregion
562
+ //#region src/node/headerDelimitedTransport.ts
563
+ const HEADER_SEPARATOR = Buffer.from("\r\n\r\n");
564
+ const DEFAULT_MAX_HEADER_BYTES = 65536;
565
+ const DEFAULT_MAX_CONTENT_LENGTH = 67108864;
566
+ const DEFAULT_MAX_PENDING_MESSAGES = 1024;
567
+ /**
568
+ * LSP "base protocol" framing over a Node Readable/Writable pair.
569
+ *
570
+ * The streams remain owned by the caller: close/dispose detach listeners but
571
+ * never end, destroy, or otherwise take ownership of either stream.
572
+ */
573
+ var HeaderDelimitedTransport = class {
574
+ _input;
575
+ _output;
576
+ _onClose;
577
+ _listener;
578
+ _pending = [];
579
+ _residual = Buffer.alloc(0);
580
+ _expectedLength;
581
+ _closed = false;
582
+ _closeReason;
583
+ _maxHeaderBytes;
584
+ _maxContentLength;
585
+ _maxPendingMessages;
586
+ _onDataListener = (chunk) => this._onData(chunk);
587
+ _onEndListener = () => this._onEnd();
588
+ _onInputErrorListener = (error) => this.close(`Header-delimited input error: ${error.message}`);
589
+ _onOutputErrorListener = (error) => this.close(`Header-delimited output error: ${error.message}`);
590
+ constructor(_input, _output, _onClose, options = {}) {
591
+ this._input = _input;
592
+ this._output = _output;
593
+ this._onClose = _onClose;
594
+ this._maxHeaderBytes = positiveLimit(options.maxHeaderBytes, DEFAULT_MAX_HEADER_BYTES, "maxHeaderBytes");
595
+ this._maxContentLength = positiveLimit(options.maxContentLength, DEFAULT_MAX_CONTENT_LENGTH, "maxContentLength");
596
+ this._maxPendingMessages = positiveLimit(options.maxPendingMessages, DEFAULT_MAX_PENDING_MESSAGES, "maxPendingMessages");
597
+ _input.on("data", this._onDataListener);
598
+ _input.on("end", this._onEndListener);
599
+ _input.on("close", this._onEndListener);
600
+ _input.on("error", this._onInputErrorListener);
601
+ _output.on("error", this._onOutputErrorListener);
602
+ }
603
+ get closed() {
604
+ return this._closed;
605
+ }
606
+ get closeReason() {
607
+ return this._closeReason;
608
+ }
609
+ send(message) {
610
+ if (this._closed) return Promise.reject(new Error(this._closeReason ?? "Header-delimited transport is closed"));
611
+ const body = Buffer.from(JSON.stringify(message), "utf8");
612
+ if (body.length > this._maxContentLength) return Promise.reject(/* @__PURE__ */ new Error(`Header-delimited payload exceeds ${this._maxContentLength} bytes`));
613
+ const wire = Buffer.concat([Buffer.from(`Content-Length: ${body.length}\r\n\r\n`, "ascii"), body]);
614
+ return new Promise((resolve, reject) => {
615
+ this._output.write(wire, (error) => {
616
+ if (error) reject(error);
617
+ else resolve();
618
+ });
619
+ });
620
+ }
621
+ setListener(listener) {
622
+ this._listener = listener;
623
+ while (this._listener && this._pending.length > 0) this._listener(this._pending.shift());
624
+ }
625
+ dispose() {
626
+ this.close("Header-delimited transport disposed");
627
+ }
628
+ close(reason = "Header-delimited transport closed") {
629
+ if (this._closed) return;
630
+ this._closed = true;
631
+ this._closeReason = reason;
632
+ this._input.off("data", this._onDataListener);
633
+ this._input.off("end", this._onEndListener);
634
+ this._input.off("close", this._onEndListener);
635
+ this._input.off("error", this._onInputErrorListener);
636
+ this._output.off("error", this._onOutputErrorListener);
637
+ this._onClose?.(reason);
638
+ }
639
+ _onData(chunk) {
640
+ if (this._closed) return;
641
+ const bytes = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
642
+ this._residual = this._residual.length === 0 ? Buffer.from(bytes) : Buffer.concat([this._residual, bytes]);
643
+ while (!this._closed) {
644
+ if (this._expectedLength === void 0) {
645
+ const headerEnd = this._residual.indexOf(HEADER_SEPARATOR);
646
+ if (headerEnd < 0) {
647
+ if (this._residual.length > this._maxHeaderBytes) this.close(`Invalid header-delimited frame: header exceeds ${this._maxHeaderBytes} bytes`);
648
+ return;
649
+ }
650
+ if (headerEnd + HEADER_SEPARATOR.length > this._maxHeaderBytes) {
651
+ this.close(`Invalid header-delimited frame: header exceeds ${this._maxHeaderBytes} bytes`);
652
+ return;
653
+ }
654
+ try {
655
+ this._expectedLength = parseHeaders(this._residual.subarray(0, headerEnd), this._maxContentLength);
656
+ } catch (error) {
657
+ this.close(`Invalid header-delimited frame: ${error instanceof Error ? error.message : String(error)}`);
658
+ return;
659
+ }
660
+ this._residual = this._residual.subarray(headerEnd + HEADER_SEPARATOR.length);
661
+ }
662
+ if (this._residual.length < this._expectedLength) return;
663
+ const body = this._residual.subarray(0, this._expectedLength);
664
+ this._residual = this._residual.subarray(this._expectedLength);
665
+ this._expectedLength = void 0;
666
+ let parsed;
667
+ try {
668
+ parsed = JSON.parse(body.toString("utf8"));
669
+ } catch (error) {
670
+ this.close(`Invalid header-delimited JSON payload: ${error instanceof Error ? error.message : String(error)}`);
671
+ return;
672
+ }
673
+ this._deliver(parsed);
674
+ }
675
+ }
676
+ _onEnd() {
677
+ if (this._closed) return;
678
+ this.close(this._expectedLength !== void 0 || this._residual.length > 0 ? "Truncated header-delimited frame" : "Header-delimited input closed");
679
+ }
680
+ _deliver(message) {
681
+ if (this._listener) {
682
+ this._listener(message);
683
+ return;
684
+ }
685
+ if (this._pending.length >= this._maxPendingMessages) {
686
+ this.close(`Header-delimited pending message limit ${this._maxPendingMessages} exceeded`);
687
+ return;
688
+ }
689
+ this._pending.push(message);
690
+ }
691
+ };
692
+ function parseHeaders(headerBytes, maxContentLength) {
693
+ const values = /* @__PURE__ */ new Map();
694
+ for (const line of headerBytes.toString("ascii").split("\r\n")) {
695
+ const colon = line.indexOf(":");
696
+ if (colon <= 0) throw new Error(`malformed header ${JSON.stringify(line)}`);
697
+ const name = line.slice(0, colon).trim().toLowerCase();
698
+ const value = line.slice(colon + 1).trim();
699
+ if (values.has(name)) throw new Error(`duplicate ${name} header`);
700
+ values.set(name, value);
701
+ }
702
+ const rawLength = values.get("content-length");
703
+ if (rawLength === void 0 || !/^(0|[1-9]\d*)$/.test(rawLength)) throw new Error("missing or invalid Content-Length header");
704
+ const length = Number(rawLength);
705
+ if (!Number.isSafeInteger(length) || length > maxContentLength) throw new Error(`Content-Length exceeds ${maxContentLength} bytes`);
706
+ const contentType = values.get("content-type");
707
+ if (contentType !== void 0 && !isSupportedContentType(contentType)) throw new Error(`unsupported Content-Type ${JSON.stringify(contentType)}`);
708
+ return length;
709
+ }
710
+ function isSupportedContentType(value) {
711
+ const parts = value.split(";").map((part) => part.trim().toLowerCase());
712
+ return parts[0] === "application/vscode-jsonrpc" && parts.slice(1).every((part) => /^charset\s*=\s*"?utf-?8"?$/.test(part));
713
+ }
714
+ function positiveLimit(value, fallback, name) {
715
+ const result = value ?? fallback;
716
+ if (!Number.isSafeInteger(result) || result <= 0) throw new Error(`${name} must be a positive integer`);
717
+ return result;
718
+ }
719
+
720
+ export { HeaderDelimitedTransport, JsonRpcChannel, LINKRPC_ENDPOINT_VAR, WebSocketTransport, connectNdjson, formatEndpointUri, openHubChannel, openStdioChannel, openWebSocket, parseEndpointUri, runInitializeHandshake, startEndpoint, traceMessageTransport };
721
+ //# sourceMappingURL=node.js.map