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