Skip to content

Commit c995bcd

Browse files
committed
Fix bigint support in messages sent between webviews and vscode
TODO: JSONBig.parse() create bigint if numbers are small. This has to be addressed when deserializing messages. Re-use tsp-typescript-client's normalizer to do that. The following branch in the tps-typescript-client is introducing an utility class and, if accepted, it can be used to solve the deserialization issue: eclipse-cdt-cloud/tsp-typescript-client#56 Signed-off-by: Bernd Hufmann <[email protected]>
1 parent b2a352e commit c995bcd

File tree

10 files changed

+1437
-891
lines changed

10 files changed

+1437
-891
lines changed

common-tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"strict": true,
1818
"sourceMap": true,
1919
"strictPropertyInitialization": false,
20+
"esModuleInterop": true,
2021
"target": "ES2017"
2122
}
2223
}

vscode-trace-extension/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
"ag-grid-community": "^20.2.0",
9898
"ag-grid-react": "^20.2.0",
9999
"chart.js": "^2.8.0",
100+
"json-bigint": "sidorares/json-bigint#2c0a5f896d7888e68e5f4ae3c7ea5cd42fd54473",
100101
"lodash": "^4.17.15",
101102
"terser": "3.16.0",
102103
"traceviewer-base": "next",
@@ -106,6 +107,7 @@
106107
},
107108
"devDependencies": {
108109
"@types/jest": "^23.3.13",
110+
"@types/json-bigint": "^1.0.1",
109111
"@types/node": "^10.1.2",
110112
"@types/vscode": "^1.52.0",
111113
"@typescript-eslint/eslint-plugin": "^3.4.0",

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

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import { getTspClientUrl, getTraceServerUrl } from '../../utils/tspClient';
44
import { signalManager, Signals } from 'traceviewer-base/lib/signals/signal-manager';
55
import { Experiment } from 'tsp-typescript-client/lib/models/experiment';
66
import { OpenedTracesUpdatedSignalPayload } from 'traceviewer-base/lib/signals/opened-traces-updated-signal-payload';
7+
import JSONBigConfig from 'json-bigint';
8+
9+
const JSONBig = JSONBigConfig({
10+
useNativeBigInt: true,
11+
});
712

813
export class TraceExplorerOpenedTracesViewProvider implements vscode.WebviewViewProvider {
914

@@ -56,25 +61,30 @@ export class TraceExplorerOpenedTracesViewProvider implements vscode.WebviewView
5661
webviewView.webview.postMessage({command: 'set-tspClient', data: getTspClientUrl()});
5762
return;
5863
case 'reopenTrace':
59-
if (message.data && message.data.experiment) {
60-
const panel = TraceViewerPanel.createOrShow(this._extensionUri, message.data.experiment.name);
61-
panel.setExperiment(message.data.experiment);
64+
if (message.data && message.data.wrapper) {
65+
// FIXME: JSONBig.parse() create bigint if numbers are small
66+
const experiment = JSONBig.parse(message.data.wrapper);
67+
const panel = TraceViewerPanel.createOrShow(this._extensionUri, experiment.name);
68+
panel.setExperiment(experiment);
6269
}
6370
return;
6471
case 'closeTrace':
65-
if (message.data && message.data.experiment) {
66-
TraceViewerPanel.disposePanel(this._extensionUri, message.data.experiment.name);
72+
if (message.data && message.data.wrapper) {
73+
// FIXME: JSONBig.parse() create bigint if numbers are small
74+
TraceViewerPanel.disposePanel(this._extensionUri, JSONBig.parse(message.data.wrapper).name);
6775
}
6876
return;
6977
case 'deleteTrace':
70-
if (message.data && message.data.experiment) {
78+
if (message.data && message.data.wrapper) {
79+
// FIXME: JSONBig.parse() create bigint if numbers are small
7180
// just remove the panel here
72-
TraceViewerPanel.disposePanel(this._extensionUri, message.data.experiment.name);
81+
TraceViewerPanel.disposePanel(this._extensionUri, JSONBig.parse(message.data.wrapper).name);
7382
}
7483
return;
7584
case 'experimentSelected': {
76-
if (message.data && message.data.experiment) {
77-
signalManager().fireExperimentSelectedSignal(message.data.experiment);
85+
if (message.data && message.data.wrapper) {
86+
// FIXME: JSONBig.parse() create bigint if numbers are small
87+
signalManager().fireExperimentSelectedSignal(JSONBig.parse(message.data.wrapper));
7888
}
7989
}
8090
}

vscode-trace-extension/src/trace-explorer/views/trace-explorer-available-views-webview-provider.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import { signalManager, Signals } from 'traceviewer-base/lib/signals/signal-mana
44
import { Experiment } from 'tsp-typescript-client/lib/models/experiment';
55
import { TraceViewerPanel } from '../../trace-viewer-panel/trace-viewer-webview-panel';
66
import { OutputDescriptor } from 'tsp-typescript-client/lib/models/output-descriptor';
7+
import JSONBigConfig from 'json-bigint';
8+
9+
const JSONBig = JSONBigConfig({
10+
useNativeBigInt: true,
11+
});
712

813
export class TraceExplorerAvailableViewsProvider implements vscode.WebviewViewProvider {
914

@@ -46,19 +51,22 @@ export class TraceExplorerAvailableViewsProvider implements vscode.WebviewViewPr
4651
return;
4752
case 'outputAdded':
4853
if (message.data && message.data.descriptor) {
49-
const descriptor: OutputDescriptor = message.data.descriptor as OutputDescriptor;
54+
// FIXME: JSONBig.parse() create bigint if numbers are small
55+
const descriptor = JSONBig.parse(message.data.descriptor) as OutputDescriptor;
5056
// TODO: Don't use static current panel, i.e. find better design to add output...
57+
5158
TraceViewerPanel.addOutputToCurrent(descriptor);
5259
// const panel = TraceViewerPanel.createOrShow(this._extensionUri, message.data.experiment.name);
5360
// panel.setExperiment(message.data.experiment);
5461
}
5562
return;
5663
case 'experimentSelected': {
57-
if (message.data && message.data.experiment) {
64+
if (message.data && message.data.wrapper) {
5865
try {
5966
// Avoid endless forwarding of signal
6067
this._selectionOngoing = true;
61-
signalManager().fireExperimentSelectedSignal(message.data.experiment);
68+
// FIXME: JSONBig.parse() create bigint if numbers are small
69+
signalManager().fireExperimentSelectedSignal(JSONBig.parse(message.data.wrapper));
6270
} finally {
6371
this._selectionOngoing = false;
6472
}

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import { getTspClientUrl, getTraceServerUrl } from '../utils/tspClient';
44
import { OutputDescriptor } from 'tsp-typescript-client/lib/models/output-descriptor';
55
import { handleStatusMessage, handleRemoveMessage, setStatusFromPanel } from '../common/trace-message';
66
import { signalManager, Signals } from 'traceviewer-base/lib/signals/signal-manager';
7+
import JSONBigConfig from 'json-bigint';
8+
9+
const JSONBig = JSONBigConfig({
10+
useNativeBigInt: true,
11+
});
712

813
// TODO: manage mutiple panels (currently just a hack around, need to be fixed)
914

@@ -115,7 +120,8 @@ export class TraceViewerPanel {
115120
// Post the tspTypescriptClient
116121
this._panel.webview.postMessage({command: 'set-tspClient', data: getTspClientUrl()});
117122
if (this._experiment) {
118-
this._panel.webview.postMessage({command: 'set-experiment', data: this._experiment});
123+
const wrapper: string = JSONBig.stringify(this._experiment);
124+
this._panel.webview.postMessage({command: 'set-experiment', data: wrapper});
119125
}
120126
return;
121127
}
@@ -152,11 +158,13 @@ export class TraceViewerPanel {
152158

153159
setExperiment(experiment: Experiment): void {
154160
this._experiment = experiment;
155-
this._panel.webview.postMessage({command: 'set-experiment', data: experiment});
161+
const wrapper: string = JSONBig.stringify(experiment);
162+
this._panel.webview.postMessage({command: 'set-experiment', data: wrapper});
156163
}
157164

158165
addOutput(descriptor: OutputDescriptor): void {
159-
this._panel.webview.postMessage({command: 'add-output', data: descriptor});
166+
const wrapper: string = JSONBig.stringify(descriptor);
167+
this._panel.webview.postMessage({command: 'add-output', data: wrapper});
160168
}
161169

162170
private _getHtmlForWebview() {

vscode-trace-webviews/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"@fortawesome/fontawesome-svg-core": "^1.2.17",
1515
"@fortawesome/free-solid-svg-icons": "^5.8.1",
1616
"@fortawesome/react-fontawesome": "^0.1.4",
17+
"json-bigint": "sidorares/json-bigint#2c0a5f896d7888e68e5f4ae3c7ea5cd42fd54473",
1718
"lodash": "^4.17.15",
1819
"lodash.debounce": "^4.0.8",
1920
"react": "^16.3.2",
@@ -30,6 +31,7 @@
3031
},
3132
"devDependencies": {
3233
"@types/jest": "^23.3.13",
34+
"@types/json-bigint": "^1.0.1",
3335
"@types/node": "^10.1.2",
3436
"@types/react": "^16.3.14",
3537
"@types/react-dom": "^16.0.5",

vscode-trace-webviews/src/common/vscode-message-manager.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import * as Messages from 'traceviewer-base/lib/message-manager';
22
import { OutputAddedSignalPayload } from 'traceviewer-base/lib/signals/output-added-signal-payload';
33
import { Experiment } from 'tsp-typescript-client/lib/models/experiment';
4+
import JSONBigConfig from 'json-bigint';
5+
6+
const JSONBig = JSONBigConfig({
7+
useNativeBigInt: true,
8+
});
49

510
/* eslint-disable @typescript-eslint/no-explicit-any */
611
interface vscode {
@@ -39,22 +44,31 @@ export class VsCodeMessageManager extends Messages.MessageManager {
3944
* Trace Explorer React APP
4045
*************************************************************************/
4146
reOpenTrace(experiment: Experiment): void {
42-
vscode.postMessage({command: 'reopenTrace', data: {experiment}});
47+
const wrapper: string = JSONBig.stringify(experiment);
48+
vscode.postMessage({command: 'reopenTrace', data: {wrapper}});
4349
}
4450

4551
closeTrace(experiment: Experiment): void {
46-
vscode.postMessage({command: 'closeTrace', data: {experiment}});
52+
const wrapper: string = JSONBig.stringify(experiment);
53+
vscode.postMessage({command: 'closeTrace', data: {wrapper}});
4754
}
4855

4956
deleteTrace(experiment: Experiment): void {
50-
vscode.postMessage({command: 'deleteTrace', data: {experiment}});
57+
const wrapper: string = JSONBig.stringify(experiment);
58+
vscode.postMessage({command: 'deleteTrace', data: {wrapper}});
5159
}
5260

5361
experimentSelected(experiment: Experiment | undefined): void {
54-
vscode.postMessage({command: 'experimentSelected', data: {experiment}});
62+
let wrapper = undefined;
63+
if (experiment) {
64+
wrapper = JSONBig.stringify(experiment);
65+
}
66+
vscode.postMessage({command: 'experimentSelected', data: {wrapper}});
5567
}
5668

5769
outputAdded(payload: OutputAddedSignalPayload): void {
58-
vscode.postMessage({command: 'outputAdded', data: {experiment: payload.getExperiment(), descriptor: payload.getOutputDescriptor() }});
70+
const expWrapper = JSONBig.stringify(payload.getExperiment());
71+
const descWrapper = JSONBig.stringify(payload.getOutputDescriptor());
72+
vscode.postMessage({command: 'outputAdded', data: {data: expWrapper, descriptor: descWrapper }});
5973
}
6074
}

vscode-trace-webviews/src/trace-explorer/opened-traces/vscode-trace-explorer-opened-traces-widget.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class TraceExplorerOpenedTraces extends React.Component<{}, OpenedTracesAppState
108108
<Menu id={MENU_ID} theme={'dark'} animation={'fade'}>
109109
<Item id="open-id" onClick={this.handleItemClick}>Open Trace</Item>
110110
<Item id="close-id" onClick={this.handleItemClick}>Close Trace</Item>
111-
<Item id="delete-id" onClick={this.handleItemClick}>Delete Trace</Item>
111+
<Item id="remove-id" onClick={this.handleItemClick}>Remove Trace</Item>
112112
</Menu>
113113
</>
114114
);
@@ -122,10 +122,10 @@ class TraceExplorerOpenedTraces extends React.Component<{}, OpenedTracesAppState
122122
case 'close-id':
123123
this._signalHandler.closeTrace(args.props.experiment as Experiment);
124124
return;
125-
case 'delete-id':
125+
case 'remove-id':
126126
this._signalHandler.deleteTrace(args.props.experiment as Experiment);
127127
if (this._experimentManager) {
128-
this._experimentManager.closeExperiment((args.props.experiment as Experiment).UUID);
128+
this._experimentManager.deleteExperiment((args.props.experiment as Experiment).UUID);
129129
}
130130

131131
return;

vscode-trace-webviews/src/trace-viewer/vscode-trace-viewer-container.tsx

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
/* eslint-disable @typescript-eslint/no-empty-function */
22
/* eslint-disable @typescript-eslint/ban-types */
3-
import * as React from 'react';
4-
import { Experiment } from 'tsp-typescript-client/lib/models/experiment';
5-
import { TspClient } from 'tsp-typescript-client/lib/protocol/tsp-client';
6-
import { OutputDescriptor } from 'tsp-typescript-client/lib/models/output-descriptor';
7-
import { TraceContextComponent } from 'traceviewer-react-components/lib/components/trace-context-component';
8-
import { VsCodeMessageManager } from '../common/vscode-message-manager';
93
import 'ag-grid-community/dist/styles/ag-grid.css';
104
import 'ag-grid-community/dist/styles/ag-theme-balham-dark.css';
115
import 'ag-grid-community/dist/styles/ag-theme-balham.css';
6+
import * as React from 'react';
127
import 'react-grid-layout/css/styles.css';
138
import 'react-resizable/css/styles.css';
14-
import '../style/trace-viewer.css';
9+
import { TraceContextComponent } from 'traceviewer-react-components/lib/components/trace-context-component';
1510
import 'traceviewer-react-components/style/trace-context-style.css';
11+
import { Experiment } from 'tsp-typescript-client/lib/models/experiment';
12+
import { OutputDescriptor } from 'tsp-typescript-client/lib/models/output-descriptor';
13+
import { TspClient } from 'tsp-typescript-client/lib/protocol/tsp-client';
14+
import { VsCodeMessageManager } from '../common/vscode-message-manager';
15+
import '../style/trace-viewer.css';
16+
import JSONBigConfig from 'json-bigint';
17+
18+
const JSONBig = JSONBigConfig({
19+
useNativeBigInt: true,
20+
});
1621

1722
interface VscodeAppState {
1823
experiment: Experiment | undefined;
@@ -23,6 +28,10 @@ interface VscodeAppState {
2328
class App extends React.Component<{}, VscodeAppState> {
2429
private _signalHandler: VsCodeMessageManager;
2530

31+
// TODO add support for marker sets
32+
private selectedMarkerCategoriesMap: Map<string, string[]> = new Map<string, string[]>();
33+
private selectedMarkerSetId = '';
34+
2635
constructor(props: {}) {
2736
super(props);
2837
this.state = {
@@ -37,13 +46,17 @@ class App extends React.Component<{}, VscodeAppState> {
3746
const message = event.data; // The JSON data our extension sent
3847
switch (message.command) {
3948
case 'set-experiment':
40-
this.setState({experiment: message.data as Experiment});
49+
// FIXME: JSONBig.parse() create bigint if numbers are small
50+
const experiment = JSONBig.parse(message.data);
51+
this.setState({experiment: experiment});
4152
break;
4253
case 'set-tspClient':
4354
this.setState({tspClient: new TspClient(message.data)});
4455
break;
4556
case 'add-output':
46-
this.setState({outputs: [...this.state.outputs, message.data] });
57+
// FIXME: JSONBig.parse() create bigint if numbers are small
58+
const descriptor = JSONBig.parse(message.data);
59+
this.setState({outputs: [...this.state.outputs, descriptor] });
4760
break;
4861
}
4962
});
@@ -66,6 +79,8 @@ class App extends React.Component<{}, VscodeAppState> {
6679
experiment={this.state.experiment}
6780
tspClient={this.state.tspClient}
6881
outputs={this.state.outputs}
82+
markerCategoriesMap={this.selectedMarkerCategoriesMap}
83+
markerSetId={this.selectedMarkerSetId}
6984
messageManager={this._signalHandler}
7085
onOutputRemove={this.onOutputRemoved}
7186
// eslint-disable-next-line @typescript-eslint/no-empty-function

0 commit comments

Comments
 (0)