Skip to content

Commit e266334

Browse files
committed
Add PortMessanger interface
1 parent 4effefa commit e266334

File tree

6 files changed

+58
-51
lines changed

6 files changed

+58
-51
lines changed

packages/extension/background/background.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ chrome.runtime.onConnect.addListener(async port => {
160160
let data: TabData
161161

162162
const config: TabDataConfig = {
163-
toContent: content_messanger.postPortMessage,
164-
fromContent: content_messanger.onPortMessage,
163+
toContent: content_messanger.post,
164+
fromContent: content_messanger.on,
165165
forwardToDevtools: fn => (forwardHandler = fn),
166166
forwardToClient: message => port.postMessage(message),
167167
}
@@ -181,15 +181,15 @@ chrome.runtime.onConnect.addListener(async port => {
181181
tab_data_map.set(tab_id, data)
182182

183183
// "Versions" from content-script
184-
bridge.once(content_messanger.onPortMessage, 'Versions', v => {
184+
bridge.once(content_messanger.on, 'Versions', v => {
185185
data.setVersions(v)
186186

187187
// Change the popup icon to indicate that Solid is present on the page
188188
chrome.action.setIcon({tabId: tab_id, path: icons.blue})
189189
})
190190

191191
// "DetectSolid" from content-script (realWorld)
192-
content_messanger.onPortMessage('Detected', state => data.set_detected(state))
192+
content_messanger.on('Detected', state => data.set_detected(state))
193193

194194
port.onDisconnect.addListener(() => {
195195
data.disconnected()
@@ -220,7 +220,7 @@ chrome.runtime.onConnect.addListener(async port => {
220220
const content_messanger = await data.untilContentScriptConnect()
221221

222222
// "Versions" means the devtools client is present
223-
data.onVersions(v => devtools_messanger.postPortMessage('Versions', v))
223+
data.onVersions(v => devtools_messanger.post('Versions', v))
224224

225225
port.onDisconnect.addListener(() => {
226226
content_messanger.post('DevtoolsClosed')
@@ -244,16 +244,16 @@ chrome.runtime.onConnect.addListener(async port => {
244244
const content_messanger = await data.untilContentScriptConnect()
245245

246246
data.onVersions(v => {
247-
panel_messanger.postPortMessage('Versions', v)
247+
panel_messanger.post('Versions', v)
248248
// notify the content script that the devtools panel is ready
249249
content_messanger.post('DevtoolsOpened')
250250
})
251251

252252
content_messanger.on('ResetPanel', () => {
253-
panel_messanger.postPortMessage('ResetPanel')
253+
panel_messanger.post('ResetPanel')
254254
})
255255
data.onContentScriptDisconnect(() => {
256-
panel_messanger.postPortMessage('ResetPanel')
256+
panel_messanger.post('ResetPanel')
257257
})
258258

259259
if (!data.config) {
@@ -273,7 +273,7 @@ chrome.runtime.onConnect.addListener(async port => {
273273
}
274274

275275
// Forward messages from Panel to Content Script (client)
276-
panel_messanger.onForwardMessage(message => {
276+
panel_messanger.onForward(message => {
277277
if (!data.config) {
278278
error(`Cannot forward message, no ${bridge.Place_Name.Content_Script} connection.`, message)
279279
} else {
@@ -296,10 +296,10 @@ chrome.runtime.onConnect.addListener(async port => {
296296
port)
297297

298298
data.onVersions(v => {
299-
popup_messanger.postPortMessage('Versions', v)
299+
popup_messanger.post('Versions', v)
300300
})
301301
data.onDetected(state => {
302-
popup_messanger.postPortMessage('Detected', state)
302+
popup_messanger.post('Detected', state)
303303
})
304304

305305
break

packages/extension/content/content.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ let devtools_opened = false
2828
const fromClient = bridge.makeMessageListener(bridge.Place_Name.Content_Script)
2929
const toClient = bridge.makePostMessage()
3030

31-
const {postPortMessage: toBackground, onPortMessage: fromBackground} =
32-
bridge.createPortMessanger(
31+
const bg_messanger = bridge.createPortMessanger(
3332
bridge.Place_Name.Content_Script,
3433
bridge.Place_Name.Background,
3534
port)
@@ -74,7 +73,7 @@ window.addEventListener('message', e => {
7473

7574
const state = e.data.state as bridge.DetectionState
7675

77-
toBackground('Detected', state)
76+
bg_messanger.post('Detected', state)
7877

7978
/* Load Debugger_Real_World */
8079
if (state.Debugger && !debugger_real_world_added) {
@@ -94,26 +93,26 @@ fromClient('Debugger_Connected', versions => {
9493
'color: #e38b1b',
9594
)
9695

97-
toBackground('Versions', {
96+
bg_messanger.post('Versions', {
9897
client: versions.client,
9998
solid: versions.solid,
10099
extension: extension_version,
101100
expectedClient: import.meta.env.EXPECTED_CLIENT,
102101
})
103102

104-
fromClient('ResetPanel', () => toBackground('ResetPanel'))
103+
fromClient('ResetPanel', () => bg_messanger.post('ResetPanel'))
105104

106105
if (devtools_opened) toClient('DevtoolsOpened')
107106
})
108107

109108
// After page reload, the content script is reloaded but the background script is not.
110109
// This means that 'DevtoolsOpened' message will come after the Client is setup.
111110
// We need to send it after it connects.
112-
fromBackground('DevtoolsOpened', () => {
111+
bg_messanger.on('DevtoolsOpened', () => {
113112
devtools_opened = true
114113
toClient('DevtoolsOpened')
115114
})
116-
fromBackground('DevtoolsClosed', () => toClient('DevtoolsClosed'))
115+
bg_messanger.on('DevtoolsClosed', () => toClient('DevtoolsClosed'))
117116

118117
fromClient(e => {
119118
// forward all client messages to the background script in

packages/extension/devtools/devtools.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ log(bridge.Place_Name.Devtools_Script+' loaded.')
1616
// Create a connection to the background page
1717
const port = chrome.runtime.connect({name: bridge.ConnectionName.Devtools})
1818

19-
const {onPortMessage: fromBackground} = bridge.createPortMessanger(
19+
const bg_messanger = bridge.createPortMessanger(
2020
bridge.Place_Name.Devtools_Script,
2121
bridge.Place_Name.Background,
2222
port)
@@ -25,7 +25,7 @@ const {onPortMessage: fromBackground} = bridge.createPortMessanger(
2525
const PATH_PREFIX = import.meta.env.BROWSER === 'firefox' ? '/' : ''
2626

2727
// "Versions" mean that devtools client is on the page
28-
bridge.once(fromBackground, 'Versions', () => {
28+
bridge.once(bg_messanger.on, 'Versions', () => {
2929

3030
log('Debugger connected -> Creating Devtools_Panel...')
3131

packages/extension/panel/panel.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ import '@solid-devtools/frontend/dist/styles.css'
1414
log(bridge.Place_Name.Panel+' loaded.')
1515

1616
const port = chrome.runtime.connect({name: bridge.ConnectionName.Panel})
17-
const {postPortMessage: toBackground, onPortMessage: fromBackground} =
18-
bridge.createPortMessanger<Debugger.OutputChannels, Debugger.InputChannels>(
19-
bridge.Place_Name.Panel,
20-
bridge.Place_Name.Background,
21-
port)
17+
const bg_messanger = bridge.createPortMessanger
18+
<Debugger.OutputChannels, Debugger.InputChannels>(
19+
bridge.Place_Name.Panel,
20+
bridge.Place_Name.Background,
21+
port)
2222

2323
function App() {
2424
const [versions, setVersions] = createSignal<bridge.Versions>({
@@ -28,13 +28,13 @@ function App() {
2828
extension: '',
2929
})
3030

31-
bridge.once(fromBackground, 'Versions', setVersions)
31+
bridge.once(bg_messanger.on, 'Versions', setVersions)
3232

3333
const devtools = createDevtools()
3434

35-
devtools.bridge.output.listen(e => toBackground(e.name, e.details))
35+
devtools.bridge.output.listen(e => bg_messanger.post(e.name, e.details))
3636

37-
fromBackground(e => {
37+
bg_messanger.on(e => {
3838
// some events are internal and should not be forwarded to the devtools
3939
if (!(e.name in devtools.bridge.input)) return
4040
devtools.bridge.input.emit(e.name as any, e.details)

packages/extension/popup/popup.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ log(bridge.Place_Name.Popup+' loaded.')
1111

1212
// Create a connection to the background page
1313
const port = chrome.runtime.connect({name: bridge.ConnectionName.Popup})
14-
const {onPortMessage: fromBackground} = bridge.createPortMessanger(
14+
const bg_messanger = bridge.createPortMessanger(
1515
bridge.Place_Name.Popup,
1616
bridge.Place_Name.Background,
1717
port)
@@ -23,8 +23,8 @@ const [detectionState, setDetectionState] = s.createSignal<bridge.DetectionState
2323
Debugger: false,
2424
})
2525

26-
fromBackground('Detected', setDetectionState)
27-
bridge.once(fromBackground, 'Versions', setVersions)
26+
bg_messanger.on('Detected', setDetectionState)
27+
bg_messanger.on('Versions', setVersions)
2828

2929
const App: s.Component = () => {
3030
return <>

packages/extension/shared/bridge.ts

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ File for utilities, constants and types related to the communication between the
44
55
*/
66

7-
import {log, log_message} from '@solid-devtools/shared/utils'
7+
import {error, log, log_message} from '@solid-devtools/shared/utils'
88

99
export const DEVTOOLS_ID_PREFIX = '[solid-devtools]_'
1010

@@ -39,31 +39,35 @@ export type DetectEvent = {
3939
const LOG_MESSAGES = import.meta.env.DEV
4040
// const LOG_MESSAGES: boolean = true
4141

42+
export interface PortMessanger<
43+
IM extends {[K in string]: any},
44+
OM extends {[K in string]: any},
45+
> {
46+
post: PostMessageFn<OM>
47+
on: OnMessageFn<IM>
48+
onForward: (handler: (event: ForwardPayload) => void) => void
49+
}
50+
4251
export function createPortMessanger<
4352
IM extends {[K in string]: any},
4453
OM extends {[K in string]: any},
4554
>(
4655
place_name_here: string,
4756
place_name_conn: string,
48-
port: chrome.runtime.Port,
49-
): {
50-
postPortMessage: PostMessageFn<OM>
51-
onPortMessage: OnMessageFn<IM>
52-
onForwardMessage: (handler: (event: ForwardPayload) => void) => void
53-
} {
57+
_port: chrome.runtime.Port,
58+
): PortMessanger<IM, OM> {
59+
let port: chrome.runtime.Port | null = _port
60+
5461
let forwardHandler: ((event: ForwardPayload) => void) | undefined
5562
let listeners: {[K in any]?: ((event: any) => void)[]} = {}
5663

57-
let port_name = port.name.replace(DEVTOOLS_ID_PREFIX, '')
58-
59-
let connected = true
60-
if (LOG_MESSAGES) log(`${port_name} port connected.`)
64+
if (LOG_MESSAGES) log(`${place_name_here}-${place_name_conn} port connected.`)
6165

6266
port.onDisconnect.addListener(() => {
63-
if (LOG_MESSAGES) log(`${port_name} port disconnected.`)
64-
connected = false
67+
if (LOG_MESSAGES) log(`${place_name_here}-${place_name_conn} port disconnected.`)
6568
listeners = {}
66-
port.onMessage.removeListener(onMessage)
69+
_port.onMessage.removeListener(onMessage)
70+
port = null
6771
})
6872

6973
function onMessage(e: any) {
@@ -92,16 +96,20 @@ export function createPortMessanger<
9296
port.onMessage.addListener(onMessage)
9397

9498
return {
95-
postPortMessage: (name, details?: any) => {
96-
if (!connected) return
97-
port.postMessage({name, details})
99+
post: (name, details?: any) => {
100+
if (!port) {
101+
error(`Trying to post ${String(name)} message to disconnected port ${place_name_here}-${place_name_conn}`)
102+
} else {
103+
port.postMessage({name, details})
104+
}
98105
},
99-
onPortMessage: (...args: [any, any] | [any]) => {
106+
on: (...args: [any, any] | [any]) => {
100107

101108
let name = typeof args[0] === 'string' ? args[0] : '*'
102109
let handler = typeof args[0] === 'string' ? args[1] : args[0]
103110

104-
if (!connected) {
111+
if (!port) {
112+
error(`Trying to listen to disconnected port ${place_name_here}-${place_name_conn}`)
105113
return () => {/**/}
106114
}
107115

@@ -110,7 +118,7 @@ export function createPortMessanger<
110118

111119
return () => (listeners[name] = arr.filter(l => l !== handler) as any)
112120
},
113-
onForwardMessage(handler) {
121+
onForward(handler) {
114122
forwardHandler = handler
115123
},
116124
}

0 commit comments

Comments
 (0)