in go/wsl/hub/hub.go [125:172]
func (h *Hub) newSessionFromCaps(ctx context.Context, caps *capabilities.Capabilities, w http.ResponseWriter) (string, *driver.Driver, error) {
sessionID := "last"
if i, ok := caps.AlwaysMatch["google:sessionId"]; ok {
switch ii := i.(type) {
case string:
sessionID = ii
case float64:
sessionID = strconv.Itoa(int(ii))
default:
return "", nil, fmt.Errorf("google:sessionId %#v is not a string or number", i)
}
}
resolver := resolver.New(sessionID)
caps, err := caps.Resolve(resolver.Resolve)
if err != nil {
return "", nil, err
}
wslConfig, ok := caps.AlwaysMatch["google:wslConfig"].(map[string]interface{})
if !ok {
if err := resolver.RecyclePorts(); err != nil {
log.Printf("Error recycling ports: %v", err)
}
return "", nil, errors.New("alwaysMatch capabilites must include google:wslConfig")
}
d, err := driver.New(ctx, h.localHost, sessionID, wslConfig, resolver)
if err != nil {
if err := resolver.RecyclePorts(); err != nil {
log.Printf("Error recycling ports: %v", err)
}
return "", nil, fmt.Errorf("Error launching driver binary: %w", err)
}
s, err := d.NewSession(ctx, caps, w)
if err != nil {
ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()
if err := d.Shutdown(ctx); err != nil {
log.Printf("Error shutting down driver: %v", err)
}
return "", nil, fmt.Errorf("Error requesting new session: %w", err)
}
return s, d, nil
}