From b3222556842e0d88cbb86a140e9c0124bf976d72 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 8 Oct 2025 20:10:22 +0300 Subject: [PATCH] fix: resolve all Go and TypeScript linting issues Address all linting warnings and errors in both backend and frontend code: **Go (golangci-lint):** - Add error checking for ignored return values (errcheck) - Remove unused RPC functions (unused) - Fix import formatting (goimports) **TypeScript/React (eslint):** - Replace all 'any' and 'Function' types with proper type definitions - Add RpcSendFunction type for consistent JSON-RPC callback signatures - Fix React Hook exhaustive-deps warnings by adding missing dependencies - Wrap functions in useCallback where needed to stabilize dependencies - Remove unused variables and imports - Remove empty code blocks - Suppress exhaustive-deps warnings where intentional (with comments) All linting now passes with 0 errors and 0 warnings. --- cloud.go | 10 +- config.go | 34 +- datachannel_helpers.go | 2 +- deploy.log | 999 ++++++++++++++++++ errors.go | 2 +- internal/session/permissions.go | 132 +-- internal/session/types.go | 2 +- jsonrpc.go | 28 +- main.go | 8 +- session_manager.go | 88 +- session_permissions.go | 2 +- ui/src/api/sessionApi.ts | 45 +- ui/src/components/AccessDeniedOverlay.tsx | 12 +- ui/src/components/ActionBar.tsx | 7 +- ui/src/components/NicknameModal.tsx | 11 +- ui/src/components/SessionControlPanel.tsx | 19 +- ui/src/components/SessionsList.tsx | 1 + .../UnifiedSessionRequestDialog.tsx | 4 +- ui/src/components/WebRTCVideo.tsx | 12 +- ui/src/components/popovers/SessionPopover.tsx | 17 +- ui/src/hooks/usePermissions.ts | 17 +- ui/src/hooks/useSessionEvents.ts | 17 +- ui/src/hooks/useSessionManagement.ts | 26 +- .../devices.$id.settings.multi-session.tsx | 7 +- ui/src/routes/devices.$id.settings.tsx | 3 +- ui/src/routes/devices.$id.tsx | 7 +- ui/src/utils/nicknameGenerator.ts | 11 +- web.go | 26 +- webrtc.go | 34 +- 29 files changed, 1299 insertions(+), 284 deletions(-) create mode 100644 deploy.log diff --git a/cloud.go b/cloud.go index 33fa7377..479d37b0 100644 --- a/cloud.go +++ b/cloud.go @@ -535,11 +535,11 @@ func handleSessionRequest( } err = wsjson.Write(context.Background(), c, gin.H{ - "type": "answer", - "data": sd, - "sessionId": session.ID, - "mode": session.Mode, - "nickname": session.Nickname, + "type": "answer", + "data": sd, + "sessionId": session.ID, + "mode": session.Mode, + "nickname": session.Nickname, "requireNickname": requireNickname, "requireApproval": requireApproval, }) diff --git a/config.go b/config.go index bc8b463d..024a5844 100644 --- a/config.go +++ b/config.go @@ -79,10 +79,10 @@ func (m *KeyboardMacro) Validate() error { // MultiSessionConfig defines settings for multi-session support type MultiSessionConfig struct { - Enabled bool `json:"enabled"` - MaxSessions int `json:"max_sessions"` - PrimaryTimeout int `json:"primary_timeout_seconds"` - AllowCloudOverride bool `json:"allow_cloud_override"` + Enabled bool `json:"enabled"` + MaxSessions int `json:"max_sessions"` + PrimaryTimeout int `json:"primary_timeout_seconds"` + AllowCloudOverride bool `json:"allow_cloud_override"` RequireAuthTransfer bool `json:"require_auth_transfer"` } @@ -139,15 +139,15 @@ func (c *Config) SetDisplayRotation(rotation string) error { const configPath = "/userdata/kvm_config.json" var defaultConfig = &Config{ - CloudURL: "https://api.jetkvm.com", - CloudAppURL: "https://app.jetkvm.com", - AutoUpdateEnabled: true, // Set a default value - ActiveExtension: "", + CloudURL: "https://api.jetkvm.com", + CloudAppURL: "https://app.jetkvm.com", + AutoUpdateEnabled: true, // Set a default value + ActiveExtension: "", MultiSession: &MultiSessionConfig{ - Enabled: true, // Enable by default for new features - MaxSessions: 10, // Reasonable default - PrimaryTimeout: 300, // 5 minutes - AllowCloudOverride: true, // Cloud sessions can take control + Enabled: true, // Enable by default for new features + MaxSessions: 10, // Reasonable default + PrimaryTimeout: 300, // 5 minutes + AllowCloudOverride: true, // Cloud sessions can take control RequireAuthTransfer: false, // Don't require auth by default }, KeyboardMacros: []KeyboardMacro{}, @@ -157,12 +157,12 @@ var defaultConfig = &Config{ DisplayDimAfterSec: 120, // 2 minutes DisplayOffAfterSec: 1800, // 30 minutes SessionSettings: &SessionSettings{ - RequireApproval: false, - RequireNickname: false, - ReconnectGrace: 10, // 10 seconds default - PrivateKeystrokes: false, // By default, share keystrokes with observers + RequireApproval: false, + RequireNickname: false, + ReconnectGrace: 10, // 10 seconds default + PrivateKeystrokes: false, // By default, share keystrokes with observers }, - JigglerEnabled: false, + JigglerEnabled: false, // This is the "Standard" jiggler option in the UI JigglerConfig: &JigglerConfig{ InactivityLimitSeconds: 60, diff --git a/datachannel_helpers.go b/datachannel_helpers.go index dd1ad2da..8edfd095 100644 --- a/datachannel_helpers.go +++ b/datachannel_helpers.go @@ -4,7 +4,7 @@ import "github.com/pion/webrtc/v4" func handlePermissionDeniedChannel(d *webrtc.DataChannel, message string) { d.OnOpen(func() { - d.SendText(message + "\r\n") + _ = d.SendText(message + "\r\n") d.Close() }) d.OnMessage(func(msg webrtc.DataChannelMessage) {}) diff --git a/deploy.log b/deploy.log new file mode 100644 index 00000000..31640d15 --- /dev/null +++ b/deploy.log @@ -0,0 +1,999 @@ +▶ Building frontend(B + +added 429 packages, and audited 430 packages in 16s + +142 packages are looking for funding + run `npm fund` for details + +found 0 vulnerabilities + +> kvm-ui@2025.10.01.1900 build:device +> tsc && vite build --mode=device --emptyOutDir + +vite v7.1.7 building for device... +transforming... +✓ 2995 modules transformed. +rendering chunks... +20:14:45 info [plugin vite:reporter] +20:14:45 info (!) /workspaces/kvm/ui/src/hooks/hidRpc.ts is dynamically imported by /workspaces/kvm/ui/src/hooks/usePermissions.ts but also statically imported by /workspaces/kvm/ui/src/hooks/useHidRpc.ts, /workspaces/kvm/ui/src/hooks/useKeyboard.ts, dynamic import will not move module into another chunk. +20:14:45 info  +computing gzip size... +../static/index.html 2.84 kB │ gzip: 0.95 kB +../static/assets/immutable/netboot-icon-OoGRDuxL.svg 10.60 kB │ gzip: 4.51 kB +../static/assets/immutable/keyboard-and-mouse-connected-CIPI4-KS.png 13.38 kB +../static/assets/immutable/CircularXXWeb-Book-DcdztGze.woff2 68.28 kB +../static/assets/immutable/CircularXXWeb-Thin-CgvRHm5r.woff2 69.73 kB +../static/assets/immutable/CircularXXWeb-ThinItalic-BbeKWZX4.woff2 69.82 kB +../static/assets/immutable/CircularXXWeb-Regular-C2Km8yIq.woff2 70.32 kB +../static/assets/immutable/CircularXXWeb-Italic-D9ZGG85N.woff2 70.87 kB +../static/assets/immutable/CircularXXWeb-BookItalic-Dot97ozQ.woff2 70.92 kB +../static/assets/immutable/CircularXXWeb-Medium-B7cMW5Np.woff2 71.26 kB +../static/assets/immutable/CircularXXWeb-MediumItalic-Cw0wlEIE.woff2 72.14 kB +../static/assets/immutable/CircularXXWeb-BlackItalic-2aNe932P.woff2 72.99 kB +../static/assets/immutable/CircularXXWeb-LightItalic-DkMJsSQn.woff2 73.33 kB +../static/assets/immutable/CircularXXWeb-Light-COmyZsa9.woff2 73.63 kB +../static/assets/immutable/CircularXXWeb-Black-CPoU8bYr.woff2 73.63 kB +../static/assets/immutable/CircularXXWeb-BoldItalic-BY-z05Z9.woff2 73.76 kB +../static/assets/immutable/CircularXXWeb-Bold-6tPVDRzI.woff2 74.18 kB +../static/assets/immutable/CircularXXWeb-ExtraBlackItalic-B8bd8esZ.woff2 75.12 kB +../static/assets/immutable/CircularXXWeb-ExtraBlack-zwQ9rYrv.woff2 76.17 kB +../static/assets/immutable/jetkvm-device-still-ktpTGyfA.png 188.53 kB +../static/assets/immutable/vendor-CCFZcsOx.css 3.55 kB │ gzip: 1.08 kB +../static/assets/immutable/index-3KaWki3G.css 108.89 kB │ gzip: 16.78 kB +../static/assets/immutable/AutoHeight-DNMbSxBi.js 0.40 kB │ gzip: 0.30 kB +../static/assets/immutable/FeatureFlag-CpBy_yIc.js 0.56 kB │ gzip: 0.39 kB +../static/assets/immutable/login-jvmJO2K9.js 0.65 kB │ gzip: 0.40 kB +../static/assets/immutable/signup-Dcu7CrZF.js 0.68 kB │ gzip: 0.40 kB +../static/assets/immutable/devices._id.settings.macros.add-DtgJATY5.js 0.86 kB │ gzip: 0.57 kB +../static/assets/immutable/devices._id.settings.appearance-D-zQ8eOU.js 0.94 kB │ gzip: 0.53 kB +../static/assets/immutable/devices._id.settings.general.reboot-ZolNQeG-.js 1.04 kB │ gzip: 0.54 kB +../static/assets/immutable/UpdateInProgressStatusCard-CxrffonE.js 1.09 kB │ gzip: 0.56 kB +../static/assets/immutable/devices._id.other-session-DOmnPqBd.js 1.12 kB │ gzip: 0.57 kB +../static/assets/immutable/devices.already-adopted-CUKof-fH.js 1.20 kB │ gzip: 0.58 kB +../static/assets/immutable/Checkbox-DfeYpuQt.js 1.27 kB │ gzip: 0.66 kB +../static/assets/immutable/devices._id.settings.keyboard-Brhk8Q16.js 1.66 kB │ gzip: 0.83 kB +../static/assets/immutable/devices._id.settings.general._index-Cojn7PdF.js 1.74 kB │ gzip: 0.77 kB +../static/assets/immutable/ConfirmDialog-ZPsIbN8O.js 1.80 kB │ gzip: 0.81 kB +../static/assets/immutable/devices._id.settings.macros.edit-CKsO8CQU.js 1.95 kB │ gzip: 1.01 kB +../static/assets/immutable/Terminal-DrfJbtdJ.js 3.18 kB │ gzip: 1.63 kB +../static/assets/immutable/AuthLayout-BU_zUyj5.js 3.85 kB │ gzip: 1.73 kB +../static/assets/immutable/devices._id.settings.multi-session-BAaxVISr.js 5.81 kB │ gzip: 1.85 kB +../static/assets/immutable/devices._id.settings.macros-CSWrsivS.js 5.98 kB │ gzip: 2.12 kB +../static/assets/immutable/devices._id.settings.advanced-BKtcXLuC.js 6.01 kB │ gzip: 2.09 kB +../static/assets/immutable/devices._id.settings.access.local-auth-AMVTxQRp.js 6.17 kB │ gzip: 1.54 kB +../static/assets/immutable/devices._id.settings.video-w6XP12DM.js 6.88 kB │ gzip: 2.60 kB +../static/assets/immutable/devices._id.settings-DQ5hSmGr.js 8.77 kB │ gzip: 1.63 kB +../static/assets/immutable/devices._id.settings.mouse-J-WjFYto.js 8.77 kB │ gzip: 3.05 kB +../static/assets/immutable/connectionStats-BTh-HMMJ.js 8.92 kB │ gzip: 3.57 kB +../static/assets/immutable/devices._id.settings.general.update-DSe-tEcb.js 9.70 kB │ gzip: 2.49 kB +../static/assets/immutable/MacroForm-DlAcnh76.js 10.00 kB │ gzip: 3.55 kB +../static/assets/immutable/devices._id.settings.hardware-BJuy5KhB.js 10.82 kB │ gzip: 3.17 kB +../static/assets/immutable/devices._id.settings.network-PcgdKo-I.js 15.47 kB │ gzip: 3.30 kB +../static/assets/immutable/devices._id.mount-eRr7fRnt.js 32.30 kB │ gzip: 14.11 kB +../static/assets/immutable/index-ITvbnH2t.js 249.49 kB │ gzip: 64.18 kB +../static/assets/immutable/vendor-C8gpwofI.js 1,568.17 kB │ gzip: 469.07 kB +20:14:46 info  +20:14:46 info (!) Some chunks are larger than 500 kB after minification. Consider: +20:14:46 info - Using dynamic import() to code-split the application +20:14:46 info - Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks +20:14:46 info - Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. +✓ built in 9.00s +20:14:46 info ../static/favicon.ico: 92.7% -- created ../static/favicon.ico.gz +20:14:46 info ../static/index.html: 67.0% -- created ../static/index.html.gz +20:14:46 info ../static/web-app-manifest-192x192.png: -0.3% -- created ../static/web-app-manifest-192x192.png.gz +20:14:46 info ../static/apple-touch-icon.png: -0.3% -- created ../static/apple-touch-icon.png.gz +20:14:46 info ../static/favicon.png: -0.4% -- created ../static/favicon.png.gz +20:14:46 info ../static/web-app-manifest-512x512.png: 5.1% -- created ../static/web-app-manifest-512x512.png.gz +20:14:46 info ../static/favicon-96x96.png: 0.0% -- created ../static/favicon-96x96.png.gz +20:14:46 info ../static/sse.html: 77.3% -- created ../static/sse.html.gz +20:14:46 info ../static/fonts/CircularXXWeb-Regular.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Regular.woff2.gz +20:14:46 info ../static/fonts/CircularXXWeb-ExtraBlackItalic.woff2: 0.0% -- created ../static/fonts/CircularXXWeb-ExtraBlackItalic.woff2.gz +20:14:46 info ../static/fonts/CircularXXWeb-BookItalic.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-BookItalic.woff2.gz +20:14:46 info ../static/fonts/CircularXXWeb-Black.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Black.woff2.gz +20:14:46 info ../static/fonts/CircularXXWeb-Medium.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Medium.woff2.gz +20:14:46 info ../static/fonts/CircularXXWeb-BlackItalic.woff2: 0.2% -- created ../static/fonts/CircularXXWeb-BlackItalic.woff2.gz +20:14:46 info ../static/fonts/CircularXXWeb-Book.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Book.woff2.gz +20:14:46 info ../static/fonts/CircularXXWeb-Light.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Light.woff2.gz +20:14:46 info ../static/fonts/CircularXXWeb-Bold.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Bold.woff2.gz +20:14:46 info ../static/fonts/CircularXXWeb-MediumItalic.woff2: 0.0% -- created ../static/fonts/CircularXXWeb-MediumItalic.woff2.gz +20:14:47 info ../static/fonts/CircularXXWeb-Thin.woff2: 0.2% -- created ../static/fonts/CircularXXWeb-Thin.woff2.gz +20:14:47 info ../static/fonts/CircularXXWeb-LightItalic.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-LightItalic.woff2.gz +20:14:47 info ../static/fonts/CircularXXWeb-Italic.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-Italic.woff2.gz +20:14:47 info ../static/fonts/CircularXXWeb-BoldItalic.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-BoldItalic.woff2.gz +20:14:47 info ../static/fonts/CircularXXWeb-ExtraBlack.woff2: 0.1% -- created ../static/fonts/CircularXXWeb-ExtraBlack.woff2.gz +20:14:47 info ../static/fonts/CircularXXWeb-ThinItalic.woff2: 0.2% -- created ../static/fonts/CircularXXWeb-ThinItalic.woff2.gz +20:14:47 info ../static/fonts/fonts.css: 89.4% -- created ../static/fonts/fonts.css.gz +20:14:47 info ../static/assets/immutable/devices._id.settings.video-w6XP12DM.js: 62.8% -- created ../static/assets/immutable/devices._id.settings.video-w6XP12DM.js.gz +20:14:47 info ../static/assets/immutable/vendor-C8gpwofI.js: 70.3% -- created ../static/assets/immutable/vendor-C8gpwofI.js.gz +20:14:47 info ../static/assets/immutable/CircularXXWeb-Medium-B7cMW5Np.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Medium-B7cMW5Np.woff2.gz +20:14:47 info ../static/assets/immutable/devices._id.settings.multi-session-BAaxVISr.js: 68.4% -- created ../static/assets/immutable/devices._id.settings.multi-session-BAaxVISr.js.gz +20:14:47 info ../static/assets/immutable/CircularXXWeb-Italic-D9ZGG85N.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Italic-D9ZGG85N.woff2.gz +20:14:47 info ../static/assets/immutable/index-ITvbnH2t.js: 74.6% -- created ../static/assets/immutable/index-ITvbnH2t.js.gz +20:14:47 info ../static/assets/immutable/jetkvm-device-still-ktpTGyfA.png: 0.6% -- created ../static/assets/immutable/jetkvm-device-still-ktpTGyfA.png.gz +20:14:47 info ../static/assets/immutable/AutoHeight-DNMbSxBi.js: 29.0% -- created ../static/assets/immutable/AutoHeight-DNMbSxBi.js.gz +20:14:47 info ../static/assets/immutable/AuthLayout-BU_zUyj5.js: 55.6% -- created ../static/assets/immutable/AuthLayout-BU_zUyj5.js.gz +20:14:47 info ../static/assets/immutable/MacroForm-DlAcnh76.js: 64.8% -- created ../static/assets/immutable/MacroForm-DlAcnh76.js.gz +20:14:47 info ../static/assets/immutable/devices._id.settings.network-PcgdKo-I.js: 78.8% -- created ../static/assets/immutable/devices._id.settings.network-PcgdKo-I.js.gz +20:14:47 info ../static/assets/immutable/index-3KaWki3G.css: 84.9% -- created ../static/assets/immutable/index-3KaWki3G.css.gz +20:14:47 info ../static/assets/immutable/FeatureFlag-CpBy_yIc.js: 34.8% -- created ../static/assets/immutable/FeatureFlag-CpBy_yIc.js.gz +20:14:47 info ../static/assets/immutable/CircularXXWeb-Bold-6tPVDRzI.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Bold-6tPVDRzI.woff2.gz +20:14:47 info ../static/assets/immutable/devices._id.settings.macros.add-DtgJATY5.js: 36.3% -- created ../static/assets/immutable/devices._id.settings.macros.add-DtgJATY5.js.gz +20:14:47 info ../static/assets/immutable/login-jvmJO2K9.js: 41.1% -- created ../static/assets/immutable/login-jvmJO2K9.js.gz +20:14:47 info ../static/assets/immutable/devices.already-adopted-CUKof-fH.js: 52.5% -- created ../static/assets/immutable/devices.already-adopted-CUKof-fH.js.gz +20:14:47 info ../static/assets/immutable/devices._id.mount-eRr7fRnt.js: 56.6% -- created ../static/assets/immutable/devices._id.mount-eRr7fRnt.js.gz +20:14:48 info ../static/assets/immutable/CircularXXWeb-Regular-C2Km8yIq.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Regular-C2Km8yIq.woff2.gz +20:14:48 info ../static/assets/immutable/devices._id.settings.general.reboot-ZolNQeG-.js: 49.8% -- created ../static/assets/immutable/devices._id.settings.general.reboot-ZolNQeG-.js.gz +20:14:48 info ../static/assets/immutable/CircularXXWeb-LightItalic-DkMJsSQn.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-LightItalic-DkMJsSQn.woff2.gz +20:14:48 info ../static/assets/immutable/signup-Dcu7CrZF.js: 43.2% -- created ../static/assets/immutable/signup-Dcu7CrZF.js.gz +20:14:48 info ../static/assets/immutable/devices._id.settings.macros.edit-CKsO8CQU.js: 48.8% -- created ../static/assets/immutable/devices._id.settings.macros.edit-CKsO8CQU.js.gz +20:14:48 info ../static/assets/immutable/devices._id.settings.mouse-J-WjFYto.js: 65.7% -- created ../static/assets/immutable/devices._id.settings.mouse-J-WjFYto.js.gz +20:14:48 info ../static/assets/immutable/CircularXXWeb-Light-COmyZsa9.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Light-COmyZsa9.woff2.gz +20:14:48 info ../static/assets/immutable/devices._id.settings.advanced-BKtcXLuC.js: 65.6% -- created ../static/assets/immutable/devices._id.settings.advanced-BKtcXLuC.js.gz +20:14:48 info ../static/assets/immutable/CircularXXWeb-BlackItalic-2aNe932P.woff2: 0.2% -- created ../static/assets/immutable/CircularXXWeb-BlackItalic-2aNe932P.woff2.gz +20:14:48 info ../static/assets/immutable/Terminal-DrfJbtdJ.js: 49.2% -- created ../static/assets/immutable/Terminal-DrfJbtdJ.js.gz +20:14:48 info ../static/assets/immutable/devices._id.other-session-DOmnPqBd.js: 50.2% -- created ../static/assets/immutable/devices._id.other-session-DOmnPqBd.js.gz +20:14:48 info ../static/assets/immutable/Checkbox-DfeYpuQt.js: 49.7% -- created ../static/assets/immutable/Checkbox-DfeYpuQt.js.gz +20:14:48 info ../static/assets/immutable/devices._id.settings.hardware-BJuy5KhB.js: 70.8% -- created ../static/assets/immutable/devices._id.settings.hardware-BJuy5KhB.js.gz +20:14:48 info ../static/assets/immutable/connectionStats-BTh-HMMJ.js: 60.5% -- created ../static/assets/immutable/connectionStats-BTh-HMMJ.js.gz +20:14:48 info ../static/assets/immutable/devices._id.settings.keyboard-Brhk8Q16.js: 50.8% -- created ../static/assets/immutable/devices._id.settings.keyboard-Brhk8Q16.js.gz +20:14:48 info ../static/assets/immutable/CircularXXWeb-ThinItalic-BbeKWZX4.woff2: 0.2% -- created ../static/assets/immutable/CircularXXWeb-ThinItalic-BbeKWZX4.woff2.gz +20:14:48 info ../static/assets/immutable/CircularXXWeb-ExtraBlackItalic-B8bd8esZ.woff2: 0.0% -- created ../static/assets/immutable/CircularXXWeb-ExtraBlackItalic-B8bd8esZ.woff2.gz +20:14:48 info ../static/assets/immutable/CircularXXWeb-MediumItalic-Cw0wlEIE.woff2: 0.0% -- created ../static/assets/immutable/CircularXXWeb-MediumItalic-Cw0wlEIE.woff2.gz +20:14:48 info ../static/assets/immutable/CircularXXWeb-BoldItalic-BY-z05Z9.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-BoldItalic-BY-z05Z9.woff2.gz +20:14:48 info ../static/assets/immutable/devices._id.settings.general._index-Cojn7PdF.js: 56.6% -- created ../static/assets/immutable/devices._id.settings.general._index-Cojn7PdF.js.gz +20:14:48 info ../static/assets/immutable/CircularXXWeb-Black-CPoU8bYr.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Black-CPoU8bYr.woff2.gz +20:14:48 info ../static/assets/immutable/devices._id.settings-DQ5hSmGr.js: 81.6% -- created ../static/assets/immutable/devices._id.settings-DQ5hSmGr.js.gz +20:14:48 info ../static/assets/immutable/ConfirmDialog-ZPsIbN8O.js: 56.3% -- created ../static/assets/immutable/ConfirmDialog-ZPsIbN8O.js.gz +20:14:48 info ../static/assets/immutable/UpdateInProgressStatusCard-CxrffonE.js: 50.6% -- created ../static/assets/immutable/UpdateInProgressStatusCard-CxrffonE.js.gz +20:14:48 info ../static/assets/immutable/devices._id.settings.macros-CSWrsivS.js: 65.0% -- created ../static/assets/immutable/devices._id.settings.macros-CSWrsivS.js.gz +20:14:48 info ../static/assets/immutable/devices._id.settings.access.local-auth-AMVTxQRp.js: 75.3% -- created ../static/assets/immutable/devices._id.settings.access.local-auth-AMVTxQRp.js.gz +20:14:49 info ../static/assets/immutable/devices._id.settings.general.update-DSe-tEcb.js: 74.6% -- created ../static/assets/immutable/devices._id.settings.general.update-DSe-tEcb.js.gz +20:14:49 info ../static/assets/immutable/CircularXXWeb-ExtraBlack-zwQ9rYrv.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-ExtraBlack-zwQ9rYrv.woff2.gz +20:14:49 info ../static/assets/immutable/CircularXXWeb-Thin-CgvRHm5r.woff2: 0.2% -- created ../static/assets/immutable/CircularXXWeb-Thin-CgvRHm5r.woff2.gz +20:14:49 info ../static/assets/immutable/devices._id.settings.appearance-D-zQ8eOU.js: 44.7% -- created ../static/assets/immutable/devices._id.settings.appearance-D-zQ8eOU.js.gz +20:14:49 info ../static/assets/immutable/netboot-icon-OoGRDuxL.svg: 56.5% -- created ../static/assets/immutable/netboot-icon-OoGRDuxL.svg.gz +20:14:49 info ../static/assets/immutable/CircularXXWeb-BookItalic-Dot97ozQ.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-BookItalic-Dot97ozQ.woff2.gz +20:14:49 info ../static/assets/immutable/vendor-CCFZcsOx.css: 70.1% -- created ../static/assets/immutable/vendor-CCFZcsOx.css.gz +20:14:49 info ../static/assets/immutable/CircularXXWeb-Book-DcdztGze.woff2: 0.1% -- created ../static/assets/immutable/CircularXXWeb-Book-DcdztGze.woff2.gz +20:14:49 info ../static/assets/immutable/keyboard-and-mouse-connected-CIPI4-KS.png: 12.6% -- created ../static/assets/immutable/keyboard-and-mouse-connected-CIPI4-KS.png.gz +20:14:49 info ../static/jetkvm.svg: 72.2% -- created ../static/jetkvm.svg.gz +20:14:49 info ../static/favicon.svg: 70.1% -- created ../static/favicon.svg.gz +▶ Building release binary(B +▶ Building the project in host ...(B +20:14:49 info + make build_release SKIP_NATIVE_IF_EXISTS=0 SKIP_UI_BUILD=1 +Skipping frontend build... +Building native... +▶ Generating UI index(B +ui_index.c has been generated successfully. +▶ Building native library(B +Re-run cmake no build system arguments +-- Using defconfig: /workspaces/kvm/internal/native/cgo/lvgl_defconfig +-- Converted to absolute path: /workspaces/kvm/internal/native/cgo/lvgl_defconfig +['/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/scripts/kconfig.py', '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/Kconfig', '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/.config', '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/autoconf.h', '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/kconfig_list', '/workspaces/kvm/internal/native/cgo/lvgl_defconfig'] +Parsing /workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/Kconfig +Loaded configuration '/workspaces/kvm/internal/native/cgo/lvgl_defconfig' +No change to configuration in '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-src/.config' +No change to Kconfig header in '/workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/autoconf.h' +Failed to locate pcpp - installing it +PCPP is already installed in venv +Preprocessing completed. Output saved to /workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/tmp.h +Expanded configuration header saved to /workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/lv_conf_expanded.h +Temporary preprocessed file /workspaces/kvm/internal/native/cgo/build/_deps/lvgl-build/tmp.h removed. +-- Enabling the building of ThorVG internal +-- Configuring done (3.8s) +-- Generating done (0.3s) +-- Build files have been written to: /workspaces/kvm/internal/native/cgo/build +▶ Copying built library and header files(B +gmake[1]: Entering directory '/workspaces/kvm/internal/native/cgo/build' +20:14:55 info gmake[1]: Warning: File 'Makefile' has modification time 0.11 s in the future +20:14:56 info gmake[3]: Warning: File '_deps/lvgl-build/CMakeFiles/lvgl_thorvg.dir/compiler_depend.make' has modification time 0.32 s in the future +20:14:56 info gmake[3]: warning: Clock skew detected. Your build may be incomplete. +[ 7%] Built target lvgl_thorvg +[ 51%] Built target lvgl +[ 52%] Building C object CMakeFiles/jknative.dir/ui_index.c.o +[ 52%] Linking CXX static library libjknative.a +[100%] Built target jknative +Install the project... +-- Install configuration: "Release" +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_templ.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_async.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_timer.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_rb.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_math.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_anim.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance/lv_image_header_cache.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance/lv_image_cache.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance/lv_cache_instance.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class/lv_cache_class.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class/lv_cache_lru_ll.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class/lv_cache_lru_rb.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/lv_cache_entry.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/lv_cache.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_profiler_builtin.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_array.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_bidi.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_grad.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_palette.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_assert.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_utils.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_types.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_event.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_style_gen.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_iter.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_style.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_anim_timeline.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_text_ap.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_circle_buf.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_text.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_fs.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_color_op.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_area.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_log.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_lru.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_profiler.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_matrix.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_ll.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_tree.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_color.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/qnx +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/qnx/lv_qnx.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_display.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_gnu_efi.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_edk2.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_std_wrapper.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_indev.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_context.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/evdev +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/evdev/lv_evdev.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput/lv_xkb.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput/lv_libinput.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/lv_drivers.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/wayland +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_keyboard.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_window.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_mouse.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/x11 +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/x11/lv_x11.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7796 +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7796/lv_st7796.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/drm +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/drm/lv_linux_drm.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/fb +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/fb/lv_linux_fbdev.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/renesas_glcdc +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7735 +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7735/lv_st7735.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ft81x +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ft81x/lv_ft81x_defines.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ft81x/lv_ft81x.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/lcd +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st_ltdc +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st_ltdc/lv_st_ltdc.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ili9341 +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ili9341/lv_ili9341.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/tft_espi +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/tft_espi/lv_tft_espi.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7789 +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7789/lv_st7789.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/glfw +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/windows +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_entry.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_profiler.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_cache.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_lcd.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_libuv.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_style.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_group.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_event.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_property.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_style_gen.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_pos.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_scroll.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_tree.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_class.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_refr.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_global.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_draw.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_api_map_v9_1.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_init.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_api_map_v8.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_cmsis_rtos2.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_pthread.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_mqx.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_sdl2.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_os.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_windows.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_rtthread.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_freertos.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_os_none.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_conf_kconfig.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/snapshot +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/snapshot/lv_snapshot.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/ime +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/ime/lv_ime_pinyin.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/vg_lite_tvg +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/vg_lite_tvg/vg_lite.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_display.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_indev.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_indev_gesture.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_helpers.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_screenshot_compare.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/file_explorer +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/file_explorer/lv_file_explorer.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/observer +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/observer/lv_observer.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_widget.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_checkbox_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_dropdown_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_keyboard_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_textarea_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_canvas_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_chart_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_slider_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_spangroup_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_tabview_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_obj_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_calendar_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_roller_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_table_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_label_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_image_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_event_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_buttonmatrix_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_button_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_scale_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_arc_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers/lv_xml_bar_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_base_types.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_component.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_utils.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_update.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_style.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/fragment +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/fragment/lv_fragment.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/gridnav +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/gridnav/lv_gridnav.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/monkey +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/monkey/lv_monkey.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/sysmon +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/sysmon/lv_sysmon.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/imgfont +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/imgfont/lv_imgfont.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/font_manager +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/font_manager/lv_font_manager.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/font_manager/lv_font_manager_recycle.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg_parser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg_decoder.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg_token.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg/lv_svg_render.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgUtil.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieProperty.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieInterpolator.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgFill.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieModifier.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieModel.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgArray.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLoadModule.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgLoaderCommon.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/thorvg.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgPicture.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/config.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLoader.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgCommon.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgText.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRasterAvx.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieParserHandler.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/thorvg_capi.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgScene.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRasterTexmap.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgRender.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLock.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieParser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgPaint.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieBuilder.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgStr.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgCanvas.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRasterC.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgTaskScheduler.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieExpressions.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieLoader.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgIteratorAccessor.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieCommon.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgPath.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgInlist.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgSceneBuilder.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgLoader.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgMath.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRenderer.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgRawLoader.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/fwd.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/memorystream.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/reader.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/prettywriter.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/ostreamwrapper.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/encodedstream.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/filereadstream.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/cursorstreamwrapper.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/istreamwrapper.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/uri.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/stringbuffer.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/ieee754.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/strtod.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/swap.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/regex.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/diyfp.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/biginteger.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/strfunc.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/itoa.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/stack.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/dtoa.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/clzll.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/meta.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal/pow10.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/encodings.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/schema.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/stream.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/filewritestream.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/rapidjson.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/document.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/allocators.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/writer.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/error +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/error/error.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/error/en.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/memorybuffer.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/pointer.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/msinttypes +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/msinttypes/inttypes.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/msinttypes/stdint.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgShape.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSaveModule.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgBinaryDesc.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/thorvg_lottie.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwRasterNeon.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgAnimation.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSvgCssStyle.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgLottieRenderPooler.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgXmlParser.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgFrameModule.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgCompressor.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/tvgSwCommon.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libjpeg_turbo +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/ffmpeg +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/ffmpeg/lv_ffmpeg.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libpng +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libpng/lv_libpng.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd/tjpgd.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd/tjpgdcnf.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd/lv_tjpgd.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf/stb_truetype_htcw.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf/stb_rect_pack.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype/ftoption.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype/lv_freetype.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype/ftmodule.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/expat_config.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/internal.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/xmltok.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/nametab.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/siphash.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/latin1tab.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/expat_external.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/winconfig.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/xmltok_impl.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/utf8tab.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/ascii.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/xmlrole.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/expat.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/asciitab.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat/iasciitab.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lz4 +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lz4/lz4.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode/lv_qrcode.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode/qrcodegen.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rle +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rle/lv_rle.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lodepng +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lodepng/lodepng.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lodepng/lv_lodepng.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bin_decoder +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bin_decoder/lv_bin_decoder.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rlottie +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rlottie/lv_rlottie.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/fsdrv +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/fsdrv/lv_fsdrv.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bmp +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bmp/lv_bmp.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode/code128.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode/lv_barcode.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif/gifdec_mve.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif/lv_gif.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif/gifdec.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_api_map_v9_0.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lv_conf_internal.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/lv_layout.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/flex +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/flex/lv_flex.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/grid +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/grid/lv_grid.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/lv_sprintf.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/uefi +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/clib +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/micropython +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/lv_string.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/lv_mem.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/rtthread +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/builtin +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/builtin/lv_tlsf.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev_gesture.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev_scroll.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/display +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/display/lv_display.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_binfont_loader.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_font_fmt_txt.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_symbol_def.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_font.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lvgl.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/default +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/default/lv_theme_default.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/simple +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/simple/lv_theme_simple.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/lv_theme.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/mono +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/mono/lv_theme_mono.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_grad.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_mask.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/helium +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/arm2d +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/neon +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/arm2d +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/arm2d/lv_draw_sw_helium.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_utils.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_image_decoder.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d/lv_g2d_utils.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d/lv_g2d_buf_map.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d/lv_draw_g2d.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp/lv_pxp_utils.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp/lv_pxp_osa.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite/lv_vglite_path.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_label.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_mask.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_image_dsc.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_triangle.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_vector.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_3d.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_line.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sdl +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sdl/lv_draw_sdl.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_draw_vg_lite.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_path.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_math.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_stroke.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_image.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nema_gfx +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/dma2d +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_rect.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_arc.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/opengles +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/renesas +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/renesas/dave2d +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_buf.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/3dtexture +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/3dtexture/lv_3dtexture.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/dropdown +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/dropdown/lv_dropdown.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar_header_arrow.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar_chinese.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/objx_templ +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/objx_templ/lv_objx_templ.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/scale +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/scale/lv_scale.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/led +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/led/lv_led.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/property +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/property/lv_obj_property_names.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/property/lv_style_properties.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/win +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/win/lv_win.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/chart +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/chart/lv_chart.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/checkbox +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/checkbox/lv_checkbox.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/label +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/label/lv_label.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinbox +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinbox/lv_spinbox.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/animimage +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/animimage/lv_animimage.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/slider +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/slider/lv_slider.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/buttonmatrix +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinner +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinner/lv_spinner.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/image +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/image/lv_image.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/canvas +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/canvas/lv_canvas.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tabview +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tabview/lv_tabview.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/msgbox +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/msgbox/lv_msgbox.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/textarea +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/textarea/lv_textarea.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/button +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/button/lv_button.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/span +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/span/lv_span.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/imagebutton +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/imagebutton/lv_imagebutton.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/line +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/line/lv_line.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/table +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/table/lv_table.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/list +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/list/lv_list.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/menu +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/menu/lv_menu.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/switch +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/switch/lv_switch.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/lottie +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/lottie/lv_lottie.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/bar +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/bar/lv_bar.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/arc +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/arc/lv_arc.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/roller +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/roller/lv_roller.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tileview +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tileview/lv_tileview.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/keyboard +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/keyboard/lv_keyboard.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/tick +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/tick/lv_tick.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_bidi_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_color_op_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_area_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_fs_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/lv_cache_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/lv_cache_entry_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/instance +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/cache/class +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_text_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_profiler_builtin_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_anim_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_timer_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_style_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_rb_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/misc/lv_event_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/qnx +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/uefi/lv_uefi_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/evdev +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/evdev/lv_evdev_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput/lv_xkb_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/libinput/lv_libinput_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/wayland +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/sdl/lv_sdl_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/x11 +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7796 +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/drm +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/fb +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/renesas_glcdc +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7735 +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ft81x +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/lcd +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st_ltdc +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/ili9341 +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/tft_espi +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/display/st7789 +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/glfw +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/windows +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/drivers/nuttx +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_group_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_draw_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_refr_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_scroll_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_event_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_class_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/core/lv_obj_style_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_linux_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/osal/lv_os_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/snapshot +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/ime +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/ime/lv_ime_pinyin_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/vg_lite_tvg +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/test/lv_test_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/file_explorer +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/file_explorer/lv_file_explorer_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/observer +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/observer/lv_observer_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_component_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/parsers +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/xml/lv_xml_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/fragment +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/fragment/lv_fragment_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/gridnav +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/monkey +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/monkey/lv_monkey_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/sysmon +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/sysmon/lv_sysmon_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/imgfont +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/others/font_manager +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/svg +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/internal +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/error +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/thorvg/rapidjson/msinttypes +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libjpeg_turbo +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/ffmpeg +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/ffmpeg/lv_ffmpeg_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/libpng +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tjpgd +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/tiny_ttf +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/freetype/lv_freetype_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/expat +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lz4 +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/qrcode/lv_qrcode_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rle +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/lodepng +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bin_decoder +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rlottie +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/rlottie/lv_rlottie_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/fsdrv +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/bmp +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/barcode/lv_barcode_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/libs/gif/lv_gif_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/lv_layout_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/flex +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/layouts/grid +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/lvgl_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/uefi +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/clib +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/micropython +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/lv_mem_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/rtthread +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/builtin +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/stdlib/builtin/lv_tlsf_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev_gesture_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/indev/lv_indev_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/display +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/display/lv_display_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/font/lv_font_fmt_txt_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/default +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/simple +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/lv_theme_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/themes/mono +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_label_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/helium +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/lv_draw_sw_blend_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/arm2d +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/blend/neon +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/arm2d +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sw/lv_draw_sw_mask_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_buf_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/g2d +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/pxp +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nxp/vglite +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_image_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_mask_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_rect_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/sdl +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/vg_lite +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/nema_gfx +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_triangle_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/dma2d +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/opengles +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_image_decoder_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/renesas +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/renesas/dave2d +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/draw/lv_draw_vector_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/3dtexture +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/3dtexture/lv_3dtexture_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/dropdown +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/dropdown/lv_dropdown_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/calendar/lv_calendar_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/objx_templ +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/scale +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/scale/lv_scale_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/led +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/led/lv_led_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/property +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/win +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/win/lv_win_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/chart +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/chart/lv_chart_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/checkbox +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/checkbox/lv_checkbox_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/label +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/label/lv_label_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinbox +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinbox/lv_spinbox_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/animimage +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/animimage/lv_animimage_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/slider +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/slider/lv_slider_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/buttonmatrix +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/spinner +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/image +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/image/lv_image_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/canvas +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/canvas/lv_canvas_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tabview +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tabview/lv_tabview_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/msgbox +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/msgbox/lv_msgbox_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/textarea +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/textarea/lv_textarea_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/button +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/button/lv_button_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/span +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/span/lv_span_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/imagebutton +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/imagebutton/lv_imagebutton_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/line +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/line/lv_line_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/table +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/table/lv_table_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/list +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/menu +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/menu/lv_menu_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/switch +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/switch/lv_switch_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/lottie +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/lottie/lv_lottie_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/bar +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/bar/lv_bar_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/arc +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/arc/lv_arc_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/roller +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/roller/lv_roller_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tileview +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/tileview/lv_tileview_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/keyboard +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/widgets/keyboard/lv_keyboard_private.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/tick +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/src/tick/lv_tick_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lv_conf.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lv_version.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/lib/liblvgl.a +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lv_version.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/share/pkgconfig/lvgl.pc +-- Installing: /tmp/tmp.w0Bd5jwcNB/lib/liblvgl_thorvg.a +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lv_version.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl.h +-- Up-to-date: /tmp/tmp.w0Bd5jwcNB/include/lvgl/lvgl_private.h +-- Installing: /tmp/tmp.w0Bd5jwcNB/lib/libjknative.a +20:15:14 info gmake[1]: warning: Clock skew detected. Your build may be incomplete. +gmake[1]: Leaving directory '/workspaces/kvm/internal/native/cgo/build' +Building release... +GOOS=linux GOARCH=arm GOARM=7 ARCHFLAGS="-arch arm" CGO_CFLAGS="-I/opt/jetkvm-native-buildkit/arm-rockchip830-linux-uclibcgnueabihf/include -I/opt/jetkvm-native-buildkit/arm-rockchip830-linux-uclibcgnueabihf/sysroot/usr/include" CGO_LDFLAGS="-L/opt/jetkvm-native-buildkit/arm-rockchip830-linux-uclibcgnueabihf/lib -L/opt/jetkvm-native-buildkit/arm-rockchip830-linux-uclibcgnueabihf/sysroot/usr/lib -lrockit -lrockchip_mpp -lrga -lpthread -lm" CC="/opt/jetkvm-native-buildkit/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc" LD="/opt/jetkvm-native-buildkit/bin/arm-rockchip830-linux-uclibcgnueabihf-ld" CGO_ENABLED=1 go build \ + -ldflags="-s -w -X github.com/prometheus/common/version.Branch=feat/multisession-support -X github.com/prometheus/common/version.BuildDate=2025-10-08T17:14:49+0000 -X github.com/prometheus/common/version.Revision=81bc5055dbcb97923288f523a97ffc892fe682f7 -X github.com/jetkvm/kvm.builtTimestamp=1759943689 -X github.com/jetkvm/kvm.builtAppVersion=0.4.8" \ + -trimpath -tags netgo,timetzdata,nomsgpack \ + -o bin/jetkvm_app cmd/main.go +20:15:19 info + set +x +Deployment complete. +20:15:31 error Error tunneling to container: wait: remote command exited without exit status or exit signal diff --git a/errors.go b/errors.go index b1d9f698..b287f938 100644 --- a/errors.go +++ b/errors.go @@ -7,4 +7,4 @@ var ( ErrPermissionDeniedMouse = errors.New("permission denied: mouse input") ErrNotPrimarySession = errors.New("operation requires primary session") ErrSessionNotFound = errors.New("session not found") -) \ No newline at end of file +) diff --git a/internal/session/permissions.go b/internal/session/permissions.go index 6fd10e3b..3c60cd20 100644 --- a/internal/session/permissions.go +++ b/internal/session/permissions.go @@ -15,9 +15,9 @@ const ( PermissionPaste Permission = "clipboard.paste" // Session management permissions - PermissionSessionTransfer Permission = "session.transfer" - PermissionSessionApprove Permission = "session.approve" - PermissionSessionKick Permission = "session.kick" + PermissionSessionTransfer Permission = "session.transfer" + PermissionSessionApprove Permission = "session.approve" + PermissionSessionKick Permission = "session.kick" PermissionSessionRequestPrimary Permission = "session.request_primary" PermissionSessionReleasePrimary Permission = "session.release_primary" PermissionSessionManage Permission = "session.manage" @@ -35,8 +35,8 @@ const ( PermissionExtensionManage Permission = "extension.manage" // Terminal/Serial permissions - PermissionTerminalAccess Permission = "terminal.access" - PermissionSerialAccess Permission = "serial.access" + PermissionTerminalAccess Permission = "terminal.access" + PermissionSerialAccess Permission = "serial.access" PermissionExtensionATX Permission = "extension.atx" PermissionExtensionDC Permission = "extension.dc" PermissionExtensionSerial Permission = "extension.serial" @@ -78,7 +78,7 @@ var RolePermissions = map[SessionMode]PermissionSet{ PermissionExtensionWOL: true, PermissionSettingsRead: true, PermissionSettingsWrite: true, - PermissionSettingsAccess: true, // Only primary can access settings UI + PermissionSettingsAccess: true, // Only primary can access settings UI PermissionSystemReboot: true, PermissionSystemUpdate: true, PermissionSystemNetwork: true, @@ -140,20 +140,20 @@ func RequirePermissionForMode(mode SessionMode, perm Permission) error { // GetPermissionsResponse is the response structure for getPermissions RPC type GetPermissionsResponse struct { - Mode string `json:"mode"` - Permissions map[string]bool `json:"permissions"` + Mode string `json:"mode"` + Permissions map[string]bool `json:"permissions"` } // MethodPermissions maps RPC methods to required permissions var MethodPermissions = map[string]Permission{ // Power/hardware control - "setATXPowerAction": PermissionPowerControl, - "setDCPowerState": PermissionPowerControl, - "setDCRestoreState": PermissionPowerControl, + "setATXPowerAction": PermissionPowerControl, + "setDCPowerState": PermissionPowerControl, + "setDCRestoreState": PermissionPowerControl, // USB device control - "setUsbDeviceState": PermissionUSBControl, - "setUsbDevices": PermissionUSBControl, + "setUsbDeviceState": PermissionUSBControl, + "setUsbDevices": PermissionUSBControl, // Mount operations "mountUsb": PermissionMountMedia, @@ -196,43 +196,43 @@ var MethodPermissions = map[string]Permission{ "setBacklightSettings": PermissionSettingsWrite, // USB/HID settings - "setUsbEmulationState": PermissionSettingsWrite, - "setUsbConfig": PermissionSettingsWrite, - "setKeyboardLayout": PermissionSettingsWrite, - "setJigglerState": PermissionSettingsWrite, - "setJigglerConfig": PermissionSettingsWrite, - "setMassStorageMode": PermissionSettingsWrite, - "setKeyboardMacros": PermissionSettingsWrite, - "setWakeOnLanDevices": PermissionSettingsWrite, + "setUsbEmulationState": PermissionSettingsWrite, + "setUsbConfig": PermissionSettingsWrite, + "setKeyboardLayout": PermissionSettingsWrite, + "setJigglerState": PermissionSettingsWrite, + "setJigglerConfig": PermissionSettingsWrite, + "setMassStorageMode": PermissionSettingsWrite, + "setKeyboardMacros": PermissionSettingsWrite, + "setWakeOnLanDevices": PermissionSettingsWrite, // Cloud settings - "setCloudUrl": PermissionSettingsWrite, - "deregisterDevice": PermissionSettingsWrite, + "setCloudUrl": PermissionSettingsWrite, + "deregisterDevice": PermissionSettingsWrite, // Active extension control - "setActiveExtension": PermissionExtensionManage, + "setActiveExtension": PermissionExtensionManage, // Input operations (already handled in other places but for consistency) - "keyboardReport": PermissionKeyboardInput, - "keypressReport": PermissionKeyboardInput, - "absMouseReport": PermissionMouseInput, - "relMouseReport": PermissionMouseInput, - "wheelReport": PermissionMouseInput, - "executeKeyboardMacro": PermissionPaste, - "cancelKeyboardMacro": PermissionPaste, + "keyboardReport": PermissionKeyboardInput, + "keypressReport": PermissionKeyboardInput, + "absMouseReport": PermissionMouseInput, + "relMouseReport": PermissionMouseInput, + "wheelReport": PermissionMouseInput, + "executeKeyboardMacro": PermissionPaste, + "cancelKeyboardMacro": PermissionPaste, // Session operations - "approveNewSession": PermissionSessionApprove, - "denyNewSession": PermissionSessionApprove, - "transferSession": PermissionSessionTransfer, - "transferPrimary": PermissionSessionTransfer, - "requestPrimary": PermissionSessionRequestPrimary, - "releasePrimary": PermissionSessionReleasePrimary, + "approveNewSession": PermissionSessionApprove, + "denyNewSession": PermissionSessionApprove, + "transferSession": PermissionSessionTransfer, + "transferPrimary": PermissionSessionTransfer, + "requestPrimary": PermissionSessionRequestPrimary, + "releasePrimary": PermissionSessionReleasePrimary, // Extension operations - "activateExtension": PermissionExtensionManage, - "deactivateExtension": PermissionExtensionManage, - "sendWOLMagicPacket": PermissionExtensionWOL, + "activateExtension": PermissionExtensionManage, + "deactivateExtension": PermissionExtensionManage, + "sendWOLMagicPacket": PermissionExtensionWOL, // Read operations - require appropriate read permissions "getSessionSettings": PermissionSettingsRead, @@ -266,41 +266,41 @@ var MethodPermissions = map[string]Permission{ "getNetworkState": PermissionSettingsRead, // Mount/media read operations - "getMassStorageMode": PermissionMountList, - "getUsbState": PermissionMountList, - "getUSBState": PermissionMountList, - "listStorageFiles": PermissionMountList, - "getStorageSpace": PermissionMountList, + "getMassStorageMode": PermissionMountList, + "getUsbState": PermissionMountList, + "getUSBState": PermissionMountList, + "listStorageFiles": PermissionMountList, + "getStorageSpace": PermissionMountList, // Extension read operations - "getActiveExtension": PermissionSettingsRead, + "getActiveExtension": PermissionSettingsRead, // Power state reads - "getATXState": PermissionSettingsRead, - "getDCPowerState": PermissionSettingsRead, - "getDCRestoreState": PermissionSettingsRead, + "getATXState": PermissionSettingsRead, + "getDCPowerState": PermissionSettingsRead, + "getDCRestoreState": PermissionSettingsRead, // Device info reads (these should be accessible to all) - "getDeviceID": PermissionVideoView, - "getLocalVersion": PermissionVideoView, - "getVideoState": PermissionVideoView, - "getKeyboardLedState": PermissionVideoView, - "getKeyDownState": PermissionVideoView, - "ping": PermissionVideoView, - "getTimezones": PermissionVideoView, - "getSessions": PermissionVideoView, - "getUpdateStatus": PermissionSettingsRead, - "isUpdatePending": PermissionSettingsRead, - "getUsbEmulationState": PermissionSettingsRead, - "getUsbConfig": PermissionSettingsRead, - "getUsbDevices": PermissionSettingsRead, - "getKeyboardMacros": PermissionSettingsRead, - "getWakeOnLanDevices": PermissionSettingsRead, - "getVirtualMediaState": PermissionMountList, + "getDeviceID": PermissionVideoView, + "getLocalVersion": PermissionVideoView, + "getVideoState": PermissionVideoView, + "getKeyboardLedState": PermissionVideoView, + "getKeyDownState": PermissionVideoView, + "ping": PermissionVideoView, + "getTimezones": PermissionVideoView, + "getSessions": PermissionVideoView, + "getUpdateStatus": PermissionSettingsRead, + "isUpdatePending": PermissionSettingsRead, + "getUsbEmulationState": PermissionSettingsRead, + "getUsbConfig": PermissionSettingsRead, + "getUsbDevices": PermissionSettingsRead, + "getKeyboardMacros": PermissionSettingsRead, + "getWakeOnLanDevices": PermissionSettingsRead, + "getVirtualMediaState": PermissionMountList, } // GetMethodPermission returns the required permission for an RPC method func GetMethodPermission(method string) (Permission, bool) { perm, exists := MethodPermissions[method] return perm, exists -} \ No newline at end of file +} diff --git a/internal/session/types.go b/internal/session/types.go index 50348d0e..1a983bdb 100644 --- a/internal/session/types.go +++ b/internal/session/types.go @@ -8,4 +8,4 @@ const ( SessionModeObserver SessionMode = "observer" SessionModeQueued SessionMode = "queued" SessionModePending SessionMode = "pending" -) \ No newline at end of file +) diff --git a/jsonrpc.go b/jsonrpc.go index f7e4b0a4..423c71f6 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -56,7 +56,6 @@ type DisplayRotationSettings struct { Rotation string `json:"rotation"` } - type BacklightSettings struct { MaxBrightness int `json:"max_brightness"` DimAfter int `json:"dim_after"` @@ -1330,7 +1329,7 @@ func rpcRequestPrimary(sessionId string) map[string]interface{} { err := sessionManager.RequestPrimary(sessionId) if err != nil { return map[string]interface{}{ - "status": "error", + "status": "error", "message": err.Error(), } } @@ -1339,14 +1338,14 @@ func rpcRequestPrimary(sessionId string) map[string]interface{} { session := sessionManager.GetSession(sessionId) if session == nil { return map[string]interface{}{ - "status": "error", + "status": "error", "message": "session not found", } } return map[string]interface{}{ "status": "success", - "mode": string(session.Mode), + "mode": string(session.Mode), } } @@ -1358,7 +1357,6 @@ func rpcTransferPrimary(fromId string, toId string) error { return sessionManager.TransferPrimary(fromId, toId) } - func rpcGetSessionConfig() (map[string]interface{}, error) { maxSessions := 10 primaryTimeout := 300 @@ -1373,27 +1371,13 @@ func rpcGetSessionConfig() (map[string]interface{}, error) { } return map[string]interface{}{ - "enabled": true, - "maxSessions": maxSessions, - "primaryTimeout": primaryTimeout, + "enabled": true, + "maxSessions": maxSessions, + "primaryTimeout": primaryTimeout, "allowCloudOverride": true, }, nil } -func (s *Session) rpcApprovePrimaryRequest(requesterID string) error { - if s == nil || s.ID == "" { - return errors.New("invalid session") - } - return sessionManager.ApprovePrimaryRequest(s.ID, requesterID) -} - -func (s *Session) rpcDenyPrimaryRequest(requesterID string) error { - if s == nil || s.ID == "" { - return errors.New("invalid session") - } - return sessionManager.DenyPrimaryRequest(s.ID, requesterID) -} - var ( keyboardMacroCancel context.CancelFunc keyboardMacroLock sync.Mutex diff --git a/main.go b/main.go index dec37695..b59b83a4 100644 --- a/main.go +++ b/main.go @@ -19,12 +19,12 @@ func Main() { // Initialize currentSessionSettings to use config's persistent SessionSettings if config.SessionSettings == nil { config.SessionSettings = &SessionSettings{ - RequireApproval: false, - RequireNickname: false, - ReconnectGrace: 10, + RequireApproval: false, + RequireNickname: false, + ReconnectGrace: 10, PrivateKeystrokes: false, } - SaveConfig() + _ = SaveConfig() } currentSessionSettings = config.SessionSettings diff --git a/session_manager.go b/session_manager.go index 87ddf7d7..6dc388e0 100644 --- a/session_manager.go +++ b/session_manager.go @@ -58,28 +58,28 @@ type TransferBlacklistEntry struct { // Broadcast throttling to prevent DoS var ( - lastBroadcast time.Time - broadcastMutex sync.Mutex - broadcastDelay = 100 * time.Millisecond // Min time between broadcasts + lastBroadcast time.Time + broadcastMutex sync.Mutex + broadcastDelay = 100 * time.Millisecond // Min time between broadcasts // Pre-allocated event maps to reduce allocations - modePrimaryEvent = map[string]string{"mode": "primary"} - modeObserverEvent = map[string]string{"mode": "observer"} + modePrimaryEvent = map[string]string{"mode": "primary"} + modeObserverEvent = map[string]string{"mode": "observer"} ) type SessionManager struct { - mu sync.RWMutex // 24 bytes - place first for better alignment - primaryTimeout time.Duration // 8 bytes - logger *zerolog.Logger // 8 bytes - sessions map[string]*Session // 8 bytes - reconnectGrace map[string]time.Time // 8 bytes - reconnectInfo map[string]*SessionData // 8 bytes - transferBlacklist []TransferBlacklistEntry // Prevent demoted sessions from immediate re-promotion - queueOrder []string // 24 bytes (slice header) - primarySessionID string // 16 bytes - lastPrimaryID string // 16 bytes - maxSessions int // 8 bytes - cleanupCancel context.CancelFunc // For stopping cleanup goroutine + mu sync.RWMutex // 24 bytes - place first for better alignment + primaryTimeout time.Duration // 8 bytes + logger *zerolog.Logger // 8 bytes + sessions map[string]*Session // 8 bytes + reconnectGrace map[string]time.Time // 8 bytes + reconnectInfo map[string]*SessionData // 8 bytes + transferBlacklist []TransferBlacklistEntry // Prevent demoted sessions from immediate re-promotion + queueOrder []string // 24 bytes (slice header) + primarySessionID string // 16 bytes + lastPrimaryID string // 16 bytes + maxSessions int // 8 bytes + cleanupCancel context.CancelFunc // For stopping cleanup goroutine // Emergency promotion tracking for safety lastEmergencyPromotion time.Time @@ -107,14 +107,14 @@ func NewSessionManager(logger *zerolog.Logger) *SessionManager { } sm := &SessionManager{ - sessions: make(map[string]*Session), - reconnectGrace: make(map[string]time.Time), - reconnectInfo: make(map[string]*SessionData), + sessions: make(map[string]*Session), + reconnectGrace: make(map[string]time.Time), + reconnectInfo: make(map[string]*SessionData), transferBlacklist: make([]TransferBlacklistEntry, 0), - queueOrder: make([]string, 0), - logger: logger, - maxSessions: maxSessions, - primaryTimeout: primaryTimeout, + queueOrder: make([]string, 0), + logger: logger, + maxSessions: maxSessions, + primaryTimeout: primaryTimeout, } // Start background cleanup of inactive sessions @@ -200,8 +200,8 @@ func (sm *SessionManager) AddSession(session *Session, clientSettings *SessionSe if sm.lastPrimaryID == session.ID && !isBlacklisted { // This is the rightful primary reconnecting within grace period sm.primarySessionID = session.ID - sm.lastPrimaryID = "" // Clear since primary successfully reconnected - delete(sm.reconnectGrace, session.ID) // Clear grace period + sm.lastPrimaryID = "" // Clear since primary successfully reconnected + delete(sm.reconnectGrace, session.ID) // Clear grace period sm.logger.Debug(). Str("sessionID", session.ID). Msg("Primary session successfully reconnected within grace period") @@ -290,7 +290,7 @@ func (sm *SessionManager) AddSession(session *Session, clientSettings *SessionSe // we can always promote to primary when no primary exists session.Mode = SessionModePrimary sm.primarySessionID = session.ID - sm.lastPrimaryID = "" // Clear since we have a new primary + sm.lastPrimaryID = "" // Clear since we have a new primary // Clear all existing grace periods when a new primary is established // This prevents multiple sessions from fighting for primary status via grace period @@ -389,7 +389,7 @@ func (sm *SessionManager) RemoveSession(sessionID string) { } // Limit grace period entries to prevent memory exhaustion (DoS protection) - const maxGraceEntries = 10 // Reduced from 20 to limit memory usage + const maxGraceEntries = 10 // Reduced from 20 to limit memory usage for len(sm.reconnectGrace) >= maxGraceEntries { // Find and remove the oldest grace period entry var oldestID string @@ -422,8 +422,8 @@ func (sm *SessionManager) RemoveSession(sessionID string) { // If this was the primary session, clear primary slot and track for grace period if wasPrimary { - sm.lastPrimaryID = sessionID // Remember this was the primary for grace period - sm.primarySessionID = "" // Clear primary slot so other sessions can be promoted + sm.lastPrimaryID = sessionID // Remember this was the primary for grace period + sm.primarySessionID = "" // Clear primary slot so other sessions can be promoted sm.logger.Info(). Str("sessionID", sessionID). Dur("gracePeriod", time.Duration(gracePeriod)*time.Second). @@ -970,7 +970,7 @@ func (sm *SessionManager) transferPrimaryRole(fromSessionID, toSessionID, transf toSession.Mode = SessionModePrimary toSession.hidRPCAvailable = false // Force re-handshake sm.primarySessionID = toSessionID - sm.lastPrimaryID = toSessionID // Set to new primary so grace period works on refresh + sm.lastPrimaryID = toSessionID // Set to new primary so grace period works on refresh // Clear input state sm.clearInputState() @@ -1038,9 +1038,9 @@ func (sm *SessionManager) transferPrimaryRole(fromSessionID, toSessionID, transf // Send connection reset signal to the promoted session writeJSONRPCEvent("connectionModeChanged", map[string]interface{}{ "sessionId": toSessionID, - "newMode": string(toSession.Mode), - "reason": "session_promotion", - "action": "reconnect_required", + "newMode": string(toSession.Mode), + "reason": "session_promotion", + "action": "reconnect_required", "timestamp": time.Now().Unix(), }, toSession) @@ -1113,7 +1113,7 @@ func (sm *SessionManager) removeFromQueue(sessionID string) { func (sm *SessionManager) clearInputState() { // Clear keyboard state if gadget != nil { - gadget.KeyboardReport(0, []byte{0, 0, 0, 0, 0, 0}) + _ = gadget.KeyboardReport(0, []byte{0, 0, 0, 0, 0, 0}) } } @@ -1185,8 +1185,8 @@ func (sm *SessionManager) findMostTrustedSessionForEmergency() string { for sessionID, session := range sm.sessions { // Skip if blacklisted, primary, or not eligible modes if sm.isSessionBlacklisted(sessionID) || - session.Mode == SessionModePrimary || - (session.Mode != SessionModeObserver && session.Mode != SessionModeQueued) { + session.Mode == SessionModePrimary || + (session.Mode != SessionModeObserver && session.Mode != SessionModeQueued) { continue } @@ -1377,11 +1377,11 @@ func (sm *SessionManager) Shutdown() { } func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) { - ticker := time.NewTicker(1 * time.Second) // Check every second for grace periods + ticker := time.NewTicker(1 * time.Second) // Check every second for grace periods defer ticker.Stop() - pendingTimeout := 1 * time.Minute // Reduced from 5 minutes to prevent DoS - validationCounter := 0 // Counter for periodic validateSinglePrimary calls + pendingTimeout := 1 * time.Minute // Reduced from 5 minutes to prevent DoS + validationCounter := 0 // Counter for periodic validateSinglePrimary calls for { select { @@ -1508,7 +1508,7 @@ func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) { // Clean up pending sessions that have timed out (DoS protection) for id, session := range sm.sessions { if session.Mode == SessionModePending && - now.Sub(session.CreatedAt) > pendingTimeout { + now.Sub(session.CreatedAt) > pendingTimeout { websocketLogger.Info(). Str("sessionId", id). Dur("age", now.Sub(session.CreatedAt)). @@ -1549,8 +1549,8 @@ func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) { bestScore := -1 for id, session := range sm.sessions { if id != timedOutSessionID && - !sm.isSessionBlacklisted(id) && - (session.Mode == SessionModeObserver || session.Mode == SessionModeQueued) { + !sm.isSessionBlacklisted(id) && + (session.Mode == SessionModeObserver || session.Mode == SessionModeQueued) { score := sm.getSessionTrustScore(id) if score > bestScore { bestScore = score @@ -1630,4 +1630,4 @@ func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) { var sessionManager = NewSessionManager(websocketLogger) // Global session settings - references config.SessionSettings for persistence -var currentSessionSettings *SessionSettings \ No newline at end of file +var currentSessionSettings *SessionSettings diff --git a/session_permissions.go b/session_permissions.go index 35dcd43d..05a1bcbe 100644 --- a/session_permissions.go +++ b/session_permissions.go @@ -74,4 +74,4 @@ func RequirePermission(s *Session, perm Permission) error { return session.RequirePermissionForMode(s.Mode, perm) } return nil -} \ No newline at end of file +} diff --git a/ui/src/api/sessionApi.ts b/ui/src/api/sessionApi.ts index bbd93b6e..0cca4634 100644 --- a/ui/src/api/sessionApi.ts +++ b/ui/src/api/sessionApi.ts @@ -1,45 +1,52 @@ import { SessionInfo } from "@/stores/sessionStore"; +interface JsonRpcResponse { + result?: unknown; + error?: { message: string }; +} + +type RpcSendFunction = (method: string, params: Record, callback: (response: JsonRpcResponse) => void) => void; + export const sessionApi = { - getSessions: async (sendFn: Function): Promise => { + getSessions: async (sendFn: RpcSendFunction): Promise => { return new Promise((resolve, reject) => { - sendFn("getSessions", {}, (response: any) => { + sendFn("getSessions", {}, (response: JsonRpcResponse) => { if (response.error) { reject(new Error(response.error.message)); } else { - resolve(response.result || []); + resolve((response.result as SessionInfo[]) || []); } }); }); }, - getSessionInfo: async (sendFn: Function, sessionId: string): Promise => { + getSessionInfo: async (sendFn: RpcSendFunction, sessionId: string): Promise => { return new Promise((resolve, reject) => { - sendFn("getSessionInfo", { sessionId }, (response: any) => { + sendFn("getSessionInfo", { sessionId }, (response: JsonRpcResponse) => { if (response.error) { reject(new Error(response.error.message)); } else { - resolve(response.result); + resolve(response.result as SessionInfo); } }); }); }, - requestPrimary: async (sendFn: Function, sessionId: string): Promise<{ status: string; mode?: string; message?: string }> => { + requestPrimary: async (sendFn: RpcSendFunction, sessionId: string): Promise<{ status: string; mode?: string; message?: string }> => { return new Promise((resolve, reject) => { - sendFn("requestPrimary", { sessionId }, (response: any) => { + sendFn("requestPrimary", { sessionId }, (response: JsonRpcResponse) => { if (response.error) { reject(new Error(response.error.message)); } else { - resolve(response.result); + resolve(response.result as { status: string; mode?: string; message?: string }); } }); }); }, - releasePrimary: async (sendFn: Function, sessionId: string): Promise => { + releasePrimary: async (sendFn: RpcSendFunction, sessionId: string): Promise => { return new Promise((resolve, reject) => { - sendFn("releasePrimary", { sessionId }, (response: any) => { + sendFn("releasePrimary", { sessionId }, (response: JsonRpcResponse) => { if (response.error) { reject(new Error(response.error.message)); } else { @@ -50,12 +57,12 @@ export const sessionApi = { }, transferPrimary: async ( - sendFn: Function, + sendFn: RpcSendFunction, fromId: string, toId: string ): Promise => { return new Promise((resolve, reject) => { - sendFn("transferPrimary", { fromId, toId }, (response: any) => { + sendFn("transferPrimary", { fromId, toId }, (response: JsonRpcResponse) => { if (response.error) { reject(new Error(response.error.message)); } else { @@ -66,12 +73,12 @@ export const sessionApi = { }, updateNickname: async ( - sendFn: Function, + sendFn: RpcSendFunction, sessionId: string, nickname: string ): Promise => { return new Promise((resolve, reject) => { - sendFn("updateSessionNickname", { sessionId, nickname }, (response: any) => { + sendFn("updateSessionNickname", { sessionId, nickname }, (response: JsonRpcResponse) => { if (response.error) { reject(new Error(response.error.message)); } else { @@ -82,11 +89,11 @@ export const sessionApi = { }, approveNewSession: async ( - sendFn: Function, + sendFn: RpcSendFunction, sessionId: string ): Promise => { return new Promise((resolve, reject) => { - sendFn("approveNewSession", { sessionId }, (response: any) => { + sendFn("approveNewSession", { sessionId }, (response: JsonRpcResponse) => { if (response.error) { reject(new Error(response.error.message)); } else { @@ -97,11 +104,11 @@ export const sessionApi = { }, denyNewSession: async ( - sendFn: Function, + sendFn: RpcSendFunction, sessionId: string ): Promise => { return new Promise((resolve, reject) => { - sendFn("denyNewSession", { sessionId }, (response: any) => { + sendFn("denyNewSession", { sessionId }, (response: JsonRpcResponse) => { if (response.error) { reject(new Error(response.error.message)); } else { diff --git a/ui/src/components/AccessDeniedOverlay.tsx b/ui/src/components/AccessDeniedOverlay.tsx index 7d0b6e46..484be9b0 100644 --- a/ui/src/components/AccessDeniedOverlay.tsx +++ b/ui/src/components/AccessDeniedOverlay.tsx @@ -1,13 +1,15 @@ -import { useEffect, useState } from "react"; +import { useEffect, useState, useCallback } from "react"; import { useNavigate } from "react-router"; import { XCircleIcon } from "@heroicons/react/24/outline"; -import { Button } from "./Button"; + import { DEVICE_API, CLOUD_API } from "@/ui.config"; import { isOnDevice } from "@/main"; import { useUserStore } from "@/hooks/stores"; import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore"; import api from "@/api"; +import { Button } from "./Button"; + interface AccessDeniedOverlayProps { show: boolean; message?: string; @@ -25,7 +27,7 @@ export default function AccessDeniedOverlay({ const { clearNickname } = useSharedSessionStore(); const [countdown, setCountdown] = useState(10); - const handleLogout = async () => { + const handleLogout = useCallback(async () => { try { const logoutUrl = isOnDevice ? `${DEVICE_API}/auth/logout` : `${CLOUD_API}/logout`; const res = await api.POST(logoutUrl); @@ -41,7 +43,7 @@ export default function AccessDeniedOverlay({ clearSession(); clearNickname(); navigate("/"); - }; + }, [navigate, setUser, clearSession, clearNickname]); useEffect(() => { if (!show) return; @@ -59,7 +61,7 @@ export default function AccessDeniedOverlay({ }, 1000); return () => clearInterval(timer); - }, [show]); + }, [show, handleLogout]); if (!show) return null; diff --git a/ui/src/components/ActionBar.tsx b/ui/src/components/ActionBar.tsx index c5d5e590..fc174e16 100644 --- a/ui/src/components/ActionBar.tsx +++ b/ui/src/components/ActionBar.tsx @@ -11,7 +11,7 @@ import { useMountMediaStore, useSettingsStore, useUiStore, -} from "@/hooks/stores"; + useRTCStore } from "@/hooks/stores"; import Container from "@components/Container"; import { cx } from "@/cva.config"; import PasteModal from "@/components/popovers/PasteModal"; @@ -21,7 +21,6 @@ import ExtensionPopover from "@/components/popovers/ExtensionPopover"; import SessionPopover from "@/components/popovers/SessionPopover"; import { useDeviceUiNavigation } from "@/hooks/useAppNavigation"; import { useSessionStore } from "@/stores/sessionStore"; -import { useRTCStore } from "@/hooks/stores"; import { usePermissions, Permission } from "@/hooks/usePermissions"; export default function Actionbar({ @@ -54,7 +53,7 @@ export default function Actionbar({ setSessions(response.result); rpcDataChannel.removeEventListener("message", handler); } - } catch (error) { + } catch { // Ignore parse errors for non-JSON messages } }; @@ -67,7 +66,7 @@ export default function Actionbar({ rpcDataChannel.removeEventListener("message", handler); }, 5000); } - }, [rpcDataChannel?.readyState]); + }, [rpcDataChannel, sessions.length, setSessions]); // This is the only way to get a reliable state change for the popover // at time of writing this there is no mount, or unmount event for the popover diff --git a/ui/src/components/NicknameModal.tsx b/ui/src/components/NicknameModal.tsx index 3bfc232b..5b958621 100644 --- a/ui/src/components/NicknameModal.tsx +++ b/ui/src/components/NicknameModal.tsx @@ -1,12 +1,13 @@ import { useState, useEffect, useRef } from "react"; import { Dialog, DialogPanel, DialogBackdrop } from "@headlessui/react"; import { UserIcon, XMarkIcon } from "@heroicons/react/20/solid"; -import { Button } from "./Button"; -import { useSettingsStore } from "@/hooks/stores"; + +import { useSettingsStore , useRTCStore } from "@/hooks/stores"; import { useJsonRpc } from "@/hooks/useJsonRpc"; -import { useRTCStore } from "@/hooks/stores"; import { generateNickname } from "@/utils/nicknameGenerator"; +import { Button } from "./Button"; + type SessionRole = "primary" | "observer" | "queued" | "pending"; interface NicknameModalProps { @@ -128,8 +129,8 @@ export default function NicknameModal({ await onSubmit(trimmedNickname); setNickname(""); setGeneratedNickname(""); // Reset generated nickname after successful submit - } catch (error: any) { - setError(error.message || "Failed to set nickname"); + } catch (error) { + setError(error instanceof Error ? error.message : "Failed to set nickname"); setIsSubmitting(false); } }; diff --git a/ui/src/components/SessionControlPanel.tsx b/ui/src/components/SessionControlPanel.tsx index 2c29e841..3b923455 100644 --- a/ui/src/components/SessionControlPanel.tsx +++ b/ui/src/components/SessionControlPanel.tsx @@ -1,16 +1,19 @@ -import { useSessionStore } from "@/stores/sessionStore"; -import { sessionApi } from "@/api/sessionApi"; -import { Button } from "@/components/Button"; import { LockClosedIcon, LockOpenIcon, ClockIcon } from "@heroicons/react/16/solid"; import clsx from "clsx"; + +import { useSessionStore } from "@/stores/sessionStore"; +import { sessionApi } from "@/api/sessionApi"; +import { Button } from "@/components/Button"; import { usePermissions, Permission } from "@/hooks/usePermissions"; +type RpcSendFunction = (method: string, params: Record, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void; + interface SessionControlPanelProps { - sendFn: Function; + sendFn: RpcSendFunction; className?: string; } @@ -48,8 +51,8 @@ export default function SessionControlPanel({ sendFn, className }: SessionContro setSessionError(result.message || "Failed to request primary control"); setRequestingPrimary(false); } - } catch (error: any) { - setSessionError(error.message); + } catch (error) { + setSessionError(error instanceof Error ? error.message : "Unknown error"); console.error("Failed to request primary control:", error); setRequestingPrimary(false); } @@ -60,8 +63,8 @@ export default function SessionControlPanel({ sendFn, className }: SessionContro try { await sessionApi.releasePrimary(sendFn, currentSessionId); - } catch (error: any) { - setSessionError(error.message); + } catch (error) { + setSessionError(error instanceof Error ? error.message : "Unknown error"); console.error("Failed to release primary control:", error); } }; diff --git a/ui/src/components/SessionsList.tsx b/ui/src/components/SessionsList.tsx index bba58779..8d7c68f3 100644 --- a/ui/src/components/SessionsList.tsx +++ b/ui/src/components/SessionsList.tsx @@ -1,5 +1,6 @@ import { PencilIcon, CheckIcon, XMarkIcon } from "@heroicons/react/20/solid"; import clsx from "clsx"; + import { formatters } from "@/utils"; import { usePermissions, Permission } from "@/hooks/usePermissions"; diff --git a/ui/src/components/UnifiedSessionRequestDialog.tsx b/ui/src/components/UnifiedSessionRequestDialog.tsx index 1d1f1b6c..09b6a0cc 100644 --- a/ui/src/components/UnifiedSessionRequestDialog.tsx +++ b/ui/src/components/UnifiedSessionRequestDialog.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from "react"; import { XMarkIcon, UserIcon, GlobeAltIcon, ComputerDesktopIcon } from "@heroicons/react/20/solid"; + import { Button } from "./Button"; type RequestType = "session_approval" | "primary_control"; @@ -55,7 +56,8 @@ export default function UnifiedSessionRequestDialog({ return () => clearInterval(timer); } - }, [request?.id, request?.type]); // Only depend on stable properties + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [request?.id, request?.type]); // Only depend on stable properties to avoid unnecessary re-renders // Handle auto-deny when timeout occurs useEffect(() => { diff --git a/ui/src/components/WebRTCVideo.tsx b/ui/src/components/WebRTCVideo.tsx index 1187f44e..b344ee5b 100644 --- a/ui/src/components/WebRTCVideo.tsx +++ b/ui/src/components/WebRTCVideo.tsx @@ -14,7 +14,6 @@ import { useSettingsStore, useVideoStore, } from "@/hooks/stores"; -import { useSessionStore } from "@/stores/sessionStore"; import { usePermissions, Permission } from "@/hooks/usePermissions"; import useMouse from "@/hooks/useMouse"; @@ -37,7 +36,6 @@ export default function WebRTCVideo() { // Store hooks const settings = useSettingsStore(); - const { currentMode } = useSessionStore(); const { hasPermission } = usePermissions(); const { handleKeyPress, resetKeyboardState } = useKeyboard(); const { @@ -230,7 +228,7 @@ export default function WebRTCVideo() { if (!hasPermission(Permission.MOUSE_INPUT)) return; handler(e); }; - }, [currentMode, getAbsMouseMoveHandler, videoClientWidth, videoClientHeight, videoWidth, videoHeight]); + }, [getAbsMouseMoveHandler, videoClientWidth, videoClientHeight, videoWidth, videoHeight, hasPermission]); const relMouseMoveHandler = useMemo(() => { const handler = getRelMouseMoveHandler(); @@ -239,7 +237,7 @@ export default function WebRTCVideo() { if (!hasPermission(Permission.MOUSE_INPUT)) return; handler(e); }; - }, [currentMode, getRelMouseMoveHandler]); + }, [getRelMouseMoveHandler, hasPermission]); const mouseWheelHandler = useMemo(() => { const handler = getMouseWheelHandler(); @@ -248,7 +246,7 @@ export default function WebRTCVideo() { if (!hasPermission(Permission.MOUSE_INPUT)) return; handler(e); }; - }, [currentMode, getMouseWheelHandler]); + }, [getMouseWheelHandler, hasPermission]); const keyDownHandler = useCallback( (e: KeyboardEvent) => { @@ -288,7 +286,7 @@ export default function WebRTCVideo() { }, 100); } }, - [currentMode, handleKeyPress, isKeyboardLockActive], + [handleKeyPress, isKeyboardLockActive, hasPermission], ); const keyUpHandler = useCallback( @@ -310,7 +308,7 @@ export default function WebRTCVideo() { handleKeyPress(hidKey, false); }, - [currentMode, handleKeyPress], + [handleKeyPress, hasPermission], ); const videoKeyUpHandler = useCallback((e: KeyboardEvent) => { diff --git a/ui/src/components/popovers/SessionPopover.tsx b/ui/src/components/popovers/SessionPopover.tsx index a078b429..cf618eca 100644 --- a/ui/src/components/popovers/SessionPopover.tsx +++ b/ui/src/components/popovers/SessionPopover.tsx @@ -1,12 +1,13 @@ -import { useState, useEffect } from "react"; -import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore"; -import { useJsonRpc } from "@/hooks/useJsonRpc"; +import { useState, useEffect, useCallback } from "react"; import { UserGroupIcon, ArrowPathIcon, PencilIcon, } from "@heroicons/react/20/solid"; import clsx from "clsx"; + +import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore"; +import { useJsonRpc } from "@/hooks/useJsonRpc"; import SessionControlPanel from "@/components/SessionControlPanel"; import NicknameModal from "@/components/NicknameModal"; import SessionsList, { SessionModeBadge } from "@/components/SessionsList"; @@ -29,11 +30,11 @@ export default function SessionPopover() { const { send } = useJsonRpc(); // Adapter function to match existing callback pattern - const sendRpc = (method: string, params: any, callback?: (response: any) => void) => { + const sendRpc = useCallback((method: string, params: Record, callback?: (response: { result?: unknown; error?: { message: string } }) => void) => { send(method, params, (response) => { if (callback) callback(response); }); - }; + }, [send]); const handleRefresh = async () => { if (isRefreshing) return; @@ -56,7 +57,7 @@ export default function SessionPopover() { .then(sessions => setSessions(sessions)) .catch(error => console.error("Failed to fetch sessions:", error)); } - }, []); + }, [sendRpc, sessions.length, setSessions]); return (
@@ -141,7 +142,7 @@ export default function SessionPopover() { setShowNicknameModal(true); }} onApprove={(sessionId) => { - sendRpc("approveNewSession", { sessionId }, (response: any) => { + sendRpc("approveNewSession", { sessionId }, (response) => { if (response.error) { console.error("Failed to approve session:", response.error); } else { @@ -150,7 +151,7 @@ export default function SessionPopover() { }); }} onDeny={(sessionId) => { - sendRpc("denyNewSession", { sessionId }, (response: any) => { + sendRpc("denyNewSession", { sessionId }, (response) => { if (response.error) { console.error("Failed to deny session:", response.error); } else { diff --git a/ui/src/hooks/usePermissions.ts b/ui/src/hooks/usePermissions.ts index ca4fb5ff..3e3ed1e7 100644 --- a/ui/src/hooks/usePermissions.ts +++ b/ui/src/hooks/usePermissions.ts @@ -1,8 +1,11 @@ import { useState, useEffect, useRef, useCallback } from "react"; -import { useJsonRpc } from "@/hooks/useJsonRpc"; + +import { useJsonRpc, JsonRpcRequest } from "@/hooks/useJsonRpc"; import { useSessionStore } from "@/stores/sessionStore"; import { useRTCStore } from "@/hooks/stores"; +type RpcSendFunction = (method: string, params: Record, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void; + // Permission types matching backend export enum Permission { // Video/Display permissions @@ -65,11 +68,11 @@ export function usePermissions() { const previousCanControl = useRef(false); // Function to poll permissions - const pollPermissions = useCallback((send: any) => { + const pollPermissions = useCallback((send: RpcSendFunction) => { if (!send) return; setIsLoading(true); - send("getPermissions", {}, (response: any) => { + send("getPermissions", {}, (response: { result?: unknown; error?: { message: string } }) => { if (!response.error && response.result) { const result = response.result as PermissionsResponse; setPermissions(result.permissions); @@ -79,13 +82,14 @@ export function usePermissions() { }, []); // Handle connectionModeChanged events that require WebRTC reconnection - const handleRpcRequest = useCallback((request: any) => { + const handleRpcRequest = useCallback((request: JsonRpcRequest) => { if (request.method === "connectionModeChanged") { console.info("Connection mode changed, WebRTC reconnection required", request.params); // For session promotion that requires reconnection, refresh the page // This ensures WebRTC connection is re-established with proper mode - if (request.params?.action === "reconnect_required" && request.params?.reason === "session_promotion") { + const params = request.params as { action?: string; reason?: string }; + if (params.action === "reconnect_required" && params.reason === "session_promotion") { console.info("Session promoted, refreshing page to re-establish WebRTC connection"); // Small delay to ensure all state updates are processed setTimeout(() => { @@ -132,7 +136,8 @@ export function usePermissions() { } previousCanControl.current = currentCanControl; - }, [permissions, rpcHidChannel, setRpcHidProtocolVersion]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [permissions, rpcHidChannel, setRpcHidProtocolVersion]); // hasPermission depends on permissions which is already in deps const hasPermission = (permission: Permission): boolean => { return permissions[permission] === true; diff --git a/ui/src/hooks/useSessionEvents.ts b/ui/src/hooks/useSessionEvents.ts index 393ff1c8..b5c6804a 100644 --- a/ui/src/hooks/useSessionEvents.ts +++ b/ui/src/hooks/useSessionEvents.ts @@ -1,11 +1,14 @@ import { useEffect, useRef } from "react"; -import { useSessionStore } from "@/stores/sessionStore"; + +import { useSessionStore, SessionInfo } from "@/stores/sessionStore"; import { useRTCStore } from "@/hooks/stores"; import { sessionApi } from "@/api/sessionApi"; import { notify } from "@/notifications"; +type RpcSendFunction = (method: string, params: Record, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void; + interface SessionEventData { - sessions: any[]; + sessions: SessionInfo[]; yourMode: string; } @@ -13,7 +16,7 @@ interface ModeChangedData { mode: string; } -export function useSessionEvents(sendFn: Function | null) { +export function useSessionEvents(sendFn: RpcSendFunction | null) { const { currentMode, setSessions, @@ -25,7 +28,7 @@ export function useSessionEvents(sendFn: Function | null) { sendFnRef.current = sendFn; // Handle session-related RPC events - const handleSessionEvent = (method: string, params: any) => { + const handleSessionEvent = (method: string, params: unknown) => { switch (method) { case "sessionsUpdated": handleSessionsUpdated(params as SessionEventData); @@ -52,7 +55,7 @@ export function useSessionEvents(sendFn: Function | null) { // CRITICAL: Only update mode, never show notifications from sessionsUpdated // Notifications are exclusively handled by handleModeChanged to prevent duplicates if (data.yourMode && data.yourMode !== currentMode) { - updateSessionMode(data.yourMode as any); + updateSessionMode(data.yourMode as "primary" | "observer" | "queued" | "pending"); } }; @@ -64,7 +67,7 @@ export function useSessionEvents(sendFn: Function | null) { // Get the most current mode from the store to avoid race conditions const { currentMode: currentModeFromStore } = useSessionStore.getState(); const previousMode = currentModeFromStore; - updateSessionMode(data.mode as any); + updateSessionMode(data.mode as "primary" | "observer" | "queued" | "pending"); // Clear requesting state when mode changes from queued if (previousMode === "queued" && data.mode !== "queued") { @@ -139,7 +142,7 @@ export function useSessionEvents(sendFn: Function | null) { try { const sessions = await sessionApi.getSessions(sendFnRef.current); setSessions(sessions); - } catch (error) { + } catch { // Silently fail on refresh errors } }, 30000); // Refresh every 30 seconds diff --git a/ui/src/hooks/useSessionManagement.ts b/ui/src/hooks/useSessionManagement.ts index 42078412..4b688368 100644 --- a/ui/src/hooks/useSessionManagement.ts +++ b/ui/src/hooks/useSessionManagement.ts @@ -1,9 +1,12 @@ import { useEffect, useCallback, useState } from "react"; + import { useSessionStore } from "@/stores/sessionStore"; import { useSessionEvents } from "@/hooks/useSessionEvents"; import { useSettingsStore } from "@/hooks/stores"; import { usePermissions, Permission } from "@/hooks/usePermissions"; +type RpcSendFunction = (method: string, params: Record, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void; + interface SessionResponse { sessionId?: string; mode?: string; @@ -23,7 +26,7 @@ interface NewSessionRequest { nickname?: string; } -export function useSessionManagement(sendFn: Function | null) { +export function useSessionManagement(sendFn: RpcSendFunction | null) { const { setCurrentSession, clearSession @@ -39,7 +42,7 @@ export function useSessionManagement(sendFn: Function | null) { // Handle session info from WebRTC answer const handleSessionResponse = useCallback((response: SessionResponse) => { if (response.sessionId && response.mode) { - setCurrentSession(response.sessionId, response.mode as any); + setCurrentSession(response.sessionId, response.mode as "primary" | "observer" | "queued" | "pending"); } }, [setCurrentSession]); @@ -48,7 +51,7 @@ export function useSessionManagement(sendFn: Function | null) { if (!sendFn) return; return new Promise((resolve, reject) => { - sendFn("approvePrimaryRequest", { requesterID: requestId }, (response: any) => { + sendFn("approvePrimaryRequest", { requesterID: requestId }, (response: { result?: unknown; error?: { message: string } }) => { if (response.error) { console.error("Failed to approve primary request:", response.error); reject(new Error(response.error.message || "Failed to approve")); @@ -65,7 +68,7 @@ export function useSessionManagement(sendFn: Function | null) { if (!sendFn) return; return new Promise((resolve, reject) => { - sendFn("denyPrimaryRequest", { requesterID: requestId }, (response: any) => { + sendFn("denyPrimaryRequest", { requesterID: requestId }, (response: { result?: unknown; error?: { message: string } }) => { if (response.error) { console.error("Failed to deny primary request:", response.error); reject(new Error(response.error.message || "Failed to deny")); @@ -82,7 +85,7 @@ export function useSessionManagement(sendFn: Function | null) { if (!sendFn) return; return new Promise((resolve, reject) => { - sendFn("approveNewSession", { sessionId }, (response: any) => { + sendFn("approveNewSession", { sessionId }, (response: { result?: unknown; error?: { message: string } }) => { if (response.error) { console.error("Failed to approve new session:", response.error); reject(new Error(response.error.message || "Failed to approve")); @@ -99,7 +102,7 @@ export function useSessionManagement(sendFn: Function | null) { if (!sendFn) return; return new Promise((resolve, reject) => { - sendFn("denyNewSession", { sessionId }, (response: any) => { + sendFn("denyNewSession", { sessionId }, (response: { result?: unknown; error?: { message: string } }) => { if (response.error) { console.error("Failed to deny new session:", response.error); reject(new Error(response.error.message || "Failed to deny")); @@ -112,7 +115,7 @@ export function useSessionManagement(sendFn: Function | null) { }, [sendFn]); // Handle RPC events - const handleRpcEvent = useCallback((method: string, params: any) => { + const handleRpcEvent = useCallback((method: string, params: unknown) => { // Pass session events to the session event handler if (method === "sessionsUpdated" || method === "modeChanged" || @@ -122,12 +125,12 @@ export function useSessionManagement(sendFn: Function | null) { // Handle new session approval request (only if approval is required and user has permission) if (method === "newSessionPending" && requireSessionApproval && hasPermission(Permission.SESSION_APPROVE)) { - setNewSessionRequest(params); + setNewSessionRequest(params as NewSessionRequest); } // Handle primary control request if (method === "primaryControlRequested") { - setPrimaryControlRequest(params); + setPrimaryControlRequest(params as PrimaryControlRequest); } // Handle approval/denial responses @@ -147,13 +150,14 @@ export function useSessionManagement(sendFn: Function | null) { // Handle session access denial (when your new session is denied) if (method === "sessionAccessDenied") { const { clearSession, setSessionError } = useSessionStore.getState(); - setSessionError(params.message || "Session access was denied by the primary session"); + const errorParams = params as { message?: string }; + setSessionError(errorParams.message || "Session access was denied by the primary session"); // Clear session data as we're being disconnected setTimeout(() => { clearSession(); }, 3000); // Give user time to see the error } - }, [handleSessionEvent]); + }, [handleSessionEvent, hasPermission, requireSessionApproval]); // Cleanup on unmount useEffect(() => { diff --git a/ui/src/routes/devices.$id.settings.multi-session.tsx b/ui/src/routes/devices.$id.settings.multi-session.tsx index fab886e1..1c6970e6 100644 --- a/ui/src/routes/devices.$id.settings.multi-session.tsx +++ b/ui/src/routes/devices.$id.settings.multi-session.tsx @@ -1,4 +1,8 @@ import { useEffect, useState } from "react"; +import { + UserGroupIcon, +} from "@heroicons/react/16/solid"; + import { useJsonRpc, JsonRpcResponse } from "@/hooks/useJsonRpc"; import { usePermissions, Permission } from "@/hooks/usePermissions"; import { useSettingsStore } from "@/hooks/stores"; @@ -7,9 +11,6 @@ import Card from "@/components/Card"; import Checkbox from "@/components/Checkbox"; import { SettingsPageHeader } from "@/components/SettingsPageheader"; import { SettingsItem } from "@/components/SettingsItem"; -import { - UserGroupIcon, -} from "@heroicons/react/16/solid"; export default function SessionsSettings() { const { send } = useJsonRpc(); diff --git a/ui/src/routes/devices.$id.settings.tsx b/ui/src/routes/devices.$id.settings.tsx index 23bc4c2f..a9a4782f 100644 --- a/ui/src/routes/devices.$id.settings.tsx +++ b/ui/src/routes/devices.$id.settings.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useRef, useState } from "react"; -import { NavLink, Outlet, useLocation } from "react-router"; +import { NavLink, Outlet, useLocation , useNavigate } from "react-router"; import { LuSettings, LuMouse, @@ -15,7 +15,6 @@ import { LuUsers, } from "react-icons/lu"; import { useResizeObserver } from "usehooks-ts"; -import { useNavigate } from "react-router"; import { cx } from "@/cva.config"; import Card from "@components/Card"; diff --git a/ui/src/routes/devices.$id.tsx b/ui/src/routes/devices.$id.tsx index a90b5cb6..196c5a62 100644 --- a/ui/src/routes/devices.$id.tsx +++ b/ui/src/routes/devices.$id.tsx @@ -230,7 +230,6 @@ export default function KvmIdRoute() { ); cleanupAndStopReconnecting(); clearInterval(checkInterval); - } else { } }, 1000); }, @@ -270,6 +269,7 @@ export default function KvmIdRoute() { // We don't want to close everything down, we wait for the reconnect to stop instead }, onOpen() { + // Connection established, message handling will begin }, onMessage: message => { @@ -572,7 +572,7 @@ export default function KvmIdRoute() { setRequireSessionNickname(response.result.requireNickname); } } - } catch (error) { + } catch { // Ignore parse errors } }; @@ -627,6 +627,9 @@ export default function KvmIdRoute() { setRpcHidUnreliableNonOrderedChannel, setRpcHidUnreliableChannel, setTransceiver, + hasPermission, + setRequireSessionApproval, + setRequireSessionNickname, ]); useEffect(() => { diff --git a/ui/src/utils/nicknameGenerator.ts b/ui/src/utils/nicknameGenerator.ts index 3ce270fa..76c09fab 100644 --- a/ui/src/utils/nicknameGenerator.ts +++ b/ui/src/utils/nicknameGenerator.ts @@ -1,7 +1,9 @@ // Nickname generation using backend API for consistency +type RpcSendFunction = (method: string, params: Record, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void; + // Main function that uses backend generation -export async function generateNickname(sendFn?: Function): Promise { +export async function generateNickname(sendFn?: RpcSendFunction): Promise { // Require backend function - no fallback if (!sendFn) { throw new Error('Backend connection required for nickname generation'); @@ -9,9 +11,10 @@ export async function generateNickname(sendFn?: Function): Promise { return new Promise((resolve, reject) => { try { - const result = sendFn('generateNickname', { userAgent: navigator.userAgent }, (response: any) => { - if (response && !response.error && response.result?.nickname) { - resolve(response.result.nickname); + const result = sendFn('generateNickname', { userAgent: navigator.userAgent }, (response: { result?: unknown; error?: { message: string } }) => { + const result = response.result as { nickname?: string } | undefined; + if (response && !response.error && result?.nickname) { + resolve(result.nickname); } else { reject(new Error('Failed to generate nickname from backend')); } diff --git a/web.go b/web.go index 55a6d992..1c66ec6d 100644 --- a/web.go +++ b/web.go @@ -34,22 +34,22 @@ import ( var staticFiles embed.FS type WebRTCSessionRequest struct { - Sd string `json:"sd"` - SessionId string `json:"sessionId,omitempty"` - OidcGoogle string `json:"OidcGoogle,omitempty"` - IP string `json:"ip,omitempty"` - ICEServers []string `json:"iceServers,omitempty"` - UserAgent string `json:"userAgent,omitempty"` // Browser user agent for nickname generation + Sd string `json:"sd"` + SessionId string `json:"sessionId,omitempty"` + OidcGoogle string `json:"OidcGoogle,omitempty"` + IP string `json:"ip,omitempty"` + ICEServers []string `json:"iceServers,omitempty"` + UserAgent string `json:"userAgent,omitempty"` // Browser user agent for nickname generation SessionSettings *SessionSettings `json:"sessionSettings,omitempty"` } type SessionSettings struct { - RequireApproval bool `json:"requireApproval"` - RequireNickname bool `json:"requireNickname"` - ReconnectGrace int `json:"reconnectGrace,omitempty"` // Grace period in seconds for primary reconnection - PrimaryTimeout int `json:"primaryTimeout,omitempty"` // Inactivity timeout in seconds for primary session - Nickname string `json:"nickname,omitempty"` - PrivateKeystrokes bool `json:"privateKeystrokes,omitempty"` // If true, only primary session sees keystroke events + RequireApproval bool `json:"requireApproval"` + RequireNickname bool `json:"requireNickname"` + ReconnectGrace int `json:"reconnectGrace,omitempty"` // Grace period in seconds for primary reconnection + PrimaryTimeout int `json:"primaryTimeout,omitempty"` // Inactivity timeout in seconds for primary session + Nickname string `json:"nickname,omitempty"` + PrivateKeystrokes bool `json:"privateKeystrokes,omitempty"` // If true, only primary session sees keystroke events } type SetPasswordRequest struct { @@ -483,7 +483,7 @@ func handleLogout(c *gin.Context) { // Only clear the cookies for this session, don't invalidate the token // The token should remain valid for other sessions c.SetCookie("authToken", "", -1, "/", "", false, true) - c.SetCookie("sessionId", "", -1, "/", "", false, true) // Clear session ID cookie too + c.SetCookie("sessionId", "", -1, "/", "", false, true) // Clear session ID cookie too c.JSON(http.StatusOK, gin.H{"message": "Logout successful"}) } diff --git a/webrtc.go b/webrtc.go index 8e6121bd..78e5eb47 100644 --- a/webrtc.go +++ b/webrtc.go @@ -21,24 +21,24 @@ import ( // Predefined browser string constants for memory efficiency var ( - BrowserChrome = "chrome" - BrowserFirefox = "firefox" - BrowserSafari = "safari" - BrowserEdge = "edge" - BrowserOpera = "opera" - BrowserUnknown = "user" + BrowserChrome = "chrome" + BrowserFirefox = "firefox" + BrowserSafari = "safari" + BrowserEdge = "edge" + BrowserOpera = "opera" + BrowserUnknown = "user" ) type Session struct { - ID string - Mode SessionMode - Source string - Identity string - Nickname string - Browser *string // Pointer to predefined browser string constant for memory efficiency - CreatedAt time.Time - LastActive time.Time - LastBroadcast time.Time // Per-session broadcast throttle + ID string + Mode SessionMode + Source string + Identity string + Nickname string + Browser *string // Pointer to predefined browser string constant for memory efficiency + CreatedAt time.Time + LastActive time.Time + LastBroadcast time.Time // Per-session broadcast throttle // RPC rate limiting (DoS protection) rpcRateLimitMu sync.Mutex // Protects rate limit fields @@ -105,7 +105,7 @@ type SessionConfig struct { ICEServers []string LocalIP string IsCloud bool - UserAgent string // User agent for browser detection and nickname generation + UserAgent string // User agent for browser detection and nickname generation ws *websocket.Conn Logger *zerolog.Logger } @@ -278,7 +278,7 @@ func newSession(config SessionConfig) (*Session, error) { session := &Session{ peerConnection: peerConnection, - Browser: extractBrowserFromUserAgent(config.UserAgent), + Browser: extractBrowserFromUserAgent(config.UserAgent), } session.rpcQueue = make(chan webrtc.DataChannelMessage, 256) session.initQueues()