allply-react-vnc
Version:
A React Component to connect to a websockified VNC client using noVNC.
220 lines (161 loc) • 7.03 kB
Markdown
[![Issues][issues-shield]][issues-url]
<!-- PROJECT LOGO -->
<br />
<p align="center">
<!-- <a href="https://github.com/roerohan/react-vnc">
<img src="https://project-logo.png" alt="Logo" width="80">
</a> -->
<h3 align="center">react-vnc</h3>
<p align="center">
A React Component to connect to a websockified VNC client using noVNC.
<br />
<a href="https://github.com/roerohan/react-vnc"><strong>Explore the docs »</strong></a>
<br />
<br />
<a href="https://roerohan.github.io/react-vnc/">View Demo</a>
·
<a href="https://github.com/roerohan/react-vnc/issues">Report Bug</a>
·
<a href="https://github.com/roerohan/react-vnc/issues">Request Feature</a>
</p>
</p>
<!-- TABLE OF CONTENTS -->
## Table of Contents
* [About the Project](#about-the-project)
* [Built With](#built-with)
* [Demo](#demo)
* [Getting Started](#getting-started)
* [Prerequisites](#prerequisites)
* [Installation](#installation)
* [Usage](#usage)
* [Roadmap](#roadmap)
* [Contributing](#contributing)
* [License](#license)
* [Contributors](#contributors-)
<!-- ABOUT THE PROJECT -->
## About The Project
[noVNC](https://github.com/novnc/noVNC) is a VNC client web application using which you can view a VNC stream directly on a browser. It uses [websockify](https://github.com/novnc/websockify) to convert the VNC stream into a websocket stream, which can be viewed on a browser. This library provides a `React` component wrapper around the `noVNC` web client.
Using this library, you can easily display a VNC stream on a page of your web application. [Here](#usage) is an example.
### Demo
A demo website using the `react-vnc` library is hosted on [https://roerohan.github.io/react-vnc/](https://roerohan.github.io/react-vnc/). The source for this application can be found in [src/App.tsx](./src/App.tsx).
<img src="./public/demo.png" alt="demo" width="800">
### Built With
* [React](https://reactjs.org)
* [noVNC](https://github.com/novnc/noVNC)
<!-- GETTING STARTED -->
## Getting Started
### Installation
To install the library, you can run the following command:
```bash
npm i react-vnc
```
### Contribution
In order to run the project locally, follow these steps:
1. Clone the repository.
```bash
git clone git@github.com:roerohan/react-vnc.git
cd react-vnc
```
2. Install the packages and submodules.
```bash
npm install
git submodule update --init --recursive
```
3. To run the sample `react-vnc` web application:
```bash
echo "REACT_APP_VNC_URL=ws://your-vnc-url.com" > .env
npm start
```
4. To build the library, make changes inside the `lib` folder, then run:
```bash
npm run build:lib
```
<!-- USAGE EXAMPLES -->
## Usage
A `VncScreen` component is exposed from the library, to which you can pass the required and optional props. For example,
```ts
import React, { useRef } from 'react';
import { VncScreen } from 'react-vnc';
function App() {
const ref = useRef();
return (
<VncScreen
url='ws://your-vnc-url.com'
scaleViewport
background="#000000"
style={{
width: '75vw',
height: '75vh',
}}
ref={ref}
/>
);
}
export default App;
```
The only `required` parameter is `url`, which must be a `ws://` or a `wss://` (websocket) URL for the library to function properly. noVNC can display only websocket URLs. All other props to `VncScreen` are optional. The following is a list (an interface) of all props along with their types.
```ts
interface Props {
url: string;
style?: object;
className?: string;
viewOnly?: boolean;
rfbOptions?: Partial<RFBOptions>;
focusOnClick?: boolean;
clipViewport?: boolean;
dragViewport?: boolean;
scaleViewport?: boolean;
resizeSession?: boolean;
showDotCursor?: boolean;
background?: string;
qualityLevel?: number;
compressionLevel?: number;
autoConnect?: number; // defaults to true
retryDuration?: number; // in milliseconds
debug?: boolean; // show logs in the console
loadingUI?: React.ReactNode; // custom component that is displayed when loading
onConnect?: (rfb?: RFB) => void;
onDisconnect?: (rfb?: RFB) => void;
onCredentialsRequired?: (rfb?: RFB) => void;
onSecurityFailure?: (e?: { detail: { status: number, reason: string } }) => void;
onClipboard?: (e?: { detail: { text: string } }) => void;
onBell?: () => void;
onDesktopName?: (e?: { detail: { name: string } }) => void;
onCapabilities?: (e?: { detail: { capabilities: RFB["capabilities"] } }) => void;
}
// The rfbOptions object in Props is of type Partial<RFBOptions>
interface RFBOptions {
shared: boolean;
credentials: {
username?: string;
password?: string;
target?: string;
};
repeaterID: string;
wsProtocols: string | string[];
}
```
To know more about these props, check out [API.md](https://github.com/novnc/noVNC/blob/master/docs/API.md#properties).
You can pass a `ref` to the `VncScreen` component, and access the `connect()` and `disconnect()` methods from the library. Check out [#18](https://github.com/roerohan/react-vnc/issues/18) for more details.
The `onConnect`, `onDisconnect`, `onCredentialsRequired`, and `onDesktopName` props are optional, and there are existing defaults set for them. For example, the default `onDisconnect` function consists of some logic to retry connecting after a certain timeout (specified by `retryDuration`). Check out the default `_onConnect` and `_onDisconnect` functions in [VncScreen.tsx](./src/lib/VncScreen.tsx) for more details.
The `onConnect`, `onDisconnect`, and `onCredentialsRequired` callbacks can accept a single parameter `rfb`. This parameter is the `RFB` object, which is described by [**noVNC**](https://github.com/novnc/noVNC). Learn more about the `RFB` object [here](https://github.com/novnc/noVNC/blob/master/docs/API.md#rfb).
<!-- ROADMAP -->
## Roadmap
See the [open issues](https://github.com/roerohan/react-vnc/issues) for a list of proposed features (and known issues).
<!-- CONTRIBUTING -->
## Contributing
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.
1. Fork the Project
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
3. Commit your Changes (`git commit -m 'feat: Add some AmazingFeature'`)
4. Push to the Branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
You are requested to follow the contribution guidelines specified in [CONTRIBUTING.md](./CONTRIBUTING.md) while contributing to the project :smile:.
<!-- LICENSE -->
## License
Distributed under the MIT License. See [`LICENSE`](./LICENSE) for more information.
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
[roerohan-url]: https://roerohan.github.io
[issues-shield]: https://img.shields.io/github/issues/roerohan/react-vnc.svg?style=flat-square
[issues-url]: https://github.com/roerohan/react-vnc/issues