main.mx raw
1 package main
2
3 // Store Worker - owns the 'smesh' IndexedDB (events + DMs + MLS).
4 //
5 // Wire format: JSON-array strings over postMessage.
6 // supervisor -> worker (fire-and-forget):
7 // ["S_PUT_EVENT", evJSON]
8 // ["S_ENC_KEY", hexKey]
9 // supervisor -> worker (request-response):
10 // ["S_QUERY", reqID, filterJSON]
11 // ["S_SAVE_DM", reqID, dmJSON]
12 // ["S_DM_LIST", reqID]
13 // ["S_DM_HISTORY", reqID, peer, limit, until]
14 // ["S_MLS_SAVE_GROUP", reqID, groupIDHex, stateBase64]
15 // ["S_MLS_LOAD_GROUP", reqID, groupIDHex]
16 // ["S_MLS_SAVE_KPP", reqID, kppBase64]
17 // ["S_MLS_LOAD_KPP", reqID]
18 // ["S_MLS_LIST_GROUPS", reqID]
19 // ["S_KV_GET", reqID, storeName, key]
20 // ["S_KV_PUT", storeName, key, value] (fire-and-forget)
21 // ["S_KV_GETALL", reqID, storeName]
22 // worker -> supervisor (responses):
23 // ["SR_READY"]
24 // ["SR_QUERY", reqID, eventsJSON]
25 // ["SR_SAVE_DM", reqID, result]
26 // ["SR_DM_LIST", reqID, listJSON]
27 // ["SR_DM_HISTORY", reqID, msgsJSON]
28 // ["SR_MLS_SAVE_GROUP", reqID, "ok"]
29 // ["SR_MLS_LOAD_GROUP", reqID, stateBase64]
30 // ["SR_MLS_SAVE_KPP", reqID, "ok"]
31 // ["SR_MLS_LOAD_KPP", reqID, kppBase64]
32 // ["SR_MLS_LIST_GROUPS", reqID, groupsJSON]
33 // ["SR_KV_GET", reqID, value]
34 // ["SR_KV_GETALL_ITEM", reqID, key, value]
35 // ["SR_KV_GETALL_DONE", reqID]
36
37 import (
38 "git.smesh.lol/smesh/web/common/helpers"
39 "git.smesh.lol/smesh/web/common/jsbridge/idb"
40 "git.smesh.lol/smesh/web/common/jsbridge/store"
41 "git.smesh.lol/smesh/web/common/mw"
42 )
43
44 func main() {
45 store.WorkerOnMessage(handleMessage)
46 idb.Open(func() {
47 store.WorkerPost(`["SR_READY"]`)
48 })
49 }
50
51 func handleMessage(msg string) {
52 w := mw.New(msg)
53 switch w.Str() {
54 case "S_PUT_EVENT":
55 evJSON := w.Raw()
56 idb.SaveEvent(evJSON, func(bool) {})
57 case "S_ENC_KEY":
58 hexKey := w.Str()
59 idb.SetEncKey(hexKey)
60 case "S_QUERY":
61 reqID := w.Num()
62 filterJSON := w.Raw()
63 rID := reqID
64 idb.QueryEvents(filterJSON, func(eventsJSON string) {
65 store.WorkerPost(`["SR_QUERY",` | helpers.Itoa(rID) | `,` | eventsJSON | `]`)
66 })
67 case "S_SAVE_DM":
68 reqID := w.Num()
69 dmJSON := w.Raw()
70 rID := reqID
71 idb.SaveDM(dmJSON, func(result string) {
72 store.WorkerPost(`["SR_SAVE_DM",` | helpers.Itoa(rID) | `,` | jstr(result) | `]`)
73 })
74 case "S_DM_LIST":
75 reqID := w.Num()
76 rID := reqID
77 idb.GetConversationList(func(listJSON string) {
78 store.WorkerPost(`["SR_DM_LIST",` | helpers.Itoa(rID) | `,` | listJSON | `]`)
79 })
80 case "S_DM_HISTORY":
81 reqID := w.Num()
82 peer := w.Str()
83 limit := int32(w.Num())
84 until := w.Num()
85 if limit <= 0 || limit > 500 {
86 limit = 50
87 }
88 rID := reqID
89 p := peer
90 idb.QueryDMs(peer, limit, until, func(msgsJSON string) {
91 store.WorkerPost(`["SR_DM_HISTORY",` | helpers.Itoa(rID) | `,` | jstr(p) | `,` | msgsJSON | `]`)
92 })
93 case "S_MLS_SAVE_GROUP":
94 reqID := w.Num()
95 groupID := w.Str()
96 state := w.Str()
97 rID := reqID
98 idb.MlsSaveGroup(groupID, state, func() {
99 store.WorkerPost(`["SR_MLS_SAVE_GROUP",` | helpers.Itoa(rID) | `,"ok"]`)
100 })
101 case "S_MLS_LOAD_GROUP":
102 reqID := w.Num()
103 groupID := w.Str()
104 rID := reqID
105 idb.MlsLoadGroup(groupID, func(state string) {
106 store.WorkerPost(`["SR_MLS_LOAD_GROUP",` | helpers.Itoa(rID) | `,` | jstr(state) | `]`)
107 })
108 case "S_MLS_SAVE_KPP":
109 reqID := w.Num()
110 kpp := w.Str()
111 rID := reqID
112 idb.MlsSaveKPP(kpp, func() {
113 store.WorkerPost(`["SR_MLS_SAVE_KPP",` | helpers.Itoa(rID) | `,"ok"]`)
114 })
115 case "S_MLS_LOAD_KPP":
116 reqID := w.Num()
117 rID := reqID
118 idb.MlsLoadKPP(func(kpp string) {
119 store.WorkerPost(`["SR_MLS_LOAD_KPP",` | helpers.Itoa(rID) | `,` | jstr(kpp) | `]`)
120 })
121 case "S_MLS_LIST_GROUPS":
122 reqID := w.Num()
123 rID := reqID
124 idb.MlsListGroups(func(groupsJSON string) {
125 store.WorkerPost(`["SR_MLS_LIST_GROUPS",` | helpers.Itoa(rID) | `,` | groupsJSON | `]`)
126 })
127 case "S_KV_GET":
128 reqID := w.Num()
129 storeName := w.Str()
130 key := w.Str()
131 rID := reqID
132 idb.KVGet(storeName, key, func(val string) {
133 store.WorkerPost(`["SR_KV_GET",` | helpers.Itoa(rID) | `,` | jstr(val) | `]`)
134 })
135 case "S_KV_PUT":
136 storeName := w.Str()
137 key := w.Str()
138 val := w.Str()
139 idb.KVPut(storeName, key, val)
140 case "S_KV_GETALL":
141 reqID := w.Num()
142 storeName := w.Str()
143 rID := reqID
144 idb.KVGetAll(storeName, func(key, val string) {
145 store.WorkerPost(`["SR_KV_GETALL_ITEM",` | helpers.Itoa(rID) | `,` | jstr(key) | `,` | jstr(val) | `]`)
146 }, func() {
147 store.WorkerPost(`["SR_KV_GETALL_DONE",` | helpers.Itoa(rID) | `]`)
148 })
149 }
150 }
151
152 func jstr(s string) (sv string) { return helpers.JsonString(s) }
153