diff --git a/src/app/components/VoiceRoomItem.svelte b/src/app/components/VoiceRoomItem.svelte
index 30c7fe9f..5de7178a 100644
--- a/src/app/components/VoiceRoomItem.svelte
+++ b/src/app/components/VoiceRoomItem.svelte
@@ -1,15 +1,18 @@
+
+
+
+
+ Join voice room?
+
+
+
+ {displayRoom(url, h)}
+ ·
+ {spaceLabel}
+
+
+
+ Select a microphone to join the call:
+
+
+
+
+
+
+ {#snippet label()}
+ Microphone
+ {/snippet}
+ {#snippet input()}
+
+ {/snippet}
+
+
+
+
+
+
+
+
diff --git a/src/app/components/VoiceWidget.svelte b/src/app/components/VoiceWidget.svelte
index 239ba8f4..603d2efc 100644
--- a/src/app/components/VoiceWidget.svelte
+++ b/src/app/components/VoiceWidget.svelte
@@ -1,22 +1,8 @@
-
-
-{#if $currentVoiceRoom}
+{#if targetRoom}
- {#if $voiceState === "joining"}
+ {#if $voiceState === VoiceState.Joining}
Joining...
- {:else if $voiceState === "connected"}
+ {:else if $voiceState === VoiceState.Connected}
Voice Connected
{:else}
Disconnected
@@ -64,7 +83,7 @@
- {#if $voiceState === "joining"}
+ {#if $voiceState === VoiceState.Joining}
- {:else if $voiceState === "connected" && $currentVoiceSession}
+ {:else if $voiceState === VoiceState.Connected && $currentVoiceSession}
{/if}
diff --git a/src/app/core/state.ts b/src/app/core/state.ts
index 7b133f24..f6f2cdf5 100644
--- a/src/app/core/state.ts
+++ b/src/app/core/state.ts
@@ -669,7 +669,7 @@ export const deriveRoom = call(() => {
return (url: string, h: string) =>
derived(
_deriveRoom(makeRoomId(url, h)),
- room => room || {url, id: makeRoomId(url, h), ...makeRoomMeta({h})},
+ room => (room || {url, id: makeRoomId(url, h), ...makeRoomMeta({h})}) as Room,
)
})
diff --git a/src/app/voice.ts b/src/app/voice.ts
index 8856c2d2..a4453ed4 100644
--- a/src/app/voice.ts
+++ b/src/app/voice.ts
@@ -2,7 +2,14 @@
* Voice rooms via LiveKit. Note: Voice does not work on localhost in Firefox
* (ICE candidate gathering fails). Use Chrome or test from deployed HTTPS.
*/
-import {DisconnectReason, Room, RoomEvent, Track} from "livekit-client"
+import {
+ DisconnectReason,
+ Room as LiveKitRoom,
+ RoomEvent,
+ Track,
+ type AudioCaptureOptions,
+ type LocalParticipant,
+} from "livekit-client"
import {derived, get, writable} from "svelte/store"
import {map, removeUndefined, uniqBy} from "@welshman/lib"
import type {TrustedEvent} from "@welshman/util"
@@ -10,24 +17,17 @@ import {makeHttpAuth, makeHttpAuthHeader, getTags} from "@welshman/util"
import {signer} from "@welshman/app"
import {getLivekitEndpoint} from "$lib/livekit"
import {AbortError, whenAborted, whenTimeout} from "$lib/util"
-import {deriveLatestEventForUrl} from "@app/core/state"
+import {deriveLatestEventForUrl, deriveRoom, makeRoomId, type Room} from "@app/core/state"
import {pushToast} from "@app/util/toast"
export const LIVEKIT_PARTICIPANTS = 39004
export {checkRelayHasLivekit} from "$lib/livekit"
-export class VoiceJoinMembershipError extends Error {
- constructor() {
- super("Failed to join voice room: you must be a member.")
- this.name = "VoiceJoinMembershipError"
- }
-}
-
export type VoiceSession = {
url: string
h: string
- room: Room
+ room: LiveKitRoom
muted: boolean
}
@@ -35,13 +35,17 @@ export type Pubkey = string
export type VoiceParticipant = {pubkey?: Pubkey; identity: string}
-export type VoiceState = "joining" | "connected" | "disconnected"
+export enum VoiceState {
+ Joining = "joining",
+ Connected = "connected",
+ Disconnected = "disconnected",
+}
export const currentVoiceSession = writable(undefined)
-export const voiceState = writable("disconnected")
+export const voiceState = writable(VoiceState.Disconnected)
-export const currentVoiceRoom = writable<{url: string; h: string} | undefined>(undefined)
+export const currentVoiceRoom = writable(undefined)
export const participantPubkeyMap = writable
- {#if isVoiceRoom || $voiceState === "joining" || $voiceState === "connected"}
+ {#if isVoiceRoom || $voiceState === VoiceState.Joining || $voiceState === VoiceState.Connected}