Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4befd73f99 | ||
|
|
89f65c6162 | ||
|
|
dc12fb8184 | ||
|
|
365a3c6151 | ||
|
|
8c58cb8687 | ||
|
|
8628047a07 | ||
|
|
78c1f07a35 | ||
|
|
b950bb4816 | ||
|
|
0104c151ce | ||
|
|
15aafeda58 |
@@ -0,0 +1,94 @@
|
|||||||
|
name: Tauri Release Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: "Release tag to upload to (e.g. 0.1.0)"
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build (${{ matrix.os }})
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [windows-latest, ubuntu-latest, macos-latest]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
|
||||||
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
|
|
||||||
|
- name: Install dependencies (Linux only)
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y \
|
||||||
|
libwebkit2gtk-4.1-dev \
|
||||||
|
build-essential \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
file \
|
||||||
|
libssl-dev \
|
||||||
|
libgtk-3-dev \
|
||||||
|
libayatana-appindicator3-dev \
|
||||||
|
librsvg2-dev \
|
||||||
|
libpipewire-0.3-dev \
|
||||||
|
libasound2-dev
|
||||||
|
|
||||||
|
- run: npm install
|
||||||
|
- run: npm run tauri build
|
||||||
|
|
||||||
|
# --- macOS fix ---
|
||||||
|
- name: Prepare macOS app
|
||||||
|
if: matrix.os == 'macos-latest'
|
||||||
|
run: |
|
||||||
|
APP_PATH=$(find src-tauri/target/release/bundle/macos -name "*.app")
|
||||||
|
APP_NAME=$(basename "$APP_PATH" .app)
|
||||||
|
|
||||||
|
xattr -cr "$APP_PATH"
|
||||||
|
codesign --deep --force --sign - "$APP_PATH"
|
||||||
|
|
||||||
|
ditto -c -k --keepParent "$APP_PATH" "$APP_NAME-macos.zip"
|
||||||
|
|
||||||
|
# --- Get release Tag ---
|
||||||
|
- name: Get release tag
|
||||||
|
id: get_tag
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
TAG="${{ inputs.tag }}"
|
||||||
|
if [ "${{ github.event_name }}" = "release" ]; then
|
||||||
|
TAG="${{ github.event.release.tag_name }}"
|
||||||
|
elif [ -z "$TAG" ]; then
|
||||||
|
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# --- Upload to release ---
|
||||||
|
- name: Upload to GitHub Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: ${{ steps.get_tag.outputs.tag }}
|
||||||
|
files: |
|
||||||
|
src-tauri/target/release/bundle/**/*.AppImage
|
||||||
|
src-tauri/target/release/bundle/**/*.msi
|
||||||
|
src-tauri/target/release/bundle/**/*.exe
|
||||||
|
src-tauri/target/release/bundle/**/*.deb
|
||||||
|
src-tauri/target/release/bundle/**/*.rpm
|
||||||
|
*.zip
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "enclave",
|
"name": "enclave",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.1.0",
|
"version": "0.1.0-beta.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
@@ -44,4 +44,4 @@
|
|||||||
"typescript": "~5.8.3",
|
"typescript": "~5.8.3",
|
||||||
"vite": "^7.0.4"
|
"vite": "^7.0.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1168,7 +1168,7 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "enclave"
|
name = "enclave"
|
||||||
version = "0.1.0"
|
version = "0.1.0-beta.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chacha20poly1305",
|
"chacha20poly1305",
|
||||||
"cpal",
|
"cpal",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "enclave"
|
name = "enclave"
|
||||||
version = "0.1.0"
|
version = "0.1.0-beta.0"
|
||||||
description = "A Tauri App"
|
description = "A Tauri App"
|
||||||
authors = ["you"]
|
authors = ["you"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 974 B After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 903 B After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 3.9 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
</adaptive-icon>
|
||||||
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 21 KiB |
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="ic_launcher_background">#fff</color>
|
||||||
|
</resources>
|
||||||
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 19 KiB |
@@ -650,21 +650,28 @@ pub fn connect_to_vc(
|
|||||||
let mut next_frame_time = Instant::now();
|
let mut next_frame_time = Instant::now();
|
||||||
|
|
||||||
while !shutdown.load(Ordering::Relaxed) {
|
while !shutdown.load(Ordering::Relaxed) {
|
||||||
let (is_muted, is_deaf) = {
|
let is_deaf = {
|
||||||
let cfg = backend_config.lock().unwrap();
|
let cfg = backend_config.lock().unwrap();
|
||||||
(cfg.is_muted, cfg.is_deaf)
|
cfg.is_deaf
|
||||||
};
|
};
|
||||||
|
|
||||||
if is_muted || is_deaf {
|
if is_deaf {
|
||||||
|
// Keep draining the UDP socket while deafened/muted so stale
|
||||||
|
// packets don't accumulate in the OS buffer and get replayed
|
||||||
|
// when we undeafen/unmute. Decrypting and discarding here
|
||||||
|
// fully consumes the socket backlog.
|
||||||
|
if let Ok(len) = socket.recv(&mut udp_buffer) {
|
||||||
|
let _ = cipher.lock().unwrap().decrypt(&udp_buffer[..len]);
|
||||||
|
}
|
||||||
// Drop any audio already buffered for playback so that on
|
// Drop any audio already buffered for playback so that on
|
||||||
// unmute/undeafen we don't replay stale audio from the past.
|
// unmute/undeafen we don't replay audio from the past.
|
||||||
if let Ok(mut cons) = consumer_out.lock() {
|
if let Ok(mut cons) = consumer_out.lock() {
|
||||||
cons.clear();
|
cons.clear();
|
||||||
}
|
}
|
||||||
packets.clear();
|
packets.clear();
|
||||||
is_prebuffering = true;
|
is_prebuffering = true;
|
||||||
|
|
||||||
std::thread::sleep(Duration::from_secs(1));
|
thread::sleep(Duration::from_millis(1));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "enclave",
|
"productName": "enclave",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0-0",
|
||||||
"identifier": "org.enclave.enclave",
|
"identifier": "org.enclave.enclave",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "npm run dev",
|
"beforeDevCommand": "npm run dev",
|
||||||
@@ -32,4 +32,4 @@
|
|||||||
"icons/icon.ico"
|
"icons/icon.ico"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,7 +64,7 @@ export function RenderFeatures({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
users && (
|
users && (
|
||||||
<div className="flex flex-col gap-1.5 px-4 pt-0.5">
|
<div className="flex flex-col gap-2 px-4 pt-2">
|
||||||
{(isCurrentVc ? users : users.slice(0, 15)).map((pubkey) => {
|
{(isCurrentVc ? users : users.slice(0, 15)).map((pubkey) => {
|
||||||
const user = appRef.current?.server?.users[pubkey];
|
const user = appRef.current?.server?.users[pubkey];
|
||||||
if (!user) return null;
|
if (!user) return null;
|
||||||
|
|||||||