ext_wasm.mx raw

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