From 2fc18661ece027695544c933c83ced28437c870d Mon Sep 17 00:00:00 2001 From: jmoguilevsky Date: Thu, 3 Aug 2023 17:48:45 -0300 Subject: [PATCH] removing old structure --- .env.example | 12 - .eslintrc.json | 3 - .prettierignore | 3 - .prettierrc | 7 - LICENSE | 202 -- README.md | 42 - lib/Debug.tsx | 22 - lib/client-utils.ts | 21 - lib/server-utils.ts | 27 - lib/types.ts | 16 - next-env.d.ts | 5 - next.config.js | 20 - package.json | 30 - pages/_app.tsx | 60 - pages/api/token.ts | 67 - pages/api/url.ts | 17 - pages/custom/index.tsx | 26 - pages/index.tsx | 163 -- pages/rooms/[name].tsx | 118 - public/favicon.ico | Bin 15406 -> 0 bytes public/images/livekit-apple-touch.png | Bin 323 -> 0 bytes public/images/livekit-meet-home.svg | 1 - public/images/livekit-meet-open-graph.png | Bin 22701 -> 0 bytes public/images/livekit-safari-pinned-tab.svg | 1 - renovate.json | 17 - styles/Home.module.css | 38 - styles/globals.css | 64 - tsconfig.json | 21 - yarn.lock | 2414 ------------------- 29 files changed, 3417 deletions(-) delete mode 100644 .env.example delete mode 100644 .eslintrc.json delete mode 100644 .prettierignore delete mode 100644 .prettierrc delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 lib/Debug.tsx delete mode 100644 lib/client-utils.ts delete mode 100644 lib/server-utils.ts delete mode 100644 lib/types.ts delete mode 100644 next-env.d.ts delete mode 100644 next.config.js delete mode 100644 package.json delete mode 100644 pages/_app.tsx delete mode 100644 pages/api/token.ts delete mode 100644 pages/api/url.ts delete mode 100644 pages/custom/index.tsx delete mode 100644 pages/index.tsx delete mode 100644 pages/rooms/[name].tsx delete mode 100644 public/favicon.ico delete mode 100644 public/images/livekit-apple-touch.png delete mode 100644 public/images/livekit-meet-home.svg delete mode 100644 public/images/livekit-meet-open-graph.png delete mode 100644 public/images/livekit-safari-pinned-tab.svg delete mode 100644 renovate.json delete mode 100644 styles/Home.module.css delete mode 100644 styles/globals.css delete mode 100644 tsconfig.json delete mode 100644 yarn.lock diff --git a/.env.example b/.env.example deleted file mode 100644 index 1d92e0e..0000000 --- a/.env.example +++ /dev/null @@ -1,12 +0,0 @@ -# 1. Copy this file and rename it to .env.local -# 2. Update the enviroment variables below. - -# API key and secret. If you use LiveKit Cloud this can be generated via the cloud dashboard. -LIVEKIT_API_KEY=devkey -LIVEKIT_API_SECRET=secret - -# URL pointing to the LiveKit server. -LIVEKIT_URL=wss://my-livekit-project.livekit.cloud - -## PUBLIC -NEXT_PUBLIC_LK_TOKEN_ENDPOINT=/api/token \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index bffb357..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "next/core-web-vitals" -} diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index fb6e24e..0000000 --- a/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -.github/ -.next/ -node_modules/ \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 4148c21..0000000 --- a/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "semi": true, - "tabWidth": 2, - "printWidth": 100 -} diff --git a/LICENSE b/LICENSE deleted file mode 100644 index d645695..0000000 --- a/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md deleted file mode 100644 index d5c3018..0000000 --- a/README.md +++ /dev/null @@ -1,42 +0,0 @@ - - LiveKit logo - - -# LiveKit Meet - -

- Try the demo - • - LiveKit Components - • - LiveKit Docs - • - LiveKit Cloud - • - Blog -

- -
- -LiveKit Meet is an open source video conferencing app built on [LiveKit Components](https://github.com/livekit/components-js), [LiveKit Cloud](https://livekit.io/cloud), and Next.js. It's been completely redesigned from the ground up using our new components library. - -![LiveKit Meet screenshot](./.github/assets/livekit-meet.jpg) - -## Tech Stack - -- This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). -- App is built with [@livekit/components-react](https://github.com/livekit/components-js/) library. - -## Demo - -Give it a try at https://meet.livekit.io. - -## Dev Setup - -Steps to get a local dev setup up and running: - -1. Run `yarn install` to install all dependencies. -2. Copy `.env.example` in the project root and rename it to `.env.local`. -3. Update the missing environment variables in the newly created `.env.local` file. -4. Run `yarn dev` to start the development server and visit [http://localhost:3000](http://localhost:3000) to see the result. -5. Start development 🎉 diff --git a/lib/Debug.tsx b/lib/Debug.tsx deleted file mode 100644 index 6362398..0000000 --- a/lib/Debug.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import * as React from 'react'; -import { useRoomContext } from '@livekit/components-react'; -import { setLogLevel, LogLevel } from 'livekit-client'; - -export const useDebugMode = ({ logLevel }: { logLevel?: LogLevel }) => { - setLogLevel(logLevel ?? 'debug'); - const room = useRoomContext(); - React.useEffect(() => { - // @ts-expect-error - window.__lk_room = room; - - return () => { - // @ts-expect-error - window.__lk_room = undefined; - }; - }); -}; - -export const DebugMode = ({ logLevel }: { logLevel?: LogLevel }) => { - useDebugMode({ logLevel }); - return <>; -}; diff --git a/lib/client-utils.ts b/lib/client-utils.ts deleted file mode 100644 index a2401c8..0000000 --- a/lib/client-utils.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useEffect, useState } from 'react'; - -export function useServerUrl(region?: string) { - const [serverUrl, setServerUrl] = useState(); - useEffect(() => { - let endpoint = `/api/url`; - if (region) { - endpoint += `?region=${region}`; - } - fetch(endpoint).then(async (res) => { - if (res.ok) { - const body = await res.json(); - console.log(body); - setServerUrl(body.url); - } else { - throw Error('Error fetching server url, check server logs'); - } - }); - }); - return serverUrl; -} diff --git a/lib/server-utils.ts b/lib/server-utils.ts deleted file mode 100644 index 1ea1c31..0000000 --- a/lib/server-utils.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { RoomServiceClient } from 'livekit-server-sdk'; - -export function getRoomClient(): RoomServiceClient { - checkKeys(); - return new RoomServiceClient(getLiveKitURL()); -} - -export function getLiveKitURL(region?: string | string[]): string { - let targetKey = 'LIVEKIT_URL'; - if (region && !Array.isArray(region)) { - targetKey = `LIVEKIT_URL_${region}`.toUpperCase(); - } - const url = process.env[targetKey]; - if (!url) { - throw new Error(`${targetKey} is not defined`); - } - return url; -} - -function checkKeys() { - if (typeof process.env.LIVEKIT_API_KEY === 'undefined') { - throw new Error('LIVEKIT_API_KEY is not defined'); - } - if (typeof process.env.LIVEKIT_API_SECRET === 'undefined') { - throw new Error('LIVEKIT_API_SECRET is not defined'); - } -} diff --git a/lib/types.ts b/lib/types.ts deleted file mode 100644 index 122a847..0000000 --- a/lib/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { LocalAudioTrack, LocalVideoTrack } from 'livekit-client'; - -export interface SessionProps { - roomName: string; - identity: string; - audioTrack?: LocalAudioTrack; - videoTrack?: LocalVideoTrack; - region?: string; - turnServer?: RTCIceServer; - forceRelay?: boolean; -} - -export interface TokenResult { - identity: string; - accessToken: string; -} diff --git a/next-env.d.ts b/next-env.d.ts deleted file mode 100644 index 4f11a03..0000000 --- a/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.js b/next.config.js deleted file mode 100644 index 29f4c9c..0000000 --- a/next.config.js +++ /dev/null @@ -1,20 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - reactStrictMode: false, - swcMinify: false, - productionBrowserSourceMaps: true, - webpack: (config, { buildId, dev, isServer, defaultLoaders, nextRuntime, webpack }) => { - // Important: return the modified config - config.module.rules = [ - ...config.module.rules, - { - test: /\.mjs$/, - enforce: 'pre', - use: ['source-map-loader'], - }, - ]; - return config; - }, -}; - -module.exports = nextConfig; diff --git a/package.json b/package.json deleted file mode 100644 index a21a0fa..0000000 --- a/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "livekit-meet", - "version": "0.2.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "@livekit/components-react": "1.0.8", - "@livekit/components-styles": "1.0.4", - "livekit-client": "1.12.2", - "livekit-server-sdk": "1.2.5", - "next": "12.3.4", - "next-seo": "^6.0.0", - "react": "18.2.0", - "react-dom": "18.2.0" - }, - "devDependencies": { - "@types/node": "18.16.3", - "@types/react": "18.2.0", - "@types/react-dom": "18.2.1", - "eslint": "8.39.0", - "eslint-config-next": "12.3.4", - "source-map-loader": "^4.0.1", - "typescript": "5.0.4" - } -} \ No newline at end of file diff --git a/pages/_app.tsx b/pages/_app.tsx deleted file mode 100644 index bb822e5..0000000 --- a/pages/_app.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import '../styles/globals.css'; -import type { AppProps } from 'next/app'; -import '@livekit/components-styles'; -import '@livekit/components-styles/prefabs'; -import { DefaultSeo } from 'next-seo'; - -function MyApp({ Component, pageProps }: AppProps) { - return ( - <> - - - - ); -} - -export default MyApp; diff --git a/pages/api/token.ts b/pages/api/token.ts deleted file mode 100644 index c4353b5..0000000 --- a/pages/api/token.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -import { AccessToken } from 'livekit-server-sdk'; -import type { AccessTokenOptions, VideoGrant } from 'livekit-server-sdk'; -import { TokenResult } from '../../lib/types'; - -const apiKey = process.env.LIVEKIT_API_KEY; -const apiSecret = process.env.LIVEKIT_API_SECRET; - -const createToken = (userInfo: AccessTokenOptions, grant: VideoGrant) => { - const at = new AccessToken(apiKey, apiSecret, userInfo); - at.ttl = '5m'; - at.addGrant(grant); - return at.toJwt(); -}; - -const roomPattern = /\w{4}\-\w{4}/; - -export default async function handleToken(req: NextApiRequest, res: NextApiResponse) { - try { - const { roomName, identity, name, metadata } = req.query; - - if (typeof identity !== 'string' || typeof roomName !== 'string') { - res.status(403).end(); - return; - } - - if (Array.isArray(name)) { - throw Error('provide max one name'); - } - if (Array.isArray(metadata)) { - throw Error('provide max one metadata string'); - } - - // enforce room name to be xxxx-xxxx - // this is simple & naive way to prevent user from guessing room names - // please use your own authentication mechanisms in your own app - if (!roomName.match(roomPattern)) { - res.status(400).end(); - return; - } - - // if (!userSession.isAuthenticated) { - // res.status(403).end(); - // return; - // } - - const grant: VideoGrant = { - room: roomName, - roomJoin: true, - canPublish: true, - canPublishData: true, - canSubscribe: true, - }; - - const token = createToken({ identity, name, metadata }, grant); - const result: TokenResult = { - identity, - accessToken: token, - }; - - res.status(200).json(result); - } catch (e) { - res.statusMessage = (e as Error).message; - res.status(500).end(); - } -} diff --git a/pages/api/url.ts b/pages/api/url.ts deleted file mode 100644 index 1fdadd2..0000000 --- a/pages/api/url.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; -import { getLiveKitURL } from '../../lib/server-utils'; - -export default async function handleServerUrl(req: NextApiRequest, res: NextApiResponse) { - try { - const { region } = req.query; - - if (Array.isArray(region)) { - throw Error('provide max one region string'); - } - const url = getLiveKitURL(region); - res.status(200).json({ url }); - } catch (e) { - res.statusMessage = (e as Error).message; - res.status(500).end(); - } -} diff --git a/pages/custom/index.tsx b/pages/custom/index.tsx deleted file mode 100644 index 3ae4ef1..0000000 --- a/pages/custom/index.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { formatChatMessageLinks, LiveKitRoom, VideoConference } from '@livekit/components-react'; -import { LogLevel } from 'livekit-client'; -import { useRouter } from 'next/router'; -import { DebugMode } from '../../lib/Debug'; - -export default function CustomRoomConnection() { - const router = useRouter(); - const { liveKitUrl, token } = router.query; - if (typeof liveKitUrl !== 'string') { - return

Missing LiveKit URL

; - } - if (typeof token !== 'string') { - return

Missing LiveKit token

; - } - - return ( -
- {liveKitUrl && ( - - - - - )} -
- ); -} diff --git a/pages/index.tsx b/pages/index.tsx deleted file mode 100644 index f988333..0000000 --- a/pages/index.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import type { GetServerSideProps, InferGetServerSidePropsType } from 'next'; -import { useRouter } from 'next/router'; -import React, { ReactElement } from 'react'; -import styles from '../styles/Home.module.css'; - -interface TabsProps { - children: ReactElement[]; - selectedIndex?: number; - onTabSelected?: (index: number) => void; -} - -function Tabs(props: TabsProps) { - const activeIndex = props.selectedIndex ?? 0; - if (!props.children) { - return <>; - } - - let tabs = React.Children.map(props.children, (child, index) => { - return ( - - ); - }); - return ( -
-
{tabs}
- {props.children[activeIndex]} -
- ); -} - -function DemoMeetingTab({ label }: { label: string }) { - const router = useRouter(); - const startMeeting = () => { - router.push(`/rooms/${generateRoomId()}`); - }; - return ( -
-

Try LiveKit Meet for free with our live demo project.

- -
- ); -} - -function CustomConnectionTab({ label }: { label: string }) { - const router = useRouter(); - const onSubmit: React.FormEventHandler = (event) => { - event.preventDefault(); - const formData = new FormData(event.target as HTMLFormElement); - const serverUrl = formData.get('serverUrl'); - const token = formData.get('token'); - router.push(`/custom/?liveKitUrl=${serverUrl}&token=${token}`); - }; - return ( -
-

- Connect LiveKit Meet with a custom server using LiveKit Cloud or LiveKit Server. -

- -