func()

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
}