package main // Store Worker - owns the 'smesh' IndexedDB (events + DMs + MLS). // // Wire format: JSON-array strings over postMessage. // supervisor -> worker (fire-and-forget): // ["S_PUT_EVENT", evJSON] // ["S_ENC_KEY", hexKey] // supervisor -> worker (request-response): // ["S_QUERY", reqID, filterJSON] // ["S_SAVE_DM", reqID, dmJSON] // ["S_DM_LIST", reqID] // ["S_DM_HISTORY", reqID, peer, limit, until] // ["S_MLS_SAVE_GROUP", reqID, groupIDHex, stateBase64] // ["S_MLS_LOAD_GROUP", reqID, groupIDHex] // ["S_MLS_SAVE_KPP", reqID, kppBase64] // ["S_MLS_LOAD_KPP", reqID] // ["S_MLS_LIST_GROUPS", reqID] // ["S_KV_GET", reqID, storeName, key] // ["S_KV_PUT", storeName, key, value] (fire-and-forget) // ["S_KV_GETALL", reqID, storeName] // worker -> supervisor (responses): // ["SR_READY"] // ["SR_QUERY", reqID, eventsJSON] // ["SR_SAVE_DM", reqID, result] // ["SR_DM_LIST", reqID, listJSON] // ["SR_DM_HISTORY", reqID, msgsJSON] // ["SR_MLS_SAVE_GROUP", reqID, "ok"] // ["SR_MLS_LOAD_GROUP", reqID, stateBase64] // ["SR_MLS_SAVE_KPP", reqID, "ok"] // ["SR_MLS_LOAD_KPP", reqID, kppBase64] // ["SR_MLS_LIST_GROUPS", reqID, groupsJSON] // ["SR_KV_GET", reqID, value] // ["SR_KV_GETALL_ITEM", reqID, key, value] // ["SR_KV_GETALL_DONE", reqID] import ( "git.smesh.lol/smesh/web/common/helpers" "git.smesh.lol/smesh/web/common/jsbridge/idb" "git.smesh.lol/smesh/web/common/jsbridge/store" "git.smesh.lol/smesh/web/common/mw" ) func main() { store.WorkerOnMessage(handleMessage) idb.Open(func() { store.WorkerPost(`["SR_READY"]`) }) } func handleMessage(msg string) { w := mw.New(msg) switch w.Str() { case "S_PUT_EVENT": evJSON := w.Raw() idb.SaveEvent(evJSON, func(bool) {}) case "S_ENC_KEY": hexKey := w.Str() idb.SetEncKey(hexKey) case "S_QUERY": reqID := w.Num() filterJSON := w.Raw() rID := reqID idb.QueryEvents(filterJSON, func(eventsJSON string) { store.WorkerPost(`["SR_QUERY",` | helpers.Itoa(rID) | `,` | eventsJSON | `]`) }) case "S_SAVE_DM": reqID := w.Num() dmJSON := w.Raw() rID := reqID idb.SaveDM(dmJSON, func(result string) { store.WorkerPost(`["SR_SAVE_DM",` | helpers.Itoa(rID) | `,` | jstr(result) | `]`) }) case "S_DM_LIST": reqID := w.Num() rID := reqID idb.GetConversationList(func(listJSON string) { store.WorkerPost(`["SR_DM_LIST",` | helpers.Itoa(rID) | `,` | listJSON | `]`) }) case "S_DM_HISTORY": reqID := w.Num() peer := w.Str() limit := int32(w.Num()) until := w.Num() if limit <= 0 || limit > 500 { limit = 50 } rID := reqID p := peer idb.QueryDMs(peer, limit, until, func(msgsJSON string) { store.WorkerPost(`["SR_DM_HISTORY",` | helpers.Itoa(rID) | `,` | jstr(p) | `,` | msgsJSON | `]`) }) case "S_MLS_SAVE_GROUP": reqID := w.Num() groupID := w.Str() state := w.Str() rID := reqID idb.MlsSaveGroup(groupID, state, func() { store.WorkerPost(`["SR_MLS_SAVE_GROUP",` | helpers.Itoa(rID) | `,"ok"]`) }) case "S_MLS_LOAD_GROUP": reqID := w.Num() groupID := w.Str() rID := reqID idb.MlsLoadGroup(groupID, func(state string) { store.WorkerPost(`["SR_MLS_LOAD_GROUP",` | helpers.Itoa(rID) | `,` | jstr(state) | `]`) }) case "S_MLS_SAVE_KPP": reqID := w.Num() kpp := w.Str() rID := reqID idb.MlsSaveKPP(kpp, func() { store.WorkerPost(`["SR_MLS_SAVE_KPP",` | helpers.Itoa(rID) | `,"ok"]`) }) case "S_MLS_LOAD_KPP": reqID := w.Num() rID := reqID idb.MlsLoadKPP(func(kpp string) { store.WorkerPost(`["SR_MLS_LOAD_KPP",` | helpers.Itoa(rID) | `,` | jstr(kpp) | `]`) }) case "S_MLS_LIST_GROUPS": reqID := w.Num() rID := reqID idb.MlsListGroups(func(groupsJSON string) { store.WorkerPost(`["SR_MLS_LIST_GROUPS",` | helpers.Itoa(rID) | `,` | groupsJSON | `]`) }) case "S_KV_GET": reqID := w.Num() storeName := w.Str() key := w.Str() rID := reqID idb.KVGet(storeName, key, func(val string) { store.WorkerPost(`["SR_KV_GET",` | helpers.Itoa(rID) | `,` | jstr(val) | `]`) }) case "S_KV_PUT": storeName := w.Str() key := w.Str() val := w.Str() idb.KVPut(storeName, key, val) case "S_KV_GETALL": reqID := w.Num() storeName := w.Str() rID := reqID idb.KVGetAll(storeName, func(key, val string) { store.WorkerPost(`["SR_KV_GETALL_ITEM",` | helpers.Itoa(rID) | `,` | jstr(key) | `,` | jstr(val) | `]`) }, func() { store.WorkerPost(`["SR_KV_GETALL_DONE",` | helpers.Itoa(rID) | `]`) }) } } func jstr(s string) (sv string) { return helpers.JsonString(s) }