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.
This commit is contained in:
Alex P 2025-10-08 20:10:22 +03:00
parent cd70efb83f
commit b322255684
29 changed files with 1299 additions and 284 deletions

View File

@ -535,11 +535,11 @@ func handleSessionRequest(
} }
err = wsjson.Write(context.Background(), c, gin.H{ err = wsjson.Write(context.Background(), c, gin.H{
"type": "answer", "type": "answer",
"data": sd, "data": sd,
"sessionId": session.ID, "sessionId": session.ID,
"mode": session.Mode, "mode": session.Mode,
"nickname": session.Nickname, "nickname": session.Nickname,
"requireNickname": requireNickname, "requireNickname": requireNickname,
"requireApproval": requireApproval, "requireApproval": requireApproval,
}) })

View File

@ -79,10 +79,10 @@ func (m *KeyboardMacro) Validate() error {
// MultiSessionConfig defines settings for multi-session support // MultiSessionConfig defines settings for multi-session support
type MultiSessionConfig struct { type MultiSessionConfig struct {
Enabled bool `json:"enabled"` Enabled bool `json:"enabled"`
MaxSessions int `json:"max_sessions"` MaxSessions int `json:"max_sessions"`
PrimaryTimeout int `json:"primary_timeout_seconds"` PrimaryTimeout int `json:"primary_timeout_seconds"`
AllowCloudOverride bool `json:"allow_cloud_override"` AllowCloudOverride bool `json:"allow_cloud_override"`
RequireAuthTransfer bool `json:"require_auth_transfer"` RequireAuthTransfer bool `json:"require_auth_transfer"`
} }
@ -139,15 +139,15 @@ func (c *Config) SetDisplayRotation(rotation string) error {
const configPath = "/userdata/kvm_config.json" const configPath = "/userdata/kvm_config.json"
var defaultConfig = &Config{ var defaultConfig = &Config{
CloudURL: "https://api.jetkvm.com", CloudURL: "https://api.jetkvm.com",
CloudAppURL: "https://app.jetkvm.com", CloudAppURL: "https://app.jetkvm.com",
AutoUpdateEnabled: true, // Set a default value AutoUpdateEnabled: true, // Set a default value
ActiveExtension: "", ActiveExtension: "",
MultiSession: &MultiSessionConfig{ MultiSession: &MultiSessionConfig{
Enabled: true, // Enable by default for new features Enabled: true, // Enable by default for new features
MaxSessions: 10, // Reasonable default MaxSessions: 10, // Reasonable default
PrimaryTimeout: 300, // 5 minutes PrimaryTimeout: 300, // 5 minutes
AllowCloudOverride: true, // Cloud sessions can take control AllowCloudOverride: true, // Cloud sessions can take control
RequireAuthTransfer: false, // Don't require auth by default RequireAuthTransfer: false, // Don't require auth by default
}, },
KeyboardMacros: []KeyboardMacro{}, KeyboardMacros: []KeyboardMacro{},
@ -157,12 +157,12 @@ var defaultConfig = &Config{
DisplayDimAfterSec: 120, // 2 minutes DisplayDimAfterSec: 120, // 2 minutes
DisplayOffAfterSec: 1800, // 30 minutes DisplayOffAfterSec: 1800, // 30 minutes
SessionSettings: &SessionSettings{ SessionSettings: &SessionSettings{
RequireApproval: false, RequireApproval: false,
RequireNickname: false, RequireNickname: false,
ReconnectGrace: 10, // 10 seconds default ReconnectGrace: 10, // 10 seconds default
PrivateKeystrokes: false, // By default, share keystrokes with observers PrivateKeystrokes: false, // By default, share keystrokes with observers
}, },
JigglerEnabled: false, JigglerEnabled: false,
// This is the "Standard" jiggler option in the UI // This is the "Standard" jiggler option in the UI
JigglerConfig: &JigglerConfig{ JigglerConfig: &JigglerConfig{
InactivityLimitSeconds: 60, InactivityLimitSeconds: 60,

View File

@ -4,7 +4,7 @@ import "github.com/pion/webrtc/v4"
func handlePermissionDeniedChannel(d *webrtc.DataChannel, message string) { func handlePermissionDeniedChannel(d *webrtc.DataChannel, message string) {
d.OnOpen(func() { d.OnOpen(func() {
d.SendText(message + "\r\n") _ = d.SendText(message + "\r\n")
d.Close() d.Close()
}) })
d.OnMessage(func(msg webrtc.DataChannelMessage) {}) d.OnMessage(func(msg webrtc.DataChannelMessage) {})

999
deploy.log Normal file
View File

@ -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

View File

@ -15,9 +15,9 @@ const (
PermissionPaste Permission = "clipboard.paste" PermissionPaste Permission = "clipboard.paste"
// Session management permissions // Session management permissions
PermissionSessionTransfer Permission = "session.transfer" PermissionSessionTransfer Permission = "session.transfer"
PermissionSessionApprove Permission = "session.approve" PermissionSessionApprove Permission = "session.approve"
PermissionSessionKick Permission = "session.kick" PermissionSessionKick Permission = "session.kick"
PermissionSessionRequestPrimary Permission = "session.request_primary" PermissionSessionRequestPrimary Permission = "session.request_primary"
PermissionSessionReleasePrimary Permission = "session.release_primary" PermissionSessionReleasePrimary Permission = "session.release_primary"
PermissionSessionManage Permission = "session.manage" PermissionSessionManage Permission = "session.manage"
@ -35,8 +35,8 @@ const (
PermissionExtensionManage Permission = "extension.manage" PermissionExtensionManage Permission = "extension.manage"
// Terminal/Serial permissions // Terminal/Serial permissions
PermissionTerminalAccess Permission = "terminal.access" PermissionTerminalAccess Permission = "terminal.access"
PermissionSerialAccess Permission = "serial.access" PermissionSerialAccess Permission = "serial.access"
PermissionExtensionATX Permission = "extension.atx" PermissionExtensionATX Permission = "extension.atx"
PermissionExtensionDC Permission = "extension.dc" PermissionExtensionDC Permission = "extension.dc"
PermissionExtensionSerial Permission = "extension.serial" PermissionExtensionSerial Permission = "extension.serial"
@ -78,7 +78,7 @@ var RolePermissions = map[SessionMode]PermissionSet{
PermissionExtensionWOL: true, PermissionExtensionWOL: true,
PermissionSettingsRead: true, PermissionSettingsRead: true,
PermissionSettingsWrite: true, PermissionSettingsWrite: true,
PermissionSettingsAccess: true, // Only primary can access settings UI PermissionSettingsAccess: true, // Only primary can access settings UI
PermissionSystemReboot: true, PermissionSystemReboot: true,
PermissionSystemUpdate: true, PermissionSystemUpdate: true,
PermissionSystemNetwork: true, PermissionSystemNetwork: true,
@ -140,20 +140,20 @@ func RequirePermissionForMode(mode SessionMode, perm Permission) error {
// GetPermissionsResponse is the response structure for getPermissions RPC // GetPermissionsResponse is the response structure for getPermissions RPC
type GetPermissionsResponse struct { type GetPermissionsResponse struct {
Mode string `json:"mode"` Mode string `json:"mode"`
Permissions map[string]bool `json:"permissions"` Permissions map[string]bool `json:"permissions"`
} }
// MethodPermissions maps RPC methods to required permissions // MethodPermissions maps RPC methods to required permissions
var MethodPermissions = map[string]Permission{ var MethodPermissions = map[string]Permission{
// Power/hardware control // Power/hardware control
"setATXPowerAction": PermissionPowerControl, "setATXPowerAction": PermissionPowerControl,
"setDCPowerState": PermissionPowerControl, "setDCPowerState": PermissionPowerControl,
"setDCRestoreState": PermissionPowerControl, "setDCRestoreState": PermissionPowerControl,
// USB device control // USB device control
"setUsbDeviceState": PermissionUSBControl, "setUsbDeviceState": PermissionUSBControl,
"setUsbDevices": PermissionUSBControl, "setUsbDevices": PermissionUSBControl,
// Mount operations // Mount operations
"mountUsb": PermissionMountMedia, "mountUsb": PermissionMountMedia,
@ -196,43 +196,43 @@ var MethodPermissions = map[string]Permission{
"setBacklightSettings": PermissionSettingsWrite, "setBacklightSettings": PermissionSettingsWrite,
// USB/HID settings // USB/HID settings
"setUsbEmulationState": PermissionSettingsWrite, "setUsbEmulationState": PermissionSettingsWrite,
"setUsbConfig": PermissionSettingsWrite, "setUsbConfig": PermissionSettingsWrite,
"setKeyboardLayout": PermissionSettingsWrite, "setKeyboardLayout": PermissionSettingsWrite,
"setJigglerState": PermissionSettingsWrite, "setJigglerState": PermissionSettingsWrite,
"setJigglerConfig": PermissionSettingsWrite, "setJigglerConfig": PermissionSettingsWrite,
"setMassStorageMode": PermissionSettingsWrite, "setMassStorageMode": PermissionSettingsWrite,
"setKeyboardMacros": PermissionSettingsWrite, "setKeyboardMacros": PermissionSettingsWrite,
"setWakeOnLanDevices": PermissionSettingsWrite, "setWakeOnLanDevices": PermissionSettingsWrite,
// Cloud settings // Cloud settings
"setCloudUrl": PermissionSettingsWrite, "setCloudUrl": PermissionSettingsWrite,
"deregisterDevice": PermissionSettingsWrite, "deregisterDevice": PermissionSettingsWrite,
// Active extension control // Active extension control
"setActiveExtension": PermissionExtensionManage, "setActiveExtension": PermissionExtensionManage,
// Input operations (already handled in other places but for consistency) // Input operations (already handled in other places but for consistency)
"keyboardReport": PermissionKeyboardInput, "keyboardReport": PermissionKeyboardInput,
"keypressReport": PermissionKeyboardInput, "keypressReport": PermissionKeyboardInput,
"absMouseReport": PermissionMouseInput, "absMouseReport": PermissionMouseInput,
"relMouseReport": PermissionMouseInput, "relMouseReport": PermissionMouseInput,
"wheelReport": PermissionMouseInput, "wheelReport": PermissionMouseInput,
"executeKeyboardMacro": PermissionPaste, "executeKeyboardMacro": PermissionPaste,
"cancelKeyboardMacro": PermissionPaste, "cancelKeyboardMacro": PermissionPaste,
// Session operations // Session operations
"approveNewSession": PermissionSessionApprove, "approveNewSession": PermissionSessionApprove,
"denyNewSession": PermissionSessionApprove, "denyNewSession": PermissionSessionApprove,
"transferSession": PermissionSessionTransfer, "transferSession": PermissionSessionTransfer,
"transferPrimary": PermissionSessionTransfer, "transferPrimary": PermissionSessionTransfer,
"requestPrimary": PermissionSessionRequestPrimary, "requestPrimary": PermissionSessionRequestPrimary,
"releasePrimary": PermissionSessionReleasePrimary, "releasePrimary": PermissionSessionReleasePrimary,
// Extension operations // Extension operations
"activateExtension": PermissionExtensionManage, "activateExtension": PermissionExtensionManage,
"deactivateExtension": PermissionExtensionManage, "deactivateExtension": PermissionExtensionManage,
"sendWOLMagicPacket": PermissionExtensionWOL, "sendWOLMagicPacket": PermissionExtensionWOL,
// Read operations - require appropriate read permissions // Read operations - require appropriate read permissions
"getSessionSettings": PermissionSettingsRead, "getSessionSettings": PermissionSettingsRead,
@ -266,37 +266,37 @@ var MethodPermissions = map[string]Permission{
"getNetworkState": PermissionSettingsRead, "getNetworkState": PermissionSettingsRead,
// Mount/media read operations // Mount/media read operations
"getMassStorageMode": PermissionMountList, "getMassStorageMode": PermissionMountList,
"getUsbState": PermissionMountList, "getUsbState": PermissionMountList,
"getUSBState": PermissionMountList, "getUSBState": PermissionMountList,
"listStorageFiles": PermissionMountList, "listStorageFiles": PermissionMountList,
"getStorageSpace": PermissionMountList, "getStorageSpace": PermissionMountList,
// Extension read operations // Extension read operations
"getActiveExtension": PermissionSettingsRead, "getActiveExtension": PermissionSettingsRead,
// Power state reads // Power state reads
"getATXState": PermissionSettingsRead, "getATXState": PermissionSettingsRead,
"getDCPowerState": PermissionSettingsRead, "getDCPowerState": PermissionSettingsRead,
"getDCRestoreState": PermissionSettingsRead, "getDCRestoreState": PermissionSettingsRead,
// Device info reads (these should be accessible to all) // Device info reads (these should be accessible to all)
"getDeviceID": PermissionVideoView, "getDeviceID": PermissionVideoView,
"getLocalVersion": PermissionVideoView, "getLocalVersion": PermissionVideoView,
"getVideoState": PermissionVideoView, "getVideoState": PermissionVideoView,
"getKeyboardLedState": PermissionVideoView, "getKeyboardLedState": PermissionVideoView,
"getKeyDownState": PermissionVideoView, "getKeyDownState": PermissionVideoView,
"ping": PermissionVideoView, "ping": PermissionVideoView,
"getTimezones": PermissionVideoView, "getTimezones": PermissionVideoView,
"getSessions": PermissionVideoView, "getSessions": PermissionVideoView,
"getUpdateStatus": PermissionSettingsRead, "getUpdateStatus": PermissionSettingsRead,
"isUpdatePending": PermissionSettingsRead, "isUpdatePending": PermissionSettingsRead,
"getUsbEmulationState": PermissionSettingsRead, "getUsbEmulationState": PermissionSettingsRead,
"getUsbConfig": PermissionSettingsRead, "getUsbConfig": PermissionSettingsRead,
"getUsbDevices": PermissionSettingsRead, "getUsbDevices": PermissionSettingsRead,
"getKeyboardMacros": PermissionSettingsRead, "getKeyboardMacros": PermissionSettingsRead,
"getWakeOnLanDevices": PermissionSettingsRead, "getWakeOnLanDevices": PermissionSettingsRead,
"getVirtualMediaState": PermissionMountList, "getVirtualMediaState": PermissionMountList,
} }
// GetMethodPermission returns the required permission for an RPC method // GetMethodPermission returns the required permission for an RPC method

View File

@ -56,7 +56,6 @@ type DisplayRotationSettings struct {
Rotation string `json:"rotation"` Rotation string `json:"rotation"`
} }
type BacklightSettings struct { type BacklightSettings struct {
MaxBrightness int `json:"max_brightness"` MaxBrightness int `json:"max_brightness"`
DimAfter int `json:"dim_after"` DimAfter int `json:"dim_after"`
@ -1330,7 +1329,7 @@ func rpcRequestPrimary(sessionId string) map[string]interface{} {
err := sessionManager.RequestPrimary(sessionId) err := sessionManager.RequestPrimary(sessionId)
if err != nil { if err != nil {
return map[string]interface{}{ return map[string]interface{}{
"status": "error", "status": "error",
"message": err.Error(), "message": err.Error(),
} }
} }
@ -1339,14 +1338,14 @@ func rpcRequestPrimary(sessionId string) map[string]interface{} {
session := sessionManager.GetSession(sessionId) session := sessionManager.GetSession(sessionId)
if session == nil { if session == nil {
return map[string]interface{}{ return map[string]interface{}{
"status": "error", "status": "error",
"message": "session not found", "message": "session not found",
} }
} }
return map[string]interface{}{ return map[string]interface{}{
"status": "success", "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) return sessionManager.TransferPrimary(fromId, toId)
} }
func rpcGetSessionConfig() (map[string]interface{}, error) { func rpcGetSessionConfig() (map[string]interface{}, error) {
maxSessions := 10 maxSessions := 10
primaryTimeout := 300 primaryTimeout := 300
@ -1373,27 +1371,13 @@ func rpcGetSessionConfig() (map[string]interface{}, error) {
} }
return map[string]interface{}{ return map[string]interface{}{
"enabled": true, "enabled": true,
"maxSessions": maxSessions, "maxSessions": maxSessions,
"primaryTimeout": primaryTimeout, "primaryTimeout": primaryTimeout,
"allowCloudOverride": true, "allowCloudOverride": true,
}, nil }, 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 ( var (
keyboardMacroCancel context.CancelFunc keyboardMacroCancel context.CancelFunc
keyboardMacroLock sync.Mutex keyboardMacroLock sync.Mutex

View File

@ -19,12 +19,12 @@ func Main() {
// Initialize currentSessionSettings to use config's persistent SessionSettings // Initialize currentSessionSettings to use config's persistent SessionSettings
if config.SessionSettings == nil { if config.SessionSettings == nil {
config.SessionSettings = &SessionSettings{ config.SessionSettings = &SessionSettings{
RequireApproval: false, RequireApproval: false,
RequireNickname: false, RequireNickname: false,
ReconnectGrace: 10, ReconnectGrace: 10,
PrivateKeystrokes: false, PrivateKeystrokes: false,
} }
SaveConfig() _ = SaveConfig()
} }
currentSessionSettings = config.SessionSettings currentSessionSettings = config.SessionSettings

View File

@ -58,28 +58,28 @@ type TransferBlacklistEntry struct {
// Broadcast throttling to prevent DoS // Broadcast throttling to prevent DoS
var ( var (
lastBroadcast time.Time lastBroadcast time.Time
broadcastMutex sync.Mutex broadcastMutex sync.Mutex
broadcastDelay = 100 * time.Millisecond // Min time between broadcasts broadcastDelay = 100 * time.Millisecond // Min time between broadcasts
// Pre-allocated event maps to reduce allocations // Pre-allocated event maps to reduce allocations
modePrimaryEvent = map[string]string{"mode": "primary"} modePrimaryEvent = map[string]string{"mode": "primary"}
modeObserverEvent = map[string]string{"mode": "observer"} modeObserverEvent = map[string]string{"mode": "observer"}
) )
type SessionManager struct { type SessionManager struct {
mu sync.RWMutex // 24 bytes - place first for better alignment mu sync.RWMutex // 24 bytes - place first for better alignment
primaryTimeout time.Duration // 8 bytes primaryTimeout time.Duration // 8 bytes
logger *zerolog.Logger // 8 bytes logger *zerolog.Logger // 8 bytes
sessions map[string]*Session // 8 bytes sessions map[string]*Session // 8 bytes
reconnectGrace map[string]time.Time // 8 bytes reconnectGrace map[string]time.Time // 8 bytes
reconnectInfo map[string]*SessionData // 8 bytes reconnectInfo map[string]*SessionData // 8 bytes
transferBlacklist []TransferBlacklistEntry // Prevent demoted sessions from immediate re-promotion transferBlacklist []TransferBlacklistEntry // Prevent demoted sessions from immediate re-promotion
queueOrder []string // 24 bytes (slice header) queueOrder []string // 24 bytes (slice header)
primarySessionID string // 16 bytes primarySessionID string // 16 bytes
lastPrimaryID string // 16 bytes lastPrimaryID string // 16 bytes
maxSessions int // 8 bytes maxSessions int // 8 bytes
cleanupCancel context.CancelFunc // For stopping cleanup goroutine cleanupCancel context.CancelFunc // For stopping cleanup goroutine
// Emergency promotion tracking for safety // Emergency promotion tracking for safety
lastEmergencyPromotion time.Time lastEmergencyPromotion time.Time
@ -107,14 +107,14 @@ func NewSessionManager(logger *zerolog.Logger) *SessionManager {
} }
sm := &SessionManager{ sm := &SessionManager{
sessions: make(map[string]*Session), sessions: make(map[string]*Session),
reconnectGrace: make(map[string]time.Time), reconnectGrace: make(map[string]time.Time),
reconnectInfo: make(map[string]*SessionData), reconnectInfo: make(map[string]*SessionData),
transferBlacklist: make([]TransferBlacklistEntry, 0), transferBlacklist: make([]TransferBlacklistEntry, 0),
queueOrder: make([]string, 0), queueOrder: make([]string, 0),
logger: logger, logger: logger,
maxSessions: maxSessions, maxSessions: maxSessions,
primaryTimeout: primaryTimeout, primaryTimeout: primaryTimeout,
} }
// Start background cleanup of inactive sessions // Start background cleanup of inactive sessions
@ -200,8 +200,8 @@ func (sm *SessionManager) AddSession(session *Session, clientSettings *SessionSe
if sm.lastPrimaryID == session.ID && !isBlacklisted { if sm.lastPrimaryID == session.ID && !isBlacklisted {
// This is the rightful primary reconnecting within grace period // This is the rightful primary reconnecting within grace period
sm.primarySessionID = session.ID sm.primarySessionID = session.ID
sm.lastPrimaryID = "" // Clear since primary successfully reconnected sm.lastPrimaryID = "" // Clear since primary successfully reconnected
delete(sm.reconnectGrace, session.ID) // Clear grace period delete(sm.reconnectGrace, session.ID) // Clear grace period
sm.logger.Debug(). sm.logger.Debug().
Str("sessionID", session.ID). Str("sessionID", session.ID).
Msg("Primary session successfully reconnected within grace period") 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 // we can always promote to primary when no primary exists
session.Mode = SessionModePrimary session.Mode = SessionModePrimary
sm.primarySessionID = session.ID 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 // Clear all existing grace periods when a new primary is established
// This prevents multiple sessions from fighting for primary status via grace period // 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) // 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 { for len(sm.reconnectGrace) >= maxGraceEntries {
// Find and remove the oldest grace period entry // Find and remove the oldest grace period entry
var oldestID string 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 this was the primary session, clear primary slot and track for grace period
if wasPrimary { if wasPrimary {
sm.lastPrimaryID = sessionID // Remember this was the primary for grace period sm.lastPrimaryID = sessionID // Remember this was the primary for grace period
sm.primarySessionID = "" // Clear primary slot so other sessions can be promoted sm.primarySessionID = "" // Clear primary slot so other sessions can be promoted
sm.logger.Info(). sm.logger.Info().
Str("sessionID", sessionID). Str("sessionID", sessionID).
Dur("gracePeriod", time.Duration(gracePeriod)*time.Second). Dur("gracePeriod", time.Duration(gracePeriod)*time.Second).
@ -970,7 +970,7 @@ func (sm *SessionManager) transferPrimaryRole(fromSessionID, toSessionID, transf
toSession.Mode = SessionModePrimary toSession.Mode = SessionModePrimary
toSession.hidRPCAvailable = false // Force re-handshake toSession.hidRPCAvailable = false // Force re-handshake
sm.primarySessionID = toSessionID 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 // Clear input state
sm.clearInputState() sm.clearInputState()
@ -1038,9 +1038,9 @@ func (sm *SessionManager) transferPrimaryRole(fromSessionID, toSessionID, transf
// Send connection reset signal to the promoted session // Send connection reset signal to the promoted session
writeJSONRPCEvent("connectionModeChanged", map[string]interface{}{ writeJSONRPCEvent("connectionModeChanged", map[string]interface{}{
"sessionId": toSessionID, "sessionId": toSessionID,
"newMode": string(toSession.Mode), "newMode": string(toSession.Mode),
"reason": "session_promotion", "reason": "session_promotion",
"action": "reconnect_required", "action": "reconnect_required",
"timestamp": time.Now().Unix(), "timestamp": time.Now().Unix(),
}, toSession) }, toSession)
@ -1113,7 +1113,7 @@ func (sm *SessionManager) removeFromQueue(sessionID string) {
func (sm *SessionManager) clearInputState() { func (sm *SessionManager) clearInputState() {
// Clear keyboard state // Clear keyboard state
if gadget != nil { 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 { for sessionID, session := range sm.sessions {
// Skip if blacklisted, primary, or not eligible modes // Skip if blacklisted, primary, or not eligible modes
if sm.isSessionBlacklisted(sessionID) || if sm.isSessionBlacklisted(sessionID) ||
session.Mode == SessionModePrimary || session.Mode == SessionModePrimary ||
(session.Mode != SessionModeObserver && session.Mode != SessionModeQueued) { (session.Mode != SessionModeObserver && session.Mode != SessionModeQueued) {
continue continue
} }
@ -1377,11 +1377,11 @@ func (sm *SessionManager) Shutdown() {
} }
func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) { 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() defer ticker.Stop()
pendingTimeout := 1 * time.Minute // Reduced from 5 minutes to prevent DoS pendingTimeout := 1 * time.Minute // Reduced from 5 minutes to prevent DoS
validationCounter := 0 // Counter for periodic validateSinglePrimary calls validationCounter := 0 // Counter for periodic validateSinglePrimary calls
for { for {
select { select {
@ -1508,7 +1508,7 @@ func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) {
// Clean up pending sessions that have timed out (DoS protection) // Clean up pending sessions that have timed out (DoS protection)
for id, session := range sm.sessions { for id, session := range sm.sessions {
if session.Mode == SessionModePending && if session.Mode == SessionModePending &&
now.Sub(session.CreatedAt) > pendingTimeout { now.Sub(session.CreatedAt) > pendingTimeout {
websocketLogger.Info(). websocketLogger.Info().
Str("sessionId", id). Str("sessionId", id).
Dur("age", now.Sub(session.CreatedAt)). Dur("age", now.Sub(session.CreatedAt)).
@ -1549,8 +1549,8 @@ func (sm *SessionManager) cleanupInactiveSessions(ctx context.Context) {
bestScore := -1 bestScore := -1
for id, session := range sm.sessions { for id, session := range sm.sessions {
if id != timedOutSessionID && if id != timedOutSessionID &&
!sm.isSessionBlacklisted(id) && !sm.isSessionBlacklisted(id) &&
(session.Mode == SessionModeObserver || session.Mode == SessionModeQueued) { (session.Mode == SessionModeObserver || session.Mode == SessionModeQueued) {
score := sm.getSessionTrustScore(id) score := sm.getSessionTrustScore(id)
if score > bestScore { if score > bestScore {
bestScore = score bestScore = score

View File

@ -1,45 +1,52 @@
import { SessionInfo } from "@/stores/sessionStore"; import { SessionInfo } from "@/stores/sessionStore";
interface JsonRpcResponse {
result?: unknown;
error?: { message: string };
}
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: JsonRpcResponse) => void) => void;
export const sessionApi = { export const sessionApi = {
getSessions: async (sendFn: Function): Promise<SessionInfo[]> => { getSessions: async (sendFn: RpcSendFunction): Promise<SessionInfo[]> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
sendFn("getSessions", {}, (response: any) => { sendFn("getSessions", {}, (response: JsonRpcResponse) => {
if (response.error) { if (response.error) {
reject(new Error(response.error.message)); reject(new Error(response.error.message));
} else { } else {
resolve(response.result || []); resolve((response.result as SessionInfo[]) || []);
} }
}); });
}); });
}, },
getSessionInfo: async (sendFn: Function, sessionId: string): Promise<SessionInfo> => { getSessionInfo: async (sendFn: RpcSendFunction, sessionId: string): Promise<SessionInfo> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
sendFn("getSessionInfo", { sessionId }, (response: any) => { sendFn("getSessionInfo", { sessionId }, (response: JsonRpcResponse) => {
if (response.error) { if (response.error) {
reject(new Error(response.error.message)); reject(new Error(response.error.message));
} else { } 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) => { return new Promise((resolve, reject) => {
sendFn("requestPrimary", { sessionId }, (response: any) => { sendFn("requestPrimary", { sessionId }, (response: JsonRpcResponse) => {
if (response.error) { if (response.error) {
reject(new Error(response.error.message)); reject(new Error(response.error.message));
} else { } else {
resolve(response.result); resolve(response.result as { status: string; mode?: string; message?: string });
} }
}); });
}); });
}, },
releasePrimary: async (sendFn: Function, sessionId: string): Promise<void> => { releasePrimary: async (sendFn: RpcSendFunction, sessionId: string): Promise<void> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
sendFn("releasePrimary", { sessionId }, (response: any) => { sendFn("releasePrimary", { sessionId }, (response: JsonRpcResponse) => {
if (response.error) { if (response.error) {
reject(new Error(response.error.message)); reject(new Error(response.error.message));
} else { } else {
@ -50,12 +57,12 @@ export const sessionApi = {
}, },
transferPrimary: async ( transferPrimary: async (
sendFn: Function, sendFn: RpcSendFunction,
fromId: string, fromId: string,
toId: string toId: string
): Promise<void> => { ): Promise<void> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
sendFn("transferPrimary", { fromId, toId }, (response: any) => { sendFn("transferPrimary", { fromId, toId }, (response: JsonRpcResponse) => {
if (response.error) { if (response.error) {
reject(new Error(response.error.message)); reject(new Error(response.error.message));
} else { } else {
@ -66,12 +73,12 @@ export const sessionApi = {
}, },
updateNickname: async ( updateNickname: async (
sendFn: Function, sendFn: RpcSendFunction,
sessionId: string, sessionId: string,
nickname: string nickname: string
): Promise<void> => { ): Promise<void> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
sendFn("updateSessionNickname", { sessionId, nickname }, (response: any) => { sendFn("updateSessionNickname", { sessionId, nickname }, (response: JsonRpcResponse) => {
if (response.error) { if (response.error) {
reject(new Error(response.error.message)); reject(new Error(response.error.message));
} else { } else {
@ -82,11 +89,11 @@ export const sessionApi = {
}, },
approveNewSession: async ( approveNewSession: async (
sendFn: Function, sendFn: RpcSendFunction,
sessionId: string sessionId: string
): Promise<void> => { ): Promise<void> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
sendFn("approveNewSession", { sessionId }, (response: any) => { sendFn("approveNewSession", { sessionId }, (response: JsonRpcResponse) => {
if (response.error) { if (response.error) {
reject(new Error(response.error.message)); reject(new Error(response.error.message));
} else { } else {
@ -97,11 +104,11 @@ export const sessionApi = {
}, },
denyNewSession: async ( denyNewSession: async (
sendFn: Function, sendFn: RpcSendFunction,
sessionId: string sessionId: string
): Promise<void> => { ): Promise<void> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
sendFn("denyNewSession", { sessionId }, (response: any) => { sendFn("denyNewSession", { sessionId }, (response: JsonRpcResponse) => {
if (response.error) { if (response.error) {
reject(new Error(response.error.message)); reject(new Error(response.error.message));
} else { } else {

View File

@ -1,13 +1,15 @@
import { useEffect, useState } from "react"; import { useEffect, useState, useCallback } from "react";
import { useNavigate } from "react-router"; import { useNavigate } from "react-router";
import { XCircleIcon } from "@heroicons/react/24/outline"; import { XCircleIcon } from "@heroicons/react/24/outline";
import { Button } from "./Button";
import { DEVICE_API, CLOUD_API } from "@/ui.config"; import { DEVICE_API, CLOUD_API } from "@/ui.config";
import { isOnDevice } from "@/main"; import { isOnDevice } from "@/main";
import { useUserStore } from "@/hooks/stores"; import { useUserStore } from "@/hooks/stores";
import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore"; import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore";
import api from "@/api"; import api from "@/api";
import { Button } from "./Button";
interface AccessDeniedOverlayProps { interface AccessDeniedOverlayProps {
show: boolean; show: boolean;
message?: string; message?: string;
@ -25,7 +27,7 @@ export default function AccessDeniedOverlay({
const { clearNickname } = useSharedSessionStore(); const { clearNickname } = useSharedSessionStore();
const [countdown, setCountdown] = useState(10); const [countdown, setCountdown] = useState(10);
const handleLogout = async () => { const handleLogout = useCallback(async () => {
try { try {
const logoutUrl = isOnDevice ? `${DEVICE_API}/auth/logout` : `${CLOUD_API}/logout`; const logoutUrl = isOnDevice ? `${DEVICE_API}/auth/logout` : `${CLOUD_API}/logout`;
const res = await api.POST(logoutUrl); const res = await api.POST(logoutUrl);
@ -41,7 +43,7 @@ export default function AccessDeniedOverlay({
clearSession(); clearSession();
clearNickname(); clearNickname();
navigate("/"); navigate("/");
}; }, [navigate, setUser, clearSession, clearNickname]);
useEffect(() => { useEffect(() => {
if (!show) return; if (!show) return;
@ -59,7 +61,7 @@ export default function AccessDeniedOverlay({
}, 1000); }, 1000);
return () => clearInterval(timer); return () => clearInterval(timer);
}, [show]); }, [show, handleLogout]);
if (!show) return null; if (!show) return null;

View File

@ -11,7 +11,7 @@ import {
useMountMediaStore, useMountMediaStore,
useSettingsStore, useSettingsStore,
useUiStore, useUiStore,
} from "@/hooks/stores"; useRTCStore } from "@/hooks/stores";
import Container from "@components/Container"; import Container from "@components/Container";
import { cx } from "@/cva.config"; import { cx } from "@/cva.config";
import PasteModal from "@/components/popovers/PasteModal"; import PasteModal from "@/components/popovers/PasteModal";
@ -21,7 +21,6 @@ import ExtensionPopover from "@/components/popovers/ExtensionPopover";
import SessionPopover from "@/components/popovers/SessionPopover"; import SessionPopover from "@/components/popovers/SessionPopover";
import { useDeviceUiNavigation } from "@/hooks/useAppNavigation"; import { useDeviceUiNavigation } from "@/hooks/useAppNavigation";
import { useSessionStore } from "@/stores/sessionStore"; import { useSessionStore } from "@/stores/sessionStore";
import { useRTCStore } from "@/hooks/stores";
import { usePermissions, Permission } from "@/hooks/usePermissions"; import { usePermissions, Permission } from "@/hooks/usePermissions";
export default function Actionbar({ export default function Actionbar({
@ -54,7 +53,7 @@ export default function Actionbar({
setSessions(response.result); setSessions(response.result);
rpcDataChannel.removeEventListener("message", handler); rpcDataChannel.removeEventListener("message", handler);
} }
} catch (error) { } catch {
// Ignore parse errors for non-JSON messages // Ignore parse errors for non-JSON messages
} }
}; };
@ -67,7 +66,7 @@ export default function Actionbar({
rpcDataChannel.removeEventListener("message", handler); rpcDataChannel.removeEventListener("message", handler);
}, 5000); }, 5000);
} }
}, [rpcDataChannel?.readyState]); }, [rpcDataChannel, sessions.length, setSessions]);
// This is the only way to get a reliable state change for the popover // 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 // at time of writing this there is no mount, or unmount event for the popover

View File

@ -1,12 +1,13 @@
import { useState, useEffect, useRef } from "react"; import { useState, useEffect, useRef } from "react";
import { Dialog, DialogPanel, DialogBackdrop } from "@headlessui/react"; import { Dialog, DialogPanel, DialogBackdrop } from "@headlessui/react";
import { UserIcon, XMarkIcon } from "@heroicons/react/20/solid"; 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 { useJsonRpc } from "@/hooks/useJsonRpc";
import { useRTCStore } from "@/hooks/stores";
import { generateNickname } from "@/utils/nicknameGenerator"; import { generateNickname } from "@/utils/nicknameGenerator";
import { Button } from "./Button";
type SessionRole = "primary" | "observer" | "queued" | "pending"; type SessionRole = "primary" | "observer" | "queued" | "pending";
interface NicknameModalProps { interface NicknameModalProps {
@ -128,8 +129,8 @@ export default function NicknameModal({
await onSubmit(trimmedNickname); await onSubmit(trimmedNickname);
setNickname(""); setNickname("");
setGeneratedNickname(""); // Reset generated nickname after successful submit setGeneratedNickname(""); // Reset generated nickname after successful submit
} catch (error: any) { } catch (error) {
setError(error.message || "Failed to set nickname"); setError(error instanceof Error ? error.message : "Failed to set nickname");
setIsSubmitting(false); setIsSubmitting(false);
} }
}; };

View File

@ -1,16 +1,19 @@
import { useSessionStore } from "@/stores/sessionStore";
import { sessionApi } from "@/api/sessionApi";
import { Button } from "@/components/Button";
import { import {
LockClosedIcon, LockClosedIcon,
LockOpenIcon, LockOpenIcon,
ClockIcon ClockIcon
} from "@heroicons/react/16/solid"; } from "@heroicons/react/16/solid";
import clsx from "clsx"; 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"; import { usePermissions, Permission } from "@/hooks/usePermissions";
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
interface SessionControlPanelProps { interface SessionControlPanelProps {
sendFn: Function; sendFn: RpcSendFunction;
className?: string; className?: string;
} }
@ -48,8 +51,8 @@ export default function SessionControlPanel({ sendFn, className }: SessionContro
setSessionError(result.message || "Failed to request primary control"); setSessionError(result.message || "Failed to request primary control");
setRequestingPrimary(false); setRequestingPrimary(false);
} }
} catch (error: any) { } catch (error) {
setSessionError(error.message); setSessionError(error instanceof Error ? error.message : "Unknown error");
console.error("Failed to request primary control:", error); console.error("Failed to request primary control:", error);
setRequestingPrimary(false); setRequestingPrimary(false);
} }
@ -60,8 +63,8 @@ export default function SessionControlPanel({ sendFn, className }: SessionContro
try { try {
await sessionApi.releasePrimary(sendFn, currentSessionId); await sessionApi.releasePrimary(sendFn, currentSessionId);
} catch (error: any) { } catch (error) {
setSessionError(error.message); setSessionError(error instanceof Error ? error.message : "Unknown error");
console.error("Failed to release primary control:", error); console.error("Failed to release primary control:", error);
} }
}; };

View File

@ -1,5 +1,6 @@
import { PencilIcon, CheckIcon, XMarkIcon } from "@heroicons/react/20/solid"; import { PencilIcon, CheckIcon, XMarkIcon } from "@heroicons/react/20/solid";
import clsx from "clsx"; import clsx from "clsx";
import { formatters } from "@/utils"; import { formatters } from "@/utils";
import { usePermissions, Permission } from "@/hooks/usePermissions"; import { usePermissions, Permission } from "@/hooks/usePermissions";

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { XMarkIcon, UserIcon, GlobeAltIcon, ComputerDesktopIcon } from "@heroicons/react/20/solid"; import { XMarkIcon, UserIcon, GlobeAltIcon, ComputerDesktopIcon } from "@heroicons/react/20/solid";
import { Button } from "./Button"; import { Button } from "./Button";
type RequestType = "session_approval" | "primary_control"; type RequestType = "session_approval" | "primary_control";
@ -55,7 +56,8 @@ export default function UnifiedSessionRequestDialog({
return () => clearInterval(timer); 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 // Handle auto-deny when timeout occurs
useEffect(() => { useEffect(() => {

View File

@ -14,7 +14,6 @@ import {
useSettingsStore, useSettingsStore,
useVideoStore, useVideoStore,
} from "@/hooks/stores"; } from "@/hooks/stores";
import { useSessionStore } from "@/stores/sessionStore";
import { usePermissions, Permission } from "@/hooks/usePermissions"; import { usePermissions, Permission } from "@/hooks/usePermissions";
import useMouse from "@/hooks/useMouse"; import useMouse from "@/hooks/useMouse";
@ -37,7 +36,6 @@ export default function WebRTCVideo() {
// Store hooks // Store hooks
const settings = useSettingsStore(); const settings = useSettingsStore();
const { currentMode } = useSessionStore();
const { hasPermission } = usePermissions(); const { hasPermission } = usePermissions();
const { handleKeyPress, resetKeyboardState } = useKeyboard(); const { handleKeyPress, resetKeyboardState } = useKeyboard();
const { const {
@ -230,7 +228,7 @@ export default function WebRTCVideo() {
if (!hasPermission(Permission.MOUSE_INPUT)) return; if (!hasPermission(Permission.MOUSE_INPUT)) return;
handler(e); handler(e);
}; };
}, [currentMode, getAbsMouseMoveHandler, videoClientWidth, videoClientHeight, videoWidth, videoHeight]); }, [getAbsMouseMoveHandler, videoClientWidth, videoClientHeight, videoWidth, videoHeight, hasPermission]);
const relMouseMoveHandler = useMemo(() => { const relMouseMoveHandler = useMemo(() => {
const handler = getRelMouseMoveHandler(); const handler = getRelMouseMoveHandler();
@ -239,7 +237,7 @@ export default function WebRTCVideo() {
if (!hasPermission(Permission.MOUSE_INPUT)) return; if (!hasPermission(Permission.MOUSE_INPUT)) return;
handler(e); handler(e);
}; };
}, [currentMode, getRelMouseMoveHandler]); }, [getRelMouseMoveHandler, hasPermission]);
const mouseWheelHandler = useMemo(() => { const mouseWheelHandler = useMemo(() => {
const handler = getMouseWheelHandler(); const handler = getMouseWheelHandler();
@ -248,7 +246,7 @@ export default function WebRTCVideo() {
if (!hasPermission(Permission.MOUSE_INPUT)) return; if (!hasPermission(Permission.MOUSE_INPUT)) return;
handler(e); handler(e);
}; };
}, [currentMode, getMouseWheelHandler]); }, [getMouseWheelHandler, hasPermission]);
const keyDownHandler = useCallback( const keyDownHandler = useCallback(
(e: KeyboardEvent) => { (e: KeyboardEvent) => {
@ -288,7 +286,7 @@ export default function WebRTCVideo() {
}, 100); }, 100);
} }
}, },
[currentMode, handleKeyPress, isKeyboardLockActive], [handleKeyPress, isKeyboardLockActive, hasPermission],
); );
const keyUpHandler = useCallback( const keyUpHandler = useCallback(
@ -310,7 +308,7 @@ export default function WebRTCVideo() {
handleKeyPress(hidKey, false); handleKeyPress(hidKey, false);
}, },
[currentMode, handleKeyPress], [handleKeyPress, hasPermission],
); );
const videoKeyUpHandler = useCallback((e: KeyboardEvent) => { const videoKeyUpHandler = useCallback((e: KeyboardEvent) => {

View File

@ -1,12 +1,13 @@
import { useState, useEffect } from "react"; import { useState, useEffect, useCallback } from "react";
import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore";
import { useJsonRpc } from "@/hooks/useJsonRpc";
import { import {
UserGroupIcon, UserGroupIcon,
ArrowPathIcon, ArrowPathIcon,
PencilIcon, PencilIcon,
} from "@heroicons/react/20/solid"; } from "@heroicons/react/20/solid";
import clsx from "clsx"; import clsx from "clsx";
import { useSessionStore, useSharedSessionStore } from "@/stores/sessionStore";
import { useJsonRpc } from "@/hooks/useJsonRpc";
import SessionControlPanel from "@/components/SessionControlPanel"; import SessionControlPanel from "@/components/SessionControlPanel";
import NicknameModal from "@/components/NicknameModal"; import NicknameModal from "@/components/NicknameModal";
import SessionsList, { SessionModeBadge } from "@/components/SessionsList"; import SessionsList, { SessionModeBadge } from "@/components/SessionsList";
@ -29,11 +30,11 @@ export default function SessionPopover() {
const { send } = useJsonRpc(); const { send } = useJsonRpc();
// Adapter function to match existing callback pattern // Adapter function to match existing callback pattern
const sendRpc = (method: string, params: any, callback?: (response: any) => void) => { const sendRpc = useCallback((method: string, params: Record<string, unknown>, callback?: (response: { result?: unknown; error?: { message: string } }) => void) => {
send(method, params, (response) => { send(method, params, (response) => {
if (callback) callback(response); if (callback) callback(response);
}); });
}; }, [send]);
const handleRefresh = async () => { const handleRefresh = async () => {
if (isRefreshing) return; if (isRefreshing) return;
@ -56,7 +57,7 @@ export default function SessionPopover() {
.then(sessions => setSessions(sessions)) .then(sessions => setSessions(sessions))
.catch(error => console.error("Failed to fetch sessions:", error)); .catch(error => console.error("Failed to fetch sessions:", error));
} }
}, []); }, [sendRpc, sessions.length, setSessions]);
return ( return (
<div className="w-full rounded-lg bg-white dark:bg-slate-800 shadow-lg border border-slate-200 dark:border-slate-700"> <div className="w-full rounded-lg bg-white dark:bg-slate-800 shadow-lg border border-slate-200 dark:border-slate-700">
@ -141,7 +142,7 @@ export default function SessionPopover() {
setShowNicknameModal(true); setShowNicknameModal(true);
}} }}
onApprove={(sessionId) => { onApprove={(sessionId) => {
sendRpc("approveNewSession", { sessionId }, (response: any) => { sendRpc("approveNewSession", { sessionId }, (response) => {
if (response.error) { if (response.error) {
console.error("Failed to approve session:", response.error); console.error("Failed to approve session:", response.error);
} else { } else {
@ -150,7 +151,7 @@ export default function SessionPopover() {
}); });
}} }}
onDeny={(sessionId) => { onDeny={(sessionId) => {
sendRpc("denyNewSession", { sessionId }, (response: any) => { sendRpc("denyNewSession", { sessionId }, (response) => {
if (response.error) { if (response.error) {
console.error("Failed to deny session:", response.error); console.error("Failed to deny session:", response.error);
} else { } else {

View File

@ -1,8 +1,11 @@
import { useState, useEffect, useRef, useCallback } from "react"; import { useState, useEffect, useRef, useCallback } from "react";
import { useJsonRpc } from "@/hooks/useJsonRpc";
import { useJsonRpc, JsonRpcRequest } from "@/hooks/useJsonRpc";
import { useSessionStore } from "@/stores/sessionStore"; import { useSessionStore } from "@/stores/sessionStore";
import { useRTCStore } from "@/hooks/stores"; import { useRTCStore } from "@/hooks/stores";
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
// Permission types matching backend // Permission types matching backend
export enum Permission { export enum Permission {
// Video/Display permissions // Video/Display permissions
@ -65,11 +68,11 @@ export function usePermissions() {
const previousCanControl = useRef<boolean>(false); const previousCanControl = useRef<boolean>(false);
// Function to poll permissions // Function to poll permissions
const pollPermissions = useCallback((send: any) => { const pollPermissions = useCallback((send: RpcSendFunction) => {
if (!send) return; if (!send) return;
setIsLoading(true); setIsLoading(true);
send("getPermissions", {}, (response: any) => { send("getPermissions", {}, (response: { result?: unknown; error?: { message: string } }) => {
if (!response.error && response.result) { if (!response.error && response.result) {
const result = response.result as PermissionsResponse; const result = response.result as PermissionsResponse;
setPermissions(result.permissions); setPermissions(result.permissions);
@ -79,13 +82,14 @@ export function usePermissions() {
}, []); }, []);
// Handle connectionModeChanged events that require WebRTC reconnection // Handle connectionModeChanged events that require WebRTC reconnection
const handleRpcRequest = useCallback((request: any) => { const handleRpcRequest = useCallback((request: JsonRpcRequest) => {
if (request.method === "connectionModeChanged") { if (request.method === "connectionModeChanged") {
console.info("Connection mode changed, WebRTC reconnection required", request.params); console.info("Connection mode changed, WebRTC reconnection required", request.params);
// For session promotion that requires reconnection, refresh the page // For session promotion that requires reconnection, refresh the page
// This ensures WebRTC connection is re-established with proper mode // 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"); console.info("Session promoted, refreshing page to re-establish WebRTC connection");
// Small delay to ensure all state updates are processed // Small delay to ensure all state updates are processed
setTimeout(() => { setTimeout(() => {
@ -132,7 +136,8 @@ export function usePermissions() {
} }
previousCanControl.current = currentCanControl; 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 => { const hasPermission = (permission: Permission): boolean => {
return permissions[permission] === true; return permissions[permission] === true;

View File

@ -1,11 +1,14 @@
import { useEffect, useRef } from "react"; import { useEffect, useRef } from "react";
import { useSessionStore } from "@/stores/sessionStore";
import { useSessionStore, SessionInfo } from "@/stores/sessionStore";
import { useRTCStore } from "@/hooks/stores"; import { useRTCStore } from "@/hooks/stores";
import { sessionApi } from "@/api/sessionApi"; import { sessionApi } from "@/api/sessionApi";
import { notify } from "@/notifications"; import { notify } from "@/notifications";
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
interface SessionEventData { interface SessionEventData {
sessions: any[]; sessions: SessionInfo[];
yourMode: string; yourMode: string;
} }
@ -13,7 +16,7 @@ interface ModeChangedData {
mode: string; mode: string;
} }
export function useSessionEvents(sendFn: Function | null) { export function useSessionEvents(sendFn: RpcSendFunction | null) {
const { const {
currentMode, currentMode,
setSessions, setSessions,
@ -25,7 +28,7 @@ export function useSessionEvents(sendFn: Function | null) {
sendFnRef.current = sendFn; sendFnRef.current = sendFn;
// Handle session-related RPC events // Handle session-related RPC events
const handleSessionEvent = (method: string, params: any) => { const handleSessionEvent = (method: string, params: unknown) => {
switch (method) { switch (method) {
case "sessionsUpdated": case "sessionsUpdated":
handleSessionsUpdated(params as SessionEventData); handleSessionsUpdated(params as SessionEventData);
@ -52,7 +55,7 @@ export function useSessionEvents(sendFn: Function | null) {
// CRITICAL: Only update mode, never show notifications from sessionsUpdated // CRITICAL: Only update mode, never show notifications from sessionsUpdated
// Notifications are exclusively handled by handleModeChanged to prevent duplicates // Notifications are exclusively handled by handleModeChanged to prevent duplicates
if (data.yourMode && data.yourMode !== currentMode) { 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 // Get the most current mode from the store to avoid race conditions
const { currentMode: currentModeFromStore } = useSessionStore.getState(); const { currentMode: currentModeFromStore } = useSessionStore.getState();
const previousMode = currentModeFromStore; const previousMode = currentModeFromStore;
updateSessionMode(data.mode as any); updateSessionMode(data.mode as "primary" | "observer" | "queued" | "pending");
// Clear requesting state when mode changes from queued // Clear requesting state when mode changes from queued
if (previousMode === "queued" && data.mode !== "queued") { if (previousMode === "queued" && data.mode !== "queued") {
@ -139,7 +142,7 @@ export function useSessionEvents(sendFn: Function | null) {
try { try {
const sessions = await sessionApi.getSessions(sendFnRef.current); const sessions = await sessionApi.getSessions(sendFnRef.current);
setSessions(sessions); setSessions(sessions);
} catch (error) { } catch {
// Silently fail on refresh errors // Silently fail on refresh errors
} }
}, 30000); // Refresh every 30 seconds }, 30000); // Refresh every 30 seconds

View File

@ -1,9 +1,12 @@
import { useEffect, useCallback, useState } from "react"; import { useEffect, useCallback, useState } from "react";
import { useSessionStore } from "@/stores/sessionStore"; import { useSessionStore } from "@/stores/sessionStore";
import { useSessionEvents } from "@/hooks/useSessionEvents"; import { useSessionEvents } from "@/hooks/useSessionEvents";
import { useSettingsStore } from "@/hooks/stores"; import { useSettingsStore } from "@/hooks/stores";
import { usePermissions, Permission } from "@/hooks/usePermissions"; import { usePermissions, Permission } from "@/hooks/usePermissions";
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
interface SessionResponse { interface SessionResponse {
sessionId?: string; sessionId?: string;
mode?: string; mode?: string;
@ -23,7 +26,7 @@ interface NewSessionRequest {
nickname?: string; nickname?: string;
} }
export function useSessionManagement(sendFn: Function | null) { export function useSessionManagement(sendFn: RpcSendFunction | null) {
const { const {
setCurrentSession, setCurrentSession,
clearSession clearSession
@ -39,7 +42,7 @@ export function useSessionManagement(sendFn: Function | null) {
// Handle session info from WebRTC answer // Handle session info from WebRTC answer
const handleSessionResponse = useCallback((response: SessionResponse) => { const handleSessionResponse = useCallback((response: SessionResponse) => {
if (response.sessionId && response.mode) { if (response.sessionId && response.mode) {
setCurrentSession(response.sessionId, response.mode as any); setCurrentSession(response.sessionId, response.mode as "primary" | "observer" | "queued" | "pending");
} }
}, [setCurrentSession]); }, [setCurrentSession]);
@ -48,7 +51,7 @@ export function useSessionManagement(sendFn: Function | null) {
if (!sendFn) return; if (!sendFn) return;
return new Promise<void>((resolve, reject) => { return new Promise<void>((resolve, reject) => {
sendFn("approvePrimaryRequest", { requesterID: requestId }, (response: any) => { sendFn("approvePrimaryRequest", { requesterID: requestId }, (response: { result?: unknown; error?: { message: string } }) => {
if (response.error) { if (response.error) {
console.error("Failed to approve primary request:", response.error); console.error("Failed to approve primary request:", response.error);
reject(new Error(response.error.message || "Failed to approve")); reject(new Error(response.error.message || "Failed to approve"));
@ -65,7 +68,7 @@ export function useSessionManagement(sendFn: Function | null) {
if (!sendFn) return; if (!sendFn) return;
return new Promise<void>((resolve, reject) => { return new Promise<void>((resolve, reject) => {
sendFn("denyPrimaryRequest", { requesterID: requestId }, (response: any) => { sendFn("denyPrimaryRequest", { requesterID: requestId }, (response: { result?: unknown; error?: { message: string } }) => {
if (response.error) { if (response.error) {
console.error("Failed to deny primary request:", response.error); console.error("Failed to deny primary request:", response.error);
reject(new Error(response.error.message || "Failed to deny")); reject(new Error(response.error.message || "Failed to deny"));
@ -82,7 +85,7 @@ export function useSessionManagement(sendFn: Function | null) {
if (!sendFn) return; if (!sendFn) return;
return new Promise<void>((resolve, reject) => { return new Promise<void>((resolve, reject) => {
sendFn("approveNewSession", { sessionId }, (response: any) => { sendFn("approveNewSession", { sessionId }, (response: { result?: unknown; error?: { message: string } }) => {
if (response.error) { if (response.error) {
console.error("Failed to approve new session:", response.error); console.error("Failed to approve new session:", response.error);
reject(new Error(response.error.message || "Failed to approve")); reject(new Error(response.error.message || "Failed to approve"));
@ -99,7 +102,7 @@ export function useSessionManagement(sendFn: Function | null) {
if (!sendFn) return; if (!sendFn) return;
return new Promise<void>((resolve, reject) => { return new Promise<void>((resolve, reject) => {
sendFn("denyNewSession", { sessionId }, (response: any) => { sendFn("denyNewSession", { sessionId }, (response: { result?: unknown; error?: { message: string } }) => {
if (response.error) { if (response.error) {
console.error("Failed to deny new session:", response.error); console.error("Failed to deny new session:", response.error);
reject(new Error(response.error.message || "Failed to deny")); reject(new Error(response.error.message || "Failed to deny"));
@ -112,7 +115,7 @@ export function useSessionManagement(sendFn: Function | null) {
}, [sendFn]); }, [sendFn]);
// Handle RPC events // 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 // Pass session events to the session event handler
if (method === "sessionsUpdated" || if (method === "sessionsUpdated" ||
method === "modeChanged" || 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) // Handle new session approval request (only if approval is required and user has permission)
if (method === "newSessionPending" && requireSessionApproval && hasPermission(Permission.SESSION_APPROVE)) { if (method === "newSessionPending" && requireSessionApproval && hasPermission(Permission.SESSION_APPROVE)) {
setNewSessionRequest(params); setNewSessionRequest(params as NewSessionRequest);
} }
// Handle primary control request // Handle primary control request
if (method === "primaryControlRequested") { if (method === "primaryControlRequested") {
setPrimaryControlRequest(params); setPrimaryControlRequest(params as PrimaryControlRequest);
} }
// Handle approval/denial responses // Handle approval/denial responses
@ -147,13 +150,14 @@ export function useSessionManagement(sendFn: Function | null) {
// Handle session access denial (when your new session is denied) // Handle session access denial (when your new session is denied)
if (method === "sessionAccessDenied") { if (method === "sessionAccessDenied") {
const { clearSession, setSessionError } = useSessionStore.getState(); 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 // Clear session data as we're being disconnected
setTimeout(() => { setTimeout(() => {
clearSession(); clearSession();
}, 3000); // Give user time to see the error }, 3000); // Give user time to see the error
} }
}, [handleSessionEvent]); }, [handleSessionEvent, hasPermission, requireSessionApproval]);
// Cleanup on unmount // Cleanup on unmount
useEffect(() => { useEffect(() => {

View File

@ -1,4 +1,8 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import {
UserGroupIcon,
} from "@heroicons/react/16/solid";
import { useJsonRpc, JsonRpcResponse } from "@/hooks/useJsonRpc"; import { useJsonRpc, JsonRpcResponse } from "@/hooks/useJsonRpc";
import { usePermissions, Permission } from "@/hooks/usePermissions"; import { usePermissions, Permission } from "@/hooks/usePermissions";
import { useSettingsStore } from "@/hooks/stores"; import { useSettingsStore } from "@/hooks/stores";
@ -7,9 +11,6 @@ import Card from "@/components/Card";
import Checkbox from "@/components/Checkbox"; import Checkbox from "@/components/Checkbox";
import { SettingsPageHeader } from "@/components/SettingsPageheader"; import { SettingsPageHeader } from "@/components/SettingsPageheader";
import { SettingsItem } from "@/components/SettingsItem"; import { SettingsItem } from "@/components/SettingsItem";
import {
UserGroupIcon,
} from "@heroicons/react/16/solid";
export default function SessionsSettings() { export default function SessionsSettings() {
const { send } = useJsonRpc(); const { send } = useJsonRpc();

View File

@ -1,5 +1,5 @@
import React, { useEffect, useRef, useState } from "react"; import React, { useEffect, useRef, useState } from "react";
import { NavLink, Outlet, useLocation } from "react-router"; import { NavLink, Outlet, useLocation , useNavigate } from "react-router";
import { import {
LuSettings, LuSettings,
LuMouse, LuMouse,
@ -15,7 +15,6 @@ import {
LuUsers, LuUsers,
} from "react-icons/lu"; } from "react-icons/lu";
import { useResizeObserver } from "usehooks-ts"; import { useResizeObserver } from "usehooks-ts";
import { useNavigate } from "react-router";
import { cx } from "@/cva.config"; import { cx } from "@/cva.config";
import Card from "@components/Card"; import Card from "@components/Card";

View File

@ -230,7 +230,6 @@ export default function KvmIdRoute() {
); );
cleanupAndStopReconnecting(); cleanupAndStopReconnecting();
clearInterval(checkInterval); clearInterval(checkInterval);
} else {
} }
}, 1000); }, 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 // We don't want to close everything down, we wait for the reconnect to stop instead
}, },
onOpen() { onOpen() {
// Connection established, message handling will begin
}, },
onMessage: message => { onMessage: message => {
@ -572,7 +572,7 @@ export default function KvmIdRoute() {
setRequireSessionNickname(response.result.requireNickname); setRequireSessionNickname(response.result.requireNickname);
} }
} }
} catch (error) { } catch {
// Ignore parse errors // Ignore parse errors
} }
}; };
@ -627,6 +627,9 @@ export default function KvmIdRoute() {
setRpcHidUnreliableNonOrderedChannel, setRpcHidUnreliableNonOrderedChannel,
setRpcHidUnreliableChannel, setRpcHidUnreliableChannel,
setTransceiver, setTransceiver,
hasPermission,
setRequireSessionApproval,
setRequireSessionNickname,
]); ]);
useEffect(() => { useEffect(() => {

View File

@ -1,7 +1,9 @@
// Nickname generation using backend API for consistency // Nickname generation using backend API for consistency
type RpcSendFunction = (method: string, params: Record<string, unknown>, callback: (response: { result?: unknown; error?: { message: string } }) => void) => void;
// Main function that uses backend generation // Main function that uses backend generation
export async function generateNickname(sendFn?: Function): Promise<string> { export async function generateNickname(sendFn?: RpcSendFunction): Promise<string> {
// Require backend function - no fallback // Require backend function - no fallback
if (!sendFn) { if (!sendFn) {
throw new Error('Backend connection required for nickname generation'); throw new Error('Backend connection required for nickname generation');
@ -9,9 +11,10 @@ export async function generateNickname(sendFn?: Function): Promise<string> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
const result = sendFn('generateNickname', { userAgent: navigator.userAgent }, (response: any) => { const result = sendFn('generateNickname', { userAgent: navigator.userAgent }, (response: { result?: unknown; error?: { message: string } }) => {
if (response && !response.error && response.result?.nickname) { const result = response.result as { nickname?: string } | undefined;
resolve(response.result.nickname); if (response && !response.error && result?.nickname) {
resolve(result.nickname);
} else { } else {
reject(new Error('Failed to generate nickname from backend')); reject(new Error('Failed to generate nickname from backend'));
} }

26
web.go
View File

@ -34,22 +34,22 @@ import (
var staticFiles embed.FS var staticFiles embed.FS
type WebRTCSessionRequest struct { type WebRTCSessionRequest struct {
Sd string `json:"sd"` Sd string `json:"sd"`
SessionId string `json:"sessionId,omitempty"` SessionId string `json:"sessionId,omitempty"`
OidcGoogle string `json:"OidcGoogle,omitempty"` OidcGoogle string `json:"OidcGoogle,omitempty"`
IP string `json:"ip,omitempty"` IP string `json:"ip,omitempty"`
ICEServers []string `json:"iceServers,omitempty"` ICEServers []string `json:"iceServers,omitempty"`
UserAgent string `json:"userAgent,omitempty"` // Browser user agent for nickname generation UserAgent string `json:"userAgent,omitempty"` // Browser user agent for nickname generation
SessionSettings *SessionSettings `json:"sessionSettings,omitempty"` SessionSettings *SessionSettings `json:"sessionSettings,omitempty"`
} }
type SessionSettings struct { type SessionSettings struct {
RequireApproval bool `json:"requireApproval"` RequireApproval bool `json:"requireApproval"`
RequireNickname bool `json:"requireNickname"` RequireNickname bool `json:"requireNickname"`
ReconnectGrace int `json:"reconnectGrace,omitempty"` // Grace period in seconds for primary reconnection ReconnectGrace int `json:"reconnectGrace,omitempty"` // Grace period in seconds for primary reconnection
PrimaryTimeout int `json:"primaryTimeout,omitempty"` // Inactivity timeout in seconds for primary session PrimaryTimeout int `json:"primaryTimeout,omitempty"` // Inactivity timeout in seconds for primary session
Nickname string `json:"nickname,omitempty"` Nickname string `json:"nickname,omitempty"`
PrivateKeystrokes bool `json:"privateKeystrokes,omitempty"` // If true, only primary session sees keystroke events PrivateKeystrokes bool `json:"privateKeystrokes,omitempty"` // If true, only primary session sees keystroke events
} }
type SetPasswordRequest struct { type SetPasswordRequest struct {
@ -483,7 +483,7 @@ func handleLogout(c *gin.Context) {
// Only clear the cookies for this session, don't invalidate the token // Only clear the cookies for this session, don't invalidate the token
// The token should remain valid for other sessions // The token should remain valid for other sessions
c.SetCookie("authToken", "", -1, "/", "", false, true) 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"}) c.JSON(http.StatusOK, gin.H{"message": "Logout successful"})
} }

View File

@ -21,24 +21,24 @@ import (
// Predefined browser string constants for memory efficiency // Predefined browser string constants for memory efficiency
var ( var (
BrowserChrome = "chrome" BrowserChrome = "chrome"
BrowserFirefox = "firefox" BrowserFirefox = "firefox"
BrowserSafari = "safari" BrowserSafari = "safari"
BrowserEdge = "edge" BrowserEdge = "edge"
BrowserOpera = "opera" BrowserOpera = "opera"
BrowserUnknown = "user" BrowserUnknown = "user"
) )
type Session struct { type Session struct {
ID string ID string
Mode SessionMode Mode SessionMode
Source string Source string
Identity string Identity string
Nickname string Nickname string
Browser *string // Pointer to predefined browser string constant for memory efficiency Browser *string // Pointer to predefined browser string constant for memory efficiency
CreatedAt time.Time CreatedAt time.Time
LastActive time.Time LastActive time.Time
LastBroadcast time.Time // Per-session broadcast throttle LastBroadcast time.Time // Per-session broadcast throttle
// RPC rate limiting (DoS protection) // RPC rate limiting (DoS protection)
rpcRateLimitMu sync.Mutex // Protects rate limit fields rpcRateLimitMu sync.Mutex // Protects rate limit fields
@ -105,7 +105,7 @@ type SessionConfig struct {
ICEServers []string ICEServers []string
LocalIP string LocalIP string
IsCloud bool 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 ws *websocket.Conn
Logger *zerolog.Logger Logger *zerolog.Logger
} }
@ -278,7 +278,7 @@ func newSession(config SessionConfig) (*Session, error) {
session := &Session{ session := &Session{
peerConnection: peerConnection, peerConnection: peerConnection,
Browser: extractBrowserFromUserAgent(config.UserAgent), Browser: extractBrowserFromUserAgent(config.UserAgent),
} }
session.rpcQueue = make(chan webrtc.DataChannelMessage, 256) session.rpcQueue = make(chan webrtc.DataChannelMessage, 256)
session.initQueues() session.initQueues()