UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

119 lines (118 loc) 3.61 kB
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 };