Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/liveShare/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -279,8 +279,8 @@ export class GuestService {
void liveShareRequest(Callback.RequestAttachGuest);
// focus guest term if it exists
const rTermNameOptions = ['R [Shared]', 'R Interactive [Shared]'];
const activeTerminalName = vscode.window.activeTerminal.name;
if (!rTermNameOptions.includes(activeTerminalName)) {
const activeTerminalName = vscode.window.activeTerminal?.name;
if (activeTerminalName && !rTermNameOptions.includes(activeTerminalName)) {
for (const [i] of vscode.window.terminals.entries()) {
const terminal = vscode.window.terminals[i];
const terminalName = terminal.name;
Expand Down
130 changes: 71 additions & 59 deletions src/liveShare/shareSession.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import path = require('path');
import * as vscode from 'vscode';
import * as vsls from 'vsls';

import { extensionContext, globalRHelp, rWorkspace } from '../extension';
import { extensionContext, globalHttpgdManager, globalRHelp, rWorkspace } from '../extension';
import { config, readContent } from '../util';
import { showBrowser, showDataView, showWebView } from '../session';
import { liveSession, UUID, rGuestService, _sessionStatusBarItem as sessionStatusBarItem } from '.';
Expand Down Expand Up @@ -85,60 +84,70 @@ export function attachActiveGuest(): void {
export async function updateGuestRequest(file: string, force: boolean = false): Promise<void> {
const requestContent: string = await readContent(file, 'utf8');
console.info(`[updateGuestRequest] request: ${requestContent}`);
if (typeof (requestContent) === 'string') {
const request: IRequest = JSON.parse(requestContent) as IRequest;
if (request && !force) {
if (request.uuid === null || request.uuid === undefined || request.uuid === UUID) {
switch (request.command) {
case 'help': {
if (globalRHelp) {
console.log(request.requestPath);
void globalRHelp.showHelpForPath(request.requestPath, request.viewer);
}
break;
}
case 'httpgd': {
break;
}
case 'attach': {
guestPid = String(request.pid);
console.info(`[updateGuestRequest] attach PID: ${guestPid}`);
sessionStatusBarItem.text = `Guest R ${rVer}: ${guestPid}`;
sessionStatusBarItem.tooltip = `${info.version}\nProcess ID: ${guestPid}\nCommand: ${info.command}\nStart time: ${info.start_time}\nClick to attach to host terminal.`;
break;
}
case 'browser': {
await showBrowser(request.url, request.title, request.viewer);
break;
}
case 'webview': {
void showWebView(request.file, request.title, request.viewer);
break;
}
case 'dataview': {
void showDataView(request.source,
request.type, request.title, request.file, request.viewer);
break;
}
case 'rstudioapi': {
console.error(`[GuestService] ${request.command} not supported`);
break;
}
default:
console.error(`[updateRequest] Unsupported command: ${request.command}`);
}
if (typeof (requestContent) !== 'string') {
return;
}

const request: IRequest = JSON.parse(requestContent) as IRequest;
if (!request) {
return;
}

if (force) {
// The last request is not necessarily an attach request.
guestPid = String(request.pid);
console.info(`[updateGuestRequest] attach PID: ${guestPid}`);
sessionStatusBarItem.text = `Guest R: ${guestPid}`;
sessionStatusBarItem.tooltip = 'Click to attach to host terminal.';
sessionStatusBarItem.show();
}

if (request.uuid === null || request.uuid === undefined || request.uuid === UUID) {
switch (request.command) {
case 'help': {
if (globalRHelp) {
console.log(request.requestPath);
await globalRHelp.showHelpForPath(request.requestPath, request.viewer);
}
break;
}
} else {
guestPid = String(request.pid);
rVer = String(request.version);
info = request.info;

console.info(`[updateGuestRequest] attach PID: ${guestPid}`);
sessionStatusBarItem.text = `Guest R ${rVer}: ${guestPid}`;
sessionStatusBarItem.tooltip = `${info.version}\nProcess ID: ${guestPid}\nCommand: ${info.command}\nStart time: ${info.start_time}\nClick to attach to host terminal.`;
sessionStatusBarItem.show();
case 'httpgd': {
if (request.url) {
await globalHttpgdManager?.showViewer(request.url);
}
break;
}
case 'attach': {
guestPid = String(request.pid);
rVer = String(request.version);
info = request.info;
console.info(`[updateGuestRequest] attach PID: ${guestPid}`);
sessionStatusBarItem.text = `Guest R ${rVer}: ${guestPid}`;
sessionStatusBarItem.tooltip = `${info.version}\nProcess ID: ${guestPid}\nCommand: ${info.command}\nStart time: ${info.start_time}\nClick to attach to host terminal.`;
sessionStatusBarItem.show();
break;
}
case 'browser': {
await showBrowser(request.url, request.title, request.viewer);
break;
}
case 'webview': {
await showWebView(request.file, request.title, request.viewer);
break;
}
case 'dataview': {
await showDataView(request.source,
request.type, request.title, request.file, request.viewer);
break;
}
case 'rstudioapi': {
console.error(`[GuestService] ${request.command} not supported`);
break;
}
default:
console.error(`[updateRequest] Unsupported command: ${request.command}`);
}

}
}

Expand Down Expand Up @@ -219,19 +228,22 @@ function getGuestImageHtml(content: string) {
`;
}

export async function shareServer(url: URL, name: string): Promise<vscode.Disposable> {
return liveSession.shareServer({
port: parseInt(url.port),
displayName: `${name} (${url.host})`,
browseUrl: url.toString()
});
}

// Share and close browser are called from the
// host session
// Automates sharing browser sessions through the
// shareServer method
export async function shareBrowser(url: string, name: string, force: boolean = false): Promise<void> {
if (autoShareBrowser || force) {
const _url = new URL(url);
const server: vsls.Server = {
port: parseInt(_url.port),
displayName: name,
browseUrl: url,
};
const disposable = await liveSession.shareServer(server);
const disposable = await shareServer(_url, name);
console.log(`[HostService] shared ${name} at ${url}`);
browserDisposables.push({ Disposable: disposable, url, name });
}
Expand Down
9 changes: 7 additions & 2 deletions src/plotViewer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { extensionContext } from '../extension';
import { FocusPlotMessage, InMessage, OutMessage, ToggleStyleMessage, UpdatePlotMessage, HidePlotMessage, AddPlotMessage, PreviewPlotLayout, PreviewPlotLayoutMessage, ToggleFullWindowMessage } from './webviewMessages';
import { HttpgdIdResponse, HttpgdPlotId, HttpgdRendererId } from 'httpgd/lib/types';
import { Response } from 'node-fetch';
import { autoShareBrowser, isHost, shareServer } from '../liveShare';

const commands = [
'showViewers',
Expand Down Expand Up @@ -65,7 +66,7 @@ export class HttpgdManager {
};
}

public showViewer(urlString: string): void {
public async showViewer(urlString: string): Promise<void> {
const url = new URL(urlString);
const host = url.host;
const token = url.searchParams.get('token') || undefined;
Expand All @@ -86,6 +87,10 @@ export class HttpgdManager {
this.viewerOptions.fullWindow = conf.get('plot.defaults.fullWindowMode', false);
this.viewerOptions.token = token;
const viewer = new HttpgdViewer(host, this.viewerOptions);
if (isHost() && autoShareBrowser) {
const disposable = await shareServer(url, 'httpgd');
viewer.webviewPanel?.onDidDispose(() => void disposable.dispose());
}
this.viewers.unshift(viewer);
}
}
Expand Down Expand Up @@ -121,7 +126,7 @@ export class HttpgdManager {
};
const urlString = await vscode.window.showInputBox(options);
if (urlString) {
this.showViewer(urlString);
await this.showViewer(urlString);
}
}

Expand Down
10 changes: 5 additions & 5 deletions src/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -724,13 +724,13 @@ async function updateRequest(sessionStatusBarItem: StatusBarItem) {
case 'help': {
if (globalRHelp) {
console.log(request.requestPath);
void globalRHelp.showHelpForPath(request.requestPath, request.viewer);
await globalRHelp.showHelpForPath(request.requestPath, request.viewer);
}
break;
}
case 'httpgd': {
if (request.url) {
globalHttpgdManager?.showViewer(request.url);
await globalHttpgdManager?.showViewer(request.url);
}
break;
}
Expand All @@ -747,7 +747,7 @@ async function updateRequest(sessionStatusBarItem: StatusBarItem) {
updateSessionWatcher();
purgeAddinPickerItems();
if (request.plot_url) {
globalHttpgdManager?.showViewer(request.plot_url);
await globalHttpgdManager?.showViewer(request.plot_url);
}
break;
}
Expand All @@ -756,11 +756,11 @@ async function updateRequest(sessionStatusBarItem: StatusBarItem) {
break;
}
case 'webview': {
void showWebView(request.file, request.title, request.viewer);
await showWebView(request.file, request.title, request.viewer);
break;
}
case 'dataview': {
void showDataView(request.source,
await showDataView(request.source,
request.type, request.title, request.file, request.viewer);
break;
}
Expand Down