github.com/primecitizens/pcz/std@v0.2.1/plat/js/webext/diagnostics/apis_js_wasm.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright 2023 The Prime Citizens 3 4 package diagnostics 5 6 import ( 7 "github.com/primecitizens/pcz/std/core/abi" 8 "github.com/primecitizens/pcz/std/core/mark" 9 "github.com/primecitizens/pcz/std/ffi/js" 10 "github.com/primecitizens/pcz/std/plat/js/webext/diagnostics/bindings" 11 ) 12 13 type SendPacketCallbackFunc func(this js.Ref, result *SendPacketResult) js.Ref 14 15 func (fn SendPacketCallbackFunc) Register() js.Func[func(result *SendPacketResult)] { 16 return js.RegisterCallback[func(result *SendPacketResult)]( 17 fn, abi.FuncPCABIInternal(fn), 18 ) 19 } 20 21 func (fn SendPacketCallbackFunc) DispatchCallback( 22 targetPC uintptr, ctx *js.CallbackContext, 23 ) { 24 args := ctx.Args() 25 if len(args) != 1+1 /* js this */ || 26 targetPC != uintptr(abi.FuncPCABIInternal(fn)) { 27 js.ThrowInvalidCallbackInvocation() 28 } 29 var arg0 SendPacketResult 30 arg0.UpdateFrom(args[0+1]) 31 defer arg0.FreeMembers(true) 32 33 if ctx.Return(fn( 34 args[0], 35 36 mark.NoEscape(&arg0), 37 )) { 38 return 39 } 40 41 js.ThrowCallbackValueNotReturned() 42 } 43 44 type SendPacketCallback[T any] struct { 45 Fn func(arg T, this js.Ref, result *SendPacketResult) js.Ref 46 Arg T 47 } 48 49 func (cb *SendPacketCallback[T]) Register() js.Func[func(result *SendPacketResult)] { 50 return js.RegisterCallback[func(result *SendPacketResult)]( 51 cb, abi.FuncPCABIInternal(cb.Fn), 52 ) 53 } 54 55 func (cb *SendPacketCallback[T]) DispatchCallback( 56 targetPC uintptr, ctx *js.CallbackContext, 57 ) { 58 args := ctx.Args() 59 if len(args) != 1+1 /* js this */ || 60 targetPC != uintptr(abi.FuncPCABIInternal(cb.Fn)) { 61 js.ThrowInvalidCallbackInvocation() 62 } 63 var arg0 SendPacketResult 64 arg0.UpdateFrom(args[0+1]) 65 defer arg0.FreeMembers(true) 66 67 if ctx.Return(cb.Fn( 68 cb.Arg, 69 args[0], 70 71 mark.NoEscape(&arg0), 72 )) { 73 return 74 } 75 76 js.ThrowCallbackValueNotReturned() 77 } 78 79 type SendPacketResult struct { 80 // Ip is "SendPacketResult.ip" 81 // 82 // Optional 83 Ip js.String 84 // Latency is "SendPacketResult.latency" 85 // 86 // Optional 87 // 88 // NOTE: FFI_USE_Latency MUST be set to true to make this field effective. 89 Latency float64 90 91 FFI_USE_Latency bool // for Latency. 92 93 FFI_USE bool 94 } 95 96 // FromRef calls UpdateFrom and returns a SendPacketResult with all fields set. 97 func (p SendPacketResult) FromRef(ref js.Ref) SendPacketResult { 98 p.UpdateFrom(ref) 99 return p 100 } 101 102 // New creates a new SendPacketResult in the application heap. 103 func (p SendPacketResult) New() js.Ref { 104 return bindings.SendPacketResultJSLoad( 105 js.Pointer(&p), js.True, 0, 106 ) 107 } 108 109 // UpdateFrom copies value of all fields of the heap object to p. 110 func (p *SendPacketResult) UpdateFrom(ref js.Ref) { 111 bindings.SendPacketResultJSStore( 112 js.Pointer(p), ref, 113 ) 114 } 115 116 // Update writes all fields of the p to the heap object referenced by ref. 117 func (p *SendPacketResult) Update(ref js.Ref) { 118 bindings.SendPacketResultJSLoad( 119 js.Pointer(p), js.False, ref, 120 ) 121 } 122 123 // FreeMembers frees fields with heap reference, if recursive is true 124 // free all heap references reachable from p. 125 func (p *SendPacketResult) FreeMembers(recursive bool) { 126 js.Free( 127 p.Ip.Ref(), 128 ) 129 p.Ip = p.Ip.FromRef(js.Undefined) 130 } 131 132 type SendPacketOptions struct { 133 // Ip is "SendPacketOptions.ip" 134 // 135 // Optional 136 Ip js.String 137 // Ttl is "SendPacketOptions.ttl" 138 // 139 // Optional 140 // 141 // NOTE: FFI_USE_Ttl MUST be set to true to make this field effective. 142 Ttl int32 143 // Timeout is "SendPacketOptions.timeout" 144 // 145 // Optional 146 // 147 // NOTE: FFI_USE_Timeout MUST be set to true to make this field effective. 148 Timeout int32 149 // Size is "SendPacketOptions.size" 150 // 151 // Optional 152 // 153 // NOTE: FFI_USE_Size MUST be set to true to make this field effective. 154 Size int32 155 156 FFI_USE_Ttl bool // for Ttl. 157 FFI_USE_Timeout bool // for Timeout. 158 FFI_USE_Size bool // for Size. 159 160 FFI_USE bool 161 } 162 163 // FromRef calls UpdateFrom and returns a SendPacketOptions with all fields set. 164 func (p SendPacketOptions) FromRef(ref js.Ref) SendPacketOptions { 165 p.UpdateFrom(ref) 166 return p 167 } 168 169 // New creates a new SendPacketOptions in the application heap. 170 func (p SendPacketOptions) New() js.Ref { 171 return bindings.SendPacketOptionsJSLoad( 172 js.Pointer(&p), js.True, 0, 173 ) 174 } 175 176 // UpdateFrom copies value of all fields of the heap object to p. 177 func (p *SendPacketOptions) UpdateFrom(ref js.Ref) { 178 bindings.SendPacketOptionsJSStore( 179 js.Pointer(p), ref, 180 ) 181 } 182 183 // Update writes all fields of the p to the heap object referenced by ref. 184 func (p *SendPacketOptions) Update(ref js.Ref) { 185 bindings.SendPacketOptionsJSLoad( 186 js.Pointer(p), js.False, ref, 187 ) 188 } 189 190 // FreeMembers frees fields with heap reference, if recursive is true 191 // free all heap references reachable from p. 192 func (p *SendPacketOptions) FreeMembers(recursive bool) { 193 js.Free( 194 p.Ip.Ref(), 195 ) 196 p.Ip = p.Ip.FromRef(js.Undefined) 197 } 198 199 // HasFuncSendPacket returns true if the function "WEBEXT.diagnostics.sendPacket" exists. 200 func HasFuncSendPacket() bool { 201 return js.True == bindings.HasFuncSendPacket() 202 } 203 204 // FuncSendPacket returns the function "WEBEXT.diagnostics.sendPacket". 205 func FuncSendPacket() (fn js.Func[func(options SendPacketOptions) js.Promise[SendPacketResult]]) { 206 bindings.FuncSendPacket( 207 js.Pointer(&fn), 208 ) 209 return 210 } 211 212 // SendPacket calls the function "WEBEXT.diagnostics.sendPacket" directly. 213 func SendPacket(options SendPacketOptions) (ret js.Promise[SendPacketResult]) { 214 bindings.CallSendPacket( 215 js.Pointer(&ret), 216 js.Pointer(&options), 217 ) 218 219 return 220 } 221 222 // TrySendPacket calls the function "WEBEXT.diagnostics.sendPacket" 223 // in a try/catch block and returns (_, err, ok = false) when it went through 224 // the catch clause. 225 func TrySendPacket(options SendPacketOptions) (ret js.Promise[SendPacketResult], exception js.Any, ok bool) { 226 ok = js.True == bindings.TrySendPacket( 227 js.Pointer(&ret), js.Pointer(&exception), 228 js.Pointer(&options), 229 ) 230 231 return 232 }