Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/pjchender/react-use-opentok
React Hook for conveniently use @opentok/client SDK.
https://github.com/pjchender/react-use-opentok
Last synced: 3 months ago
JSON representation
React Hook for conveniently use @opentok/client SDK.
- Host: GitHub
- URL: https://github.com/pjchender/react-use-opentok
- Owner: pjchender
- License: mit
- Archived: true
- Created: 2020-01-17T07:13:21.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2022-06-11T10:24:14.000Z (over 2 years ago)
- Last Synced: 2024-11-01T07:17:38.925Z (4 months ago)
- Language: JavaScript
- Homepage: https://pjchender.github.io/react-use-opentok/
- Size: 6.34 MB
- Stars: 28
- Watchers: 3
- Forks: 13
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-github-repos - pjchender/react-use-opentok - React Hook for conveniently use @opentok/client SDK. (JavaScript)
README
# react-use-opentok
[![Build status](https://badgen.net/travis/pjchender/react-use-opentok)](https://travis-ci.com/pjchender/react-use-opentok)
[![version](https://img.shields.io/npm/v/react-use-opentok.svg)](https://www.npmjs.com/package/react-use-opentok)
[![Coverage Status](https://coveralls.io/repos/github/pjchender/react-use-opentok/badge.svg?branch=master)](https://coveralls.io/github/pjchender/react-use-opentok?branch=master)
[![license](https://img.shields.io/github/license/pjchender/react-use-opentok.svg)](https://github.com/pjchender/react-use-opentok/blob/master/LICENSE)
[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg)](#contributors)React Hook for conveniently use @opentok/client SDK.
## Pre-requirement
* Register [Opentok](https://id.tokbox.com/login) to get authentication.
## Demo
See our demo site: [react-use-opentok](https://pjchender.github.io/react-use-opentok/)
![react-use-opentok](https://i.imgur.com/mpmlkrI.gif)
## Installation
Install it with npm:
```
npm i @opentok/[email protected] react-use-opentok
```Or with yarn:
```
yarn add @opentok/[email protected] react-use-opentok
```> NOTE: remember to install the peer dependency of [@opentok/client](https://www.npmjs.com/package/@opentok/client)
## Getting Started
1. Get utilities from `useOpenTok` hook
2. Fetch `apiKey`, `sessionId`, and `token` from server
3. Connect to session with `token````js
import React, { useEffect } from 'react';
import useOpenTok from 'react-use-opentok';const Component = () => {
// STEP 1: get utilities from useOpenTok;
const [opentokProps, opentokMethods] = useOpenTok();const {
// connection info
isSessionInitialized,
connectionId,
isSessionConnected,// connected data
session,
connections,
streams,
subscribers,
publisher,
} = opentokProps;const {
initSessionAndConnect,
disconnectSession,
publish,
unpublish,
subscribe,
unsubscribe,
sendSignal,
} = opentokMethods;// STEP 2: Mockup fetching apiKey, sessionId, and token from server
useEffect(() => {
fetch('').then(
({ apiKey, sessionId, token }) => {
initSessionAndConnect({
apiKey,
sessionId,
token,
});
}
);
}, [initSessionAndConnect]);return
...;
};export default Component;
```## Guide
### Get all utilities from useOpenTok Hook
You can get all utilities from `useOpenTok` hook.
```js
const [opentokProps, opentokMethods] = useOpenTok();const {
// connection info
isSessionInitialized,
connectionId,
isSessionConnected,// connected data
session,
connections,
streams,
subscribers,
publisher,
} = opentokProps;const {
initSessionAndConnect,
disconnectSession,
publish,
unpublish,
subscribe,
unsubscribe,
sendSignal,
} = opentokMethods;
```### Connect and disconnect to session
Before starting use openTok session object, remember to initialize session with `apiKey` and `sessionId` by `initSessionAndConnect` method:
```js
const [opentokProps, opentokMethods] = useOpenTok();
const { initSessionAndConnect } = opentokMethods;// apiKey, sessionId, and token could get from your server or tokbox dashboard
initSessionAndConnect({
apiKey,
sessionId,
token,
});
```
This methods will first initialize the session object, and continue connected to the session.After session initialized, the value of `isSessionInitialized` will be `true.
After connect to session, you can get the `session`, `connectionId` , `isSessionConnected`, and `connections` properties from `opentokProps`:
- `session`: a session object from [`OT.initSession()`](https://tokbox.com/developer/sdks/js/reference/OT.html#initSession)
- `connectionId`: your own connectionId
- `isSessionConnected`: whether you are connected to the session
- `connections`: all connections in the session```js
const [opentokProps, opentokMethods] = useOpenTok();
const { session, connectionId, isSessionConnected, connections } = opentokProps;
```By `disconnectSession`, you can disconnect from the session:
```js
const [opentokProps, opentokMethods] = useOpenTok();
const { disconnectSession } = opentokMethods;disconnectSession();
```> If you want to control the process of session initialization and connect to session on your own, check the method `initSession({ apiKey, sessionId, sessionOptions })` and `connectSession({token, sessionToConnect })`.
### Publish and unpublished stream to the session
You can publish stream from camera or screen to session through the `publish` method.
- `name`: should be unique every time you invoke publish method which is for `unpublish` stream later.
- `element`: should be a DOM element or the `id` attribute of the existing DOM element.
- `options`: (optional) other optional properties which will pass into [OT.initPublisher](https://tokbox.com/developer/sdks/js/reference/OT.html#initPublisher).```js
const [opentokProps, opentokMethods] = useOpenTok();
const { publish } = opentokMethods;// publish stream from the camera
publish({
name: 'camera',
element: 'camera',
});// publish stream from screen sharing
publish({
name: 'screen',
element: 'screen',
options: {
insertMode: 'append',
width: '100%',
height: '100%',
videoSource: 'screen',
},
});// publish support Promise way to catch errors
publish({
name: 'camera',
element: 'camera',
}).catch((ex) => {
console.log(ex);
});
```According to the `name` you publish, you could use the same name to unpublish it:
```js
const [opentokProps, opentokMethods] = useOpenTok();
const { unpublish } = opentokMethods;// unpublish stream from the name 'camera'
unpublish({ name: 'camera' }
```### Subscribe and Unsubscribe
You can get all streams in the session through `streams` property in `opentokProps`. After finding the stream for subscribing, use the `subscribe` method to subscribe to the stream:
- `stream`: the Stream Object wanted to subscribe
- `element`: should be a DOM element or the `id` attribute of the existing DOM element.```js
const [opentokProps, opentokMethods] = useOpenTok();
const { streams } = opentokProps;
const { subscribe } = opentokMethods;const streamToSubscribe = streams[0];
subscribe({ stream: streamToSubscribe, element: 'subscriber' });
```For each stream be subscribed, a [subscriber object](https://tokbox.com/developer/sdks/js/reference/Session.html#subscribe) will be created and save as `subscribers` in `opentokProps`:
```js
const [opentokProps, opentokMethods] = useOpenTok();
const { streams, subscribers } = opentokProps;
```You can stop subscribing the stream with `unsubscribe` method:
```js
const [opentokProps, opentokMethods] = useOpenTok();
const { unsubscribe } = opentokMethods;const streamToUnsubscribe = streams[0];
unsubscribe({ stream: streamToUnsubscribe });
```### Send signal
You can send signal in session with `sendSignal` method:
```js
const [opentokProps, opentokMethods] = useOpenTok();
const { sendSignal } = opentokMethods;sendSignal({
type: 'foo',
data: 'bar',
});
```### Register session events
You could register all valid [session events](https://tokbox.com/developer/sdks/js/reference/Session.html#events) on `session` object. Take registering signal event, as an example, use the `session` object in `opentokProps`, register the session event with `on`, and unregister the event with `off`:
```js
const [opentokProps, opentokMethods] = useOpenTok();
const { session } = opentokProps;const handleSignal = useCallback(e => {
console.log('handleSignal', e);
}, []);useEffect(() => {
if (!isSessionConnected) {
return;
}session.on('signal', handleSignal);
return () => {
session.off('signal', handleSignal);
};
}, [handleSignal, isSessionConnected, session]);
```> NOTICE: for `sessionDisconnected` event, you can you `session.once('sessionDisconnected', )`
### (Optional) Preview Solution
You may want to split `OT.initPublisher` and `session.publish` and invoke it in different stage. To solve the requirement you can use `initPublisher` and `publishPublisher` instead. If you need to cancel preview you can use `removePublisher` as well.
NOTE:
* `initPublisher` - Same with `OT.initPublisher` but support state which means you can access `publisher`.
* `removePublisher` - The method can only remove `publisher` without publish. Once you publish the `publisher` you should use `unpublish` instead.
* `publishPublisher` - Publish for `initPublisher`.`initPublisher` + `publishPublisher` = `publish`
For example:
```js
const Component = () => {
const [opentokProps, opentokMethods] = useOpenTok();const {
initPublisher,
publishPublisher,
removePublisher,
} = opentokMethods;// ...
const onInitPublisher = () => {
initPublisher({
name: 'guest',
element: 'guest',
options: {
insertMode: 'append',
width: '480px',
height: '360px',
},
});
};
const onPublishPublisher = () => {
publishPublisher({
name: 'guest',
});
};
const onRemovePublisher = () => {
removePublisher({
name: 'guest',
});
};return (
Init Publisher without publish
Remove Publisher before publish
Publish Publisher
);
}
```## Development
### for react-use-opentok package
```sh
$ npm install
$ npm start # rollup will watch the files change
$ npm build # rollup will build the package
$ npm test
```### for example site
```sh
$ cd site
$ npm install
$ npm start # start gatsby develop server
```## Contributors
Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)):
andyyou
💻 🎨 💡 🚧 🤔 👀
PJCHENder
💻 📖 ⚠️ 💡 🚧 👀
Maximillian Rink
💻
This project follows the [all-contributors](https://allcontributors.org/) specification. Contributions of any kind welcome!
## LICENSE
[MIT](https://github.com/pjchender/react-use-opentok/blob/master/LICENSE)