hostapps

package
v0.13.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 29, 2026 License: MIT Imports: 37 Imported by: 0

Documentation

Overview

Package hostapps connects Redeven's application catalog and owned sessions to native macOS applications or installed GIO and Xpra runtimes. Applications execute as the Runtime user.

Index

Constants

View Source
const ClientAssetsPath = "/_redeven_proxy/host-application-assets/"

ClientAssetsPath is independent of the ephemeral sharing route. Only the authenticated appserver serves this namespace, never a port-forward backend.

Variables

View Source
var (
	ErrViewerPreparation = errors.New("host application viewer preparation failed")
	ErrUnavailable       = errors.New("host applications are unavailable")
	ErrNotFound          = errors.New("application or session not found")
	ErrInvalid           = errors.New("invalid application request")
	ErrQuitRejected      = errors.New("application declined the quit request")
	ErrLimit             = errors.New("host application session limit reached")
)

Functions

func LaunchFailureCode

func LaunchFailureCode(code string) string

LaunchFailureCode maps released native diagnostics to product recovery actions. Unknown diagnostics stay failures; they never imply an application exit.

Types

type AddRequest

type AddRequest struct {
	Name       string `json:"name"`
	Executable string `json:"executable"`
	Arguments  string `json:"arguments"`
}

type Application

type Application struct {
	ID          string   `json:"id"`
	Name        string   `json:"name"`
	Description string   `json:"description"`
	Categories  []string `json:"categories"`
	Icon        string   `json:"icon"`
	Custom      bool     `json:"custom"`
}

type Availability

type Availability struct {
	Backend      string          `json:"backend,omitempty"`
	NativeReady  bool            `json:"native_ready,omitempty"`
	Permissions  map[string]bool `json:"permissions,omitempty"`
	Supported    bool            `json:"supported"`
	Ready        bool            `json:"ready"`
	Reason       string          `json:"reason,omitempty"`
	Version      string          `json:"version,omitempty"`
	Requirements []string        `json:"requirements,omitempty"`
}

type Backend

type Backend interface {
	PrepareBrowser(context.Context, string, string, string) (Application, error)
	ClientAssets(string, string) *nativeapps.ClientAssets
	SetupStatus(string) (SetupStatus, error)
	WatchSetup() (<-chan struct{}, func(), error)
	SetupPlan(context.Context, string) (SetupTransferPlan, error)
	StartSetup(string, string, string, int64, string) (SetupStatus, error)
	CancelSetup(string, string) (SetupStatus, error)
	WriteSetup(string, string, int64, []byte) (SetupStatus, error)
	CompleteSetup(string, string) (SetupStatus, error)
	Catalog(context.Context, string, string) (Catalog, error)
	Sessions(string) []Session
	Launch(context.Context, string, LaunchRequest) (Session, error)
	Running(context.Context, string) ([]RunningApplication, error)
	Quit(context.Context, string, QuitRequest) error
	Terminate(context.Context, string, QuitRequest) error
	Detach(context.Context, string, string) error
	Stop(context.Context, string, string) error
	Add(context.Context, AddRequest) error
	ForTarget(string) (Session, string, bool)
	ForForward(string) (Session, string, bool)
	Password(string) string
	Permissions(context.Context, string) error
}

type Catalog

type Catalog struct {
	Running      []RunningApplication `json:"running,omitempty"`
	Availability Availability         `json:"availability"`
	Applications []Application        `json:"applications"`
	Sessions     []Session            `json:"sessions"`
}

type LaunchDiagnostic

type LaunchDiagnostic struct {
	Stage    string `json:"stage,omitempty"`
	Code     string `json:"code,omitempty"`
	ExitCode *int   `json:"exit_code,omitempty"`
}

LaunchDiagnostic contains bounded protocol identifiers and an observed exit status. Child output, environment and application contents are never included.

type LaunchRequest

type LaunchRequest struct {
	Mode          string       `json:"mode,omitempty"`
	ApplicationID string       `json:"application_id"`
	Locale        string       `json:"locale"`
	Presentation  Presentation `json:"presentation"`
}

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

func New

func New(state, home string, forwards *portforward.Service) *Manager

func (*Manager) Add

func (m *Manager) Add(ctx context.Context, req AddRequest) error

func (*Manager) CancelSetup

func (m *Manager) CancelSetup(owner, id string) (SetupStatus, error)

func (*Manager) Catalog

func (m *Manager) Catalog(ctx context.Context, owner, locale string) (Catalog, error)

func (*Manager) ClientAssets

func (m *Manager) ClientAssets(owner, digest string) *nativeapps.ClientAssets

ClientAssets selects public bytes for an authenticated owner. The caller must separately authorize session documents and live control, even on cache hits.

func (*Manager) Close

func (m *Manager) Close() error

func (*Manager) CompleteSetup

func (m *Manager) CompleteSetup(owner, id string) (SetupStatus, error)

func (*Manager) Detach

func (m *Manager) Detach(ctx context.Context, owner, id string) error

func (*Manager) ForForward

func (m *Manager) ForForward(id string) (Session, string, bool)

ForForward keeps terminal presentation addressable after the network forward is released. Exact forward identity cannot reclaim a reused loopback address.

func (*Manager) ForTarget

func (m *Manager) ForTarget(target string) (Session, string, bool)

func (*Manager) Launch

func (m *Manager) Launch(ctx context.Context, owner string, req LaunchRequest) (Session, error)

func (*Manager) Password

func (m *Manager) Password(id string) string

func (*Manager) Permissions

func (m *Manager) Permissions(ctx context.Context, permission string) error

func (*Manager) PrepareBrowser

func (m *Manager) PrepareBrowser(ctx context.Context, owner, installationID, nativeHost string) (Application, error)

PrepareBrowser creates only a fixed, product-owned desktop entry and profile. Launch, graphical preparation, reconnection and shutdown use the ordinary host-application owner. Preparing this entry never starts a browser.

func (*Manager) Quit

func (m *Manager) Quit(ctx context.Context, owner string, req QuitRequest) error

func (*Manager) Running

func (m *Manager) Running(ctx context.Context, owner string) ([]RunningApplication, error)

Running is a lightweight OS snapshot, independent of viewer/session lifetime.

func (*Manager) Sessions

func (m *Manager) Sessions(owner string) []Session

func (*Manager) SetupPlan

func (m *Manager) SetupPlan(ctx context.Context, _ string) (SetupTransferPlan, error)

func (*Manager) SetupStatus

func (m *Manager) SetupStatus(owner string) (SetupStatus, error)

func (*Manager) StartSetup

func (m *Manager) StartSetup(owner, requestID, source string, size int64, digest string) (SetupStatus, error)

func (*Manager) Stop

func (m *Manager) Stop(ctx context.Context, owner, id string) error

func (*Manager) Terminate

func (m *Manager) Terminate(ctx context.Context, owner string, req QuitRequest) error

func (*Manager) WatchSetup

func (m *Manager) WatchSetup() (<-chan struct{}, func(), error)

func (*Manager) WriteSetup

func (m *Manager) WriteSetup(owner, id string, offset int64, data []byte) (SetupStatus, error)

type Presentation

type Presentation struct {
	NoWindow                  string `json:"noWindow,omitempty"`
	BrowserProfileUnavailable string `json:"browserProfileUnavailable,omitempty"`
	NativePictureHint         string `json:"nativePictureHint,omitempty"`
	PictureUpgradeHint        string `json:"pictureUpgradeHint,omitempty"`
	PackageUnavailable        string `json:"packageUnavailable,omitempty"`
	HostServiceUnavailable    string `json:"hostServiceUnavailable,omitempty"`
	GraphicsUnavailable       string `json:"graphicsUnavailable,omitempty"`
	PlanStale                 string `json:"planStale,omitempty"`
	PackageUnsupported        string `json:"packageUnsupported,omitempty"`
	ClipboardUnavailable      string `json:"clipboardUnavailable,omitempty"`
	InputUnsupported          string `json:"inputUnsupported,omitempty"`
	InputUnsupportedHint      string `json:"inputUnsupportedHint,omitempty"`
	ViewerPreparationFailed   string `json:"viewerPreparationFailed,omitempty"`
	ViewerPreparationHint     string `json:"viewerPreparationHint,omitempty"`

	Keyboard                string `json:"keyboard,omitempty"`
	TouchHelp               string `json:"touchHelp,omitempty"`
	TouchHelpTitle          string `json:"touchHelpTitle,omitempty"`
	TouchHelpDescription    string `json:"touchHelpDescription,omitempty"`
	InputUnavailable        string `json:"inputUnavailable,omitempty"`
	InputUnavailableHint    string `json:"inputUnavailableHint,omitempty"`
	InputVersionUnsupported string `json:"inputVersionUnsupported,omitempty"`
	InputVersionHint        string `json:"inputVersionHint,omitempty"`

	ShellTheme      string `json:"shellTheme,omitempty"`
	Quit            string `json:"quit,omitempty"`
	QuitTitle       string `json:"quitTitle,omitempty"`
	QuitDescription string `json:"quitDescription,omitempty"`
	QuitPending     string `json:"quitPending,omitempty"`
	QuitFailed      string `json:"quitFailed,omitempty"`
	Cancel          string `json:"cancel,omitempty"`

	Checking              string `json:"checking,omitempty"`
	ApplicationExited     string `json:"applicationExited,omitempty"`
	ApplicationExitedHint string `json:"applicationExitedHint,omitempty"`
	WindowsClosed         string `json:"windowsClosed,omitempty"`
	WindowsClosedHint     string `json:"windowsClosedHint,omitempty"`
	SharingStopped        string `json:"sharingStopped,omitempty"`
	SharingStoppedHint    string `json:"sharingStoppedHint,omitempty"`
	EndedHint             string `json:"endedHint,omitempty"`
	SessionMissing        string `json:"sessionMissing,omitempty"`
	SessionMissingHint    string `json:"sessionMissingHint,omitempty"`
	AccessRequired        string `json:"accessRequired,omitempty"`
	AccessHint            string `json:"accessHint,omitempty"`
	Dismiss               string `json:"dismiss,omitempty"`

	PermissionRequired string `json:"permissionRequired,omitempty"`
	PermissionHint     string `json:"permissionHint,omitempty"`
	SessionUnavailable string `json:"sessionUnavailable,omitempty"`
	SessionHint        string `json:"sessionHint,omitempty"`
	SessionFailed      string `json:"sessionFailed,omitempty"`
	ReopenHint         string `json:"reopenHint,omitempty"`
	CaptureHint        string `json:"captureHint,omitempty"`

	Controls                string `json:"controls,omitempty"`
	PicturePixels           string `json:"picturePixels,omitempty"`
	Picture                 string `json:"picture,omitempty"`
	PictureAuto             string `json:"pictureAuto,omitempty"`
	PictureClarity          string `json:"pictureClarity,omitempty"`
	PictureSmooth           string `json:"pictureSmooth,omitempty"`
	PictureData             string `json:"pictureData,omitempty"`
	PictureHint             string `json:"pictureHint,omitempty"`
	PictureBackendLimitHint string `json:"pictureBackendLimitHint,omitempty"`
	PictureRenderResolution string `json:"pictureRenderResolution,omitempty"`
	PictureLimited          string `json:"pictureLimited,omitempty"`
	PictureDisplayLimitHint string `json:"pictureDisplayLimitHint,omitempty"`
	PictureDensityLimitHint string `json:"pictureDensityLimitHint,omitempty"`
	PictureAdvanced         string `json:"pictureAdvanced,omitempty"`
	PictureResolution       string `json:"pictureResolution,omitempty"`
	PictureFrameRate        string `json:"pictureFrameRate,omitempty"`
	PictureActualRate       string `json:"pictureActualRate,omitempty"`
	PictureBandwidth        string `json:"pictureBandwidth,omitempty"`
	PictureTransport        string `json:"pictureTransport,omitempty"`
	PictureVideo            string `json:"pictureVideo,omitempty"`
	PictureImages           string `json:"pictureImages,omitempty"`
	VideoDecoding           string `json:"videoDecoding,omitempty"`
	VideoAvailable          string `json:"videoAvailable,omitempty"`
	VideoUnavailable        string `json:"videoUnavailable,omitempty"`
	HttpsPerformanceHint    string `json:"httpsPerformanceHint,omitempty"`

	OperationFailed    string `json:"operationFailed,omitempty"`
	WaitingHint        string `json:"waitingHint,omitempty"`
	Waiting            string `json:"waiting,omitempty"`
	CaptureUnavailable string `json:"captureUnavailable,omitempty"`
	Menu               string `json:"menu,omitempty"`
	Input              string `json:"input,omitempty"`
	Windows            string `json:"windows,omitempty"`
	CloseWindow        string `json:"closeWindow,omitempty"`
	SharedControl      string `json:"sharedControl,omitempty"`
	Locale             string `json:"locale"`
	Connecting         string `json:"connecting"`
	Reconnecting       string `json:"reconnecting"`
	Disconnected       string `json:"disconnected"`
	ConnectionHint     string `json:"connectionHint"`
	Reconnect          string `json:"reconnect"`
	Starting           string `json:"starting"`
	Failed             string `json:"failed"`
	Ended              string `json:"ended"`
	Retry              string `json:"retry"`
}

Presentation comes from the caller's explicit localized catalog. The window document renders these bounded strings as text, never as markup or script.

type QuitRequest

type QuitRequest = RunningApplication

QuitRequest binds an explicit quit to the exact process generations displayed.

type RunningApplication

type RunningApplication struct {
	ApplicationID string   `json:"application_id"`
	Instances     []string `json:"instances"`
}

type Session

type Session struct {
	ExistingApplication bool                        `json:"existing_application,omitempty"`
	Backend             string                      `json:"backend,omitempty"`
	Mode                string                      `json:"mode,omitempty"`
	ID                  string                      `json:"id"`
	Application         Application                 `json:"application"`
	State               string                      `json:"state"`
	EndReason           string                      `json:"end_reason,omitempty"`
	ErrorCode           string                      `json:"error_code,omitempty"`
	LaunchDiagnostic    *LaunchDiagnostic           `json:"launch_diagnostic,omitempty"`
	StartedAt           int64                       `json:"started_at_unix_ms"`
	Forward             *portforward.ForwardSession `json:"forward,omitempty"`
	Presentation        Presentation                `json:"presentation"`
}

type SetupPackage

type SetupPackage struct {
	ID             string `json:"id"`
	Digest         string `json:"digest"`
	Architecture   string `json:"architecture"`
	SizeBytes      int64  `json:"size_bytes"`
	InstalledBytes int64  `json:"installed_bytes"`
}

type SetupStatus

type SetupStatus struct {
	nativeapps.Status
	Package *SetupPackage `json:"package,omitempty"`
}

type SetupTransferPlan

type SetupTransferPlan = nativeapps.TransferPlan

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL