From 22694712f4a07d91b252b930b4ddd4575842d04b Mon Sep 17 00:00:00 2001 From: GandC Date: Wed, 23 Sep 2026 22:03:58 +0300 Subject: [PATCH] LiveKit Electron offer-with-join workaround v2 --- .gitea/workflows/desktop.yml | 57 +++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/.gitea/workflows/desktop.yml b/.gitea/workflows/desktop.yml index f794ccb..c330b09 100644 --- a/.gitea/workflows/desktop.yml +++ b/.gitea/workflows/desktop.yml @@ -159,15 +159,29 @@ jobs: $Package = Get-Content $PackagePath -Raw | ConvertFrom-Json $Package.homepage = "https://ds.gandc.ru" - $Package | - ConvertTo-Json -Depth 100 | - Set-Content ` - -Path $PackagePath ` - -Encoding utf8 + $PackageJson = $Package | ConvertTo-Json -Depth 100 + + [System.IO.File]::WriteAllText( + $PackagePath, + $PackageJson + [Environment]::NewLine, + (New-Object System.Text.UTF8Encoding($false)) + ) Write-Host "Desktop homepage configured:" (Get-Content $PackagePath -Raw | ConvertFrom-Json).homepage + $PackageBytes = [System.IO.File]::ReadAllBytes($PackagePath) + if ( + $PackageBytes.Length -ge 3 -and + $PackageBytes[0] -eq 0xEF -and + $PackageBytes[1] -eq 0xBB -and + $PackageBytes[2] -eq 0xBF + ) { + throw "package.json unexpectedly contains UTF-8 BOM" + } + + Write-Host "package.json UTF-8 BOM check: OK" + $WindowPath = "fluxer-src\fluxer_desktop\src\main\Window.ts" if (-not (Test-Path $WindowPath)) { @@ -226,7 +240,7 @@ jobs: -Pattern "sso.gandc.ru|will-redirect|allowTrustedOrSsoNavigation" - - name: Work around LiveKit Electron offer-with-join + - name: Apply Electron LiveKit compatibility workarounds shell: powershell run: | $ErrorActionPreference = "Stop" @@ -244,13 +258,13 @@ jobs: throw "Unable to locate Electron preload import" } - if ($Content -match "installLiveKitElectronOfferWithJoinWorkaround") { - throw "LiveKit Electron workaround is already present" + if ($Content -match "installForceAllIceTransportPolicy") { + throw "WebRTC ICE policy patch is already present" } $Patch = [Text.Encoding]::UTF8.GetString( [Convert]::FromBase64String( - "aW1wb3J0IHtjb250ZXh0QnJpZGdlLCBpcGNSZW5kZXJlciwgd2ViRnJhbWV9IGZyb20gJ2VsZWN0cm9uJzsKCmZ1bmN0aW9uIGluc3RhbGxMaXZlS2l0RWxlY3Ryb25PZmZlcldpdGhKb2luV29ya2Fyb3VuZCgpOiB2b2lkIHsKCWNvbnRleHRCcmlkZ2UuZXhlY3V0ZUluTWFpbldvcmxkKHsKCQlmdW5jOiAoKSA9PiB7CgkJCWNvbnN0IG9yaWdpbmFsVXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKCgkJCWlmIChvcmlnaW5hbFVzZXJBZ2VudC5pbmNsdWRlcygnRmlyZWZveC8nKSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb25zdCBsaXZlS2l0Q29tcGF0VXNlckFnZW50ID0gYCR7b3JpZ2luYWxVc2VyQWdlbnR9IEZpcmVmb3gvMTUwLjBgOwoKCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ3VzZXJBZ2VudCcsIHsKCQkJCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKCQkJCWdldDogKCkgPT4gbGl2ZUtpdENvbXBhdFVzZXJBZ2VudCwKCQkJfSk7CgoJCQljb25zb2xlLmluZm8oCgkJCQknW0ZsdXhlciBEZXNrdG9wXSBMaXZlS2l0IEVsZWN0cm9uIG9mZmVyLXdpdGgtam9pbiB3b3JrYXJvdW5kIGVuYWJsZWQnLAoJCQkpOwoJCX0sCgl9KTsKfQoKaW5zdGFsbExpdmVLaXRFbGVjdHJvbk9mZmVyV2l0aEpvaW5Xb3JrYXJvdW5kKCk7Cg==" + "aW1wb3J0IHtjb250ZXh0QnJpZGdlLCBpcGNSZW5kZXJlciwgd2ViRnJhbWV9IGZyb20gJ2VsZWN0cm9uJzsKCmZ1bmN0aW9uIGluc3RhbGxGb3JjZUFsbEljZVRyYW5zcG9ydFBvbGljeSgpOiB2b2lkIHsKCWNvbnRleHRCcmlkZ2UuZXhlY3V0ZUluTWFpbldvcmxkKHsKCQlmdW5jOiAoKSA9PiB7CgkJCWNvbnN0IE5hdGl2ZVJUQ1BlZXJDb25uZWN0aW9uID0gd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uOwoKCQkJaWYgKHR5cGVvZiBOYXRpdmVSVENQZWVyQ29ubmVjdGlvbiAhPT0gJ2Z1bmN0aW9uJykgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQl3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gPSBuZXcgUHJveHkoTmF0aXZlUlRDUGVlckNvbm5lY3Rpb24sIHsKCQkJCWNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCkgewoJCQkJCWNvbnN0IGNvbmZpZyA9IGFyZ3NbMF0gYXMgUlRDQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDsKCgkJCQkJaWYgKGNvbmZpZz8uaWNlVHJhbnNwb3J0UG9saWN5ID09PSAncmVsYXknKSB7CgkJCQkJCWFyZ3NbMF0gPSB7CgkJCQkJCQkuLi5jb25maWcsCgkJCQkJCQlpY2VUcmFuc3BvcnRQb2xpY3k6ICdhbGwnLAoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIFJlZmxlY3QuY29uc3RydWN0KFRhcmdldCwgYXJncywgbmV3VGFyZ2V0KTsKCQkJCX0sCgkJCX0pOwoKCQkJY29uc29sZS5pbmZvKCdbRmx1eGVyIERlc2t0b3BdIFdlYlJUQyBpY2VUcmFuc3BvcnRQb2xpY3kgZm9yY2VkIHRvIGFsbCcpOwoJCX0sCgl9KTsKfQoKZnVuY3Rpb24gaW5zdGFsbExpdmVLaXRFbGVjdHJvbk9mZmVyV2l0aEpvaW5Xb3JrYXJvdW5kKCk6IHZvaWQgewoJY29udGV4dEJyaWRnZS5leGVjdXRlSW5NYWluV29ybGQoewoJCWZ1bmM6ICgpID0+IHsKCQkJY29uc3Qgb3JpZ2luYWxVc2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50OwoKCQkJaWYgKG9yaWdpbmFsVXNlckFnZW50LmluY2x1ZGVzKCdGaXJlZm94LycpKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYXZpZ2F0b3IsICd1c2VyQWdlbnQnLCB7CgkJCQljb25maWd1cmFibGU6IHRydWUsCgkJCQlnZXQ6ICgpID0+IGAke29yaWdpbmFsVXNlckFnZW50fSBGaXJlZm94LzE1MC4wYCwKCQkJfSk7CgoJCQljb25zb2xlLmluZm8oCgkJCQknW0ZsdXhlciBEZXNrdG9wXSBMaXZlS2l0IEVsZWN0cm9uIG9mZmVyLXdpdGgtam9pbiB3b3JrYXJvdW5kIGVuYWJsZWQnLAoJCQkpOwoJCX0sCgl9KTsKfQoKaW5zdGFsbEZvcmNlQWxsSWNlVHJhbnNwb3J0UG9saWN5KCk7Cmluc3RhbGxMaXZlS2l0RWxlY3Ryb25PZmZlcldpdGhKb2luV29ya2Fyb3VuZCgpOwo=" ) ) @@ -267,15 +281,19 @@ jobs: $Result = Get-Content $Path -Raw + if ($Result -notmatch "installForceAllIceTransportPolicy") { + throw "WebRTC ICE policy patch verification failed" + } + if ($Result -notmatch "installLiveKitElectronOfferWithJoinWorkaround") { throw "LiveKit Electron workaround verification failed" } - Write-Host "Installed LiveKit Electron offer-with-join workaround" + Write-Host "Installed preload WebRTC ICE policy override" Select-String ` -Path $Path ` - -Pattern "installLiveKitElectronOfferWithJoinWorkaround|offer-with-join workaround enabled" + -Pattern "installForceAllIceTransportPolicy|installLiveKitElectronOfferWithJoinWorkaround|iceTransportPolicy forced to all|offer-with-join workaround enabled" - name: Install dependencies shell: powershell @@ -795,7 +813,7 @@ jobs: fluxer-src/fluxer_desktop/src/main/Window.ts - - name: Work around LiveKit Electron offer-with-join + - name: Apply Electron LiveKit compatibility workarounds shell: bash run: | set -euxo pipefail @@ -825,13 +843,13 @@ jobs: "Unable to locate Electron preload import" ) - if "installLiveKitElectronOfferWithJoinWorkaround" in data: + if "installForceAllIceTransportPolicy" in data: raise SystemExit( - "LiveKit Electron workaround is already present" + "WebRTC ICE policy patch is already present" ) patch = base64.b64decode( - "aW1wb3J0IHtjb250ZXh0QnJpZGdlLCBpcGNSZW5kZXJlciwgd2ViRnJhbWV9IGZyb20gJ2VsZWN0cm9uJzsKCmZ1bmN0aW9uIGluc3RhbGxMaXZlS2l0RWxlY3Ryb25PZmZlcldpdGhKb2luV29ya2Fyb3VuZCgpOiB2b2lkIHsKCWNvbnRleHRCcmlkZ2UuZXhlY3V0ZUluTWFpbldvcmxkKHsKCQlmdW5jOiAoKSA9PiB7CgkJCWNvbnN0IG9yaWdpbmFsVXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKCgkJCWlmIChvcmlnaW5hbFVzZXJBZ2VudC5pbmNsdWRlcygnRmlyZWZveC8nKSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb25zdCBsaXZlS2l0Q29tcGF0VXNlckFnZW50ID0gYCR7b3JpZ2luYWxVc2VyQWdlbnR9IEZpcmVmb3gvMTUwLjBgOwoKCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ3VzZXJBZ2VudCcsIHsKCQkJCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKCQkJCWdldDogKCkgPT4gbGl2ZUtpdENvbXBhdFVzZXJBZ2VudCwKCQkJfSk7CgoJCQljb25zb2xlLmluZm8oCgkJCQknW0ZsdXhlciBEZXNrdG9wXSBMaXZlS2l0IEVsZWN0cm9uIG9mZmVyLXdpdGgtam9pbiB3b3JrYXJvdW5kIGVuYWJsZWQnLAoJCQkpOwoJCX0sCgl9KTsKfQoKaW5zdGFsbExpdmVLaXRFbGVjdHJvbk9mZmVyV2l0aEpvaW5Xb3JrYXJvdW5kKCk7Cg==" + "aW1wb3J0IHtjb250ZXh0QnJpZGdlLCBpcGNSZW5kZXJlciwgd2ViRnJhbWV9IGZyb20gJ2VsZWN0cm9uJzsKCmZ1bmN0aW9uIGluc3RhbGxGb3JjZUFsbEljZVRyYW5zcG9ydFBvbGljeSgpOiB2b2lkIHsKCWNvbnRleHRCcmlkZ2UuZXhlY3V0ZUluTWFpbldvcmxkKHsKCQlmdW5jOiAoKSA9PiB7CgkJCWNvbnN0IE5hdGl2ZVJUQ1BlZXJDb25uZWN0aW9uID0gd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uOwoKCQkJaWYgKHR5cGVvZiBOYXRpdmVSVENQZWVyQ29ubmVjdGlvbiAhPT0gJ2Z1bmN0aW9uJykgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQl3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gPSBuZXcgUHJveHkoTmF0aXZlUlRDUGVlckNvbm5lY3Rpb24sIHsKCQkJCWNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCkgewoJCQkJCWNvbnN0IGNvbmZpZyA9IGFyZ3NbMF0gYXMgUlRDQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDsKCgkJCQkJaWYgKGNvbmZpZz8uaWNlVHJhbnNwb3J0UG9saWN5ID09PSAncmVsYXknKSB7CgkJCQkJCWFyZ3NbMF0gPSB7CgkJCQkJCQkuLi5jb25maWcsCgkJCQkJCQlpY2VUcmFuc3BvcnRQb2xpY3k6ICdhbGwnLAoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIFJlZmxlY3QuY29uc3RydWN0KFRhcmdldCwgYXJncywgbmV3VGFyZ2V0KTsKCQkJCX0sCgkJCX0pOwoKCQkJY29uc29sZS5pbmZvKCdbRmx1eGVyIERlc2t0b3BdIFdlYlJUQyBpY2VUcmFuc3BvcnRQb2xpY3kgZm9yY2VkIHRvIGFsbCcpOwoJCX0sCgl9KTsKfQoKZnVuY3Rpb24gaW5zdGFsbExpdmVLaXRFbGVjdHJvbk9mZmVyV2l0aEpvaW5Xb3JrYXJvdW5kKCk6IHZvaWQgewoJY29udGV4dEJyaWRnZS5leGVjdXRlSW5NYWluV29ybGQoewoJCWZ1bmM6ICgpID0+IHsKCQkJY29uc3Qgb3JpZ2luYWxVc2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50OwoKCQkJaWYgKG9yaWdpbmFsVXNlckFnZW50LmluY2x1ZGVzKCdGaXJlZm94LycpKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYXZpZ2F0b3IsICd1c2VyQWdlbnQnLCB7CgkJCQljb25maWd1cmFibGU6IHRydWUsCgkJCQlnZXQ6ICgpID0+IGAke29yaWdpbmFsVXNlckFnZW50fSBGaXJlZm94LzE1MC4wYCwKCQkJfSk7CgoJCQljb25zb2xlLmluZm8oCgkJCQknW0ZsdXhlciBEZXNrdG9wXSBMaXZlS2l0IEVsZWN0cm9uIG9mZmVyLXdpdGgtam9pbiB3b3JrYXJvdW5kIGVuYWJsZWQnLAoJCQkpOwoJCX0sCgl9KTsKfQoKaW5zdGFsbEZvcmNlQWxsSWNlVHJhbnNwb3J0UG9saWN5KCk7Cmluc3RhbGxMaXZlS2l0RWxlY3Ryb25PZmZlcldpdGhKb2luV29ya2Fyb3VuZCgpOwo=" ).decode("utf-8") data = data.replace( @@ -849,18 +867,23 @@ jobs: encoding="utf-8" ) + if "installForceAllIceTransportPolicy" not in result: + raise SystemExit( + "WebRTC ICE policy patch verification failed" + ) + if "installLiveKitElectronOfferWithJoinWorkaround" not in result: raise SystemExit( "LiveKit Electron workaround verification failed" ) print( - "Installed LiveKit Electron offer-with-join workaround" + "Installed preload WebRTC ICE policy override" ) PY grep -n \ - -E 'installLiveKitElectronOfferWithJoinWorkaround|offer-with-join workaround enabled' \ + -E 'installForceAllIceTransportPolicy|installLiveKitElectronOfferWithJoinWorkaround|iceTransportPolicy forced to all|offer-with-join workaround enabled' \ fluxer-src/fluxer_desktop/src/preload/index.ts - name: Install dependencies