// Outputs-only controlled server. The QML subscription and actions never use it. import assert from 'node:assert/strict'; import { readFileSync, realpathSync, lstatSync } from 'node:fs'; import { createConnection, createServer } from 'node:net'; import { dirname, join } from 'node:path'; assert.equal(process.env.NUGULAND_UI_SANDBOX, '1'); assert.equal(process.env.HOME, '/home/test'); const [socket, native, modeFile] = process.argv.slice(2); const runtime = realpathSync(process.env.XDG_RUNTIME_DIR); assert.equal(dirname(socket), runtime); assert.equal(dirname(realpathSync(native)), runtime); assert(lstatSync(native).isSocket()); assert.equal(modeFile, join(runtime, 'niri-integration-outputs.json')); createServer({ allowHalfOpen: true }, client => { let request = ''; client.on('error', error => { throw error; }); function first(chunk) { request += chunk; assert(request.length < 65536); if (!request.includes('\n')) return; client.removeListener('data', first); const name = JSON.parse(request.trim()); // niri msg requests Version when an output query is rejected. assert(['Outputs', 'Version'].includes(name)); const mode = JSON.parse(readFileSync(modeFile, 'utf8')); if (name === 'Outputs' && mode !== null) { client.end(JSON.stringify(mode) + '\n'); return; } let reply = ''; const upstream = createConnection(native, () => upstream.end(request)); upstream.on('error', error => { throw error; }); upstream.on('data', chunk => { reply += chunk; assert(reply.length < 1024 * 1024); if (reply.includes('\n')) { JSON.parse(reply.trim()); client.end(reply); upstream.destroy(); } }); } client.on('data', first); }).listen(socket, () => console.log('output fixture ready'));