42 lines
1.1 KiB
JavaScript
42 lines
1.1 KiB
JavaScript
import { spawn } from 'node:child_process'
|
|
|
|
function encodeMessage(payload) {
|
|
const body = Buffer.from(JSON.stringify(payload), 'utf8')
|
|
const len = Buffer.alloc(4)
|
|
len.writeUInt32LE(body.length, 0)
|
|
return Buffer.concat([len, body])
|
|
}
|
|
|
|
function decodeMessages(buffer) {
|
|
const messages = []
|
|
let offset = 0
|
|
while (offset + 4 <= buffer.length) {
|
|
const len = buffer.readUInt32LE(offset)
|
|
if (offset + 4 + len > buffer.length) break
|
|
const body = buffer.subarray(offset + 4, offset + 4 + len)
|
|
messages.push(JSON.parse(body.toString('utf8')))
|
|
offset += 4 + len
|
|
}
|
|
return messages
|
|
}
|
|
|
|
const child = spawn(process.execPath, ['host.mjs'], {
|
|
cwd: process.cwd(),
|
|
stdio: ['pipe', 'pipe', 'inherit'],
|
|
})
|
|
|
|
const chunks = []
|
|
child.stdout.on('data', (chunk) => chunks.push(chunk))
|
|
|
|
child.stdin.write(encodeMessage({ action: 'ping' }))
|
|
setTimeout(() => {
|
|
child.stdin.end()
|
|
}, 120)
|
|
|
|
child.on('exit', () => {
|
|
const out = Buffer.concat(chunks)
|
|
const messages = decodeMessages(out)
|
|
// eslint-disable-next-line no-console
|
|
console.log(JSON.stringify(messages, null, 2))
|
|
})
|