/
socket.js
61 lines (52 loc) · 1.3 KB
/
socket.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// eslint-disable-next-line
import {
onSnapshot,
applySnapshot,
onPatch,
applyPatch,
onAction,
applyAction
} from "mobx-state-tree"
let subscription
export default function syncStoreWithBackend(socket, store) {
// === SYNC PATCHES (recommended)
subscription = onPatch(store, (data) => {
socketSend(data)
})
onSocketMessage((data) => {
applyPatch(store, data)
})
// === SYNC ACTIONS
// subscription = onAction(store, data => {
// socketSend(data)
// })
// onSocketMessage(data => {
// applyAction(store, data)
// })
// === SYNC SNAPSNOTS
// subscription = onSnapshot(store, (data) => {
// socketSend(data)
// })
// onSocketMessage((data) => {
// applySnapshot(store, data)
// })
let isHandlingMessage = false
function socketSend(data) {
if (!isHandlingMessage) socket.send(JSON.stringify(data))
}
function onSocketMessage(handler) {
socket.onmessage = (event) => {
isHandlingMessage = true
handler(JSON.parse(event.data))
isHandlingMessage = false
}
}
}
/**
* Clean up old subscription when switching communication system
*/
if (module.hot) {
module.hot.dispose((data) => {
subscription()
})
}