tabby-rdp 0.1.0 → 0.2.0
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/CHANGELOG.md +31 -0
- package/README.md +163 -100
- package/dist/audio.js +87 -0
- package/dist/audio.js.map +1 -0
- package/dist/deskScript.js +1 -1
- package/dist/desktop.service.js +169 -35
- package/dist/desktop.service.js.map +1 -1
- package/dist/fileTransfer.js +174 -0
- package/dist/fileTransfer.js.map +1 -0
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/keyboard.js +143 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/remoteSetup.js +18 -6
- package/dist/remoteSetup.js.map +1 -1
- package/dist/ssh.js +26 -2
- package/dist/ssh.js.map +1 -1
- package/dist/targets.js +6 -0
- package/dist/targets.js.map +1 -1
- package/dist/ui.js +19 -0
- package/dist/ui.js.map +1 -1
- package/package.json +18 -4
- package/vendor/IRONRDP-LICENSE +2 -2
- package/vendor/iron-remote-desktop-rdp.js +197 -193
- package/vendor/iron-remote-desktop.js +661 -651
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileTransfer = exports.STYLE = void 0;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const os = require("os");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
exports.STYLE = `
|
|
8
|
+
.trd-toast { position: absolute; top: 12px; right: 12px; z-index: 2; max-width: min(420px, calc(100% - 24px));
|
|
9
|
+
display: flex; gap: 10px; align-items: center; padding: 8px 10px; border-radius: 6px;
|
|
10
|
+
background: rgba(30, 30, 30, 0.92); color: #ddd; font-size: 12px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.4); }
|
|
11
|
+
.trd-toast-text { flex: auto; white-space: pre-line; }
|
|
12
|
+
.trd-toast .btn { flex: none; padding: 2px 8px; font-size: 12px; }
|
|
13
|
+
.trd-overlay.trd-drop-target::after { content: 'Drop to copy to the remote desktop, then paste there'; position: absolute; inset: 0;
|
|
14
|
+
display: flex; align-items: center; justify-content: center; background: rgba(40, 90, 160, 0.35); color: #fff; font-size: 15px;
|
|
15
|
+
pointer-events: none; }
|
|
16
|
+
`;
|
|
17
|
+
const plural = (n, one) => `${n} ${one}${n === 1 ? '' : 's'}`;
|
|
18
|
+
/**
|
|
19
|
+
* Files through the clipboard, with IronRDP's RdpFileTransferProvider: files dropped on the desktop (or
|
|
20
|
+
* picked) are offered on the remote clipboard, to paste there; files copied on the remote can be saved to
|
|
21
|
+
* the Mac's Downloads folder. Messages show as a small bar over the desktop.
|
|
22
|
+
*/
|
|
23
|
+
class FileTransfer {
|
|
24
|
+
constructor(rdp, overlay, log) {
|
|
25
|
+
this.overlay = overlay;
|
|
26
|
+
this.log = log;
|
|
27
|
+
this.toastEl = null;
|
|
28
|
+
/** Files the remote offered last (for tests: saveAll). */
|
|
29
|
+
this.offered = [];
|
|
30
|
+
/** Where the last save went (for tests and "Show in Finder"). */
|
|
31
|
+
this.lastSaved = [];
|
|
32
|
+
this.provider = new rdp.RdpFileTransferProvider({ storageBackend: 'blob' });
|
|
33
|
+
this.provider.on('files-available', (files) => this.offer(files));
|
|
34
|
+
this.provider.on('error', (e) => {
|
|
35
|
+
this.log(`files: ${e?.message ?? JSON.stringify(e)}`);
|
|
36
|
+
this.toast(`File transfer failed: ${e?.message ?? 'unknown error'}`);
|
|
37
|
+
});
|
|
38
|
+
// Drop files on the desktop to send them. Handled here so Tabby doesn't paste their paths into
|
|
39
|
+
// the console under the desktop.
|
|
40
|
+
overlay.addEventListener('dragover', event => {
|
|
41
|
+
if (event.dataTransfer?.types.includes('Files')) {
|
|
42
|
+
event.preventDefault();
|
|
43
|
+
event.stopPropagation();
|
|
44
|
+
overlay.classList.add('trd-drop-target');
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
overlay.addEventListener('dragleave', event => {
|
|
48
|
+
if (!overlay.contains(event.relatedTarget)) {
|
|
49
|
+
overlay.classList.remove('trd-drop-target');
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
overlay.addEventListener('drop', event => {
|
|
53
|
+
overlay.classList.remove('trd-drop-target');
|
|
54
|
+
if (!event.dataTransfer?.types.includes('Files')) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
event.preventDefault();
|
|
58
|
+
event.stopPropagation();
|
|
59
|
+
this.provider.handleDrop(event).then((dropped) => this.send(dropped), (e) => this.toast(`Couldn't read the dropped files: ${e?.message ?? e}`));
|
|
60
|
+
}, true);
|
|
61
|
+
}
|
|
62
|
+
/** Mac → remote: offers the files on the remote clipboard; the remote copies them when they're pasted. */
|
|
63
|
+
send(files) {
|
|
64
|
+
const count = files.filter(f => !f.isDirectory).length;
|
|
65
|
+
if (!count) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const upload = this.provider.uploadFiles(files);
|
|
70
|
+
this.log(`files: offered ${count} to the remote`);
|
|
71
|
+
this.toast(`${plural(count, 'file')} ready: paste on the remote desktop (⌘V) to copy ${count === 1 ? 'it' : 'them'} there`, [], 0);
|
|
72
|
+
upload.completion.then(() => { this.log('files: pasted on the remote'); this.toast(`Copied ${plural(count, 'file')} to the remote desktop`); }, (e) => { this.log(`files: upload: ${e?.message ?? e}`); this.toast(`Copying to the remote desktop failed: ${e?.message ?? e}`); });
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
this.toast(`Couldn't offer the files: ${e?.message ?? e}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Picks files on the Mac to send. */
|
|
79
|
+
async pickAndSend() {
|
|
80
|
+
const files = await this.provider.showFilePicker({ multiple: true });
|
|
81
|
+
this.send(files);
|
|
82
|
+
}
|
|
83
|
+
/** Remote → Mac: the remote copied files; offer saving them. */
|
|
84
|
+
offer(files) {
|
|
85
|
+
this.offered = files;
|
|
86
|
+
const count = files.filter(f => !f.isDirectory).length;
|
|
87
|
+
this.log(`files: the remote copied ${count}`);
|
|
88
|
+
if (count) {
|
|
89
|
+
this.toast(`${plural(count, 'file')} copied on the remote desktop`, [{ label: 'Save to Downloads', run: () => this.saveAll() }], 15000);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Downloads what the remote offered into a folder (default ~/Downloads), keeping their folder structure. */
|
|
93
|
+
async saveAll(dir = path.join(os.homedir(), 'Downloads')) {
|
|
94
|
+
const files = this.offered;
|
|
95
|
+
const saved = [];
|
|
96
|
+
this.toast(`Saving ${plural(files.filter(f => !f.isDirectory).length, 'file')}…`, [], 0);
|
|
97
|
+
try {
|
|
98
|
+
for (const [index, file] of files.entries()) {
|
|
99
|
+
// Relative paths use `\` (the wire convention); never let one leave the target folder.
|
|
100
|
+
const parts = [...(file.path ?? '').split('\\'), file.name].filter(p => p && p !== '.' && p !== '..');
|
|
101
|
+
if (file.isDirectory) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const blob = await this.provider.downloadFile(file, index).completion;
|
|
105
|
+
const target = uniquePath(path.join(dir, ...parts));
|
|
106
|
+
await fs.promises.mkdir(path.dirname(target), { recursive: true });
|
|
107
|
+
await fs.promises.writeFile(target, Buffer.from(await blob.arrayBuffer()));
|
|
108
|
+
saved.push(target);
|
|
109
|
+
}
|
|
110
|
+
this.lastSaved = saved;
|
|
111
|
+
this.log(`files: saved ${saved.length}`);
|
|
112
|
+
this.toast(`Saved ${plural(saved.length, 'file')} to ${path.basename(dir)}`, saved.length ? [{
|
|
113
|
+
label: 'Show in Finder',
|
|
114
|
+
run: () => require('electron').shell.showItemInFolder(saved[0]),
|
|
115
|
+
}] : []);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
this.log(`files: save: ${e?.message ?? e}`);
|
|
119
|
+
this.toast(`Saving failed: ${e?.message ?? e}`);
|
|
120
|
+
}
|
|
121
|
+
return saved;
|
|
122
|
+
}
|
|
123
|
+
/** A message over the desktop; hides after `hideAfter` ms (0: stays until replaced). */
|
|
124
|
+
toast(text, actions = [], hideAfter = 6000) {
|
|
125
|
+
clearTimeout(this.toastTimer);
|
|
126
|
+
this.toastEl?.remove();
|
|
127
|
+
const el = document.createElement('div');
|
|
128
|
+
el.className = 'trd-toast';
|
|
129
|
+
const label = document.createElement('div');
|
|
130
|
+
label.className = 'trd-toast-text';
|
|
131
|
+
label.textContent = text;
|
|
132
|
+
el.append(label, ...actions.map(action => {
|
|
133
|
+
const button = document.createElement('button');
|
|
134
|
+
button.className = 'btn btn-primary';
|
|
135
|
+
button.textContent = action.label;
|
|
136
|
+
button.addEventListener('click', () => action.run());
|
|
137
|
+
return button;
|
|
138
|
+
}));
|
|
139
|
+
const close = document.createElement('button');
|
|
140
|
+
close.className = 'btn btn-link';
|
|
141
|
+
close.textContent = '×';
|
|
142
|
+
close.title = 'Dismiss';
|
|
143
|
+
close.addEventListener('click', () => el.remove());
|
|
144
|
+
el.append(close);
|
|
145
|
+
this.overlay.appendChild(el);
|
|
146
|
+
this.toastEl = el;
|
|
147
|
+
if (hideAfter) {
|
|
148
|
+
this.toastTimer = setTimeout(() => el.remove(), hideAfter);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
dispose() {
|
|
152
|
+
clearTimeout(this.toastTimer);
|
|
153
|
+
this.toastEl?.remove();
|
|
154
|
+
try {
|
|
155
|
+
this.provider.dispose();
|
|
156
|
+
}
|
|
157
|
+
catch { }
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.FileTransfer = FileTransfer;
|
|
161
|
+
/** `file.txt`, or `file 2.txt`, `file 3.txt`… if taken. */
|
|
162
|
+
function uniquePath(target) {
|
|
163
|
+
if (!fs.existsSync(target)) {
|
|
164
|
+
return target;
|
|
165
|
+
}
|
|
166
|
+
const { dir, name, ext } = path.parse(target);
|
|
167
|
+
for (let n = 2;; n++) {
|
|
168
|
+
const candidate = path.join(dir, `${name} ${n}${ext}`);
|
|
169
|
+
if (!fs.existsSync(candidate)) {
|
|
170
|
+
return candidate;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=fileTransfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileTransfer.js","sourceRoot":"","sources":["../src/fileTransfer.ts"],"names":[],"mappings":";;;AAAA,yBAAwB;AACxB,yBAAwB;AACxB,6BAA4B;AAUf,QAAA,KAAK,GAAG;;;;;;;;;CASpB,CAAA;AAED,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;AAE7E;;;;GAIG;AACH,MAAa,YAAY;IASrB,YAAa,GAAQ,EAAU,OAAoB,EAAU,GAA0B;QAAxD,YAAO,GAAP,OAAO,CAAa;QAAU,QAAG,GAAH,GAAG,CAAuB;QAP/E,YAAO,GAAuB,IAAI,CAAA;QAE1C,0DAA0D;QAC1D,YAAO,GAAiB,EAAE,CAAA;QAC1B,iEAAiE;QACjE,cAAS,GAAa,EAAE,CAAA;QAGpB,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,uBAAuB,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3E,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/E,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAM,EAAE,EAAE;YACjC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACrD,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAA;QACxE,CAAC,CAAC,CAAA;QAEF,+FAA+F;QAC/F,iCAAiC;QACjC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;YACzC,IAAI,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,KAAK,CAAC,cAAc,EAAE,CAAA;gBACtB,KAAK,CAAC,eAAe,EAAE,CAAA;gBACvB,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;YAC5C,CAAC;QACL,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE;YAC1C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAqB,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;YAC/C,CAAC;QACL,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;YACrC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;YAC3C,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,OAAM;YACV,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAA;YACtB,KAAK,CAAC,eAAe,EAAE,CAAA;YACvB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,OAAc,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QAC/J,CAAC,EAAE,IAAI,CAAC,CAAA;IACZ,CAAC;IAED,0GAA0G;IAC1G,IAAI,CAAE,KAAY;QACd,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAA;QACtD,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAM;QACV,CAAC;QACD,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YAC/C,IAAI,CAAC,GAAG,CAAC,kBAAkB,KAAK,gBAAgB,CAAC,CAAA;YACjD,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,oDAAoD,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAClI,MAAM,CAAC,UAAU,CAAC,IAAI,CAClB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,wBAAwB,CAAC,CAAA,CAAC,CAAC,EACtH,CAAC,CAAM,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,CACxI,CAAA;QACL,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAA;QAC9D,CAAC;IACL,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,WAAW;QACb,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QACpE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;IAED,gEAAgE;IACxD,KAAK,CAAE,KAAmB;QAC9B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAA;QACtD,IAAI,CAAC,GAAG,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAA;QAC7C,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,+BAA+B,EAAE,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;QAC3I,CAAC;IACL,CAAC;IAED,6GAA6G;IAC7G,KAAK,CAAC,OAAO,CAAE,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAA;QAC1B,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACxF,IAAI,CAAC;YACD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1C,uFAAuF;gBACvF,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;gBACrG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACnB,SAAQ;gBACZ,CAAC;gBACD,MAAM,IAAI,GAAS,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,UAAU,CAAA;gBAC3E,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAA;gBACnD,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;gBAClE,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;gBAC1E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACtB,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;YACtB,IAAI,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;YACxC,IAAI,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACzF,KAAK,EAAE,gBAAgB;oBACvB,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBAClE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACZ,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAA;YAC3C,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,CAAA;QACnD,CAAC;QACD,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,wFAAwF;IAChF,KAAK,CAAE,IAAY,EAAE,UAAgD,EAAE,EAAE,SAAS,GAAG,IAAI;QAC7F,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;QACtB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QACxC,EAAE,CAAC,SAAS,GAAG,WAAW,CAAA;QAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC3C,KAAK,CAAC,SAAS,GAAG,gBAAgB,CAAA;QAClC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAA;QACxB,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;YAC/C,MAAM,CAAC,SAAS,GAAG,iBAAiB,CAAA;YACpC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAA;YACjC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;YACpD,OAAO,MAAM,CAAA;QACjB,CAAC,CAAC,CAAC,CAAA;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC9C,KAAK,CAAC,SAAS,GAAG,cAAc,CAAA;QAChC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAA;QACvB,KAAK,CAAC,KAAK,GAAG,SAAS,CAAA;QACvB,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;QAClD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAChB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;QACjB,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAA;QAC9D,CAAC;IACL,CAAC;IAED,OAAO;QACH,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;QACtB,IAAI,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;CACJ;AA9ID,oCA8IC;AAED,2DAA2D;AAC3D,SAAS,UAAU,CAAE,MAAc;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,CAAA;IACjB,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAA;QACpB,CAAC;IACL,CAAC;AACL,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -15,13 +15,15 @@ const tabby_terminal_1 = require("tabby-terminal");
|
|
|
15
15
|
const desktop_service_1 = require("./desktop.service");
|
|
16
16
|
const desk_1 = require("./desk");
|
|
17
17
|
const header_1 = require("./header");
|
|
18
|
+
const keyboard_1 = require("./keyboard");
|
|
18
19
|
const ssh_1 = require("./ssh");
|
|
19
20
|
const targets_1 = require("./targets");
|
|
20
21
|
const ui_1 = require("./ui");
|
|
21
22
|
let RemoteDesktopModule = class RemoteDesktopModule {
|
|
22
|
-
constructor(app, hotkeys, desktop, header, targets, injector) {
|
|
23
|
+
constructor(app, hotkeys, desktop, header, targets, keyboard, injector) {
|
|
23
24
|
(0, desktop_service_1.installStyle)();
|
|
24
25
|
header.install();
|
|
26
|
+
keyboard.install(ui_1.TOGGLE_HOTKEY);
|
|
25
27
|
hotkeys.hotkey$.subscribe((id) => {
|
|
26
28
|
if (id !== ui_1.TOGGLE_HOTKEY) {
|
|
27
29
|
return;
|
|
@@ -46,7 +48,7 @@ RemoteDesktopModule = __decorate([
|
|
|
46
48
|
{ provide: tabby_terminal_1.TerminalDecorator, useClass: desk_1.DeskTriggerDecorator, multi: true },
|
|
47
49
|
],
|
|
48
50
|
}),
|
|
49
|
-
__metadata("design:paramtypes", [tabby_core_1.AppService, tabby_core_1.HotkeysService, desktop_service_1.RemoteDesktopService, header_1.HeaderControls, targets_1.RemoteTargets, core_1.Injector])
|
|
51
|
+
__metadata("design:paramtypes", [tabby_core_1.AppService, tabby_core_1.HotkeysService, desktop_service_1.RemoteDesktopService, header_1.HeaderControls, targets_1.RemoteTargets, keyboard_1.DesktopKeyboard, core_1.Injector])
|
|
50
52
|
], RemoteDesktopModule);
|
|
51
53
|
exports.default = RemoteDesktopModule;
|
|
52
54
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,wCAAkD;AAClD,2CAAmH;AACnH,mDAAkD;AAClD,uDAAsE;AACtE,iCAA6C;AAC7C,qCAAyC;AACzC,+BAAkC;AAClC,uCAAwD;AACxD,6BAEa;AAWE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACpC,YAAa,GAAe,EAAE,OAAuB,EAAE,OAA6B,EAAE,MAAsB,EAAE,OAAsB,EAAE,QAAkB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,wCAAkD;AAClD,2CAAmH;AACnH,mDAAkD;AAClD,uDAAsE;AACtE,iCAA6C;AAC7C,qCAAyC;AACzC,yCAA4C;AAC5C,+BAAkC;AAClC,uCAAwD;AACxD,6BAEa;AAWE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACpC,YAAa,GAAe,EAAE,OAAuB,EAAE,OAA6B,EAAE,MAAsB,EAAE,OAAsB,EAAE,QAAyB,EAAE,QAAkB;QAC/K,IAAA,8BAAY,GAAE,CAAA;QACd,MAAM,CAAC,OAAO,EAAE,CAAA;QAChB,QAAQ,CAAC,OAAO,CAAC,kBAAa,CAAC,CAAA;QAC/B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAU,EAAE,EAAE;YACrC,IAAI,EAAE,KAAK,kBAAa,EAAE,CAAC;gBACvB,OAAM;YACV,CAAC;YACD,MAAM,IAAI,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACzC,IAAI,IAAI,EAAE,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACxB,CAAC;QACL,CAAC,CAAC,CAAA;QACF,sDAAsD;QACtD,MAAM,CAAC,GAAG,MAAa,CAAA;QACvB,CAAC,CAAC,eAAe,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAb,uBAAa,EAAE,QAAQ,EAAE,UAAU,EAAV,gBAAU,EAAE,CAAA;IACtF,CAAC;CACJ,CAAA;AAlBoB,mBAAmB;IATvC,IAAA,eAAQ,EAAC;QACN,SAAS,EAAE;YACP,EAAE,OAAO,EAAE,2BAAc,EAAE,QAAQ,EAAE,yBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE;YACxE,EAAE,OAAO,EAAE,2BAAc,EAAE,QAAQ,EAAE,wBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE;YACvE,EAAE,OAAO,EAAE,uCAA0B,EAAE,QAAQ,EAAE,6BAAwB,EAAE,KAAK,EAAE,IAAI,EAAE;YACxF,EAAE,OAAO,EAAE,kCAAiB,EAAE,QAAQ,EAAE,+BAA0B,EAAE,KAAK,EAAE,IAAI,EAAE;YACjF,EAAE,OAAO,EAAE,kCAAiB,EAAE,QAAQ,EAAE,2BAAoB,EAAE,KAAK,EAAE,IAAI,EAAE;SAC9E;KACJ,CAAC;qCAEoB,uBAAU,EAAW,2BAAc,EAAW,sCAAoB,EAAU,uBAAc,EAAW,uBAAa,EAAY,0BAAe,EAAY,eAAQ;GADlK,mBAAmB,CAkBvC;kBAlBoB,mBAAmB"}
|
package/dist/keyboard.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DesktopKeyboard = void 0;
|
|
13
|
+
const core_1 = require("@angular/core");
|
|
14
|
+
const tabby_core_1 = require("tabby-core");
|
|
15
|
+
const desktop_service_1 = require("./desktop.service");
|
|
16
|
+
const targets_1 = require("./targets");
|
|
17
|
+
/**
|
|
18
|
+
* Tabby shortcuts that keep working while a desktop covers the pane: getting back to the console, and moving
|
|
19
|
+
* between tabs. Everything else (⌘W, ⌘T, ⌘V paste, …) belongs to the remote desktop then; Tabby would otherwise
|
|
20
|
+
* act on the terminal underneath (⌘V pasted the Mac clipboard into the hidden SSH console).
|
|
21
|
+
*/
|
|
22
|
+
/** Modifier and lock keys: macOS does send their keyups, and they must stay down until then. */
|
|
23
|
+
const MODIFIERS = /^(Shift|Control|Alt|Meta|OS)(Left|Right)$|^(CapsLock|Fn|FnLock|NumLock|ScrollLock)$/;
|
|
24
|
+
const TABBY_SHORTCUTS = new Set(['next-tab', 'previous-tab', 'next-mru-tab', 'previous-mru-tab', 'toggle-last-tab', 'toggle-fullscreen']);
|
|
25
|
+
/**
|
|
26
|
+
* Routes the keyboard while a remote desktop has it:
|
|
27
|
+
* - Tabby's hotkeys: only the desktop/console switch and TABBY_SHORTCUTS fire, and those don't reach the remote.
|
|
28
|
+
* - Mac shortcuts (setting, on by default): ⌘ is sent as Ctrl, so ⌘C/⌘V/⌘Z/… do what they do on a Mac, and
|
|
29
|
+
* tapping ⌘ on its own is the Windows/Super key (Start, Activities). Off: ⌘ is the Windows/Super key.
|
|
30
|
+
* - macOS sends no keyup for a key pressed while ⌘ is down; the remote gets one right after the keydown, so
|
|
31
|
+
* the key doesn't stay pressed there.
|
|
32
|
+
*/
|
|
33
|
+
let DesktopKeyboard = class DesktopKeyboard {
|
|
34
|
+
constructor(app, hotkeys, desktop, zone) {
|
|
35
|
+
this.app = app;
|
|
36
|
+
this.hotkeys = hotkeys;
|
|
37
|
+
this.desktop = desktop;
|
|
38
|
+
this.zone = zone;
|
|
39
|
+
/** The copies handed to IronRDP (they pass this module's window listener too). */
|
|
40
|
+
this.copies = new WeakSet();
|
|
41
|
+
/** The pane a key event started on: a Tabby shortcut (⌘1) can switch tabs before this module sees it. */
|
|
42
|
+
this.startedOn = new WeakMap();
|
|
43
|
+
/** ⌘ is down and nothing else was pressed with it (a tap sends the Windows key). */
|
|
44
|
+
this.metaAlone = false;
|
|
45
|
+
}
|
|
46
|
+
install(toggleHotkey) {
|
|
47
|
+
// Tabby matches hotkeys in a document listener; filter what it may match while a desktop covers the pane.
|
|
48
|
+
const hotkeys = this.hotkeys;
|
|
49
|
+
const match = hotkeys.matchActiveHotkey?.bind(hotkeys);
|
|
50
|
+
if (typeof match === 'function') {
|
|
51
|
+
hotkeys.matchActiveHotkey = (partial) => {
|
|
52
|
+
const id = match(partial);
|
|
53
|
+
if (id && this.coveredPane() && id !== toggleHotkey && !TABBY_SHORTCUTS.has(id) && !/^tab-\d+$/.test(id)) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return id;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// On window: after Tabby's hotkey listener (on document, registered once Tabby's config has loaded,
|
|
60
|
+
// which can be after this) and, registered at startup, before IronRDP's (window, per desktop).
|
|
61
|
+
this.zone.runOutsideAngular(() => {
|
|
62
|
+
for (const type of ['keydown', 'keyup']) {
|
|
63
|
+
window.addEventListener(type, event => this.startedOn.set(event, this.coveredPane()), true);
|
|
64
|
+
window.addEventListener(type, event => this.copies.has(event) || this.route(event));
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/** The active pane, while a desktop (or its sign-in or add form) covers it. */
|
|
69
|
+
coveredPane() {
|
|
70
|
+
const pane = (0, targets_1.desktopPaneOf)(this.app.activeTab);
|
|
71
|
+
if (!pane) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return this.desktop.isVisible(pane) || pane.element.nativeElement.querySelector('.trd-form-overlay') ? pane : null;
|
|
75
|
+
}
|
|
76
|
+
route(event) {
|
|
77
|
+
const pane = this.startedOn.has(event) ? this.startedOn.get(event) : this.coveredPane();
|
|
78
|
+
const focused = document.activeElement;
|
|
79
|
+
if (!pane || focused?.tagName !== 'IRON-REMOTE-DESKTOP' || !pane.element.nativeElement.contains(focused)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// A Tabby shortcut Tabby just acted on: not for the remote.
|
|
83
|
+
if (event.type === 'keydown' && this.hotkeys.pressedHotkey) {
|
|
84
|
+
this.metaAlone = false;
|
|
85
|
+
event.stopImmediatePropagation();
|
|
86
|
+
event.preventDefault();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const isMeta = event.code === 'MetaLeft' || event.code === 'MetaRight';
|
|
90
|
+
const macShortcuts = process.platform === 'darwin' && this.desktop.settings().macShortcuts;
|
|
91
|
+
if (macShortcuts && (isMeta || event.metaKey)) {
|
|
92
|
+
// Replace the event for IronRDP: ⌘ becomes Ctrl.
|
|
93
|
+
event.stopImmediatePropagation();
|
|
94
|
+
event.preventDefault();
|
|
95
|
+
if (event.type === 'keydown') {
|
|
96
|
+
this.metaAlone = isMeta && !event.repeat ? true : isMeta && this.metaAlone;
|
|
97
|
+
}
|
|
98
|
+
this.forward(event, isMeta ? { key: 'Control', code: event.code === 'MetaRight' ? 'ControlRight' : 'ControlLeft' } : {});
|
|
99
|
+
if (isMeta && event.type === 'keyup' && this.metaAlone) {
|
|
100
|
+
// ⌘ tapped on its own: the Windows key.
|
|
101
|
+
this.metaAlone = false;
|
|
102
|
+
const win = { key: 'Meta', code: event.code === 'MetaRight' ? 'MetaRight' : 'MetaLeft', plain: true };
|
|
103
|
+
this.forward(event, win, 'keydown');
|
|
104
|
+
this.forward(event, win, 'keyup');
|
|
105
|
+
}
|
|
106
|
+
if (event.type === 'keydown' && !MODIFIERS.test(event.code)) {
|
|
107
|
+
this.forward(event, {}, 'keyup');
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (process.platform === 'darwin' && event.type === 'keydown' && event.metaKey && !MODIFIERS.test(event.code)) {
|
|
112
|
+
// ⌘ stays the Windows key: IronRDP gets this keydown as is, plus the keyup macOS won't send.
|
|
113
|
+
setTimeout(() => this.forward(event, {}, 'keyup'));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Hands IronRDP (its listeners are on window) a copy of the event, with ⌘ mapped to Ctrl when asked. */
|
|
117
|
+
forward(event, change, type = event.type) {
|
|
118
|
+
// `plain`: send the key as is (the Windows key for a ⌘ tap), not mapped.
|
|
119
|
+
const macShortcuts = process.platform === 'darwin' && this.desktop.settings().macShortcuts && !change.plain;
|
|
120
|
+
const copy = new KeyboardEvent(type, {
|
|
121
|
+
key: change.key ?? event.key,
|
|
122
|
+
code: change.code ?? event.code,
|
|
123
|
+
location: event.location,
|
|
124
|
+
repeat: event.repeat,
|
|
125
|
+
shiftKey: event.shiftKey,
|
|
126
|
+
altKey: event.altKey,
|
|
127
|
+
ctrlKey: macShortcuts ? event.ctrlKey || event.metaKey : event.ctrlKey,
|
|
128
|
+
metaKey: macShortcuts ? false : event.metaKey,
|
|
129
|
+
cancelable: true,
|
|
130
|
+
});
|
|
131
|
+
this.copies.add(copy);
|
|
132
|
+
window.dispatchEvent(copy);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
exports.DesktopKeyboard = DesktopKeyboard;
|
|
136
|
+
exports.DesktopKeyboard = DesktopKeyboard = __decorate([
|
|
137
|
+
(0, core_1.Injectable)({ providedIn: 'root' }),
|
|
138
|
+
__metadata("design:paramtypes", [tabby_core_1.AppService,
|
|
139
|
+
tabby_core_1.HotkeysService,
|
|
140
|
+
desktop_service_1.RemoteDesktopService,
|
|
141
|
+
core_1.NgZone])
|
|
142
|
+
], DesktopKeyboard);
|
|
143
|
+
//# sourceMappingURL=keyboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAkD;AAClD,2CAAuD;AACvD,uDAAwD;AACxD,uCAAsD;AAEtD;;;;GAIG;AACH,gGAAgG;AAChG,MAAM,SAAS,GAAG,qFAAqF,CAAA;AAEvG,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAA;AAEzI;;;;;;;GAOG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAe;IAQxB,YACY,GAAe,EACf,OAAuB,EACvB,OAA6B,EAC7B,IAAY;QAHZ,QAAG,GAAH,GAAG,CAAY;QACf,YAAO,GAAP,OAAO,CAAgB;QACvB,YAAO,GAAP,OAAO,CAAsB;QAC7B,SAAI,GAAJ,IAAI,CAAQ;QAXxB,kFAAkF;QACjE,WAAM,GAAG,IAAI,OAAO,EAAS,CAAA;QAC9C,yGAAyG;QACxF,cAAS,GAAG,IAAI,OAAO,EAA6B,CAAA;QACrE,oFAAoF;QAC5E,cAAS,GAAG,KAAK,CAAA;IAOrB,CAAC;IAEL,OAAO,CAAE,YAAoB;QACzB,0GAA0G;QAC1G,MAAM,OAAO,GAAG,IAAI,CAAC,OAAc,CAAA;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACtD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAO,CAAC,iBAAiB,GAAG,CAAC,OAAiB,EAAE,EAAE;gBAC9C,MAAM,EAAE,GAAkB,KAAK,CAAC,OAAO,CAAC,CAAA;gBACxC,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,YAAY,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACvG,OAAO,IAAI,CAAA;gBACf,CAAC;gBACD,OAAO,EAAE,CAAA;YACb,CAAC,CAAA;QACL,CAAC;QACD,oGAAoG;QACpG,+FAA+F;QAC/F,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE;YAC7B,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,CAAU,EAAE,CAAC;gBAC/C,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;gBAC3F,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;YACvF,CAAC;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IAED,+EAA+E;IACvE,WAAW;QACf,MAAM,IAAI,GAAG,IAAA,uBAAa,EAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IACtH,CAAC;IAEO,KAAK,CAAE,KAAoB;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;QACvF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAA;QACtC,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE,OAAO,KAAK,qBAAqB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvG,OAAM;QACV,CAAC;QACD,4DAA4D;QAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAK,IAAI,CAAC,OAAe,CAAC,aAAa,EAAE,CAAC;YAClE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;YACtB,KAAK,CAAC,wBAAwB,EAAE,CAAA;YAChC,KAAK,CAAC,cAAc,EAAE,CAAA;YACtB,OAAM;QACV,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAA;QACtE,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAA;QAC1F,IAAI,YAAY,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,iDAAiD;YACjD,KAAK,CAAC,wBAAwB,EAAE,CAAA;YAChC,KAAK,CAAC,cAAc,EAAE,CAAA;YACtB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAA;YAC9E,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACxH,IAAI,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACrD,wCAAwC;gBACxC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;gBACtB,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;gBACrG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;gBACnC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;YACrC,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;YACpC,CAAC;YACD,OAAM;QACV,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5G,6FAA6F;YAC7F,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;QACtD,CAAC;IACL,CAAC;IAED,yGAAyG;IACjG,OAAO,CAAE,KAAoB,EAAE,MAAwD,EAAE,OAAe,KAAK,CAAC,IAAI;QACtH,yEAAyE;QACzE,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;QAC3G,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE;YACjC,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG;YAC5B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI;YAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;YACtE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;YAC7C,UAAU,EAAE,IAAI;SACnB,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACrB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;CACJ,CAAA;AA1GY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,iBAAU,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;qCAUd,uBAAU;QACN,2BAAc;QACd,sCAAoB;QACvB,aAAM;GAZf,eAAe,CA0G3B"}
|
package/dist/remoteSetup.js
CHANGED
|
@@ -15,7 +15,18 @@ command -v gnome-shell >/dev/null 2>&1 || fail "gnome-shell is not installed"
|
|
|
15
15
|
if systemctl --user is-active -q gnome-remote-desktop.service; then
|
|
16
16
|
fail "a desktop-session GNOME Remote Desktop is already running for this user"
|
|
17
17
|
fi
|
|
18
|
-
D="$HOME/.local/share/tabby-
|
|
18
|
+
D="$HOME/.local/share/tabby-rdp"
|
|
19
|
+
# Before 0.2 this was ~/.local/share/tabby-remote-desktop, with a '# tabby-remote-desktop' login hook: move it over
|
|
20
|
+
# once (keys, password, helpers) and drop the old hook line (the 'desk' part below adds the current one if wanted).
|
|
21
|
+
OLD="$HOME/.local/share/tabby-remote-desktop"
|
|
22
|
+
if [ -d "$OLD" ] && [ ! -e "$D" ]; then
|
|
23
|
+
mv "$OLD" "$D" || fail "could not move $OLD to $D"
|
|
24
|
+
fi
|
|
25
|
+
for rc in "$HOME/.bashrc" "$HOME/.zshrc"; do
|
|
26
|
+
if [ -f "$rc" ] && grep -qF '# tabby-remote-desktop' "$rc"; then
|
|
27
|
+
sed -i.trd-bak '/# tabby-remote-desktop$/d' "$rc" && rm -f "$rc.trd-bak"
|
|
28
|
+
fi
|
|
29
|
+
done
|
|
19
30
|
mkdir -p "$D" && chmod 700 "$D" || fail "could not create $D"
|
|
20
31
|
if [ ! -s "$D/tls.key" ]; then
|
|
21
32
|
openssl req -new -newkey rsa:3072 -days 3650 -nodes -x509 -subj "/CN=$(hostname)" \
|
|
@@ -30,7 +41,7 @@ cat > "$D/login.sh" <<'TRD_EOF'
|
|
|
30
41
|
# tabby-rdp ('desk' setting): interactive SSH logins run inside a shareable session, so 'desk' in Tabby can
|
|
31
42
|
# bring this console to the remote desktop. Backend ("native" trd-pty or "tmux") is in $TRD_HOME/backend.
|
|
32
43
|
# Set TABBY_NO_SESSION=1 (or TABBY_NO_TMUX=1) to skip; turning 'desk' off in Tabby removes this hook.
|
|
33
|
-
TRD_HOME="$HOME/.local/share/tabby-
|
|
44
|
+
TRD_HOME="$HOME/.local/share/tabby-rdp"
|
|
34
45
|
case ":$PATH:" in *":$TRD_HOME/bin:"*) ;; *) PATH="$TRD_HOME/bin:$PATH"; export PATH ;; esac
|
|
35
46
|
case $- in *i*) ;; *) return 0 ;; esac
|
|
36
47
|
if [ -n "$SSH_TTY" ] && [ -z "$TMUX" ] && [ -z "$TRD_SESSION" ] && [ -z "$TABBY_NO_TMUX$TABBY_NO_SESSION" ]; then
|
|
@@ -87,15 +98,15 @@ chmod 755 "$D/bin/trd-pty"
|
|
|
87
98
|
printf '%s\n' "${"$"}{TRD_BACKEND:-native}" > "$D/backend"
|
|
88
99
|
for rc in "$HOME/.bashrc" "$HOME/.zshrc"; do
|
|
89
100
|
[ -f "$rc" ] || continue
|
|
90
|
-
grep -qF '# tabby-
|
|
101
|
+
grep -qF '# tabby-rdp' "$rc" && continue
|
|
91
102
|
# Only one line: turning desk off deletes exactly it, so on/off cycles leave the file as it was.
|
|
92
103
|
[ -z "$(tail -c1 "$rc")" ] || echo >> "$rc"
|
|
93
|
-
printf '[ -f "$HOME/.local/share/tabby-
|
|
104
|
+
printf '[ -f "$HOME/.local/share/tabby-rdp/login.sh" ] && . "$HOME/.local/share/tabby-rdp/login.sh" # tabby-rdp\n' >> "$rc"
|
|
94
105
|
done
|
|
95
106
|
else
|
|
96
107
|
for rc in "$HOME/.bashrc" "$HOME/.zshrc"; do
|
|
97
|
-
if [ -f "$rc" ] && grep -qF '# tabby-
|
|
98
|
-
sed -i.trd-bak '/# tabby-
|
|
108
|
+
if [ -f "$rc" ] && grep -qF '# tabby-rdp' "$rc"; then
|
|
109
|
+
sed -i.trd-bak '/# tabby-rdp$/d' "$rc" && rm -f "$rc.trd-bak"
|
|
99
110
|
fi
|
|
100
111
|
done
|
|
101
112
|
# Sessions already running keep going; new logins are plain again.
|
|
@@ -171,6 +182,7 @@ function trdPty() {
|
|
|
171
182
|
trdPtySource ??= fs.readFileSync(path.join(__dirname, '..', 'remote', 'trd-pty.py'), 'utf8');
|
|
172
183
|
return trdPtySource;
|
|
173
184
|
}
|
|
185
|
+
/** Makes sure the remote user has a headless GNOME session served by grd, with fresh credentials. */
|
|
174
186
|
async function prepareRemoteDesktop(target, desk, backend = 'native') {
|
|
175
187
|
const script = `TRD_DESK=${desk ? 1 : 0}\nTRD_BACKEND=${backend === 'tmux' ? 'tmux' : 'native'}\n` +
|
|
176
188
|
SETUP_SCRIPT.replace('@@TRD_PTY_PY@@', trdPty().trimEnd());
|
package/dist/remoteSetup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remoteSetup.js","sourceRoot":"","sources":["../src/remoteSetup.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"remoteSetup.js","sourceRoot":"","sources":["../src/remoteSetup.ts"],"names":[],"mappings":";;AAmMA,oDAaC;AAhND,yBAAwB;AACxB,6BAA4B;AAS5B,kHAAkH;AAClH,yGAAyG;AACzG,2GAA2G;AAC3G,yGAAyG;AACzG,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4BvB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+DAqE2C,GAAG;;;;;;;;OAQ3D,GAAG;;;;CAIT,CAAA;AAKD,IAAI,YAAY,GAAkB,IAAI,CAAA;AACtC,SAAS,MAAM;IACX,YAAY,KAAK,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5F,OAAO,YAAY,CAAA;AACvB,CAAC;AAED,qGAAqG;AAC9F,KAAK,UAAU,oBAAoB,CAAE,MAAoB,EAAE,IAAa,EAAE,UAA0B,QAAQ;IAC/G,MAAM,MAAM,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI;QAC9F,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC9C,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtC,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC;IACD,MAAM,EAAE,GAAG,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChE,IAAI,CAAC,EAAE,EAAE,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AACpE,CAAC"}
|
package/dist/ssh.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isSSHTab = isSSHTab;
|
|
4
|
+
exports.isConnected = isConnected;
|
|
4
5
|
exports.openTcpStream = openTcpStream;
|
|
5
6
|
exports.execRemote = execRemote;
|
|
6
7
|
const sshChannelStream_1 = require("./sshChannelStream");
|
|
@@ -8,9 +9,26 @@ function isSSHTab(tab) {
|
|
|
8
9
|
// The profile is set when the tab is created; sshSession only once it connects.
|
|
9
10
|
return tab?.profile?.type === 'ssh' && !!tab.element?.nativeElement;
|
|
10
11
|
}
|
|
12
|
+
// SSH sessions Tabby has torn down. They still say `open` afterwards, and the tab keeps them until it reconnects.
|
|
13
|
+
const destroyed = new WeakSet();
|
|
14
|
+
const watched = new WeakSet();
|
|
15
|
+
/** Whether the tab's SSH connection is up (not closed, not torn down). */
|
|
16
|
+
function isConnected(tab) {
|
|
17
|
+
const session = tab.sshSession;
|
|
18
|
+
if (!session) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if (!watched.has(session)) {
|
|
22
|
+
watched.add(session);
|
|
23
|
+
// willDestroy$ completes after it fires, so subscribing late still reports it.
|
|
24
|
+
const mark = () => destroyed.add(session);
|
|
25
|
+
session.willDestroy$?.subscribe({ next: mark, complete: mark });
|
|
26
|
+
}
|
|
27
|
+
return !!session.open && !destroyed.has(session);
|
|
28
|
+
}
|
|
11
29
|
function client(tab) {
|
|
12
30
|
const ssh = tab.sshSession?.ssh;
|
|
13
|
-
if (!tab
|
|
31
|
+
if (!isConnected(tab) || typeof ssh?.openTCPForwardChannel !== 'function') {
|
|
14
32
|
throw new Error('The SSH connection is not open');
|
|
15
33
|
}
|
|
16
34
|
return ssh;
|
|
@@ -18,13 +36,19 @@ function client(tab) {
|
|
|
18
36
|
/** A direct-tcpip channel to host:port as the remote sees it (e.g. its own 127.0.0.1), as a Node stream. */
|
|
19
37
|
async function openTcpStream(tab, host, port) {
|
|
20
38
|
const ssh = client(tab);
|
|
39
|
+
const session = tab.sshSession;
|
|
21
40
|
const channel = await ssh.activateChannel(await ssh.openTCPForwardChannel({
|
|
22
41
|
addressToConnectTo: host,
|
|
23
42
|
portToConnectTo: port,
|
|
24
43
|
originatorAddress: '127.0.0.1',
|
|
25
44
|
originatorPort: 0,
|
|
26
45
|
}));
|
|
27
|
-
|
|
46
|
+
const stream = new sshChannelStream_1.SSHChannelStream(channel);
|
|
47
|
+
// When Tabby tears the SSH session down (dropped connection, Reconnect), its channels don't report closing:
|
|
48
|
+
// end the stream then, so the desktop notices instead of freezing.
|
|
49
|
+
const gone = session?.willDestroy$?.subscribe(() => stream.destroy(new Error('the SSH connection closed')));
|
|
50
|
+
stream.once('close', () => gone?.unsubscribe());
|
|
51
|
+
return stream;
|
|
28
52
|
}
|
|
29
53
|
/** Runs `command` on the remote with `stdin`, returns stdout. No PTY, no exit status (russh doesn't expose it). */
|
|
30
54
|
async function execRemote(tab, command, stdin = '', timeoutMs = 60000) {
|
package/dist/ssh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":";;AAcA,4BAGC;AAOD,kCAYC;AAWD,sCAeC;AAGD,gCAsBC;AArFD,yDAAqD;AAYrD,SAAgB,QAAQ,CAAE,GAAwC;IAC9D,gFAAgF;IAChF,OAAQ,GAAqB,EAAE,OAAO,EAAE,IAAI,KAAK,KAAK,IAAI,CAAC,CAAE,GAAc,CAAC,OAAO,EAAE,aAAa,CAAA;AACtG,CAAC;AAED,kHAAkH;AAClH,MAAM,SAAS,GAAG,IAAI,OAAO,EAAU,CAAA;AACvC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAU,CAAA;AAErC,0EAA0E;AAC1E,SAAgB,WAAW,CAAE,GAAW;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAA;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,KAAK,CAAA;IAChB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACpB,+EAA+E;QAC/E,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACzC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACnE,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,MAAM,CAAE,GAAW;IACxB,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAA;IAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,EAAE,qBAAqB,KAAK,UAAU,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACrD,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC;AAED,4GAA4G;AACrG,KAAK,UAAU,aAAa,CAAE,GAAW,EAAE,IAAY,EAAE,IAAY;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAA;IAC9B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACtE,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAE,WAAW;QAC9B,cAAc,EAAE,CAAC;KACpB,CAAC,CAAC,CAAA;IACH,MAAM,MAAM,GAAG,IAAI,mCAAgB,CAAC,OAAO,CAAC,CAAA;IAC5C,4GAA4G;IAC5G,mEAAmE;IACnE,MAAM,IAAI,GAAG,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAA;IAC3G,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IAC/C,OAAO,MAAM,CAAA;AACjB,CAAC;AAED,mHAAmH;AAC5G,KAAK,UAAU,UAAU,CAAE,GAAW,EAAE,OAAe,EAAE,KAAK,GAAG,EAAE,EAAE,SAAS,GAAG,KAAK;IACzF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACvB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACzE,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACvF,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpE,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAClC,IAAI,KAAK,EAAE,CAAC;QACR,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,EAAE,CAAA;IACnB,IAAI,KAAiC,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC7C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IACjH,CAAC,CAAC,CAAA;IACF,IAAI,CAAC;QACD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACzC,CAAC;YAAS,CAAC;QACP,YAAY,CAAC,KAAK,CAAC,CAAA;QACnB,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC9C,CAAC"}
|
package/dist/targets.js
CHANGED
|
@@ -109,6 +109,8 @@ class SystemSSHTarget {
|
|
|
109
109
|
});
|
|
110
110
|
return stream;
|
|
111
111
|
}
|
|
112
|
+
// Each tunnel and command is its own ssh process.
|
|
113
|
+
isOpen() { return true; }
|
|
112
114
|
exec(command, stdin) {
|
|
113
115
|
return new Promise((resolve, reject) => {
|
|
114
116
|
const child = (0, child_process_1.spawn)('ssh', [...this.args('-T'), command], { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
@@ -142,6 +144,10 @@ class TabbySSHTarget {
|
|
|
142
144
|
}
|
|
143
145
|
openTcp(host, port) { return (0, ssh_1.openTcpStream)(this.tab, host, port); }
|
|
144
146
|
exec(command, stdin) { return (0, ssh_1.execRemote)(this.tab, command, stdin); }
|
|
147
|
+
isOpen() { return (0, ssh_1.isConnected)(this.tab); }
|
|
148
|
+
get reconnectSSH() {
|
|
149
|
+
return typeof this.tab.reconnect === 'function' ? () => this.tab.reconnect() : undefined;
|
|
150
|
+
}
|
|
145
151
|
}
|
|
146
152
|
// ---- detection ---------------------------------------------------------------------------------
|
|
147
153
|
/**
|
package/dist/targets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":";;;;;;;;;AAqCA,sCAGC;AAgCD,0CA+BC;AAvGD,wCAA0C;AAC1C,iDAA+C;AAC/C,mCAA+B;AAC/B,2CAAgE;AAChE,+BAAgF;AA2BhF,SAAS,eAAe,CAAE,GAAwC;IAC9D,MAAM,CAAC,GAAG,GAAyB,CAAA;IACnC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,iBAAiB,KAAK,UAAU,CAAA;AAC3H,CAAC;AAED,iGAAiG;AACjG,SAAgB,aAAa,CAAE,GAAwC;IACnE,MAAM,IAAI,GAAG,GAAG,YAAY,8BAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IACzE,OAAO,IAAA,cAAQ,EAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAmB,CAAC,CAAC,CAAC,IAAI,CAAA;AAC/E,CAAC;AAED,mGAAmG;AAEnG,SAAS,GAAG,CAAE,IAAY,EAAE,IAAc,EAAE,SAAS,GAAG,KAAK;IACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAA,wBAAQ,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACrF,IAAI,GAAG,EAAE,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAClF,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC9B,CAAC;QACL,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC;AAED,wCAAwC;AACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,uBAAuB,CAAC,CAAA;AACjD,8FAA8F;AAC9F,0FAA0F;AAC1F,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAA;AAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;AACtC,6FAA6F;AAC7F,MAAM,MAAM,GAAG,wOAAwO,CAAA;AAQvP,gGAAgG;AAChG,SAAgB,eAAe,CAAE,MAAgB;IAC7C,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACb,CAAC,EAAE,CAAA;YACH,MAAK;QACT,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAClC,MAAK;QACT,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACjB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC7D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACtB,OAAO,IAAI,CAAA;gBACf,CAAC;gBACD,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oBACnE,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;gBACnC,CAAC;gBACD,MAAK;YACT,CAAC;YACD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;YAC5B,CAAC;QACL,CAAC;IACL,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7B,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACxD,CAAC;AAED,iFAAiF;AACjF,KAAK,UAAU,UAAU,CAAE,OAAiB,EAAE,WAAmB;IAC7D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;IAC7D,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;IAChF,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAA;AAC1G,CAAC;AAED,kGAAkG;AAClG,MAAM,eAAe;IACjB,YAAsB,GAAW,EAAW,KAAa,EAAU,GAAe;QAA5D,QAAG,GAAH,GAAG,CAAQ;QAAW,UAAK,GAAL,KAAK,CAAQ;QAAU,QAAG,GAAH,GAAG,CAAY;IAAI,CAAC;IAE/E,IAAI,CAAE,GAAG,KAAe;QAC5B,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACvF,CAAC;IAED,KAAK,CAAC,OAAO,CAAE,IAAY,EAAE,IAAY;QACrC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACxK,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,eAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;QAC7E,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QACtC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QACxC,kEAAkE;QAClE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;YAC9C,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAC7B,CAAC,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;IACjB,CAAC;IAED,kDAAkD;IAClD,MAAM,KAAe,OAAO,IAAI,CAAA,CAAC,CAAC;IAElC,IAAI,CAAE,OAAe,EAAE,KAAa;QAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;YAC9F,IAAI,MAAM,GAAG,EAAE,CAAA;YACf,IAAI,MAAM,GAAG,EAAE,CAAA;YACf,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;YAC7C,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;YAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;YACnD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACzB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACpB,YAAY,CAAC,KAAK,CAAC,CAAA;gBACnB,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAC5F,CAAC,CAAC,CAAA;YACF,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;IACN,CAAC;CACJ;AAED,SAAS,UAAU,CAAE,KAAa,EAAE,MAAc,EAAE,IAAmB;IACnE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;IAClD,IAAI,kDAAkD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChE,OAAO,4CAA4C,KAAK,6GAA6G,CAAA;IACzK,CAAC;IACD,OAAO,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,EAAE,CAAA;AAC5E,CAAC;AAED,mGAAmG;AAEnG,MAAM,cAAc;IAChB,YAAsB,GAAW,EAAW,KAAa,EAAU,GAAW;QAAxD,QAAG,GAAH,GAAG,CAAQ;QAAW,UAAK,GAAL,KAAK,CAAQ;QAAU,QAAG,GAAH,GAAG,CAAQ;IAAI,CAAC;IACnF,OAAO,CAAE,IAAY,EAAE,IAAY,IAAqB,OAAO,IAAA,mBAAa,EAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;IACpG,IAAI,CAAE,OAAe,EAAE,KAAa,IAAqB,OAAO,IAAA,gBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;IACtG,MAAM,KAAe,OAAO,IAAA,iBAAW,EAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC;IACnD,IAAI,YAAY;QACZ,OAAO,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7F,CAAC;CACJ;AAED,mGAAmG;AAEnG;;;GAGG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IAAnB;QACK,UAAK,GAAG,IAAI,OAAO,EAA8D,CAAA;QACjF,SAAI,GAAG,IAAI,GAAG,EAA2B,CAAA;IA0FrD,CAAC;IAxFG,kEAAkE;IAClE,MAAM,CAAE,IAAiB;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAE,IAAiB;QAC7B,IAAI,MAAM,GAAwB,IAAI,CAAA;QACtC,IAAI,GAAuB,CAAA;QAC3B,IAAI,CAAC;YACD,IAAI,IAAA,cAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;gBACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;gBAC1C,MAAM,GAAG,KAAK,IAAI,IAAI,cAAc,CAChC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAC9E,CAAC,CAAC,IAAI,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAA;YACjC,CAAC;iBAAM,CAAC;gBACJ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACvC,GAAG,GAAG,KAAK,EAAE,GAAG,CAAA;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAClC,IAAI,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;oBACpD,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;gBACzB,CAAC;qBAAM,IAAI,KAAK,EAAE,CAAC;oBACf,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC5H,CAAC;YACL,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,GAAG,IAAI,CAAA;QACjB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACrC,OAAO,MAAM,CAAA;IACjB,CAAC;IAEO,GAAG,CAAE,OAAiB,EAAE,WAAmB;QAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAA;QACjD,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC3B,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;YACtC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;YACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QAC1B,CAAC;QACD,OAAO,GAAG,CAAA;IACd,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,QAAQ,CAAE,IAAiB;QACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAA;QACf,CAAC;QACD,MAAM,IAAI,GAAuB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC1F,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,IAAI,CAAA;QACf,CAAC;QACD,gFAAgF;QAChF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6C,CAAA;QACrE,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACzF,MAAM,CAAC,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChD,IAAI,CAAC,EAAE,CAAC;gBACJ,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBAChE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YACpC,CAAC;QACL,CAAC;QACD,iGAAiG;QACjG,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;QAClB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,MAAM,IAAI,GAAa,EAAE,CAAA;YACzB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBACtB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1C,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;wBACzC,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;wBAChD,IAAI,GAAG,EAAE,CAAC;4BACN,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;wBAClC,CAAC;oBACL,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACxB,CAAC;YACL,CAAC;YACD,KAAK,GAAG,IAAI,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAA;IACf,CAAC;CACJ,CAAA;AA5FY,sCAAa;wBAAb,aAAa;IADzB,IAAA,iBAAU,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;GACtB,aAAa,CA4FzB"}
|
package/dist/ui.js
CHANGED
|
@@ -44,6 +44,10 @@ let RemoteDesktopConfig = class RemoteDesktopConfig extends tabby_core_1.ConfigP
|
|
|
44
44
|
sharpness: 'standard',
|
|
45
45
|
// `desk`: installs a login hook on remotes (applied the next time a desktop opens there).
|
|
46
46
|
desk: false,
|
|
47
|
+
// macOS: ⌘ acts as Ctrl on the remote desktop (false: ⌘ is the Windows/Super key).
|
|
48
|
+
macShortcuts: true,
|
|
49
|
+
// Play the remote desktop's sound (applies on the next connect).
|
|
50
|
+
sound: true,
|
|
47
51
|
// More desktops behind SSH hosts (e.g. a Windows VM whose RDP port the host forwards); see desktops.ts.
|
|
48
52
|
desktops: [],
|
|
49
53
|
},
|
|
@@ -108,6 +112,9 @@ let RemoteDesktopContextMenu = class RemoteDesktopContextMenu extends tabby_core
|
|
|
108
112
|
label: toggleLabel(this.desktop, pane),
|
|
109
113
|
click: () => this.desktop.toggle(pane),
|
|
110
114
|
}, ...desktopChoices(this.desktop, pane, this.targets.cached(pane)?.label)];
|
|
115
|
+
if (this.desktop.isConnected(pane)) {
|
|
116
|
+
items.push({ label: 'Send files to the remote desktop…', click: () => this.desktop.sendFiles(pane) });
|
|
117
|
+
}
|
|
111
118
|
if (this.desktop.has(pane)) {
|
|
112
119
|
items.push({ label: 'Disconnect remote desktop', click: () => this.desktop.disconnect(pane) });
|
|
113
120
|
}
|
|
@@ -145,6 +152,18 @@ function settingsMenu(desktop) {
|
|
|
145
152
|
checked: current.desk,
|
|
146
153
|
click: () => desktop.updateSettings({ desk: !current.desk }),
|
|
147
154
|
},
|
|
155
|
+
{
|
|
156
|
+
type: 'checkbox',
|
|
157
|
+
label: 'Play the remote desktop\'s sound (applies on the next connect)',
|
|
158
|
+
checked: current.sound,
|
|
159
|
+
click: () => desktop.updateSettings({ sound: !current.sound }),
|
|
160
|
+
},
|
|
161
|
+
...process.platform === 'darwin' ? [{
|
|
162
|
+
type: 'checkbox',
|
|
163
|
+
label: 'Mac shortcuts on the remote desktop (⌘C, ⌘V, ⌘Z… act as Ctrl+C, Ctrl+V…; off: ⌘ is the Windows key)',
|
|
164
|
+
checked: current.macShortcuts,
|
|
165
|
+
click: () => desktop.updateSettings({ macShortcuts: !current.macShortcuts }),
|
|
166
|
+
}] : [],
|
|
148
167
|
{ type: 'separator' },
|
|
149
168
|
{
|
|
150
169
|
label: 'Remove a desktop',
|