cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
119 lines (118 loc) • 3.61 kB
JavaScript
import RFB from "../../../node_modules/@novnc/novnc/lib/rfb.mjs";
import KeyTable from "../../../node_modules/@novnc/novnc/core/input/keysym.mjs";
import keysyms from "../../../node_modules/@novnc/novnc/core/input/keysymdef.mjs";
import { hasScrollbarGutter } from "../../../node_modules/@novnc/novnc/core/util/browser.mjs";
export { hasScrollbarGutter, isTouchDevice } from "../../../node_modules/@novnc/novnc/core/util/browser.mjs";
import { createAudioElement } from "./dom.mjs";
/*
* vuensee
* @author Anders Evenrud <andersevenrud@gmail.com>
* @link https://github.com/andersevenrud/vuensee
* @license MIT
*/
const events = [
"disconnect",
"connect",
"credentialsrequired",
"securityfailure",
"desktopname",
"bell",
"capabilities",
"clipboard"
];
const scalingModes = [
"off",
"scale",
"remote"
];
const keyMappings = {
esc: [KeyTable.XK_Escape, "Escape"],
tab: [KeyTable.XK_Tab, "Tab"],
ctrl: [KeyTable.XK_Control_L, "ControlLeft"],
alt: [KeyTable.XK_Alt_L, "AltLeft"],
windows: [KeyTable.XK_Super_L, "MetaLeft"],
backspace: [KeyTable.XK_BackSpace, "Backspace"],
enter: [KeyTable.XK_Return, "Enter"]
};
const createBell = (name) => createAudioElement([
["audio/ogg", `${name}.oga`],
["audio/mpeg", `${name}.mp3`]
]);
const detectSettings = (currentSettings, newSettings) => {
const settings = {
...currentSettings,
...newSettings
};
const scaling = settings.scalingMode === "scale";
if (scaling) {
settings.clipToWindow = false;
} else if (!hasScrollbarGutter) {
settings.clipToWindow = true;
}
const { port, ssl } = settings;
const newPort = port === 80 && ssl === true ? 443 : port === 443 && ssl === false ? 80 : void 0;
if (newPort !== void 0) {
settings.port = newPort;
}
return settings;
};
class VuenseeRFB extends RFB {
applySettings(settings, {
dragging = false
} = {}) {
this.clipViewport = settings.clipToWindow;
this.scaleViewport = settings.scalingMode === "scale";
this.resizeSession = settings.scalingMode === "remote";
this.qualityLevel = settings.quality;
this.compressionLevel = settings.compression;
this.showDotCursor = settings.dotCursor;
this.viewOnly = settings = settings.viewOnly;
this.dragViewport = !this.clipViewport && this.dragViewport ? false : dragging;
}
hasPowerCapabilities() {
return this.capabilities.power && !this.viewOnly;
}
sendKeyCommand(name, value = true) {
if (keyMappings[name]) {
const [keysym, code] = keyMappings[name];
this.sendKey(keysym, code, value);
} else {
const keysym = keysyms.lookup(name);
this.sendKey(keysym);
}
}
static connect({
root,
bindings,
options: {
username,
password,
hostname,
path,
port,
ssl,
...settings
}
}) {
const url = `ws${ssl ? "s" : ""}://${hostname}:${port}/${path}`;
const wrapper = (name) => (e) => {
return bindings[name](e);
};
const rfb = new VuenseeRFB(root, url, {
shared: settings.sharedMode,
repeaterID: settings.repeaterId,
credentials: {
username: username || void 0,
password: password || void 0
}
});
const listeners = events.map((name) => [name, wrapper(name)]);
listeners.forEach(([name, cb]) => rfb.addEventListener(name, cb));
rfb.addEventListener("disconnect", () => {
listeners.forEach(([name, cb]) => rfb.removeEventListener(name, cb));
});
rfb.applySettings(settings);
return rfb;
}
}
export { VuenseeRFB, createBell, detectSettings, keyMappings, scalingModes };