88 lines · 2.2 KB · Text
RawDownload
#!/usr/bin/env node const {spawn, execFileSync} = require('child_process') const RESOLUTION_REGEX = /(\d+) x (\d+)/const DIGIT_FLAG_REGEX = /^--?(\d+)$/ const args = process.argv.slice(2) // Parse the number of Zed instances to spawn.let instanceCount = 1const digitMatch = args[0]?.match(DIGIT_FLAG_REGEX)if (digitMatch) {  instanceCount = parseInt(digitMatch[1])  args.shift()}if (instanceCount > 4) {  throw new Error('Cannot spawn more than 4 instances')} // Parse the resolution of the main screenconst displayInfo = JSON.parse(  execFileSync(    'system_profiler',    ['SPDisplaysDataType', '-json'],    {encoding: 'utf8'}  ))const mainDisplayResolution = displayInfo  ?.SPDisplaysDataType[0]  ?.spdisplays_ndrvs  ?.find(entry => entry.spdisplays_main === "spdisplays_yes")  ?._spdisplays_resolution  ?.match(RESOLUTION_REGEX)if (!mainDisplayResolution) {  throw new Error('Could not parse screen resolution')}const screenWidth = parseInt(mainDisplayResolution[1])const screenHeight = parseInt(mainDisplayResolution[2]) // Determine the window size for each instancelet instanceWidth = screenWidthlet instanceHeight = screenHeightif (instanceCount > 1) {  instanceWidth = Math.floor(screenWidth / 2)  if (instanceCount > 2) {    instanceHeight = Math.floor(screenHeight / 2)  }} let users = [  'nathansobo',  'as-cii',  'maxbrunsfeld',  'iamnbutler'] // If a user is specified, make sure it's first in the listconst user = process.env.ZED_IMPERSONATEif (user) {  users = [user].concat(users.filter(u => u !== user))} const positions = [  '0,0',  `${instanceWidth},0`,  `0,${instanceHeight}`,  `${instanceWidth},${instanceHeight}`] execFileSync('cargo', ['build'], {stdio: 'inherit'}) setTimeout(() => {  for (let i = 0; i < instanceCount; i++) {    spawn('target/debug/Zed', i == 0 ? args : [], {      stdio: 'inherit',      env: {        ZED_IMPERSONATE: users[i],        ZED_WINDOW_POSITION: positions[i],        ZED_STATELESS: '1',        ZED_ALWAYS_ACTIVE: '1',        ZED_SERVER_URL: 'http://localhost:8080',        ZED_ADMIN_API_TOKEN: 'secret',        ZED_WINDOW_SIZE: `${instanceWidth},${instanceHeight}`      }    })  }}, 0.1)