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