src/node/wrapper.ts/ParentProcess/constructor
class ParentProcess:  public constructor(private currentVersion: string) {
    super()

    process.on("SIGUSR1", async () => {
      this.logger.info("Received SIGUSR1; hotswapping")
      this.relaunch()
    })

    process.on("SIGUSR2", async () => {
      this.logger.info("Received SIGUSR2; hotswapping")
      this.relaunch()
    })

    const opts = {
      size: "10M",
      maxFiles: 10,
    }
    this.logStdoutStream = rfs.createStream(path.join(paths.data, "coder-logs", "code-server-stdout.log"), opts)
    this.logStderrStream = rfs.createStream(path.join(paths.data, "coder-logs", "code-server-stderr.log"), opts)

    this.onDispose(() => this.disposeChild())

    this.onChildMessage((message) => {
      switch (message.type) {
        case "relaunch":
          this.logger.info(`Relaunching: ${this.currentVersion} -> ${message.version}`)
          this.currentVersion = message.version
          this.relaunch()
          break
        default:
          this.logger.error(`Unrecognized message ${message}`)
          break
      }
    })
  }