extension.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // SPDX-FileCopyrightText: 2025 Weibo, Inc.
  2. //
  3. // SPDX-License-Identifier: Apache-2.0
  4. import net from "net"
  5. // Save original process methods
  6. const originalProcessOn = process.on
  7. const originalProcessSend = process.send || (() => false)
  8. // Store message event handlers
  9. const messageHandlers: ((message: any, socket?: net.Socket) => void)[] = []
  10. // Reconnection related variables
  11. let isReconnecting = false
  12. let reconnectAttempts = 0
  13. const MAX_RECONNECT_ATTEMPTS = 5
  14. const RECONNECT_DELAY = 1000 // 1 second
  15. // Override process.on
  16. process.on = function (event: string, listener: (...args: any[]) => void): any {
  17. if (event === "message") {
  18. messageHandlers.push((message: any, socket?: net.Socket) => {
  19. // Check the number of parameters for listener
  20. const paramCount = listener.length
  21. if (paramCount === 1) {
  22. // If only one parameter, pass only message
  23. listener(message)
  24. } else {
  25. // If multiple parameters, pass message and socket
  26. listener(message, socket)
  27. }
  28. })
  29. }
  30. return originalProcessOn.call(process, event, listener)
  31. }
  32. // Override process.send
  33. process.send = function (message: any): boolean {
  34. if (message?.type === "VSCODE_EXTHOST_IPC_READY") {
  35. console.log("Extension host process is ready to receive socket")
  36. connect()
  37. }
  38. // Call original process.send
  39. return originalProcessSend.call(process, message)
  40. }
  41. // Establish socket connection
  42. function connect() {
  43. if (isReconnecting) {
  44. console.log("Already in reconnection process, skipping")
  45. return
  46. }
  47. try {
  48. // Get socket server information from environment variables
  49. const host = process.env.VSCODE_EXTHOST_SOCKET_HOST || "127.0.0.1"
  50. const port = parseInt(process.env.VSCODE_EXTHOST_SOCKET_PORT || "0", 10)
  51. if (!port) {
  52. throw new Error("Invalid socket port")
  53. }
  54. console.log(`Attempting to connect to ${host}:${port}`)
  55. // Establish socket connection
  56. const socket = net.createConnection(port, host)
  57. // Set socket noDelay option
  58. socket.setNoDelay(true)
  59. socket.on("connect", () => {
  60. console.log("Connected to main server")
  61. isReconnecting = false
  62. reconnectAttempts = 0
  63. // Prepare message to send to VSCode module
  64. const socketMessage = {
  65. type: "VSCODE_EXTHOST_IPC_SOCKET",
  66. initialDataChunk: "",
  67. skipWebSocketFrames: true,
  68. permessageDeflate: false,
  69. inflateBytes: "",
  70. }
  71. // Call all saved message handlers
  72. messageHandlers.forEach((handler) => {
  73. try {
  74. handler(socketMessage, socket)
  75. } catch (error) {
  76. console.error("Error in message handler:", error)
  77. }
  78. })
  79. })
  80. socket.on("error", (error: Error) => {
  81. console.error("Socket connection error:", error)
  82. handleDisconnect()
  83. })
  84. socket.on("close", () => {
  85. console.log("Socket connection closed")
  86. handleDisconnect()
  87. })
  88. } catch (error) {
  89. console.error("Connection error:", error)
  90. handleDisconnect()
  91. }
  92. }
  93. // Handle disconnection
  94. async function handleDisconnect() {
  95. if (isReconnecting) {
  96. console.log("Already in reconnection process, skipping")
  97. return
  98. }
  99. isReconnecting = true
  100. reconnectAttempts++
  101. if (reconnectAttempts > MAX_RECONNECT_ATTEMPTS) {
  102. console.error("Max reconnection attempts reached. Giving up.")
  103. isReconnecting = false
  104. return
  105. }
  106. console.log(`Attempting to reconnect (attempt ${reconnectAttempts}/${MAX_RECONNECT_ATTEMPTS})...`)
  107. // Wait for a while before retrying
  108. console.log(`Waiting ${RECONNECT_DELAY}ms before reconnecting...`)
  109. await new Promise((resolve) => setTimeout(resolve, RECONNECT_DELAY))
  110. console.log("Reconnection delay finished, attempting to connect...")
  111. connect()
  112. }
  113. console.log("Starting extension host process...")
  114. import start from "./deps/vscode/vs/workbench/api/node/extensionHostProcess.js"
  115. // This line will trigger extension host related logic startup, actual logic is in extensionHostProcess,
  116. // Do not handle specific plugin business logic in subsequent content of this file
  117. start()