UNPKG

@glokon/guacamole-common-js

Version:

Guacamole common js with typescript type definitions

675 lines (614 loc) 27.8 kB
import { Mimetype } from './GuacCommon'; import { Layer } from './Layer'; import { VisibleLayer } from './VisibleLayer'; import { InputStream } from './InputStream'; export {}; export namespace Display { export {}; export type VisibleLayer = typeof VisibleLayer; export class Statistics { /** * The amount of time that the Guacamole client is taking to render * individual frames, in milliseconds, if known. If this value is unknown, * such as if the there are insufficient frame statistics recorded to * calculate this value, this will be null. * * @type {?number} */ processingLag: number | undefined; /** * The framerate of the remote desktop currently being viewed within the * relevant Gucamole.Display, independent of Guacamole, in frames per * second. This represents the speed at which the remote desktop is * producing frame data for the Guacamole server to consume. If this * value is unknown, such as if the remote desktop server does not actually * define frame boundaries, this will be null. * * @type {?number} */ desktopFps: number | undefined; /** * The rate at which the Guacamole server is generating frames for the * Guacamole client to consume, in frames per second. If the Guacamole * server is correctly adjusting for variance in client/browser processing * power, this rate should closely match the client rate, and should remain * independent of any network latency. If this value is unknown, such as if * the there are insufficient frame statistics recorded to calculate this * value, this will be null. * * @type {?number} */ serverFps: number | undefined; /** * The rate at which the Guacamole client is consuming frames generated by * the Guacamole server, in frames per second. If the Guacamole server is * correctly adjusting for variance in client/browser processing power, * this rate should closely match the server rate, regardless of any * latency on the network between the server and client. If this value is * unknown, such as if the there are insufficient frame statistics recorded * to calculate this value, this will be null. * * @type {?number} */ clientFps: number | undefined; /** * The rate at which the Guacamole server is dropping or combining frames * received from the remote desktop server to compensate for variance in * client/browser processing power, in frames per second. This value may * also be non-zero if the server is compensating for variances in its own * processing power, or relative slowness in image compression vs. the rate * that inbound frames are received. If this value is unknown, such as if * the remote desktop server does not actually define frame boundaries, * this will be null. */ dropRate: number | undefined; } } /** * The Guacamole display. The display does not deal with the Guacamole * protocol, and instead implements a set of graphical operations which * embody the set of operations present in the protocol. The order operations * are executed is guaranteed to be in the same order as their corresponding * functions are called. */ export class Display { /** * The X coordinate of the hotspot of the mouse cursor. The hotspot is * the relative location within the image of the mouse cursor at which * each click occurs. */ cursorHotspotX: number; /** * The Y coordinate of the hotspot of the mouse cursor. The hotspot is * the relative location within the image of the mouse cursor at which * each click occurs. */ cursorHotspotY: number; /** * The current X coordinate of the local mouse cursor. This is not * necessarily the location of the actual mouse - it refers only to * the location of the cursor image within the Guacamole display, as * last set by moveCursor(). */ cursorX: number; /** * The current X coordinate of the local mouse cursor. This is not * necessarily the location of the actual mouse - it refers only to * the location of the cursor image within the Guacamole display, as * last set by moveCursor(). */ cursorY: number; /** * The number of milliseconds over which display rendering statistics * should be gathered, dispatching {@link #onstatistics} events as those * statistics are available. If set to zero, no statistics will be * gathered. * * @default 0 * @type {!number} */ statisticWindow: number; /** * Fired when the default layer (and thus the entire Guacamole display) is resized. * @event * @param width The new width of the Guacamole display. * @param height The new height of the Guacamole display. */ onresize: null | ((width: number, height: number) => void); /** * Fired whenever the local cursor image is changed. This can be used to * implement special handling of the client-side cursor, or to override * the default use of a software cursor layer. * @event * @param cursorCanvas The cursor image. * @param x The X-coordinate of the cursor hotspot. * @param y The Y-coordinate of the cursor hotspot. */ oncursor: null | ((cursorCanvas: HTMLCanvasElement, x: number, y: number) => void); /** * Fired whenever performance statistics are available for recently- * rendered frames. This event will fire only if {@link #statisticWindow} * is non-zero. * * @event * @param stats * An object containing general rendering performance statistics for * the remote desktop, Guacamole server, and Guacamole client. */ onstatistics: null | ((stats: Display.Statistics) => void); /** * Returns the element which contains the Guacamole display. */ getElement(): HTMLElement; /** * Returns the width of this display. */ getWidth(): number; /** * Returns the height of this display. */ getHeight(): number; /** * Returns the default layer of this display. Each Guacamole display always * has at least one layer. Other layers can optionally be created within * this layer, but the default layer cannot be removed and is the absolute * ancestor of all other layers. * @return The default layer. */ getDefaultLayer(): VisibleLayer; /** * Returns the cursor layer of this display. Each Guacamole display contains * a layer for the image of the mouse cursor. This layer is a special case * and exists above all other layers, similar to the hardware mouse cursor. * @return The cursor layer. */ getCursorLayer(): VisibleLayer; /** * Creates a new layer. The new layer will be a direct child of the default * layer, but can be moved to be a child of any other layer. Layers returned * by this function are visible. * @return The newly-created layer. */ createLayer(): VisibleLayer; /** * Creates a new buffer. Buffers are invisible, off-screen surfaces. They * are implemented in the same manner as layers, but do not provide the * same nesting semantics. * @return The newly-created buffer. */ createBuffer(): Layer; /** * Flush all pending draw tasks, if possible, as a new frame. If the entire * frame is not ready, the flush will wait until all required tasks are unblocked. * @param callback The function to call when this frame is * flushed. This may happen immediately, or * later when blocked tasks become unblocked. */ flush(callback: () => void): void; /** * Cancels rendering of all pending frames and associated rendering * operations. The callbacks provided to outstanding past calls to flush(), * if any, are not invoked. */ cancel(): void; /** * Sets the hotspot and image of the mouse cursor displayed within the * Guacamole display. * @param hotspotX The X coordinate of the cursor hotspot. * @param hotspotY The Y coordinate of the cursor hotspot. * @param layer The source layer containing the data which should be used as the mouse cursor image. * @param srcx The X coordinate of the upper-left corner of the * rectangle within the source layer's coordinate space to copy data from. * @param srcy The Y coordinate of the upper-left corner of the * rectangle within the source layer's coordinate space to copy data from. * @param srcw The width of the rectangle within the source layer's coordinate space to copy data from. * @param srch The height of the rectangle within the source layer's coordinate space to copy data from. */ setCursor( hotspotX: number, hotspotY: number, layer: Layer, srcx: number, srcy: number, srcw: number, srch: number, ): void; /** * Sets whether the software-rendered cursor is shown. This cursor differs * from the hardware cursor in that it is built into the Guacamole.Display, * and relies on its own Guacamole layer to render. * @param [shown=true] Whether to show the software cursor. */ showCursor(shown: boolean): void; /** * Sets the location of the local cursor to the given coordinates. For the * sake of responsiveness, this function performs its action immediately. * Cursor motion is not maintained within atomic frames. * @param x The X coordinate to move the cursor to. * @param y The Y coordinate to move the cursor to. */ moveCursor(x: number, y: number): void; /** * Changes the size of the given Layer to the given width and height. * Resizing is only attempted if the new size provided is actually different * from the current size. * @param layer The layer to resize. * @param width The new width. * @param height The new height. */ resize(layer: Layer, width: number, height: number): void; /** * Draws the specified image at the given coordinates. The image specified * must already be loaded. * @param layer The layer to draw upon. * @param x The destination X coordinate. * @param y The destination Y coordinate. * @param image The image to draw. Note that this is an Image object - not a URL. */ drawImage(layer: Layer, x: number, y: number, image: HTMLImageElement): void; /** * Draws the image contained within the specified Blob at the given * coordinates. The Blob specified must already be populated with image data. * @param layer The layer to draw upon. * @param x The destination X coordinate. * @param y The destination Y coordinate. * @param blob The Blob containing the image data to draw. */ drawBlob(layer: Layer, x: number, y: number, blob: Blob): void; /** * Draws the image within the given stream at the given coordinates. The * image will be loaded automatically, and this and any future operations * will wait for the image to finish loading. This function will * automatically choose an appropriate method for reading and decoding the * given image stream, and should be preferred for received streams except * where manual decoding of the stream is unavoidable. * * @param layer * The layer to draw upon. * * @param x * The destination X coordinate. * * @param y * The destination Y coordinate. * * @param stream * The stream along which image data will be received. * * @param mimetype * The mimetype of the image within the stream. */ drawStream(layer: Layer, x: number, y: number, stream: InputStream, mimetype: Mimetype): void; /** * Draws the image at the specified URL at the given coordinates. The image * will be loaded automatically, and this and any future operations will * wait for the image to finish loading. * @param layer The layer to draw upon. * @param x The destination X coordinate. * @param y The destination Y coordinate. * @param url The URL of the image to draw. */ draw(layer: Layer, x: number, y: number, url: string): void; /** * Plays the video at the specified URL within this layer. The video * will be loaded automatically, and this and any future operations will * wait for the video to finish loading. Future operations will not be * executed until the video finishes playing. * @param layer The layer to draw upon. * @param mimetype The mimetype of the video to play. * @param duration The duration of the video in milliseconds. * @param url The URL of the video to play. */ play(layer: Layer, mimetype: Mimetype, duration: number, url: string): void; /** * Transfer a rectangle of image data from one Layer to this Layer using the * specified transfer function. * @param srcLayer The Layer to copy image data from. * @param srcx The X coordinate of the upper-left corner of the * rectangle within the source Layer's coordinate space to copy data from. * @param srcy The Y coordinate of the upper-left corner of the * rectangle within the source Layer's coordinate space to copy data from. * @param srcw The width of the rectangle within the source Layer's * coordinate space to copy data from. * @param srch The height of the rectangle within the source * Layer's coordinate space to copy data from. * @param dstLayer The layer to draw upon. * @param x The destination X coordinate. * @param y The destination Y coordinate. * @param transferFunction The transfer function to use to * transfer data from source to destination. */ transfer( srcLayer: Layer, srcx: number, srcy: number, srcw: number, srch: number, dstLayer: Layer, x: number, y: number, transferFunction: (srcPixel: Layer.Pixel, dstPixel: Layer.Pixel) => void, ): void; /** * Put a rectangle of image data from one Layer to this Layer directly * without performing any alpha blending. Simply copy the data. * @param srcLayer The Layer to copy image data from. * @param srcx The X coordinate of the upper-left corner of the * rectangle within the source Layer's coordinate space to copy data from. * @param srcy The Y coordinate of the upper-left corner of the * rectangle within the source Layer's coordinate space to copy data from. * @param srcw The width of the rectangle within the source Layer's * coordinate space to copy data from. * @param srch The height of the rectangle within the source * Layer's coordinate space to copy data from. * @param dstLayer The layer to draw upon. * @param x The destination X coordinate. * @param y The destination Y coordinate. */ put( srcLayer: Layer, srcx: number, srcy: number, srcw: number, srch: number, dstLayer: Layer, x: number, y: number, ): void; /** * Copy a rectangle of image data from one Layer to this Layer. This * operation will copy exactly the image data that will be drawn once all * operations of the source Layer that were pending at the time this * function was called are complete. This operation will not alter the * size of the source Layer even if its autosize property is set to true. * @param srcLayer The Layer to copy image data from. * @param srcx The X coordinate of the upper-left corner of the * rectangle within the source Layer's coordinate space to copy data from. * @param srcy The Y coordinate of the upper-left corner of the * rectangle within the source Layer's coordinate space to copy data from. * @param srcw The width of the rectangle within the source Layer's * coordinate space to copy data from. * @param srch The height of the rectangle within the source * Layer's coordinate space to copy data from. * @param dstLayer The layer to draw upon. * @param x The destination X coordinate. * @param y The destination Y coordinate. */ copy( srcLayer: Layer, srcx: number, srcy: number, srcw: number, srch: number, dstLayer: Layer, x: number, y: number, ): void; /** * Add the specified line to the current path. * @param layer The layer to draw upon. * @param x The X coordinate of the endpoint of the line to draw. * @param y The Y coordinate of the endpoint of the line to draw. */ lineTo(layer: Layer, x: number, y: number): void; /** * Add the specified arc to the current path. * @param layer The layer to draw upon. * @param x The X coordinate of the center of the circle which will contain the arc. * @param y The Y coordinate of the center of the circle which will contain the arc. * @param radius The radius of the circle. * @param startAngle The starting angle of the arc, in radians. * @param endAngle The ending angle of the arc, in radians. * @param negative Whether the arc should be drawn in order of decreasing angle. */ arc( layer: Layer, x: number, y: number, radius: number, startAngle: number, endAngle: number, negative: boolean, ): void; /** * Starts a new path at the specified point. * @param layer The layer to draw upon. * @param cp1x The X coordinate of the first control point. * @param cp1y The Y coordinate of the first control point. * @param cp2x The X coordinate of the second control point. * @param cp2y The Y coordinate of the second control point. * @param x The X coordinate of the endpoint of the curve. * @param y The Y coordinate of the endpoint of the curve. */ curveTo(layer: Layer, cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void; /** * Closes the current path by connecting the end point with the start point (if any) with a straight line. * @param layer The layer to draw upon. */ close(layer: Layer): void; /** * Add the specified rectangle to the current path. * @param layer The layer to draw upon. * @param x The X coordinate of the upper-left corner of the rectangle to draw. * @param y The Y coordinate of the upper-left corner of the rectangle to draw. * @param w The width of the rectangle to draw. * @param h The height of the rectangle to draw. */ rect(layer: Layer, x: number, y: number, w: number, h: number): void; /** * Clip all future drawing operations by the current path. The current path * is implicitly closed. The current path can continue to be reused * for other operations (such as fillColor()) but a new path will be started * once a path drawing operation (path() or rect()) is used. * @param layer The layer to affect. */ clip(layer: Layer): void; /** * Stroke the current path with the specified color. The current path * is implicitly closed. The current path can continue to be reused * for other operations (such as clip()) but a new path will be started * once a path drawing operation (path() or rect()) is used. * @param layer The layer to draw upon. * @param cap The line cap style. Can be "round", "square", or "butt". * @param join The line join style. Can be "round", "bevel", or "miter". * @param thickness The line thickness in pixels. * @param r The red component of the color to fill. * @param g The green component of the color to fill. * @param b The blue component of the color to fill. * @param a The alpha component of the color to fill. */ strokeColor( layer: Layer, cap: Layer.LineCap, join: Layer.LineJoin, thickness: number, r: number, g: number, b: number, a: number, ): void; /** * Fills the current path with the specified color. The current path * is implicitly closed. The current path can continue to be reused * for other operations (such as clip()) but a new path will be started * once a path drawing operation (path() or rect()) is used. * @param layer The layer to draw upon. * @param r The red component of the color to fill. * @param g The green component of the color to fill. * @param b The blue component of the color to fill. * @param a The alpha component of the color to fill. */ fillColor(layer: Layer, r: number, g: number, b: number, a: number): void; /** * Stroke the current path with the image within the specified layer. The * image data will be tiled infinitely within the stroke. The current path * is implicitly closed. The current path can continue to be reused * for other operations (such as clip()) but a new path will be started * once a path drawing operation (path() or rect()) is used. * @param layer The layer to draw upon. * @param cap The line cap style. Can be "round", "square", or "butt". * @param join The line join style. Can be "round", "bevel", or "miter". * @param thickness The line thickness in pixels. * @param srcLayer The layer to use as a repeating pattern within the stroke. */ strokeLayer(layer: Layer, cap: Layer.LineCap, join: Layer.LineJoin, thickness: number, srcLayer: Layer): void; /** * Fills the current path with the image within the specified layer. The * image data will be tiled infinitely within the stroke. The current path * is implicitly closed. The current path can continue to be reused * for other operations (such as clip()) but a new path will be started * once a path drawing operation (path() or rect()) is used. * @param layer The layer to draw upon. * @param srcLayer The layer to use as a repeating pattern within the fill. */ fillLayer(layer: Layer, srcLayer: Layer): void; /** * Push current layer state onto stack. * @param layer The layer to draw upon. */ push(layer: Layer): void; /** * Pop layer state off stack. * @param layer The layer to draw upon. */ pop(layer: Layer): void; /** * Reset the layer, clearing the stack, the current path, and any transform matrix. * @param layer The layer to draw upon. */ reset(layer: Layer): void; /** * Sets the given affine transform (defined with six values from the transform's matrix). * @param layer The layer to modify. * @param a The first value in the affine transform's matrix. * @param b The second value in the affine transform's matrix. * @param c The third value in the affine transform's matrix. * @param d The fourth value in the affine transform's matrix. * @param e The fifth value in the affine transform's matrix. * @param f The sixth value in the affine transform's matrix. */ setTransform(layer: Layer, a: number, b: number, c: number, d: number, e: number, f: number): void; /** * Applies the given affine transform (defined with six values from the transform's matrix). * @param layer The layer to modify. * @param a The first value in the affine transform's matrix. * @param b The second value in the affine transform's matrix. * @param c The third value in the affine transform's matrix. * @param d The fourth value in the affine transform's matrix. * @param e The fifth value in the affine transform's matrix. * @param f The sixth value in the affine transform's matrix. */ transform(layer: Layer, a: number, b: number, c: number, d: number, e: number, f: number): void; /** * Sets the channel mask for future operations on this Layer. * The channel mask is a Guacamole-specific compositing operation identifier * with a single bit representing each of four channels (in order): source * image where destination transparent, source where destination opaque, * destination where source transparent, and destination where source opaque. * @param layer The layer to modify. * @param mask The channel mask for future operations on this Layer. */ setChannelMask(layer: Layer, mask: number): void; /** * Sets the miter limit for stroke operations using the miter join. This * limit is the maximum ratio of the size of the miter join to the stroke * width. If this ratio is exceeded, the miter will not be drawn for that * joint of the path. * @param layer The layer to modify. * @param limit The miter limit for stroke operations using the miter join. */ setMiterLimit(layer: Layer, limit: number): void; /** * Removes the given layer container entirely, such that it is no longer * contained within its parent layer, if any. * @param layer The layer being removed from its parent. */ dispose(layer: VisibleLayer): void; /** * Applies the given affine transform (defined with six values from the * transform's matrix) to the given layer. * @param layer The layer being distorted. * @param a The first value in the affine transform's matrix. * @param b The second value in the affine transform's matrix. * @param c The third value in the affine transform's matrix. * @param d The fourth value in the affine transform's matrix. * @param e The fifth value in the affine transform's matrix. * @param f The sixth value in the affine transform's matrix. */ distort(layer: VisibleLayer, a: number, b: number, c: number, d: number, e: number, f: number): void; /** * Moves the upper-left corner of the given layer to the given X and Y * coordinate, sets the Z stacking order, and reparents the layer * to the given parent layer. * @param layer The layer being moved. * @param parent The parent to set. * @param x The X coordinate to move to. * @param y The Y coordinate to move to. * @param z The Z coordinate to move to. */ move(layer: VisibleLayer, parent: VisibleLayer, x: number, y: number, z: number): void; /** * Sets the opacity of the given layer to the given value, where 255 is * fully opaque and 0 is fully transparent. * @param layer The layer whose opacity should be set. * @param alpha The opacity to set. */ shade(layer: VisibleLayer, alpha: number): void; /** * Sets the scale of the client display element such that it renders at * a relatively smaller or larger size, without affecting the true * resolution of the display. * @param scale The scale to resize to, where 1.0 is normal size (1:1 scale). */ scale(scale: number): void; /** * Returns the scale of the display. */ getScale(): number; /** * Returns a canvas element containing the entire display, with all child * layers composited within. * @return A new canvas element containing a copy of the display. */ flatten(): HTMLCanvasElement; }