Skip to content

Commit 7575f84

Browse files
Requests and Responses updated
1 parent 2606a85 commit 7575f84

File tree

24 files changed

+488
-248
lines changed

24 files changed

+488
-248
lines changed

src/dataEditor/dataEditorClient.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export class DataEditorClient implements vscode.Disposable {
133133
fileToEdit: string = '',
134134
private panel: DataEditorUI
135135
) {
136-
this.panel.onDidReceiveMessage(this.msgReceiver, this)
136+
this.panel.onDidReceiveMessage(this.msgReceiver)
137137

138138
this.disposables = [
139139
this.panel,
@@ -173,20 +173,26 @@ export class DataEditorClient implements vscode.Disposable {
173173
fileToEdit: string = ''
174174
): Promise<DataEditorClient | undefined> {
175175
startSvelteWebviewInitializer(context)
176-
const title = !fileToEdit ? 'Data Editor' : path.basename(fileToEdit)
176+
const title = !fileToEdit
177+
? 'Data Editor' + (OPEN_EDITORS.size + 1).toString()
178+
: path.basename(fileToEdit)
177179

178180
const column =
179181
fileToEdit === '' ? vscode.ViewColumn.Two : vscode.ViewColumn.Active
182+
const uiMsgId = getSvelteWebviewInitializer().formatMsgId(title)
180183

181184
const ui = getSvelteWebviewInitializer().createSveltePanel({
182185
title,
183186
column,
187+
uiMsgId,
184188
})
185189

186190
const editor = new DataEditorClient(context, configVars, fileToEdit, ui)
187191

188192
await editor.initialize()
189193

194+
ui.reveal()
195+
190196
ui.onDidDispose(async () => {
191197
const pathKey = path.resolve(editor.fileToEdit).toLowerCase()
192198
OPEN_EDITORS.delete(pathKey)
@@ -372,8 +378,12 @@ export class DataEditorClient implements vscode.Disposable {
372378
})
373379
vscode.window.showErrorMessage(msg)
374380
}
375-
376-
this.panel.postMessage
381+
this.panel.postMessage('fileInfo', {
382+
bom: data.byteOrderMark,
383+
contentType: data.type,
384+
filename: this.fileToEdit,
385+
language: data.language,
386+
})
377387
// send the initial file info to the webview
378388
// await this.panel.postMessage({
379389
// command: MessageCommand.fileInfo,

src/dataEditor/ui/svelteWebviewInitializer.ts

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,63 +19,77 @@ import * as vscode from 'vscode'
1919
import * as fs from 'fs'
2020
import {
2121
DataEditorMessageResponses,
22-
ExtensionMessageResponses,
23-
MessageCommandMap,
22+
MessageRequestMap,
23+
MessageResponseMap,
2424
PostMessageArgs,
2525
} from 'ext_types'
2626
import { DisplayState } from './displayState'
27+
import { randomUUID } from 'crypto'
2728

2829
export interface DataEditorUI extends vscode.Disposable {
2930
readonly displayState: DisplayState
3031
dispose(): void
3132
setTitle(title: string): void
32-
postMessage<K extends keyof MessageCommandMap>(
33-
...payload: PostMessageArgs<MessageCommandMap, K>
33+
getMsgId(): string
34+
postMessage<K extends keyof MessageResponseMap>(
35+
...payload: PostMessageArgs<MessageResponseMap, K>
3436
): void
3537
reveal: vscode.WebviewPanel['reveal']
36-
onDidReceiveMessage: vscode.Webview['onDidReceiveMessage']
37-
onDidDispose: vscode.WebviewPanel['onDidDispose']
38+
onDidReceiveMessage(listener: (e: any) => void): void
39+
onDidDispose(listener: (e: any) => void): void
3840
}
3941
class SvelteUIWebviewPanel implements DataEditorUI {
4042
static readonly uiViewId: string = 'dataEditor'
4143
readonly displayState: DisplayState = new DisplayState()
4244

43-
constructor(private vscodePanel: vscode.WebviewPanel) {}
45+
constructor(
46+
private vscodePanel: vscode.WebviewPanel,
47+
private messengerId: string = ''
48+
) {}
4449
dispose() {
4550
this.vscodePanel.dispose()
4651
}
52+
getMsgId() {
53+
return this.messengerId
54+
}
55+
setMsgId(id: string) {
56+
if (this.messengerId !== '')
57+
throw 'Cannot reassign messenger id after initialization.'
4758

59+
this.messengerId = id
60+
}
4861
setTitle(title: string) {
4962
this.vscodePanel.title = title
5063
}
5164

52-
postMessage<K extends keyof MessageCommandMap>(
53-
...payload: PostMessageArgs<MessageCommandMap, K>
54-
) {}
55-
postEditorResponse<K extends keyof DataEditorMessageResponses>(
56-
type: K,
57-
message: DataEditorMessageResponses[K]
65+
postMessage<K extends keyof MessageResponseMap>(
66+
...msg: PostMessageArgs<MessageResponseMap, K>
5867
) {
59-
this.vscodePanel.webview.postMessage({ command: type, data: message })
60-
}
61-
postExtensionResponse<K extends keyof ExtensionMessageResponses>(
62-
type: K,
63-
message: ExtensionMessageResponses[K]
64-
) {
65-
this.vscodePanel.webview.postMessage({ command: type, data: message })
68+
const [type, payload] = msg as [K, MessageResponseMap[K]]
69+
this.vscodePanel.webview.postMessage({
70+
command: type,
71+
id: this.messengerId,
72+
data: { ...payload },
73+
})
6674
}
6775

68-
public readonly onDidReceiveMessage =
69-
this.vscodePanel.webview.onDidReceiveMessage
76+
public onDidReceiveMessage(listener: (e: any) => void) {
77+
this.vscodePanel.webview.onDidReceiveMessage(listener)
78+
}
7079

71-
public readonly reveal = this.vscodePanel.reveal
80+
public readonly reveal = () => {
81+
this.vscodePanel.reveal()
82+
}
7283

73-
public readonly onDidDispose = this.vscodePanel.onDidDispose
84+
public onDidDispose(listener: (e: any) => void) {
85+
this.vscodePanel.onDidDispose(listener)
86+
}
7487
}
7588

7689
export type SveltePanelArgs = {
7790
title: string
7891
column: vscode.ViewColumn
92+
uiMsgId: string
7993
}
8094

8195
interface SvelteInitializerState {
@@ -102,25 +116,31 @@ const ValidInitializerState: SvelteInitializerState = {
102116
return ExtensionContextRef
103117
},
104118
}
119+
120+
const UI_MSG_ID_MAX_LEN = 32
121+
105122
class SvelteWebviewInitializer {
106123
static state: SvelteInitializerState = InvalidInitializerState
107-
108124
constructor() {}
109-
125+
formatMsgId(id: string) {
126+
let idStr = id.substring(0, UI_MSG_ID_MAX_LEN)
127+
idStr.replaceAll(' ', '_')
128+
return idStr
129+
}
110130
createSveltePanel(args: SveltePanelArgs): SvelteUIWebviewPanel {
111131
const ret = vscode.window.createWebviewPanel(
112132
SvelteUIWebviewPanel.uiViewId,
113133
args.title,
114134
args.column
115135
)
116136
this.setWebviewOptions(ret)
117-
this.setHtmlContent(ret)
137+
this.setHtmlContent(ret, args.uiMsgId)
118138

119-
return new SvelteUIWebviewPanel(ret)
139+
return new SvelteUIWebviewPanel(ret, args.uiMsgId)
120140
}
121141

122142
// get the HTML content for the webview
123-
private setHtmlContent(vsPanel: vscode.WebviewPanel): string {
143+
private setHtmlContent(vsPanel: vscode.WebviewPanel, msgId: string) {
124144
let vsWebview = vsPanel.webview
125145
const nonce = this.getNonce()
126146

@@ -142,7 +162,9 @@ class SvelteWebviewInitializer {
142162
.replace(/src="\.\/index.js"/, `src="${scriptUri.toString()}"`)
143163
.replace(/href="\.\/style.css"/, `href="${stylesUri.toString()}"`)
144164
.replaceAll(/nonce="__nonce__"/g, `nonce="${nonce}""`)
145-
return indexHTML
165+
.replace('__extension_msg_id__', msgId)
166+
167+
vsWebview.html = indexHTML
146168
}
147169
private injectNonce(
148170
html: string,

src/ext_types/messageContent.ts

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { IServerHeartbeat } from '@omega-edit/client'
12
import {
23
EditorMessageId,
34
EditorMessageIds,
@@ -50,7 +51,10 @@ type MessageCommands =
5051
| 'undoChange'
5152
| 'viewportRefresh'
5253

53-
export interface MessageCommandMap {
54+
type CommandMap = {
55+
[K in MessageCommands]: any
56+
}
57+
export interface MessageRequestMap extends CommandMap {
5458
counts: never
5559
clearChanges: never
5660
applyChanges: ApplyChangesRequest
@@ -73,19 +77,46 @@ export interface MessageCommandMap {
7377
setUITheme: SetUIThemeRequest
7478
}
7579

80+
export interface MessageResponseMap extends CommandMap {
81+
clearChanges: void
82+
applyChanges: ChangesInfoResponse
83+
editorOnChange: EditorOnChangeResponse
84+
fileInfo: FileInfoResponse
85+
counts: CountResponse
86+
profile: ProfileResponse
87+
redoChange: void
88+
replaceResults: ReplaceResponse
89+
requestEditedData: EditedDataResponse
90+
save: void
91+
saveAs: SaveAsResponse
92+
saveSegment: void
93+
scrollViewport: void
94+
search: SearchResponse
95+
replace: ReplaceResponse
96+
undoChange: void
97+
viewportRefresh: ViewportRefreshResponse
98+
showMessage: undefined
99+
setUITheme: void
100+
heartbeat: IServerHeartbeat & { port: number }
101+
}
102+
76103
export type ExtensionMessageKeys =
77104
| 'showMessage'
78105
| 'setUITheme'
79106
| 'editorOnChange'
107+
80108
export type DataEditorMessageKeys = Exclude<
81109
MessageCommands,
82110
ExtensionMessageKeys
83111
>
84112
export type DataEditorMessageRequests = Pick<
85-
MessageCommandMap,
113+
MessageRequestMap,
114+
DataEditorMessageKeys
115+
>
116+
export type DataEditorMessageResponses = Pick<
117+
MessageResponseMap,
86118
DataEditorMessageKeys
87119
>
88-
89120
/**
90121
* Key indexable interface to templated type inference of available messages sent between
91122
* the components of the DFDL VSCode extension.
@@ -112,36 +143,33 @@ export type DataEditorMessageRequests = Pick<
112143
// viewportRefresh: never
113144
// }
114145
export type ExtensionMessageRequests = Pick<
115-
MessageCommandMap,
146+
MessageRequestMap,
116147
ExtensionMessageKeys
117148
>
118149

119-
export interface ExtensionMessageResponses {
120-
showMessage: undefined
121-
setUITheme: void
122-
}
150+
// export type ExtensionMessageResponses = Pick<
123151

124-
export interface DataEditorMessageResponses
125-
extends Record<keyof DataEditorMessageRequests, unknown> {
126-
clearChanges: void
127-
applyChanges: ChangesInfoResponse
128-
editorOnChange: EditorOnChangeResponse
129-
fileInfo: FileInfoResponse
130-
counts: CountResponse
131-
// heartbeat: IServerHeartbeat & { port: number } // service
132-
profile: ProfileResponse
133-
redoChange: void
134-
replaceResults: ReplaceResponse
135-
requestEditedData: EditedDataResponse
136-
save: void
137-
saveAs: SaveAsResponse
138-
saveSegment: void
139-
scrollViewport: void
140-
search: SearchResponse
141-
replace: ReplaceResponse
142-
undoChange: void
143-
viewportRefresh: ViewportRefreshResponse
144-
}
152+
// export interface DataEditorMessageResponses
153+
// extends Record<keyof DataEditorMessageRequests, unknown> {
154+
// clearChanges: void
155+
// applyChanges: ChangesInfoResponse
156+
// editorOnChange: EditorOnChangeResponse
157+
// fileInfo: FileInfoResponse
158+
// counts: CountResponse
159+
// // heartbeat: IServerHeartbeat & { port: number } // service
160+
// profile: ProfileResponse
161+
// redoChange: void
162+
// replaceResults: ReplaceResponse
163+
// requestEditedData: EditedDataResponse
164+
// save: void
165+
// saveAs: SaveAsResponse
166+
// saveSegment: void
167+
// scrollViewport: void
168+
// search: SearchResponse
169+
// replace: ReplaceResponse
170+
// undoChange: void
171+
// viewportRefresh: ViewportRefreshResponse
172+
// }
145173

146174
export type VSEditorMessagePackage<K extends keyof DataEditorMessageRequests> =
147175
{

src/ext_types/messages.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@
1515
* limitations under the License.
1616
*/
1717

18-
import {
19-
DataEditorMessageResponses,
20-
ExtensionMessageResponses,
21-
} from 'ext_types'
2218
import { EditByteModes } from './formattypes'
2319

2420
/**

src/svelte/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<title>Vite + Svelte + TS</title>
2424
</head>
2525
<body>
26-
<div id="app"></div>
26+
<div id="app" extension_msg_id="__extension_msg_id__"></div>
2727
<script type="module" src="/src/main.ts"></script>
2828
</body>
2929
</html>

0 commit comments

Comments
 (0)