From 1b03cd3c1e153ad2fd8183be5d4f27af7cc692eb Mon Sep 17 00:00:00 2001 From: Jorge Cortes Date: Thu, 29 May 2025 10:26:04 -0500 Subject: [PATCH] [Components] livekit - new components --- .../create-ingress-from-url.mjs | 24 +-- .../actions/create-room/create-room.mjs | 2 +- .../actions/delete-room/delete-room.mjs | 2 +- .../generate-access-token.mjs | 195 ++++++++++++++++++ .../livekit/actions/list-rooms/list-rooms.mjs | 2 +- .../remove-participants.mjs | 51 +++++ components/livekit/common/constants.mjs | 7 - components/livekit/livekit.app.mjs | 62 +++++- components/livekit/package.json | 4 +- .../new-room-event-instant.mjs | 156 ++++++++++++++ pnpm-lock.yaml | 139 +++++++------ 11 files changed, 552 insertions(+), 92 deletions(-) create mode 100644 components/livekit/actions/generate-access-token/generate-access-token.mjs create mode 100644 components/livekit/actions/remove-participants/remove-participants.mjs delete mode 100644 components/livekit/common/constants.mjs create mode 100644 components/livekit/sources/new-room-event-instant/new-room-event-instant.mjs diff --git a/components/livekit/actions/create-ingress-from-url/create-ingress-from-url.mjs b/components/livekit/actions/create-ingress-from-url/create-ingress-from-url.mjs index c8b078b6d3a9a..50f7683cc3e21 100644 --- a/components/livekit/actions/create-ingress-from-url/create-ingress-from-url.mjs +++ b/components/livekit/actions/create-ingress-from-url/create-ingress-from-url.mjs @@ -5,16 +5,10 @@ export default { key: "livekit-create-ingress-from-url", name: "Create Ingress From URL", description: "Create a new ingress from url in LiveKit. [See the documentation](https://docs.livekit.io/home/ingress/overview/#url-input-example).", - version: "0.0.1", + version: "0.0.2", type: "action", props: { app, - name: { - type: "string", - label: "Ingress Name", - description: "The name of the ingress", - optional: true, - }, roomName: { description: "The name of the room to send media to", propDefinition: [ @@ -22,6 +16,11 @@ export default { "room", ], }, + url: { + type: "string", + label: "URL", + description: "URL of the media to pull for ingresses of type URL", + }, participantIdentity: { type: "string", label: "Participant Identity", @@ -39,6 +38,12 @@ export default { description: "Metadata to attach to the participant", optional: true, }, + name: { + type: "string", + label: "Ingress Name", + description: "The name of the ingress", + optional: true, + }, bypassTranscoding: { type: "boolean", label: "Bypass Transcoding", @@ -51,11 +56,6 @@ export default { description: "Whether to enable transcoding or forward the input media directly. Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.", optional: true, }, - url: { - type: "string", - label: "URL", - description: "URL of the media to pull for ingresses of type URL", - }, }, async run({ $ }) { const { diff --git a/components/livekit/actions/create-room/create-room.mjs b/components/livekit/actions/create-room/create-room.mjs index 26ee1164f629d..799b84d904299 100644 --- a/components/livekit/actions/create-room/create-room.mjs +++ b/components/livekit/actions/create-room/create-room.mjs @@ -4,7 +4,7 @@ export default { key: "livekit-create-room", name: "Create Room", description: "Create a new room in LiveKit. [See the documentation](https://docs.livekit.io/home/server/managing-rooms/#create-a-room).", - version: "0.0.1", + version: "0.0.2", type: "action", props: { app, diff --git a/components/livekit/actions/delete-room/delete-room.mjs b/components/livekit/actions/delete-room/delete-room.mjs index 28c9e6604af30..9e9e5273c1f6e 100644 --- a/components/livekit/actions/delete-room/delete-room.mjs +++ b/components/livekit/actions/delete-room/delete-room.mjs @@ -4,7 +4,7 @@ export default { key: "livekit-delete-room", name: "Delete Room", description: "Delete a room in LiveKit. [See the documentation](https://docs.livekit.io/home/server/managing-rooms/#delete-a-room)", - version: "0.0.1", + version: "0.0.2", type: "action", props: { app, diff --git a/components/livekit/actions/generate-access-token/generate-access-token.mjs b/components/livekit/actions/generate-access-token/generate-access-token.mjs new file mode 100644 index 0000000000000..70f5ba0527839 --- /dev/null +++ b/components/livekit/actions/generate-access-token/generate-access-token.mjs @@ -0,0 +1,195 @@ +import app from "../../livekit.app.mjs"; + +export default { + key: "livekit-generate-access-token", + name: "Generate Access Token", + description: "Generate an access token for a participant to join a LiveKit room. [See the documentation](https://github.com/livekit/node-sdks/tree/main/packages/livekit-server-sdk).", + version: "0.0.1", + type: "action", + props: { + app, + room: { + description: "The name of the room to join", + optional: true, + propDefinition: [ + app, + "room", + ], + }, + ttl: { + type: "integer", + label: "Token TTL (seconds)", + description: "How long the access token should be valid for (in seconds)", + optional: true, + }, + name: { + type: "string", + label: "Participant Name", + description: "Display name for the participant", + optional: true, + }, + identity: { + type: "string", + label: "Participant Identity", + description: "Unique identity for the participant joining the call", + }, + metadata: { + type: "string", + label: "Participant Metadata", + description: "Optional metadata to attach to the participant", + optional: true, + }, + canPublish: { + type: "boolean", + label: "Can Publish", + description: "Whether the participant can publish audio/video tracks", + optional: true, + }, + canSubscribe: { + type: "boolean", + label: "Can Subscribe", + description: "Whether the participant can subscribe to other participants' tracks", + optional: true, + }, + canPublishData: { + type: "boolean", + label: "Can Publish Data", + description: "Whether the participant can publish data messages", + optional: true, + }, + hidden: { + type: "boolean", + label: "Hidden Participant", + description: "Whether the participant should be hidden from other participants", + optional: true, + }, + roomCreate: { + type: "boolean", + label: "Room Create Permission", + description: "Permission to create rooms", + optional: true, + }, + roomList: { + type: "boolean", + label: "Room List Permission", + description: "Permission to list rooms", + optional: true, + }, + roomRecord: { + type: "boolean", + label: "Room Record Permission", + description: "Permission to start a recording", + optional: true, + }, + roomAdmin: { + type: "boolean", + label: "Room Admin Permission", + description: "Permission to control the specific room", + optional: true, + }, + ingressAdmin: { + type: "boolean", + label: "Ingress Admin Permission", + description: "Permission to control ingress, not specific to any room or ingress", + optional: true, + }, + canUpdateOwnMetadata: { + type: "boolean", + label: "Can Update Own Metadata", + description: "Allow participant to update its own metadata", + optional: true, + }, + recorder: { + type: "boolean", + label: "Recorder", + description: "Participant is recording the room, allows room to indicate it's being recorded", + optional: true, + }, + agent: { + type: "boolean", + label: "Agent", + description: "Participant allowed to connect to LiveKit as Agent Framework worker", + optional: true, + }, + canSubscribeMetrics: { + type: "boolean", + label: "Can Subscribe Metrics", + description: "Allow participant to subscribe to metrics", + optional: true, + }, + destinationRoom: { + type: "string", + label: "Destination Room", + description: "Destination room which this participant can forward to", + optional: true, + }, + createRoomIfNotExists: { + type: "boolean", + label: "Create Room If Not Exists", + description: "Whether to create the room if it doesn't exist", + optional: true, + }, + }, + async run({ $ }) { + const { + app, + ttl, + identity, + name, + metadata, + room, + createRoomIfNotExists, + canPublish, + canSubscribe, + canPublishData, + hidden, + roomCreate, + roomList, + roomRecord, + roomAdmin, + ingressAdmin, + canUpdateOwnMetadata, + recorder, + agent, + canSubscribeMetrics, + destinationRoom, + } = this; + + // Create room if it doesn't exist and option is enabled + if (createRoomIfNotExists) { + await app.createRoom({ + name: room, + }); + } + + // Create access token for the participant + const response = await app.createAccessToken({ + identity, + name, + metadata, + ttl, + grant: { + roomJoin: true, + room, + roomCreate, + roomList, + roomRecord, + roomAdmin, + ingressAdmin, + canPublish, + canSubscribe, + canPublishData, + canUpdateOwnMetadata, + hidden, + recorder, + agent, + canSubscribeMetrics, + destinationRoom, + }, + }); + + $.export("$summary", "Successfully generated access token for participant to join the call."); + + return response; + }, +}; diff --git a/components/livekit/actions/list-rooms/list-rooms.mjs b/components/livekit/actions/list-rooms/list-rooms.mjs index 4a36acc58fe48..898d2a5d2240c 100644 --- a/components/livekit/actions/list-rooms/list-rooms.mjs +++ b/components/livekit/actions/list-rooms/list-rooms.mjs @@ -4,7 +4,7 @@ export default { key: "livekit-list-rooms", name: "List Rooms", description: "List all rooms with LiveKit. [See the documentation](https://docs.livekit.io/home/server/managing-rooms/#list-rooms).", - version: "0.0.1", + version: "0.0.2", type: "action", props: { app, diff --git a/components/livekit/actions/remove-participants/remove-participants.mjs b/components/livekit/actions/remove-participants/remove-participants.mjs new file mode 100644 index 0000000000000..229f214e8750d --- /dev/null +++ b/components/livekit/actions/remove-participants/remove-participants.mjs @@ -0,0 +1,51 @@ +import app from "../../livekit.app.mjs"; + +export default { + key: "livekit-remove-participants", + name: "Remove Participants", + description: "Remove specific participants from a LiveKit room. [See the documentation](https://github.com/livekit/node-sdks/tree/main/packages/livekit-server-sdk).", + version: "0.0.1", + type: "action", + props: { + app, + room: { + propDefinition: [ + app, + "room", + ], + }, + identities: { + type: "string[]", + label: "Participant Identities", + description: "Identities of participants to remove from the room", + propDefinition: [ + app, + "identity", + ({ room }) => ({ + room, + }), + ], + }, + }, + async run({ $ }) { + const { + app, + room, + identities, + } = this; + + const results = await Promise.all( + identities.map(async (identity) => { + await app.removeParticipant(room, identity); + return identity; + }), + ); + + $.export("$summary", `Successfully removed \`${identities.length}\` participant(s) from room: \`${room}\``); + + return { + room, + removedParticipants: results, + }; + }, +}; diff --git a/components/livekit/common/constants.mjs b/components/livekit/common/constants.mjs deleted file mode 100644 index b777b760f5598..0000000000000 --- a/components/livekit/common/constants.mjs +++ /dev/null @@ -1,7 +0,0 @@ -const HTTPS_PREFIX = "https://"; -const HTTP_PREFIX = "http://"; - -export default { - HTTPS_PREFIX, - HTTP_PREFIX, -}; diff --git a/components/livekit/livekit.app.mjs b/components/livekit/livekit.app.mjs index d0458075b1ceb..577a82bad1d65 100644 --- a/components/livekit/livekit.app.mjs +++ b/components/livekit/livekit.app.mjs @@ -1,8 +1,9 @@ import { RoomServiceClient, IngressClient, + WebhookReceiver, + AccessToken, } from "livekit-server-sdk"; -import constants from "./common/constants.mjs"; export default { type: "app", @@ -13,20 +14,33 @@ export default { label: "Room Name", description: "The name of the room", async options() { - const rooms = await this.listRooms(); - return rooms.map(({ name }) => name); + try { + const rooms = await this.listRooms(); + return rooms.map(({ name }) => name); + } catch (error) { + console.log("Error fetching rooms:", error); + return []; + } + }, + }, + identity: { + type: "string", + label: "Participant Identity", + description: "The identity of the participant to remove from the room", + async options({ room }) { + try { + const participants = await this.listParticipants(room); + return participants.map(({ identity }) => identity); + } catch (error) { + console.log("Error fetching participants:", error); + return []; + } }, }, }, methods: { getHost() { - const { project_url: projectUrl } = this.$auth; - - return projectUrl.startsWith(constants.HTTPS_PREFIX) - ? projectUrl - : projectUrl.startsWith(constants.HTTP_PREFIX) - ? projectUrl.replace(constants.HTTP_PREFIX, constants.HTTPS_PREFIX) - : `${constants.HTTPS_PREFIX}${projectUrl}`; + return this.$auth.project_url; }, getKeys() { const { @@ -44,6 +58,9 @@ export default { getIngressClient() { return new IngressClient(this.getHost(), ...this.getKeys()); }, + getWebhookReceiver() { + return new WebhookReceiver(...this.getKeys()); + }, createRoom(args) { return this.getRoomClient().createRoom(args); }, @@ -58,5 +75,30 @@ export default { } = {}) { return this.getIngressClient().createIngress(inputType, args); }, + verifyWebhook(body, authHeader) { + const receiver = this.getWebhookReceiver(); + return receiver.receive(body, authHeader); + }, + removeParticipant(room, identity) { + return this.getRoomClient().removeParticipant(room, identity); + }, + listParticipants(room) { + return this.getRoomClient().listParticipants(room); + }, + async createAccessToken({ + grant = {}, + ...args + } = {}) { + const accessToken = new AccessToken(...this.getKeys(), args); + + accessToken.addGrant(grant); + + const token = await accessToken.toJwt(); + + return { + token, + host: this.getHost(), + }; + }, }, }; diff --git a/components/livekit/package.json b/components/livekit/package.json index 8067eda5b705b..b125506df5244 100644 --- a/components/livekit/package.json +++ b/components/livekit/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/livekit", - "version": "0.1.0", + "version": "0.2.0", "description": "Pipedream LiveKit Components", "main": "livekit.app.mjs", "keywords": [ @@ -13,6 +13,6 @@ "access": "public" }, "dependencies": { - "livekit-server-sdk": "^2.8.1" + "livekit-server-sdk": "^2.13.0" } } diff --git a/components/livekit/sources/new-room-event-instant/new-room-event-instant.mjs b/components/livekit/sources/new-room-event-instant/new-room-event-instant.mjs new file mode 100644 index 0000000000000..fd5b4b2fe8bad --- /dev/null +++ b/components/livekit/sources/new-room-event-instant/new-room-event-instant.mjs @@ -0,0 +1,156 @@ +import app from "../../livekit.app.mjs"; + +export default { + key: "livekit-new-room-event-instant", + name: "New Room Event (Instant)", + description: "Emit new event for LiveKit room activities via webhook. [See the documentation](https://docs.livekit.io/home/server/webhooks/).", + version: "0.0.1", + type: "source", + dedupe: "unique", + props: { + app, + http: "$.interface.http", + eventTypes: { + type: "string[]", + label: "Event Types", + description: "Select which types of events to monitor", + options: [ + { + label: "Room Started (e.g., call initiated)", + value: "room_started", + }, + { + label: "Room Finished (e.g., call ended)", + value: "room_finished", + }, + { + label: "Participant Joined (e.g., call answered)", + value: "participant_joined", + }, + { + label: "Participant Left (e.g., call ended)", + value: "participant_left", + }, + { + label: "Track Published (e.g., video track published)", + value: "track_published", + }, + { + label: "Track Unpublished (e.g., video track unpublished)", + value: "track_unpublished", + }, + { + label: "Egress Started (e.g., egress started for recording or streaming)", + value: "egress_started", + }, + { + label: "Egress Updated (e.g., egress updated for recording or streaming)", + value: "egress_updated", + }, + { + label: "Egress Ended (e.g., egress ended for recording or streaming)", + value: "egress_ended", + }, + { + label: "Ingress Started (e.g., ingress started for recording or streaming)", + value: "ingress_started", + }, + { + label: "Ingress Ended (e.g., ingress ended for recording or streaming)", + value: "ingress_ended", + }, + ], + }, + roomNameFilter: { + type: "string", + label: "Room Name Filter", + description: "Only emit events for this specific room. Leave empty to monitor all rooms.", + optional: true, + }, + }, + methods: { + shouldEmitEvent({ + event, room, + }) { + // Check if event type is in our filter + if (!this.eventTypes.includes(event)) { + return false; + } + + // Filter by room if specified, with case-insensitive comparison + if (this.roomNameFilter + && room?.name?.toLowerCase() !== this.roomNameFilter.toLowerCase()) { + return false; + } + + return true; + }, + generateSummary(event) { + const room = event.room?.name || "Unknown room"; + + switch (event.event) { + case "room_started": + return `Room started: ${room}`; + case "room_finished": + return `Room finished: ${room}`; + case "participant_joined": { + const joinedParticipant = event.participant?.identity || "Unknown"; + return `${joinedParticipant} joined room: ${room}`; + } + case "participant_left": { + const leftParticipant = event.participant?.identity || "Unknown"; + return `${leftParticipant} left room: ${room}`; + } + case "track_published": { + const publishedBy = event.participant?.identity || "Unknown"; + const trackType = event.track?.type || "track"; + return `${publishedBy} published ${trackType} in room: ${room}`; + } + case "track_unpublished": { + const unpublishedBy = event.participant?.identity || "Unknown"; + const unpublishedTrackType = event.track?.type || "track"; + return `${unpublishedBy} unpublished ${unpublishedTrackType} in room: ${room}`; + } + case "egress_started": { + const egressId = event.egressInfo?.egressId || "Unknown"; + return `Egress started (${egressId}) in room: ${room}`; + } + case "egress_updated": { + const egressId = event.egressInfo?.egressId || "Unknown"; + return `Egress updated (${egressId}) in room: ${room}`; + } + case "egress_ended": { + const egressId = event.egressInfo?.egressId || "Unknown"; + return `Egress ended (${egressId}) in room: ${room}`; + } + case "ingress_started": { + const ingressId = event.ingressInfo?.ingressId || "Unknown"; + return `Ingress started (${ingressId}) in room: ${room}`; + } + case "ingress_ended": { + const ingressId = event.ingressInfo?.ingressId || "Unknown"; + return `Ingress ended (${ingressId}) in room: ${room}`; + } + default: + return `${event.event} in room: ${room}`; + } + }, + }, + async run({ + headers, bodyRaw, + }) { + if (!headers.authorization) { + throw new Error("Missing Authorization header"); + } + + const webhookEvent = await this.app.verifyWebhook(bodyRaw, headers.authorization); + + if (this.shouldEmitEvent(webhookEvent)) { + this.$emit(webhookEvent, { + id: webhookEvent.id, + summary: this.generateSummary(webhookEvent), + ts: parseInt(webhookEvent.createdAt) * 1000, + }); + } + }, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cbea95590e2f6..02ef5dcd40d74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7510,8 +7510,8 @@ importers: components/livekit: dependencies: livekit-server-sdk: - specifier: ^2.8.1 - version: 2.8.1 + specifier: ^2.13.0 + version: 2.13.0 components/livesession: dependencies: @@ -15595,7 +15595,7 @@ importers: version: 1.2.13 tsup: specifier: ^8.3.6 - version: 8.3.6(@microsoft/api-extractor@7.47.12(@types/node@22.15.9))(jiti@1.21.6)(postcss@8.4.49)(tsx@4.19.4)(typescript@5.6.3)(yaml@2.6.1) + version: 8.3.6(@microsoft/api-extractor@7.47.12(@types/node@22.15.21))(jiti@1.21.6)(postcss@8.4.49)(tsx@4.19.4)(typescript@5.6.3)(yaml@2.6.1) typescript: specifier: ^5.6 version: 5.6.3 @@ -15647,10 +15647,10 @@ importers: version: 18.3.12 vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.15.9) + version: 5.4.11(@types/node@22.15.21) vite-plugin-dts: specifier: ^4.3.0 - version: 4.3.0(@types/node@22.15.9)(rollup@4.27.3)(typescript@5.7.2)(vite@5.4.11(@types/node@22.15.9)) + version: 4.3.0(@types/node@22.15.21)(rollup@4.27.3)(typescript@5.7.2)(vite@5.4.11(@types/node@22.15.21)) packages/connect-react/examples/nextjs: dependencies: @@ -16982,11 +16982,11 @@ packages: '@braintree/sanitize-url@7.1.0': resolution: {integrity: sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==} - '@bufbuild/protobuf@1.10.0': - resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==} + '@bufbuild/protobuf@1.10.1': + resolution: {integrity: sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==} - '@bufbuild/protobuf@2.2.2': - resolution: {integrity: sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==} + '@bufbuild/protobuf@2.5.0': + resolution: {integrity: sha512-nniMblXT+dNyubek2OLKAYJnG/in4tmfS2c5CDnIvqfF9kFlERSG3FCBvmdqerpkWuPv0qhdGKReQ2OqKPG20w==} '@chevrotain/cst-dts-gen@11.0.3': resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} @@ -18138,8 +18138,8 @@ packages: resolution: {integrity: sha512-Vn1qM+bP0lggPIPxHU7G2u0WrA/cGpvqjm9V0sNs+yazJDq7/9PLDnyUU+E97DneOPsekTA2H/Gw3CAfekpUlA==} engines: {node: '>=12.x', yarn: 1.x} - '@livekit/protocol@1.27.1': - resolution: {integrity: sha512-ISEp7uWdV82mtCR1eyHFTzdRZTVbe2+ZztjmjiMPzR/KPrI1Ma/u5kLh87NNuY3Rn8wv1VlEvGHHsFjQ+dKVUw==} + '@livekit/protocol@1.38.0': + resolution: {integrity: sha512-XX6ulvsE1XCN18LVf3ydHN7Ri1Z1M1P5dQdjnm5nVDsSqUL12Vbo/4RKcRlCEXAg2qB62mKjcaVLXVwkfXggkg==} '@lob/lob-typescript-sdk@1.3.5': resolution: {integrity: sha512-ZFzYksy/5SqYCoHRJnlpr1P89UHdFEhAdLJ/0aQlNeqfJC1R9pucQuR9YTWmdHhGaz7AORMMlFMojd+xz8m32w==} @@ -20747,6 +20747,9 @@ packages: '@types/node@18.11.10': resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} + '@types/node@18.19.103': + resolution: {integrity: sha512-hHTHp+sEz6SxFsp+SA+Tqrua3AbmlAw+Y//aEwdHrdZkYVRWdvWD3y5uPZ0flYOkgskaFWqZ/YGFm3FaFQ0pRw==} + '@types/node@18.19.64': resolution: {integrity: sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==} @@ -20765,6 +20768,9 @@ packages: '@types/node@22.10.2': resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + '@types/node@22.15.21': + resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} + '@types/node@22.15.9': resolution: {integrity: sha512-l6QaCgJSJQ0HngL1TjvEY2DlefKggyGeXP1KYvYLBX41ZDPM1FsgDMAr5c+T673NMy7VCptMOzXOuJqf5uB0bA==} @@ -25732,9 +25738,9 @@ packages: resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} engines: {node: '>=18.0.0'} - livekit-server-sdk@2.8.1: - resolution: {integrity: sha512-l8egXU10jPuRJM2Df9Gk/KPEk6tBV0JEGG19cD5QeQtyIMgqULCCd/5yyG2FRvcWRf7pEyZZMXi63zDn7uaKHQ==} - engines: {node: '>=19'} + livekit-server-sdk@2.13.0: + resolution: {integrity: sha512-fQJI/zEJRPeXKdKMkEfJNYSSnvmuPQsk2Q+X6tPfUrJPy7fnyYPax/icf/CZ8EYZQBhFgSD7WaKOYGSSfGSyZw==} + engines: {node: '>=18'} load-module@4.2.1: resolution: {integrity: sha512-Sbfg6R4LjvyThJpqUoADHMjyoI2+cL4msbCQeZ9kkY/CqP/TT2938eftKm7x4I2gd4/A+DEe6nePkbfWYbXwSw==} @@ -28507,6 +28513,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -33449,9 +33460,9 @@ snapshots: '@braintree/sanitize-url@7.1.0': {} - '@bufbuild/protobuf@1.10.0': {} + '@bufbuild/protobuf@1.10.1': {} - '@bufbuild/protobuf@2.2.2': {} + '@bufbuild/protobuf@2.5.0': {} '@chevrotain/cst-dts-gen@11.0.3': dependencies: @@ -33472,14 +33483,14 @@ snapshots: '@colors/colors@1.6.0': {} - '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2))': + '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.5.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.5.0))': dependencies: - '@bufbuild/protobuf': 2.2.2 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) + '@bufbuild/protobuf': 2.5.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.5.0) - '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)': + '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.5.0)': dependencies: - '@bufbuild/protobuf': 2.2.2 + '@bufbuild/protobuf': 2.5.0 '@corex/deepmerge@4.0.43': {} @@ -33536,14 +33547,14 @@ snapshots: dependencies: '@definitelytyped/typescript-versions': 0.1.8 '@definitelytyped/utils': 0.1.8 - semver: 7.7.1 + semver: 7.7.2 '@definitelytyped/typescript-versions@0.1.8': {} '@definitelytyped/utils@0.1.8': dependencies: '@qiwi/npm-registry-client': 8.9.1 - '@types/node': 18.19.87 + '@types/node': 18.19.103 cachedir: 2.4.0 charm: 1.0.2 minimatch: 9.0.5 @@ -34739,9 +34750,9 @@ snapshots: transitivePeerDependencies: - encoding - '@livekit/protocol@1.27.1': + '@livekit/protocol@1.38.0': dependencies: - '@bufbuild/protobuf': 1.10.0 + '@bufbuild/protobuf': 1.10.1 '@lob/lob-typescript-sdk@1.3.5': dependencies: @@ -34813,11 +34824,11 @@ snapshots: - '@types/node' optional: true - '@microsoft/api-extractor-model@7.29.9(@types/node@22.15.9)': + '@microsoft/api-extractor-model@7.29.9(@types/node@22.15.21)': dependencies: '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.10.0(@types/node@22.15.9) + '@rushstack/node-core-library': 5.10.0(@types/node@22.15.21) transitivePeerDependencies: - '@types/node' @@ -34840,15 +34851,15 @@ snapshots: - '@types/node' optional: true - '@microsoft/api-extractor@7.47.12(@types/node@22.15.9)': + '@microsoft/api-extractor@7.47.12(@types/node@22.15.21)': dependencies: - '@microsoft/api-extractor-model': 7.29.9(@types/node@22.15.9) + '@microsoft/api-extractor-model': 7.29.9(@types/node@22.15.21) '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.10.0(@types/node@22.15.9) + '@rushstack/node-core-library': 5.10.0(@types/node@22.15.21) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.3(@types/node@22.15.9) - '@rushstack/ts-command-line': 4.23.1(@types/node@22.15.9) + '@rushstack/terminal': 0.14.3(@types/node@22.15.21) + '@rushstack/ts-command-line': 4.23.1(@types/node@22.15.21) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -36498,7 +36509,7 @@ snapshots: request: 2.88.2 retry: 0.12.0 safe-buffer: 5.2.1 - semver: 7.7.1 + semver: 7.7.2 slide: 1.1.6 ssri: 8.0.1 optionalDependencies: @@ -36671,7 +36682,7 @@ snapshots: '@types/node': 20.17.30 optional: true - '@rushstack/node-core-library@5.10.0(@types/node@22.15.9)': + '@rushstack/node-core-library@5.10.0(@types/node@22.15.21)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -36682,7 +36693,7 @@ snapshots: resolve: 1.22.8 semver: 7.5.4 optionalDependencies: - '@types/node': 22.15.9 + '@types/node': 22.15.21 '@rushstack/rig-package@0.5.3': dependencies: @@ -36697,12 +36708,12 @@ snapshots: '@types/node': 20.17.30 optional: true - '@rushstack/terminal@0.14.3(@types/node@22.15.9)': + '@rushstack/terminal@0.14.3(@types/node@22.15.21)': dependencies: - '@rushstack/node-core-library': 5.10.0(@types/node@22.15.9) + '@rushstack/node-core-library': 5.10.0(@types/node@22.15.21) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.15.9 + '@types/node': 22.15.21 '@rushstack/ts-command-line@4.23.1(@types/node@20.17.30)': dependencies: @@ -36714,9 +36725,9 @@ snapshots: - '@types/node' optional: true - '@rushstack/ts-command-line@4.23.1(@types/node@22.15.9)': + '@rushstack/ts-command-line@4.23.1(@types/node@22.15.21)': dependencies: - '@rushstack/terminal': 0.14.3(@types/node@22.15.9) + '@rushstack/terminal': 0.14.3(@types/node@22.15.21) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -37981,6 +37992,10 @@ snapshots: '@types/node@18.11.10': {} + '@types/node@18.19.103': + dependencies: + undici-types: 5.26.5 + '@types/node@18.19.64': dependencies: undici-types: 5.26.5 @@ -38005,6 +38020,11 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/node@22.15.21': + dependencies: + undici-types: 6.21.0 + optional: true + '@types/node@22.15.9': dependencies: undici-types: 6.21.0 @@ -38188,7 +38208,7 @@ snapshots: glob: 7.2.3 is-glob: 4.0.3 lodash: 4.17.21 - semver: 7.7.1 + semver: 7.7.2 tsutils: 3.21.0(typescript@3.9.10) optionalDependencies: typescript: 3.9.10 @@ -40614,9 +40634,9 @@ snapshots: e2b@1.0.5: dependencies: - '@bufbuild/protobuf': 2.2.2 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) - '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)) + '@bufbuild/protobuf': 2.5.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.5.0) + '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.5.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.5.0)) compare-versions: 6.1.1 openapi-fetch: 0.9.8 platform: 1.3.6 @@ -40986,7 +41006,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@8.57.1): dependencies: eslint: 8.57.1 - semver: 7.7.1 + semver: 7.7.2 eslint-config-next@15.0.3(eslint@8.57.1)(typescript@5.6.3): dependencies: @@ -43478,7 +43498,7 @@ snapshots: '@babel/parser': 7.26.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -44467,9 +44487,10 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.0 - livekit-server-sdk@2.8.1: + livekit-server-sdk@2.13.0: dependencies: - '@livekit/protocol': 1.27.1 + '@bufbuild/protobuf': 1.10.1 + '@livekit/protocol': 1.38.0 camelcase-keys: 9.1.3 jose: 5.9.6 @@ -44757,7 +44778,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-error@1.3.6: {} @@ -46098,7 +46119,7 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -46125,7 +46146,7 @@ snapshots: npm-package-arg@8.1.5: dependencies: hosted-git-info: 4.1.0 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-name: 3.0.0 npm-run-path@2.0.2: @@ -48427,6 +48448,8 @@ snapshots: semver@7.7.1: {} + semver@7.7.2: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -49735,7 +49758,7 @@ snapshots: - tsx - yaml - tsup@8.3.6(@microsoft/api-extractor@7.47.12(@types/node@22.15.9))(jiti@1.21.6)(postcss@8.4.49)(tsx@4.19.4)(typescript@5.6.3)(yaml@2.6.1): + tsup@8.3.6(@microsoft/api-extractor@7.47.12(@types/node@22.15.21))(jiti@1.21.6)(postcss@8.4.49)(tsx@4.19.4)(typescript@5.6.3)(yaml@2.6.1): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) cac: 6.7.14 @@ -49754,7 +49777,7 @@ snapshots: tinyglobby: 0.2.10 tree-kill: 1.2.2 optionalDependencies: - '@microsoft/api-extractor': 7.47.12(@types/node@22.15.9) + '@microsoft/api-extractor': 7.47.12(@types/node@22.15.21) postcss: 8.4.49 typescript: 5.6.3 transitivePeerDependencies: @@ -50336,9 +50359,9 @@ snapshots: transitivePeerDependencies: - debug - vite-plugin-dts@4.3.0(@types/node@22.15.9)(rollup@4.27.3)(typescript@5.7.2)(vite@5.4.11(@types/node@22.15.9)): + vite-plugin-dts@4.3.0(@types/node@22.15.21)(rollup@4.27.3)(typescript@5.7.2)(vite@5.4.11(@types/node@22.15.21)): dependencies: - '@microsoft/api-extractor': 7.47.12(@types/node@22.15.9) + '@microsoft/api-extractor': 7.47.12(@types/node@22.15.21) '@rollup/pluginutils': 5.1.3(rollup@4.27.3) '@volar/typescript': 2.4.10 '@vue/language-core': 2.1.6(typescript@5.7.2) @@ -50349,19 +50372,19 @@ snapshots: magic-string: 0.30.13 typescript: 5.7.2 optionalDependencies: - vite: 5.4.11(@types/node@22.15.9) + vite: 5.4.11(@types/node@22.15.21) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite@5.4.11(@types/node@22.15.9): + vite@5.4.11(@types/node@22.15.21): dependencies: esbuild: 0.21.5 postcss: 8.4.49 rollup: 4.27.3 optionalDependencies: - '@types/node': 22.15.9 + '@types/node': 22.15.21 fsevents: 2.3.3 vm2@3.9.19: