ext_wasm.mx raw

   1  //:build wasm
   2  
   3  package ext
   4  
   5  import (
   6  	"git.smesh.lol/musiquay/web/common/jsbridge/callback"
   7  	"unsafe"
   8  )
   9  
  10  //:wasmimport bridge ext_storage_get
  11  func wasmStorageGet(kPtr *byte, kLen int32, kCap int32, cbID int32)
  12  
  13  //:wasmimport bridge ext_storage_set
  14  func wasmStorageSet(kPtr *byte, kLen int32, kCap int32, vPtr *byte, vLen int32, vCap int32)
  15  
  16  //:wasmimport bridge ext_storage_remove
  17  func wasmStorageRemove(kPtr *byte, kLen int32, kCap int32)
  18  
  19  //:wasmimport bridge ext_on_message
  20  func wasmOnMessage(cbID int32)
  21  
  22  //:wasmimport bridge ext_send_message_to_tab
  23  func wasmSendMessageToTab(tabID int32, msgPtr *byte, msgLen int32, msgCap int32)
  24  
  25  //:wasmimport bridge ext_get_active_tab
  26  func wasmGetActiveTab(cbID int32)
  27  
  28  //:wasmimport bridge ext_console_log
  29  func wasmConsoleLog(ptr *byte, length int32, capacity int32)
  30  
  31  //:wasmimport bridge ext_session_get
  32  func wasmSessionGet(kPtr *byte, kLen int32, kCap int32, cbID int32)
  33  
  34  //:wasmimport bridge ext_session_set
  35  func wasmSessionSet(kPtr *byte, kLen int32, kCap int32, vPtr *byte, vLen int32, vCap int32)
  36  
  37  //:wasmimport bridge ext_is_in_page
  38  func wasmIsInPage() (n int32)
  39  
  40  //:wasmimport bridge ext_on_message_respond
  41  func wasmOnMessageRespond(reqID int32, ptr *byte, length int32, capacity int32)
  42  
  43  //:wasmimport bridge signer_signal_ready
  44  func wasmSignalReady()
  45  
  46  // SignalReady tells the host that asynchronous boot work (e.g. vault load)
  47  // has completed and the signer is safe to receive method calls. The host
  48  // queues all method calls before this signal arrives.
  49  func SignalReady() { wasmSignalReady() }
  50  
  51  func StorageGet(key string, fn func(string)) {
  52  	wasmStorageGet(unsafe.StringData(key), int32(len(key)), int32(len(key)), callback.RegisterSOnce(fn))
  53  }
  54  
  55  func StorageSet(key, value string) {
  56  	wasmStorageSet(
  57  		unsafe.StringData(key), int32(len(key)), int32(len(key)),
  58  		unsafe.StringData(value), int32(len(value)), int32(len(value)),
  59  	)
  60  }
  61  
  62  func StorageRemove(key string) {
  63  	wasmStorageRemove(unsafe.StringData(key), int32(len(key)), int32(len(key)))
  64  }
  65  
  66  // extState holds the bridge's mutable state. Package globals are immutable
  67  // outside init, so the handler and the in-flight request id live in a
  68  // self-mutating type and are written through its methods.
  69  type extState struct {
  70  	onMessage func(string, string, int32, func(string))
  71  	reqID     int32
  72  }
  73  
  74  var st *extState
  75  
  76  func (s *extState) SetHandler(fn func(string, string, int32, func(string))) { s.onMessage = fn }
  77  func (s *extState) Handler() (fn func(string, string, int32, func(string)))  { return s.onMessage }
  78  func (s *extState) SetReqID(id int32)                                       { s.reqID = id }
  79  func (s *extState) ReqID() (id int32)                                       { return s.reqID }
  80  
  81  func OnMessage(fn func(string, string, int32, func(string))) {
  82  	st.SetHandler(fn)
  83  	wasmOnMessage(0)
  84  }
  85  
  86  //:wasmexport __hook_ext_on_message
  87  func hookExtOnMessage(reqID int32, methodPtr *byte, methodLen int32, paramsPtr *byte, paramsLen int32, tabID int32) {
  88  	fn := st.Handler()
  89  	if fn == nil {
  90  		return
  91  	}
  92  	st.SetReqID(reqID)
  93  	method := ptrToString(methodPtr, methodLen)
  94  	params := ptrToString(paramsPtr, paramsLen)
  95  	fn(method, params, tabID, respondPending)
  96  }
  97  
  98  func respondPending(resp string) {
  99  	wasmOnMessageRespond(st.ReqID(), unsafe.StringData(resp), int32(len(resp)), int32(len(resp)))
 100  }
 101  
 102  func SendMessageToTab(tabID int32, msg string) {
 103  	wasmSendMessageToTab(tabID, unsafe.StringData(msg), int32(len(msg)), int32(len(msg)))
 104  }
 105  
 106  func GetActiveTab(fn func(int32, string)) {
 107  	wasmGetActiveTab(callback.RegisterISOnce(fn))
 108  }
 109  
 110  func ConsoleLog(msg string) {
 111  	wasmConsoleLog(unsafe.StringData(msg), int32(len(msg)), int32(len(msg)))
 112  }
 113  
 114  func SessionGet(key string, fn func(string)) {
 115  	wasmSessionGet(unsafe.StringData(key), int32(len(key)), int32(len(key)), callback.RegisterSOnce(fn))
 116  }
 117  
 118  func SessionSet(key, value string) {
 119  	wasmSessionSet(
 120  		unsafe.StringData(key), int32(len(key)), int32(len(key)),
 121  		unsafe.StringData(value), int32(len(value)), int32(len(value)),
 122  	)
 123  }
 124  
 125  func IsInPage() (ok bool) {
 126  	return wasmIsInPage() != 0
 127  }
 128  
 129  func ptrToString(ptr *byte, length int32) (s string) {
 130  	if ptr == nil || length <= 0 {
 131  		return ""
 132  	}
 133  	return unsafe.String(ptr, length)
 134  }
 135  
 136  func init() {
 137  	st = &extState{}
 138  }
 139