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  }