github.com/primecitizens/pcz/std@v0.2.1/plat/js/webext/dns/apis_js_wasm.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright 2023 The Prime Citizens 3 4 package dns 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/dns/bindings" 11 ) 12 13 type ResolveCallbackFunc func(this js.Ref, resolveInfo *ResolveCallbackResolveInfo) js.Ref 14 15 func (fn ResolveCallbackFunc) Register() js.Func[func(resolveInfo *ResolveCallbackResolveInfo)] { 16 return js.RegisterCallback[func(resolveInfo *ResolveCallbackResolveInfo)]( 17 fn, abi.FuncPCABIInternal(fn), 18 ) 19 } 20 21 func (fn ResolveCallbackFunc) 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 ResolveCallbackResolveInfo 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 ResolveCallback[T any] struct { 45 Fn func(arg T, this js.Ref, resolveInfo *ResolveCallbackResolveInfo) js.Ref 46 Arg T 47 } 48 49 func (cb *ResolveCallback[T]) Register() js.Func[func(resolveInfo *ResolveCallbackResolveInfo)] { 50 return js.RegisterCallback[func(resolveInfo *ResolveCallbackResolveInfo)]( 51 cb, abi.FuncPCABIInternal(cb.Fn), 52 ) 53 } 54 55 func (cb *ResolveCallback[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 ResolveCallbackResolveInfo 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 ResolveCallbackResolveInfo struct { 80 // ResultCode is "ResolveCallbackResolveInfo.resultCode" 81 // 82 // Optional 83 // 84 // NOTE: FFI_USE_ResultCode MUST be set to true to make this field effective. 85 ResultCode int32 86 // Address is "ResolveCallbackResolveInfo.address" 87 // 88 // Optional 89 Address js.String 90 91 FFI_USE_ResultCode bool // for ResultCode. 92 93 FFI_USE bool 94 } 95 96 // FromRef calls UpdateFrom and returns a ResolveCallbackResolveInfo with all fields set. 97 func (p ResolveCallbackResolveInfo) FromRef(ref js.Ref) ResolveCallbackResolveInfo { 98 p.UpdateFrom(ref) 99 return p 100 } 101 102 // New creates a new ResolveCallbackResolveInfo in the application heap. 103 func (p ResolveCallbackResolveInfo) New() js.Ref { 104 return bindings.ResolveCallbackResolveInfoJSLoad( 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 *ResolveCallbackResolveInfo) UpdateFrom(ref js.Ref) { 111 bindings.ResolveCallbackResolveInfoJSStore( 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 *ResolveCallbackResolveInfo) Update(ref js.Ref) { 118 bindings.ResolveCallbackResolveInfoJSLoad( 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 *ResolveCallbackResolveInfo) FreeMembers(recursive bool) { 126 js.Free( 127 p.Address.Ref(), 128 ) 129 p.Address = p.Address.FromRef(js.Undefined) 130 } 131 132 // HasFuncResolve returns true if the function "WEBEXT.dns.resolve" exists. 133 func HasFuncResolve() bool { 134 return js.True == bindings.HasFuncResolve() 135 } 136 137 // FuncResolve returns the function "WEBEXT.dns.resolve". 138 func FuncResolve() (fn js.Func[func(hostname js.String) js.Promise[ResolveCallbackResolveInfo]]) { 139 bindings.FuncResolve( 140 js.Pointer(&fn), 141 ) 142 return 143 } 144 145 // Resolve calls the function "WEBEXT.dns.resolve" directly. 146 func Resolve(hostname js.String) (ret js.Promise[ResolveCallbackResolveInfo]) { 147 bindings.CallResolve( 148 js.Pointer(&ret), 149 hostname.Ref(), 150 ) 151 152 return 153 } 154 155 // TryResolve calls the function "WEBEXT.dns.resolve" 156 // in a try/catch block and returns (_, err, ok = false) when it went through 157 // the catch clause. 158 func TryResolve(hostname js.String) (ret js.Promise[ResolveCallbackResolveInfo], exception js.Any, ok bool) { 159 ok = js.True == bindings.TryResolve( 160 js.Pointer(&ret), js.Pointer(&exception), 161 hostname.Ref(), 162 ) 163 164 return 165 }