-
Notifications
You must be signed in to change notification settings - Fork 0
/
factory.go
65 lines (54 loc) · 1.38 KB
/
factory.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package nodejs
import (
"fmt"
"log/slog"
"os"
"os/exec"
"path/filepath"
"runtime"
"time"
)
type Factory struct {
nodePath string
version string
}
func New() (*Factory, error) {
factory := &Factory{}
if runtime.GOOS != "windows" {
// unix → check if we have azusa nodejs available
p := "/pkg/main/net-libs.nodejs.core/bin/node"
if _, err := os.Stat(p); err == nil {
p, err = filepath.EvalSymlinks(p)
if err == nil {
factory.nodePath = p
if err = factory.initialCheck(); err != nil {
return nil, err
}
return factory, nil
}
}
}
p, err := exec.LookPath("node")
if err != nil {
return nil, err
}
factory.nodePath = p
return factory, nil
}
func (factory *Factory) New() (*Process, error) {
return startProcess(factory.nodePath)
}
func (factory *Factory) initialCheck() error {
// check if usable nodejs
slog.Debug(fmt.Sprintf("[nodejs] Using nodejs found at %s", factory.nodePath), "event", "nodejs:path")
proc, err := factory.New()
if err != nil {
slog.Error("[nodejs] Nodejs cannot be used, giving up", "event", "nodejs:fail")
return err
}
defer proc.Close()
proc.Checkpoint(30 * time.Second)
factory.version = proc.GetVersion("node")
slog.Debug(fmt.Sprintf("[nodejs] Confirmed nodejs running version %s, latency = %s", factory.version, proc.ping(5)), "event", "nodejs:version", "nodejs.version", factory.version)
return nil
}