Skip to content

Commit 4effefa

Browse files
committed
Simplify TabData class slightly
and report errors when cs is not connected
1 parent 5931162 commit 4effefa

File tree

1 file changed

+55
-64
lines changed

1 file changed

+55
-64
lines changed

packages/extension/background/background.ts

Lines changed: 55 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ import * as icons from '../shared/icons.ts'
1313
log(bridge.Place_Name.Background+' loaded.')
1414

1515
type TabDataConfig = {
16-
toContent: TabData['toContent']
17-
fromContent: TabData['fromContent']
18-
forwardToDevtools: TabData['forwardToDevtools']
19-
forwardToClient: TabData['forwardToClient']
16+
toContent: bridge.PostMessageFn
17+
fromContent: bridge.OnMessageFn
18+
forwardToDevtools: (fn: (message: bridge.ForwardPayload) => void) => void
19+
forwardToClient: (message: bridge.ForwardPayload) => void
2020
}
2121

2222
type PostMessanger = {post: bridge.PostMessageFn; on: bridge.OnMessageFn}
@@ -29,32 +29,22 @@ class EventBus<T> extends Set<(payload: T) => void> {
2929
}
3030

3131
class TabData {
32-
public connected = true
3332

34-
private disconnectBus = new EventBus()
35-
private connectListeners = new Set<
33+
disconnectBus = new EventBus()
34+
connectListeners = new Set<
3635
(toContent: bridge.PostMessageFn, fromContent: bridge.OnMessageFn) => void
3736
>()
3837

39-
private toContent: bridge.PostMessageFn
40-
private fromContent: bridge.OnMessageFn
41-
public forwardToDevtools: (fn: (message: bridge.ForwardPayload) => void) => void
42-
public forwardToClient: (message: bridge.ForwardPayload) => void
43-
4438
constructor(
4539
public tabId: number,
46-
config: TabDataConfig,
47-
) {
48-
this.toContent = config.toContent
49-
this.fromContent = config.fromContent
50-
this.forwardToDevtools = config.forwardToDevtools
51-
this.forwardToClient = config.forwardToClient
52-
}
40+
// null when not connected with content-script
41+
public config: TabDataConfig | null,
42+
) {}
5343

5444
untilContentScriptConnect(): Promise<PostMessanger> {
5545
return new Promise(resolve => {
56-
if (this.connected) {
57-
resolve({post: this.toContent.bind(this), on: this.fromContent.bind(this)})
46+
if (this.config) {
47+
resolve({post: this.config.toContent.bind(this), on: this.config.fromContent.bind(this)})
5848
} else {
5949
this.connectListeners.add((toContent, fromContent) => {
6050
resolve({post: toContent, on: fromContent})
@@ -64,58 +54,48 @@ class TabData {
6454
}
6555

6656
reconnected(config: TabDataConfig) {
67-
this.toContent = config.toContent
68-
this.fromContent = config.fromContent
69-
this.forwardToDevtools = config.forwardToDevtools
70-
this.forwardToClient = config.forwardToClient
71-
72-
this.connected = true
73-
this.connectListeners.forEach(fn =>
74-
fn(this.toContent.bind(this), this.fromContent.bind(this)),
75-
)
57+
this.config = config
58+
59+
for (let fn of this.connectListeners) {
60+
fn(config.toContent.bind(this), config.fromContent.bind(this))
61+
}
7662
}
7763

7864
onContentScriptDisconnect(fn: VoidFunction): void {
7965
this.disconnectBus.add(fn)
8066
}
8167

8268
disconnected() {
83-
this.connected = false
8469
this.disconnectBus.emit()
8570
this.disconnectBus.clear()
86-
this.forwardToClient = () => {
87-
/**/
88-
}
89-
this.forwardToDevtools = () => {
90-
/**/
91-
}
71+
this.config = null
9272
}
9373

94-
#versions: bridge.Versions | undefined
95-
#versionsBus = new EventBus<bridge.Versions>()
74+
versions: bridge.Versions | undefined
75+
versionsBus = new EventBus<bridge.Versions>()
9676
onVersions(fn: (versions: bridge.Versions) => void) {
97-
if (this.#versions) fn(this.#versions)
98-
else this.#versionsBus.add(fn)
77+
if (this.versions) fn(this.versions)
78+
else this.versionsBus.add(fn)
9979
}
10080
setVersions(versions: bridge.Versions) {
101-
this.#versions = versions
102-
this.#versionsBus.emit(versions)
103-
this.#versionsBus.clear()
81+
this.versions = versions
82+
this.versionsBus.emit(versions)
83+
this.versionsBus.clear()
10484
}
10585

106-
#detected: bridge.DetectionState = {
86+
detected: bridge.DetectionState = {
10787
Solid: false,
10888
SolidDev: false,
10989
Debugger: false,
11090
}
111-
#detectedListeners = new EventBus<bridge.DetectionState>()
91+
detectedListeners = new EventBus<bridge.DetectionState>()
11292
onDetected(fn: (state: bridge.DetectionState) => void) {
113-
fn(this.#detected)
114-
this.#detectedListeners.add(fn)
93+
fn(this.detected)
94+
this.detectedListeners.add(fn)
11595
}
116-
detected(state: bridge.DetectionState) {
117-
this.#detected = state
118-
this.#detectedListeners.emit(state)
96+
set_detected(state: bridge.DetectionState) {
97+
this.detected = state
98+
this.detectedListeners.emit(state)
11999
}
120100
}
121101

@@ -162,7 +142,7 @@ const getActiveTabData = async (): Promise<TabData | Error> => {
162142

163143
// for reconnecting after page reload
164144
let last_disconnected_tab_data: TabData | undefined
165-
let last_disconnected_tab_id: number | undefined
145+
let last_disconnected_tab_id: number | undefined
166146

167147
chrome.runtime.onConnect.addListener(async port => {
168148

@@ -209,7 +189,7 @@ chrome.runtime.onConnect.addListener(async port => {
209189
})
210190

211191
// "DetectSolid" from content-script (realWorld)
212-
content_messanger.onPortMessage('Detected', state => data.detected(state))
192+
content_messanger.onPortMessage('Detected', state => data.set_detected(state))
213193

214194
port.onDisconnect.addListener(() => {
215195
data.disconnected()
@@ -255,6 +235,7 @@ chrome.runtime.onConnect.addListener(async port => {
255235
error(data)
256236
break
257237
}
238+
258239
const panel_messanger = bridge.createPortMessanger(
259240
bridge.Place_Name.Background,
260241
bridge.Place_Name.Panel,
@@ -275,19 +256,29 @@ chrome.runtime.onConnect.addListener(async port => {
275256
panel_messanger.postPortMessage('ResetPanel')
276257
})
277258

278-
/* Force debugger to send state when panel conects */
279-
data.forwardToClient({
280-
name: 'ResetState',
281-
details: undefined,
282-
forwarding: true, // TODO: this shouldn't be a "forward", but not sure how to typesafe send a post to debugger from here
283-
})
259+
if (!data.config) {
260+
error(`No ${bridge.Place_Name.Content_Script} connection when ${bridge.Place_Name.Panel} got connected`)
261+
} else {
262+
/* Force debugger to send state when panel conects */
263+
data.config.forwardToClient({
264+
name: 'ResetState',
265+
details: undefined,
266+
forwarding: true, // TODO: this shouldn't be a "forward", but not sure how to typesafe send a post to debugger from here
267+
})
268+
269+
// Forward messages from Content Script (client) to Panel
270+
data.config.forwardToDevtools(message => {
271+
port.postMessage(message)
272+
})
273+
}
284274

285-
// FORWARD MESSAGES FROM and TO CLIENT
286-
data.forwardToDevtools(message => {
287-
port.postMessage(message)
288-
})
275+
// Forward messages from Panel to Content Script (client)
289276
panel_messanger.onForwardMessage(message => {
290-
data.forwardToClient(message)
277+
if (!data.config) {
278+
error(`Cannot forward message, no ${bridge.Place_Name.Content_Script} connection.`, message)
279+
} else {
280+
data.config.forwardToClient(message)
281+
}
291282
})
292283

293284
break

0 commit comments

Comments
 (0)