diff --git a/.changeset/rotten-bikes-burn.md b/.changeset/rotten-bikes-burn.md new file mode 100644 index 000000000..046709a1d --- /dev/null +++ b/.changeset/rotten-bikes-burn.md @@ -0,0 +1,6 @@ +--- +"@livekit/components-core": patch +"@livekit/components-react": patch +--- + +Add support for new chat API diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..e5e7fdfa4 --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +dedupe-peer-dependents=true +resolve-peers-from-workspace-root=true +manage-package-manager-versions=true +package-manager-strict-version=true \ No newline at end of file diff --git a/docs/storybook/package.json b/docs/storybook/package.json index 1e7c25541..aaed01381 100644 --- a/docs/storybook/package.json +++ b/docs/storybook/package.json @@ -13,7 +13,7 @@ "dependencies": { "@livekit/components-react": "workspace:*", "@livekit/components-styles": "workspace:*", - "livekit-client": "^2.4.0", + "livekit-client": "^2.5.4", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index b67ce04c1..1c7631842 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -12,7 +12,7 @@ "@livekit/components-react": "workspace:*", "@livekit/components-styles": "workspace:*", "@livekit/track-processors": "^0.3.2", - "livekit-client": "^2.4.0", + "livekit-client": "^2.5.4", "livekit-server-sdk": "^2.6.1", "next": "^12.3.4", "react": "^18.2.0", diff --git a/package.json b/package.json index e935fe1cd..73a6d0b06 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,11 @@ "turbo": "^2.1.1", "typescript": "5.4.2" }, + "dependencies": { + "livekit-client": "^2.5.4" + }, "engines": { "node": ">=18" }, - "packageManager": "pnpm@9.2.0" + "packageManager": "pnpm@9.10.0" } diff --git a/packages/core/etc/components-core.api.md b/packages/core/etc/components-core.api.md index dba0d43dc..6a4a476ea 100644 --- a/packages/core/etc/components-core.api.md +++ b/packages/core/etc/components-core.api.md @@ -6,12 +6,13 @@ import type { AudioCaptureOptions } from 'livekit-client'; import { BehaviorSubject } from 'rxjs'; +import { ChatMessage } from 'livekit-client'; import { ConnectionQuality } from 'livekit-client'; import { ConnectionState } from 'livekit-client'; import { DataPacket_Kind } from 'livekit-client'; import type { DataPublishOptions } from 'livekit-client'; import { LocalAudioTrack } from 'livekit-client'; -import type { LocalParticipant } from 'livekit-client'; +import { LocalParticipant } from 'livekit-client'; import { LocalVideoTrack } from 'livekit-client'; import loglevel from 'loglevel'; import { Observable } from 'rxjs'; @@ -72,20 +73,12 @@ export interface BaseDataMessage { // @public (undocumented) export type CaptureOptionsBySource = T extends Track.Source.Camera ? VideoCaptureOptions : T extends Track.Source.Microphone ? AudioCaptureOptions : T extends Track.Source.ScreenShare ? ScreenShareCaptureOptions : never; -// @public (undocumented) -export interface ChatMessage { - // (undocumented) - id: string; - // (undocumented) - message: string; - // (undocumented) - timestamp: number; -} +export { ChatMessage } // @public (undocumented) export type ChatOptions = { - messageEncoder?: (message: ChatMessage) => Uint8Array; - messageDecoder?: (message: Uint8Array) => ReceivedChatMessage; + messageEncoder?: (message: LegacyChatMessage) => Uint8Array; + messageDecoder?: (message: Uint8Array) => LegacyReceivedChatMessage; channelTopic?: string; updateChannelTopic?: string; }; @@ -115,6 +108,9 @@ export function connectionStateObserver(room: Room): Observable // @public (undocumented) export function createActiveDeviceObservable(room: Room, kind: MediaDeviceKind): Observable; +// @public (undocumented) +export function createChatObserver(room: Room): Observable<[message: ChatMessage, participant?: LocalParticipant | RemoteParticipant | undefined]>; + // @public (undocumented) export function createConnectionQualityObserver(participant: Participant): Observable; @@ -263,6 +259,18 @@ export function isTrackReferencePlaceholder(trackReference?: TrackReferenceOrPla // @internal (undocumented) export function isWeb(): boolean; +// @public (undocumented) +export interface LegacyChatMessage extends ChatMessage { + // (undocumented) + ignore?: true; +} + +// @public (undocumented) +export interface LegacyReceivedChatMessage extends ReceivedChatMessage { + // (undocumented) + ignore?: true; +} + // @alpha export function loadUserChoices(defaults?: Partial, preventLoad?: boolean): LocalUserChoices; @@ -287,11 +295,11 @@ export type MediaToggleType = { enabledObserver: Observable; }; -// @public (undocumented) -export type MessageDecoder = (message: Uint8Array) => ReceivedChatMessage; +// @public @deprecated (undocumented) +export type MessageDecoder = (message: Uint8Array) => LegacyReceivedChatMessage; -// @public (undocumented) -export type MessageEncoder = (message: ChatMessage) => Uint8Array; +// @public @deprecated (undocumented) +export type MessageEncoder = (message: LegacyChatMessage) => Uint8Array; // @public (undocumented) export function mutedObserver(trackRef: TrackReferenceOrPlaceholder): Observable; @@ -400,8 +408,6 @@ export type PinState = TrackReferenceOrPlaceholder[]; // @public (undocumented) export interface ReceivedChatMessage extends ChatMessage { - // (undocumented) - editTimestamp?: number; // (undocumented) from?: Participant; } @@ -492,7 +498,24 @@ export function setupChat(room: Room, options?: ChatOptions): { messageObservable: Observable; isSendingObservable: BehaviorSubject; send: (message: string) => Promise; - update: (message: string, messageId: string) => Promise; + update: (message: string, originalMessageOrId: string | ChatMessage) => Promise<{ + readonly message: string; + readonly editTimestamp: number; + readonly id: string; + readonly timestamp: number; + }>; +}; + +// @public (undocumented) +export function setupChatMessageHandler(room: Room): { + chatObservable: Observable<[message: ChatMessage, participant?: LocalParticipant | RemoteParticipant | undefined]>; + send: (text: string) => Promise; + edit: (text: string, originalMsg: ChatMessage) => Promise<{ + readonly message: string; + readonly editTimestamp: number; + readonly id: string; + readonly timestamp: number; + }>; }; // @public (undocumented) diff --git a/packages/core/package.json b/packages/core/package.json index 5fa755329..390e39f17 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -40,12 +40,12 @@ "rxjs": "7.8.1" }, "peerDependencies": { - "livekit-client": "^2.4.0", - "@livekit/protocol": "^1.20.1", + "livekit-client": "^2.5.4", "tslib": "^2.6.2" }, "devDependencies": { "@livekit/components-styles": "workspace:*", + "@livekit/protocol": "^1.22.0", "@microsoft/api-extractor": "^7.36.0", "@size-limit/file": "^11.0.2", "@size-limit/webpack": "^11.0.2", diff --git a/packages/core/src/components/chat.ts b/packages/core/src/components/chat.ts index 088b6e932..2210d1f85 100644 --- a/packages/core/src/components/chat.ts +++ b/packages/core/src/components/chat.ts @@ -1,31 +1,49 @@ /* eslint-disable camelcase */ -import type { Participant, Room } from 'livekit-client'; +import type { Participant, Room, ChatMessage } from 'livekit-client'; import { RoomEvent } from 'livekit-client'; -import { BehaviorSubject, Subject, scan, map, takeUntil } from 'rxjs'; -import { DataTopic, sendMessage, setupDataMessageHandler } from '../observables/dataChannel'; +import { BehaviorSubject, Subject, scan, map, takeUntil, merge } from 'rxjs'; +import { + DataTopic, + sendMessage, + setupChatMessageHandler, + setupDataMessageHandler, +} from '../observables/dataChannel'; /** @public */ -export interface ChatMessage { - id: string; - timestamp: number; - message: string; -} +export type { ChatMessage }; /** @public */ export interface ReceivedChatMessage extends ChatMessage { from?: Participant; - editTimestamp?: number; } -/** @public */ -export type MessageEncoder = (message: ChatMessage) => Uint8Array; -/** @public */ -export type MessageDecoder = (message: Uint8Array) => ReceivedChatMessage; +export interface LegacyChatMessage extends ChatMessage { + ignore?: true; +} + +export interface LegacyReceivedChatMessage extends ReceivedChatMessage { + ignore?: true; +} + +/** + * @public + * @deprecated the new chat API doesn't rely on encoders and decoders anymore and uses a dedicated chat API instead + */ +export type MessageEncoder = (message: LegacyChatMessage) => Uint8Array; +/** + * @public + * @deprecated the new chat API doesn't rely on encoders and decoders anymore and uses a dedicated chat API instead + */ +export type MessageDecoder = (message: Uint8Array) => LegacyReceivedChatMessage; /** @public */ export type ChatOptions = { - messageEncoder?: (message: ChatMessage) => Uint8Array; - messageDecoder?: (message: Uint8Array) => ReceivedChatMessage; + /** @deprecated the new chat API doesn't rely on encoders and decoders anymore and uses a dedicated chat API instead */ + messageEncoder?: (message: LegacyChatMessage) => Uint8Array; + /** @deprecated the new chat API doesn't rely on encoders and decoders anymore and uses a dedicated chat API instead */ + messageDecoder?: (message: Uint8Array) => LegacyReceivedChatMessage; + /** @deprecated the new chat API doesn't rely on topics anymore and uses a dedicated chat API instead */ channelTopic?: string; + /** @deprecated the new chat API doesn't rely on topics anymore and uses a dedicated chat API instead */ updateChannelTopic?: string; }; @@ -40,9 +58,10 @@ const decoder = new TextDecoder(); const topicSubjectMap: Map>> = new Map(); -const encode = (message: ChatMessage) => encoder.encode(JSON.stringify(message)); +const encode = (message: LegacyReceivedChatMessage) => encoder.encode(JSON.stringify(message)); -const decode = (message: Uint8Array) => JSON.parse(decoder.decode(message)) as ReceivedChatMessage; +const decode = (message: Uint8Array) => + JSON.parse(decoder.decode(message)) as LegacyReceivedChatMessage | ReceivedChatMessage; export function setupChat(room: Room, options?: ChatOptions) { const onDestroyObservable = new Subject(); @@ -67,17 +86,33 @@ export function setupChat(room: Room, options?: ChatOptions) { const { messageObservable } = setupDataMessageHandler(room, [topic, updateTopic]); messageObservable.pipe(takeUntil(onDestroyObservable)).subscribe(messageSubject); } + const { chatObservable, send: sendChatMessage } = setupChatMessageHandler(room); const finalMessageDecoder = messageDecoder ?? decode; /** Build up the message array over time. */ - const messagesObservable = messageSubject.pipe( - map((msg) => { - const parsedMessage = finalMessageDecoder(msg.payload); - const newMessage: ReceivedChatMessage = { ...parsedMessage, from: msg.from }; - return newMessage; - }), - scan((acc, value) => { + const messagesObservable = merge( + messageSubject.pipe( + map((msg) => { + const parsedMessage = finalMessageDecoder(msg.payload); + const newMessage = { ...parsedMessage, from: msg.from }; + if (isIgnorableChatMessage(newMessage)) { + return undefined; + } + return newMessage; + }), + ), + chatObservable.pipe( + map(([msg, participant]) => { + return { ...msg, from: participant }; + }), + ), + ).pipe( + scan((acc, value) => { + // ignore legacy message updates + if (!value) { + return acc; + } // handle message updates if ( 'id' in value && @@ -89,7 +124,7 @@ export function setupChat(room: Room, options?: ChatOptions) { acc[replaceIndex] = { ...value, timestamp: originalMsg.timestamp, - editTimestamp: value.timestamp, + editTimestamp: value.editTimestamp ?? value.timestamp, }; } @@ -105,43 +140,35 @@ export function setupChat(room: Room, options?: ChatOptions) { const finalMessageEncoder = messageEncoder ?? encode; const send = async (message: string) => { - const timestamp = Date.now(); - const id = crypto.randomUUID(); - const chatMessage: ChatMessage = { id, message, timestamp }; - const encodedMsg = finalMessageEncoder(chatMessage); isSending$.next(true); try { - await sendMessage(room.localParticipant, encodedMsg, { + const chatMessage = await sendChatMessage(message); + const encodedLegacyMsg = finalMessageEncoder({ ...chatMessage, ignore: true }); + await sendMessage(room.localParticipant, encodedLegacyMsg, { reliable: true, topic, }); - messageSubject.next({ - payload: encodedMsg, - topic: topic, - from: room.localParticipant, - }); return chatMessage; } finally { isSending$.next(false); } }; - const update = async (message: string, messageId: string) => { + const update = async (message: string, originalMessageOrId: string | ChatMessage) => { const timestamp = Date.now(); - const chatMessage: ChatMessage = { id: messageId, message, timestamp }; - const encodedMsg = finalMessageEncoder(chatMessage); + const originalMessage: ChatMessage = + typeof originalMessageOrId === 'string' + ? { id: originalMessageOrId, message: '', timestamp } + : originalMessageOrId; isSending$.next(true); try { - await sendMessage(room.localParticipant, encodedMsg, { + const editedMessage = await room.localParticipant.editChatMessage(message, originalMessage); + const encodedLegacyMessage = finalMessageEncoder(editedMessage); + await sendMessage(room.localParticipant, encodedLegacyMessage, { topic: updateTopic, reliable: true, }); - messageSubject.next({ - payload: encodedMsg, - topic: topic, - from: room.localParticipant, - }); - return chatMessage; + return editedMessage; } finally { isSending$.next(false); } @@ -154,5 +181,16 @@ export function setupChat(room: Room, options?: ChatOptions) { } room.once(RoomEvent.Disconnected, destroy); - return { messageObservable: messagesObservable, isSendingObservable: isSending$, send, update }; + return { + messageObservable: messagesObservable, + isSendingObservable: isSending$, + send, + update, + }; +} + +function isIgnorableChatMessage( + msg: ReceivedChatMessage | LegacyReceivedChatMessage, +): msg is ReceivedChatMessage { + return (msg as LegacyChatMessage).ignore == true; } diff --git a/packages/core/src/observables/dataChannel.ts b/packages/core/src/observables/dataChannel.ts index f43c9c225..21d527c25 100644 --- a/packages/core/src/observables/dataChannel.ts +++ b/packages/core/src/observables/dataChannel.ts @@ -1,7 +1,13 @@ -import type { DataPublishOptions, LocalParticipant, Participant, Room } from 'livekit-client'; +import type { + ChatMessage, + DataPublishOptions, + LocalParticipant, + Participant, + Room, +} from 'livekit-client'; import type { Subscriber } from 'rxjs'; import { Observable, filter, map } from 'rxjs'; -import { createDataObserver } from './room'; +import { createChatObserver, createDataObserver } from './room'; export const DataTopic = { CHAT: 'lk-chat-topic', @@ -72,3 +78,19 @@ export function setupDataMessageHandler( return { messageObservable, isSendingObservable, send }; } + +export function setupChatMessageHandler(room: Room) { + const chatObservable = createChatObserver(room); + + const send = async (text: string) => { + const msg = await room.localParticipant.sendChatMessage(text); + return msg; + }; + + const edit = async (text: string, originalMsg: ChatMessage) => { + const msg = await room.localParticipant.editChatMessage(text, originalMsg); + return msg; + }; + + return { chatObservable, send, edit }; +} diff --git a/packages/core/src/observables/room.ts b/packages/core/src/observables/room.ts index c3f1fc166..d53d05756 100644 --- a/packages/core/src/observables/room.ts +++ b/packages/core/src/observables/room.ts @@ -219,6 +219,10 @@ export function createDataObserver(room: Room) { return roomEventSelector(room, RoomEvent.DataReceived); } +export function createChatObserver(room: Room) { + return roomEventSelector(room, RoomEvent.ChatMessage); +} + export function roomAudioPlaybackAllowedObservable(room: Room) { const observable = observeRoomEvents(room, RoomEvent.AudioPlaybackStatusChanged).pipe( map((room) => { diff --git a/packages/react/etc/components-react.api.md b/packages/react/etc/components-react.api.md index 6170f5bb5..91c189ce7 100644 --- a/packages/react/etc/components-react.api.md +++ b/packages/react/etc/components-react.api.md @@ -6,6 +6,7 @@ import type { AudioAnalyserOptions } from 'livekit-client'; import type { AudioCaptureOptions } from 'livekit-client'; +import { ChatMessage } from 'livekit-client'; import { ConnectionQuality } from 'livekit-client'; import { ConnectionState as ConnectionState_2 } from 'livekit-client'; import type { CreateLocalTracksOptions } from 'livekit-client'; @@ -157,15 +158,7 @@ export interface ChatEntryProps extends React_2.HTMLAttributes { // @internal (undocumented) export const ChatIcon: (props: SVGProps) => React_2.JSX.Element; -// @public (undocumented) -export interface ChatMessage { - // (undocumented) - id: string; - // (undocumented) - message: string; - // (undocumented) - timestamp: number; -} +export { ChatMessage } // Warning: (ae-forgotten-export) The symbol "ChatOptions" needs to be exported by the entry point index.d.ts // @@ -450,11 +443,15 @@ export interface MediaDeviceSelectProps extends Omit ReceivedChatMessage; +// Warning: (ae-forgotten-export) The symbol "LegacyReceivedChatMessage" needs to be exported by the entry point index.d.ts +// +// @public @deprecated (undocumented) +export type MessageDecoder = (message: Uint8Array) => LegacyReceivedChatMessage; -// @public (undocumented) -export type MessageEncoder = (message: ChatMessage) => Uint8Array; +// Warning: (ae-forgotten-export) The symbol "LegacyChatMessage" needs to be exported by the entry point index.d.ts +// +// @public @deprecated (undocumented) +export type MessageEncoder = (message: LegacyChatMessage) => Uint8Array; // @public (undocumented) export type MessageFormatter = (message: string) => React_2.ReactNode; @@ -592,8 +589,6 @@ export const QualityUnknownIcon: (props: SVGProps) => React_2.JSX // @public (undocumented) export interface ReceivedChatMessage extends ChatMessage { - // (undocumented) - editTimestamp?: number; // (undocumented) from?: Participant; } @@ -747,7 +742,12 @@ export function useAudioWaveform(trackOrTrackReference?: LocalAudioTrack | Remot // @public export function useChat(options?: ChatOptions): { send: (message: string) => Promise; - update: (message: string, messageId: string) => Promise; + update: (message: string, originalMessageOrId: string | ChatMessage) => Promise<{ + readonly message: string; + readonly editTimestamp: number; + readonly id: string; + readonly timestamp: number; + }>; chatMessages: ReceivedChatMessage[]; isSending: boolean; }; diff --git a/packages/react/package.json b/packages/react/package.json index a791c82e6..b992f8f58 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -52,14 +52,13 @@ "usehooks-ts": "3.1.0" }, "peerDependencies": { - "@livekit/protocol": "^1.20.1", - "livekit-client": "^2.4.0", + "livekit-client": "^2.5.4", "react": ">=18", "react-dom": ">=18", "tslib": "^2.6.2" }, "devDependencies": { - "@livekit/protocol": "^1.20.1", + "@livekit/protocol": "^1.22.0", "@microsoft/api-extractor": "^7.35.0", "@size-limit/file": "^11.0.2", "@size-limit/webpack": "^11.0.2", diff --git a/packages/react/src/hooks/useChat.ts b/packages/react/src/hooks/useChat.ts index 52f251ad8..c87be44aa 100644 --- a/packages/react/src/hooks/useChat.ts +++ b/packages/react/src/hooks/useChat.ts @@ -10,8 +10,6 @@ import { useConnectionState } from './useConnectionStatus'; * The `useChat` hook provides chat functionality for a LiveKit room. * It returns a simple `send` function to send chat messages and an array of `chatMessages` to hold received messages. * It also returns a `update` function that allows you to implement message-edit functionality. - * @remarks - * It is possible to pass configurations for custom message encoding and decoding and non-default topics on which to send the messages. * @public */ export function useChat(options?: ChatOptions) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0990b1aab..321d5d11e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,10 @@ settings: importers: .: + dependencies: + livekit-client: + specifier: ^2.5.4 + version: 2.5.4 devDependencies: '@changesets/cli': specifier: ^2.27.1 @@ -51,8 +55,8 @@ importers: specifier: workspace:* version: link:../../packages/styles livekit-client: - specifier: ^2.4.0 - version: 2.5.2 + specifier: ^2.5.4 + version: 2.5.4 react: specifier: ^18.2.0 version: 18.3.1 @@ -116,10 +120,10 @@ importers: version: link:../../packages/styles '@livekit/track-processors': specifier: ^0.3.2 - version: 0.3.2(livekit-client@2.5.2) + version: 0.3.2(livekit-client@2.5.4) livekit-client: - specifier: ^2.4.0 - version: 2.5.2 + specifier: ^2.5.4 + version: 2.5.4 livekit-server-sdk: specifier: ^2.6.1 version: 2.6.1 @@ -157,12 +161,9 @@ importers: '@floating-ui/dom': specifier: 1.6.11 version: 1.6.11 - '@livekit/protocol': - specifier: ^1.20.1 - version: 1.21.0 livekit-client: - specifier: ^2.4.0 - version: 2.5.2 + specifier: ^2.5.4 + version: 2.5.4 loglevel: specifier: 1.9.1 version: 1.9.1 @@ -176,6 +177,9 @@ importers: '@livekit/components-styles': specifier: workspace:* version: link:../styles + '@livekit/protocol': + specifier: ^1.22.0 + version: 1.22.0 '@microsoft/api-extractor': specifier: ^7.36.0 version: 7.47.9(@types/node@22.5.5) @@ -210,8 +214,8 @@ importers: specifier: 2.1.1 version: 2.1.1 livekit-client: - specifier: ^2.4.0 - version: 2.5.2 + specifier: ^2.5.4 + version: 2.5.4 tslib: specifier: ^2.6.2 version: 2.7.0 @@ -220,8 +224,8 @@ importers: version: 3.1.0(react@18.3.1) devDependencies: '@livekit/protocol': - specifier: ^1.20.1 - version: 1.21.0 + specifier: ^1.22.0 + version: 1.22.0 '@microsoft/api-extractor': specifier: ^7.35.0 version: 7.47.9(@types/node@22.5.5) @@ -406,7 +410,7 @@ importers: version: 2.0.4(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-n: specifier: ^17.0.0 version: 17.9.0(eslint@8.57.0) @@ -1614,12 +1618,12 @@ packages: '@livekit/changesets-changelog-github@0.0.4': resolution: {integrity: sha512-MXaiLYwgkYciZb8G2wkVtZ1pJJzZmVx5cM30Q+ClslrIYyAqQhRbPmZDM79/5CGxb1MTemR/tfOM25tgJgAK0g==} - '@livekit/protocol@1.20.1': - resolution: {integrity: sha512-TgyuwOx+XJn9inEYT9OKfFNs9YIPS4BdLa4pF5FDf9MhWRnahKwPe7jxr/+sVdWxYbZmy9hRrH58jSAFu0ONHw==} - '@livekit/protocol@1.21.0': resolution: {integrity: sha512-3TohFPNZy1axTuoDLU6mA1rwuP4VawgehvX52OoLJnU+fNQYfmMJqz8k7NSh79jG5I8Og77YYhT905Omrhli2A==} + '@livekit/protocol@1.22.0': + resolution: {integrity: sha512-KYOfVAz38YFRsmEzeDgzoaHZJhMZEkeZQlzr9xIjczWR9SeEaYNU6+IDcZRlrYcpWl6Almgt/OhXcQn+nkrDGw==} + '@livekit/track-processors@0.3.2': resolution: {integrity: sha512-4JUCzb7yIKoVsTo8J6FTzLZJHcI6DihfX/pGRDg0SOGaxprcDPrt8jaDBBTsnGBSXHeMxl2ugN+xQjdCWzLKEA==} peerDependencies: @@ -5434,8 +5438,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - livekit-client@2.5.2: - resolution: {integrity: sha512-rzWFH02UznHxpnbj+WEEoHxL1ZSo9BdFK+7ltSZWniTt2llnNckdqeXNsjkBH6k+C9agHTF4XikmxKcpWa4YrQ==} + livekit-client@2.5.4: + resolution: {integrity: sha512-ZL1Twbzscvhji7Sor+JIkIV4V7jSbX/IvBvfxeOuRzovIiM0v9IUCMINUR98mPZ7kHNFuiKB3w14afYa4UjkPg==} livekit-server-sdk@2.6.1: resolution: {integrity: sha512-j/8TOlahIyWnycNkuSzTv6q+win4JTbDGNH48iMsZDMnJBks9hhC9UwAO4ES42sAorIAxGkrH58hxt4KdTkZaQ==} @@ -9062,19 +9066,19 @@ snapshots: transitivePeerDependencies: - encoding - '@livekit/protocol@1.20.1': + '@livekit/protocol@1.21.0': dependencies: '@bufbuild/protobuf': 1.10.0 - '@livekit/protocol@1.21.0': + '@livekit/protocol@1.22.0': dependencies: '@bufbuild/protobuf': 1.10.0 - '@livekit/track-processors@0.3.2(livekit-client@2.5.2)': + '@livekit/track-processors@0.3.2(livekit-client@2.5.4)': dependencies: '@mediapipe/holistic': 0.5.1675471629 '@mediapipe/tasks-vision': 0.10.9 - livekit-client: 2.5.2 + livekit-client: 2.5.4 '@manypkg/find-root@1.1.0': dependencies: @@ -12507,8 +12511,8 @@ snapshots: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.2(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -12531,7 +12535,7 @@ snapshots: eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint-plugin-n@17.9.0(eslint@8.57.0))(eslint-plugin-promise@7.1.0(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-n: 17.9.0(eslint@8.57.0) eslint-plugin-promise: 7.1.0(eslint@8.57.0) @@ -12560,13 +12564,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 4.3.7(supports-color@5.5.0) enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -12588,14 +12592,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -12633,7 +12637,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -12643,7 +12647,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -14174,9 +14178,9 @@ snapshots: lines-and-columns@1.2.4: {} - livekit-client@2.5.2: + livekit-client@2.5.4: dependencies: - '@livekit/protocol': 1.20.1 + '@livekit/protocol': 1.22.0 events: 3.3.0 loglevel: 1.9.1 sdp-transform: 2.14.2