mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-03 16:00:25 +08:00
148 lines
3.9 KiB
JavaScript
148 lines
3.9 KiB
JavaScript
import Guacamole from './guacamole-common';
|
|
import { ElMessage } from 'element-plus';
|
|
|
|
const clipboard = {};
|
|
|
|
clipboard.install = (client) => {
|
|
if (!navigator.clipboard) {
|
|
return false;
|
|
}
|
|
|
|
clipboard.getLocalClipboard().then((data) => (clipboard.cache = data));
|
|
|
|
window.addEventListener('load', clipboard.update(client), true);
|
|
window.addEventListener('copy', clipboard.update(client));
|
|
window.addEventListener('cut', clipboard.update(client));
|
|
window.addEventListener(
|
|
'focus',
|
|
(e) => {
|
|
if (e.target === window) {
|
|
clipboard.update(client)();
|
|
}
|
|
},
|
|
true
|
|
);
|
|
|
|
return true;
|
|
};
|
|
|
|
clipboard.update = (client) => {
|
|
return () => {
|
|
clipboard.getLocalClipboard().then((data) => {
|
|
clipboard.cache = data;
|
|
clipboard.setRemoteClipboard(client);
|
|
});
|
|
};
|
|
};
|
|
|
|
clipboard.sendRemoteClipboard = (client, text) => {
|
|
clipboard.cache = {
|
|
type: 'text/plain',
|
|
data: text,
|
|
};
|
|
|
|
clipboard.setRemoteClipboard(client);
|
|
};
|
|
|
|
clipboard.setRemoteClipboard = (client) => {
|
|
if (!clipboard.cache) {
|
|
return;
|
|
}
|
|
|
|
let writer;
|
|
|
|
const stream = client.createClipboardStream(clipboard.cache.type);
|
|
|
|
if (typeof clipboard.cache.data === 'string') {
|
|
writer = new Guacamole.StringWriter(stream);
|
|
writer.sendText(clipboard.cache.data);
|
|
writer.sendEnd();
|
|
|
|
clipboard.appendClipboardList('up', clipboard.cache.data);
|
|
} else {
|
|
writer = new Guacamole.BlobWriter(stream);
|
|
writer.oncomplete = function clipboardSent() {
|
|
writer.sendEnd();
|
|
};
|
|
writer.sendBlob(clipboard.cache.data);
|
|
}
|
|
};
|
|
|
|
clipboard.getLocalClipboard = async () => {
|
|
// 获取本地剪贴板数据
|
|
if (navigator.clipboard && navigator.clipboard.readText) {
|
|
const text = await navigator.clipboard.readText();
|
|
return {
|
|
type: 'text/plain',
|
|
data: text,
|
|
};
|
|
} else {
|
|
ElMessage.warning('只有https才可以访问剪贴板');
|
|
}
|
|
};
|
|
|
|
clipboard.setLocalClipboard = async (data) => {
|
|
if (data.type === 'text/plain') {
|
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
await navigator.clipboard.writeText(data.data);
|
|
}
|
|
}
|
|
};
|
|
|
|
// 获取到远程服务器剪贴板变动
|
|
clipboard.onClipboard = (stream, mimetype) => {
|
|
let reader;
|
|
|
|
if (/^text\//.exec(mimetype)) {
|
|
reader = new Guacamole.StringReader(stream);
|
|
|
|
// Assemble received data into a single string
|
|
let data = '';
|
|
reader.ontext = (text) => {
|
|
data += text;
|
|
};
|
|
|
|
// Set clipboard contents once stream is finished
|
|
reader.onend = () => {
|
|
clipboard.setLocalClipboard({
|
|
type: mimetype,
|
|
data: data,
|
|
});
|
|
|
|
clipboard.setClipboardFn && typeof clipboard.setClipboardFn === 'function' && clipboard.setClipboardFn(data);
|
|
|
|
clipboard.appendClipboardList('down', data);
|
|
};
|
|
} else {
|
|
reader = new Guacamole.BlobReader(stream, mimetype);
|
|
reader.onend = () => {
|
|
clipboard.setLocalClipboard({
|
|
type: mimetype,
|
|
data: reader.getBlob(),
|
|
});
|
|
};
|
|
}
|
|
};
|
|
|
|
/***
|
|
* 注册剪贴板监听器,如果有本地或远程剪贴板变动,则会更新剪贴板列表
|
|
*/
|
|
clipboard.installWatcher = (clipboardList, setClipboardFn) => {
|
|
clipboard.clipboardList = clipboardList;
|
|
clipboard.setClipboardFn = setClipboardFn;
|
|
};
|
|
|
|
clipboard.appendClipboardList = (src, data) => {
|
|
clipboard.clipboardList = clipboard.clipboardList || [];
|
|
// 循环判断是否重复
|
|
for (let i = 0; i < clipboard.clipboardList.length; i++) {
|
|
if (clipboard.clipboardList[i].data === data) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
clipboard.clipboardList.push({ type: 'text/plain', data, src });
|
|
};
|
|
|
|
export default clipboard;
|