diff --git a/cloudflare/socket/dialer.go b/cloudflare/socket/dialer.go new file mode 100644 index 0000000..3fc6696 --- /dev/null +++ b/cloudflare/socket/dialer.go @@ -0,0 +1,52 @@ +package socket + +import ( + "context" + "net" + "syscall/js" + + "github.com/syumai/workers/cloudflare/internal/cfruntimecontext" + "github.com/syumai/workers/internal/jsutil" +) + +type Dialer struct { + connect js.Value + opts *SocketOptions + ctx context.Context +} + +type SocketOptions struct { + SecureTransport string `json:"secureTransport"` + AllowHalfOpen bool `json:"allowHalfOpen"` +} + +// NewDialer +func NewDialer(ctx context.Context, options *SocketOptions) (*Dialer, error) { + connect, err := cfruntimecontext.GetRuntimeContextValue(ctx, "connect") + if err != nil { + return nil, err + } + return &Dialer{connect: connect, opts: options, ctx: ctx}, nil +} + +func (d *Dialer) Dial(ctx context.Context, network, addr string) (net.Conn, error) { + switch network { + case "tcp": + default: + panic("not implemented") + } + optionsObj := jsutil.NewObject() + if d.opts != nil { + if d.opts.AllowHalfOpen { + optionsObj.Set("allowHalfOpen", true) + } + if d.opts.SecureTransport != "" { + optionsObj.Set("secureTransport", d.opts.SecureTransport) + } + } + sock := &TCPSocket{} + sock.socket = d.connect.Invoke(addr, optionsObj) + sock.options = d.opts + sock.init(d.ctx) + return sock, nil +} diff --git a/cloudflare/socket/socket.go b/cloudflare/socket/socket.go index 9387e52..32b075a 100644 --- a/cloudflare/socket/socket.go +++ b/cloudflare/socket/socket.go @@ -8,52 +8,9 @@ import ( "syscall/js" "time" - "github.com/syumai/workers/cloudflare/internal/cfruntimecontext" "github.com/syumai/workers/internal/jsutil" ) -type Dialer struct { - connect js.Value - opts *SocketOptions - ctx context.Context -} - -type SocketOptions struct { - SecureTransport string `json:"secureTransport"` - AllowHalfOpen bool `json:"allowHalfOpen"` -} - -// NewDialer -func NewDialer(ctx context.Context, options *SocketOptions) (*Dialer, error) { - connect, err := cfruntimecontext.GetRuntimeContextValue(ctx, "connect") - if err != nil { - return nil, err - } - return &Dialer{connect: connect, opts: options, ctx: ctx}, nil -} - -func (d *Dialer) Dial(ctx context.Context, network, addr string) (net.Conn, error) { - switch network { - case "tcp": - default: - panic("not implemented") - } - optionsObj := jsutil.NewObject() - if d.opts != nil { - if d.opts.AllowHalfOpen { - optionsObj.Set("allowHalfOpen", true) - } - if d.opts.SecureTransport != "" { - optionsObj.Set("secureTransport", d.opts.SecureTransport) - } - } - sock := &TCPSocket{} - sock.socket = d.connect.Invoke(addr, optionsObj) - sock.options = d.opts - sock.init(d.ctx) - return sock, nil -} - func (sock *TCPSocket) init(ctx context.Context) { sock.SetDeadline(time.Now().Add(999999 * time.Hour)) sock.writer = sock.socket.Get("writable").Call("getWriter")