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  }