@omg-dev/protocol 0.6.210 → 0.6.212
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.
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Clipboard behavior shared by every RFB viewer. Text stays in this connection. */
|
|
2
|
+
export interface ClipboardRfb extends EventTarget {
|
|
3
|
+
viewOnly: boolean;
|
|
4
|
+
sendKey(keysym: number, code: string | null, down?: boolean): void;
|
|
5
|
+
clipboardPasteFrom(text: string): void;
|
|
6
|
+
}
|
|
7
|
+
export interface ComputerClipboardOptions {
|
|
8
|
+
notice(message: string): void;
|
|
9
|
+
focusKeyboard(): void;
|
|
10
|
+
takeControl?(): void;
|
|
11
|
+
readText?(): Promise<string>;
|
|
12
|
+
writeText?(text: Promise<string>): Promise<void>;
|
|
13
|
+
readRemoteText?(): Promise<string>;
|
|
14
|
+
setRemoteText?(text: string): Promise<void>;
|
|
15
|
+
copyTimeoutMs?: number;
|
|
16
|
+
}
|
|
17
|
+
/** Call write during the gesture, before waiting for the remote clipboard (Safari). */
|
|
18
|
+
export declare function writeBrowserClipboard(text: Promise<string>): Promise<void>;
|
|
19
|
+
export declare function attachComputerClipboard(rfb: ClipboardRfb, root: HTMLElement, options: ComputerClipboardOptions): {
|
|
20
|
+
copy: (cut?: boolean, shift?: boolean) => Promise<void>;
|
|
21
|
+
paste: (text: string, shift?: boolean) => Promise<boolean>;
|
|
22
|
+
pasteFromDevice: () => Promise<void>;
|
|
23
|
+
dispose(): void;
|
|
24
|
+
};
|
|
25
|
+
export type ComputerClipboard = ReturnType<typeof attachComputerClipboard>;
|
|
26
|
+
export declare function clipboardButtonHandlers(action: () => void): {
|
|
27
|
+
onPointerDown(event: {
|
|
28
|
+
preventDefault(): void;
|
|
29
|
+
currentTarget: EventTarget;
|
|
30
|
+
pointerType?: string;
|
|
31
|
+
}): void;
|
|
32
|
+
onPointerUp(event: {
|
|
33
|
+
preventDefault(): void;
|
|
34
|
+
currentTarget: EventTarget;
|
|
35
|
+
pointerType?: string;
|
|
36
|
+
}): void;
|
|
37
|
+
onClick(event: {
|
|
38
|
+
currentTarget: EventTarget;
|
|
39
|
+
detail?: number;
|
|
40
|
+
}): void;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=computer-clipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computer-clipboard.d.ts","sourceRoot":"","sources":["../src/computer-clipboard.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,IAAI,IAAI,CAAC;IACtB,WAAW,CAAC,IAAI,IAAI,CAAC;IACrB,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,cAAc,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1E;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,wBAAwB;8CA2C5D,OAAO,CAAC,IAAI,CAAC;kBAyBnC,MAAM,sBAAkB,OAAO,CAAC,OAAO,CAAC;2BA0BjC,OAAO,CAAC,IAAI,CAAC;;EA4DhD;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAK3E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,IAAI;IAEtD,aAAa,QAAQ;QAAE,cAAc,IAAI,IAAI,CAAC;QAAC,aAAa,EAAE,WAAW,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAMjG,WAAW,QAAQ;QAAE,cAAc,IAAI,IAAI,CAAC;QAAC,aAAa,EAAE,WAAW,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAQ/F,OAAO,QAAQ;QAAE,aAAa,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;EAOjE"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
function isMissingClipboardRoute(error) {
|
|
2
|
+
if (!error || typeof error !== "object")
|
|
3
|
+
return false;
|
|
4
|
+
const e = error;
|
|
5
|
+
return e.status === 404 || e.statusCode === 404 || /\b404\b/.test(e.message ?? "");
|
|
6
|
+
}
|
|
7
|
+
/** Call write during the gesture, before waiting for the remote clipboard (Safari). */
|
|
8
|
+
export function writeBrowserClipboard(text) {
|
|
9
|
+
if (typeof ClipboardItem !== "undefined" && navigator.clipboard?.write) {
|
|
10
|
+
return navigator.clipboard.write([new ClipboardItem({
|
|
11
|
+
"text/plain": text.then(value => new Blob([value], { type: "text/plain" })),
|
|
12
|
+
})]);
|
|
13
|
+
}
|
|
14
|
+
return text.then(value => navigator.clipboard.writeText(value));
|
|
15
|
+
}
|
|
16
|
+
export function attachComputerClipboard(rfb, root, options) {
|
|
17
|
+
let remote = null;
|
|
18
|
+
let disposed = false;
|
|
19
|
+
let devicePastePending = false;
|
|
20
|
+
const pending = new Set();
|
|
21
|
+
const control = () => { rfb.viewOnly = false; options.takeControl?.(); };
|
|
22
|
+
const shortcut = (key, shift = false) => {
|
|
23
|
+
control();
|
|
24
|
+
// A Mac's Command key may already have reached noVNC as Linux Super.
|
|
25
|
+
rfb.sendKey(0xffe7, "MetaLeft", false);
|
|
26
|
+
rfb.sendKey(0xffe8, "MetaRight", false);
|
|
27
|
+
rfb.sendKey(0xffeb, "MetaLeft", false);
|
|
28
|
+
rfb.sendKey(0xffec, "MetaRight", false);
|
|
29
|
+
rfb.sendKey(0xffe3, "ControlLeft", true);
|
|
30
|
+
if (shift)
|
|
31
|
+
rfb.sendKey(0xffe1, "ShiftLeft", true);
|
|
32
|
+
rfb.sendKey(key.charCodeAt(0), `Key${key.toUpperCase()}`, true);
|
|
33
|
+
rfb.sendKey(key.charCodeAt(0), `Key${key.toUpperCase()}`, false);
|
|
34
|
+
if (shift)
|
|
35
|
+
rfb.sendKey(0xffe1, "ShiftLeft", false);
|
|
36
|
+
rfb.sendKey(0xffe3, "ControlLeft", false);
|
|
37
|
+
};
|
|
38
|
+
const received = (event) => {
|
|
39
|
+
const text = event.detail?.text;
|
|
40
|
+
if (typeof text !== "string")
|
|
41
|
+
return;
|
|
42
|
+
remote = text;
|
|
43
|
+
for (const resolve of [...pending])
|
|
44
|
+
resolve(text);
|
|
45
|
+
};
|
|
46
|
+
rfb.addEventListener("clipboard", received);
|
|
47
|
+
function selection(cut = false, shift = false) {
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
const done = (text) => {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
pending.delete(done);
|
|
52
|
+
if (disposed)
|
|
53
|
+
reject(new Error("Not connected"));
|
|
54
|
+
else if (text || options.readRemoteText)
|
|
55
|
+
resolve(text ?? "");
|
|
56
|
+
else
|
|
57
|
+
reject(new Error("Select text on the Computer first"));
|
|
58
|
+
};
|
|
59
|
+
const timer = setTimeout(() => done(remote), options.copyTimeoutMs ?? 1000);
|
|
60
|
+
pending.add(done);
|
|
61
|
+
shortcut(cut ? "x" : "c", shift);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async function copy(cut = false, shift = false) {
|
|
65
|
+
if (disposed)
|
|
66
|
+
return;
|
|
67
|
+
const text = selection(cut, shift);
|
|
68
|
+
// A denied write must not leave a rejected selection promise unhandled.
|
|
69
|
+
void text.catch(() => { });
|
|
70
|
+
try {
|
|
71
|
+
const exactText = options.readRemoteText ? text.then(async (legacy) => {
|
|
72
|
+
try {
|
|
73
|
+
const exact = await options.readRemoteText();
|
|
74
|
+
if (!exact)
|
|
75
|
+
throw new Error("Select text on the Computer first");
|
|
76
|
+
return exact;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (isMissingClipboardRoute(error) && legacy)
|
|
80
|
+
return legacy;
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}) : text;
|
|
84
|
+
void exactText.catch(() => { });
|
|
85
|
+
await (options.writeText ?? writeBrowserClipboard)(exactText);
|
|
86
|
+
if (!disposed)
|
|
87
|
+
options.notice(cut ? "Cut and copied" : "Copied");
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (!disposed)
|
|
91
|
+
options.notice(error instanceof Error && /Select text|Not connected/.test(error.message)
|
|
92
|
+
? error.message : "Copy was blocked by this device");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function paste(text, shift = false) {
|
|
96
|
+
if (disposed)
|
|
97
|
+
return false;
|
|
98
|
+
if (!text) {
|
|
99
|
+
options.notice("Your clipboard is empty");
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
control();
|
|
103
|
+
try {
|
|
104
|
+
if (options.setRemoteText) {
|
|
105
|
+
try {
|
|
106
|
+
await options.setRemoteText(text);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (!isMissingClipboardRoute(error))
|
|
110
|
+
throw error;
|
|
111
|
+
if ([...text].some(ch => ch.codePointAt(0) > 255)) {
|
|
112
|
+
options.notice("Update this Computer to paste Unicode text");
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
rfb.clipboardPasteFrom(text);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else
|
|
119
|
+
rfb.clipboardPasteFrom(text);
|
|
120
|
+
if (disposed)
|
|
121
|
+
return false;
|
|
122
|
+
shortcut("v", shift);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
if (!disposed)
|
|
126
|
+
options.notice("Could not update the Computer clipboard");
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
options.notice("Pasted");
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
async function pasteFromDevice() {
|
|
133
|
+
if (disposed || devicePastePending)
|
|
134
|
+
return;
|
|
135
|
+
devicePastePending = true;
|
|
136
|
+
try {
|
|
137
|
+
const text = await (options.readText ?? (() => navigator.clipboard.readText()))();
|
|
138
|
+
if (!disposed)
|
|
139
|
+
await paste(text);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
if (disposed)
|
|
143
|
+
return;
|
|
144
|
+
options.focusKeyboard();
|
|
145
|
+
options.notice("Use the keyboard's Paste menu");
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
devicePastePending = false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const pasted = (event) => {
|
|
152
|
+
const e = event;
|
|
153
|
+
const text = e.clipboardData?.getData("text/plain") ?? "";
|
|
154
|
+
if (!text)
|
|
155
|
+
return;
|
|
156
|
+
e.preventDefault();
|
|
157
|
+
e.stopImmediatePropagation();
|
|
158
|
+
void paste(text);
|
|
159
|
+
// preventDefault keeps the keyboard pad intact and prevents duplicate input.
|
|
160
|
+
};
|
|
161
|
+
const copied = (event) => {
|
|
162
|
+
event.preventDefault();
|
|
163
|
+
event.stopImmediatePropagation();
|
|
164
|
+
void copy(event.type === "cut");
|
|
165
|
+
};
|
|
166
|
+
const keydown = (event) => {
|
|
167
|
+
const e = event;
|
|
168
|
+
if ((!e.ctrlKey && !e.metaKey) || e.altKey || e.isComposing)
|
|
169
|
+
return;
|
|
170
|
+
const key = e.key.toLowerCase();
|
|
171
|
+
if (key !== "c" && key !== "x" && key !== "v")
|
|
172
|
+
return;
|
|
173
|
+
e.stopImmediatePropagation();
|
|
174
|
+
if (key === "v" && !options.readText) {
|
|
175
|
+
// Let the OS deliver its paste event to a real editable field, even
|
|
176
|
+
// when readText is denied. Do not send Ctrl+V before the text arrives.
|
|
177
|
+
options.focusKeyboard();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
e.preventDefault();
|
|
181
|
+
if (key === "v")
|
|
182
|
+
void pasteFromDevice();
|
|
183
|
+
else
|
|
184
|
+
void copy(key === "x", e.shiftKey);
|
|
185
|
+
};
|
|
186
|
+
root.addEventListener("paste", pasted, true);
|
|
187
|
+
root.addEventListener("copy", copied, true);
|
|
188
|
+
root.addEventListener("cut", copied, true);
|
|
189
|
+
root.addEventListener("keydown", keydown, true);
|
|
190
|
+
return {
|
|
191
|
+
copy, paste, pasteFromDevice,
|
|
192
|
+
dispose() {
|
|
193
|
+
disposed = true;
|
|
194
|
+
remote = null;
|
|
195
|
+
for (const resolve of [...pending])
|
|
196
|
+
resolve(null);
|
|
197
|
+
rfb.removeEventListener("clipboard", received);
|
|
198
|
+
root.removeEventListener("paste", pasted, true);
|
|
199
|
+
root.removeEventListener("copy", copied, true);
|
|
200
|
+
root.removeEventListener("cut", copied, true);
|
|
201
|
+
root.removeEventListener("keydown", keydown, true);
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/** WebKit can swallow click after a cancelled mouse press. Act on the pointer
|
|
206
|
+
* gesture, retain input focus, and ignore its following compatibility click. */
|
|
207
|
+
const clipboardPresses = new WeakSet();
|
|
208
|
+
export function clipboardButtonHandlers(action) {
|
|
209
|
+
return {
|
|
210
|
+
onPointerDown(event) {
|
|
211
|
+
event.preventDefault();
|
|
212
|
+
if (event.pointerType === "touch" || event.pointerType === "pen")
|
|
213
|
+
return;
|
|
214
|
+
clipboardPresses.add(event.currentTarget);
|
|
215
|
+
action();
|
|
216
|
+
},
|
|
217
|
+
onPointerUp(event) {
|
|
218
|
+
if (event.pointerType !== "touch" && event.pointerType !== "pen")
|
|
219
|
+
return;
|
|
220
|
+
// Touch user activation begins at release; protected clipboard APIs
|
|
221
|
+
// must run here, rather than during the unactivated initial press.
|
|
222
|
+
event.preventDefault();
|
|
223
|
+
clipboardPresses.add(event.currentTarget);
|
|
224
|
+
action();
|
|
225
|
+
},
|
|
226
|
+
onClick(event) {
|
|
227
|
+
const pressed = clipboardPresses.has(event.currentTarget);
|
|
228
|
+
clipboardPresses.delete(event.currentTarget);
|
|
229
|
+
if (pressed && event.detail !== 0)
|
|
230
|
+
return;
|
|
231
|
+
action();
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=computer-clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computer-clipboard.js","sourceRoot":"","sources":["../src/computer-clipboard.ts"],"names":[],"mappings":"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"}
|