Skip to content

Commit fae5420

Browse files
committed
Implemented external API
This commit provides an external API that can be used by other extensions to communicate with the base trace extension. The current API provides a way to retrieve the active experiment as well as fire events and register callbacks. This is the initial API and will be further expanded in future commits. Fixes #140 Signed-off-by: Neel Gondalia <ngondalia@blackberry.com>
1 parent 3bb9428 commit fae5420

File tree

5 files changed

+141
-3
lines changed

5 files changed

+141
-3
lines changed

vscode-trace-extension/src/extension.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@ import { fileHandler, openOverviewHandler, resetZoomHandler, keyboardShortcutsHa
88
import { TraceServerConnectionStatusService } from './utils/trace-server-status';
99
import { updateTspClient } from './utils/tspClient';
1010
import { TraceExtensionLogger } from './utils/trace-extension-logger';
11+
import { ExternalAPI, traceExtensionAPI} from './external-api/external-api';
12+
import { TraceExtensionEventManager } from './utils/trace-extension-event-manager';
1113

1214
export let traceLogger: TraceExtensionLogger;
15+
export const traceExtensionEventManager: TraceExtensionEventManager = new TraceExtensionEventManager();
1316

14-
export function activate(context: vscode.ExtensionContext): void {
17+
export function activate(context: vscode.ExtensionContext): ExternalAPI {
1518
traceLogger = new TraceExtensionLogger('Trace Extension');
1619

1720
const serverStatusBarItemPriority = 1;
@@ -69,6 +72,8 @@ export function activate(context: vscode.ExtensionContext): void {
6972
context.subscriptions.push(vscode.commands.registerCommand('traceViewer.shortcuts', () => {
7073
keyboardShortcutsHandler(context.extensionUri);
7174
}));
75+
76+
return traceExtensionAPI;
7277
}
7378

7479
export function deactivate(): void {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/***************************************************************************************
2+
* Copyright (c) 2023 BlackBerry Limited and others.
3+
*
4+
* Licensed under the MIT license. See LICENSE file in the project root for details.
5+
***************************************************************************************/
6+
import { Experiment } from 'tsp-typescript-client/lib/models/experiment';
7+
import { TraceViewerPanel } from '../trace-viewer-panel/trace-viewer-webview-panel';
8+
import { traceExtensionEventManager } from '../extension';
9+
10+
export interface ExternalAPI {
11+
getActiveExperiment(): Experiment | undefined,
12+
fireEventEmitter(eventId: string, data: unknown): void,
13+
getEventEmitterIds(): Iterable<string>
14+
}
15+
16+
export const traceExtensionAPI: ExternalAPI = {
17+
/**
18+
* Retrieves the currently active experiement
19+
*
20+
* @returns Experiment if one is currently active, otherwise undefined
21+
*/
22+
getActiveExperiment(): Experiment | undefined {
23+
return TraceViewerPanel.getCurrentExperiment();
24+
},
25+
26+
/**
27+
* Fires the event emitter with the provided ID
28+
*
29+
* @param eventId ID of the event emitter to fire
30+
* @param data event object
31+
*/
32+
fireEventEmitter(eventId: string, data: unknown): void {
33+
traceExtensionEventManager.fireEventEmitter(eventId, data);
34+
},
35+
/**
36+
* Retrieves the list of event emitters registered with the Event Manager
37+
*
38+
* @returns list of event emitter IDs
39+
*/
40+
getEventEmitterIds(): Iterable<string> {
41+
return traceExtensionEventManager.getKeys();
42+
}
43+
};

vscode-trace-extension/src/trace-explorer/opened-traces/trace-explorer-opened-traces-webview-provider.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { TraceViewerPanel } from '../../trace-viewer-panel/trace-viewer-webview-
88
import { TraceServerConnectionStatusService } from '../../utils/trace-server-status';
99
import { getTraceServerUrl, getTspClientUrl } from '../../utils/tspClient';
1010
import { VSCODE_MESSAGES } from 'vscode-trace-common/lib/messages/vscode-message-manager';
11+
import { traceExtensionEventManager } from 'vscode-trace-extension/src/extension';
12+
import { SignalCallbackInterface } from '../../utils/trace-extension-event-manager';
1113

1214
const JSONBig = JSONBigConfig({
1315
useNativeBigInt: true,
@@ -16,15 +18,20 @@ const JSONBig = JSONBigConfig({
1618
export class TraceExplorerOpenedTracesViewProvider implements vscode.WebviewViewProvider {
1719

1820
public static readonly viewType = 'traceExplorer.openedTracesView';
21+
public static readonly eventEmitter_id_callback = this.viewType + '.register_callback';
1922

2023
private _view?: vscode.WebviewView;
2124
private _disposables: vscode.Disposable[] = [];
2225
private _selectedExperiment: Experiment | undefined;
2326

24-
constructor(
27+
constructor(
2528
private readonly _extensionUri: vscode.Uri,
2629
private readonly _statusService: TraceServerConnectionStatusService,
27-
) {}
30+
) {
31+
traceExtensionEventManager.registerEventEmitter(TraceExplorerOpenedTracesViewProvider.eventEmitter_id_callback);
32+
traceExtensionEventManager.onEvent(TraceExplorerOpenedTracesViewProvider.eventEmitter_id_callback,
33+
(data: unknown) => {this.registerCallbackForSignal(data as SignalCallbackInterface);});
34+
}
2835

2936
private _onOpenedTracesWidgetActivated = (experiment: Experiment): void => this.doHandleTracesWidgetActivatedSignal(experiment);
3037
private _onOpenedTracesChanged = (payload: OpenedTracesUpdatedSignalPayload): void => this.doHandleOpenedTracesChangedSignal(payload);
@@ -52,6 +59,16 @@ export class TraceExplorerOpenedTracesViewProvider implements vscode.WebviewView
5259
}
5360
}
5461

62+
protected registerCallbackForSignal(data: SignalCallbackInterface): void {
63+
this._view?.webview.onDidReceiveMessage(message => {
64+
switch (message.command) {
65+
case data.signal: {
66+
data.callback(message);
67+
}
68+
}
69+
});
70+
}
71+
5572
protected doHandleExperimentSelectedSignal(experiment: Experiment | undefined): void {
5673
if (this._view) {
5774
this._selectedExperiment = experiment;

vscode-trace-extension/src/trace-viewer-panel/trace-viewer-webview-panel.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ export class TraceViewerPanel {
7878
TraceViewerPanel.currentPanel?.resetZoom();
7979
}
8080

81+
public static getCurrentExperiment(): Experiment | undefined {
82+
return TraceViewerPanel.currentPanel?._experiment;
83+
}
84+
8185
private static async saveTraceCsv(csvData: string, defaultFileName: string) {
8286
const saveDialogOptions = {
8387
defaultUri: vscode.workspace.workspaceFolders
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/***************************************************************************************
2+
* Copyright (c) 2023 BlackBerry Limited and others.
3+
*
4+
* Licensed under the MIT license. See LICENSE file in the project root for details.
5+
***************************************************************************************/
6+
import * as vscode from 'vscode';
7+
8+
export interface SignalCallbackInterface {
9+
signal: string,
10+
callback: (data: unknown) => void
11+
}
12+
13+
/**
14+
* Manages the events for the trace extension
15+
*/
16+
export class TraceExtensionEventManager {
17+
private eventEmitterMap: Map<string, vscode.EventEmitter<unknown>>;
18+
constructor() {
19+
this.eventEmitterMap = new Map<string, vscode.EventEmitter<unknown>>();
20+
}
21+
22+
/**
23+
* Get the event emitter registered based on Id
24+
*
25+
* @param id event emitter Id
26+
* @returns event emitter for the given id if exists, otherwise undefined
27+
*/
28+
getEventEmitter(id: string): vscode.EventEmitter<unknown> | undefined {
29+
return this.eventEmitterMap.get(id);
30+
}
31+
32+
/**
33+
* Register an event emitter with the provided Id
34+
*
35+
* @param id event emitter Id
36+
*/
37+
registerEventEmitter(id: string): void {
38+
this.eventEmitterMap.set(id, new vscode.EventEmitter<unknown>());
39+
}
40+
41+
/**
42+
* Fire the event emitter with the provided Id
43+
*
44+
* @param id event emitter Id
45+
* @param data event object
46+
*/
47+
fireEventEmitter(id: string, data: unknown): void {
48+
this.getEventEmitter(id)?.fire(data);
49+
}
50+
51+
/**
52+
* Retrieves an iterable event emitter Ids
53+
*
54+
* @returns Iterable Event Ids
55+
*/
56+
getKeys(): Iterable<string> {
57+
return this.eventEmitterMap.keys();
58+
}
59+
60+
/**
61+
* Attaches a listener for an event based on the event emitter id
62+
*
63+
* @param id event emitter Id
64+
* @param callback function to call when the event is triggered
65+
*/
66+
onEvent(id: string, callback: (data: unknown) => void): void {
67+
this.getEventEmitter(id)?.event(callback);
68+
}
69+
}

0 commit comments

Comments
 (0)