interaction-system 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/TypedEmitter.d.ts +20 -0
- package/dist/common/TypedEmitter.d.ts.map +1 -0
- package/dist/index.cjs.js +17 -15
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +17 -15
- package/dist/index.es.js.map +1 -1
- package/dist/input/KeyInputHandler.d.ts.map +1 -1
- package/dist/interaction/FeaturedInteractionHandler.d.ts.map +1 -1
- package/dist/interaction/InteractionHandler.d.ts.map +1 -1
- package/dist/messages/KeyCodeControlMessage.d.ts.map +1 -1
- package/dist/messages/ScrollControlMessage.d.ts.map +1 -1
- package/dist/messages/TouchControlMessage.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/models/MotionEvent.ts","../src/messages/ControlMessage.ts","../src/messages/TouchControlMessage.ts","../src/models/Size.ts","../src/models/Point.ts","../src/models/Position.ts","../src/utils/Util.ts","../src/interaction/InteractionHandler.ts","../src/messages/ScrollControlMessage.ts","../src/interaction/FeaturedInteractionHandler.ts","../src/interaction/SimpleInteractionHandler.ts","../src/messages/KeyCodeControlMessage.ts","../src/messages/TextControlMessage.ts","../src/messages/CommandControlMessage.ts","../src/input/KeyEvent.ts","../src/input/UIEventsCode.ts","../src/input/KeyToCodeMap.ts","../src/input/KeyInputHandler.ts","../src/models/Rect.ts","../src/models/ScreenInfo.ts"],"sourcesContent":["export default class MotionEvent {\r\n public static ACTION_DOWN = 0;\r\n public static ACTION_UP = 1;\r\n public static ACTION_MOVE = 2;\r\n /**\r\n * Button constant: Primary button (left mouse button).\r\n */\r\n public static BUTTON_PRIMARY: number = 1 << 0;\r\n\r\n /**\r\n * Button constant: Secondary button (right mouse button).\r\n */\r\n public static BUTTON_SECONDARY: number = 1 << 1;\r\n\r\n /**\r\n * Button constant: Tertiary button (middle mouse button).\r\n */\r\n public static BUTTON_TERTIARY: number = 1 << 2;\r\n}\r\n\r\n","export interface ControlMessageInterface {\r\n type: number;\r\n}\r\n\r\nexport class ControlMessage {\r\n public static TYPE_KEYCODE = 0;\r\n public static TYPE_TEXT = 1;\r\n public static TYPE_TOUCH = 2;\r\n public static TYPE_SCROLL = 3;\r\n public static TYPE_BACK_OR_SCREEN_ON = 4;\r\n public static TYPE_EXPAND_NOTIFICATION_PANEL = 5;\r\n public static TYPE_EXPAND_SETTINGS_PANEL = 6;\r\n public static TYPE_COLLAPSE_PANELS = 7;\r\n public static TYPE_GET_CLIPBOARD = 8;\r\n public static TYPE_SET_CLIPBOARD = 9;\r\n public static TYPE_SET_SCREEN_POWER_MODE = 10;\r\n public static TYPE_ROTATE_DEVICE = 11;\r\n public static TYPE_CHANGE_STREAM_PARAMETERS = 101;\r\n public static TYPE_PUSH_FILE = 102;\r\n\r\n constructor(readonly type: number) {}\r\n\r\n public toBuffer(): Buffer {\r\n throw Error('Not implemented');\r\n }\r\n\r\n public toString(): string {\r\n return 'ControlMessage';\r\n }\r\n\r\n public toJSON(): ControlMessageInterface {\r\n return {\r\n type: this.type,\r\n };\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage, ControlMessageInterface } from './ControlMessage';\r\nimport Position, { PositionInterface } from '../models/Position';\r\n\r\nexport interface TouchControlMessageInterface extends ControlMessageInterface {\r\n type: number;\r\n action: number;\r\n pointerId: number;\r\n position: PositionInterface;\r\n pressure: number;\r\n buttons: number;\r\n}\r\n\r\nexport class TouchControlMessage extends ControlMessage {\r\n public static PAYLOAD_LENGTH = 28;\r\n /**\r\n * - For a touch screen or touch pad, reports the approximate pressure\r\n * applied to the surface by a finger or other tool. The value is\r\n * normalized to a range from 0 (no pressure at all) to 1 (normal pressure),\r\n * although values higher than 1 may be generated depending on the\r\n * calibration of the input device.\r\n * - For a trackball, the value is set to 1 if the trackball button is pressed\r\n * or 0 otherwise.\r\n * - For a mouse, the value is set to 1 if the primary mouse button is pressed\r\n * or 0 otherwise.\r\n *\r\n * - scrcpy server expects signed short (2 bytes) for a pressure value\r\n * - in browser TouchEvent has `force` property (values in 0..1 range), we\r\n * use it as \"pressure\" for scrcpy\r\n */\r\n public static readonly MAX_PRESSURE_VALUE = 0xffff;\r\n\r\n constructor(\r\n readonly action: number,\r\n readonly pointerId: number,\r\n readonly position: Position,\r\n readonly pressure: number,\r\n readonly buttons: number,\r\n ) {\r\n super(ControlMessage.TYPE_TOUCH);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n const buffer: Buffer = Buffer.alloc(TouchControlMessage.PAYLOAD_LENGTH + 1);\r\n let offset = 0;\r\n offset = buffer.writeUInt8(this.type, offset);\r\n offset = buffer.writeUInt8(this.action, offset);\r\n offset = buffer.writeUInt32BE(0, offset); // pointerId is `long` (8 bytes) on java side\r\n offset = buffer.writeUInt32BE(this.pointerId, offset);\r\n offset = buffer.writeUInt32BE(this.position.point.x, offset);\r\n offset = buffer.writeUInt32BE(this.position.point.y, offset);\r\n offset = buffer.writeUInt16BE(this.position.screenSize.width, offset);\r\n offset = buffer.writeUInt16BE(this.position.screenSize.height, offset);\r\n offset = buffer.writeUInt16BE(this.pressure * TouchControlMessage.MAX_PRESSURE_VALUE, offset);\r\n buffer.writeUInt32BE(this.buttons, offset);\r\n return buffer;\r\n }\r\n\r\n public toString(): string {\r\n return `TouchControlMessage{action=${this.action}, pointerId=${this.pointerId}, position=${this.position}, pressure=${this.pressure}, buttons=${this.buttons}}`;\r\n }\r\n\r\n public toJSON(): TouchControlMessageInterface {\r\n return {\r\n type: this.type,\r\n action: this.action,\r\n pointerId: this.pointerId,\r\n position: this.position.toJSON(),\r\n pressure: this.pressure,\r\n buttons: this.buttons,\r\n };\r\n }\r\n}\r\n\r\n","export interface SizeInterface {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport default class Size {\r\n public readonly w: number;\r\n public readonly h: number;\r\n\r\n constructor(readonly width: number, readonly height: number) {\r\n this.w = width;\r\n this.h = height;\r\n }\r\n\r\n public static equals(a?: Size | null, b?: Size | null): boolean {\r\n if (!a && !b) {\r\n return true;\r\n }\r\n return !!a && !!b && a.equals(b);\r\n }\r\n\r\n public static copy(a?: Size | null): Size | null {\r\n if (!a) {\r\n return null;\r\n }\r\n return new Size(a.width, a.height);\r\n }\r\n\r\n length(): number {\r\n return this.w * this.h;\r\n }\r\n\r\n public rotate(): Size {\r\n return new Size(this.height, this.width);\r\n }\r\n\r\n public equals(o: Size | null | undefined): boolean {\r\n if (this === o) {\r\n return true;\r\n }\r\n if (!o) {\r\n return false;\r\n }\r\n return this.width === o.width && this.height === o.height;\r\n }\r\n\r\n public intersect(o: Size | undefined | null): Size {\r\n if (!o) {\r\n return this;\r\n }\r\n const minH = Math.min(this.height, o.height);\r\n const minW = Math.min(this.width, o.width);\r\n return new Size(minW, minH);\r\n }\r\n\r\n public getHalfSize(): Size {\r\n return new Size(this.width >>> 1, this.height >>> 1);\r\n }\r\n\r\n public toString(): string {\r\n return `Size{width=${this.width}, height=${this.height}}`;\r\n }\r\n\r\n public toJSON(): SizeInterface {\r\n return {\r\n width: this.width,\r\n height: this.height,\r\n };\r\n }\r\n}\r\n\r\n","export interface PointInterface {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport default class Point {\r\n readonly x: number;\r\n readonly y: number;\r\n constructor(x: number, y: number) {\r\n this.x = Math.round(x);\r\n this.y = Math.round(y);\r\n }\r\n\r\n public equals(o: Point): boolean {\r\n if (this === o) {\r\n return true;\r\n }\r\n if (o === null) {\r\n return false;\r\n }\r\n return this.x === o.x && this.y === o.y;\r\n }\r\n\r\n public distance(to: Point): number {\r\n const x = this.x - to.x;\r\n const y = this.y - to.y;\r\n return Math.sqrt(x * x + y * y);\r\n }\r\n\r\n public toString(): string {\r\n return `Point{x=${this.x}, y=${this.y}}`;\r\n }\r\n\r\n public toJSON(): PointInterface {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n };\r\n }\r\n}\r\n\r\n","import Point, { PointInterface } from './Point';\r\nimport Size, { SizeInterface } from './Size';\r\n\r\nexport interface PositionInterface {\r\n point: PointInterface;\r\n screenSize: SizeInterface;\r\n}\r\n\r\nexport default class Position {\r\n public constructor(readonly point: Point, readonly screenSize: Size) {}\r\n\r\n public equals(o: Position): boolean {\r\n if (this === o) {\r\n return true;\r\n }\r\n if (o === null) {\r\n return false;\r\n }\r\n\r\n return this.point.equals(o.point) && this.screenSize.equals(o.screenSize);\r\n }\r\n\r\n public rotate(rotation: number): Position {\r\n switch (rotation) {\r\n case 1:\r\n return new Position(\r\n new Point(this.screenSize.height - this.point.y, this.point.x),\r\n this.screenSize.rotate(),\r\n );\r\n case 2:\r\n return new Position(\r\n new Point(this.screenSize.width - this.point.x, this.screenSize.height - this.point.y),\r\n this.screenSize,\r\n );\r\n case 3:\r\n return new Position(\r\n new Point(this.point.y, this.screenSize.width - this.point.x),\r\n this.screenSize.rotate(),\r\n );\r\n default:\r\n return this;\r\n }\r\n }\r\n\r\n public toString(): string {\r\n return `Position{point=${this.point}, screenSize=${this.screenSize}}`;\r\n }\r\n\r\n public toJSON(): PositionInterface {\r\n return {\r\n point: this.point.toJSON(),\r\n screenSize: this.screenSize.toJSON(),\r\n };\r\n }\r\n}\r\n\r\n","/**\r\n * 工具函数类\r\n * 提供交互系统所需的辅助功能\r\n */\r\nexport default class Util {\r\n private static supportsPassiveValue: boolean | undefined;\r\n\r\n /**\r\n * 将字符串转换为 UTF-8 字节数组\r\n * @param str 待转换的字符串\r\n * @returns UTF-8 字节数组\r\n */\r\n static stringToUtf8ByteArray = function(str: string) {\r\n // TODO(user): Use native implementations if/when available\r\n var out = [], p = 0;\r\n for (var i = 0; i < str.length; i++) {\r\n var c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n } else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n } else if (\r\n ((c & 0xFC00) == 0xD800) && (i + 1) < str.length &&\r\n ((str.charCodeAt(i + 1) & 0xFC00) == 0xDC00)) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n } else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return Uint8Array.from(out);\r\n };\r\n\r\n /**\r\n * 将 UTF-8 字节数组转换为 JavaScript 字符串\r\n * @param bytes UTF-8 字节数组\r\n * @returns 16位 Unicode 字符串\r\n */\r\n static utf8ByteArrayToString(bytes: Uint8Array): string {\r\n // TODO(user): Use native implementations if/when available\r\n var out = [], pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n var c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n } else if (c1 > 191 && c1 < 224) {\r\n var c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode((c1 & 31) << 6 | c2 & 63);\r\n } else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n var c2 = bytes[pos++];\r\n var c3 = bytes[pos++];\r\n var c4 = bytes[pos++];\r\n var u = ((c1 & 7) << 18 | (c2 & 63) << 12 | (c3 & 63) << 6 | c4 & 63) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xD800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xDC00 + (u & 1023));\r\n } else {\r\n var c2 = bytes[pos++];\r\n var c3 = bytes[pos++];\r\n out[c++] =\r\n String.fromCharCode((c1 & 15) << 12 | (c2 & 63) << 6 | c3 & 63);\r\n }\r\n }\r\n return out.join('');\r\n };\r\n\r\n /**\r\n * 检测浏览器是否支持 passive 事件监听器\r\n * 参考: https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n * @returns 是否支持 passive 选项\r\n */\r\n static supportsPassive(): boolean {\r\n if (typeof Util.supportsPassiveValue === 'boolean') {\r\n return Util.supportsPassiveValue;\r\n }\r\n\r\n // Test via a getter in the options object to see if the passive property is accessed\r\n let supportsPassive = false;\r\n try {\r\n const opts = Object.defineProperty({}, 'passive', {\r\n get: function() {\r\n supportsPassive = true;\r\n }\r\n });\r\n\r\n // @ts-ignore\r\n window.addEventListener('testPassive', null, opts);\r\n // @ts-ignore\r\n window.removeEventListener('testPassive', null, opts);\r\n } catch (error: any) {}\r\n\r\n return Util.supportsPassiveValue = supportsPassive;\r\n }\r\n}\r\n\r\n","import MotionEvent from '../models/MotionEvent';\r\nimport ScreenInfo from '../models/ScreenInfo';\r\nimport { TouchControlMessage } from '../messages/TouchControlMessage';\r\nimport Size from '../models/Size';\r\nimport Point from '../models/Point';\r\nimport Position from '../models/Position';\r\nimport Util from '../utils/Util';\r\nimport { IPlayer } from '../types/PlayerInterface';\r\n\r\n// 图片资源路径 - 在实际使用时,需要通过构建工具(webpack/vite)处理这些导入\r\n// 或者在运行时动态设置这些路径\r\nconst TouchPointPNG = '../assets/images/touch_point.png';\r\nconst CenterPointPNG = '../assets/images/center_point.png';\r\n\r\ninterface Touch {\r\n action: number;\r\n position: Position;\r\n buttons: number;\r\n invalid: boolean;\r\n}\r\n\r\ninterface TouchOnClient {\r\n client: {\r\n width: number;\r\n height: number;\r\n };\r\n touch: Touch;\r\n}\r\n\r\ninterface CommonTouchAndMouse {\r\n clientX: number;\r\n clientY: number;\r\n type: string;\r\n target: EventTarget | null;\r\n buttons: number;\r\n}\r\n\r\ninterface MiniMouseEvent extends CommonTouchAndMouse {\r\n ctrlKey: boolean;\r\n shiftKey: boolean;\r\n buttons: number;\r\n}\r\n\r\nconst TAG = '[TouchHandler]';\r\n\r\nexport type TouchEventNames =\r\n | 'touchstart'\r\n | 'touchend'\r\n | 'touchmove'\r\n | 'touchcancel'\r\n | 'mousedown'\r\n | 'mouseup'\r\n | 'mousemove';\r\nexport type WheelEventNames = 'wheel';\r\nexport type InteractionEvents = TouchEventNames | WheelEventNames;\r\nexport type KeyEventNames = 'keydown' | 'keyup';\r\n\r\nexport abstract class InteractionHandler {\r\n protected static readonly SIMULATE_MULTI_TOUCH = 'SIMULATE_MULTI_TOUCH';\r\n protected static readonly STROKE_STYLE: string = '#00BEA4';\r\n protected static EVENT_ACTION_MAP: Record<string, number> = {\r\n touchstart: MotionEvent.ACTION_DOWN,\r\n touchend: MotionEvent.ACTION_UP,\r\n touchmove: MotionEvent.ACTION_MOVE,\r\n touchcancel: MotionEvent.ACTION_UP,\r\n mousedown: MotionEvent.ACTION_DOWN,\r\n mousemove: MotionEvent.ACTION_MOVE,\r\n mouseup: MotionEvent.ACTION_UP,\r\n [InteractionHandler.SIMULATE_MULTI_TOUCH]: -1,\r\n };\r\n private static options = Util.supportsPassive() ? { passive: false } : false;\r\n private static idToPointerMap: Map<number, number> = new Map();\r\n private static pointerToIdMap: Map<number, number> = new Map();\r\n private static touchPointRadius = 10;\r\n private static centerPointRadius = 5;\r\n private static touchPointImage?: HTMLImageElement;\r\n private static centerPointImage?: HTMLImageElement;\r\n private static pointImagesLoaded = false;\r\n private static eventListeners: Map<string, Set<InteractionHandler>> = new Map();\r\n private multiTouchActive = false;\r\n private multiTouchCenter?: Point;\r\n private multiTouchShift = false;\r\n private dirtyPlace: Point[] = [];\r\n protected readonly ctx: CanvasRenderingContext2D | null;\r\n protected readonly tag: HTMLCanvasElement;\r\n protected over = false;\r\n protected lastPosition?: MouseEvent;\r\n\r\n protected constructor(\r\n public readonly player: IPlayer,\r\n public readonly touchEventsNames: InteractionEvents[],\r\n public readonly keyEventsNames: KeyEventNames[],\r\n ) {\r\n this.tag = player.getTouchableElement();\r\n this.ctx = this.tag.getContext('2d');\r\n InteractionHandler.loadImages();\r\n InteractionHandler.bindGlobalListeners(this);\r\n }\r\n\r\n protected abstract onInteraction(event: MouseEvent | TouchEvent): void;\r\n protected abstract onKey(event: KeyboardEvent): void;\r\n\r\n protected static bindGlobalListeners(interactionHandler: InteractionHandler): void {\r\n interactionHandler.touchEventsNames.forEach((eventName) => {\r\n let set: Set<InteractionHandler> | undefined = InteractionHandler.eventListeners.get(eventName);\r\n if (!set) {\r\n set = new Set();\r\n document.body.addEventListener(eventName, this.onInteractionEvent, InteractionHandler.options);\r\n this.eventListeners.set(eventName, set);\r\n }\r\n set.add(interactionHandler);\r\n });\r\n interactionHandler.keyEventsNames.forEach((eventName) => {\r\n let set = InteractionHandler.eventListeners.get(eventName);\r\n if (!set) {\r\n set = new Set();\r\n document.body.addEventListener(eventName, this.onKeyEvent);\r\n this.eventListeners.set(eventName, set);\r\n }\r\n set.add(interactionHandler);\r\n });\r\n }\r\n\r\n protected static unbindListeners(touchHandler: InteractionHandler): void {\r\n touchHandler.touchEventsNames.forEach((eventName) => {\r\n const set = InteractionHandler.eventListeners.get(eventName);\r\n if (!set) {\r\n return;\r\n }\r\n set.delete(touchHandler);\r\n if (set.size <= 0) {\r\n this.eventListeners.delete(eventName);\r\n document.body.removeEventListener(eventName, this.onInteractionEvent);\r\n }\r\n });\r\n touchHandler.keyEventsNames.forEach((eventName) => {\r\n const set = InteractionHandler.eventListeners.get(eventName);\r\n if (!set) {\r\n return;\r\n }\r\n set.delete(touchHandler);\r\n if (set.size <= 0) {\r\n this.eventListeners.delete(eventName);\r\n document.body.removeEventListener(eventName, this.onKeyEvent);\r\n }\r\n });\r\n }\r\n\r\n protected static onInteractionEvent = (event: MouseEvent | TouchEvent): void => {\r\n const set = InteractionHandler.eventListeners.get(event.type as TouchEventNames);\r\n if (!set) {\r\n return;\r\n }\r\n set.forEach((instance) => {\r\n instance.onInteraction(event);\r\n });\r\n };\r\n\r\n protected static onKeyEvent = (event: KeyboardEvent): void => {\r\n const set = InteractionHandler.eventListeners.get(event.type as KeyEventNames);\r\n if (!set) {\r\n return;\r\n }\r\n set.forEach((instance) => {\r\n instance.onKey(event);\r\n });\r\n };\r\n\r\n protected static loadImages(): void {\r\n if (this.pointImagesLoaded) {\r\n return;\r\n }\r\n const total = 2;\r\n let current = 0;\r\n\r\n const onload = (event: Event) => {\r\n if (++current === total) {\r\n this.pointImagesLoaded = true;\r\n }\r\n if (event.target === this.touchPointImage) {\r\n this.touchPointRadius = this.touchPointImage.width / 2;\r\n } else if (event.target === this.centerPointImage) {\r\n this.centerPointRadius = this.centerPointImage.width / 2;\r\n }\r\n };\r\n const touch = (this.touchPointImage = new Image());\r\n touch.src = TouchPointPNG;\r\n touch.onload = onload;\r\n const center = (this.centerPointImage = new Image());\r\n center.src = CenterPointPNG;\r\n center.onload = onload;\r\n }\r\n\r\n protected static getPointerId(type: string, identifier: number): number {\r\n if (this.idToPointerMap.has(identifier)) {\r\n const pointerId = this.idToPointerMap.get(identifier) as number;\r\n if (type === 'touchend' || type === 'touchcancel') {\r\n this.idToPointerMap.delete(identifier);\r\n this.pointerToIdMap.delete(pointerId);\r\n }\r\n return pointerId;\r\n }\r\n let pointerId = 0;\r\n while (this.pointerToIdMap.has(pointerId)) {\r\n pointerId++;\r\n }\r\n this.idToPointerMap.set(identifier, pointerId);\r\n this.pointerToIdMap.set(pointerId, identifier);\r\n return pointerId;\r\n }\r\n\r\n protected static buildTouchOnClient(event: CommonTouchAndMouse, screenInfo: ScreenInfo): TouchOnClient | null {\r\n const action = this.mapTypeToAction(event.type);\r\n const { width, height } = screenInfo.videoSize;\r\n const target: HTMLElement = event.target as HTMLElement;\r\n const rect = target.getBoundingClientRect();\r\n let { clientWidth, clientHeight } = target;\r\n let touchX = event.clientX - rect.left;\r\n let touchY = event.clientY - rect.top;\r\n let invalid = false;\r\n if (touchX < 0 || touchX > clientWidth || touchY < 0 || touchY > clientHeight) {\r\n invalid = true;\r\n }\r\n const eps = 1e5;\r\n const ratio = width / height;\r\n const shouldBe = Math.round(eps * ratio);\r\n const haveNow = Math.round((eps * clientWidth) / clientHeight);\r\n if (shouldBe > haveNow) {\r\n const realHeight = Math.ceil(clientWidth / ratio);\r\n const top = (clientHeight - realHeight) / 2;\r\n if (touchY < top || touchY > top + realHeight) {\r\n invalid = true;\r\n }\r\n touchY -= top;\r\n clientHeight = realHeight;\r\n } else if (shouldBe < haveNow) {\r\n const realWidth = Math.ceil(clientHeight * ratio);\r\n const left = (clientWidth - realWidth) / 2;\r\n if (touchX < left || touchX > left + realWidth) {\r\n invalid = true;\r\n }\r\n touchX -= left;\r\n clientWidth = realWidth;\r\n }\r\n const x = (touchX * width) / clientWidth;\r\n const y = (touchY * height) / clientHeight;\r\n const size = new Size(width, height);\r\n const point = new Point(x, y);\r\n const position = new Position(point, size);\r\n if (x < 0 || y < 0 || x > width || y > height) {\r\n invalid = true;\r\n }\r\n return {\r\n client: {\r\n width: clientWidth,\r\n height: clientHeight,\r\n },\r\n touch: {\r\n invalid,\r\n action,\r\n position,\r\n buttons: event.buttons,\r\n },\r\n };\r\n }\r\n\r\n private static validateMessage(\r\n originalEvent: MiniMouseEvent | TouchEvent,\r\n message: TouchControlMessage,\r\n storage: Map<number, TouchControlMessage>,\r\n logPrefix: string,\r\n ): TouchControlMessage[] {\r\n const messages: TouchControlMessage[] = [];\r\n const { action, pointerId } = message;\r\n const previous = storage.get(pointerId);\r\n if (action === MotionEvent.ACTION_UP) {\r\n if (!previous) {\r\n console.warn(logPrefix, 'Received ACTION_UP while there are no DOWN stored');\r\n } else {\r\n storage.delete(pointerId);\r\n messages.push(message);\r\n }\r\n } else if (action === MotionEvent.ACTION_DOWN) {\r\n if (previous) {\r\n console.warn(logPrefix, 'Received ACTION_DOWN while already has one stored');\r\n } else {\r\n storage.set(pointerId, message);\r\n messages.push(message);\r\n }\r\n } else if (action === MotionEvent.ACTION_MOVE) {\r\n if (!previous) {\r\n if (\r\n (originalEvent instanceof MouseEvent && originalEvent.buttons) ||\r\n (window['TouchEvent'] && originalEvent instanceof TouchEvent)\r\n ) {\r\n console.warn(logPrefix, 'Received ACTION_MOVE while there are no DOWN stored');\r\n const emulated = InteractionHandler.createEmulatedMessage(MotionEvent.ACTION_DOWN, message);\r\n messages.push(emulated);\r\n storage.set(pointerId, emulated);\r\n }\r\n } else {\r\n messages.push(message);\r\n storage.set(pointerId, message);\r\n }\r\n }\r\n return messages;\r\n }\r\n\r\n protected static createEmulatedMessage(action: number, event: TouchControlMessage): TouchControlMessage {\r\n const { pointerId, position, buttons } = event;\r\n let pressure = event.pressure;\r\n if (action === MotionEvent.ACTION_UP) {\r\n pressure = 0;\r\n }\r\n return new TouchControlMessage(action, pointerId, position, pressure, buttons);\r\n }\r\n\r\n public static mapTypeToAction(type: string): number {\r\n return this.EVENT_ACTION_MAP[type];\r\n }\r\n\r\n protected getTouch(\r\n e: CommonTouchAndMouse,\r\n screenInfo: ScreenInfo,\r\n ctrlKey: boolean,\r\n shiftKey: boolean,\r\n ): Touch[] | null {\r\n const touchOnClient = InteractionHandler.buildTouchOnClient(e, screenInfo);\r\n if (!touchOnClient) {\r\n return null;\r\n }\r\n const { client, touch } = touchOnClient;\r\n const result: Touch[] = [touch];\r\n if (!ctrlKey) {\r\n this.multiTouchActive = false;\r\n this.multiTouchCenter = undefined;\r\n this.multiTouchShift = false;\r\n this.clearCanvas();\r\n return result;\r\n }\r\n const { position, action, buttons } = touch;\r\n const { point, screenSize } = position;\r\n const { width, height } = screenSize;\r\n const { x, y } = point;\r\n if (!this.multiTouchActive) {\r\n if (shiftKey) {\r\n this.multiTouchCenter = point;\r\n this.multiTouchShift = true;\r\n } else {\r\n this.multiTouchCenter = new Point(client.width / 2, client.height / 2);\r\n }\r\n }\r\n this.multiTouchActive = true;\r\n let opposite: Point | undefined;\r\n let invalid = false;\r\n if (this.multiTouchShift && this.multiTouchCenter) {\r\n const oppoX = 2 * this.multiTouchCenter.x - x;\r\n const oppoY = 2 * this.multiTouchCenter.y - y;\r\n opposite = new Point(oppoX, oppoY);\r\n if (!(oppoX <= width && oppoX >= 0 && oppoY <= height && oppoY >= 0)) {\r\n invalid = true;\r\n }\r\n } else {\r\n opposite = new Point(client.width - x, client.height - y);\r\n invalid = touch.invalid;\r\n }\r\n if (opposite) {\r\n result.push({\r\n invalid,\r\n action,\r\n buttons,\r\n position: new Position(opposite, screenSize),\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n protected drawCircle(ctx: CanvasRenderingContext2D, point: Point, radius: number): void {\r\n ctx.beginPath();\r\n ctx.arc(point.x, point.y, radius, 0, Math.PI * 2, true);\r\n ctx.stroke();\r\n }\r\n\r\n public drawLine(point1: Point, point2: Point): void {\r\n if (!this.ctx) {\r\n return;\r\n }\r\n this.ctx.save();\r\n this.ctx.strokeStyle = InteractionHandler.STROKE_STYLE;\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(point1.x, point1.y);\r\n this.ctx.lineTo(point2.x, point2.y);\r\n this.ctx.stroke();\r\n this.ctx.restore();\r\n }\r\n\r\n protected drawPoint(point: Point, radius: number, image?: HTMLImageElement): void {\r\n if (!this.ctx) {\r\n return;\r\n }\r\n let { lineWidth } = this.ctx;\r\n if (InteractionHandler.pointImagesLoaded && image) {\r\n radius = image.width / 2;\r\n lineWidth = 0;\r\n this.ctx.drawImage(image, point.x - radius, point.y - radius);\r\n } else {\r\n this.drawCircle(this.ctx, point, radius);\r\n }\r\n\r\n const topLeft = new Point(point.x - radius - lineWidth, point.y - radius - lineWidth);\r\n const bottomRight = new Point(point.x + radius + lineWidth, point.y + radius + lineWidth);\r\n this.updateDirty(topLeft, bottomRight);\r\n }\r\n\r\n public drawPointer(point: Point): void {\r\n this.drawPoint(point, InteractionHandler.touchPointRadius, InteractionHandler.touchPointImage);\r\n if (this.multiTouchCenter) {\r\n this.drawLine(this.multiTouchCenter, point);\r\n }\r\n }\r\n\r\n public drawCenter(point: Point): void {\r\n this.drawPoint(point, InteractionHandler.centerPointRadius, InteractionHandler.centerPointImage);\r\n }\r\n\r\n protected updateDirty(topLeft: Point, bottomRight: Point): void {\r\n if (!this.dirtyPlace.length) {\r\n this.dirtyPlace.push(topLeft, bottomRight);\r\n return;\r\n }\r\n const currentTopLeft = this.dirtyPlace[0];\r\n const currentBottomRight = this.dirtyPlace[1];\r\n const newTopLeft = new Point(Math.min(currentTopLeft.x, topLeft.x), Math.min(currentTopLeft.y, topLeft.y));\r\n const newBottomRight = new Point(\r\n Math.max(currentBottomRight.x, bottomRight.x),\r\n Math.max(currentBottomRight.y, bottomRight.y),\r\n );\r\n this.dirtyPlace.length = 0;\r\n this.dirtyPlace.push(newTopLeft, newBottomRight);\r\n }\r\n\r\n public clearCanvas(): void {\r\n const { clientWidth, clientHeight } = this.tag;\r\n const ctx = this.ctx;\r\n if (ctx && this.dirtyPlace.length) {\r\n const topLeft = this.dirtyPlace[0];\r\n const bottomRight = this.dirtyPlace[1];\r\n this.dirtyPlace.length = 0;\r\n const x = Math.max(topLeft.x, 0);\r\n const y = Math.max(topLeft.y, 0);\r\n const w = Math.min(clientWidth, bottomRight.x - x);\r\n const h = Math.min(clientHeight, bottomRight.y - y);\r\n ctx.clearRect(x, y, w, h);\r\n ctx.strokeStyle = InteractionHandler.STROKE_STYLE;\r\n }\r\n }\r\n\r\n public formatTouchEvent(\r\n e: TouchEvent,\r\n screenInfo: ScreenInfo,\r\n storage: Map<number, TouchControlMessage>,\r\n ): TouchControlMessage[] {\r\n const logPrefix = `${TAG}[formatTouchEvent]`;\r\n const messages: TouchControlMessage[] = [];\r\n const touches = e.changedTouches;\r\n if (touches && touches.length) {\r\n for (let i = 0, l = touches.length; i < l; i++) {\r\n const touch = touches[i];\r\n const pointerId = InteractionHandler.getPointerId(e.type, touch.identifier);\r\n if (touch.target !== this.tag) {\r\n continue;\r\n }\r\n const previous = storage.get(pointerId);\r\n const item: CommonTouchAndMouse = {\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n type: e.type,\r\n buttons: MotionEvent.BUTTON_PRIMARY,\r\n target: e.target,\r\n };\r\n const event = InteractionHandler.buildTouchOnClient(item, screenInfo);\r\n if (event) {\r\n const { action, buttons, position, invalid } = event.touch;\r\n let pressure = 1;\r\n if (action === MotionEvent.ACTION_UP) {\r\n pressure = 0;\r\n } else if (typeof touch.force === 'number') {\r\n pressure = touch.force;\r\n }\r\n if (!invalid) {\r\n const message = new TouchControlMessage(action, pointerId, position, pressure, buttons);\r\n messages.push(\r\n ...InteractionHandler.validateMessage(e, message, storage, `${logPrefix}[validate]`),\r\n );\r\n } else {\r\n if (previous) {\r\n messages.push(InteractionHandler.createEmulatedMessage(MotionEvent.ACTION_UP, previous));\r\n storage.delete(pointerId);\r\n }\r\n }\r\n } else {\r\n console.error(logPrefix, `Failed to format touch`, touch);\r\n }\r\n }\r\n } else {\r\n console.error(logPrefix, 'No \"touches\"', e);\r\n }\r\n return messages;\r\n }\r\n\r\n public buildTouchEvent(\r\n e: MiniMouseEvent,\r\n screenInfo: ScreenInfo,\r\n storage: Map<number, TouchControlMessage>,\r\n ): TouchControlMessage[] {\r\n const logPrefix = `${TAG}[buildTouchEvent]`;\r\n const touches = this.getTouch(e, screenInfo, e.ctrlKey, e.shiftKey);\r\n if (!touches) {\r\n return [];\r\n }\r\n const messages: TouchControlMessage[] = [];\r\n const points: Point[] = [];\r\n this.clearCanvas();\r\n touches.forEach((touch: Touch, pointerId: number) => {\r\n const { action, buttons, position } = touch;\r\n const previous = storage.get(pointerId);\r\n if (!touch.invalid) {\r\n let pressure = 1.0;\r\n if (action === MotionEvent.ACTION_UP) {\r\n pressure = 0;\r\n }\r\n const message = new TouchControlMessage(action, pointerId, position, pressure, buttons);\r\n messages.push(...InteractionHandler.validateMessage(e, message, storage, `${logPrefix}[validate]`));\r\n points.push(touch.position.point);\r\n } else {\r\n if (previous) {\r\n points.push(previous.position.point);\r\n }\r\n }\r\n });\r\n if (this.multiTouchActive) {\r\n if (this.multiTouchCenter) {\r\n this.drawCenter(this.multiTouchCenter);\r\n }\r\n points.forEach((point) => {\r\n this.drawPointer(point);\r\n });\r\n }\r\n const hasActionUp = messages.find((message) => {\r\n return message.action === MotionEvent.ACTION_UP;\r\n });\r\n if (hasActionUp && storage.size) {\r\n console.warn(logPrefix, 'Looks like one of Multi-touch pointers was not raised up');\r\n storage.forEach((message) => {\r\n messages.push(InteractionHandler.createEmulatedMessage(MotionEvent.ACTION_UP, message));\r\n });\r\n storage.clear();\r\n }\r\n return messages;\r\n }\r\n\r\n public release(): void {\r\n InteractionHandler.unbindListeners(this);\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage, ControlMessageInterface } from './ControlMessage';\r\nimport Position, { PositionInterface } from '../models/Position';\r\n\r\nexport interface ScrollControlMessageInterface extends ControlMessageInterface {\r\n position: PositionInterface;\r\n hScroll: number;\r\n vScroll: number;\r\n}\r\n\r\nexport class ScrollControlMessage extends ControlMessage {\r\n public static PAYLOAD_LENGTH = 20;\r\n\r\n constructor(readonly position: Position, readonly hScroll: number, readonly vScroll: number) {\r\n super(ControlMessage.TYPE_SCROLL);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n const buffer = Buffer.alloc(ScrollControlMessage.PAYLOAD_LENGTH + 1);\r\n let offset = 0;\r\n offset = buffer.writeUInt8(this.type, offset);\r\n offset = buffer.writeUInt32BE(this.position.point.x, offset);\r\n offset = buffer.writeUInt32BE(this.position.point.y, offset);\r\n offset = buffer.writeUInt16BE(this.position.screenSize.width, offset);\r\n offset = buffer.writeUInt16BE(this.position.screenSize.height, offset);\r\n offset = buffer.writeInt32BE(this.hScroll, offset);\r\n buffer.writeInt32BE(this.vScroll, offset);\r\n return buffer;\r\n }\r\n\r\n public toString(): string {\r\n return `ScrollControlMessage{hScroll=${this.hScroll}, vScroll=${this.vScroll}, position=${this.position}}`;\r\n }\r\n\r\n public toJSON(): ScrollControlMessageInterface {\r\n return {\r\n type: this.type,\r\n position: this.position.toJSON(),\r\n hScroll: this.hScroll,\r\n vScroll: this.vScroll,\r\n };\r\n }\r\n}\r\n\r\n","import { InteractionEvents, KeyEventNames, InteractionHandler } from './InteractionHandler';\r\nimport { IPlayer } from '../types/PlayerInterface';\r\nimport { ControlMessage } from '../messages/ControlMessage';\r\nimport { TouchControlMessage } from '../messages/TouchControlMessage';\r\nimport MotionEvent from '../models/MotionEvent';\r\nimport ScreenInfo from '../models/ScreenInfo';\r\nimport { ScrollControlMessage } from '../messages/ScrollControlMessage';\r\n\r\nconst TAG = '[FeaturedTouchHandler]';\r\n\r\nexport interface InteractionHandlerListener {\r\n sendMessage: (message: ControlMessage) => void;\r\n}\r\n\r\nexport class FeaturedInteractionHandler extends InteractionHandler {\r\n private static readonly touchEventsNames: InteractionEvents[] = [\r\n 'touchstart',\r\n 'touchend',\r\n 'touchmove',\r\n 'touchcancel',\r\n 'mousedown',\r\n 'mouseup',\r\n 'mousemove',\r\n 'wheel',\r\n ];\r\n private static readonly keyEventsNames: KeyEventNames[] = ['keydown', 'keyup'];\r\n public static SCROLL_EVENT_THROTTLING_TIME = 30; // one event per 50ms\r\n private readonly storedFromMouseEvent = new Map<number, TouchControlMessage>();\r\n private readonly storedFromTouchEvent = new Map<number, TouchControlMessage>();\r\n private lastScrollEvent?: { time: number; hScroll: number; vScroll: number };\r\n\r\n constructor(player: IPlayer, public readonly listener: InteractionHandlerListener) {\r\n super(player, FeaturedInteractionHandler.touchEventsNames, FeaturedInteractionHandler.keyEventsNames);\r\n this.tag.addEventListener('mouseleave', this.onMouseLeave);\r\n this.tag.addEventListener('mouseenter', this.onMouseEnter);\r\n }\r\n\r\n public buildScrollEvent(event: WheelEvent, screenInfo: ScreenInfo): ScrollControlMessage[] {\r\n const messages: ScrollControlMessage[] = [];\r\n const touchOnClient = InteractionHandler.buildTouchOnClient(event, screenInfo);\r\n if (touchOnClient) {\r\n const hScroll = event.deltaX > 0 ? -1 : event.deltaX < -0 ? 1 : 0;\r\n const vScroll = event.deltaY > 0 ? -1 : event.deltaY < -0 ? 1 : 0;\r\n const time = Date.now();\r\n if (\r\n !this.lastScrollEvent ||\r\n time - this.lastScrollEvent.time > FeaturedInteractionHandler.SCROLL_EVENT_THROTTLING_TIME ||\r\n this.lastScrollEvent.vScroll !== vScroll ||\r\n this.lastScrollEvent.hScroll !== hScroll\r\n ) {\r\n this.lastScrollEvent = { time, hScroll, vScroll };\r\n messages.push(new ScrollControlMessage(touchOnClient.touch.position, hScroll, vScroll));\r\n }\r\n }\r\n return messages;\r\n }\r\n\r\n protected onInteraction(event: MouseEvent | TouchEvent): void {\r\n const screenInfo = this.player.getScreenInfo();\r\n if (!screenInfo) {\r\n return;\r\n }\r\n let messages: ControlMessage[];\r\n let storage: Map<number, TouchControlMessage>;\r\n if (event instanceof MouseEvent) {\r\n if (event.target !== this.tag) {\r\n return;\r\n }\r\n if (window['WheelEvent'] && event instanceof WheelEvent) {\r\n messages = this.buildScrollEvent(event, screenInfo);\r\n } else {\r\n storage = this.storedFromMouseEvent;\r\n messages = this.buildTouchEvent(event, screenInfo, storage);\r\n }\r\n if (this.over) {\r\n this.lastPosition = event;\r\n }\r\n } else if (window['TouchEvent'] && event instanceof TouchEvent) {\r\n // TODO: Research drag from out of the target inside it\r\n if (event.target !== this.tag) {\r\n return;\r\n }\r\n storage = this.storedFromTouchEvent;\r\n messages = this.formatTouchEvent(event, screenInfo, storage);\r\n } else {\r\n console.error(TAG, 'Unsupported event', event);\r\n return;\r\n }\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n }\r\n event.stopPropagation();\r\n messages.forEach((message) => {\r\n this.listener.sendMessage(message);\r\n });\r\n }\r\n\r\n protected onKey(event: KeyboardEvent): void {\r\n if (!this.lastPosition) {\r\n return;\r\n }\r\n const screenInfo = this.player.getScreenInfo();\r\n if (!screenInfo) {\r\n return;\r\n }\r\n const { ctrlKey, shiftKey } = event;\r\n const { target, button, buttons, clientY, clientX } = this.lastPosition;\r\n const type = InteractionHandler.SIMULATE_MULTI_TOUCH;\r\n const props = { ctrlKey, shiftKey, type, target, button, buttons, clientX, clientY };\r\n this.buildTouchEvent(props, screenInfo, new Map());\r\n }\r\n\r\n private onMouseEnter = (): void => {\r\n this.over = true;\r\n };\r\n private onMouseLeave = (): void => {\r\n this.lastPosition = undefined;\r\n this.over = false;\r\n this.storedFromMouseEvent.forEach((message) => {\r\n this.listener.sendMessage(InteractionHandler.createEmulatedMessage(MotionEvent.ACTION_UP, message));\r\n });\r\n this.storedFromMouseEvent.clear();\r\n this.clearCanvas();\r\n };\r\n\r\n public release(): void {\r\n super.release();\r\n this.tag.removeEventListener('mouseleave', this.onMouseLeave);\r\n this.tag.removeEventListener('mouseenter', this.onMouseEnter);\r\n this.storedFromMouseEvent.clear();\r\n }\r\n}\r\n\r\n","import { InteractionEvents, InteractionHandler } from './InteractionHandler';\r\nimport { IPlayer } from '../types/PlayerInterface';\r\nimport ScreenInfo from '../models/ScreenInfo';\r\nimport Position from '../models/Position';\r\n\r\nexport interface TouchHandlerListener {\r\n performClick: (position: Position) => void;\r\n performScroll: (from: Position, to: Position) => void;\r\n}\r\n\r\nconst TAG = '[SimpleTouchHandler]';\r\n\r\nexport class SimpleInteractionHandler extends InteractionHandler {\r\n private startPosition?: Position;\r\n private endPosition?: Position;\r\n private static readonly touchEventsNames: InteractionEvents[] = ['mousedown', 'mouseup', 'mousemove'];\r\n private storage = new Map();\r\n\r\n constructor(player: IPlayer, private readonly listener: TouchHandlerListener) {\r\n super(player, SimpleInteractionHandler.touchEventsNames, []);\r\n }\r\n\r\n protected onInteraction(event: MouseEvent | TouchEvent): void {\r\n let handled = false;\r\n if (!(event instanceof MouseEvent)) {\r\n return;\r\n }\r\n if (event.target === this.tag) {\r\n const screenInfo: ScreenInfo = this.player.getScreenInfo() as ScreenInfo;\r\n if (!screenInfo) {\r\n return;\r\n }\r\n const events = this.buildTouchEvent(event, screenInfo, this.storage);\r\n if (events.length > 1) {\r\n console.warn(TAG, 'Too many events', events);\r\n return;\r\n }\r\n const downEventName = 'mousedown';\r\n if (events.length === 1) {\r\n handled = true;\r\n if (event.type === downEventName) {\r\n this.startPosition = events[0].position;\r\n } else {\r\n if (this.startPosition) {\r\n this.endPosition = events[0].position;\r\n } else {\r\n console.warn(TAG, `Received \"${event.type}\" before \"${downEventName}\"`);\r\n }\r\n }\r\n if (this.startPosition) {\r\n this.drawPointer(this.startPosition.point);\r\n }\r\n if (this.endPosition) {\r\n this.drawPointer(this.endPosition.point);\r\n if (this.startPosition) {\r\n this.drawLine(this.startPosition.point, this.endPosition.point);\r\n }\r\n }\r\n if (event.type === 'mouseup') {\r\n if (this.startPosition && this.endPosition) {\r\n this.clearCanvas();\r\n if (this.startPosition.point.distance(this.endPosition.point) < 10) {\r\n this.listener.performClick(this.endPosition);\r\n } else {\r\n this.listener.performScroll(this.startPosition, this.endPosition);\r\n }\r\n }\r\n }\r\n }\r\n if (handled) {\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n }\r\n event.stopPropagation();\r\n }\r\n }\r\n if (event.type === 'mouseup') {\r\n this.startPosition = undefined;\r\n this.endPosition = undefined;\r\n }\r\n }\r\n\r\n protected onKey(): void {\r\n throw Error(`${TAG} Unsupported`);\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage, ControlMessageInterface } from './ControlMessage';\r\n\r\nexport interface KeyCodeControlMessageInterface extends ControlMessageInterface {\r\n action: number;\r\n keycode: number;\r\n repeat: number;\r\n metaState: number;\r\n}\r\n\r\nexport class KeyCodeControlMessage extends ControlMessage {\r\n public static PAYLOAD_LENGTH = 13;\r\n\r\n constructor(\r\n readonly action: number,\r\n readonly keycode: number,\r\n readonly repeat: number,\r\n readonly metaState: number,\r\n ) {\r\n super(ControlMessage.TYPE_KEYCODE);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n const buffer = Buffer.alloc(KeyCodeControlMessage.PAYLOAD_LENGTH + 1);\r\n let offset = 0;\r\n offset = buffer.writeInt8(this.type, offset);\r\n offset = buffer.writeInt8(this.action, offset);\r\n offset = buffer.writeInt32BE(this.keycode, offset);\r\n offset = buffer.writeInt32BE(this.repeat, offset);\r\n buffer.writeInt32BE(this.metaState, offset);\r\n return buffer;\r\n }\r\n\r\n public toString(): string {\r\n return `KeyCodeControlMessage{action=${this.action}, keycode=${this.keycode}, metaState=${this.metaState}}`;\r\n }\r\n\r\n public toJSON(): KeyCodeControlMessageInterface {\r\n return {\r\n type: this.type,\r\n action: this.action,\r\n keycode: this.keycode,\r\n metaState: this.metaState,\r\n repeat: this.repeat,\r\n };\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage, ControlMessageInterface } from './ControlMessage';\r\n\r\nexport interface TextControlMessageInterface extends ControlMessageInterface {\r\n text: string;\r\n}\r\n\r\nexport class TextControlMessage extends ControlMessage {\r\n private static TEXT_SIZE_FIELD_LENGTH = 4;\r\n constructor(readonly text: string) {\r\n super(ControlMessage.TYPE_TEXT);\r\n }\r\n\r\n public getText(): string {\r\n return this.text;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n const length = this.text.length;\r\n const buffer = Buffer.alloc(length + 1 + TextControlMessage.TEXT_SIZE_FIELD_LENGTH);\r\n let offset = 0;\r\n offset = buffer.writeUInt8(this.type, offset);\r\n offset = buffer.writeUInt32BE(length, offset);\r\n buffer.write(this.text, offset);\r\n return buffer;\r\n }\r\n\r\n public toString(): string {\r\n return `TextControlMessage{text=${this.text}}`;\r\n }\r\n\r\n public toJSON(): TextControlMessageInterface {\r\n return {\r\n type: this.type,\r\n text: this.text,\r\n };\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage } from './ControlMessage';\r\nimport Util from '../utils/Util';\r\n\r\nexport enum FilePushState {\r\n NEW,\r\n START,\r\n APPEND,\r\n FINISH,\r\n CANCEL,\r\n}\r\n\r\ntype FilePushParams = {\r\n id: number;\r\n state: FilePushState;\r\n chunk?: Uint8Array;\r\n fileName?: string;\r\n fileSize?: number;\r\n};\r\n\r\nexport class CommandControlMessage extends ControlMessage {\r\n public static PAYLOAD_LENGTH = 0;\r\n\r\n public static Commands: Map<number, string> = new Map([\r\n [ControlMessage.TYPE_EXPAND_NOTIFICATION_PANEL, 'Expand notifications'],\r\n [ControlMessage.TYPE_EXPAND_SETTINGS_PANEL, 'Expand settings'],\r\n [ControlMessage.TYPE_COLLAPSE_PANELS, 'Collapse panels'],\r\n [ControlMessage.TYPE_GET_CLIPBOARD, 'Get clipboard'],\r\n [ControlMessage.TYPE_SET_CLIPBOARD, 'Set clipboard'],\r\n [ControlMessage.TYPE_ROTATE_DEVICE, 'Rotate device'],\r\n [ControlMessage.TYPE_CHANGE_STREAM_PARAMETERS, 'Change video settings'],\r\n ]);\r\n\r\n /**\r\n * 注意: createSetVideoSettingsCommand 方法依赖 VideoSettings 类\r\n * 该方法未包含在此独立模块中\r\n * 如需使用,请在应用中自行实现或从原项目导入\r\n */\r\n // public static createSetVideoSettingsCommand(videoSettings: VideoSettings): CommandControlMessage {\r\n // ...\r\n // }\r\n\r\n public static createSetClipboardCommand(text: string, paste = false): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_SET_CLIPBOARD);\r\n const textBytes: Uint8Array | null = text ? Util.stringToUtf8ByteArray(text) : null;\r\n const textLength = textBytes ? textBytes.length : 0;\r\n let offset = 0;\r\n const buffer = Buffer.alloc(1 + 1 + 4 + textLength);\r\n offset = buffer.writeInt8(event.type, offset);\r\n offset = buffer.writeInt8(paste ? 1 : 0, offset);\r\n offset = buffer.writeInt32BE(textLength, offset);\r\n if (textBytes) {\r\n textBytes.forEach((byte: number, index: number) => {\r\n buffer.writeUInt8(byte, index + offset);\r\n });\r\n }\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n public static createSetScreenPowerModeCommand(mode: boolean): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_SET_SCREEN_POWER_MODE);\r\n let offset = 0;\r\n const buffer = Buffer.alloc(1 + 1);\r\n offset = buffer.writeInt8(event.type, offset);\r\n buffer.writeUInt8(mode ? 1 : 0, offset);\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n public static createPushFileCommand(params: FilePushParams): CommandControlMessage {\r\n const { id, fileName, fileSize, chunk, state } = params;\r\n\r\n if (state === FilePushState.START) {\r\n return this.createPushFileStartCommand(id, fileName as string, fileSize as number);\r\n }\r\n if (state === FilePushState.APPEND) {\r\n if (!chunk) {\r\n throw TypeError('Invalid type');\r\n }\r\n return this.createPushFileChunkCommand(id, chunk);\r\n }\r\n if (state === FilePushState.CANCEL || state === FilePushState.FINISH || state === FilePushState.NEW) {\r\n return this.createPushFileOtherCommand(id, state);\r\n }\r\n\r\n throw TypeError(`Unsupported state: \"${state}\"`);\r\n }\r\n\r\n private static createPushFileStartCommand(id: number, fileName: string, fileSize: number): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_PUSH_FILE);\r\n const text = Util.stringToUtf8ByteArray(fileName);\r\n const typeField = 1;\r\n const idField = 2;\r\n const stateField = 1;\r\n const sizeField = 4;\r\n const textLengthField = 2;\r\n const textLength = text.length;\r\n let offset = CommandControlMessage.PAYLOAD_LENGTH;\r\n\r\n const buffer = Buffer.alloc(\r\n offset + typeField + idField + stateField + sizeField + textLengthField + textLength,\r\n );\r\n buffer.writeUInt8(event.type, offset);\r\n offset += typeField;\r\n buffer.writeInt16BE(id, offset);\r\n offset += idField;\r\n buffer.writeInt8(FilePushState.START, offset);\r\n offset += stateField;\r\n buffer.writeUInt32BE(fileSize, offset);\r\n offset += sizeField;\r\n buffer.writeUInt16BE(textLength, offset);\r\n offset += textLengthField;\r\n text.forEach((byte, index) => {\r\n buffer.writeUInt8(byte, index + offset);\r\n });\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n private static createPushFileChunkCommand(id: number, chunk: Uint8Array): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_PUSH_FILE);\r\n const typeField = 1;\r\n const idField = 2;\r\n const stateField = 1;\r\n const chunkLengthField = 4;\r\n const chunkLength = chunk.byteLength;\r\n let offset = CommandControlMessage.PAYLOAD_LENGTH;\r\n\r\n const buffer = Buffer.alloc(offset + typeField + idField + stateField + chunkLengthField + chunkLength);\r\n buffer.writeUInt8(event.type, offset);\r\n offset += typeField;\r\n buffer.writeInt16BE(id, offset);\r\n offset += idField;\r\n buffer.writeInt8(FilePushState.APPEND, offset);\r\n offset += stateField;\r\n buffer.writeUInt32BE(chunkLength, offset);\r\n offset += chunkLengthField;\r\n Array.from(chunk).forEach((byte, index) => {\r\n buffer.writeUInt8(byte, index + offset);\r\n });\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n private static createPushFileOtherCommand(id: number, state: FilePushState): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_PUSH_FILE);\r\n const typeField = 1;\r\n const idField = 2;\r\n const stateField = 1;\r\n let offset = CommandControlMessage.PAYLOAD_LENGTH;\r\n const buffer = Buffer.alloc(offset + typeField + idField + stateField);\r\n buffer.writeUInt8(event.type, offset);\r\n offset += typeField;\r\n buffer.writeInt16BE(id, offset);\r\n offset += idField;\r\n buffer.writeInt8(state, offset);\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n public static pushFileCommandFromBuffer(buffer: Buffer): {\r\n id: number;\r\n state: FilePushState;\r\n chunk?: Buffer;\r\n fileSize?: number;\r\n fileName?: string;\r\n } {\r\n let offset = 0;\r\n const type = buffer.readUInt8(offset);\r\n offset += 1;\r\n if (type !== CommandControlMessage.TYPE_PUSH_FILE) {\r\n throw TypeError(`Incorrect type: \"${type}\"`);\r\n }\r\n const id = buffer.readInt16BE(offset);\r\n offset += 2;\r\n const state = buffer.readInt8(offset);\r\n offset += 1;\r\n let chunk: Buffer | undefined;\r\n let fileSize: number | undefined;\r\n let fileName: string | undefined;\r\n if (state === FilePushState.APPEND) {\r\n const chunkLength = buffer.readUInt32BE(offset);\r\n offset += 4;\r\n chunk = buffer.slice(offset, offset + chunkLength);\r\n } else if (state === FilePushState.START) {\r\n fileSize = buffer.readUInt32BE(offset);\r\n offset += 4;\r\n const textLength = buffer.readUInt16BE(offset);\r\n offset += 2;\r\n fileName = Util.utf8ByteArrayToString(buffer.slice(offset, offset + textLength));\r\n }\r\n return { id, state, chunk, fileName, fileSize };\r\n }\r\n\r\n private buffer?: Buffer;\r\n\r\n constructor(readonly type: number) {\r\n super(type);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n if (!this.buffer) {\r\n const buffer = Buffer.alloc(CommandControlMessage.PAYLOAD_LENGTH + 1);\r\n buffer.writeUInt8(this.type, 0);\r\n this.buffer = buffer;\r\n }\r\n return this.buffer;\r\n }\r\n\r\n public toString(): string {\r\n const buffer = this.buffer ? `, buffer=[${this.buffer.join(',')}]` : '';\r\n return `CommandControlMessage{action=${this.type}${buffer}}`;\r\n }\r\n}\r\n\r\n","export default class KeyEvent {\r\n public static readonly ACTION_DOWN: number = 0;\r\n public static readonly ACTION_UP: number = 1;\r\n\r\n public static readonly KEYCODE_0: number = 7;\r\n public static readonly KEYCODE_1: number = 8;\r\n public static readonly KEYCODE_11: number = 227;\r\n public static readonly KEYCODE_12: number = 228;\r\n public static readonly KEYCODE_2: number = 9;\r\n public static readonly KEYCODE_3: number = 10;\r\n public static readonly KEYCODE_3D_MODE: number = 206;\r\n public static readonly KEYCODE_4: number = 11;\r\n public static readonly KEYCODE_5: number = 12;\r\n public static readonly KEYCODE_6: number = 13;\r\n public static readonly KEYCODE_7: number = 14;\r\n public static readonly KEYCODE_8: number = 15;\r\n public static readonly KEYCODE_9: number = 16;\r\n public static readonly KEYCODE_A: number = 29;\r\n public static readonly KEYCODE_ALL_APPS: number = 284;\r\n public static readonly KEYCODE_ALT_LEFT: number = 57;\r\n public static readonly KEYCODE_ALT_RIGHT: number = 58;\r\n public static readonly KEYCODE_APOSTROPHE: number = 75;\r\n public static readonly KEYCODE_APP_SWITCH: number = 187;\r\n public static readonly KEYCODE_ASSIST: number = 219;\r\n public static readonly KEYCODE_AT: number = 77;\r\n public static readonly KEYCODE_AVR_INPUT: number = 182;\r\n public static readonly KEYCODE_AVR_POWER: number = 181;\r\n public static readonly KEYCODE_B: number = 30;\r\n public static readonly KEYCODE_BACK: number = 4;\r\n public static readonly KEYCODE_BACKSLASH: number = 73;\r\n public static readonly KEYCODE_BOOKMARK: number = 174;\r\n public static readonly KEYCODE_BREAK: number = 121;\r\n public static readonly KEYCODE_BRIGHTNESS_DOWN: number = 220;\r\n public static readonly KEYCODE_BRIGHTNESS_UP: number = 221;\r\n public static readonly KEYCODE_BUTTON_1: number = 188;\r\n public static readonly KEYCODE_BUTTON_10: number = 197;\r\n public static readonly KEYCODE_BUTTON_11: number = 198;\r\n public static readonly KEYCODE_BUTTON_12: number = 199;\r\n public static readonly KEYCODE_BUTTON_13: number = 200;\r\n public static readonly KEYCODE_BUTTON_14: number = 201;\r\n public static readonly KEYCODE_BUTTON_15: number = 202;\r\n public static readonly KEYCODE_BUTTON_16: number = 203;\r\n public static readonly KEYCODE_BUTTON_2: number = 189;\r\n public static readonly KEYCODE_BUTTON_3: number = 190;\r\n public static readonly KEYCODE_BUTTON_4: number = 191;\r\n public static readonly KEYCODE_BUTTON_5: number = 192;\r\n public static readonly KEYCODE_BUTTON_6: number = 193;\r\n public static readonly KEYCODE_BUTTON_7: number = 194;\r\n public static readonly KEYCODE_BUTTON_8: number = 195;\r\n public static readonly KEYCODE_BUTTON_9: number = 196;\r\n public static readonly KEYCODE_BUTTON_A: number = 96;\r\n public static readonly KEYCODE_BUTTON_B: number = 97;\r\n public static readonly KEYCODE_BUTTON_C: number = 98;\r\n public static readonly KEYCODE_BUTTON_L1: number = 102;\r\n public static readonly KEYCODE_BUTTON_L2: number = 104;\r\n public static readonly KEYCODE_BUTTON_MODE: number = 110;\r\n public static readonly KEYCODE_BUTTON_R1: number = 103;\r\n public static readonly KEYCODE_BUTTON_R2: number = 105;\r\n public static readonly KEYCODE_BUTTON_SELECT: number = 109;\r\n public static readonly KEYCODE_BUTTON_START: number = 108;\r\n public static readonly KEYCODE_BUTTON_THUMBL: number = 106;\r\n public static readonly KEYCODE_BUTTON_THUMBR: number = 107;\r\n public static readonly KEYCODE_BUTTON_X: number = 99;\r\n public static readonly KEYCODE_BUTTON_Y: number = 100;\r\n public static readonly KEYCODE_BUTTON_Z: number = 101;\r\n public static readonly KEYCODE_C: number = 31;\r\n public static readonly KEYCODE_CALCULATOR: number = 210;\r\n public static readonly KEYCODE_CALENDAR: number = 208;\r\n public static readonly KEYCODE_CALL: number = 5;\r\n public static readonly KEYCODE_CAMERA: number = 27;\r\n public static readonly KEYCODE_CAPS_LOCK: number = 115;\r\n public static readonly KEYCODE_CAPTIONS: number = 175;\r\n public static readonly KEYCODE_CHANNEL_DOWN: number = 167;\r\n public static readonly KEYCODE_CHANNEL_UP: number = 166;\r\n public static readonly KEYCODE_CLEAR: number = 28;\r\n public static readonly KEYCODE_COMMA: number = 55;\r\n public static readonly KEYCODE_CONTACTS: number = 207;\r\n public static readonly KEYCODE_COPY: number = 278;\r\n public static readonly KEYCODE_CTRL_LEFT: number = 113;\r\n public static readonly KEYCODE_CTRL_RIGHT: number = 114;\r\n public static readonly KEYCODE_CUT: number = 277;\r\n public static readonly KEYCODE_D: number = 32;\r\n public static readonly KEYCODE_DEL: number = 67;\r\n public static readonly KEYCODE_DPAD_CENTER: number = 23;\r\n public static readonly KEYCODE_DPAD_DOWN: number = 20;\r\n public static readonly KEYCODE_DPAD_DOWN_LEFT: number = 269;\r\n public static readonly KEYCODE_DPAD_DOWN_RIGHT: number = 271;\r\n public static readonly KEYCODE_DPAD_LEFT: number = 21;\r\n public static readonly KEYCODE_DPAD_RIGHT: number = 22;\r\n public static readonly KEYCODE_DPAD_UP: number = 19;\r\n public static readonly KEYCODE_DPAD_UP_LEFT: number = 268;\r\n public static readonly KEYCODE_DPAD_UP_RIGHT: number = 270;\r\n public static readonly KEYCODE_DVR: number = 173;\r\n public static readonly KEYCODE_E: number = 33;\r\n public static readonly KEYCODE_EISU: number = 212;\r\n public static readonly KEYCODE_ENDCALL: number = 6;\r\n public static readonly KEYCODE_ENTER: number = 66;\r\n public static readonly KEYCODE_ENVELOPE: number = 65;\r\n public static readonly KEYCODE_EQUALS: number = 70;\r\n public static readonly KEYCODE_ESCAPE: number = 111;\r\n public static readonly KEYCODE_EXPLORER: number = 64;\r\n public static readonly KEYCODE_F: number = 34;\r\n public static readonly KEYCODE_F1: number = 131;\r\n public static readonly KEYCODE_F10: number = 140;\r\n public static readonly KEYCODE_F11: number = 141;\r\n public static readonly KEYCODE_F12: number = 142;\r\n public static readonly KEYCODE_F2: number = 132;\r\n public static readonly KEYCODE_F3: number = 133;\r\n public static readonly KEYCODE_F4: number = 134;\r\n public static readonly KEYCODE_F5: number = 135;\r\n public static readonly KEYCODE_F6: number = 136;\r\n public static readonly KEYCODE_F7: number = 137;\r\n public static readonly KEYCODE_F8: number = 138;\r\n public static readonly KEYCODE_F9: number = 139;\r\n public static readonly KEYCODE_FOCUS: number = 80;\r\n public static readonly KEYCODE_FORWARD: number = 125;\r\n public static readonly KEYCODE_FORWARD_DEL: number = 112;\r\n public static readonly KEYCODE_FUNCTION: number = 119;\r\n public static readonly KEYCODE_G: number = 35;\r\n public static readonly KEYCODE_GRAVE: number = 68;\r\n public static readonly KEYCODE_GUIDE: number = 172;\r\n public static readonly KEYCODE_H: number = 36;\r\n public static readonly KEYCODE_HEADSETHOOK: number = 79;\r\n public static readonly KEYCODE_HELP: number = 259;\r\n public static readonly KEYCODE_HENKAN: number = 214;\r\n public static readonly KEYCODE_HOME: number = 3;\r\n public static readonly KEYCODE_I: number = 37;\r\n public static readonly KEYCODE_INFO: number = 165;\r\n public static readonly KEYCODE_INSERT: number = 124;\r\n public static readonly KEYCODE_J: number = 38;\r\n public static readonly KEYCODE_K: number = 39;\r\n public static readonly KEYCODE_KANA: number = 218;\r\n public static readonly KEYCODE_KATAKANA_HIRAGANA: number = 215;\r\n public static readonly KEYCODE_L: number = 40;\r\n public static readonly KEYCODE_LANGUAGE_SWITCH: number = 204;\r\n public static readonly KEYCODE_LAST_CHANNEL: number = 229;\r\n public static readonly KEYCODE_LEFT_BRACKET: number = 71;\r\n public static readonly KEYCODE_M: number = 41;\r\n public static readonly KEYCODE_MANNER_MODE: number = 205;\r\n public static readonly KEYCODE_MEDIA_AUDIO_TRACK: number = 222;\r\n public static readonly KEYCODE_MEDIA_CLOSE: number = 128;\r\n public static readonly KEYCODE_MEDIA_EJECT: number = 129;\r\n public static readonly KEYCODE_MEDIA_FAST_FORWARD: number = 90;\r\n public static readonly KEYCODE_MEDIA_NEXT: number = 87;\r\n public static readonly KEYCODE_MEDIA_PAUSE: number = 127;\r\n public static readonly KEYCODE_MEDIA_PLAY: number = 126;\r\n public static readonly KEYCODE_MEDIA_PLAY_PAUSE: number = 85;\r\n public static readonly KEYCODE_MEDIA_PREVIOUS: number = 88;\r\n public static readonly KEYCODE_MEDIA_RECORD: number = 130;\r\n public static readonly KEYCODE_MEDIA_REWIND: number = 89;\r\n public static readonly KEYCODE_MEDIA_SKIP_BACKWARD: number = 273;\r\n public static readonly KEYCODE_MEDIA_SKIP_FORWARD: number = 272;\r\n public static readonly KEYCODE_MEDIA_STEP_BACKWARD: number = 275;\r\n public static readonly KEYCODE_MEDIA_STEP_FORWARD: number = 274;\r\n public static readonly KEYCODE_MEDIA_STOP: number = 86;\r\n public static readonly KEYCODE_MEDIA_TOP_MENU: number = 226;\r\n public static readonly KEYCODE_MENU: number = 82;\r\n public static readonly KEYCODE_META_LEFT: number = 117;\r\n public static readonly KEYCODE_META_RIGHT: number = 118;\r\n public static readonly KEYCODE_MINUS: number = 69;\r\n public static readonly KEYCODE_MOVE_END: number = 123;\r\n public static readonly KEYCODE_MOVE_HOME: number = 122;\r\n public static readonly KEYCODE_MUHENKAN: number = 213;\r\n public static readonly KEYCODE_MUSIC: number = 209;\r\n public static readonly KEYCODE_MUTE: number = 91;\r\n public static readonly KEYCODE_N: number = 42;\r\n public static readonly KEYCODE_NAVIGATE_IN: number = 262;\r\n public static readonly KEYCODE_NAVIGATE_NEXT: number = 261;\r\n public static readonly KEYCODE_NAVIGATE_OUT: number = 263;\r\n public static readonly KEYCODE_NAVIGATE_PREVIOUS: number = 260;\r\n public static readonly KEYCODE_NOTIFICATION: number = 83;\r\n public static readonly KEYCODE_NUM: number = 78;\r\n public static readonly KEYCODE_NUMPAD_0: number = 144;\r\n public static readonly KEYCODE_NUMPAD_1: number = 145;\r\n public static readonly KEYCODE_NUMPAD_2: number = 146;\r\n public static readonly KEYCODE_NUMPAD_3: number = 147;\r\n public static readonly KEYCODE_NUMPAD_4: number = 148;\r\n public static readonly KEYCODE_NUMPAD_5: number = 149;\r\n public static readonly KEYCODE_NUMPAD_6: number = 150;\r\n public static readonly KEYCODE_NUMPAD_7: number = 151;\r\n public static readonly KEYCODE_NUMPAD_8: number = 152;\r\n public static readonly KEYCODE_NUMPAD_9: number = 153;\r\n public static readonly KEYCODE_NUMPAD_ADD: number = 157;\r\n public static readonly KEYCODE_NUMPAD_COMMA: number = 159;\r\n public static readonly KEYCODE_NUMPAD_DIVIDE: number = 154;\r\n public static readonly KEYCODE_NUMPAD_DOT: number = 158;\r\n public static readonly KEYCODE_NUMPAD_ENTER: number = 160;\r\n public static readonly KEYCODE_NUMPAD_EQUALS: number = 161;\r\n public static readonly KEYCODE_NUMPAD_LEFT_PAREN: number = 162;\r\n public static readonly KEYCODE_NUMPAD_MULTIPLY: number = 155;\r\n public static readonly KEYCODE_NUMPAD_RIGHT_PAREN: number = 163;\r\n public static readonly KEYCODE_NUMPAD_SUBTRACT: number = 156;\r\n public static readonly KEYCODE_NUM_LOCK: number = 143;\r\n public static readonly KEYCODE_O: number = 43;\r\n public static readonly KEYCODE_P: number = 44;\r\n public static readonly KEYCODE_PAGE_DOWN: number = 93;\r\n public static readonly KEYCODE_PAGE_UP: number = 92;\r\n public static readonly KEYCODE_PAIRING: number = 225;\r\n public static readonly KEYCODE_PASTE: number = 279;\r\n public static readonly KEYCODE_PERIOD: number = 56;\r\n public static readonly KEYCODE_PICTSYMBOLS: number = 94;\r\n public static readonly KEYCODE_PLUS: number = 81;\r\n public static readonly KEYCODE_POUND: number = 18;\r\n public static readonly KEYCODE_POWER: number = 26;\r\n public static readonly KEYCODE_PROFILE_SWITCH: number = 288;\r\n public static readonly KEYCODE_PROG_BLUE: number = 186;\r\n public static readonly KEYCODE_PROG_GREEN: number = 184;\r\n public static readonly KEYCODE_PROG_RED: number = 183;\r\n public static readonly KEYCODE_PROG_YELLOW: number = 185;\r\n public static readonly KEYCODE_Q: number = 45;\r\n public static readonly KEYCODE_R: number = 46;\r\n public static readonly KEYCODE_REFRESH: number = 285;\r\n public static readonly KEYCODE_RIGHT_BRACKET: number = 72;\r\n public static readonly KEYCODE_RO: number = 217;\r\n public static readonly KEYCODE_S: number = 47;\r\n public static readonly KEYCODE_SCROLL_LOCK: number = 116;\r\n public static readonly KEYCODE_SEARCH: number = 84;\r\n public static readonly KEYCODE_SEMICOLON: number = 74;\r\n public static readonly KEYCODE_SETTINGS: number = 176;\r\n public static readonly KEYCODE_SHIFT_LEFT: number = 59;\r\n public static readonly KEYCODE_SHIFT_RIGHT: number = 60;\r\n public static readonly KEYCODE_SLASH: number = 76;\r\n public static readonly KEYCODE_SLEEP: number = 223;\r\n public static readonly KEYCODE_SOFT_LEFT: number = 1;\r\n public static readonly KEYCODE_SOFT_RIGHT: number = 2;\r\n public static readonly KEYCODE_SOFT_SLEEP: number = 276;\r\n public static readonly KEYCODE_SPACE: number = 62;\r\n public static readonly KEYCODE_STAR: number = 17;\r\n public static readonly KEYCODE_STB_INPUT: number = 180;\r\n public static readonly KEYCODE_STB_POWER: number = 179;\r\n public static readonly KEYCODE_STEM_1: number = 265;\r\n public static readonly KEYCODE_STEM_2: number = 266;\r\n public static readonly KEYCODE_STEM_3: number = 267;\r\n public static readonly KEYCODE_STEM_PRIMARY: number = 264;\r\n public static readonly KEYCODE_SWITCH_CHARSET: number = 95;\r\n public static readonly KEYCODE_SYM: number = 63;\r\n public static readonly KEYCODE_SYSRQ: number = 120;\r\n public static readonly KEYCODE_SYSTEM_NAVIGATION_DOWN: number = 281;\r\n public static readonly KEYCODE_SYSTEM_NAVIGATION_LEFT: number = 282;\r\n public static readonly KEYCODE_SYSTEM_NAVIGATION_RIGHT: number = 283;\r\n public static readonly KEYCODE_SYSTEM_NAVIGATION_UP: number = 280;\r\n public static readonly KEYCODE_T: number = 48;\r\n public static readonly KEYCODE_TAB: number = 61;\r\n public static readonly KEYCODE_THUMBS_DOWN: number = 287;\r\n public static readonly KEYCODE_THUMBS_UP: number = 286;\r\n public static readonly KEYCODE_TV: number = 170;\r\n public static readonly KEYCODE_TV_ANTENNA_CABLE: number = 242;\r\n public static readonly KEYCODE_TV_AUDIO_DESCRIPTION: number = 252;\r\n public static readonly KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN: number = 254;\r\n public static readonly KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP: number = 253;\r\n public static readonly KEYCODE_TV_CONTENTS_MENU: number = 256;\r\n public static readonly KEYCODE_TV_DATA_SERVICE: number = 230;\r\n public static readonly KEYCODE_TV_INPUT: number = 178;\r\n public static readonly KEYCODE_TV_INPUT_COMPONENT_1: number = 249;\r\n public static readonly KEYCODE_TV_INPUT_COMPONENT_2: number = 250;\r\n public static readonly KEYCODE_TV_INPUT_COMPOSITE_1: number = 247;\r\n public static readonly KEYCODE_TV_INPUT_COMPOSITE_2: number = 248;\r\n public static readonly KEYCODE_TV_INPUT_HDMI_1: number = 243;\r\n public static readonly KEYCODE_TV_INPUT_HDMI_2: number = 244;\r\n public static readonly KEYCODE_TV_INPUT_HDMI_3: number = 245;\r\n public static readonly KEYCODE_TV_INPUT_HDMI_4: number = 246;\r\n public static readonly KEYCODE_TV_INPUT_VGA_1: number = 251;\r\n public static readonly KEYCODE_TV_MEDIA_CONTEXT_MENU: number = 257;\r\n public static readonly KEYCODE_TV_NETWORK: number = 241;\r\n public static readonly KEYCODE_TV_NUMBER_ENTRY: number = 234;\r\n public static readonly KEYCODE_TV_POWER: number = 177;\r\n public static readonly KEYCODE_TV_RADIO_SERVICE: number = 232;\r\n public static readonly KEYCODE_TV_SATELLITE: number = 237;\r\n public static readonly KEYCODE_TV_SATELLITE_BS: number = 238;\r\n public static readonly KEYCODE_TV_SATELLITE_CS: number = 239;\r\n public static readonly KEYCODE_TV_SATELLITE_SERVICE: number = 240;\r\n public static readonly KEYCODE_TV_TELETEXT: number = 233;\r\n public static readonly KEYCODE_TV_TERRESTRIAL_ANALOG: number = 235;\r\n public static readonly KEYCODE_TV_TERRESTRIAL_DIGITAL: number = 236;\r\n public static readonly KEYCODE_TV_TIMER_PROGRAMMING: number = 258;\r\n public static readonly KEYCODE_TV_ZOOM_MODE: number = 255;\r\n public static readonly KEYCODE_U: number = 49;\r\n public static readonly KEYCODE_UNKNOWN: number = 0;\r\n public static readonly KEYCODE_V: number = 50;\r\n public static readonly KEYCODE_VOICE_ASSIST: number = 231;\r\n public static readonly KEYCODE_VOLUME_DOWN: number = 25;\r\n public static readonly KEYCODE_VOLUME_MUTE: number = 164;\r\n public static readonly KEYCODE_VOLUME_UP: number = 24;\r\n public static readonly KEYCODE_W: number = 51;\r\n public static readonly KEYCODE_WAKEUP: number = 224;\r\n public static readonly KEYCODE_WINDOW: number = 171;\r\n public static readonly KEYCODE_X: number = 52;\r\n public static readonly KEYCODE_Y: number = 53;\r\n public static readonly KEYCODE_YEN: number = 216;\r\n public static readonly KEYCODE_Z: number = 54;\r\n public static readonly KEYCODE_ZENKAKU_HANKAKU: number = 211;\r\n public static readonly KEYCODE_ZOOM_IN: number = 168;\r\n public static readonly KEYCODE_ZOOM_OUT: number = 169;\r\n\r\n public static readonly META_ALT_LEFT_ON: number = 16;\r\n public static readonly META_ALT_MASK: number = 50;\r\n public static readonly META_ALT_ON: number = 2;\r\n public static readonly META_ALT_RIGHT_ON: number = 32;\r\n public static readonly META_CAPS_LOCK_ON: number = 1048576;\r\n public static readonly META_CTRL_LEFT_ON: number = 8192;\r\n public static readonly META_CTRL_MASK: number = 28672;\r\n public static readonly META_CTRL_ON: number = 4096;\r\n public static readonly META_CTRL_RIGHT_ON: number = 16384;\r\n public static readonly META_FUNCTION_ON: number = 8;\r\n public static readonly META_META_LEFT_ON: number = 131072;\r\n public static readonly META_META_MASK: number = 458752;\r\n public static readonly META_META_ON: number = 65536;\r\n public static readonly META_META_RIGHT_ON: number = 262144;\r\n public static readonly META_NUM_LOCK_ON: number = 2097152;\r\n public static readonly META_SCROLL_LOCK_ON: number = 4194304;\r\n public static readonly META_SHIFT_LEFT_ON: number = 64;\r\n public static readonly META_SHIFT_MASK: number = 193;\r\n public static readonly META_SHIFT_ON: number = 1;\r\n public static readonly META_SHIFT_RIGHT_ON: number = 128;\r\n public static readonly META_SYM_ON: number = 4;\r\n}\r\n\r\n","// https://w3c.github.io/uievents-code/\r\n\r\nexport default class UIEventsCode {\r\n // 3.1.1.1. Writing System Keys\r\n public static readonly Backquote: string = 'Backquote';\r\n public static readonly Backslash: string = 'Backslash';\r\n public static readonly BracketLeft: string = 'BracketLeft';\r\n public static readonly BracketRight: string = 'BracketRight';\r\n public static readonly Comma: string = 'Comma';\r\n public static readonly Digit0: string = 'Digit0';\r\n public static readonly Digit1: string = 'Digit1';\r\n public static readonly Digit2: string = 'Digit2';\r\n public static readonly Digit3: string = 'Digit3';\r\n public static readonly Digit4: string = 'Digit4';\r\n public static readonly Digit5: string = 'Digit5';\r\n public static readonly Digit6: string = 'Digit6';\r\n public static readonly Digit7: string = 'Digit7';\r\n public static readonly Digit8: string = 'Digit8';\r\n public static readonly Digit9: string = 'Digit9';\r\n public static readonly Equal: string = 'Equal';\r\n public static readonly IntlBackslash: string = 'IntlBackslash';\r\n public static readonly IntlRo: string = 'IntlRo';\r\n public static readonly IntlYen: string = 'IntlYen';\r\n public static readonly KeyA: string = 'KeyA';\r\n public static readonly KeyB: string = 'KeyB';\r\n public static readonly KeyC: string = 'KeyC';\r\n public static readonly KeyD: string = 'KeyD';\r\n public static readonly KeyE: string = 'KeyE';\r\n public static readonly KeyF: string = 'KeyF';\r\n public static readonly KeyG: string = 'KeyG';\r\n public static readonly KeyH: string = 'KeyH';\r\n public static readonly KeyI: string = 'KeyI';\r\n public static readonly KeyJ: string = 'KeyJ';\r\n public static readonly KeyK: string = 'KeyK';\r\n public static readonly KeyL: string = 'KeyL';\r\n public static readonly KeyM: string = 'KeyM';\r\n public static readonly KeyN: string = 'KeyN';\r\n public static readonly KeyO: string = 'KeyO';\r\n public static readonly KeyP: string = 'KeyP';\r\n public static readonly KeyQ: string = 'KeyQ';\r\n public static readonly KeyR: string = 'KeyR';\r\n public static readonly KeyS: string = 'KeyS';\r\n public static readonly KeyT: string = 'KeyT';\r\n public static readonly KeyU: string = 'KeyU';\r\n public static readonly KeyV: string = 'KeyV';\r\n public static readonly KeyW: string = 'KeyW';\r\n public static readonly KeyX: string = 'KeyX';\r\n public static readonly KeyY: string = 'KeyY';\r\n public static readonly KeyZ: string = 'KeyZ';\r\n public static readonly Minus: string = 'Minus';\r\n public static readonly Period: string = 'Period';\r\n public static readonly Quote: string = 'Quote';\r\n public static readonly Semicolon: string = 'Semicolon';\r\n public static readonly Slash: string = 'Slash';\r\n\r\n // 3.1.1.2. Functional Keys\r\n public static readonly AltLeft: string = 'AltLeft';\r\n public static readonly AltRight: string = 'AltRight';\r\n public static readonly Backspace: string = 'Backspace';\r\n public static readonly CapsLock: string = 'CapsLock';\r\n public static readonly ContextMenu: string = 'ContextMenu';\r\n public static readonly ControlLeft: string = 'ControlLeft';\r\n public static readonly ControlRight: string = 'ControlRight';\r\n public static readonly Enter: string = 'Enter';\r\n public static readonly MetaLeft: string = 'MetaLeft';\r\n public static readonly MetaRight: string = 'MetaRight';\r\n public static readonly ShiftLeft: string = 'ShiftLeft';\r\n public static readonly ShiftRight: string = 'ShiftRight';\r\n public static readonly Space: string = 'Space';\r\n public static readonly Tab: string = 'Tab';\r\n public static readonly Convert: string = 'Convert';\r\n public static readonly KanaMode: string = 'KanaMode';\r\n public static readonly Lang1: string = 'Lang1';\r\n public static readonly Lang2: string = 'Lang2';\r\n public static readonly Lang3: string = 'Lang3';\r\n public static readonly Lang4: string = 'Lang4';\r\n public static readonly Lang5: string = 'Lang5';\r\n public static readonly NonConvert: string = 'NonConvert';\r\n\r\n // 3.1.2. Control Pad Section\r\n public static readonly Delete: string = 'Delete';\r\n public static readonly End: string = 'End';\r\n public static readonly Help: string = 'Help';\r\n public static readonly Home: string = 'Home';\r\n public static readonly Insert: string = 'Insert';\r\n public static readonly PageDown: string = 'PageDown';\r\n public static readonly PageUp: string = 'PageUp';\r\n\r\n // 3.1.3. Arrow Pad Section\r\n public static readonly ArrowDown: string = 'ArrowDown';\r\n public static readonly ArrowLeft: string = 'ArrowLeft';\r\n public static readonly ArrowRight: string = 'ArrowRight';\r\n public static readonly ArrowUp: string = 'ArrowUp';\r\n\r\n // 3.1.4. Numpad Section\r\n public static readonly NumLock: string = 'NumLock';\r\n public static readonly Numpad0: string = 'Numpad0';\r\n public static readonly Numpad1: string = 'Numpad1';\r\n public static readonly Numpad2: string = 'Numpad2';\r\n public static readonly Numpad3: string = 'Numpad3';\r\n public static readonly Numpad4: string = 'Numpad4';\r\n public static readonly Numpad5: string = 'Numpad5';\r\n public static readonly Numpad6: string = 'Numpad6';\r\n public static readonly Numpad7: string = 'Numpad7';\r\n public static readonly Numpad8: string = 'Numpad8';\r\n public static readonly Numpad9: string = 'Numpad9';\r\n public static readonly NumpadAdd: string = 'NumpadAdd';\r\n public static readonly NumpadBackspace: string = 'NumpadBackspace';\r\n public static readonly NumpadClear: string = 'NumpadClear';\r\n public static readonly NumpadClearEntry: string = 'NumpadClearEntry';\r\n public static readonly NumpadComma: string = 'NumpadComma';\r\n public static readonly NumpadDecimal: string = 'NumpadDecimal';\r\n public static readonly NumpadDivide: string = 'NumpadDivide';\r\n public static readonly NumpadEnter: string = 'NumpadEnter';\r\n public static readonly NumpadEqual: string = 'NumpadEqual';\r\n public static readonly NumpadHash: string = 'NumpadHash';\r\n public static readonly NumpadMemoryAdd: string = 'NumpadMemoryAdd';\r\n public static readonly NumpadMemoryClear: string = 'NumpadMemoryClear';\r\n public static readonly NumpadMemoryRecall: string = 'NumpadMemoryRecall';\r\n public static readonly NumpadMemoryStore: string = 'NumpadMemoryStore';\r\n public static readonly NumpadMemorySubtract: string = 'NumpadMemorySubtract';\r\n public static readonly NumpadMultiply: string = 'NumpadMultiply';\r\n public static readonly NumpadParenLeft: string = 'NumpadParenLeft';\r\n public static readonly NumpadParenRight: string = 'NumpadParenRight';\r\n public static readonly NumpadStar: string = 'NumpadStar';\r\n public static readonly NumpadSubtract: string = 'NumpadSubtract';\r\n\r\n // 3.1.5. Function Section\r\n public static readonly Escape: string = 'Escape';\r\n public static readonly F1: string = 'F1';\r\n public static readonly F2: string = 'F2';\r\n public static readonly F3: string = 'F3';\r\n public static readonly F4: string = 'F4';\r\n public static readonly F5: string = 'F5';\r\n public static readonly F6: string = 'F6';\r\n public static readonly F7: string = 'F7';\r\n public static readonly F8: string = 'F8';\r\n public static readonly F9: string = 'F9';\r\n public static readonly F10: string = 'F10';\r\n public static readonly F11: string = 'F11';\r\n public static readonly F12: string = 'F12';\r\n public static readonly Fn: string = 'Fn';\r\n public static readonly FnLock: string = 'FnLock';\r\n public static readonly PrintScreen: string = 'PrintScreen';\r\n public static readonly ScrollLock: string = 'ScrollLock';\r\n public static readonly Pause: string = 'Pause';\r\n\r\n // 3.1.6. Media Keys\r\n public static readonly BrowserBack: string = 'BrowserBack';\r\n public static readonly BrowserFavorites: string = 'BrowserFavorites';\r\n public static readonly BrowserForward: string = 'BrowserForward';\r\n public static readonly BrowserHome: string = 'BrowserHome';\r\n public static readonly BrowserRefresh: string = 'BrowserRefresh';\r\n public static readonly BrowserSearch: string = 'BrowserSearch';\r\n public static readonly BrowserStop: string = 'BrowserStop';\r\n public static readonly Eject: string = 'Eject';\r\n public static readonly LaunchApp1: string = 'LaunchApp1';\r\n public static readonly LaunchApp2: string = 'LaunchApp2';\r\n public static readonly LaunchMail: string = 'LaunchMail';\r\n public static readonly MediaPlayPause: string = 'MediaPlayPause';\r\n public static readonly MediaSelect: string = 'MediaSelect';\r\n public static readonly MediaStop: string = 'MediaStop';\r\n public static readonly MediaTrackNext: string = 'MediaTrackNext';\r\n public static readonly MediaTrackPrevious: string = 'MediaTrackPrevious';\r\n public static readonly Power: string = 'Power';\r\n public static readonly Sleep: string = 'Sleep';\r\n public static readonly AudioVolumeDown: string = 'AudioVolumeDown';\r\n public static readonly AudioVolumeMute: string = 'AudioVolumeMute';\r\n public static readonly AudioVolumeUp: string = 'AudioVolumeUp';\r\n public static readonly WakeUp: string = 'WakeUp';\r\n\r\n // 3.1.7. Legacy, Non-Standard and Special Keys\r\n public static readonly Hyper: string = 'Hyper';\r\n public static readonly Super: string = 'Super';\r\n public static readonly Turbo: string = 'Turbo';\r\n public static readonly Abort: string = 'Abort';\r\n public static readonly Resume: string = 'Resume';\r\n public static readonly Suspend: string = 'Suspend';\r\n public static readonly Again: string = 'Again';\r\n public static readonly Copy: string = 'Copy';\r\n public static readonly Cut: string = 'Cut';\r\n public static readonly Find: string = 'Find';\r\n public static readonly Open: string = 'Open';\r\n public static readonly Paste: string = 'Paste';\r\n public static readonly Props: string = 'Props';\r\n public static readonly Select: string = 'Select';\r\n public static readonly Undo: string = 'Undo';\r\n public static readonly Hiragana: string = 'Hiragana';\r\n public static readonly Katakana: string = 'Katakana';\r\n public static readonly Unidentified: string = 'Unidentified';\r\n}\r\n\r\n","import KeyEvent from './KeyEvent';\r\nimport UIEventsCode from './UIEventsCode';\r\n\r\nexport const KeyToCodeMap = new Map([\r\n [UIEventsCode.Backquote, KeyEvent.KEYCODE_GRAVE],\r\n [UIEventsCode.Backslash, KeyEvent.KEYCODE_BACKSLASH],\r\n [UIEventsCode.BracketLeft, KeyEvent.KEYCODE_LEFT_BRACKET],\r\n [UIEventsCode.BracketRight, KeyEvent.KEYCODE_RIGHT_BRACKET],\r\n [UIEventsCode.Comma, KeyEvent.KEYCODE_COMMA],\r\n [UIEventsCode.Digit0, KeyEvent.KEYCODE_0],\r\n [UIEventsCode.Digit1, KeyEvent.KEYCODE_1],\r\n [UIEventsCode.Digit2, KeyEvent.KEYCODE_2],\r\n [UIEventsCode.Digit3, KeyEvent.KEYCODE_3],\r\n [UIEventsCode.Digit4, KeyEvent.KEYCODE_4],\r\n [UIEventsCode.Digit5, KeyEvent.KEYCODE_5],\r\n [UIEventsCode.Digit6, KeyEvent.KEYCODE_6],\r\n [UIEventsCode.Digit7, KeyEvent.KEYCODE_7],\r\n [UIEventsCode.Digit8, KeyEvent.KEYCODE_8],\r\n [UIEventsCode.Digit9, KeyEvent.KEYCODE_9],\r\n [UIEventsCode.Equal, KeyEvent.KEYCODE_EQUALS],\r\n [UIEventsCode.IntlRo, KeyEvent.KEYCODE_RO],\r\n [UIEventsCode.IntlYen, KeyEvent.KEYCODE_YEN],\r\n [UIEventsCode.KeyA, KeyEvent.KEYCODE_A],\r\n [UIEventsCode.KeyB, KeyEvent.KEYCODE_B],\r\n [UIEventsCode.KeyC, KeyEvent.KEYCODE_C],\r\n [UIEventsCode.KeyD, KeyEvent.KEYCODE_D],\r\n [UIEventsCode.KeyE, KeyEvent.KEYCODE_E],\r\n [UIEventsCode.KeyF, KeyEvent.KEYCODE_F],\r\n [UIEventsCode.KeyG, KeyEvent.KEYCODE_G],\r\n [UIEventsCode.KeyH, KeyEvent.KEYCODE_H],\r\n [UIEventsCode.KeyI, KeyEvent.KEYCODE_I],\r\n [UIEventsCode.KeyJ, KeyEvent.KEYCODE_J],\r\n [UIEventsCode.KeyK, KeyEvent.KEYCODE_K],\r\n [UIEventsCode.KeyL, KeyEvent.KEYCODE_L],\r\n [UIEventsCode.KeyM, KeyEvent.KEYCODE_M],\r\n [UIEventsCode.KeyN, KeyEvent.KEYCODE_N],\r\n [UIEventsCode.KeyO, KeyEvent.KEYCODE_O],\r\n [UIEventsCode.KeyP, KeyEvent.KEYCODE_P],\r\n [UIEventsCode.KeyQ, KeyEvent.KEYCODE_Q],\r\n [UIEventsCode.KeyR, KeyEvent.KEYCODE_R],\r\n [UIEventsCode.KeyS, KeyEvent.KEYCODE_S],\r\n [UIEventsCode.KeyT, KeyEvent.KEYCODE_T],\r\n [UIEventsCode.KeyU, KeyEvent.KEYCODE_U],\r\n [UIEventsCode.KeyV, KeyEvent.KEYCODE_V],\r\n [UIEventsCode.KeyW, KeyEvent.KEYCODE_W],\r\n [UIEventsCode.KeyX, KeyEvent.KEYCODE_X],\r\n [UIEventsCode.KeyY, KeyEvent.KEYCODE_Y],\r\n [UIEventsCode.KeyZ, KeyEvent.KEYCODE_Z],\r\n [UIEventsCode.Minus, KeyEvent.KEYCODE_MINUS],\r\n [UIEventsCode.Period, KeyEvent.KEYCODE_PERIOD],\r\n [UIEventsCode.Quote, KeyEvent.KEYCODE_APOSTROPHE],\r\n [UIEventsCode.Semicolon, KeyEvent.KEYCODE_SEMICOLON],\r\n [UIEventsCode.Slash, KeyEvent.KEYCODE_SLASH],\r\n [UIEventsCode.KanaMode, KeyEvent.KEYCODE_KANA],\r\n [UIEventsCode.Delete, KeyEvent.KEYCODE_FORWARD_DEL],\r\n [UIEventsCode.End, KeyEvent.KEYCODE_MOVE_END],\r\n [UIEventsCode.Help, KeyEvent.KEYCODE_HELP],\r\n [UIEventsCode.Home, KeyEvent.KEYCODE_MOVE_HOME],\r\n [UIEventsCode.Insert, KeyEvent.KEYCODE_INSERT],\r\n [UIEventsCode.PageDown, KeyEvent.KEYCODE_PAGE_DOWN],\r\n [UIEventsCode.PageUp, KeyEvent.KEYCODE_PAGE_UP],\r\n [UIEventsCode.AltLeft, KeyEvent.KEYCODE_ALT_LEFT],\r\n [UIEventsCode.AltRight, KeyEvent.KEYCODE_ALT_RIGHT],\r\n [UIEventsCode.Backspace, KeyEvent.KEYCODE_DEL],\r\n [UIEventsCode.CapsLock, KeyEvent.KEYCODE_CAPS_LOCK],\r\n [UIEventsCode.ControlLeft, KeyEvent.KEYCODE_CTRL_LEFT],\r\n [UIEventsCode.ControlRight, KeyEvent.KEYCODE_CTRL_RIGHT],\r\n [UIEventsCode.Enter, KeyEvent.KEYCODE_ENTER],\r\n [UIEventsCode.MetaLeft, KeyEvent.KEYCODE_META_LEFT],\r\n [UIEventsCode.MetaRight, KeyEvent.KEYCODE_META_RIGHT],\r\n [UIEventsCode.ShiftLeft, KeyEvent.KEYCODE_SHIFT_LEFT],\r\n [UIEventsCode.ShiftRight, KeyEvent.KEYCODE_SHIFT_RIGHT],\r\n [UIEventsCode.Space, KeyEvent.KEYCODE_SPACE],\r\n [UIEventsCode.Tab, KeyEvent.KEYCODE_TAB],\r\n [UIEventsCode.ArrowLeft, KeyEvent.KEYCODE_DPAD_LEFT],\r\n [UIEventsCode.ArrowUp, KeyEvent.KEYCODE_DPAD_UP],\r\n [UIEventsCode.ArrowRight, KeyEvent.KEYCODE_DPAD_RIGHT],\r\n [UIEventsCode.ArrowDown, KeyEvent.KEYCODE_DPAD_DOWN],\r\n\r\n [UIEventsCode.NumLock, KeyEvent.KEYCODE_NUM_LOCK],\r\n [UIEventsCode.Numpad0, KeyEvent.KEYCODE_NUMPAD_0],\r\n [UIEventsCode.Numpad1, KeyEvent.KEYCODE_NUMPAD_1],\r\n [UIEventsCode.Numpad2, KeyEvent.KEYCODE_NUMPAD_2],\r\n [UIEventsCode.Numpad3, KeyEvent.KEYCODE_NUMPAD_3],\r\n [UIEventsCode.Numpad4, KeyEvent.KEYCODE_NUMPAD_4],\r\n [UIEventsCode.Numpad5, KeyEvent.KEYCODE_NUMPAD_5],\r\n [UIEventsCode.Numpad6, KeyEvent.KEYCODE_NUMPAD_7],\r\n [UIEventsCode.Numpad8, KeyEvent.KEYCODE_NUMPAD_8],\r\n [UIEventsCode.Numpad9, KeyEvent.KEYCODE_NUMPAD_9],\r\n [UIEventsCode.NumpadAdd, KeyEvent.KEYCODE_NUMPAD_ADD],\r\n [UIEventsCode.NumpadComma, KeyEvent.KEYCODE_NUMPAD_COMMA],\r\n [UIEventsCode.NumpadDecimal, KeyEvent.KEYCODE_NUMPAD_DOT],\r\n [UIEventsCode.NumpadDivide, KeyEvent.KEYCODE_NUMPAD_DIVIDE],\r\n [UIEventsCode.NumpadEnter, KeyEvent.KEYCODE_NUMPAD_ENTER],\r\n [UIEventsCode.NumpadEqual, KeyEvent.KEYCODE_NUMPAD_EQUALS],\r\n [UIEventsCode.NumpadMultiply, KeyEvent.KEYCODE_NUMPAD_MULTIPLY],\r\n [UIEventsCode.NumpadParenLeft, KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN],\r\n [UIEventsCode.NumpadParenRight, KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN],\r\n [UIEventsCode.NumpadSubtract, KeyEvent.KEYCODE_NUMPAD_SUBTRACT],\r\n\r\n [UIEventsCode.Escape, KeyEvent.KEYCODE_ESCAPE],\r\n [UIEventsCode.F1, KeyEvent.KEYCODE_F1],\r\n [UIEventsCode.F2, KeyEvent.KEYCODE_F2],\r\n [UIEventsCode.F3, KeyEvent.KEYCODE_F3],\r\n [UIEventsCode.F4, KeyEvent.KEYCODE_F4],\r\n [UIEventsCode.F5, KeyEvent.KEYCODE_F5],\r\n [UIEventsCode.F6, KeyEvent.KEYCODE_F6],\r\n [UIEventsCode.F7, KeyEvent.KEYCODE_F7],\r\n [UIEventsCode.F8, KeyEvent.KEYCODE_F8],\r\n [UIEventsCode.F9, KeyEvent.KEYCODE_F9],\r\n [UIEventsCode.F10, KeyEvent.KEYCODE_F10],\r\n [UIEventsCode.F11, KeyEvent.KEYCODE_F11],\r\n [UIEventsCode.F12, KeyEvent.KEYCODE_F12],\r\n [UIEventsCode.Fn, KeyEvent.KEYCODE_FUNCTION],\r\n [UIEventsCode.PrintScreen, KeyEvent.KEYCODE_SYSRQ],\r\n [UIEventsCode.Pause, KeyEvent.KEYCODE_BREAK],\r\n]);\r\n\r\n","import { KeyCodeControlMessage } from '../messages/KeyCodeControlMessage';\r\nimport KeyEvent from './KeyEvent';\r\nimport { KeyToCodeMap } from './KeyToCodeMap';\r\n\r\nexport interface KeyEventListener {\r\n onKeyEvent: (event: KeyCodeControlMessage) => void;\r\n}\r\n\r\nexport class KeyInputHandler {\r\n private static readonly repeatCounter: Map<number, number> = new Map();\r\n private static readonly listeners: Set<KeyEventListener> = new Set();\r\n private static handler = (event: Event): void => {\r\n const keyboardEvent = event as KeyboardEvent;\r\n const keyCode = KeyToCodeMap.get(keyboardEvent.code);\r\n if (!keyCode) {\r\n return;\r\n }\r\n let action: typeof KeyEvent.ACTION_DOWN | typeof KeyEvent.ACTION_DOWN;\r\n let repeatCount = 0;\r\n if (keyboardEvent.type === 'keydown') {\r\n action = KeyEvent.ACTION_DOWN;\r\n if (keyboardEvent.repeat) {\r\n let count = KeyInputHandler.repeatCounter.get(keyCode);\r\n if (typeof count !== 'number') {\r\n count = 1;\r\n } else {\r\n count++;\r\n }\r\n repeatCount = count;\r\n KeyInputHandler.repeatCounter.set(keyCode, count);\r\n }\r\n } else if (keyboardEvent.type === 'keyup') {\r\n action = KeyEvent.ACTION_UP;\r\n KeyInputHandler.repeatCounter.delete(keyCode);\r\n } else {\r\n return;\r\n }\r\n const metaState =\r\n (keyboardEvent.getModifierState('Alt') ? KeyEvent.META_ALT_ON : 0) |\r\n (keyboardEvent.getModifierState('Shift') ? KeyEvent.META_SHIFT_ON : 0) |\r\n (keyboardEvent.getModifierState('Control') ? KeyEvent.META_CTRL_ON : 0) |\r\n (keyboardEvent.getModifierState('Meta') ? KeyEvent.META_META_ON : 0) |\r\n (keyboardEvent.getModifierState('CapsLock') ? KeyEvent.META_CAPS_LOCK_ON : 0) |\r\n (keyboardEvent.getModifierState('ScrollLock') ? KeyEvent.META_SCROLL_LOCK_ON : 0) |\r\n (keyboardEvent.getModifierState('NumLock') ? KeyEvent.META_NUM_LOCK_ON : 0);\r\n\r\n const controlMessage: KeyCodeControlMessage = new KeyCodeControlMessage(\r\n action,\r\n keyCode,\r\n repeatCount,\r\n metaState,\r\n );\r\n KeyInputHandler.listeners.forEach((listener) => {\r\n listener.onKeyEvent(controlMessage);\r\n });\r\n event.preventDefault();\r\n };\r\n private static attachListeners(): void {\r\n document.body.addEventListener('keydown', this.handler);\r\n document.body.addEventListener('keyup', this.handler);\r\n }\r\n private static detachListeners(): void {\r\n document.body.removeEventListener('keydown', this.handler);\r\n document.body.removeEventListener('keyup', this.handler);\r\n }\r\n public static addEventListener(listener: KeyEventListener): void {\r\n if (!this.listeners.size) {\r\n this.attachListeners();\r\n }\r\n this.listeners.add(listener);\r\n }\r\n public static removeEventListener(listener: KeyEventListener): void {\r\n this.listeners.delete(listener);\r\n if (!this.listeners.size) {\r\n this.detachListeners();\r\n }\r\n }\r\n}\r\n\r\n","interface RectInterface {\r\n left: number;\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n}\r\n\r\nexport default class Rect {\r\n constructor(readonly left: number, readonly top: number, readonly right: number, readonly bottom: number) {\r\n this.left = left;\r\n this.top = top;\r\n this.right = right;\r\n this.bottom = bottom;\r\n }\r\n public static equals(a?: Rect | null, b?: Rect | null): boolean {\r\n if (!a && !b) {\r\n return true;\r\n }\r\n return !!a && !!b && a.equals(b);\r\n }\r\n public static copy(a?: Rect | null): Rect | null {\r\n if (!a) {\r\n return null;\r\n }\r\n return new Rect(a.left, a.top, a.right, a.bottom);\r\n }\r\n public equals(o: Rect | null): boolean {\r\n if (this === o) {\r\n return true;\r\n }\r\n if (!o) {\r\n return false;\r\n }\r\n return this.left === o.left && this.top === o.top && this.right === o.right && this.bottom === o.bottom;\r\n }\r\n\r\n public getWidth(): number {\r\n return this.right - this.left;\r\n }\r\n\r\n public getHeight(): number {\r\n return this.bottom - this.top;\r\n }\r\n\r\n public toString(): string {\r\n // prettier-ignore\r\n return `Rect{left=${\r\n this.left}, top=${\r\n this.top}, right=${\r\n this.right}, bottom=${\r\n this.bottom}}`;\r\n }\r\n\r\n public toJSON(): RectInterface {\r\n return {\r\n left: this.left,\r\n right: this.right,\r\n top: this.top,\r\n bottom: this.bottom,\r\n };\r\n }\r\n}\r\n\r\n","import Rect from './Rect';\r\nimport Size from './Size';\r\n\r\nexport default class ScreenInfo {\r\n public static readonly BUFFER_LENGTH: number = 25;\r\n constructor(readonly contentRect: Rect, readonly videoSize: Size, readonly deviceRotation: number) {}\r\n\r\n public static fromBuffer(buffer: Buffer): ScreenInfo {\r\n const left = buffer.readInt32BE(0);\r\n const top = buffer.readInt32BE(4);\r\n const right = buffer.readInt32BE(8);\r\n const bottom = buffer.readInt32BE(12);\r\n const width = buffer.readInt32BE(16);\r\n const height = buffer.readInt32BE(20);\r\n const deviceRotation = buffer.readUInt8(24);\r\n return new ScreenInfo(new Rect(left, top, right, bottom), new Size(width, height), deviceRotation);\r\n }\r\n\r\n public equals(o?: ScreenInfo | null): boolean {\r\n if (!o) {\r\n return false;\r\n }\r\n return (\r\n this.contentRect.equals(o.contentRect) &&\r\n this.videoSize.equals(o.videoSize) &&\r\n this.deviceRotation === o.deviceRotation\r\n );\r\n }\r\n\r\n public toString(): string {\r\n return `ScreenInfo{contentRect=${this.contentRect}, videoSize=${this.videoSize}, deviceRotation=${this.deviceRotation}}`;\r\n }\r\n}\r\n\r\n"],"names":["buffer","Buffer","TAG","pointerId","FilePushState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/models/MotionEvent.ts","../src/messages/ControlMessage.ts","../src/messages/TouchControlMessage.ts","../src/models/Size.ts","../src/models/Point.ts","../src/models/Position.ts","../src/utils/Util.ts","../src/interaction/InteractionHandler.ts","../src/messages/ScrollControlMessage.ts","../src/interaction/FeaturedInteractionHandler.ts","../src/interaction/SimpleInteractionHandler.ts","../src/messages/KeyCodeControlMessage.ts","../src/messages/TextControlMessage.ts","../src/messages/CommandControlMessage.ts","../src/input/KeyEvent.ts","../src/input/UIEventsCode.ts","../src/input/KeyToCodeMap.ts","../src/input/KeyInputHandler.ts","../src/models/Rect.ts","../src/models/ScreenInfo.ts"],"sourcesContent":["export default class MotionEvent {\r\n public static ACTION_DOWN = 0;\r\n public static ACTION_UP = 1;\r\n public static ACTION_MOVE = 2;\r\n /**\r\n * Button constant: Primary button (left mouse button).\r\n */\r\n public static BUTTON_PRIMARY: number = 1 << 0;\r\n\r\n /**\r\n * Button constant: Secondary button (right mouse button).\r\n */\r\n public static BUTTON_SECONDARY: number = 1 << 1;\r\n\r\n /**\r\n * Button constant: Tertiary button (middle mouse button).\r\n */\r\n public static BUTTON_TERTIARY: number = 1 << 2;\r\n}\r\n\r\n","export interface ControlMessageInterface {\r\n type: number;\r\n}\r\n\r\nexport class ControlMessage {\r\n public static TYPE_KEYCODE = 0;\r\n public static TYPE_TEXT = 1;\r\n public static TYPE_TOUCH = 2;\r\n public static TYPE_SCROLL = 3;\r\n public static TYPE_BACK_OR_SCREEN_ON = 4;\r\n public static TYPE_EXPAND_NOTIFICATION_PANEL = 5;\r\n public static TYPE_EXPAND_SETTINGS_PANEL = 6;\r\n public static TYPE_COLLAPSE_PANELS = 7;\r\n public static TYPE_GET_CLIPBOARD = 8;\r\n public static TYPE_SET_CLIPBOARD = 9;\r\n public static TYPE_SET_SCREEN_POWER_MODE = 10;\r\n public static TYPE_ROTATE_DEVICE = 11;\r\n public static TYPE_CHANGE_STREAM_PARAMETERS = 101;\r\n public static TYPE_PUSH_FILE = 102;\r\n\r\n constructor(readonly type: number) {}\r\n\r\n public toBuffer(): Buffer {\r\n throw Error('Not implemented');\r\n }\r\n\r\n public toString(): string {\r\n return 'ControlMessage';\r\n }\r\n\r\n public toJSON(): ControlMessageInterface {\r\n return {\r\n type: this.type,\r\n };\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage, ControlMessageInterface } from './ControlMessage';\r\nimport Position, { PositionInterface } from '../models/Position';\r\n\r\nexport interface TouchControlMessageInterface extends ControlMessageInterface {\r\n type: number;\r\n action: number;\r\n pointerId: number;\r\n position: PositionInterface;\r\n pressure: number;\r\n buttons: number;\r\n}\r\n\r\nexport class TouchControlMessage extends ControlMessage {\r\n public static PAYLOAD_LENGTH = 28 + 4; // 1字节代表群控还是单控,后面4字节为底层需要填充\r\n /**\r\n * - For a touch screen or touch pad, reports the approximate pressure\r\n * applied to the surface by a finger or other tool. The value is\r\n * normalized to a range from 0 (no pressure at all) to 1 (normal pressure),\r\n * although values higher than 1 may be generated depending on the\r\n * calibration of the input device.\r\n * - For a trackball, the value is set to 1 if the trackball button is pressed\r\n * or 0 otherwise.\r\n * - For a mouse, the value is set to 1 if the primary mouse button is pressed\r\n * or 0 otherwise.\r\n *\r\n * - scrcpy server expects signed short (2 bytes) for a pressure value\r\n * - in browser TouchEvent has `force` property (values in 0..1 range), we\r\n * use it as \"pressure\" for scrcpy\r\n */\r\n public static readonly MAX_PRESSURE_VALUE = 0xffff;\r\n\r\n constructor(\r\n readonly action: number,\r\n readonly pointerId: number,\r\n readonly position: Position,\r\n readonly pressure: number,\r\n readonly buttons: number,\r\n ) {\r\n super(ControlMessage.TYPE_TOUCH);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n const buffer: Buffer = Buffer.alloc(TouchControlMessage.PAYLOAD_LENGTH+1);\r\n let offset = 0;\r\n offset = buffer.writeUInt8(0, offset); // 0代表群控,从1开始代表单控\r\n offset = buffer.writeUInt8(this.type, offset);\r\n offset = buffer.writeUInt8(this.action, offset);\r\n offset = buffer.writeUInt32BE(0, offset); // pointerId is `long` (8 bytes) on java side\r\n offset = buffer.writeUInt32BE(this.pointerId, offset);\r\n offset = buffer.writeUInt32BE(this.position.point.x, offset);\r\n offset = buffer.writeUInt32BE(this.position.point.y, offset);\r\n offset = buffer.writeUInt16BE(this.position.screenSize.width, offset);\r\n offset = buffer.writeUInt16BE(this.position.screenSize.height, offset);\r\n offset = buffer.writeUInt16BE(this.pressure * TouchControlMessage.MAX_PRESSURE_VALUE, offset);\r\n offset = buffer.writeUInt32BE(0, offset); // 底层需要填充4字节\r\n buffer.writeUInt32BE(this.buttons, offset);\r\n return buffer;\r\n }\r\n\r\n public toString(): string {\r\n return `TouchControlMessage{action=${this.action}, pointerId=${this.pointerId}, position=${this.position}, pressure=${this.pressure}, buttons=${this.buttons}}`;\r\n }\r\n\r\n public toJSON(): TouchControlMessageInterface {\r\n return {\r\n type: this.type,\r\n action: this.action,\r\n pointerId: this.pointerId,\r\n position: this.position.toJSON(),\r\n pressure: this.pressure,\r\n buttons: this.buttons,\r\n };\r\n }\r\n}\r\n\r\n","export interface SizeInterface {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport default class Size {\r\n public readonly w: number;\r\n public readonly h: number;\r\n\r\n constructor(readonly width: number, readonly height: number) {\r\n this.w = width;\r\n this.h = height;\r\n }\r\n\r\n public static equals(a?: Size | null, b?: Size | null): boolean {\r\n if (!a && !b) {\r\n return true;\r\n }\r\n return !!a && !!b && a.equals(b);\r\n }\r\n\r\n public static copy(a?: Size | null): Size | null {\r\n if (!a) {\r\n return null;\r\n }\r\n return new Size(a.width, a.height);\r\n }\r\n\r\n length(): number {\r\n return this.w * this.h;\r\n }\r\n\r\n public rotate(): Size {\r\n return new Size(this.height, this.width);\r\n }\r\n\r\n public equals(o: Size | null | undefined): boolean {\r\n if (this === o) {\r\n return true;\r\n }\r\n if (!o) {\r\n return false;\r\n }\r\n return this.width === o.width && this.height === o.height;\r\n }\r\n\r\n public intersect(o: Size | undefined | null): Size {\r\n if (!o) {\r\n return this;\r\n }\r\n const minH = Math.min(this.height, o.height);\r\n const minW = Math.min(this.width, o.width);\r\n return new Size(minW, minH);\r\n }\r\n\r\n public getHalfSize(): Size {\r\n return new Size(this.width >>> 1, this.height >>> 1);\r\n }\r\n\r\n public toString(): string {\r\n return `Size{width=${this.width}, height=${this.height}}`;\r\n }\r\n\r\n public toJSON(): SizeInterface {\r\n return {\r\n width: this.width,\r\n height: this.height,\r\n };\r\n }\r\n}\r\n\r\n","export interface PointInterface {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport default class Point {\r\n readonly x: number;\r\n readonly y: number;\r\n constructor(x: number, y: number) {\r\n this.x = Math.round(x);\r\n this.y = Math.round(y);\r\n }\r\n\r\n public equals(o: Point): boolean {\r\n if (this === o) {\r\n return true;\r\n }\r\n if (o === null) {\r\n return false;\r\n }\r\n return this.x === o.x && this.y === o.y;\r\n }\r\n\r\n public distance(to: Point): number {\r\n const x = this.x - to.x;\r\n const y = this.y - to.y;\r\n return Math.sqrt(x * x + y * y);\r\n }\r\n\r\n public toString(): string {\r\n return `Point{x=${this.x}, y=${this.y}}`;\r\n }\r\n\r\n public toJSON(): PointInterface {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n };\r\n }\r\n}\r\n\r\n","import Point, { PointInterface } from './Point';\r\nimport Size, { SizeInterface } from './Size';\r\n\r\nexport interface PositionInterface {\r\n point: PointInterface;\r\n screenSize: SizeInterface;\r\n}\r\n\r\nexport default class Position {\r\n public constructor(readonly point: Point, readonly screenSize: Size) {}\r\n\r\n public equals(o: Position): boolean {\r\n if (this === o) {\r\n return true;\r\n }\r\n if (o === null) {\r\n return false;\r\n }\r\n\r\n return this.point.equals(o.point) && this.screenSize.equals(o.screenSize);\r\n }\r\n\r\n public rotate(rotation: number): Position {\r\n switch (rotation) {\r\n case 1:\r\n return new Position(\r\n new Point(this.screenSize.height - this.point.y, this.point.x),\r\n this.screenSize.rotate(),\r\n );\r\n case 2:\r\n return new Position(\r\n new Point(this.screenSize.width - this.point.x, this.screenSize.height - this.point.y),\r\n this.screenSize,\r\n );\r\n case 3:\r\n return new Position(\r\n new Point(this.point.y, this.screenSize.width - this.point.x),\r\n this.screenSize.rotate(),\r\n );\r\n default:\r\n return this;\r\n }\r\n }\r\n\r\n public toString(): string {\r\n return `Position{point=${this.point}, screenSize=${this.screenSize}}`;\r\n }\r\n\r\n public toJSON(): PositionInterface {\r\n return {\r\n point: this.point.toJSON(),\r\n screenSize: this.screenSize.toJSON(),\r\n };\r\n }\r\n}\r\n\r\n","/**\r\n * 工具函数类\r\n * 提供交互系统所需的辅助功能\r\n */\r\nexport default class Util {\r\n private static supportsPassiveValue: boolean | undefined;\r\n\r\n /**\r\n * 将字符串转换为 UTF-8 字节数组\r\n * @param str 待转换的字符串\r\n * @returns UTF-8 字节数组\r\n */\r\n static stringToUtf8ByteArray = function(str: string) {\r\n // TODO(user): Use native implementations if/when available\r\n var out = [], p = 0;\r\n for (var i = 0; i < str.length; i++) {\r\n var c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n } else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n } else if (\r\n ((c & 0xFC00) == 0xD800) && (i + 1) < str.length &&\r\n ((str.charCodeAt(i + 1) & 0xFC00) == 0xDC00)) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n } else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return Uint8Array.from(out);\r\n };\r\n\r\n /**\r\n * 将 UTF-8 字节数组转换为 JavaScript 字符串\r\n * @param bytes UTF-8 字节数组\r\n * @returns 16位 Unicode 字符串\r\n */\r\n static utf8ByteArrayToString(bytes: Uint8Array): string {\r\n // TODO(user): Use native implementations if/when available\r\n var out = [], pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n var c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n } else if (c1 > 191 && c1 < 224) {\r\n var c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode((c1 & 31) << 6 | c2 & 63);\r\n } else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n var c2 = bytes[pos++];\r\n var c3 = bytes[pos++];\r\n var c4 = bytes[pos++];\r\n var u = ((c1 & 7) << 18 | (c2 & 63) << 12 | (c3 & 63) << 6 | c4 & 63) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xD800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xDC00 + (u & 1023));\r\n } else {\r\n var c2 = bytes[pos++];\r\n var c3 = bytes[pos++];\r\n out[c++] =\r\n String.fromCharCode((c1 & 15) << 12 | (c2 & 63) << 6 | c3 & 63);\r\n }\r\n }\r\n return out.join('');\r\n };\r\n\r\n /**\r\n * 检测浏览器是否支持 passive 事件监听器\r\n * 参考: https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n * @returns 是否支持 passive 选项\r\n */\r\n static supportsPassive(): boolean {\r\n if (typeof Util.supportsPassiveValue === 'boolean') {\r\n return Util.supportsPassiveValue;\r\n }\r\n\r\n // Test via a getter in the options object to see if the passive property is accessed\r\n let supportsPassive = false;\r\n try {\r\n const opts = Object.defineProperty({}, 'passive', {\r\n get: function() {\r\n supportsPassive = true;\r\n }\r\n });\r\n\r\n // @ts-ignore\r\n window.addEventListener('testPassive', null, opts);\r\n // @ts-ignore\r\n window.removeEventListener('testPassive', null, opts);\r\n } catch (error: any) {}\r\n\r\n return Util.supportsPassiveValue = supportsPassive;\r\n }\r\n}\r\n\r\n","import MotionEvent from '../models/MotionEvent';\r\nimport ScreenInfo from '../models/ScreenInfo';\r\nimport { TouchControlMessage } from '../messages/TouchControlMessage';\r\nimport Size from '../models/Size';\r\nimport Point from '../models/Point';\r\nimport Position from '../models/Position';\r\nimport Util from '../utils/Util';\r\nimport { IPlayer } from '../types/PlayerInterface';\r\n\r\n// 图片资源路径 - 在实际使用时,需要通过构建工具(webpack/vite)处理这些导入\r\n// 或者在运行时动态设置这些路径\r\nconst TouchPointPNG = '../assets/images/touch_point.png';\r\nconst CenterPointPNG = '../assets/images/center_point.png';\r\n\r\ninterface Touch {\r\n action: number;\r\n position: Position;\r\n buttons: number;\r\n invalid: boolean;\r\n}\r\n\r\ninterface TouchOnClient {\r\n client: {\r\n width: number;\r\n height: number;\r\n };\r\n touch: Touch;\r\n}\r\n\r\ninterface CommonTouchAndMouse {\r\n clientX: number;\r\n clientY: number;\r\n type: string;\r\n target: EventTarget | null;\r\n buttons: number;\r\n}\r\n\r\ninterface MiniMouseEvent extends CommonTouchAndMouse {\r\n ctrlKey: boolean;\r\n shiftKey: boolean;\r\n buttons: number;\r\n}\r\n\r\nconst TAG = '[TouchHandler]';\r\n\r\nexport type TouchEventNames =\r\n | 'touchstart'\r\n | 'touchend'\r\n | 'touchmove'\r\n | 'touchcancel'\r\n | 'mousedown'\r\n | 'mouseup'\r\n | 'mousemove';\r\nexport type WheelEventNames = 'wheel';\r\nexport type InteractionEvents = TouchEventNames | WheelEventNames;\r\nexport type KeyEventNames = 'keydown' | 'keyup';\r\n\r\nexport abstract class InteractionHandler {\r\n protected static readonly SIMULATE_MULTI_TOUCH = 'SIMULATE_MULTI_TOUCH';\r\n protected static readonly STROKE_STYLE: string = '#00BEA4';\r\n protected static EVENT_ACTION_MAP: Record<string, number> = {\r\n touchstart: MotionEvent.ACTION_DOWN,\r\n touchend: MotionEvent.ACTION_UP,\r\n touchmove: MotionEvent.ACTION_MOVE,\r\n touchcancel: MotionEvent.ACTION_UP,\r\n mousedown: MotionEvent.ACTION_DOWN,\r\n mousemove: MotionEvent.ACTION_MOVE,\r\n mouseup: MotionEvent.ACTION_UP,\r\n [InteractionHandler.SIMULATE_MULTI_TOUCH]: -1,\r\n };\r\n private static options = Util.supportsPassive() ? { passive: false } : false;\r\n private static idToPointerMap: Map<number, number> = new Map();\r\n private static pointerToIdMap: Map<number, number> = new Map();\r\n private static touchPointRadius = 10;\r\n private static centerPointRadius = 5;\r\n private static touchPointImage?: HTMLImageElement;\r\n private static centerPointImage?: HTMLImageElement;\r\n private static pointImagesLoaded = false;\r\n private static eventListeners: Map<string, Set<InteractionHandler>> = new Map();\r\n private multiTouchActive = false;\r\n private multiTouchCenter?: Point;\r\n private multiTouchShift = false;\r\n private dirtyPlace: Point[] = [];\r\n protected readonly ctx: CanvasRenderingContext2D | null;\r\n protected readonly tag: HTMLCanvasElement;\r\n protected over = false;\r\n protected lastPosition?: MouseEvent;\r\n\r\n protected constructor(\r\n public readonly player: IPlayer,\r\n public readonly touchEventsNames: InteractionEvents[],\r\n public readonly keyEventsNames: KeyEventNames[],\r\n ) {\r\n this.tag = player.getTouchableElement();\r\n this.ctx = this.tag.getContext('2d');\r\n InteractionHandler.loadImages();\r\n InteractionHandler.bindGlobalListeners(this);\r\n }\r\n\r\n protected abstract onInteraction(event: MouseEvent | TouchEvent): void;\r\n protected abstract onKey(event: KeyboardEvent): void;\r\n\r\n protected static bindGlobalListeners(interactionHandler: InteractionHandler): void {\r\n interactionHandler.touchEventsNames.forEach((eventName) => {\r\n let set: Set<InteractionHandler> | undefined = InteractionHandler.eventListeners.get(eventName);\r\n if (!set) {\r\n set = new Set();\r\n document.body.addEventListener(eventName, this.onInteractionEvent, InteractionHandler.options);\r\n this.eventListeners.set(eventName, set);\r\n }\r\n set.add(interactionHandler);\r\n });\r\n interactionHandler.keyEventsNames.forEach((eventName) => {\r\n let set = InteractionHandler.eventListeners.get(eventName);\r\n if (!set) {\r\n set = new Set();\r\n document.body.addEventListener(eventName, this.onKeyEvent);\r\n this.eventListeners.set(eventName, set);\r\n }\r\n set.add(interactionHandler);\r\n });\r\n }\r\n\r\n protected static unbindListeners(touchHandler: InteractionHandler): void {\r\n touchHandler.touchEventsNames.forEach((eventName) => {\r\n const set = InteractionHandler.eventListeners.get(eventName);\r\n if (!set) {\r\n return;\r\n }\r\n set.delete(touchHandler);\r\n if (set.size <= 0) {\r\n this.eventListeners.delete(eventName);\r\n document.body.removeEventListener(eventName, this.onInteractionEvent);\r\n }\r\n });\r\n touchHandler.keyEventsNames.forEach((eventName) => {\r\n const set = InteractionHandler.eventListeners.get(eventName);\r\n if (!set) {\r\n return;\r\n }\r\n set.delete(touchHandler);\r\n if (set.size <= 0) {\r\n this.eventListeners.delete(eventName);\r\n document.body.removeEventListener(eventName, this.onKeyEvent);\r\n }\r\n });\r\n }\r\n\r\n protected static onInteractionEvent = (event: MouseEvent | TouchEvent): void => {\r\n const set = InteractionHandler.eventListeners.get(event.type as TouchEventNames);\r\n if (!set) {\r\n return;\r\n }\r\n set.forEach((instance) => {\r\n instance.onInteraction(event);\r\n });\r\n };\r\n\r\n protected static onKeyEvent = (event: KeyboardEvent): void => {\r\n const set = InteractionHandler.eventListeners.get(event.type as KeyEventNames);\r\n if (!set) {\r\n return;\r\n }\r\n set.forEach((instance) => {\r\n instance.onKey(event);\r\n });\r\n };\r\n\r\n protected static loadImages(): void {\r\n if (this.pointImagesLoaded) {\r\n return;\r\n }\r\n const total = 2;\r\n let current = 0;\r\n\r\n const onload = (event: Event) => {\r\n if (++current === total) {\r\n this.pointImagesLoaded = true;\r\n }\r\n if (event.target === this.touchPointImage) {\r\n this.touchPointRadius = this.touchPointImage.width / 2;\r\n } else if (event.target === this.centerPointImage) {\r\n this.centerPointRadius = this.centerPointImage.width / 2;\r\n }\r\n };\r\n const touch = (this.touchPointImage = new Image());\r\n touch.src = TouchPointPNG;\r\n touch.onload = onload;\r\n const center = (this.centerPointImage = new Image());\r\n center.src = CenterPointPNG;\r\n center.onload = onload;\r\n }\r\n\r\n protected static getPointerId(type: string, identifier: number): number {\r\n if (this.idToPointerMap.has(identifier)) {\r\n const pointerId = this.idToPointerMap.get(identifier) as number;\r\n if (type === 'touchend' || type === 'touchcancel') {\r\n this.idToPointerMap.delete(identifier);\r\n this.pointerToIdMap.delete(pointerId);\r\n }\r\n return pointerId;\r\n }\r\n let pointerId = 0;\r\n while (this.pointerToIdMap.has(pointerId)) {\r\n pointerId++;\r\n }\r\n this.idToPointerMap.set(identifier, pointerId);\r\n this.pointerToIdMap.set(pointerId, identifier);\r\n return pointerId;\r\n }\r\n\r\n protected static buildTouchOnClient(event: CommonTouchAndMouse, screenInfo: ScreenInfo): TouchOnClient | null {\r\n const action = this.mapTypeToAction(event.type);\r\n const { width, height } = screenInfo.videoSize;\r\n const target: HTMLElement = event.target as HTMLElement;\r\n const rect = target.getBoundingClientRect();\r\n let { clientWidth, clientHeight } = target;\r\n let touchX = event.clientX - rect.left;\r\n let touchY = event.clientY - rect.top;\r\n let invalid = false;\r\n if (touchX < 0 || touchX > clientWidth || touchY < 0 || touchY > clientHeight) {\r\n invalid = true;\r\n }\r\n const eps = 1e5;\r\n const ratio = width / height;\r\n const shouldBe = Math.round(eps * ratio);\r\n const haveNow = Math.round((eps * clientWidth) / clientHeight);\r\n if (shouldBe > haveNow) {\r\n const realHeight = Math.ceil(clientWidth / ratio);\r\n const top = (clientHeight - realHeight) / 2;\r\n if (touchY < top || touchY > top + realHeight) {\r\n invalid = true;\r\n }\r\n touchY -= top;\r\n clientHeight = realHeight;\r\n } else if (shouldBe < haveNow) {\r\n const realWidth = Math.ceil(clientHeight * ratio);\r\n const left = (clientWidth - realWidth) / 2;\r\n if (touchX < left || touchX > left + realWidth) {\r\n invalid = true;\r\n }\r\n touchX -= left;\r\n clientWidth = realWidth;\r\n }\r\n const x = (touchX * width) / clientWidth;\r\n const y = (touchY * height) / clientHeight;\r\n const size = new Size(width, height);\r\n const point = new Point(x, y);\r\n const position = new Position(point, size);\r\n if (x < 0 || y < 0 || x > width || y > height) {\r\n invalid = true;\r\n }\r\n return {\r\n client: {\r\n width: clientWidth,\r\n height: clientHeight,\r\n },\r\n touch: {\r\n invalid,\r\n action,\r\n position,\r\n buttons: event.buttons,\r\n },\r\n };\r\n }\r\n\r\n private static validateMessage(\r\n originalEvent: MiniMouseEvent | TouchEvent,\r\n message: TouchControlMessage,\r\n storage: Map<number, TouchControlMessage>,\r\n logPrefix: string,\r\n ): TouchControlMessage[] {\r\n const messages: TouchControlMessage[] = [];\r\n const { action, pointerId } = message;\r\n const previous = storage.get(pointerId);\r\n if (action === MotionEvent.ACTION_UP) {\r\n if (!previous) {\r\n console.warn(logPrefix, 'Received ACTION_UP while there are no DOWN stored');\r\n } else {\r\n storage.delete(pointerId);\r\n messages.push(message);\r\n }\r\n } else if (action === MotionEvent.ACTION_DOWN) {\r\n if (previous) {\r\n console.warn(logPrefix, 'Received ACTION_DOWN while already has one stored');\r\n } else {\r\n storage.set(pointerId, message);\r\n messages.push(message);\r\n }\r\n } else if (action === MotionEvent.ACTION_MOVE) {\r\n if (!previous) {\r\n if (\r\n (originalEvent instanceof MouseEvent && originalEvent.buttons) ||\r\n (window['TouchEvent'] && originalEvent instanceof TouchEvent)\r\n ) {\r\n console.warn(logPrefix, 'Received ACTION_MOVE while there are no DOWN stored');\r\n const emulated = InteractionHandler.createEmulatedMessage(MotionEvent.ACTION_DOWN, message);\r\n messages.push(emulated);\r\n storage.set(pointerId, emulated);\r\n }\r\n } else {\r\n messages.push(message);\r\n storage.set(pointerId, message);\r\n }\r\n }\r\n return messages;\r\n }\r\n\r\n protected static createEmulatedMessage(action: number, event: TouchControlMessage): TouchControlMessage {\r\n const { pointerId, position, buttons } = event;\r\n let pressure = event.pressure;\r\n if (action === MotionEvent.ACTION_UP) {\r\n pressure = 0;\r\n }\r\n return new TouchControlMessage(action, pointerId, position, pressure, buttons);\r\n }\r\n\r\n public static mapTypeToAction(type: string): number {\r\n return this.EVENT_ACTION_MAP[type];\r\n }\r\n\r\n protected getTouch(\r\n e: CommonTouchAndMouse,\r\n screenInfo: ScreenInfo,\r\n ctrlKey: boolean,\r\n shiftKey: boolean,\r\n ): Touch[] | null {\r\n const touchOnClient = InteractionHandler.buildTouchOnClient(e, screenInfo);\r\n if (!touchOnClient) {\r\n return null;\r\n }\r\n const { client, touch } = touchOnClient;\r\n const result: Touch[] = [touch];\r\n if (!ctrlKey) {\r\n this.multiTouchActive = false;\r\n this.multiTouchCenter = undefined;\r\n this.multiTouchShift = false;\r\n this.clearCanvas();\r\n return result;\r\n }\r\n const { position, action, buttons } = touch;\r\n const { point, screenSize } = position;\r\n const { width, height } = screenSize;\r\n const { x, y } = point;\r\n if (!this.multiTouchActive) {\r\n if (shiftKey) {\r\n this.multiTouchCenter = point;\r\n this.multiTouchShift = true;\r\n } else {\r\n this.multiTouchCenter = new Point(client.width / 2, client.height / 2);\r\n }\r\n }\r\n this.multiTouchActive = true;\r\n let opposite: Point | undefined;\r\n let invalid = false;\r\n if (this.multiTouchShift && this.multiTouchCenter) {\r\n const oppoX = 2 * this.multiTouchCenter.x - x;\r\n const oppoY = 2 * this.multiTouchCenter.y - y;\r\n opposite = new Point(oppoX, oppoY);\r\n if (!(oppoX <= width && oppoX >= 0 && oppoY <= height && oppoY >= 0)) {\r\n invalid = true;\r\n }\r\n } else {\r\n opposite = new Point(client.width - x, client.height - y);\r\n invalid = touch.invalid;\r\n }\r\n if (opposite) {\r\n result.push({\r\n invalid,\r\n action,\r\n buttons,\r\n position: new Position(opposite, screenSize),\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n protected drawCircle(ctx: CanvasRenderingContext2D, point: Point, radius: number): void {\r\n ctx.beginPath();\r\n ctx.arc(point.x, point.y, radius, 0, Math.PI * 2, true);\r\n ctx.stroke();\r\n }\r\n\r\n public drawLine(point1: Point, point2: Point): void {\r\n if (!this.ctx) {\r\n return;\r\n }\r\n this.ctx.save();\r\n this.ctx.strokeStyle = InteractionHandler.STROKE_STYLE;\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(point1.x, point1.y);\r\n this.ctx.lineTo(point2.x, point2.y);\r\n this.ctx.stroke();\r\n this.ctx.restore();\r\n }\r\n\r\n protected drawPoint(point: Point, radius: number, image?: HTMLImageElement): void {\r\n if (!this.ctx) {\r\n return;\r\n }\r\n let { lineWidth } = this.ctx;\r\n if (InteractionHandler.pointImagesLoaded && image) {\r\n radius = image.width / 2;\r\n lineWidth = 0;\r\n this.ctx.drawImage(image, point.x - radius, point.y - radius);\r\n } else {\r\n this.drawCircle(this.ctx, point, radius);\r\n }\r\n\r\n const topLeft = new Point(point.x - radius - lineWidth, point.y - radius - lineWidth);\r\n const bottomRight = new Point(point.x + radius + lineWidth, point.y + radius + lineWidth);\r\n this.updateDirty(topLeft, bottomRight);\r\n }\r\n\r\n public drawPointer(point: Point): void {\r\n this.drawPoint(point, InteractionHandler.touchPointRadius, InteractionHandler.touchPointImage);\r\n if (this.multiTouchCenter) {\r\n this.drawLine(this.multiTouchCenter, point);\r\n }\r\n }\r\n\r\n public drawCenter(point: Point): void {\r\n this.drawPoint(point, InteractionHandler.centerPointRadius, InteractionHandler.centerPointImage);\r\n }\r\n\r\n protected updateDirty(topLeft: Point, bottomRight: Point): void {\r\n if (!this.dirtyPlace.length) {\r\n this.dirtyPlace.push(topLeft, bottomRight);\r\n return;\r\n }\r\n const currentTopLeft = this.dirtyPlace[0];\r\n const currentBottomRight = this.dirtyPlace[1];\r\n const newTopLeft = new Point(Math.min(currentTopLeft.x, topLeft.x), Math.min(currentTopLeft.y, topLeft.y));\r\n const newBottomRight = new Point(\r\n Math.max(currentBottomRight.x, bottomRight.x),\r\n Math.max(currentBottomRight.y, bottomRight.y),\r\n );\r\n this.dirtyPlace.length = 0;\r\n this.dirtyPlace.push(newTopLeft, newBottomRight);\r\n }\r\n\r\n public clearCanvas(): void {\r\n const { clientWidth, clientHeight } = this.tag;\r\n const ctx = this.ctx;\r\n if (ctx && this.dirtyPlace.length) {\r\n const topLeft = this.dirtyPlace[0];\r\n const bottomRight = this.dirtyPlace[1];\r\n this.dirtyPlace.length = 0;\r\n const x = Math.max(topLeft.x, 0);\r\n const y = Math.max(topLeft.y, 0);\r\n const w = Math.min(clientWidth, bottomRight.x - x);\r\n const h = Math.min(clientHeight, bottomRight.y - y);\r\n ctx.clearRect(x, y, w, h);\r\n ctx.strokeStyle = InteractionHandler.STROKE_STYLE;\r\n }\r\n }\r\n\r\n public formatTouchEvent(\r\n e: TouchEvent,\r\n screenInfo: ScreenInfo,\r\n storage: Map<number, TouchControlMessage>,\r\n ): TouchControlMessage[] {\r\n const logPrefix = `${TAG}[formatTouchEvent]`;\r\n const messages: TouchControlMessage[] = [];\r\n const touches = e.changedTouches;\r\n if (touches && touches.length) {\r\n for (let i = 0, l = touches.length; i < l; i++) {\r\n const touch = touches[i];\r\n const pointerId = InteractionHandler.getPointerId(e.type, touch.identifier);\r\n if (touch.target !== this.tag) {\r\n continue;\r\n }\r\n const previous = storage.get(pointerId);\r\n const item: CommonTouchAndMouse = {\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n type: e.type,\r\n buttons: MotionEvent.BUTTON_PRIMARY,\r\n target: e.target,\r\n };\r\n const event = InteractionHandler.buildTouchOnClient(item, screenInfo);\r\n if (event) {\r\n const { action, buttons, position, invalid } = event.touch;\r\n let pressure = 1;\r\n if (action === MotionEvent.ACTION_UP) {\r\n pressure = 0;\r\n } else if (typeof touch.force === 'number') {\r\n pressure = touch.force;\r\n }\r\n if (!invalid) {\r\n const message = new TouchControlMessage(action, pointerId, position, pressure, buttons);\r\n messages.push(\r\n ...InteractionHandler.validateMessage(e, message, storage, `${logPrefix}[validate]`),\r\n );\r\n } else {\r\n if (previous) {\r\n messages.push(InteractionHandler.createEmulatedMessage(MotionEvent.ACTION_UP, previous));\r\n storage.delete(pointerId);\r\n }\r\n }\r\n } else {\r\n console.error(logPrefix, `Failed to format touch`, touch);\r\n }\r\n }\r\n } else {\r\n console.error(logPrefix, 'No \"touches\"', e);\r\n }\r\n return messages;\r\n }\r\n\r\n public buildTouchEvent(\r\n e: MiniMouseEvent,\r\n screenInfo: ScreenInfo,\r\n storage: Map<number, TouchControlMessage>,\r\n ): TouchControlMessage[] {\r\n const logPrefix = `${TAG}[buildTouchEvent]`;\r\n const touches = this.getTouch(e, screenInfo, e.ctrlKey, e.shiftKey);\r\n if (!touches) {\r\n return [];\r\n }\r\n const messages: TouchControlMessage[] = [];\r\n const points: Point[] = [];\r\n this.clearCanvas();\r\n touches.forEach((touch: Touch, pointerId: number) => {\r\n const { action, buttons, position } = touch;\r\n const previous = storage.get(pointerId);\r\n if (!touch.invalid) {\r\n let pressure = 1.0;\r\n if (action === MotionEvent.ACTION_UP) {\r\n pressure = 0;\r\n }\r\n const message = new TouchControlMessage(action, pointerId, position, pressure, buttons);\r\n messages.push(...InteractionHandler.validateMessage(e, message, storage, `${logPrefix}[validate]`));\r\n points.push(touch.position.point);\r\n } else {\r\n if (previous) {\r\n points.push(previous.position.point);\r\n }\r\n }\r\n });\r\n // 禁用多点触摸显示\r\n // if (this.multiTouchActive) {\r\n // if (this.multiTouchCenter) {\r\n // this.drawCenter(this.multiTouchCenter);\r\n // }\r\n // points.forEach((point) => {\r\n // this.drawPointer(point);\r\n // });\r\n // }\r\n const hasActionUp = messages.find((message) => {\r\n return message.action === MotionEvent.ACTION_UP;\r\n });\r\n if (hasActionUp && storage.size) {\r\n console.warn(logPrefix, 'Looks like one of Multi-touch pointers was not raised up');\r\n storage.forEach((message) => {\r\n messages.push(InteractionHandler.createEmulatedMessage(MotionEvent.ACTION_UP, message));\r\n });\r\n storage.clear();\r\n }\r\n return messages;\r\n }\r\n\r\n public release(): void {\r\n InteractionHandler.unbindListeners(this);\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage, ControlMessageInterface } from './ControlMessage';\r\nimport Position, { PositionInterface } from '../models/Position';\r\n\r\nexport interface ScrollControlMessageInterface extends ControlMessageInterface {\r\n position: PositionInterface;\r\n hScroll: number;\r\n vScroll: number;\r\n}\r\n\r\nexport class ScrollControlMessage extends ControlMessage {\r\n public static PAYLOAD_LENGTH = 21; // 1字节代表群控还是单控,后面4字节为底层需要填充\r\n\r\n constructor(readonly position: Position, readonly hScroll: number, readonly vScroll: number) {\r\n super(ControlMessage.TYPE_SCROLL);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n const buffer = Buffer.alloc(ScrollControlMessage.PAYLOAD_LENGTH + 1);\r\n let offset = 0;\r\n offset = buffer.writeUInt8(0, offset); // 0代表群控,从1开始代表单控\r\n offset = buffer.writeUInt8(this.type, offset);\r\n offset = buffer.writeUInt32BE(this.position.point.x, offset);\r\n offset = buffer.writeUInt32BE(this.position.point.y, offset);\r\n offset = buffer.writeUInt16BE(this.position.screenSize.width, offset);\r\n offset = buffer.writeUInt16BE(this.position.screenSize.height, offset);\r\n // offset = buffer.writeInt32BE(this.hScroll, offset);\r\n // buffer.writeInt32BE(this.vScroll, offset);\r\n offset = buffer.writeInt16BE(this.hScroll, offset);\r\n offset = buffer.writeInt16BE(this.vScroll, offset);\r\n buffer.writeInt32BE(0, offset); // 底层需要填充4字节\r\n return buffer;\r\n }\r\n\r\n public toString(): string {\r\n return `ScrollControlMessage{hScroll=${this.hScroll}, vScroll=${this.vScroll}, position=${this.position}}`;\r\n }\r\n\r\n public toJSON(): ScrollControlMessageInterface {\r\n return {\r\n type: this.type,\r\n position: this.position.toJSON(),\r\n hScroll: this.hScroll,\r\n vScroll: this.vScroll,\r\n };\r\n }\r\n}\r\n\r\n","import { InteractionEvents, KeyEventNames, InteractionHandler } from './InteractionHandler';\r\nimport { IPlayer } from '../types/PlayerInterface';\r\nimport { ControlMessage } from '../messages/ControlMessage';\r\nimport { TouchControlMessage } from '../messages/TouchControlMessage';\r\nimport MotionEvent from '../models/MotionEvent';\r\nimport ScreenInfo from '../models/ScreenInfo';\r\nimport { ScrollControlMessage } from '../messages/ScrollControlMessage';\r\n\r\nconst TAG = '[FeaturedTouchHandler]';\r\n\r\nexport interface InteractionHandlerListener {\r\n sendMessage: (message: ControlMessage) => void;\r\n}\r\n\r\nexport class FeaturedInteractionHandler extends InteractionHandler {\r\n private static readonly touchEventsNames: InteractionEvents[] = [\r\n 'touchstart',\r\n 'touchend',\r\n 'touchmove',\r\n 'touchcancel',\r\n 'mousedown',\r\n 'mouseup',\r\n 'mousemove',\r\n 'wheel',\r\n ];\r\n private static readonly keyEventsNames: KeyEventNames[] = ['keydown', 'keyup'];\r\n public static SCROLL_EVENT_THROTTLING_TIME = 30; // one event per 50ms\r\n private readonly storedFromMouseEvent = new Map<number, TouchControlMessage>();\r\n private readonly storedFromTouchEvent = new Map<number, TouchControlMessage>();\r\n private lastScrollEvent?: { time: number; hScroll: number; vScroll: number };\r\n\r\n constructor(player: IPlayer, public readonly listener: InteractionHandlerListener) {\r\n super(player, FeaturedInteractionHandler.touchEventsNames, FeaturedInteractionHandler.keyEventsNames);\r\n this.tag.addEventListener('mouseleave', this.onMouseLeave);\r\n this.tag.addEventListener('mouseenter', this.onMouseEnter);\r\n }\r\n\r\n public buildScrollEvent(event: WheelEvent, screenInfo: ScreenInfo): ScrollControlMessage[] {\r\n const messages: ScrollControlMessage[] = [];\r\n const touchOnClient = InteractionHandler.buildTouchOnClient(event, screenInfo);\r\n if (touchOnClient) {\r\n // const hScroll = event.deltaX > 0 ? -1 : event.deltaX < -0 ? 1 : 0;\r\n // const vScroll = event.deltaY > 0 ? -1 : event.deltaY < -0 ? 1 : 0;\r\n const hScroll = event.deltaX > 0 ? -1000 : event.deltaX < -0 ? 1000 : 0;\r\n const vScroll = event.deltaY > 0 ? -1000 : event.deltaY < -0 ? 1000 : 0;\r\n const time = Date.now();\r\n if (\r\n !this.lastScrollEvent ||\r\n time - this.lastScrollEvent.time > FeaturedInteractionHandler.SCROLL_EVENT_THROTTLING_TIME ||\r\n this.lastScrollEvent.vScroll !== vScroll ||\r\n this.lastScrollEvent.hScroll !== hScroll\r\n ) {\r\n this.lastScrollEvent = { time, hScroll, vScroll };\r\n messages.push(new ScrollControlMessage(touchOnClient.touch.position, hScroll, vScroll));\r\n }\r\n }\r\n return messages;\r\n }\r\n\r\n protected onInteraction(event: MouseEvent | TouchEvent): void {\r\n const screenInfo = this.player.getScreenInfo();\r\n if (!screenInfo) {\r\n return;\r\n }\r\n let messages: ControlMessage[];\r\n let storage: Map<number, TouchControlMessage>;\r\n if (event instanceof MouseEvent) {\r\n if (event.target !== this.tag) {\r\n return;\r\n }\r\n if (window['WheelEvent'] && event instanceof WheelEvent) {\r\n messages = this.buildScrollEvent(event, screenInfo);\r\n } else {\r\n storage = this.storedFromMouseEvent;\r\n messages = this.buildTouchEvent(event, screenInfo, storage);\r\n }\r\n if (this.over) {\r\n this.lastPosition = event;\r\n }\r\n } else if (window['TouchEvent'] && event instanceof TouchEvent) {\r\n // TODO: Research drag from out of the target inside it\r\n if (event.target !== this.tag) {\r\n return;\r\n }\r\n storage = this.storedFromTouchEvent;\r\n messages = this.formatTouchEvent(event, screenInfo, storage);\r\n } else {\r\n console.error(TAG, 'Unsupported event', event);\r\n return;\r\n }\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n }\r\n event.stopPropagation();\r\n messages.forEach((message) => {\r\n this.listener.sendMessage(message);\r\n });\r\n }\r\n\r\n protected onKey(event: KeyboardEvent): void {\r\n if (!this.lastPosition) {\r\n return;\r\n }\r\n const screenInfo = this.player.getScreenInfo();\r\n if (!screenInfo) {\r\n return;\r\n }\r\n const { ctrlKey, shiftKey } = event;\r\n const { target, button, buttons, clientY, clientX } = this.lastPosition;\r\n const type = InteractionHandler.SIMULATE_MULTI_TOUCH;\r\n const props = { ctrlKey, shiftKey, type, target, button, buttons, clientX, clientY };\r\n this.buildTouchEvent(props, screenInfo, new Map());\r\n }\r\n\r\n private onMouseEnter = (): void => {\r\n this.over = true;\r\n };\r\n private onMouseLeave = (): void => {\r\n this.lastPosition = undefined;\r\n this.over = false;\r\n this.storedFromMouseEvent.forEach((message) => {\r\n this.listener.sendMessage(InteractionHandler.createEmulatedMessage(MotionEvent.ACTION_UP, message));\r\n });\r\n this.storedFromMouseEvent.clear();\r\n this.clearCanvas();\r\n };\r\n\r\n public release(): void {\r\n super.release();\r\n this.tag.removeEventListener('mouseleave', this.onMouseLeave);\r\n this.tag.removeEventListener('mouseenter', this.onMouseEnter);\r\n this.storedFromMouseEvent.clear();\r\n }\r\n}\r\n\r\n","import { InteractionEvents, InteractionHandler } from './InteractionHandler';\r\nimport { IPlayer } from '../types/PlayerInterface';\r\nimport ScreenInfo from '../models/ScreenInfo';\r\nimport Position from '../models/Position';\r\n\r\nexport interface TouchHandlerListener {\r\n performClick: (position: Position) => void;\r\n performScroll: (from: Position, to: Position) => void;\r\n}\r\n\r\nconst TAG = '[SimpleTouchHandler]';\r\n\r\nexport class SimpleInteractionHandler extends InteractionHandler {\r\n private startPosition?: Position;\r\n private endPosition?: Position;\r\n private static readonly touchEventsNames: InteractionEvents[] = ['mousedown', 'mouseup', 'mousemove'];\r\n private storage = new Map();\r\n\r\n constructor(player: IPlayer, private readonly listener: TouchHandlerListener) {\r\n super(player, SimpleInteractionHandler.touchEventsNames, []);\r\n }\r\n\r\n protected onInteraction(event: MouseEvent | TouchEvent): void {\r\n let handled = false;\r\n if (!(event instanceof MouseEvent)) {\r\n return;\r\n }\r\n if (event.target === this.tag) {\r\n const screenInfo: ScreenInfo = this.player.getScreenInfo() as ScreenInfo;\r\n if (!screenInfo) {\r\n return;\r\n }\r\n const events = this.buildTouchEvent(event, screenInfo, this.storage);\r\n if (events.length > 1) {\r\n console.warn(TAG, 'Too many events', events);\r\n return;\r\n }\r\n const downEventName = 'mousedown';\r\n if (events.length === 1) {\r\n handled = true;\r\n if (event.type === downEventName) {\r\n this.startPosition = events[0].position;\r\n } else {\r\n if (this.startPosition) {\r\n this.endPosition = events[0].position;\r\n } else {\r\n console.warn(TAG, `Received \"${event.type}\" before \"${downEventName}\"`);\r\n }\r\n }\r\n if (this.startPosition) {\r\n this.drawPointer(this.startPosition.point);\r\n }\r\n if (this.endPosition) {\r\n this.drawPointer(this.endPosition.point);\r\n if (this.startPosition) {\r\n this.drawLine(this.startPosition.point, this.endPosition.point);\r\n }\r\n }\r\n if (event.type === 'mouseup') {\r\n if (this.startPosition && this.endPosition) {\r\n this.clearCanvas();\r\n if (this.startPosition.point.distance(this.endPosition.point) < 10) {\r\n this.listener.performClick(this.endPosition);\r\n } else {\r\n this.listener.performScroll(this.startPosition, this.endPosition);\r\n }\r\n }\r\n }\r\n }\r\n if (handled) {\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n }\r\n event.stopPropagation();\r\n }\r\n }\r\n if (event.type === 'mouseup') {\r\n this.startPosition = undefined;\r\n this.endPosition = undefined;\r\n }\r\n }\r\n\r\n protected onKey(): void {\r\n throw Error(`${TAG} Unsupported`);\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage, ControlMessageInterface } from './ControlMessage';\r\n\r\nexport interface KeyCodeControlMessageInterface extends ControlMessageInterface {\r\n action: number;\r\n keycode: number;\r\n repeat: number;\r\n metaState: number;\r\n}\r\n\r\nexport class KeyCodeControlMessage extends ControlMessage {\r\n public static PAYLOAD_LENGTH = 13+1;\r\n\r\n constructor(\r\n readonly action: number,\r\n readonly keycode: number,\r\n readonly repeat: number,\r\n readonly metaState: number,\r\n ) {\r\n super(ControlMessage.TYPE_KEYCODE);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n const buffer = Buffer.alloc(KeyCodeControlMessage.PAYLOAD_LENGTH + 1);\r\n let offset = 0;\r\n offset = buffer.writeInt8(0, offset); // 0代表群控,从1开始代表单控\r\n offset = buffer.writeInt8(this.type, offset);\r\n offset = buffer.writeInt8(this.action, offset);\r\n offset = buffer.writeInt32BE(this.keycode, offset);\r\n offset = buffer.writeInt32BE(this.repeat, offset);\r\n buffer.writeInt32BE(this.metaState, offset);\r\n return buffer;\r\n }\r\n\r\n public toString(): string {\r\n return `KeyCodeControlMessage{action=${this.action}, keycode=${this.keycode}, metaState=${this.metaState}}`;\r\n }\r\n\r\n public toJSON(): KeyCodeControlMessageInterface {\r\n return {\r\n type: this.type,\r\n action: this.action,\r\n keycode: this.keycode,\r\n metaState: this.metaState,\r\n repeat: this.repeat,\r\n };\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage, ControlMessageInterface } from './ControlMessage';\r\n\r\nexport interface TextControlMessageInterface extends ControlMessageInterface {\r\n text: string;\r\n}\r\n\r\nexport class TextControlMessage extends ControlMessage {\r\n private static TEXT_SIZE_FIELD_LENGTH = 4;\r\n constructor(readonly text: string) {\r\n super(ControlMessage.TYPE_TEXT);\r\n }\r\n\r\n public getText(): string {\r\n return this.text;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n const length = this.text.length;\r\n const buffer = Buffer.alloc(length + 1 + TextControlMessage.TEXT_SIZE_FIELD_LENGTH);\r\n let offset = 0;\r\n offset = buffer.writeUInt8(this.type, offset);\r\n offset = buffer.writeUInt32BE(length, offset);\r\n buffer.write(this.text, offset);\r\n return buffer;\r\n }\r\n\r\n public toString(): string {\r\n return `TextControlMessage{text=${this.text}}`;\r\n }\r\n\r\n public toJSON(): TextControlMessageInterface {\r\n return {\r\n type: this.type,\r\n text: this.text,\r\n };\r\n }\r\n}\r\n\r\n","import { Buffer } from 'buffer';\r\nimport { ControlMessage } from './ControlMessage';\r\nimport Util from '../utils/Util';\r\n\r\nexport enum FilePushState {\r\n NEW,\r\n START,\r\n APPEND,\r\n FINISH,\r\n CANCEL,\r\n}\r\n\r\ntype FilePushParams = {\r\n id: number;\r\n state: FilePushState;\r\n chunk?: Uint8Array;\r\n fileName?: string;\r\n fileSize?: number;\r\n};\r\n\r\nexport class CommandControlMessage extends ControlMessage {\r\n public static PAYLOAD_LENGTH = 0;\r\n\r\n public static Commands: Map<number, string> = new Map([\r\n [ControlMessage.TYPE_EXPAND_NOTIFICATION_PANEL, 'Expand notifications'],\r\n [ControlMessage.TYPE_EXPAND_SETTINGS_PANEL, 'Expand settings'],\r\n [ControlMessage.TYPE_COLLAPSE_PANELS, 'Collapse panels'],\r\n [ControlMessage.TYPE_GET_CLIPBOARD, 'Get clipboard'],\r\n [ControlMessage.TYPE_SET_CLIPBOARD, 'Set clipboard'],\r\n [ControlMessage.TYPE_ROTATE_DEVICE, 'Rotate device'],\r\n [ControlMessage.TYPE_CHANGE_STREAM_PARAMETERS, 'Change video settings'],\r\n ]);\r\n\r\n /**\r\n * 注意: createSetVideoSettingsCommand 方法依赖 VideoSettings 类\r\n * 该方法未包含在此独立模块中\r\n * 如需使用,请在应用中自行实现或从原项目导入\r\n */\r\n // public static createSetVideoSettingsCommand(videoSettings: VideoSettings): CommandControlMessage {\r\n // ...\r\n // }\r\n\r\n public static createSetClipboardCommand(text: string, paste = false): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_SET_CLIPBOARD);\r\n const textBytes: Uint8Array | null = text ? Util.stringToUtf8ByteArray(text) : null;\r\n const textLength = textBytes ? textBytes.length : 0;\r\n let offset = 0;\r\n const buffer = Buffer.alloc(1 + 1 + 4 + textLength);\r\n offset = buffer.writeInt8(event.type, offset);\r\n offset = buffer.writeInt8(paste ? 1 : 0, offset);\r\n offset = buffer.writeInt32BE(textLength, offset);\r\n if (textBytes) {\r\n textBytes.forEach((byte: number, index: number) => {\r\n buffer.writeUInt8(byte, index + offset);\r\n });\r\n }\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n public static createSetScreenPowerModeCommand(mode: boolean): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_SET_SCREEN_POWER_MODE);\r\n let offset = 0;\r\n const buffer = Buffer.alloc(1 + 1);\r\n offset = buffer.writeInt8(event.type, offset);\r\n buffer.writeUInt8(mode ? 1 : 0, offset);\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n public static createPushFileCommand(params: FilePushParams): CommandControlMessage {\r\n const { id, fileName, fileSize, chunk, state } = params;\r\n\r\n if (state === FilePushState.START) {\r\n return this.createPushFileStartCommand(id, fileName as string, fileSize as number);\r\n }\r\n if (state === FilePushState.APPEND) {\r\n if (!chunk) {\r\n throw TypeError('Invalid type');\r\n }\r\n return this.createPushFileChunkCommand(id, chunk);\r\n }\r\n if (state === FilePushState.CANCEL || state === FilePushState.FINISH || state === FilePushState.NEW) {\r\n return this.createPushFileOtherCommand(id, state);\r\n }\r\n\r\n throw TypeError(`Unsupported state: \"${state}\"`);\r\n }\r\n\r\n private static createPushFileStartCommand(id: number, fileName: string, fileSize: number): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_PUSH_FILE);\r\n const text = Util.stringToUtf8ByteArray(fileName);\r\n const typeField = 1;\r\n const idField = 2;\r\n const stateField = 1;\r\n const sizeField = 4;\r\n const textLengthField = 2;\r\n const textLength = text.length;\r\n let offset = CommandControlMessage.PAYLOAD_LENGTH;\r\n\r\n const buffer = Buffer.alloc(\r\n offset + typeField + idField + stateField + sizeField + textLengthField + textLength,\r\n );\r\n buffer.writeUInt8(event.type, offset);\r\n offset += typeField;\r\n buffer.writeInt16BE(id, offset);\r\n offset += idField;\r\n buffer.writeInt8(FilePushState.START, offset);\r\n offset += stateField;\r\n buffer.writeUInt32BE(fileSize, offset);\r\n offset += sizeField;\r\n buffer.writeUInt16BE(textLength, offset);\r\n offset += textLengthField;\r\n text.forEach((byte, index) => {\r\n buffer.writeUInt8(byte, index + offset);\r\n });\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n private static createPushFileChunkCommand(id: number, chunk: Uint8Array): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_PUSH_FILE);\r\n const typeField = 1;\r\n const idField = 2;\r\n const stateField = 1;\r\n const chunkLengthField = 4;\r\n const chunkLength = chunk.byteLength;\r\n let offset = CommandControlMessage.PAYLOAD_LENGTH;\r\n\r\n const buffer = Buffer.alloc(offset + typeField + idField + stateField + chunkLengthField + chunkLength);\r\n buffer.writeUInt8(event.type, offset);\r\n offset += typeField;\r\n buffer.writeInt16BE(id, offset);\r\n offset += idField;\r\n buffer.writeInt8(FilePushState.APPEND, offset);\r\n offset += stateField;\r\n buffer.writeUInt32BE(chunkLength, offset);\r\n offset += chunkLengthField;\r\n Array.from(chunk).forEach((byte, index) => {\r\n buffer.writeUInt8(byte, index + offset);\r\n });\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n private static createPushFileOtherCommand(id: number, state: FilePushState): CommandControlMessage {\r\n const event = new CommandControlMessage(ControlMessage.TYPE_PUSH_FILE);\r\n const typeField = 1;\r\n const idField = 2;\r\n const stateField = 1;\r\n let offset = CommandControlMessage.PAYLOAD_LENGTH;\r\n const buffer = Buffer.alloc(offset + typeField + idField + stateField);\r\n buffer.writeUInt8(event.type, offset);\r\n offset += typeField;\r\n buffer.writeInt16BE(id, offset);\r\n offset += idField;\r\n buffer.writeInt8(state, offset);\r\n event.buffer = buffer;\r\n return event;\r\n }\r\n\r\n public static pushFileCommandFromBuffer(buffer: Buffer): {\r\n id: number;\r\n state: FilePushState;\r\n chunk?: Buffer;\r\n fileSize?: number;\r\n fileName?: string;\r\n } {\r\n let offset = 0;\r\n const type = buffer.readUInt8(offset);\r\n offset += 1;\r\n if (type !== CommandControlMessage.TYPE_PUSH_FILE) {\r\n throw TypeError(`Incorrect type: \"${type}\"`);\r\n }\r\n const id = buffer.readInt16BE(offset);\r\n offset += 2;\r\n const state = buffer.readInt8(offset);\r\n offset += 1;\r\n let chunk: Buffer | undefined;\r\n let fileSize: number | undefined;\r\n let fileName: string | undefined;\r\n if (state === FilePushState.APPEND) {\r\n const chunkLength = buffer.readUInt32BE(offset);\r\n offset += 4;\r\n chunk = buffer.slice(offset, offset + chunkLength);\r\n } else if (state === FilePushState.START) {\r\n fileSize = buffer.readUInt32BE(offset);\r\n offset += 4;\r\n const textLength = buffer.readUInt16BE(offset);\r\n offset += 2;\r\n fileName = Util.utf8ByteArrayToString(buffer.slice(offset, offset + textLength));\r\n }\r\n return { id, state, chunk, fileName, fileSize };\r\n }\r\n\r\n private buffer?: Buffer;\r\n\r\n constructor(readonly type: number) {\r\n super(type);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public toBuffer(): Buffer {\r\n if (!this.buffer) {\r\n const buffer = Buffer.alloc(CommandControlMessage.PAYLOAD_LENGTH + 1);\r\n buffer.writeUInt8(this.type, 0);\r\n this.buffer = buffer;\r\n }\r\n return this.buffer;\r\n }\r\n\r\n public toString(): string {\r\n const buffer = this.buffer ? `, buffer=[${this.buffer.join(',')}]` : '';\r\n return `CommandControlMessage{action=${this.type}${buffer}}`;\r\n }\r\n}\r\n\r\n","export default class KeyEvent {\r\n public static readonly ACTION_DOWN: number = 0;\r\n public static readonly ACTION_UP: number = 1;\r\n\r\n public static readonly KEYCODE_0: number = 7;\r\n public static readonly KEYCODE_1: number = 8;\r\n public static readonly KEYCODE_11: number = 227;\r\n public static readonly KEYCODE_12: number = 228;\r\n public static readonly KEYCODE_2: number = 9;\r\n public static readonly KEYCODE_3: number = 10;\r\n public static readonly KEYCODE_3D_MODE: number = 206;\r\n public static readonly KEYCODE_4: number = 11;\r\n public static readonly KEYCODE_5: number = 12;\r\n public static readonly KEYCODE_6: number = 13;\r\n public static readonly KEYCODE_7: number = 14;\r\n public static readonly KEYCODE_8: number = 15;\r\n public static readonly KEYCODE_9: number = 16;\r\n public static readonly KEYCODE_A: number = 29;\r\n public static readonly KEYCODE_ALL_APPS: number = 284;\r\n public static readonly KEYCODE_ALT_LEFT: number = 57;\r\n public static readonly KEYCODE_ALT_RIGHT: number = 58;\r\n public static readonly KEYCODE_APOSTROPHE: number = 75;\r\n public static readonly KEYCODE_APP_SWITCH: number = 187;\r\n public static readonly KEYCODE_ASSIST: number = 219;\r\n public static readonly KEYCODE_AT: number = 77;\r\n public static readonly KEYCODE_AVR_INPUT: number = 182;\r\n public static readonly KEYCODE_AVR_POWER: number = 181;\r\n public static readonly KEYCODE_B: number = 30;\r\n public static readonly KEYCODE_BACK: number = 4;\r\n public static readonly KEYCODE_BACKSLASH: number = 73;\r\n public static readonly KEYCODE_BOOKMARK: number = 174;\r\n public static readonly KEYCODE_BREAK: number = 121;\r\n public static readonly KEYCODE_BRIGHTNESS_DOWN: number = 220;\r\n public static readonly KEYCODE_BRIGHTNESS_UP: number = 221;\r\n public static readonly KEYCODE_BUTTON_1: number = 188;\r\n public static readonly KEYCODE_BUTTON_10: number = 197;\r\n public static readonly KEYCODE_BUTTON_11: number = 198;\r\n public static readonly KEYCODE_BUTTON_12: number = 199;\r\n public static readonly KEYCODE_BUTTON_13: number = 200;\r\n public static readonly KEYCODE_BUTTON_14: number = 201;\r\n public static readonly KEYCODE_BUTTON_15: number = 202;\r\n public static readonly KEYCODE_BUTTON_16: number = 203;\r\n public static readonly KEYCODE_BUTTON_2: number = 189;\r\n public static readonly KEYCODE_BUTTON_3: number = 190;\r\n public static readonly KEYCODE_BUTTON_4: number = 191;\r\n public static readonly KEYCODE_BUTTON_5: number = 192;\r\n public static readonly KEYCODE_BUTTON_6: number = 193;\r\n public static readonly KEYCODE_BUTTON_7: number = 194;\r\n public static readonly KEYCODE_BUTTON_8: number = 195;\r\n public static readonly KEYCODE_BUTTON_9: number = 196;\r\n public static readonly KEYCODE_BUTTON_A: number = 96;\r\n public static readonly KEYCODE_BUTTON_B: number = 97;\r\n public static readonly KEYCODE_BUTTON_C: number = 98;\r\n public static readonly KEYCODE_BUTTON_L1: number = 102;\r\n public static readonly KEYCODE_BUTTON_L2: number = 104;\r\n public static readonly KEYCODE_BUTTON_MODE: number = 110;\r\n public static readonly KEYCODE_BUTTON_R1: number = 103;\r\n public static readonly KEYCODE_BUTTON_R2: number = 105;\r\n public static readonly KEYCODE_BUTTON_SELECT: number = 109;\r\n public static readonly KEYCODE_BUTTON_START: number = 108;\r\n public static readonly KEYCODE_BUTTON_THUMBL: number = 106;\r\n public static readonly KEYCODE_BUTTON_THUMBR: number = 107;\r\n public static readonly KEYCODE_BUTTON_X: number = 99;\r\n public static readonly KEYCODE_BUTTON_Y: number = 100;\r\n public static readonly KEYCODE_BUTTON_Z: number = 101;\r\n public static readonly KEYCODE_C: number = 31;\r\n public static readonly KEYCODE_CALCULATOR: number = 210;\r\n public static readonly KEYCODE_CALENDAR: number = 208;\r\n public static readonly KEYCODE_CALL: number = 5;\r\n public static readonly KEYCODE_CAMERA: number = 27;\r\n public static readonly KEYCODE_CAPS_LOCK: number = 115;\r\n public static readonly KEYCODE_CAPTIONS: number = 175;\r\n public static readonly KEYCODE_CHANNEL_DOWN: number = 167;\r\n public static readonly KEYCODE_CHANNEL_UP: number = 166;\r\n public static readonly KEYCODE_CLEAR: number = 28;\r\n public static readonly KEYCODE_COMMA: number = 55;\r\n public static readonly KEYCODE_CONTACTS: number = 207;\r\n public static readonly KEYCODE_COPY: number = 278;\r\n public static readonly KEYCODE_CTRL_LEFT: number = 113;\r\n public static readonly KEYCODE_CTRL_RIGHT: number = 114;\r\n public static readonly KEYCODE_CUT: number = 277;\r\n public static readonly KEYCODE_D: number = 32;\r\n public static readonly KEYCODE_DEL: number = 67;\r\n public static readonly KEYCODE_DPAD_CENTER: number = 23;\r\n public static readonly KEYCODE_DPAD_DOWN: number = 20;\r\n public static readonly KEYCODE_DPAD_DOWN_LEFT: number = 269;\r\n public static readonly KEYCODE_DPAD_DOWN_RIGHT: number = 271;\r\n public static readonly KEYCODE_DPAD_LEFT: number = 21;\r\n public static readonly KEYCODE_DPAD_RIGHT: number = 22;\r\n public static readonly KEYCODE_DPAD_UP: number = 19;\r\n public static readonly KEYCODE_DPAD_UP_LEFT: number = 268;\r\n public static readonly KEYCODE_DPAD_UP_RIGHT: number = 270;\r\n public static readonly KEYCODE_DVR: number = 173;\r\n public static readonly KEYCODE_E: number = 33;\r\n public static readonly KEYCODE_EISU: number = 212;\r\n public static readonly KEYCODE_ENDCALL: number = 6;\r\n public static readonly KEYCODE_ENTER: number = 66;\r\n public static readonly KEYCODE_ENVELOPE: number = 65;\r\n public static readonly KEYCODE_EQUALS: number = 70;\r\n public static readonly KEYCODE_ESCAPE: number = 111;\r\n public static readonly KEYCODE_EXPLORER: number = 64;\r\n public static readonly KEYCODE_F: number = 34;\r\n public static readonly KEYCODE_F1: number = 131;\r\n public static readonly KEYCODE_F10: number = 140;\r\n public static readonly KEYCODE_F11: number = 141;\r\n public static readonly KEYCODE_F12: number = 142;\r\n public static readonly KEYCODE_F2: number = 132;\r\n public static readonly KEYCODE_F3: number = 133;\r\n public static readonly KEYCODE_F4: number = 134;\r\n public static readonly KEYCODE_F5: number = 135;\r\n public static readonly KEYCODE_F6: number = 136;\r\n public static readonly KEYCODE_F7: number = 137;\r\n public static readonly KEYCODE_F8: number = 138;\r\n public static readonly KEYCODE_F9: number = 139;\r\n public static readonly KEYCODE_FOCUS: number = 80;\r\n public static readonly KEYCODE_FORWARD: number = 125;\r\n public static readonly KEYCODE_FORWARD_DEL: number = 112;\r\n public static readonly KEYCODE_FUNCTION: number = 119;\r\n public static readonly KEYCODE_G: number = 35;\r\n public static readonly KEYCODE_GRAVE: number = 68;\r\n public static readonly KEYCODE_GUIDE: number = 172;\r\n public static readonly KEYCODE_H: number = 36;\r\n public static readonly KEYCODE_HEADSETHOOK: number = 79;\r\n public static readonly KEYCODE_HELP: number = 259;\r\n public static readonly KEYCODE_HENKAN: number = 214;\r\n public static readonly KEYCODE_HOME: number = 3;\r\n public static readonly KEYCODE_I: number = 37;\r\n public static readonly KEYCODE_INFO: number = 165;\r\n public static readonly KEYCODE_INSERT: number = 124;\r\n public static readonly KEYCODE_J: number = 38;\r\n public static readonly KEYCODE_K: number = 39;\r\n public static readonly KEYCODE_KANA: number = 218;\r\n public static readonly KEYCODE_KATAKANA_HIRAGANA: number = 215;\r\n public static readonly KEYCODE_L: number = 40;\r\n public static readonly KEYCODE_LANGUAGE_SWITCH: number = 204;\r\n public static readonly KEYCODE_LAST_CHANNEL: number = 229;\r\n public static readonly KEYCODE_LEFT_BRACKET: number = 71;\r\n public static readonly KEYCODE_M: number = 41;\r\n public static readonly KEYCODE_MANNER_MODE: number = 205;\r\n public static readonly KEYCODE_MEDIA_AUDIO_TRACK: number = 222;\r\n public static readonly KEYCODE_MEDIA_CLOSE: number = 128;\r\n public static readonly KEYCODE_MEDIA_EJECT: number = 129;\r\n public static readonly KEYCODE_MEDIA_FAST_FORWARD: number = 90;\r\n public static readonly KEYCODE_MEDIA_NEXT: number = 87;\r\n public static readonly KEYCODE_MEDIA_PAUSE: number = 127;\r\n public static readonly KEYCODE_MEDIA_PLAY: number = 126;\r\n public static readonly KEYCODE_MEDIA_PLAY_PAUSE: number = 85;\r\n public static readonly KEYCODE_MEDIA_PREVIOUS: number = 88;\r\n public static readonly KEYCODE_MEDIA_RECORD: number = 130;\r\n public static readonly KEYCODE_MEDIA_REWIND: number = 89;\r\n public static readonly KEYCODE_MEDIA_SKIP_BACKWARD: number = 273;\r\n public static readonly KEYCODE_MEDIA_SKIP_FORWARD: number = 272;\r\n public static readonly KEYCODE_MEDIA_STEP_BACKWARD: number = 275;\r\n public static readonly KEYCODE_MEDIA_STEP_FORWARD: number = 274;\r\n public static readonly KEYCODE_MEDIA_STOP: number = 86;\r\n public static readonly KEYCODE_MEDIA_TOP_MENU: number = 226;\r\n public static readonly KEYCODE_MENU: number = 82;\r\n public static readonly KEYCODE_META_LEFT: number = 117;\r\n public static readonly KEYCODE_META_RIGHT: number = 118;\r\n public static readonly KEYCODE_MINUS: number = 69;\r\n public static readonly KEYCODE_MOVE_END: number = 123;\r\n public static readonly KEYCODE_MOVE_HOME: number = 122;\r\n public static readonly KEYCODE_MUHENKAN: number = 213;\r\n public static readonly KEYCODE_MUSIC: number = 209;\r\n public static readonly KEYCODE_MUTE: number = 91;\r\n public static readonly KEYCODE_N: number = 42;\r\n public static readonly KEYCODE_NAVIGATE_IN: number = 262;\r\n public static readonly KEYCODE_NAVIGATE_NEXT: number = 261;\r\n public static readonly KEYCODE_NAVIGATE_OUT: number = 263;\r\n public static readonly KEYCODE_NAVIGATE_PREVIOUS: number = 260;\r\n public static readonly KEYCODE_NOTIFICATION: number = 83;\r\n public static readonly KEYCODE_NUM: number = 78;\r\n public static readonly KEYCODE_NUMPAD_0: number = 144;\r\n public static readonly KEYCODE_NUMPAD_1: number = 145;\r\n public static readonly KEYCODE_NUMPAD_2: number = 146;\r\n public static readonly KEYCODE_NUMPAD_3: number = 147;\r\n public static readonly KEYCODE_NUMPAD_4: number = 148;\r\n public static readonly KEYCODE_NUMPAD_5: number = 149;\r\n public static readonly KEYCODE_NUMPAD_6: number = 150;\r\n public static readonly KEYCODE_NUMPAD_7: number = 151;\r\n public static readonly KEYCODE_NUMPAD_8: number = 152;\r\n public static readonly KEYCODE_NUMPAD_9: number = 153;\r\n public static readonly KEYCODE_NUMPAD_ADD: number = 157;\r\n public static readonly KEYCODE_NUMPAD_COMMA: number = 159;\r\n public static readonly KEYCODE_NUMPAD_DIVIDE: number = 154;\r\n public static readonly KEYCODE_NUMPAD_DOT: number = 158;\r\n public static readonly KEYCODE_NUMPAD_ENTER: number = 160;\r\n public static readonly KEYCODE_NUMPAD_EQUALS: number = 161;\r\n public static readonly KEYCODE_NUMPAD_LEFT_PAREN: number = 162;\r\n public static readonly KEYCODE_NUMPAD_MULTIPLY: number = 155;\r\n public static readonly KEYCODE_NUMPAD_RIGHT_PAREN: number = 163;\r\n public static readonly KEYCODE_NUMPAD_SUBTRACT: number = 156;\r\n public static readonly KEYCODE_NUM_LOCK: number = 143;\r\n public static readonly KEYCODE_O: number = 43;\r\n public static readonly KEYCODE_P: number = 44;\r\n public static readonly KEYCODE_PAGE_DOWN: number = 93;\r\n public static readonly KEYCODE_PAGE_UP: number = 92;\r\n public static readonly KEYCODE_PAIRING: number = 225;\r\n public static readonly KEYCODE_PASTE: number = 279;\r\n public static readonly KEYCODE_PERIOD: number = 56;\r\n public static readonly KEYCODE_PICTSYMBOLS: number = 94;\r\n public static readonly KEYCODE_PLUS: number = 81;\r\n public static readonly KEYCODE_POUND: number = 18;\r\n public static readonly KEYCODE_POWER: number = 26;\r\n public static readonly KEYCODE_PROFILE_SWITCH: number = 288;\r\n public static readonly KEYCODE_PROG_BLUE: number = 186;\r\n public static readonly KEYCODE_PROG_GREEN: number = 184;\r\n public static readonly KEYCODE_PROG_RED: number = 183;\r\n public static readonly KEYCODE_PROG_YELLOW: number = 185;\r\n public static readonly KEYCODE_Q: number = 45;\r\n public static readonly KEYCODE_R: number = 46;\r\n public static readonly KEYCODE_REFRESH: number = 285;\r\n public static readonly KEYCODE_RIGHT_BRACKET: number = 72;\r\n public static readonly KEYCODE_RO: number = 217;\r\n public static readonly KEYCODE_S: number = 47;\r\n public static readonly KEYCODE_SCROLL_LOCK: number = 116;\r\n public static readonly KEYCODE_SEARCH: number = 84;\r\n public static readonly KEYCODE_SEMICOLON: number = 74;\r\n public static readonly KEYCODE_SETTINGS: number = 176;\r\n public static readonly KEYCODE_SHIFT_LEFT: number = 59;\r\n public static readonly KEYCODE_SHIFT_RIGHT: number = 60;\r\n public static readonly KEYCODE_SLASH: number = 76;\r\n public static readonly KEYCODE_SLEEP: number = 223;\r\n public static readonly KEYCODE_SOFT_LEFT: number = 1;\r\n public static readonly KEYCODE_SOFT_RIGHT: number = 2;\r\n public static readonly KEYCODE_SOFT_SLEEP: number = 276;\r\n public static readonly KEYCODE_SPACE: number = 62;\r\n public static readonly KEYCODE_STAR: number = 17;\r\n public static readonly KEYCODE_STB_INPUT: number = 180;\r\n public static readonly KEYCODE_STB_POWER: number = 179;\r\n public static readonly KEYCODE_STEM_1: number = 265;\r\n public static readonly KEYCODE_STEM_2: number = 266;\r\n public static readonly KEYCODE_STEM_3: number = 267;\r\n public static readonly KEYCODE_STEM_PRIMARY: number = 264;\r\n public static readonly KEYCODE_SWITCH_CHARSET: number = 95;\r\n public static readonly KEYCODE_SYM: number = 63;\r\n public static readonly KEYCODE_SYSRQ: number = 120;\r\n public static readonly KEYCODE_SYSTEM_NAVIGATION_DOWN: number = 281;\r\n public static readonly KEYCODE_SYSTEM_NAVIGATION_LEFT: number = 282;\r\n public static readonly KEYCODE_SYSTEM_NAVIGATION_RIGHT: number = 283;\r\n public static readonly KEYCODE_SYSTEM_NAVIGATION_UP: number = 280;\r\n public static readonly KEYCODE_T: number = 48;\r\n public static readonly KEYCODE_TAB: number = 61;\r\n public static readonly KEYCODE_THUMBS_DOWN: number = 287;\r\n public static readonly KEYCODE_THUMBS_UP: number = 286;\r\n public static readonly KEYCODE_TV: number = 170;\r\n public static readonly KEYCODE_TV_ANTENNA_CABLE: number = 242;\r\n public static readonly KEYCODE_TV_AUDIO_DESCRIPTION: number = 252;\r\n public static readonly KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN: number = 254;\r\n public static readonly KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP: number = 253;\r\n public static readonly KEYCODE_TV_CONTENTS_MENU: number = 256;\r\n public static readonly KEYCODE_TV_DATA_SERVICE: number = 230;\r\n public static readonly KEYCODE_TV_INPUT: number = 178;\r\n public static readonly KEYCODE_TV_INPUT_COMPONENT_1: number = 249;\r\n public static readonly KEYCODE_TV_INPUT_COMPONENT_2: number = 250;\r\n public static readonly KEYCODE_TV_INPUT_COMPOSITE_1: number = 247;\r\n public static readonly KEYCODE_TV_INPUT_COMPOSITE_2: number = 248;\r\n public static readonly KEYCODE_TV_INPUT_HDMI_1: number = 243;\r\n public static readonly KEYCODE_TV_INPUT_HDMI_2: number = 244;\r\n public static readonly KEYCODE_TV_INPUT_HDMI_3: number = 245;\r\n public static readonly KEYCODE_TV_INPUT_HDMI_4: number = 246;\r\n public static readonly KEYCODE_TV_INPUT_VGA_1: number = 251;\r\n public static readonly KEYCODE_TV_MEDIA_CONTEXT_MENU: number = 257;\r\n public static readonly KEYCODE_TV_NETWORK: number = 241;\r\n public static readonly KEYCODE_TV_NUMBER_ENTRY: number = 234;\r\n public static readonly KEYCODE_TV_POWER: number = 177;\r\n public static readonly KEYCODE_TV_RADIO_SERVICE: number = 232;\r\n public static readonly KEYCODE_TV_SATELLITE: number = 237;\r\n public static readonly KEYCODE_TV_SATELLITE_BS: number = 238;\r\n public static readonly KEYCODE_TV_SATELLITE_CS: number = 239;\r\n public static readonly KEYCODE_TV_SATELLITE_SERVICE: number = 240;\r\n public static readonly KEYCODE_TV_TELETEXT: number = 233;\r\n public static readonly KEYCODE_TV_TERRESTRIAL_ANALOG: number = 235;\r\n public static readonly KEYCODE_TV_TERRESTRIAL_DIGITAL: number = 236;\r\n public static readonly KEYCODE_TV_TIMER_PROGRAMMING: number = 258;\r\n public static readonly KEYCODE_TV_ZOOM_MODE: number = 255;\r\n public static readonly KEYCODE_U: number = 49;\r\n public static readonly KEYCODE_UNKNOWN: number = 0;\r\n public static readonly KEYCODE_V: number = 50;\r\n public static readonly KEYCODE_VOICE_ASSIST: number = 231;\r\n public static readonly KEYCODE_VOLUME_DOWN: number = 25;\r\n public static readonly KEYCODE_VOLUME_MUTE: number = 164;\r\n public static readonly KEYCODE_VOLUME_UP: number = 24;\r\n public static readonly KEYCODE_W: number = 51;\r\n public static readonly KEYCODE_WAKEUP: number = 224;\r\n public static readonly KEYCODE_WINDOW: number = 171;\r\n public static readonly KEYCODE_X: number = 52;\r\n public static readonly KEYCODE_Y: number = 53;\r\n public static readonly KEYCODE_YEN: number = 216;\r\n public static readonly KEYCODE_Z: number = 54;\r\n public static readonly KEYCODE_ZENKAKU_HANKAKU: number = 211;\r\n public static readonly KEYCODE_ZOOM_IN: number = 168;\r\n public static readonly KEYCODE_ZOOM_OUT: number = 169;\r\n\r\n public static readonly META_ALT_LEFT_ON: number = 16;\r\n public static readonly META_ALT_MASK: number = 50;\r\n public static readonly META_ALT_ON: number = 2;\r\n public static readonly META_ALT_RIGHT_ON: number = 32;\r\n public static readonly META_CAPS_LOCK_ON: number = 1048576;\r\n public static readonly META_CTRL_LEFT_ON: number = 8192;\r\n public static readonly META_CTRL_MASK: number = 28672;\r\n public static readonly META_CTRL_ON: number = 4096;\r\n public static readonly META_CTRL_RIGHT_ON: number = 16384;\r\n public static readonly META_FUNCTION_ON: number = 8;\r\n public static readonly META_META_LEFT_ON: number = 131072;\r\n public static readonly META_META_MASK: number = 458752;\r\n public static readonly META_META_ON: number = 65536;\r\n public static readonly META_META_RIGHT_ON: number = 262144;\r\n public static readonly META_NUM_LOCK_ON: number = 2097152;\r\n public static readonly META_SCROLL_LOCK_ON: number = 4194304;\r\n public static readonly META_SHIFT_LEFT_ON: number = 64;\r\n public static readonly META_SHIFT_MASK: number = 193;\r\n public static readonly META_SHIFT_ON: number = 1;\r\n public static readonly META_SHIFT_RIGHT_ON: number = 128;\r\n public static readonly META_SYM_ON: number = 4;\r\n}\r\n\r\n","// https://w3c.github.io/uievents-code/\r\n\r\nexport default class UIEventsCode {\r\n // 3.1.1.1. Writing System Keys\r\n public static readonly Backquote: string = 'Backquote';\r\n public static readonly Backslash: string = 'Backslash';\r\n public static readonly BracketLeft: string = 'BracketLeft';\r\n public static readonly BracketRight: string = 'BracketRight';\r\n public static readonly Comma: string = 'Comma';\r\n public static readonly Digit0: string = 'Digit0';\r\n public static readonly Digit1: string = 'Digit1';\r\n public static readonly Digit2: string = 'Digit2';\r\n public static readonly Digit3: string = 'Digit3';\r\n public static readonly Digit4: string = 'Digit4';\r\n public static readonly Digit5: string = 'Digit5';\r\n public static readonly Digit6: string = 'Digit6';\r\n public static readonly Digit7: string = 'Digit7';\r\n public static readonly Digit8: string = 'Digit8';\r\n public static readonly Digit9: string = 'Digit9';\r\n public static readonly Equal: string = 'Equal';\r\n public static readonly IntlBackslash: string = 'IntlBackslash';\r\n public static readonly IntlRo: string = 'IntlRo';\r\n public static readonly IntlYen: string = 'IntlYen';\r\n public static readonly KeyA: string = 'KeyA';\r\n public static readonly KeyB: string = 'KeyB';\r\n public static readonly KeyC: string = 'KeyC';\r\n public static readonly KeyD: string = 'KeyD';\r\n public static readonly KeyE: string = 'KeyE';\r\n public static readonly KeyF: string = 'KeyF';\r\n public static readonly KeyG: string = 'KeyG';\r\n public static readonly KeyH: string = 'KeyH';\r\n public static readonly KeyI: string = 'KeyI';\r\n public static readonly KeyJ: string = 'KeyJ';\r\n public static readonly KeyK: string = 'KeyK';\r\n public static readonly KeyL: string = 'KeyL';\r\n public static readonly KeyM: string = 'KeyM';\r\n public static readonly KeyN: string = 'KeyN';\r\n public static readonly KeyO: string = 'KeyO';\r\n public static readonly KeyP: string = 'KeyP';\r\n public static readonly KeyQ: string = 'KeyQ';\r\n public static readonly KeyR: string = 'KeyR';\r\n public static readonly KeyS: string = 'KeyS';\r\n public static readonly KeyT: string = 'KeyT';\r\n public static readonly KeyU: string = 'KeyU';\r\n public static readonly KeyV: string = 'KeyV';\r\n public static readonly KeyW: string = 'KeyW';\r\n public static readonly KeyX: string = 'KeyX';\r\n public static readonly KeyY: string = 'KeyY';\r\n public static readonly KeyZ: string = 'KeyZ';\r\n public static readonly Minus: string = 'Minus';\r\n public static readonly Period: string = 'Period';\r\n public static readonly Quote: string = 'Quote';\r\n public static readonly Semicolon: string = 'Semicolon';\r\n public static readonly Slash: string = 'Slash';\r\n\r\n // 3.1.1.2. Functional Keys\r\n public static readonly AltLeft: string = 'AltLeft';\r\n public static readonly AltRight: string = 'AltRight';\r\n public static readonly Backspace: string = 'Backspace';\r\n public static readonly CapsLock: string = 'CapsLock';\r\n public static readonly ContextMenu: string = 'ContextMenu';\r\n public static readonly ControlLeft: string = 'ControlLeft';\r\n public static readonly ControlRight: string = 'ControlRight';\r\n public static readonly Enter: string = 'Enter';\r\n public static readonly MetaLeft: string = 'MetaLeft';\r\n public static readonly MetaRight: string = 'MetaRight';\r\n public static readonly ShiftLeft: string = 'ShiftLeft';\r\n public static readonly ShiftRight: string = 'ShiftRight';\r\n public static readonly Space: string = 'Space';\r\n public static readonly Tab: string = 'Tab';\r\n public static readonly Convert: string = 'Convert';\r\n public static readonly KanaMode: string = 'KanaMode';\r\n public static readonly Lang1: string = 'Lang1';\r\n public static readonly Lang2: string = 'Lang2';\r\n public static readonly Lang3: string = 'Lang3';\r\n public static readonly Lang4: string = 'Lang4';\r\n public static readonly Lang5: string = 'Lang5';\r\n public static readonly NonConvert: string = 'NonConvert';\r\n\r\n // 3.1.2. Control Pad Section\r\n public static readonly Delete: string = 'Delete';\r\n public static readonly End: string = 'End';\r\n public static readonly Help: string = 'Help';\r\n public static readonly Home: string = 'Home';\r\n public static readonly Insert: string = 'Insert';\r\n public static readonly PageDown: string = 'PageDown';\r\n public static readonly PageUp: string = 'PageUp';\r\n\r\n // 3.1.3. Arrow Pad Section\r\n public static readonly ArrowDown: string = 'ArrowDown';\r\n public static readonly ArrowLeft: string = 'ArrowLeft';\r\n public static readonly ArrowRight: string = 'ArrowRight';\r\n public static readonly ArrowUp: string = 'ArrowUp';\r\n\r\n // 3.1.4. Numpad Section\r\n public static readonly NumLock: string = 'NumLock';\r\n public static readonly Numpad0: string = 'Numpad0';\r\n public static readonly Numpad1: string = 'Numpad1';\r\n public static readonly Numpad2: string = 'Numpad2';\r\n public static readonly Numpad3: string = 'Numpad3';\r\n public static readonly Numpad4: string = 'Numpad4';\r\n public static readonly Numpad5: string = 'Numpad5';\r\n public static readonly Numpad6: string = 'Numpad6';\r\n public static readonly Numpad7: string = 'Numpad7';\r\n public static readonly Numpad8: string = 'Numpad8';\r\n public static readonly Numpad9: string = 'Numpad9';\r\n public static readonly NumpadAdd: string = 'NumpadAdd';\r\n public static readonly NumpadBackspace: string = 'NumpadBackspace';\r\n public static readonly NumpadClear: string = 'NumpadClear';\r\n public static readonly NumpadClearEntry: string = 'NumpadClearEntry';\r\n public static readonly NumpadComma: string = 'NumpadComma';\r\n public static readonly NumpadDecimal: string = 'NumpadDecimal';\r\n public static readonly NumpadDivide: string = 'NumpadDivide';\r\n public static readonly NumpadEnter: string = 'NumpadEnter';\r\n public static readonly NumpadEqual: string = 'NumpadEqual';\r\n public static readonly NumpadHash: string = 'NumpadHash';\r\n public static readonly NumpadMemoryAdd: string = 'NumpadMemoryAdd';\r\n public static readonly NumpadMemoryClear: string = 'NumpadMemoryClear';\r\n public static readonly NumpadMemoryRecall: string = 'NumpadMemoryRecall';\r\n public static readonly NumpadMemoryStore: string = 'NumpadMemoryStore';\r\n public static readonly NumpadMemorySubtract: string = 'NumpadMemorySubtract';\r\n public static readonly NumpadMultiply: string = 'NumpadMultiply';\r\n public static readonly NumpadParenLeft: string = 'NumpadParenLeft';\r\n public static readonly NumpadParenRight: string = 'NumpadParenRight';\r\n public static readonly NumpadStar: string = 'NumpadStar';\r\n public static readonly NumpadSubtract: string = 'NumpadSubtract';\r\n\r\n // 3.1.5. Function Section\r\n public static readonly Escape: string = 'Escape';\r\n public static readonly F1: string = 'F1';\r\n public static readonly F2: string = 'F2';\r\n public static readonly F3: string = 'F3';\r\n public static readonly F4: string = 'F4';\r\n public static readonly F5: string = 'F5';\r\n public static readonly F6: string = 'F6';\r\n public static readonly F7: string = 'F7';\r\n public static readonly F8: string = 'F8';\r\n public static readonly F9: string = 'F9';\r\n public static readonly F10: string = 'F10';\r\n public static readonly F11: string = 'F11';\r\n public static readonly F12: string = 'F12';\r\n public static readonly Fn: string = 'Fn';\r\n public static readonly FnLock: string = 'FnLock';\r\n public static readonly PrintScreen: string = 'PrintScreen';\r\n public static readonly ScrollLock: string = 'ScrollLock';\r\n public static readonly Pause: string = 'Pause';\r\n\r\n // 3.1.6. Media Keys\r\n public static readonly BrowserBack: string = 'BrowserBack';\r\n public static readonly BrowserFavorites: string = 'BrowserFavorites';\r\n public static readonly BrowserForward: string = 'BrowserForward';\r\n public static readonly BrowserHome: string = 'BrowserHome';\r\n public static readonly BrowserRefresh: string = 'BrowserRefresh';\r\n public static readonly BrowserSearch: string = 'BrowserSearch';\r\n public static readonly BrowserStop: string = 'BrowserStop';\r\n public static readonly Eject: string = 'Eject';\r\n public static readonly LaunchApp1: string = 'LaunchApp1';\r\n public static readonly LaunchApp2: string = 'LaunchApp2';\r\n public static readonly LaunchMail: string = 'LaunchMail';\r\n public static readonly MediaPlayPause: string = 'MediaPlayPause';\r\n public static readonly MediaSelect: string = 'MediaSelect';\r\n public static readonly MediaStop: string = 'MediaStop';\r\n public static readonly MediaTrackNext: string = 'MediaTrackNext';\r\n public static readonly MediaTrackPrevious: string = 'MediaTrackPrevious';\r\n public static readonly Power: string = 'Power';\r\n public static readonly Sleep: string = 'Sleep';\r\n public static readonly AudioVolumeDown: string = 'AudioVolumeDown';\r\n public static readonly AudioVolumeMute: string = 'AudioVolumeMute';\r\n public static readonly AudioVolumeUp: string = 'AudioVolumeUp';\r\n public static readonly WakeUp: string = 'WakeUp';\r\n\r\n // 3.1.7. Legacy, Non-Standard and Special Keys\r\n public static readonly Hyper: string = 'Hyper';\r\n public static readonly Super: string = 'Super';\r\n public static readonly Turbo: string = 'Turbo';\r\n public static readonly Abort: string = 'Abort';\r\n public static readonly Resume: string = 'Resume';\r\n public static readonly Suspend: string = 'Suspend';\r\n public static readonly Again: string = 'Again';\r\n public static readonly Copy: string = 'Copy';\r\n public static readonly Cut: string = 'Cut';\r\n public static readonly Find: string = 'Find';\r\n public static readonly Open: string = 'Open';\r\n public static readonly Paste: string = 'Paste';\r\n public static readonly Props: string = 'Props';\r\n public static readonly Select: string = 'Select';\r\n public static readonly Undo: string = 'Undo';\r\n public static readonly Hiragana: string = 'Hiragana';\r\n public static readonly Katakana: string = 'Katakana';\r\n public static readonly Unidentified: string = 'Unidentified';\r\n}\r\n\r\n","import KeyEvent from './KeyEvent';\r\nimport UIEventsCode from './UIEventsCode';\r\n\r\nexport const KeyToCodeMap = new Map([\r\n [UIEventsCode.Backquote, KeyEvent.KEYCODE_GRAVE],\r\n [UIEventsCode.Backslash, KeyEvent.KEYCODE_BACKSLASH],\r\n [UIEventsCode.BracketLeft, KeyEvent.KEYCODE_LEFT_BRACKET],\r\n [UIEventsCode.BracketRight, KeyEvent.KEYCODE_RIGHT_BRACKET],\r\n [UIEventsCode.Comma, KeyEvent.KEYCODE_COMMA],\r\n [UIEventsCode.Digit0, KeyEvent.KEYCODE_0],\r\n [UIEventsCode.Digit1, KeyEvent.KEYCODE_1],\r\n [UIEventsCode.Digit2, KeyEvent.KEYCODE_2],\r\n [UIEventsCode.Digit3, KeyEvent.KEYCODE_3],\r\n [UIEventsCode.Digit4, KeyEvent.KEYCODE_4],\r\n [UIEventsCode.Digit5, KeyEvent.KEYCODE_5],\r\n [UIEventsCode.Digit6, KeyEvent.KEYCODE_6],\r\n [UIEventsCode.Digit7, KeyEvent.KEYCODE_7],\r\n [UIEventsCode.Digit8, KeyEvent.KEYCODE_8],\r\n [UIEventsCode.Digit9, KeyEvent.KEYCODE_9],\r\n [UIEventsCode.Equal, KeyEvent.KEYCODE_EQUALS],\r\n [UIEventsCode.IntlRo, KeyEvent.KEYCODE_RO],\r\n [UIEventsCode.IntlYen, KeyEvent.KEYCODE_YEN],\r\n [UIEventsCode.KeyA, KeyEvent.KEYCODE_A],\r\n [UIEventsCode.KeyB, KeyEvent.KEYCODE_B],\r\n [UIEventsCode.KeyC, KeyEvent.KEYCODE_C],\r\n [UIEventsCode.KeyD, KeyEvent.KEYCODE_D],\r\n [UIEventsCode.KeyE, KeyEvent.KEYCODE_E],\r\n [UIEventsCode.KeyF, KeyEvent.KEYCODE_F],\r\n [UIEventsCode.KeyG, KeyEvent.KEYCODE_G],\r\n [UIEventsCode.KeyH, KeyEvent.KEYCODE_H],\r\n [UIEventsCode.KeyI, KeyEvent.KEYCODE_I],\r\n [UIEventsCode.KeyJ, KeyEvent.KEYCODE_J],\r\n [UIEventsCode.KeyK, KeyEvent.KEYCODE_K],\r\n [UIEventsCode.KeyL, KeyEvent.KEYCODE_L],\r\n [UIEventsCode.KeyM, KeyEvent.KEYCODE_M],\r\n [UIEventsCode.KeyN, KeyEvent.KEYCODE_N],\r\n [UIEventsCode.KeyO, KeyEvent.KEYCODE_O],\r\n [UIEventsCode.KeyP, KeyEvent.KEYCODE_P],\r\n [UIEventsCode.KeyQ, KeyEvent.KEYCODE_Q],\r\n [UIEventsCode.KeyR, KeyEvent.KEYCODE_R],\r\n [UIEventsCode.KeyS, KeyEvent.KEYCODE_S],\r\n [UIEventsCode.KeyT, KeyEvent.KEYCODE_T],\r\n [UIEventsCode.KeyU, KeyEvent.KEYCODE_U],\r\n [UIEventsCode.KeyV, KeyEvent.KEYCODE_V],\r\n [UIEventsCode.KeyW, KeyEvent.KEYCODE_W],\r\n [UIEventsCode.KeyX, KeyEvent.KEYCODE_X],\r\n [UIEventsCode.KeyY, KeyEvent.KEYCODE_Y],\r\n [UIEventsCode.KeyZ, KeyEvent.KEYCODE_Z],\r\n [UIEventsCode.Minus, KeyEvent.KEYCODE_MINUS],\r\n [UIEventsCode.Period, KeyEvent.KEYCODE_PERIOD],\r\n [UIEventsCode.Quote, KeyEvent.KEYCODE_APOSTROPHE],\r\n [UIEventsCode.Semicolon, KeyEvent.KEYCODE_SEMICOLON],\r\n [UIEventsCode.Slash, KeyEvent.KEYCODE_SLASH],\r\n [UIEventsCode.KanaMode, KeyEvent.KEYCODE_KANA],\r\n [UIEventsCode.Delete, KeyEvent.KEYCODE_FORWARD_DEL],\r\n [UIEventsCode.End, KeyEvent.KEYCODE_MOVE_END],\r\n [UIEventsCode.Help, KeyEvent.KEYCODE_HELP],\r\n [UIEventsCode.Home, KeyEvent.KEYCODE_MOVE_HOME],\r\n [UIEventsCode.Insert, KeyEvent.KEYCODE_INSERT],\r\n [UIEventsCode.PageDown, KeyEvent.KEYCODE_PAGE_DOWN],\r\n [UIEventsCode.PageUp, KeyEvent.KEYCODE_PAGE_UP],\r\n [UIEventsCode.AltLeft, KeyEvent.KEYCODE_ALT_LEFT],\r\n [UIEventsCode.AltRight, KeyEvent.KEYCODE_ALT_RIGHT],\r\n [UIEventsCode.Backspace, KeyEvent.KEYCODE_DEL],\r\n [UIEventsCode.CapsLock, KeyEvent.KEYCODE_CAPS_LOCK],\r\n [UIEventsCode.ControlLeft, KeyEvent.KEYCODE_CTRL_LEFT],\r\n [UIEventsCode.ControlRight, KeyEvent.KEYCODE_CTRL_RIGHT],\r\n [UIEventsCode.Enter, KeyEvent.KEYCODE_ENTER],\r\n [UIEventsCode.MetaLeft, KeyEvent.KEYCODE_META_LEFT],\r\n [UIEventsCode.MetaRight, KeyEvent.KEYCODE_META_RIGHT],\r\n [UIEventsCode.ShiftLeft, KeyEvent.KEYCODE_SHIFT_LEFT],\r\n [UIEventsCode.ShiftRight, KeyEvent.KEYCODE_SHIFT_RIGHT],\r\n [UIEventsCode.Space, KeyEvent.KEYCODE_SPACE],\r\n [UIEventsCode.Tab, KeyEvent.KEYCODE_TAB],\r\n [UIEventsCode.ArrowLeft, KeyEvent.KEYCODE_DPAD_LEFT],\r\n [UIEventsCode.ArrowUp, KeyEvent.KEYCODE_DPAD_UP],\r\n [UIEventsCode.ArrowRight, KeyEvent.KEYCODE_DPAD_RIGHT],\r\n [UIEventsCode.ArrowDown, KeyEvent.KEYCODE_DPAD_DOWN],\r\n\r\n [UIEventsCode.NumLock, KeyEvent.KEYCODE_NUM_LOCK],\r\n [UIEventsCode.Numpad0, KeyEvent.KEYCODE_NUMPAD_0],\r\n [UIEventsCode.Numpad1, KeyEvent.KEYCODE_NUMPAD_1],\r\n [UIEventsCode.Numpad2, KeyEvent.KEYCODE_NUMPAD_2],\r\n [UIEventsCode.Numpad3, KeyEvent.KEYCODE_NUMPAD_3],\r\n [UIEventsCode.Numpad4, KeyEvent.KEYCODE_NUMPAD_4],\r\n [UIEventsCode.Numpad5, KeyEvent.KEYCODE_NUMPAD_5],\r\n [UIEventsCode.Numpad6, KeyEvent.KEYCODE_NUMPAD_7],\r\n [UIEventsCode.Numpad8, KeyEvent.KEYCODE_NUMPAD_8],\r\n [UIEventsCode.Numpad9, KeyEvent.KEYCODE_NUMPAD_9],\r\n [UIEventsCode.NumpadAdd, KeyEvent.KEYCODE_NUMPAD_ADD],\r\n [UIEventsCode.NumpadComma, KeyEvent.KEYCODE_NUMPAD_COMMA],\r\n [UIEventsCode.NumpadDecimal, KeyEvent.KEYCODE_NUMPAD_DOT],\r\n [UIEventsCode.NumpadDivide, KeyEvent.KEYCODE_NUMPAD_DIVIDE],\r\n [UIEventsCode.NumpadEnter, KeyEvent.KEYCODE_NUMPAD_ENTER],\r\n [UIEventsCode.NumpadEqual, KeyEvent.KEYCODE_NUMPAD_EQUALS],\r\n [UIEventsCode.NumpadMultiply, KeyEvent.KEYCODE_NUMPAD_MULTIPLY],\r\n [UIEventsCode.NumpadParenLeft, KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN],\r\n [UIEventsCode.NumpadParenRight, KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN],\r\n [UIEventsCode.NumpadSubtract, KeyEvent.KEYCODE_NUMPAD_SUBTRACT],\r\n\r\n [UIEventsCode.Escape, KeyEvent.KEYCODE_ESCAPE],\r\n [UIEventsCode.F1, KeyEvent.KEYCODE_F1],\r\n [UIEventsCode.F2, KeyEvent.KEYCODE_F2],\r\n [UIEventsCode.F3, KeyEvent.KEYCODE_F3],\r\n [UIEventsCode.F4, KeyEvent.KEYCODE_F4],\r\n [UIEventsCode.F5, KeyEvent.KEYCODE_F5],\r\n [UIEventsCode.F6, KeyEvent.KEYCODE_F6],\r\n [UIEventsCode.F7, KeyEvent.KEYCODE_F7],\r\n [UIEventsCode.F8, KeyEvent.KEYCODE_F8],\r\n [UIEventsCode.F9, KeyEvent.KEYCODE_F9],\r\n [UIEventsCode.F10, KeyEvent.KEYCODE_F10],\r\n [UIEventsCode.F11, KeyEvent.KEYCODE_F11],\r\n [UIEventsCode.F12, KeyEvent.KEYCODE_F12],\r\n [UIEventsCode.Fn, KeyEvent.KEYCODE_FUNCTION],\r\n [UIEventsCode.PrintScreen, KeyEvent.KEYCODE_SYSRQ],\r\n [UIEventsCode.Pause, KeyEvent.KEYCODE_BREAK],\r\n]);\r\n\r\n","import { KeyCodeControlMessage } from '../messages/KeyCodeControlMessage';\r\nimport KeyEvent from './KeyEvent';\r\nimport { KeyToCodeMap } from './KeyToCodeMap';\r\n\r\nexport interface KeyEventListener {\r\n onKeyEvent: (event: KeyCodeControlMessage) => void;\r\n}\r\n\r\nexport class KeyInputHandler {\r\n private static readonly repeatCounter: Map<number, number> = new Map();\r\n private static readonly listeners: Set<KeyEventListener> = new Set();\r\n private static handler = (event: Event): void => {\r\n const target = event.target;\r\n if (\r\n target instanceof HTMLElement &&\r\n (target.tagName === 'INPUT' ||\r\n target.tagName === 'TEXTAREA' ||\r\n target.tagName === 'SELECT' ||\r\n target.isContentEditable)\r\n ) {\r\n return;\r\n }\r\n const keyboardEvent = event as KeyboardEvent;\r\n const keyCode = KeyToCodeMap.get(keyboardEvent.code);\r\n if (!keyCode) {\r\n return;\r\n }\r\n let action: typeof KeyEvent.ACTION_DOWN | typeof KeyEvent.ACTION_DOWN;\r\n let repeatCount = 0;\r\n if (keyboardEvent.type === 'keydown') {\r\n action = KeyEvent.ACTION_DOWN;\r\n if (keyboardEvent.repeat) {\r\n let count = KeyInputHandler.repeatCounter.get(keyCode);\r\n if (typeof count !== 'number') {\r\n count = 1;\r\n } else {\r\n count++;\r\n }\r\n repeatCount = count;\r\n KeyInputHandler.repeatCounter.set(keyCode, count);\r\n }\r\n } else if (keyboardEvent.type === 'keyup') {\r\n action = KeyEvent.ACTION_UP;\r\n KeyInputHandler.repeatCounter.delete(keyCode);\r\n } else {\r\n return;\r\n }\r\n const metaState =\r\n (keyboardEvent.getModifierState('Alt') ? KeyEvent.META_ALT_ON : 0) |\r\n (keyboardEvent.getModifierState('Shift') ? KeyEvent.META_SHIFT_ON : 0) |\r\n (keyboardEvent.getModifierState('Control') ? KeyEvent.META_CTRL_ON : 0) |\r\n (keyboardEvent.getModifierState('Meta') ? KeyEvent.META_META_ON : 0) |\r\n (keyboardEvent.getModifierState('CapsLock') ? KeyEvent.META_CAPS_LOCK_ON : 0) |\r\n (keyboardEvent.getModifierState('ScrollLock') ? KeyEvent.META_SCROLL_LOCK_ON : 0) |\r\n (keyboardEvent.getModifierState('NumLock') ? KeyEvent.META_NUM_LOCK_ON : 0);\r\n\r\n const controlMessage: KeyCodeControlMessage = new KeyCodeControlMessage(\r\n action,\r\n keyCode,\r\n repeatCount,\r\n metaState,\r\n );\r\n KeyInputHandler.listeners.forEach((listener) => {\r\n listener.onKeyEvent(controlMessage);\r\n });\r\n event.preventDefault();\r\n };\r\n private static attachListeners(): void {\r\n document.body.addEventListener('keydown', this.handler);\r\n document.body.addEventListener('keyup', this.handler);\r\n }\r\n private static detachListeners(): void {\r\n document.body.removeEventListener('keydown', this.handler);\r\n document.body.removeEventListener('keyup', this.handler);\r\n }\r\n public static addEventListener(listener: KeyEventListener): void {\r\n if (!this.listeners.size) {\r\n this.attachListeners();\r\n }\r\n this.listeners.add(listener);\r\n }\r\n public static removeEventListener(listener: KeyEventListener): void {\r\n this.listeners.delete(listener);\r\n if (!this.listeners.size) {\r\n this.detachListeners();\r\n }\r\n }\r\n}\r\n\r\n","interface RectInterface {\r\n left: number;\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n}\r\n\r\nexport default class Rect {\r\n constructor(readonly left: number, readonly top: number, readonly right: number, readonly bottom: number) {\r\n this.left = left;\r\n this.top = top;\r\n this.right = right;\r\n this.bottom = bottom;\r\n }\r\n public static equals(a?: Rect | null, b?: Rect | null): boolean {\r\n if (!a && !b) {\r\n return true;\r\n }\r\n return !!a && !!b && a.equals(b);\r\n }\r\n public static copy(a?: Rect | null): Rect | null {\r\n if (!a) {\r\n return null;\r\n }\r\n return new Rect(a.left, a.top, a.right, a.bottom);\r\n }\r\n public equals(o: Rect | null): boolean {\r\n if (this === o) {\r\n return true;\r\n }\r\n if (!o) {\r\n return false;\r\n }\r\n return this.left === o.left && this.top === o.top && this.right === o.right && this.bottom === o.bottom;\r\n }\r\n\r\n public getWidth(): number {\r\n return this.right - this.left;\r\n }\r\n\r\n public getHeight(): number {\r\n return this.bottom - this.top;\r\n }\r\n\r\n public toString(): string {\r\n // prettier-ignore\r\n return `Rect{left=${\r\n this.left}, top=${\r\n this.top}, right=${\r\n this.right}, bottom=${\r\n this.bottom}}`;\r\n }\r\n\r\n public toJSON(): RectInterface {\r\n return {\r\n left: this.left,\r\n right: this.right,\r\n top: this.top,\r\n bottom: this.bottom,\r\n };\r\n }\r\n}\r\n\r\n","import Rect from './Rect';\r\nimport Size from './Size';\r\n\r\nexport default class ScreenInfo {\r\n public static readonly BUFFER_LENGTH: number = 25;\r\n constructor(readonly contentRect: Rect, readonly videoSize: Size, readonly deviceRotation: number) {}\r\n\r\n public static fromBuffer(buffer: Buffer): ScreenInfo {\r\n const left = buffer.readInt32BE(0);\r\n const top = buffer.readInt32BE(4);\r\n const right = buffer.readInt32BE(8);\r\n const bottom = buffer.readInt32BE(12);\r\n const width = buffer.readInt32BE(16);\r\n const height = buffer.readInt32BE(20);\r\n const deviceRotation = buffer.readUInt8(24);\r\n return new ScreenInfo(new Rect(left, top, right, bottom), new Size(width, height), deviceRotation);\r\n }\r\n\r\n public equals(o?: ScreenInfo | null): boolean {\r\n if (!o) {\r\n return false;\r\n }\r\n return (\r\n this.contentRect.equals(o.contentRect) &&\r\n this.videoSize.equals(o.videoSize) &&\r\n this.deviceRotation === o.deviceRotation\r\n );\r\n }\r\n\r\n public toString(): string {\r\n return `ScreenInfo{contentRect=${this.contentRect}, videoSize=${this.videoSize}, deviceRotation=${this.deviceRotation}}`;\r\n }\r\n}\r\n\r\n"],"names":["buffer","Buffer","TAG","pointerId","FilePushState"],"mappings":"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"}
|