in packages/@jsii/go-runtime/jsii-runtime-go/internal/kernel/process/process.go [64:144]
func NewProcess(compatibleVersions string) (*Process, error) {
p := Process{}
if constraints, err := semver.NewConstraint(compatibleVersions); err != nil {
return nil, err
} else {
p.compatibleVersions = constraints
}
if custom := os.Getenv(JSII_RUNTIME); custom != "" {
var (
command string
args []string
)
// Sub-shelling in order to avoid having to parse arguments
if runtime.GOOS == "windows" {
// On windows, we use %ComSpec% if set, or cmd.exe
if cmd := os.Getenv("ComSpec"); cmd != "" {
command = cmd
} else {
command = "cmd.exe"
}
// The /d option disables Registry-defined AutoRun, it's safer to enable
// The /s option tells cmd.exe the command is quoted as if it were typed into a prompt
// The /c option tells cmd.exe to run the specified command and exit immediately
args = []string{"/d", "/s", "/c", custom}
} else {
// On other OS'es, we use $SHELL and fall back to "/bin/sh"
if shell := os.Getenv("SHELL"); shell != "" {
command = shell
} else {
command = "/bin/sh"
}
args = []string{"-c", custom}
}
p.cmd = exec.Command(command, args...)
} else if tmpdir, err := ioutil.TempDir("", "jsii-runtime.*"); err != nil {
return nil, err
} else {
p.tmpdir = tmpdir
if entrypoint, err := embedded.ExtractRuntime(tmpdir); err != nil {
p.Close()
return nil, err
} else {
if node := os.Getenv(JSII_NODE); node != "" {
p.cmd = exec.Command(node, entrypoint)
} else {
p.cmd = exec.Command("node", entrypoint)
}
}
}
// Setting up environment - if duplicate keys are found, the last value is used, so we are careful with ordering. In
// particular, we are setting NODE_OPTIONS only if `os.Environ()` does not have another value... So the user can
// control the environment... However, JSII_AGENT must always be controlled by this process.
p.cmd.Env = append([]string{"NODE_OPTIONS=--max-old-space-size=4069"}, os.Environ()...)
p.cmd.Env = append(p.cmd.Env, fmt.Sprintf("JSII_AGENT=%v/%v/%v", runtime.Version(), runtime.GOOS, runtime.GOARCH))
if stdin, err := p.cmd.StdinPipe(); err != nil {
p.Close()
return nil, err
} else {
p.stdin = stdin
p.requests = json.NewEncoder(stdin)
}
if stdout, err := p.cmd.StdoutPipe(); err != nil {
p.Close()
return nil, err
} else {
p.stdout = stdout
p.responses = json.NewDecoder(stdout)
}
if stderr, err := p.cmd.StderrPipe(); err != nil {
p.Close()
return nil, err
} else {
p.stderr = stderr
}
return &p, nil
}