in src/dataEditor/dataEditorClient.ts [1182:1285]
async function serverStart() {
await serverStop()
const serverStartingText = `Ωedit server starting on port ${omegaEditPort}`
const statusBarItem = vscode.window.createStatusBarItem(
vscode.StatusBarAlignment.Left
)
statusBarItem.text = serverStartingText
statusBarItem.show()
let animationFrame = 0
const animationInterval = 400 // ms per frame
const animationFrames = ['', '.', '..', '...']
const animationIntervalId = setInterval(() => {
statusBarItem.text = `${serverStartingText} ${
animationFrames[++animationFrame % animationFrames.length]
}`
}, animationInterval)
const config = vscode.workspace.getConfiguration('dataEditor')
const logLevel =
process.env.OMEGA_EDIT_SERVER_LOG_LEVEL ||
process.env.OMEGA_EDIT_LOG_LEVEL ||
config.get<string>('logLevel', 'info')
const logConfigFile = generateLogbackConfigFile(
path.join(APP_DATA_PATH, `serv-${omegaEditPort}.log`),
logLevel
)
if (!fs.existsSync(logConfigFile)) {
clearInterval(animationIntervalId)
statusBarItem.dispose()
throw new Error(`Log config file '${logConfigFile}' not found`)
}
// Start the server and wait up to 10 seconds for it to start
const serverPid = (await Promise.race([
startServer(
omegaEditPort,
OMEGA_EDIT_HOST,
getPidFile(omegaEditPort),
logConfigFile
),
new Promise((_resolve, reject) => {
setTimeout(() => {
reject((): Error => {
return new Error(
`Server startup timed out after ${SERVER_START_TIMEOUT} seconds`
)
})
}, SERVER_START_TIMEOUT * 1000)
}),
])) as number | undefined
clearInterval(animationIntervalId)
if (serverPid === undefined || serverPid <= 0) {
statusBarItem.dispose()
throw new Error('Server failed to start or PID is invalid')
}
// this makes sure the server if fully online and ready to take requests
statusBarItem.text = `Initializing Ωedit server on port ${omegaEditPort}`
for (let i = 1; i <= 60; ++i) {
try {
await getServerInfo()
break
} catch (err) {
statusBarItem.text = `Initializing Ωedit server on port ${omegaEditPort} (${i}/60)`
}
// wait 1 second before trying again
await new Promise((resolve) => {
setTimeout(() => {
resolve(true)
}, 1000)
})
}
try {
serverInfo = await getServerInfo()
} catch (err) {
statusBarItem.dispose()
await serverStop()
throw new Error('Server failed to initialize')
}
statusBarItem.text = `Ωedit server on port ${omegaEditPort} initialized`
const serverVersion = serverInfo.serverVersion
// if the OS is not Windows, check that the server PID matches the one started
// NOTE: serverPid is the PID of the server wrapper script on Windows
if (
!os.platform().toLowerCase().startsWith('win') &&
serverInfo.serverProcessId !== serverPid
) {
statusBarItem.dispose()
throw new Error(
`server PID mismatch ${serverInfo.serverProcessId} != ${serverPid}`
)
}
const clientVersion = getClientVersion()
if (serverVersion !== clientVersion) {
statusBarItem.dispose()
throw new Error(
`Server version ${serverVersion} and client version ${clientVersion} must match`
)
}
statusBarItem.text = `Ωedit server v${serverVersion} ready on port ${omegaEditPort} with PID ${serverInfo.serverProcessId}`
setTimeout(() => {
statusBarItem.dispose()
}, 5000)
}