Skip to content

Commit 2a9c683

Browse files
feat(overmind-devtools): single port connection
BREAKING CHANGE: remove devtools option to connect to default port
1 parent fe3ffc2 commit 2a9c683

File tree

28 files changed

+217
-347
lines changed

28 files changed

+217
-347
lines changed

packages/demos/react-todomvc/src/app/actions.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ import * as operations from './operations'
22
import * as mutations from './mutations'
33

44
export const changeNewTodoTitle = (action) =>
5-
action.map(operations.getEventValue).mutate(mutations.setNewTodoTitle)
5+
action
6+
.map(operations.getEventValue)
7+
.mutate(mutations.setNewTodoTitle)
8+
.when(() => true, {
9+
true: (action) => action.run(() => {}).map(() => null),
10+
false: (action) => action.run(() => {}),
11+
})
612

713
export const addTodo = (action) =>
814
action

packages/demos/react-todomvc/src/app/index.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,11 @@ import * as effects from './effects'
44
import * as actions from './actions'
55
import * as state from './state'
66

7-
const app = new App(
8-
{
9-
state,
10-
actions,
11-
effects,
12-
},
13-
{
14-
devtools: 'localhost:1234',
15-
}
16-
)
7+
const app = new App({
8+
state,
9+
actions,
10+
effects,
11+
})
1712

1813
export const connect = createConnect(app)
1914

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import { derive } from 'overmind'
2-
31
export const todos = []
42

5-
export const count = derive((state) => state.todos.length)
3+
export const count = (state) => state.todos.length
64

75
export let newTodoTitle = ''

packages/demos/react-typescript-todomvc/src/app/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ declare module 'overmind' {
1515
interface IEffects extends TEffects<typeof config> {}
1616
}
1717

18-
const app = new App(config, {
19-
devtools: 'localhost:1234',
20-
})
18+
const app = new App(config)
2119

2220
export type Connect = TConnect<typeof app>
2321

packages/node_modules/overmind-devtools/backend/ConnectionManager.js

Lines changed: 16 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,62 +3,37 @@ const WebSocketServer = require('ws').Server
33
class ConnectionManager {
44
constructor(mainWindow) {
55
this.mainWindow = mainWindow
6-
this.clients = {}
7-
6+
this.connect = this.connect.bind(this)
87
this.onDevtoolsMessage = this.onDevtoolsMessage.bind(this)
9-
this.onAddPort = this.onAddPort.bind(this)
10-
this.onRemovePort = this.onRemovePort.bind(this)
8+
this.onConnection = this.onConnection.bind(this)
9+
this.onError = this.onError.bind(this)
1110
}
12-
addClient(port, client) {
13-
const onConnection = this.onConnection.bind(this, port)
14-
const onError = this.onError.bind(this, port)
15-
16-
this.clients[port] = {
17-
wss: client,
18-
dispose() {
19-
client.removeListener('connection', onConnection)
20-
client.removeListener('error', onError)
21-
client.close()
22-
},
23-
}
24-
25-
this.clients[port].wss.on('connection', onConnection)
26-
this.clients[port].wss.on('error', onError)
27-
this.mainWindow.webContents.send('port:added', port)
11+
onError() {
12+
this.mainWindow.webContents.send('port:exists')
2813
}
29-
onError(port) {
30-
this.mainWindow.webContents.send('port:exists', port)
14+
onConnection(ws) {
15+
this.ws = ws
16+
this.ws.on('message', this.onAppMessage.bind(this))
3117
}
32-
onConnection(port, ws) {
33-
this.clients[port].ws = ws
34-
ws.on('message', this.onAppMessage.bind(this, port))
35-
}
36-
onAppMessage(port, message) {
18+
onAppMessage(message) {
3719
const parsedMessage = JSON.parse(message)
38-
this.mainWindow.webContents.send('message', {
39-
port,
40-
message: parsedMessage,
41-
})
20+
this.mainWindow.webContents.send('message', parsedMessage)
4221
}
4322
onDevtoolsMessage(_, payload) {
4423
if (!this.clients[payload.port] || !this.clients[payload.port].ws) {
4524
return
4625
}
4726

48-
this.clients[payload.port].ws.send(JSON.stringify(payload))
27+
this.ws.send(JSON.stringify(payload))
4928
}
50-
onAddPort(_, port) {
51-
if (this.clients[port]) {
52-
this.mainWindow.webContents.send('port:added', port)
29+
connect(_, port) {
30+
if (this.wss) {
5331
return
5432
}
5533

56-
this.addClient(port, new WebSocketServer({ port: Number(port) }))
57-
}
58-
onRemovePort(_, port) {
59-
this.clients[port].dispose()
60-
61-
delete this.clients[port]
34+
this.wss = new WebSocketServer({ port: Number(port) })
35+
this.wss.on('connection', this.onConnection)
36+
this.wss.on('error', this.onError)
6237
}
6338
}
6439

packages/node_modules/overmind-devtools/backend/main.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ function createWindow() {
8383
})
8484

8585
electron.ipcMain.on('message', connectionManager.onDevtoolsMessage)
86-
electron.ipcMain.on('port:add', connectionManager.onAddPort)
87-
electron.ipcMain.on('port:remove', connectionManager.onRemovePort)
86+
electron.ipcMain.on('connect', connectionManager.connect)
8887
}
8988

9089
// This method will be called when Electron has finished

packages/node_modules/overmind-devtools/src/BackendConnector.ts

Lines changed: 22 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,45 @@
11
import { ipcRenderer } from 'electron'
2+
import { AppMessage } from './app/types'
23

34
type Message = {
4-
type: string
5-
port: string
5+
appName: string
6+
messages: AppMessage[]
67
}
78

8-
type MessageCallback = (error: Error, message?: Message) => void
9+
type MessageCallback = (message: Message) => void
910

10-
class Port {
11+
class BackendConnector {
1112
port: string
1213
messageCallback: MessageCallback
13-
connector: BackendConnector
14-
connectionResolver: Function
15-
connectionRejecter: Function
16-
constructor(
17-
connector: BackendConnector,
18-
port: string,
19-
messageCallback: MessageCallback
20-
) {
21-
this.port = port
22-
this.messageCallback = messageCallback
23-
this.connector = connector
24-
ipcRenderer.on('port:added', this.onPortAdded)
14+
constructor() {
2515
ipcRenderer.on('port:exists', this.onPortExists)
2616
}
27-
connect() {
28-
return new Promise((resolve, reject) => {
29-
this.connectionResolver = resolve
30-
this.connectionRejecter = reject
31-
ipcRenderer.send('port:add', this.port)
32-
})
33-
}
34-
equals(port: string) {
35-
return this.port === port
36-
}
37-
onPortAdded = (_, addedPort) => {
38-
if (addedPort === this.port) {
39-
ipcRenderer.on('message', this.onMessage)
40-
this.connector.sendMessage(this.port, 'ping')
41-
}
42-
}
43-
onPortExists = (_, port) => {
44-
if (port === this.port) {
45-
this.connectionRejecter(
46-
new Error('Something running on this port already')
47-
)
48-
}
17+
connect(port: string, messageCallback: MessageCallback) {
18+
this.messageCallback = messageCallback
19+
ipcRenderer.send('connect', port)
20+
ipcRenderer.on('message', this.onMessage)
4921
}
5022
onMessage = (_, message) => {
51-
if (message.port !== this.port) {
52-
return
53-
}
54-
55-
if (message.type === 'ping') {
56-
this.connector.sendMessage(this.port, 'pong')
57-
return this.connectionResolver()
58-
}
59-
6023
this.messageCallback(message)
6124
}
62-
destroy() {
63-
ipcRenderer.removeListener('port:added', this.onPortAdded)
64-
ipcRenderer.removeListener('port:exists', this.onPortExists)
65-
ipcRenderer.removeListener('message', this.onMessage)
66-
}
67-
}
68-
69-
class BackendConnector {
70-
addedPorts: Port[] = []
71-
getPort(port: string) {
72-
return this.addedPorts.find((portInstance) => portInstance.port === port)
25+
onPortExists = (_) => {
26+
this.messageCallback({
27+
appName: null,
28+
messages: [
29+
{
30+
type: 'PORT_EXISTS',
31+
data: null,
32+
},
33+
],
34+
})
7335
}
74-
sendMessage(port: string, eventName: string, payload: object = null) {
36+
sendMessage(appName: string, eventName: string, payload: object = null) {
7537
ipcRenderer.send('message', {
76-
port,
38+
appName,
7739
type: eventName,
7840
data: payload,
7941
})
8042
}
81-
addPort(port: string, messageCallback: MessageCallback) {
82-
if (this.addedPorts.find((portInstance) => portInstance.port === port)) {
83-
return
84-
}
85-
86-
const portInstance = new Port(this, port, messageCallback)
87-
88-
portInstance.connect()
89-
this.addedPorts.push(portInstance)
90-
}
91-
removePort(portToRemove: string) {
92-
const port = this.getPort(portToRemove)
93-
port.destroy()
94-
this.addedPorts.splice(this.addedPorts.indexOf(port), 1)
95-
ipcRenderer.send('port:remove', portToRemove)
96-
}
9743
relaunch() {
9844
ipcRenderer.send('relaunch')
9945
}

packages/node_modules/overmind-devtools/src/app/actions.ts

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,26 @@ import * as mutations from './mutations'
33
import * as operations from './operations'
44
import { Message, Tab } from './types'
55

6-
const onMessage: Action<Message> = (action) =>
6+
const handleClientMessages: Action<Message> = (action) =>
77
action
8+
.mutate(mutations.ensureCurrentApp)
89
.mutate(mutations.performMutationsByMessageType)
910
.mutate(mutations.addMessagesFromClient)
1011

12+
const setPortExists: Action<Message> = (action) =>
13+
action.mutate(mutations.setPortExists)
14+
15+
const onMessage: Action<Message> = (action) =>
16+
action.when(operations.isPortExistsMessage, {
17+
true: setPortExists,
18+
false: handleClientMessages,
19+
})
20+
1121
export const loadDevtools: Action = (action) =>
12-
// .do(({ storage }) => storage.clear())
13-
// Do a check if the current app matches the keys of the ???
1422
action
15-
.map(operations.getAppsFromStorage)
16-
.mutate(mutations.setApps)
23+
// .run(({ storage }) => storage.clear())
1724
.map(operations.getCurrentPortFromStorage)
18-
.mutate(mutations.setCurrentPort)
19-
.mutate(mutations.setAppLoaded)
25+
.mutate(mutations.setPort)
2026
.run(operations.connectCurrentPort(onMessage(action as any)))
2127

2228
export const setError: Action<string> = ({ mutate }) =>
@@ -25,13 +31,12 @@ export const setError: Action<string> = ({ mutate }) =>
2531
export const changeNewPortValue: Action<string> = (action) =>
2632
action.map(operations.toNumber).mutate(mutations.setNewPortValue)
2733

28-
export const addPort: Action = (action) =>
34+
export const addConnection: Action = (action) =>
2935
action
36+
.mutate(mutations.setConnecting)
3037
.map(operations.getNewPortFromState)
31-
.mutate(mutations.setCurrentPort)
32-
.mutate(mutations.addNewApp)
38+
.mutate(mutations.setPort)
3339
.mutate(mutations.resetNewPortValue)
34-
.run(operations.storeApps)
3540
.run(operations.connectCurrentPort(onMessage))
3641

3742
export const changeTab: Action<Tab> = ({ mutate }) =>
@@ -52,24 +57,8 @@ export const toggleCollapsed: Action<Collapsed> = (action) =>
5257
.filter(operations.isNotExpandingAllActions)
5358
.mutate(mutations.toggleCollapsed)
5459

55-
export const configurePort: Action = ({ mutate }) =>
56-
mutate(mutations.configurePort)
57-
58-
export const cancelConfigurePort: Action = ({ mutate }) =>
59-
mutate(mutations.cancelConfigurePort)
60-
61-
export const removeApp: Action = (action) =>
62-
action
63-
.filter(operations.confirm('Are you sure you want to remove the app?'))
64-
.run(operations.removeCurrentPort)
65-
.mutate(mutations.removeApp)
66-
.run(operations.storeApps)
67-
.run(operations.connectCurrentPort(onMessage(action as any)))
68-
69-
export const selectPort: Action<string> = (action) =>
70-
action
71-
.mutate(mutations.selectPort)
72-
.run(operations.connectCurrentPort(onMessage(action as any)))
60+
export const selectApp: Action<string> = (action) =>
61+
action.mutate(mutations.selectApp)
7362

7463
export const toggleExpandAllActions: Action = ({ mutate }) =>
7564
mutate(mutations.toggleExpandAllActions)

packages/node_modules/overmind-devtools/src/app/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ declare module 'overmind' {
1515
interface IEffects extends TEffects<typeof config> {}
1616
}
1717

18-
const app = new App(config)
18+
const app = new App(config, {
19+
devtools: false,
20+
})
1921

2022
export type Connect = TConnect<typeof app>
2123

0 commit comments

Comments
 (0)