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