Guacamole JavaScript Client
guacamole-common-js is the core JavaScript client library for Apache Guacamole, an open-source, clientless remote desktop gateway. It encapsulates the necessary functionalities to establish and manage remote desktop connections (VNC, RDP, SSH, Telnet) directly within a web browser, communicating with a Guacamole server via an efficient HTTP tunnel. This specific package, currently at version 1.5.0, is a community-maintained fork of the official Guacamole client-side JavaScript, specifically prepared for distribution and consumption through npm. It combines and minifies all relevant JavaScript sources into a single bundle, simplifying integration into modern web projects. While it strives to align its version numbers with the upstream Apache Guacamole project, minor patch versions might append a letter (e.g., `1.0.0-b`) to denote fork-specific fixes or adjustments. The library's primary role is to provide the Guacamole protocol client and abstract drawing layers, enabling interactive remote desktop experiences purely in a browser without requiring dedicated client software.
Common errors
-
TypeError: Cannot read properties of undefined (reading 'Client') / Guacamole is not defined
cause Attempting to access `Guacamole.Client` or other properties when the `Guacamole` object itself is not properly imported or available in the scope.fixEnsure `import Guacamole from 'guacamole-common-js';` (ESM) or `const Guacamole = require('guacamole-common-js');` (CommonJS) is at the top of your file, or that the library's script tag is loaded before your consuming code in a browser environment. -
Failed to load resource: the server responded with a status of 404 (Not Found) for /guacamole/tunnel
cause The Guacamole client failed to connect to the server because the specified tunnel endpoint URL is incorrect or the Guacamole server is not running/configured to serve the tunnel.fixVerify that your Guacamole server is running and accessible, and that the URL provided to `new Guacamole.HTTPTunnel("/guacamole/tunnel")` accurately reflects your server's Guacamole tunnel endpoint.
Warnings
- deprecated The previous npm package `padarom-guacamole-common-js` has been deprecated in favor of `guacamole-common-js`.
- gotcha This npm package is a community-maintained fork and its version numbers, while intended to mirror upstream Apache Guacamole, may have minor discrepancies. Patch versions on npm may include a letter suffix (e.g., `1.0.0-b`) not present in upstream.
- gotcha The GitHub repository for this fork incorrectly displays `glyptodon/guacamole-client` as its origin due to GitHub's limitations. The actual upstream for Guacamole is `apache/guacamole-client`.
- gotcha This library is a pre-bundled JavaScript file. It does not provide individual ES modules or TypeScript definitions for granular imports. All functionalities are exposed through the single `Guacamole` object.
Install
-
npm install guacamole-common-js -
yarn add guacamole-common-js -
pnpm add guacamole-common-js
Imports
- Guacamole
import { Guacamole } from 'guacamole-common-js';import Guacamole from 'guacamole-common-js';
- Guacamole (CommonJS)
const { Guacamole } = require('guacamole-common-js');const Guacamole = require('guacamole-common-js'); - Guacamole global
// Guacamole will be available as a global variable if loaded via a <script> tag // window.Guacamole.Client
Quickstart
import Guacamole from 'guacamole-common-js';
// Assumes a 'display' div exists in your HTML:
// <div id="display"></div>
// Create a Guacamole HTTP tunnel. Replace '/guacamole/tunnel' with your server's tunnel endpoint.
// This is the primary communication mechanism with the Guacamole server.
const tunnel = new Guacamole.HTTPTunnel("/guacamole/tunnel");
// Instantiate the Guacamole client, passing the tunnel
const client = new Guacamole.Client(tunnel);
// Get the display element from the client
const displayElement = client.getDisplay().getElement();
// Append the Guacamole display to your designated HTML element
document.getElementById("display").appendChild(displayElement);
// Handle client state changes (e.g., connection status)
client.onstatechange = function(state) {
if (state === Guacamole.Client.State.DISCONNECTED) {
console.log("Disconnected from Guacamole server.");
} else if (state === Guacamole.Client.State.CONNECTED) {
console.log("Connected to Guacamole server.");
}
};
// Handle errors from the Guacamole client
client.onerror = function(error) {
console.error("Guacamole client error:", error);
alert("Connection error: " + error.message);
};
// Finally, connect to the Guacamole server
client.connect();
// To send user input (keyboard/mouse), you would typically use:
// const keyboard = new Guacamole.Keyboard(document);
// const mouse = new Guacamole.Mouse(displayElement);
// mouse.onmouseup = function(state) { client.sendMouseState(state); };
// keyboard.onkeydown = function(keysym) { client.sendKeyEvent(keysym, true); };