From 3bebb48dfb1fdec1c626f46eeea22fffaeb41752 Mon Sep 17 00:00:00 2001 From: Gaukas Wang Date: Wed, 3 Jan 2024 11:39:09 -0700 Subject: [PATCH] =?UTF-8?q?=E2=AD=90=20new:=20pure=20Go=20implementation?= =?UTF-8?q?=20of=20water=20(#18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update: recompile v0 WATM binaries * update: canonical test cases * update: conn wrap logic * feat: WASIConfigFactory -> ModuleConfigFactory * update: wasm runtime independent Core * update: minor change to conn wraps * update: remodel complete Now encountering error. Debugging in progress. * feat: better logging Revisit slog-based logging and add logger-specific logging functions. * update: robustness and QoL Further optimize the implementation and fix bugs. * update: all test passes Update tests to reflect all changes, now all tests passing. * fix: redundant bugfix build constraints Old bugs are gone after switching to pure Go implementation based on wazero, we need no more these debugging flags. * fix: remove redundant go.mod replace directive * improvement: stop set nonblocking by default This change should not break any existing behavior. If the WebAssembly did not explicitly call set_nonblocking or equivalent within, wazero is unaware of the fd is in nonblocking state and will not work in non-blocking mode when serving WASI API. --- config.go | 79 ++- config_test.go | 12 +- core.go | 319 +++++++-- dialer.go | 4 +- examples/v0/plain/dialer/main.go | 10 +- examples/v0/plain/listener/main.go | 6 +- examples/v0/plain/plain.wasm | Bin 2237753 -> 2233038 bytes examples/v0/plain/relay/main.go | 8 +- go.mod | 6 +- go.sum | 16 +- internal/log/default_logger.go | 6 + internal/log/leveled_logging.go | 35 + internal/log/slog.go | 35 - internal/log/slog_alias_go1_21.go | 30 + internal/log/slog_alias_old.go | 30 + internal/log/slog_old.go | 36 - internal/socket/file.go | 46 -- internal/socket/tcpconn.go | 148 +++- internal/socket/tcpconn_test.go | 38 ++ internal/socket/unixconn.go | 218 +++--- internal/system/connhalt_fix_disabled.go | 20 - internal/system/connhalt_fix_enabled.go | 20 - internal/system/gcfix_disabled.go | 13 - internal/system/gcfix_enabled.go | 13 - internal/v0/transport_module.go | 628 ----------------- internal/v0/wasi_net.go | 46 -- internal/wasm/module_config.go | 95 +++ internal/wasm/net.go | 7 - internal/wasm/wasi_config.go | 123 ---- listener.go | 4 +- log.go | 21 + relay.go | 4 +- socket.go | 68 ++ testdata/v0/plain.wasm | Bin 2237753 -> 2233038 bytes testdata/v0/reverse.wasm | Bin 2239990 -> 2230159 bytes transport/v0/conn.go | 41 +- transport/v0/dialer_test.go | 169 ++++- transport/v0/listener_test.go | 171 ++++- {internal => transport}/v0/managed_dialer.go | 0 transport/v0/relay_test.go | 151 ++++- transport/v0/transport_module.go | 679 +++++++++++++++++++ transport_module_config.go | 87 ++- 42 files changed, 2186 insertions(+), 1256 deletions(-) create mode 100644 internal/log/default_logger.go create mode 100644 internal/log/leveled_logging.go delete mode 100644 internal/log/slog.go create mode 100644 internal/log/slog_alias_go1_21.go create mode 100644 internal/log/slog_alias_old.go delete mode 100644 internal/log/slog_old.go delete mode 100644 internal/socket/file.go create mode 100644 internal/socket/tcpconn_test.go delete mode 100644 internal/system/connhalt_fix_disabled.go delete mode 100644 internal/system/connhalt_fix_enabled.go delete mode 100644 internal/system/gcfix_disabled.go delete mode 100644 internal/system/gcfix_enabled.go delete mode 100644 internal/v0/transport_module.go delete mode 100644 internal/v0/wasi_net.go create mode 100644 internal/wasm/module_config.go delete mode 100644 internal/wasm/net.go delete mode 100644 internal/wasm/wasi_config.go create mode 100644 log.go create mode 100644 socket.go rename {internal => transport}/v0/managed_dialer.go (100%) create mode 100644 transport/v0/transport_module.go diff --git a/config.go b/config.go index e5c0b34..dfef5f3 100644 --- a/config.go +++ b/config.go @@ -3,16 +3,22 @@ package water import ( "net" + "github.com/gaukas/water/internal/log" "github.com/gaukas/water/internal/wasm" ) // Config defines the configuration for the WATER Dialer/Config interface. type Config struct { - // TMBin contains the binary format of the WebAssembly Transport Module. - // In a typical use case, this mandatory field is populated by loading - // from a .wasm file, downloaded from a remote target, or generated from + // TransportModuleBin contains the binary format of the WebAssembly + // Transport Module. + // In practice, this mandatory field could be populated by loading + // a .wasm file, downloading from a remote host, or generating from // a .wat (WebAssembly Text Format) file. - TMBin []byte + TransportModuleBin []byte + + // TransportModuleConfig optionally provides a configuration file to be pushed into + // the WASM Transport Module. + TransportModuleConfig TransportModuleConfig // NetworkDialerFunc specifies a func that dials the specified address on the // named network. This optional field can be set to override the Go @@ -23,22 +29,21 @@ type Config struct { // NetworkListener specifies a net.listener implementation that listens // on the specified address on the named network. This optional field // will be used to provide (incoming) network connections from a - // presumably remote source to the WASM instance. Required by - // water.WrapListener(). + // presumably remote source to the WASM instance. + // + // Calling (*Config).Listen will override this field. NetworkListener net.Listener - // TMConfig optionally provides a configuration file to be pushed into - // the WASM Transport Module. - TMConfig TMConfig - - // wasiConfigFactory is used to replicate the WASI config for each WASM - // instance created. This field is for advanced use cases and/or debugging - // purposes only. + // ModuleConfigFactory is used to configure the system resource of + // each WASM instance created. This field is for advanced use cases + // and/or debugging purposes only. // - // Caller is supposed to call c.WASIConfig() to get the pointer to the - // WASIConfigFactory. If the pointer is nil, a new WASIConfigFactory will + // Caller is supposed to call c.ModuleConfig() to get the pointer to the + // ModuleConfigFactory. If the pointer is nil, a new ModuleConfigFactory will // be created and returned. - wasiConfigFactory *wasm.WASIConfigFactory + ModuleConfigFactory *wasm.ModuleConfigFactory + + OverrideLogger *log.Logger // essentially a *slog.Logger, currently using an alias to flatten the version discrepancy } // Clone creates a deep copy of the Config. @@ -47,15 +52,15 @@ func (c *Config) Clone() *Config { return nil } - wasmClone := make([]byte, len(c.TMBin)) - copy(wasmClone, c.TMBin) + wasmClone := make([]byte, len(c.TransportModuleBin)) + copy(wasmClone, c.TransportModuleBin) return &Config{ - TMBin: c.TMBin, - NetworkDialerFunc: c.NetworkDialerFunc, - NetworkListener: c.NetworkListener, - TMConfig: c.TMConfig, - wasiConfigFactory: c.wasiConfigFactory.Clone(), + TransportModuleBin: c.TransportModuleBin, + NetworkDialerFunc: c.NetworkDialerFunc, + NetworkListener: c.NetworkListener, + TransportModuleConfig: c.TransportModuleConfig, + ModuleConfigFactory: c.ModuleConfigFactory.Clone(), } } @@ -81,21 +86,25 @@ func (c *Config) NetworkListenerOrPanic() net.Listener { // WATMBinOrDefault returns the WATMBin if it is not nil, otherwise it panics. func (c *Config) WATMBinOrPanic() []byte { - if len(c.TMBin) == 0 { + if len(c.TransportModuleBin) == 0 { panic("water: WebAssembly Transport Module binary is not provided in config") } - return c.TMBin + return c.TransportModuleBin } -// WASIConfig returns the WASIConfigFactory. If the pointer is -// nil, a new WASIConfigFactory will be created and returned. -func (c *Config) WASIConfig() *wasm.WASIConfigFactory { - if c.wasiConfigFactory == nil { - c.wasiConfigFactory = wasm.NewWasiConfigFactory() +// ModuleConfig returns the ModuleConfigFactory. If the pointer is +// nil, a new ModuleConfigFactory will be created and returned. +func (c *Config) ModuleConfig() *wasm.ModuleConfigFactory { + if c.ModuleConfigFactory == nil { + c.ModuleConfigFactory = wasm.NewModuleConfigFactory() + + // by default, stdout and stderr are inherited + c.ModuleConfigFactory.InheritStdout() + c.ModuleConfigFactory.InheritStderr() } - return c.wasiConfigFactory + return c.ModuleConfigFactory } func (c *Config) Listen(network, address string) (Listener, error) { @@ -109,3 +118,11 @@ func (c *Config) Listen(network, address string) (Listener, error) { return NewListener(config) } + +func (c *Config) Logger() *log.Logger { + if c.OverrideLogger != nil { + return c.OverrideLogger + } + + return log.GetDefaultLogger() +} diff --git a/config_test.go b/config_test.go index 074b936..46c356b 100644 --- a/config_test.go +++ b/config_test.go @@ -11,15 +11,13 @@ import ( func TestConfigClone(t *testing.T) { c := &water.Config{ - TMBin: make([]byte, 256), - NetworkDialerFunc: nil, // functions aren't deeply equal unless nil - NetworkListener: &net.TCPListener{}, - TMConfig: water.TMConfig{ - FilePath: "/tmp/watm.toml", - }, + TransportModuleBin: make([]byte, 256), + NetworkDialerFunc: nil, // functions aren't deeply equal unless nil + NetworkListener: &net.TCPListener{}, + TransportModuleConfig: water.TransportModuleConfigFromBytes([]byte("foo")), } - _, err := rand.Read(c.TMBin) + _, err := rand.Read(c.TransportModuleBin) if err != nil { t.Fatalf("rand.Read error: %v", err) } diff --git a/core.go b/core.go index b43211c..9ce104e 100644 --- a/core.go +++ b/core.go @@ -1,26 +1,118 @@ package water import ( + "context" "fmt" + "net" + "os" + "sync" - "github.com/bytecodealliance/wasmtime-go/v13" + "github.com/gaukas/water/internal/log" + "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" ) // Core provides the low-level access to the WebAssembly runtime // environment. -// -// Currently it depends on the wasmtime-go API, but it is subject to -// change in the future. type Core interface { + // Config returns the Config used to create the Core. + // + // Practically, this function is not supposed to be used + // to retrieve the Config to be used for creating another + // Core. Instead, it is used to retrieve the Config for + // inspection/debugging purposes. Config() *Config - Engine() *wasmtime.Engine - Instance() *wasmtime.Instance - Linker() *wasmtime.Linker - Module() *wasmtime.Module - Store() *wasmtime.Store + + // Context returns the base context used by the Core. + Context() context.Context + + // Close closes the Core and releases all the resources + // associated with it. + Close() error + + // Exports dumps all the exported functions and globals which + // are provided by the WebAssembly module. + // + // This function returns a map of export name to the type of + // the export. + Exports() map[string]api.ExternType + + // ExportedFunction returns the exported function with the + // given name. If no function with the given name is exported, + // this function returns nil. + // + // It is caller's responsibility to ensure that the function + // returned has the correct signature, which can be checked + // by inspecting the returned api.Function.Definition(). + ExportedFunction(name string) api.Function + + // Imports dumps all the imported functions and globals which + // are required to be provided by the host environment to + // instantiate the WebAssembly module. + // + // This function returns a map of module name to a map of + // import name to the type of the import. + ImportedFunctions() map[string]map[string]api.FunctionDefinition + + // ImportFunction imports a function into the WebAssembly module. + // + // The f argument must be a function with the signature matching + // the signature of the function to be imported. Otherwise, the + // behavior of the WebAssembly Transport Module after initialization + // is undefined. + // + // This function can be called ONLY BEFORE calling Instantiate(). + ImportFunction(module, name string, f any) error + + // InsertConn inserts a net.Conn into the WebAssembly Transport + // Module and returns the key of the inserted connection as a + // file descriptor accessible from the WebAssembly instance. + // + // This function SHOULD be called only if the WebAssembly instance + // execution is blocked/halted/stopped. Otherwise, race conditions + // or undefined behaviors may occur. + InsertConn(conn net.Conn) (fd int32, err error) + + // InsertListener inserts a net.Listener into the WebAssembly + // Transport Module and returns the key of the inserted listener + // as a file descriptor accessible from the WebAssembly instance. + // + // This function SHOULD be called only if the WebAssembly instance + // execution is blocked/halted/stopped. Otherwise, race conditions + // or undefined behaviors may occur. + InsertListener(tcpListener net.Listener) (fd int32, err error) + + // InsertFile inserts a file into the WebAssembly Transport Module + // and returns the key of the inserted file as a file descriptor + // accessible from the WebAssembly instance. + // + // This function SHOULD be called only if the WebAssembly instance + // execution is blocked/halted/stopped. Otherwise, race conditions + // or undefined behaviors may occur. + InsertFile(osFile *os.File) (fd int32, err error) + + // Instantiate instantiates the module into a new instance of + // WebAssembly Transport Module. Instantiate() error + + // Invoke invokes a function in the WebAssembly instance. + // + // If the target function is not exported, this function returns an error. + Invoke(funcName string, params ...uint64) (results []uint64, err error) + + // WASIPreview1 enables the WASI preview1 API. + // + // It is recommended that this function only to be invoked if + // the WATM expects the WASI preview1 API to be available. + WASIPreview1() error + + Logger() *log.Logger } +// type guard +var _ Core = (*core)(nil) + // core provides the WASM runtime base and is an internal struct // that every RuntimeXxx implementation will embed. // @@ -36,12 +128,20 @@ type core struct { // config config *Config - // wasmtime - engine *wasmtime.Engine - module *wasmtime.Module - store *wasmtime.Store // avoid directly accessing store once the instance is created - linker *wasmtime.Linker - instance *wasmtime.Instance + ctx context.Context + runtime wazero.Runtime + module wazero.CompiledModule + instance api.Module + + // saved after Exports() is called + exportsLoadOnce sync.Once + exports map[string]api.ExternType + + // saved after ImportedFunctions() is called + importedFuncsLoadOnce sync.Once + importedFuncs map[string]map[string]api.FunctionDefinition + + importModules map[string]wazero.HostModuleBuilder } // NewCore creates a new Core with the given config. @@ -49,65 +149,188 @@ type core struct { // It uses the default implementation of interface.Core as // defined in this file. func NewCore(config *Config) (Core, error) { + return NewCoreWithContext(context.Background(), config) +} + +func NewCoreWithContext(ctx context.Context, config *Config) (Core, error) { + var err error + c := &core{ - config: config, + config: config, + importModules: make(map[string]wazero.HostModuleBuilder), } - wasiConfig, err := c.config.WASIConfig().GetConfig() - if err != nil { - err = fmt.Errorf("water: (*WasiConfigFactory).GetConfig returned error: %w", err) - return nil, err - } + c.ctx = ctx + c.runtime = wazero.NewRuntime(ctx) - c.engine = wasmtime.NewEngine() - c.module, err = wasmtime.NewModule(c.engine, c.config.WATMBinOrPanic()) - if err != nil { - err = fmt.Errorf("water: wasmtime.NewModule returned error: %w", err) - return nil, err - } - c.store = wasmtime.NewStore(c.engine) - c.store.SetWasiConfig(wasiConfig) - c.linker = wasmtime.NewLinker(c.engine) - err = c.linker.DefineWasi() - if err != nil { - err = fmt.Errorf("water: (*wasmtime.Linker).DefineWasi returned error: %w", err) - return nil, err + if c.module, err = c.runtime.CompileModule(ctx, c.config.WATMBinOrPanic()); err != nil { + return nil, fmt.Errorf("water: (*Runtime).CompileModule returned error: %w", err) } return c, nil } -// Config returns the Config used to create the Core. +// Config implements Core. func (c *core) Config() *Config { return c.config } -func (c *core) Engine() *wasmtime.Engine { - return c.engine +// Context implements Core. +func (c *core) Context() context.Context { + return c.ctx } -func (c *core) Instance() *wasmtime.Instance { - return c.instance +// Close implements Core. +func (c *core) Close() error { + if c.instance != nil { + if err := c.instance.Close(c.ctx); err != nil { + return fmt.Errorf("water: (*wazero/api.Module).Close returned error: %w", err) + } + } + + if c.runtime != nil { + if err := c.runtime.Close(c.ctx); err != nil { + return fmt.Errorf("water: (*wazero.Runtime).Close returned error: %w", err) + } + } + + return nil } -func (c *core) Linker() *wasmtime.Linker { - return c.linker +// Exports implements Core. +func (c *core) Exports() map[string]api.ExternType { + c.exportsLoadOnce.Do(func() { + c.exports = c.module.AllExports() + }) + + return c.exports +} + +// ExportedFunction implements Core. +func (c *core) ExportedFunction(name string) api.Function { + if c.instance == nil { + return nil + } + + return c.instance.ExportedFunction(name) } -func (c *core) Module() *wasmtime.Module { - return c.module +// ImportedFunctions implements Core. +func (c *core) ImportedFunctions() map[string]map[string]api.FunctionDefinition { + c.importedFuncsLoadOnce.Do(func() { + importedFuncs := c.module.ImportedFunctions() + + c.importedFuncs = make(map[string]map[string]api.FunctionDefinition) + for _, importedFunc := range importedFuncs { + mod, name, ok := importedFunc.Import() + if !ok { + continue + } + + if _, ok := c.importedFuncs[mod]; !ok { + c.importedFuncs[mod] = make(map[string]api.FunctionDefinition) + } + c.importedFuncs[mod][name] = importedFunc + } + }) + + return c.importedFuncs } -func (c *core) Store() *wasmtime.Store { - return c.store +// ImportFunction implements Core. +func (c *core) ImportFunction(module, name string, f any) error { + if c.instance != nil { + return fmt.Errorf("water: cannot import function after instantiation") + } + + // Unsafe: check if the WebAssembly module really imports this function under + // the given module and name. If not, we warn and skip the import. + if mod, ok := c.ImportedFunctions()[module]; !ok { + log.LWarnf(c.config.Logger(), "water: module %s is not imported, skipping...", module) + + // list all the imported modules + for mod := range c.ImportedFunctions() { + log.LWarnf(c.config.Logger(), "water: module %s is imported", mod) + } + + return nil + } else if _, ok := mod[name]; !ok { + log.LWarnf(c.config.Logger(), "water: function %s.%s is not imported, skipping...", module, name) + return nil + } + + if _, ok := c.importModules[module]; !ok { + c.importModules[module] = c.runtime.NewHostModuleBuilder(module) + } + + // We don't do this: + // + // _, err := c.importModules[module].NewFunctionBuilder().WithFunc(f).Export(name).Instantiate(c.ctx) + // if err != nil { + // log.LErrorf(c.config.Logger(), "water: (*wazero.HostModuleBuilder).NewFunctionBuilder returned error: %v", err) + // } + // + // Instead we do not instantiate the function here, but wait until Instantiate() is called. + c.importModules[module] = c.importModules[module].NewFunctionBuilder().WithFunc(f).Export(name) + + // TODO: return an error if the function already exists or the + // module/function name is invalid. + return nil } +// Instantiate implements Core. func (c *core) Instantiate() error { - instance, err := c.linker.Instantiate(c.store, c.module) + if c.instance != nil { + return fmt.Errorf("water: double instantiation is not allowed") + } + + moduleConfig, err := c.config.ModuleConfigFactory.GetConfig() if err != nil { - return fmt.Errorf("water: (*wasmtime.Linker).Instantiate returned error: %w", err) + return fmt.Errorf("water: (*RuntimeConfigFactory).GetConfig returned error: %w", err) + } + + // Instantiate the imported functions + for _, moduleBuilder := range c.importModules { + if _, err := moduleBuilder.Instantiate(c.ctx); err != nil { + return fmt.Errorf("water: (*wazero.HostModuleBuilder).Instantiate returned error: %w", err) + } + } + + if c.instance, err = c.runtime.InstantiateModule(c.ctx, c.module, moduleConfig); err != nil { + return fmt.Errorf("water: (*Runtime).InstantiateWithConfig returned error: %w", err) } - c.instance = instance return nil } + +// Invoke implements Core. +func (c *core) Invoke(funcName string, params ...uint64) (results []uint64, err error) { + if c.instance == nil { + return nil, fmt.Errorf("water: cannot invoke function before instantiation") + } + + expFunc := c.instance.ExportedFunction(funcName) + if expFunc == nil { + return nil, fmt.Errorf("water: function %q is not exported", funcName) + } + + results, err = expFunc.Call(c.ctx, params...) + if err != nil { + return nil, fmt.Errorf("water: (*wazero.ExportedFunction).Call returned error: %w", err) + } + + return +} + +// WASIPreview1 implements Core. +func (c *core) WASIPreview1() error { + if _, err := wasi_snapshot_preview1.Instantiate(c.ctx, c.runtime); err != nil { + return fmt.Errorf("water: wazero/imports/wasi_snapshot_preview1.Instantiate returned error: %w", err) + } + return nil +} + +// Logger implements Core. +func (c *core) Logger() *log.Logger { + return c.config.Logger() +} diff --git a/dialer.go b/dialer.go index 3113044..3832d16 100644 --- a/dialer.go +++ b/dialer.go @@ -82,8 +82,8 @@ func NewDialer(c *Config) (Dialer, error) { // // TODO: detect the version of the WebAssembly Transport Module // in a more organized way. - for _, export := range core.Module().Exports() { - if f, ok := knownDialerVersions[export.Name()]; ok { + for exportName := range core.Exports() { + if f, ok := knownDialerVersions[exportName]; ok { return f(c) } } diff --git a/examples/v0/plain/dialer/main.go b/examples/v0/plain/dialer/main.go index fdd4466..07a6f1e 100644 --- a/examples/v0/plain/dialer/main.go +++ b/examples/v0/plain/dialer/main.go @@ -25,13 +25,13 @@ func main() { // start using W.A.T.E.R. API below this line, have fun! config := &water.Config{ - TMBin: wasm, - NetworkDialerFunc: net.Dial, // optional field, defaults to net.Dial + TransportModuleBin: wasm, + NetworkDialerFunc: net.Dial, // optional field, defaults to net.Dial } // configuring the standard out of the WebAssembly instance to inherit // from the parent process - config.WASIConfig().InheritStdout() - config.WASIConfig().InheritStderr() + config.ModuleConfig().InheritStdout() + config.ModuleConfig().InheritStderr() dialer, err := water.NewDialer(config) if err != nil { @@ -60,7 +60,7 @@ func handleConn(peer string, conn net.Conn) { defer close(chanMsgRecv) buf := make([]byte, 1024) // 1 KiB for { - conn.SetReadDeadline(time.Now().Add(5 * time.Second)) + // conn.SetReadDeadline(time.Now().Add(5 * time.Second)) n, err := conn.Read(buf) if err != nil { log.Warnf("read %s: error %v, tearing down connection...", peer, err) diff --git a/examples/v0/plain/listener/main.go b/examples/v0/plain/listener/main.go index 7131903..35f9101 100644 --- a/examples/v0/plain/listener/main.go +++ b/examples/v0/plain/listener/main.go @@ -25,13 +25,13 @@ func main() { // start using W.A.T.E.R. API below this line, have fun! config := &water.Config{ - TMBin: wasm, + TransportModuleBin: wasm, // NetworkDialerFunc: net.Dial, // optional field, defaults to net.Dial } // configuring the standard out of the WebAssembly instance to inherit // from the parent process - config.WASIConfig().InheritStdout() - config.WASIConfig().InheritStderr() + config.ModuleConfig().InheritStdout() + config.ModuleConfig().InheritStderr() lis, err := config.Listen("tcp", localAddr) if err != nil { diff --git a/examples/v0/plain/plain.wasm b/examples/v0/plain/plain.wasm index ebeeb6c9a5f26be4245b378f7266bed240c6c518..375787fb8b603fd7e0fd33e5bfebaafd6d2b32f5 100644 GIT binary patch delta 118806 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 diff --git a/examples/v0/plain/relay/main.go b/examples/v0/plain/relay/main.go index 51ccc62..ecf4b16 100644 --- a/examples/v0/plain/relay/main.go +++ b/examples/v0/plain/relay/main.go @@ -23,13 +23,13 @@ func main() { // start using W.A.T.E.R. API below this line, have fun! config := &water.Config{ - TMBin: wasm, - NetworkDialerFunc: net.Dial, // optional field, defaults to net.Dial + TransportModuleBin: wasm, + NetworkDialerFunc: net.Dial, // optional field, defaults to net.Dial } // configuring the standard out of the WebAssembly instance to inherit // from the parent process - config.WASIConfig().InheritStdout() - config.WASIConfig().InheritStderr() + config.ModuleConfig().InheritStdout() + config.ModuleConfig().InheritStderr() relay, err := water.NewRelay(config) if err != nil { diff --git a/go.mod b/go.mod index 3408f57..05a425c 100644 --- a/go.mod +++ b/go.mod @@ -2,9 +2,9 @@ module github.com/gaukas/water go 1.20 -replace github.com/bytecodealliance/wasmtime-go/v13 v13.0.0 => github.com/refraction-networking/wasmtime-go/v13 v13.0.0 +replace github.com/tetratelabs/wazero v1.6.0 => github.com/gaukas/wazero v1.6.0-w require ( - github.com/bytecodealliance/wasmtime-go/v13 v13.0.0 - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 + github.com/tetratelabs/wazero v1.6.0 + golang.org/x/exp v0.0.0-20231226003508-02704c960a9b ) diff --git a/go.sum b/go.sum index f7b1fca..4041965 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,4 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/refraction-networking/wasmtime-go/v13 v13.0.0 h1:5Asz7xwxaRW59P9hTwxKjn5gKjf7BziCX0+Y9CIZJPs= -github.com/refraction-networking/wasmtime-go/v13 v13.0.0/go.mod h1:KmsZLdjjzNH/E5wbfoRehqP70tHzKlfNOi730VCAR4E= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +github.com/gaukas/wazero v1.6.0-w h1:p/BaOcF825jQsvrHJq53SQ5c7PZVko5957xCfO/zm7A= +github.com/gaukas/wazero v1.6.0-w/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= +golang.org/x/exp v0.0.0-20231226003508-02704c960a9b h1:kLiC65FbiHWFAOu+lxwNPujcsl8VYyTYYEZnsOO1WK4= +golang.org/x/exp v0.0.0-20231226003508-02704c960a9b/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= diff --git a/internal/log/default_logger.go b/internal/log/default_logger.go new file mode 100644 index 0000000..18c5fc5 --- /dev/null +++ b/internal/log/default_logger.go @@ -0,0 +1,6 @@ +package log + +// GetLogger returns a pointer to the logger used by the package. +func GetDefaultLogger() *Logger { + return defaultLogger +} diff --git a/internal/log/leveled_logging.go b/internal/log/leveled_logging.go new file mode 100644 index 0000000..90255b4 --- /dev/null +++ b/internal/log/leveled_logging.go @@ -0,0 +1,35 @@ +package log + +import "fmt" + +func Debugf(format string, args ...any) { + defaultLogger.Debug(fmt.Sprintf(format, args...)) +} + +func Infof(format string, args ...any) { + defaultLogger.Info(fmt.Sprintf(format, args...)) +} + +func Warnf(format string, args ...any) { + defaultLogger.Warn(fmt.Sprintf(format, args...)) +} + +func Errorf(format string, args ...any) { + defaultLogger.Error(fmt.Sprintf(format, args...)) +} + +func LDebugf(logger *Logger, format string, args ...any) { + logger.Debug(fmt.Sprintf(format, args...)) +} + +func LInfof(logger *Logger, format string, args ...any) { + logger.Info(fmt.Sprintf(format, args...)) +} + +func LWarnf(logger *Logger, format string, args ...any) { + logger.Warn(fmt.Sprintf(format, args...)) +} + +func LErrorf(logger *Logger, format string, args ...any) { + logger.Error(fmt.Sprintf(format, args...)) +} diff --git a/internal/log/slog.go b/internal/log/slog.go deleted file mode 100644 index c12f3ba..0000000 --- a/internal/log/slog.go +++ /dev/null @@ -1,35 +0,0 @@ -//go:build go1.21 - -package log - -import ( - "fmt" - "log/slog" -) - -var slogger *slog.Logger = slog.Default() - -func ReplaceLogger(logger *slog.Logger) { - slogger = logger -} - -func Debugf(format string, args ...any) { - slogger.Debug(fmt.Sprintf(format, args...)) -} - -func Infof(format string, args ...any) { - slogger.Info(fmt.Sprintf(format, args...)) -} - -func Warnf(format string, args ...any) { - slogger.Warn(fmt.Sprintf(format, args...)) -} - -func Errorf(format string, args ...any) { - slogger.Error(fmt.Sprintf(format, args...)) -} - -func Fatalf(format string, args ...any) { - slogger.Error(fmt.Sprintf(format, args...)) - panic("fatal error occurred") -} diff --git a/internal/log/slog_alias_go1_21.go b/internal/log/slog_alias_go1_21.go new file mode 100644 index 0000000..4f7775a --- /dev/null +++ b/internal/log/slog_alias_go1_21.go @@ -0,0 +1,30 @@ +//go:build go1.21 + +package log + +import ( + "log/slog" +) + +// Logger is an alias for slog.Logger. It is used here to avoid +// importing slog in the rest of the code, since slog needs to be +// imported conditionally based on the Go version. +type Logger = slog.Logger +type Handler = slog.Handler + +var defaultLogger *Logger = slog.Default() + +// SetLogger specifies the logger to be used by the package. +// By default, slog.Default() is used. +// +// It overrides the logger created by SetDefaultHandler. +func SetDefaultLogger(logger *slog.Logger) { + defaultLogger = logger +} + +// SetDefaultHandler specifies the handler to be used by the package. +// +// It overrides the logger specified by SetDefaultLogger. +func SetDefaultHandler(handler slog.Handler) { + defaultLogger = slog.New(handler) +} diff --git a/internal/log/slog_alias_old.go b/internal/log/slog_alias_old.go new file mode 100644 index 0000000..8b63059 --- /dev/null +++ b/internal/log/slog_alias_old.go @@ -0,0 +1,30 @@ +//go:build !go1.21 + +package log + +import ( + "golang.org/x/exp/slog" +) + +// Logger is an alias for slog.Logger. It is used here to avoid +// importing slog in the rest of the code, since slog needs to be +// imported conditionally based on the Go version. +type Logger = slog.Logger +type Handler = slog.Handler + +var defaultLogger *Logger = slog.Default() + +// SetLogger specifies the logger to be used by the package. +// By default, slog.Default() is used. +// +// It overrides the logger created by SetDefaultHandler. +func SetDefaultLogger(logger *slog.Logger) { + defaultLogger = logger +} + +// SetDefaultHandler specifies the handler to be used by the package. +// +// It overrides the logger specified by SetDefaultLogger. +func SetDefaultHandler(handler slog.Handler) { + defaultLogger = slog.New(handler) +} diff --git a/internal/log/slog_old.go b/internal/log/slog_old.go deleted file mode 100644 index 1825d95..0000000 --- a/internal/log/slog_old.go +++ /dev/null @@ -1,36 +0,0 @@ -//go:build !go1.21 - -package log - -import ( - "fmt" - - "golang.org/x/exp/slog" -) - -var slogger *slog.Logger = slog.Default() - -func ReplaceLogger(logger *slog.Logger) { - slogger = logger -} - -func Debugf(format string, args ...any) { - slogger.Debug(fmt.Sprintf(format, args...)) -} - -func Infof(format string, args ...any) { - slogger.Info(fmt.Sprintf(format, args...)) -} - -func Warnf(format string, args ...any) { - slogger.Warn(fmt.Sprintf(format, args...)) -} - -func Errorf(format string, args ...any) { - slogger.Error(fmt.Sprintf(format, args...)) -} - -func Fatalf(format string, args ...any) { - slogger.Error(fmt.Sprintf(format, args...)) - panic("fatal error occurred") -} diff --git a/internal/socket/file.go b/internal/socket/file.go deleted file mode 100644 index d9ba54f..0000000 --- a/internal/socket/file.go +++ /dev/null @@ -1,46 +0,0 @@ -package socket - -import ( - "errors" - "fmt" - "io" - "os" - - "github.com/gaukas/water/internal/log" -) - -// ErrNoKnownConversion is returned when the given object cannot be converted to *os.File -var ErrNoKnownConversion = errors.New("no known conversion to *os.File") - -// EmbedFile is an interface for objects that can be converted to *os.File -type EmbedFile interface { - File() (*os.File, error) -} - -// AsFile converts the given object to *os.File -func AsFile(f any) (*os.File, error) { - switch f := f.(type) { - case *os.File: - log.Debugf("%T is already *os.File", f) - return f, nil - // Anything implementing EmbedFile interface, including: - // - *net.TCPConn - // - *net.UDPConn - // - *net.UnixConn - // - *net.TCPListener - // - *net.UnixListener - case EmbedFile: - log.Debugf("%T has implemented File() (*os.File, error)", f) - return f.File() - case io.ReadWriteCloser: // and also net.Conn - log.Debugf("%T implements only ReadWriteCloser and needs wrapping", f) - unixConn, err := UnixConnWrap(f) - if err != nil { - return nil, err - } - return unixConn.File() - default: - log.Debugf("%T has no known conversion to *os.File", f) - return nil, fmt.Errorf("%T: %w", f, ErrNoKnownConversion) - } -} diff --git a/internal/socket/tcpconn.go b/internal/socket/tcpconn.go index 541294f..6cb6594 100644 --- a/internal/socket/tcpconn.go +++ b/internal/socket/tcpconn.go @@ -1,18 +1,29 @@ package socket import ( + "context" "fmt" + "io" "net" + "os" "sync" + + "github.com/gaukas/water/internal/log" ) -func TCPConnPair(address ...string) (c1, c2 net.Conn, err error) { - var tcpAddr string = ":0" +// TCPConnPair returns a pair of connected net.TCPConn. +func TCPConnPair(address ...string) (c1, c2 *net.TCPConn, err error) { + var addr string = ":0" if len(address) > 0 && address[0] != "" { - tcpAddr = address[0] + addr = address[0] + } + + tcpAddr, err := net.ResolveTCPAddr("tcp", addr) + if err != nil { + return nil, nil, fmt.Errorf("net.ResolveTCPAddr returned error: %w", err) } - l, err := net.Listen("tcp", tcpAddr) // skipcq: GSC-G102 + l, err := net.ListenTCP("tcp", tcpAddr) // skipcq: GSC-G102 if err != nil { return nil, nil, fmt.Errorf("net.Listen returned error: %w", err) } @@ -22,10 +33,10 @@ func TCPConnPair(address ...string) (c1, c2 net.Conn, err error) { wg.Add(1) go func() { defer wg.Done() - c2, goroutineErr = l.Accept() + c2, goroutineErr = l.AcceptTCP() }() - c1, err = net.Dial("tcp", l.Addr().String()) + c1, err = net.DialTCP("tcp", nil, l.Addr().(*net.TCPAddr)) if err != nil { return nil, nil, fmt.Errorf("net.Dial returned error: %w", err) } @@ -41,3 +52,128 @@ func TCPConnPair(address ...string) (c1, c2 net.Conn, err error) { return c1, c2, l.Close() } + +// TCPConnWrap wraps an io.Reader/io.Writer/io.Closer +// interface into a TCPConn. +// +// This function spins up goroutine(s) to copy data between the +// ReadWrite(Close)r and the TCPConn. Anything written to the +// TCPConn by caller will be written to the wrapped object if +// the object implements io.Writer, and if the object implements +// io.Reader, anything read by goroutine from the wrapped object +// will be readable from the TCPConn by caller. +// +// Once this function is invoked, the caller should not perform I/O +// operations on the wrapped connection anymore. +// +// The returned context.Context can be used to check if the connection +// is still alive. If the connection is closed, the context will be +// canceled. +func TCPConnWrap(wrapped any) (wrapperConn *net.TCPConn, ctxCancel context.Context, err error) { + // get a pair of connected TCPConn + tcpConn, reverseTCPConn, err := TCPConnPair() + if err != nil && (tcpConn == nil || reverseTCPConn == nil) { // ignore error caused by closing TCP Listener + return nil, nil, err + } + + var cancel context.CancelFunc + ctxCancel, cancel = context.WithCancel(context.Background()) + + reader, readerOk := wrapped.(io.Reader) + writer, writerOk := wrapped.(io.Writer) + var wg *sync.WaitGroup = new(sync.WaitGroup) + if !readerOk && !writerOk { + cancel() + return nil, nil, fmt.Errorf("wrapped does not implement io.Reader nor io.Writer") + } else if readerOk && !writerOk { + // only reader is implemented + log.Debugf("wrapped does not implement io.Writer, skipping copy from wrapped to wrapper") + + wg.Add(1) + go func(wg *sync.WaitGroup) { + defer wg.Done() + _, _ = io.Copy(reverseTCPConn, reader) // unsafe: error is ignored + _ = reverseTCPConn.Close() // unsafe: error is ignored + _ = tcpConn.Close() // unsafe: error is ignored + }(wg) + } else if !readerOk && writerOk { + // only writer is implemented + log.Debugf("wrapped does not implement io.Reader, skipping copy from wrapper to wrapped") + + wg.Add(1) + go func(wg *sync.WaitGroup) { + defer wg.Done() + _, _ = io.Copy(writer, reverseTCPConn) // unsafe: error is ignored + // when the src is closed, we will close the dst (if implements io.Closer) + if closer, ok := wrapped.(io.Closer); ok { + _ = closer.Close() // unsafe: error is ignored + } + }(wg) + } else { + // both reader and writer are implemented + wg.Add(2) + + // copy from wrapped to wrapper + go func(wg *sync.WaitGroup) { + defer wg.Done() + _, _ = io.Copy(reverseTCPConn, reader) // unsafe: error is ignored + _ = reverseTCPConn.Close() // unsafe: error is ignored + _ = tcpConn.Close() // unsafe: error is ignored + }(wg) + + // copy from wrapper to wrapped + go func(wg *sync.WaitGroup) { + defer wg.Done() + _, _ = io.Copy(writer, reverseTCPConn) // unsafe: error is ignored + // when the src is closed, we will close the dst (if implements io.Closer) + if closer, ok := wrapped.(io.Closer); ok { + _ = closer.Close() // unsafe: error is ignored + } + }(wg) + } + + // spawn a goroutine to wait for all copying to finish + go func(wg *sync.WaitGroup) { + wg.Wait() + cancel() + + // close again to make sure we don't forget to close anything + // if io.Reader or io.Writer is not implemented. + + // close the reverseTCPConn + _ = reverseTCPConn.Close() // unsafe: error is ignored + + // close the tcpConn + _ = tcpConn.Close() // unsafe: error is ignored + + // close the wrapped + if closer, ok := wrapped.(io.Closer); ok { + _ = closer.Close() // unsafe: error is ignored + } + }(wg) + + return tcpConn, ctxCancel, nil +} + +// TCPConnFileWrap wraps an object into a *os.File from an +// underlying net.TCPConn. The object must implement io.Reader +// and/or io.Writer. +// +// If the object implements io.Reader, upon completing copying +// the object to the returned *os.File, the callback functions +// will be called. +// +// It is caller's responsibility to close the returned *os.File. +func TCPConnFileWrap(wrapped any) (wrapperFile *os.File, ctxCancel context.Context, err error) { + tcpWrapperConn, ctxCancel, err := TCPConnWrap(wrapped) + if err != nil { + return nil, nil, err + } + + tcpWrapperFile, err := tcpWrapperConn.File() + if err != nil { + return nil, nil, fmt.Errorf("(*net.TCPConn).File returned error: %w", err) + } + + return tcpWrapperFile, ctxCancel, nil +} diff --git a/internal/socket/tcpconn_test.go b/internal/socket/tcpconn_test.go new file mode 100644 index 0000000..8adb11d --- /dev/null +++ b/internal/socket/tcpconn_test.go @@ -0,0 +1,38 @@ +package socket_test + +import ( + "runtime" + "testing" + "time" + + "github.com/gaukas/water/internal/socket" +) + +func TestTCPConnPair(t *testing.T) { + c1, c2, err := socket.TCPConnPair() + if err != nil { + if c1 == nil || c2 == nil { + t.Fatal(err) + } else { // likely due to Close() call errored + t.Logf("socket.TCPConnPair returned non-fatal error: %v", err) + } + } + + runtime.GC() + time.Sleep(1 * time.Second) + + // test c1 -> c2 + err = testIO(c1, c2, 10000, 1024, 0) + if err != nil { + t.Fatal(err) + } + + runtime.GC() + time.Sleep(1 * time.Second) + + // test c2 -> c1 + err = testIO(c2, c1, 10000, 1024, 0) + if err != nil { + t.Fatal(err) + } +} diff --git a/internal/socket/unixconn.go b/internal/socket/unixconn.go index 9369a2b..46b3a7c 100644 --- a/internal/socket/unixconn.go +++ b/internal/socket/unixconn.go @@ -1,107 +1,18 @@ package socket import ( + "context" "crypto/rand" "fmt" "io" "net" "os" "sync" - "time" "github.com/gaukas/water/internal/log" ) -// UnixConnWrap wraps an io.Reader/io.Writer/io.ReadWriteCloser -// interface into a UnixConn. -// -// This function spins up either one or two goroutines to copy -// data between the ReadWriteCloser and the UnixConn. Anything -// written to the UnixConn by caller will be written to the -// wrapped object if the object implements io.Writer, and if -// the object implements io.Reader, anything read by goroutine -// from the wrapped object will be readable from the UnixConn -// by caller. -// -// Once this function is invoked, the caller should not perform I/O -// operations on the ReadWriteCloser anymore. -func UnixConnWrap(obj any) (*net.UnixConn, error) { - // get a pair of connected UnixConn - unixConn, reverseUnixConn, err := UnixConnPair() - if err != nil && (unixConn == nil || reverseUnixConn == nil) { - return nil, err - } - - // if the object implements io.Reader: read from the object and write to the reverseUnixConn - if reader, ok := obj.(io.Reader); ok { - go func() { - _, _ = io.Copy(reverseUnixConn, reader) - - // when the src is closed, we will close the dst - time.Sleep(1 * time.Millisecond) - log.Debugf("closing reverseUnixConn and unixConn") - err = reverseUnixConn.Close() - err = unixConn.Close() - }() - } - - // if the object implements io.Writer: read from the reverseUnixConn and write to the object - if writer, ok := obj.(io.Writer); ok { - go func() { - _, _ = io.Copy(writer, reverseUnixConn) - // when the src is closed, we will close the dst - if closer, ok := obj.(io.Closer); ok { - time.Sleep(1 * time.Millisecond) - log.Debugf("closing obj") - _ = closer.Close() - } - }() - } - - return unixConn, nil -} - -func UnixConnFileWrap(obj any) (*os.File, error) { - // get a pair of connected UnixConn - unixConn, reverseUnixConn, err := UnixConnPair() - if err != nil && (unixConn == nil || reverseUnixConn == nil) { - return nil, err - } - - unixConnFile, err := unixConn.File() - if err != nil { - return nil, err - } - - // if the object implements io.Reader: read from the object and write to the reverseUnixConn - if reader, ok := obj.(io.Reader); ok { - go func() { - _, _ = io.Copy(reverseUnixConn, reader) - // when the src is closed, we will close the dst - time.Sleep(1 * time.Millisecond) - log.Debugf("closing reverseUnixConn and unixConn") - reverseUnixConn.Close() - _ = unixConn.Close() - _ = unixConnFile.Close() - }() - } - - // if the object implements io.Writer: read from the reverseUnixConn and write to the object - if writer, ok := obj.(io.Writer); ok { - go func() { - _, _ = io.Copy(writer, reverseUnixConn) - // when the src is closed, we will close the dst - if closer, ok := obj.(io.Closer); ok { - time.Sleep(1 * time.Millisecond) - log.Debugf("closing obj") - _ = closer.Close() - } - }() - } - - return unixConnFile, nil -} - +// UnixConnPair returns a pair of connected net.UnixConn. func UnixConnPair(path ...string) (*net.UnixConn, *net.UnixConn, error) { var c1, c2 net.Conn @@ -157,3 +68,128 @@ func UnixConnPair(path ...string) (*net.UnixConn, *net.UnixConn, error) { return nil, nil, fmt.Errorf("c1 is not *net.UnixConn") } } + +// UnixConnWrap wraps an io.Reader/io.Writer/io.Closer +// interface into a UnixConn. +// +// This function spins up goroutine(s) to copy data between the +// ReadWrite(Close)r and the UnixConn. Anything written to the +// UnixConn by caller will be written to the wrapped object if +// the object implements io.Writer, and if the object implements +// io.Reader, anything read by goroutine from the wrapped object +// will be readable from the UnixConn by caller. +// +// Once this function is invoked, the caller should not perform I/O +// operations on the wrapped connection anymore. +// +// The returned context.Context can be used to check if the connection +// is still alive. If the connection is closed, the context will be +// canceled. +func UnixConnWrap(wrapped any) (wrapperConn *net.UnixConn, ctxCancel context.Context, err error) { + // get a pair of connected UnixConn + unixConn, reverseUnixConn, err := UnixConnPair() + if err != nil && (unixConn == nil || reverseUnixConn == nil) { + return nil, nil, err + } + + var cancel context.CancelFunc + ctxCancel, cancel = context.WithCancel(context.Background()) + + reader, readerOk := wrapped.(io.Reader) + writer, writerOk := wrapped.(io.Writer) + var wg *sync.WaitGroup = new(sync.WaitGroup) + if !readerOk && !writerOk { + cancel() + return nil, nil, fmt.Errorf("wrapped does not implement io.Reader nor io.Writer") + } else if readerOk && !writerOk { + // only reader is implemented + log.Debugf("wrapped does not implement io.Writer, skipping copy from wrapped to wrapper") + + wg.Add(1) + go func(wg *sync.WaitGroup) { + defer wg.Done() + _, _ = io.Copy(reverseUnixConn, reader) // unsafe: error is ignored + _ = reverseUnixConn.Close() // unsafe: error is ignored + _ = unixConn.Close() // unsafe: error is ignored + }(wg) + } else if !readerOk && writerOk { + // only writer is implemented + log.Debugf("wrapped does not implement io.Reader, skipping copy from wrapper to wrapped") + + wg.Add(1) + go func(wg *sync.WaitGroup) { + defer wg.Done() + _, _ = io.Copy(writer, reverseUnixConn) // unsafe: error is ignored + // when the src is closed, we will close the dst (if implements io.Closer) + if closer, ok := wrapped.(io.Closer); ok { + _ = closer.Close() // unsafe: error is ignored + } + }(wg) + } else { + // both reader and writer are implemented + wg.Add(2) + + // copy from wrapped to wrapper + go func(wg *sync.WaitGroup) { + defer wg.Done() + _, _ = io.Copy(reverseUnixConn, reader) // unsafe: error is ignored + _ = reverseUnixConn.Close() // unsafe: error is ignored + _ = unixConn.Close() // unsafe: error is ignored + }(wg) + + // copy from wrapper to wrapped + go func(wg *sync.WaitGroup) { + defer wg.Done() + _, _ = io.Copy(writer, reverseUnixConn) // unsafe: error is ignored + // when the src is closed, we will close the dst (if implements io.Closer) + if closer, ok := wrapped.(io.Closer); ok { + _ = closer.Close() // unsafe: error is ignored + } + }(wg) + } + + // spawn a goroutine to wait for all copying to finish + go func(wg *sync.WaitGroup) { + wg.Wait() + cancel() + + // close again to make sure we don't forget to close anything + // if io.Reader or io.Writer is not implemented. + + // close the reverseTCPConn + _ = reverseUnixConn.Close() // unsafe: error is ignored + + // close the tcpConn + _ = unixConn.Close() // unsafe: error is ignored + + // close the wrapped + if closer, ok := wrapped.(io.Closer); ok { + _ = closer.Close() // unsafe: error is ignored + } + }(wg) + + return unixConn, ctxCancel, nil +} + +// UnixConnFileWrap wraps an object into a *os.File from an +// underlying net.UnixConn. The object must implement io.Reader +// and/or io.Writer. +// +// If the object implements io.Reader, upon completing copying +// the object to the returned *os.File, the callback functions +// will be called. +// +// It is caller's responsibility to close the returned *os.File. +func UnixConnFileWrap(wrapped any) (wrapperFile *os.File, ctxCancel context.Context, err error) { + unixWrapperConn, ctxCancel, err := UnixConnWrap(wrapped) + if err != nil { + return nil, nil, err + } + + unixWrapperFile, err := unixWrapperConn.File() + if err != nil { + return nil, nil, fmt.Errorf("(*net.UnixConn).File returned error: %w", err) + } + + return unixWrapperFile, ctxCancel, nil +} diff --git a/internal/system/connhalt_fix_disabled.go b/internal/system/connhalt_fix_disabled.go deleted file mode 100644 index e65308c..0000000 --- a/internal/system/connhalt_fix_disabled.go +++ /dev/null @@ -1,20 +0,0 @@ -//go:build !connhaltbug - -package system - -// CONN_HALT_BUG is a boolean flag indicating whether the connection halt bug is present. -// -// Connection Halting Bug: for some reason when a TCP Connection is closed by the remote by -// a FIN packet, even tho the Go will be able to detect that and return EOF on the next Read(), -// the async read in WebAssembly may not be able to correctly handle that. In rare cases, the -// non-blocking async read becomes blocking and does not return EOF immediately, and meanwhile -// preventing other async operations from making progress, thus halting the whole system. -// -// This bug is not a runtime-side bug, but it is non-trivial to fix or work around inside the -// WebAssembly environment. Therefore from the runtime-side we work around it by using a -// unix socket to relay between the network socket and the WebAssembly environment. When the -// runtime detects that the network socket is closed, it will close the unix socket, which -// will immediately unblock the async read in WebAssembly. -// -// First reported in a finalist v0 standard (2023 Oct). -const CONN_HALT_BUG = false diff --git a/internal/system/connhalt_fix_enabled.go b/internal/system/connhalt_fix_enabled.go deleted file mode 100644 index c19fc60..0000000 --- a/internal/system/connhalt_fix_enabled.go +++ /dev/null @@ -1,20 +0,0 @@ -//go:build connhaltbug - -package system - -// CONN_HALT_BUG is a boolean flag indicating whether the connection halt bug is present. -// -// Connection Halting Bug: for some reason when a TCP Connection is closed by the remote by -// a FIN packet, even tho the Go will be able to detect that and return EOF on the next Read(), -// the async read in WebAssembly may not be able to correctly handle that. In rare cases, the -// non-blocking async read becomes blocking and does not return EOF immediately, and meanwhile -// preventing other async operations from making progress, thus halting the whole system. -// -// This bug is not a runtime-side bug, but it is non-trivial to fix or work around inside the -// WebAssembly environment. Therefore from the runtime-side we work around it by using a -// unix socket to relay between the network socket and the WebAssembly environment. When the -// runtime detects that the network socket is closed, it will close the unix socket, which -// will immediately unblock the async read in WebAssembly. -// -// First reported in a finalist v0 standard (2023 Oct). -const CONN_HALT_BUG = true diff --git a/internal/system/gcfix_disabled.go b/internal/system/gcfix_disabled.go deleted file mode 100644 index eabfadc..0000000 --- a/internal/system/gcfix_disabled.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build !gcbug - -package system - -// GC_BUG is a boolean flag indicating whether the garbage collector bug is present. -// -// Garbage Collection bug: Go GC will garbage collect the first file we pushed -// into the WASM module no matter what. Seemingly no one admits this is a bug -// on their side, so we work around it by pushing a dummy file first. -// -// First reported in a v0 draft (2023 Sep). It is no longer observed later in the -// finalist v0 standard. -const GC_BUG = false diff --git a/internal/system/gcfix_enabled.go b/internal/system/gcfix_enabled.go deleted file mode 100644 index 3cc978c..0000000 --- a/internal/system/gcfix_enabled.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build gcbug - -package system - -// GC_BUG is a boolean flag indicating whether the garbage collector bug is present. -// -// Garbage Collection bug: Go GC will garbage collect the first file we pushed -// into the WASM module no matter what. Seemingly no one admits this is a bug -// on their side, so we work around it by pushing a dummy file first. -// -// First reported in a v0 draft (2023 Sep). It is no longer observed later in the -// finalist v0 standard. -const GC_BUG = true diff --git a/internal/v0/transport_module.go b/internal/v0/transport_module.go deleted file mode 100644 index d5ec2ee..0000000 --- a/internal/v0/transport_module.go +++ /dev/null @@ -1,628 +0,0 @@ -//go:build !nov0 - -package v0 - -import ( - "fmt" - "net" - "os" - "runtime" - "sync" - - "github.com/bytecodealliance/wasmtime-go/v13" - "github.com/gaukas/water" - "github.com/gaukas/water/internal/log" - "github.com/gaukas/water/internal/socket" - "github.com/gaukas/water/internal/system" - "github.com/gaukas/water/internal/wasm" -) - -// TransportModule acts like a "managed core". It was build to provide WebAssembly -// Transport Module API-facing functions and utilities that are exclusive to -// version 0. -type TransportModule struct { - core water.Core - - _init *wasmtime.Func // _init() -> i32 - - // _dial: - // - Calls to `env.host_dial() -> fd: i32` to dial a network connection and bind it to one - // of its file descriptors, record the fd for `remoteConnFd`. This will be the fd it used - // to read/write data from/to the remote destination. - // - Records the `callerConnFd`. This will be the fd it used to read/write data from/to - // the caller. - // - Returns `remoteConnFd` to the caller. - _dial *wasmtime.Func // _dial(callerConnFd i32) -> (remoteConnFd i32) - - // _accept: - // - Calls to `env.host_accept() -> fd: i32` to accept a network connection and bind it - // to one of its file descriptors, record the fd for `sourceConnFd`. This will be the fd - // it used to read/write data from/to the source address. - // - Records the `callerConnFd`. This will be the fd it used to read/write data from/to - // the caller. - // - Returns `sourceConnFd` to the caller. - _accept *wasmtime.Func // _accept(callerConnFd i32) -> (sourceConnFd i32) - - // _associate: - // - Calls to `env.host_accept() -> fd: i32` to accept a network connection and bind it - // to one of its file descriptors, record the fd for `sourceConnFd`. This will be the fd - // it used to read/write data from/to the source address. - // - Calls to `env.host_dial() -> fd: i32` to dial a network connection and bind it to one - // of its file descriptors, record the fd for `remoteConnFd`. This will be the fd it used - // to read/write data from/to the remote destination. - // - Returns 0 to the caller or an error code if any of the above steps failed. - _associate *wasmtime.Func // _associate() -> (err i32) - - // backgroundWorker is used to replace the deprecated read-write-close model. - // We put it in a inlined struct for better code styling. - backgroundWorker *struct { - // _cancel_with: - // - Provides a socket to the WASM module for it to listen to cancellation events. - // - on Cancel() call, the pipe will be written to by the host (caller). - // - WebAssembly instance should select on the socket and handle cancellation ASAP. - // - // This is a workaround for not being able to call another WASM function until the - // current one returns. And apparently this function needs to be called BEFORE the - // blocking _worker() function. - _cancel_with *wasmtime.Func // _cancel_with(fd int32) (err int32) - - // _worker provides a blocking function for the WASM module to run a worker thread. - // In the worker thread, WASM module should select on all previously pushed sockets - // (typically, two among callerConnFd, remoteConnFd, and sourceConnFd) and handle - // data bi-directionally. The exact behavior is up to the WebAssembly module and - // overall it drives data flow below based on the identity of the module: - // - Dialer: callerConn <==> remoteConn - // - Listener: callerConn <==> sourceConn - // - Relay: sourceConn <==> remoteConn - // - // The worker thread should exit and return when the cancellation pipe is available - // for reading. For the current design, the content read from the pipe does not - // include meaningful data. - _worker *wasmtime.Func // _worker() (err int32) - - // a channel used to send errors from the worker thread to the host in a non-blocking - // manner. When the worker thread exits, this channel will be closed. - // - // Read-only to the caller. Write-only to the worker thread. - chanWorkerErr chan error - - // a socket used to cancel the worker thread. When the host calls Cancel(), it should - // write to this socket. - cancelSocket net.Conn - } - - gcfixOnce *sync.Once - pushedConn map[int32]*struct { - groundTruthConn net.Conn // the conn we want to keep alive - pushedFile *os.File // the file we actually pushed to WebAssembly world also needs to be kept alive - } - pushedConnMutex *sync.RWMutex - - deferOnce *sync.Once - deferredFuncs []func() -} - -func Core2TransportModule(core water.Core) *TransportModule { - wasm := &TransportModule{ - core: core, - gcfixOnce: new(sync.Once), - pushedConn: make(map[int32]*struct { - groundTruthConn net.Conn - pushedFile *os.File - }), - pushedConnMutex: new(sync.RWMutex), - deferOnce: new(sync.Once), - deferredFuncs: make([]func(), 0), - } - - // SetFinalizer, so Go GC automatically cleans up the WASM runtime - // and all opened file descriptors (if any) associated with it - // when the TransportModule is garbage collected. - runtime.SetFinalizer(wasm, func(tm *TransportModule) { - _ = tm.Cancel() // tm cannot be nil here as we just set it above - tm.DeferAll() - tm.Cleanup() - }) - - return wasm -} - -func (tm *TransportModule) LinkNetworkInterface(dialer *ManagedDialer, listener net.Listener) error { - if tm.core.Linker() == nil { - return fmt.Errorf("water: linker not set, is Core initialized?") - } - - // import host_dial - if dialer != nil { - if err := tm.core.Linker().FuncNew( - "env", "host_dial", WASIConnectFuncType, - WrapConnectFunc( - func(caller *wasmtime.Caller) (fd int32, err error) { - conn, err := dialer.Dial() - if err != nil { - return wasm.GENERAL_ERROR, err - } - - return tm.PushConn(conn, caller) - }, - ), - ); err != nil { - return fmt.Errorf("water: linking WASI dialer, (*wasmtime.Linker).FuncNew: %w", err) - } - } else { - if err := tm.core.Linker().FuncNew( - "env", "host_dial", WASIConnectFuncType, - WrappedUnimplementedWASIConnectFunc(), - ); err != nil { - return fmt.Errorf("water: linking NOP dialer, (*wasmtime.Linker).FuncNew: %w", err) - } - } - - // import host_accept - if listener != nil { - if err := tm.core.Linker().FuncNew( - "env", "host_accept", WASIConnectFuncType, - WrapConnectFunc( - func(caller *wasmtime.Caller) (fd int32, err error) { - conn, err := listener.Accept() - if err != nil { - return wasm.GENERAL_ERROR, err - } - - return tm.PushConn(conn, caller) - }, - ), - ); err != nil { - return fmt.Errorf("water: linking WASI listener, (*wasmtime.Linker).FuncNew: %w", err) - } - } else { - if err := tm.core.Linker().FuncNew( - "env", "host_accept", WASIConnectFuncType, - WrappedUnimplementedWASIConnectFunc(), - ); err != nil { - return fmt.Errorf("water: linking NOP listener, (*wasmtime.Linker).FuncNew: %w", err) - } - } - - return nil -} - -// Initialize initializes the WASMv0 runtime by getting all the exported functions from -// the WASM module. -// -// All imports must be set before calling this function. -func (tm *TransportModule) Initialize() error { - if tm.core == nil { - return fmt.Errorf("water: no core loaded") - } - - var err error - // import host_defer function - if err = tm.core.Linker().FuncWrap("env", "host_defer", func() { - tm.DeferAll() - }); err != nil { - return fmt.Errorf("water: linking deferh function, (*wasmtime.Linker).FuncWrap: %w", err) - } - - // import pull_config function (it is called pushConfig here in the host) - if err := tm.core.Linker().FuncNew("env", "pull_config", WASIConnectFuncType, WrapConnectFunc(tm.pushConfig)); err != nil { - return fmt.Errorf("water: linking pull_config function, (*wasmtime.Linker).FuncNew: %w", err) - } - - // instantiate the WASM module - if err = tm.core.Instantiate(); err != nil { - return err - } - - // _init - tm._init = tm.core.Instance().GetFunc(tm.core.Store(), "_water_init") - if tm._init == nil { - return fmt.Errorf("water: WASM module does not export _water_init") - } - - // _dial - tm._dial = tm.core.Instance().GetFunc(tm.core.Store(), "_water_dial") - // if tm._dial == nil { - // return fmt.Errorf("water: WASM module does not export _dial") - // } - - // _accept - tm._accept = tm.core.Instance().GetFunc(tm.core.Store(), "_water_accept") - // if tm._accept == nil { - // return fmt.Errorf("water: WASM module does not export _accept") - // } - - // _associate - tm._associate = tm.core.Instance().GetFunc(tm.core.Store(), "_water_associate") - // if tm._associate == nil { - // return fmt.Errorf("water: WASM module does not export _associate") - // } - - // _cancel_with - _cancel_with := tm.core.Instance().GetFunc(tm.core.Store(), "_water_cancel_with") - if _cancel_with == nil { - return fmt.Errorf("water: WASM module does not export _water_cancel_with") - } - - // _worker - _worker := tm.core.Instance().GetFunc(tm.core.Store(), "_water_worker") - if _worker == nil { - return fmt.Errorf("water: WASM module does not export _water_worker") - } - - // wrap _cancel_with and _worker - tm.backgroundWorker = &struct { - _cancel_with *wasmtime.Func - _worker *wasmtime.Func - chanWorkerErr chan error - cancelSocket net.Conn - }{ - _cancel_with: _cancel_with, - _worker: _worker, - chanWorkerErr: make(chan error, 8), // at max 1 error would occur, but we will write multiple copies - // cancelSocket: nil, - } - - // call _init - ret, err := tm._init.Call(tm.core.Store()) - if err != nil { - return fmt.Errorf("water: calling _water_init function returned error: %w", err) - } - - return wasm.WASMErr(ret.(int32)) -} - -// DialFrom is used to make the Transport Module act as a dialer and -// dial a network connection. -// -// Takes the reverse caller connection as an argument, which is used -// to communicate with the caller. -func (tm *TransportModule) DialFrom(reverseCallerConn net.Conn) (destConn net.Conn, err error) { - // check if _dial is exported - if tm._dial == nil { - return nil, fmt.Errorf("water: WASM module does not export _water_dial") - } - - callerFd, err := tm.PushConn(reverseCallerConn) - if err != nil { - return nil, fmt.Errorf("water: pushing caller conn to store failed: %w", err) - } - - ret, err := tm._dial.Call(tm.core.Store(), callerFd) - if err != nil { - return nil, fmt.Errorf("water: calling _dial function returned error: %w", err) - } - - if remoteFd, ok := ret.(int32); !ok { - return nil, fmt.Errorf("water: invalid _dial function signature") - } else { - if remoteFd < 0 { - return nil, wasm.WASMErr(remoteFd) - } else { - destConn := tm.GetPushedConn(remoteFd) - if destConn == nil { - return nil, fmt.Errorf("water: failed to look up network connection by fd") - } - return destConn, nil - } - } -} - -// AcceptFor is used to make the Transport Module act as a listener and -// accept a network connection. -func (tm *TransportModule) AcceptFor(reverseCallerConn net.Conn) (sourceConn net.Conn, err error) { - // check if _accept is exported - if tm._accept == nil { - return nil, fmt.Errorf("water: WASM module does not export _water_accept") - } - - callerFd, err := tm.PushConn(reverseCallerConn) - if err != nil { - return nil, fmt.Errorf("water: pushing caller conn to store failed: %w", err) - } - - ret, err := tm._accept.Call(tm.core.Store(), callerFd) - if err != nil { - return nil, fmt.Errorf("water: calling _accept function returned error: %w", err) - } - - if sourceFd, ok := ret.(int32); !ok { - return nil, fmt.Errorf("water: invalid _accept function signature") - } else { - if sourceFd < 0 { - return nil, wasm.WASMErr(sourceFd) - } else { - sourceConn := tm.GetPushedConn(sourceFd) - if sourceConn == nil { - return nil, fmt.Errorf("water: failed to look up network connection by fd") - } - return sourceConn, nil - } - } -} - -// Associate is used to make the Transport Module act as a relay and -// associate two network connections, where one is from a source via -// a listener, and the other is to a destination via a dialer. -func (tm *TransportModule) Associate() error { - // check if _associate is exported - if tm._associate == nil { - return fmt.Errorf("water: WASM module does not export _water_associate") - } - - ret, err := tm._associate.Call(tm.core.Store()) - if err != nil { - return fmt.Errorf("water: calling _associate function returned error: %w", err) - } - - return wasm.WASMErr(ret.(int32)) -} - -// Worker spins up a worker thread for the WASM module to run a blocking function. -// -// This function is non-blocking UNLESS the error occurred before entering the worker -// thread. In that case, the error will be returned immediately. -func (tm *TransportModule) Worker() error { - // check if _worker is exported - if tm.backgroundWorker == nil { - return fmt.Errorf("water: Transport Module is not cancellable") - } - - // create cancel pipe - cancelConnR, cancelConnW, err := socket.UnixConnPair() - if err != nil { - return fmt.Errorf("water: creating cancel pipe failed: %w", err) - } - tm.backgroundWorker.cancelSocket = cancelConnW // host will Write to this pipe to cancel the worker - - // push cancel pipe to store - cancelPipeFd, err := tm.PushConn(cancelConnR) - if err != nil { - return fmt.Errorf("water: pushing cancel pipe to store failed: %w", err) - } - - // pass the fd to the WASM module - ret, err := tm.backgroundWorker._cancel_with.Call(tm.core.Store(), cancelPipeFd) - if err != nil { - return fmt.Errorf("water: calling _water_cancel_with function returned error: %w", err) - } - if ret.(int32) != 0 { - return fmt.Errorf("water: _water_cancel_with returned error: %w", wasm.WASMErr(ret.(int32))) - } - - log.Debugf("water: starting worker thread") - - // in a goroutine, call _worker - go func() { - defer close(tm.backgroundWorker.chanWorkerErr) - ret, err := tm.backgroundWorker._worker.Call(tm.core.Store()) - if err != nil { - // multiple copies in case of multiple receivers on the channel - tm.backgroundWorker.chanWorkerErr <- err - tm.backgroundWorker.chanWorkerErr <- err - tm.backgroundWorker.chanWorkerErr <- err - tm.backgroundWorker.chanWorkerErr <- err - return - } - if ret.(int32) != 0 { - // multiple copies in case of multiple receivers on the channel - tm.backgroundWorker.chanWorkerErr <- wasm.WASMErr(ret.(int32)) - tm.backgroundWorker.chanWorkerErr <- wasm.WASMErr(ret.(int32)) - tm.backgroundWorker.chanWorkerErr <- wasm.WASMErr(ret.(int32)) - tm.backgroundWorker.chanWorkerErr <- wasm.WASMErr(ret.(int32)) - log.Warnf("water: worker thread exited with code %d", ret.(int32)) - } else { - log.Debugf("water: worker thread exited with code 0") - } - }() - - log.Debugf("water: worker thread started") - - // last sanity check if the worker thread crashed immediately even before we return - select { - case err := <-tm.backgroundWorker.chanWorkerErr: // if already returned, basically it failed to start - return fmt.Errorf("water: worker thread returned error: %w", err) - default: - log.Debugf("water: Worker (func, not the worker thread) returning") - return nil - } -} - -// Cancel cancels the worker thread if it is running and returns -// the error returned by the worker thread. This call is designed -// to block until the worker thread exits. -func (tm *TransportModule) Cancel() error { - if tm.backgroundWorker == nil { - return fmt.Errorf("water: Transport Module is not initialized") - } - - if tm.backgroundWorker.cancelSocket == nil { - return fmt.Errorf("water: Transport Module is cancelled") - } - - select { - case err := <-tm.backgroundWorker.chanWorkerErr: // if already returned, we don't need to cancel - if err != nil { - return fmt.Errorf("water: worker thread returned error: %w", err) - } - return nil - default: // otherwise we will need to cancel the worker thread - break - } - - // write to the cancel pipe - if _, err := tm.backgroundWorker.cancelSocket.Write([]byte{0}); err != nil { - return fmt.Errorf("water: writing to cancel pipe failed: %w", err) - } - - // wait for the worker thread to exit - if err := <-tm.backgroundWorker.chanWorkerErr; err != nil { - return fmt.Errorf("water: worker thread returned error: %w", err) - } - - if err := tm.backgroundWorker.cancelSocket.Close(); err != nil { - return fmt.Errorf("water: closing cancel pipe failed: %w", err) - } - - tm.backgroundWorker.cancelSocket = nil - - return nil -} - -// WorkerErrored returns a channel that will be closed when the worker thread exits. -func (tm *TransportModule) WorkerErrored() <-chan error { - if tm.backgroundWorker == nil { - return nil - } - return tm.backgroundWorker.chanWorkerErr -} - -// wasiCtx is an interface used to push files to WASI store. -// -// In (the patched) package wasmtime, WasiCtx, Caller, and Store -// all implement this interface. -type wasiCtx interface { - PushFile(file *os.File, accessMode wasmtime.WasiFileAccessMode) (uint32, error) -} - -func (tm *TransportModule) PushConn(conn net.Conn, wasiCtxOverride ...wasiCtx) (fd int32, err error) { - var wasiCtx wasiCtx = nil - if len(wasiCtxOverride) > 0 { - wasiCtx = wasiCtxOverride[0] - } else { - wasiCtx = tm.core.Store() - } - - tm.gcfixOnce.Do(func() { - if system.GC_BUG { - // create temp file - var f *os.File - f, err = os.CreateTemp("", "water-gcfix") - if err != nil { - return - } - - // push dummy file - fd, err := wasiCtx.PushFile(f, wasmtime.READ_ONLY) - if err != nil { - return - } - - // save dummy file to map - tm.pushedConnMutex.Lock() - tm.pushedConn[int32(fd)] = &struct { - groundTruthConn net.Conn - pushedFile *os.File - }{ - groundTruthConn: nil, - pushedFile: f, - } - tm.pushedConnMutex.Unlock() - - log.Debugf("water: GC fix: pushed dummy file to WASM store with fd %d", fd) - } - }) - - if err != nil { - return wasm.INVALID_FD, fmt.Errorf("water: creating temp file for GC fix: %w", err) - } - - var connFile *os.File - if system.CONN_HALT_BUG { // if the bug needs to be worked around, we use a unix socket to forward all tcp streams - switch conn.(type) { - case *net.TCPConn: - connFile, err = socket.UnixConnFileWrap(conn) - default: - connFile, err = socket.AsFile(conn) - } - } else { - connFile, err = socket.AsFile(conn) - } - if err != nil { - return wasm.INVALID_FD, fmt.Errorf("water: converting conn to file failed: %w", err) - } - - fdu32, err := wasiCtx.PushFile(connFile, wasmtime.READ_WRITE) - if err != nil { - return wasm.INVALID_FD, fmt.Errorf("water: pushing conn file to store failed: %w", err) - } - fd = int32(fdu32) - - tm.pushedConnMutex.Lock() - tm.pushedConn[fd] = &struct { - groundTruthConn net.Conn - pushedFile *os.File - }{ - groundTruthConn: conn, - pushedFile: connFile, - } - tm.pushedConnMutex.Unlock() - - return fd, nil -} - -func (tm *TransportModule) DeferAll() { - tm.deferOnce.Do(func() { // execute all deferred functions if not yet executed - for _, f := range tm.deferredFuncs { - f() - } - }) -} - -func (tm *TransportModule) Defer(f func()) { - tm.deferredFuncs = append(tm.deferredFuncs, f) -} - -func (tm *TransportModule) Cleanup() { - // clean up pushed files - var keyList []int32 - tm.pushedConnMutex.Lock() - for k, v := range tm.pushedConn { - if v != nil { - if v.pushedFile != nil { - v.pushedFile.Close() - v.pushedFile = nil - } - if v.groundTruthConn != nil { - v.groundTruthConn.Close() - v.groundTruthConn = nil - } - } - keyList = append(keyList, k) - } - for _, k := range keyList { - delete(tm.pushedConn, k) - } - tm.pushedConnMutex.Unlock() - - // clean up deferred functions - tm.deferredFuncs = nil -} - -func (tm *TransportModule) pushConfig(caller *wasmtime.Caller) (int32, error) { - // get config file - configFile := tm.core.Config().TMConfig.File() - if configFile == nil { - return wasm.INVALID_FD, nil // we don't return error here so no trap is triggered - } - - // push file to WASM - configFd, err := caller.PushFile(configFile, wasmtime.READ_ONLY) - if err != nil { - return wasm.INVALID_FD, err - } - - return int32(configFd), nil -} - -func (tm *TransportModule) GetPushedConn(fd int32) net.Conn { - tm.pushedConnMutex.RLock() - defer tm.pushedConnMutex.RUnlock() - if tm.pushedConn == nil { - return nil - } - if v, ok := tm.pushedConn[fd]; ok { - return v.groundTruthConn - } - return nil -} diff --git a/internal/v0/wasi_net.go b/internal/v0/wasi_net.go deleted file mode 100644 index 9a65688..0000000 --- a/internal/v0/wasi_net.go +++ /dev/null @@ -1,46 +0,0 @@ -package v0 - -import ( - "fmt" - - "github.com/bytecodealliance/wasmtime-go/v13" - "github.com/gaukas/water/internal/wasm" -) - -// WASIConnectFunc is a function that creates a connection. -type WASIConnectFunc = func(caller *wasmtime.Caller) (fd int32, err error) - -// WASIConnectFuncType is the signature of WASIConnectFunc. -var WASIConnectFuncType *wasmtime.FuncType = wasmtime.NewFuncType( - []*wasmtime.ValType{}, - []*wasmtime.ValType{ - wasmtime.NewValType(wasmtime.KindI32), // return: connectionFd - }, -) - -// WrapConnectFunc wraps a WASIConnectFunc into a WASM function. -func WrapConnectFunc(f WASIConnectFunc) wasm.WASMTIMEStoreIndependentFunction { - return func(caller *wasmtime.Caller, vals []wasmtime.Val) ([]wasmtime.Val, *wasmtime.Trap) { - if len(vals) != 0 { - return []wasmtime.Val{wasmtime.ValI32(wasm.INVALID_ARGUMENT)}, wasmtime.NewTrap(fmt.Sprintf("v0.WASIConnectFunc expects 0 argument, got %d", len(vals))) - } - - fd, err := f(caller) - if err != nil { // here fd is expected to be an error code (negative) - return []wasmtime.Val{wasmtime.ValI32(fd)}, wasmtime.NewTrap(fmt.Sprintf("v0.WASIConnectFunc: %v", err)) - } - - return []wasmtime.Val{wasmtime.ValI32(fd)}, nil - } -} - -// UnimplementedWASIConnectFunc wraps unimplementedWASIConnectFunc into a -// wasmtime-compliant function. -func WrappedUnimplementedWASIConnectFunc() wasm.WASMTIMEStoreIndependentFunction { - return WrapConnectFunc(unimplementedWASIConnectFunc) -} - -// unimplementedWASIConnectFunc is a WASIConnectFunc that does nothing. -func unimplementedWASIConnectFunc(_ *wasmtime.Caller) (fd int32, err error) { - return wasm.INVALID_FUNCTION, fmt.Errorf("NOP WASIConnectFunc is called") -} diff --git a/internal/wasm/module_config.go b/internal/wasm/module_config.go new file mode 100644 index 0000000..7401969 --- /dev/null +++ b/internal/wasm/module_config.go @@ -0,0 +1,95 @@ +package wasm + +import ( + "io" + "os" + + "github.com/tetratelabs/wazero" +) + +// ModuleConfigFactory is used to spawn wazero.ModuleConfig. +type ModuleConfigFactory struct { + moduleConfig wazero.ModuleConfig + fsconfig wazero.FSConfig +} + +// NewModuleConfigFactory creates a new ModuleConfigFactory. +func NewModuleConfigFactory() *ModuleConfigFactory { + return &ModuleConfigFactory{ + moduleConfig: wazero.NewModuleConfig(), + fsconfig: wazero.NewFSConfig(), + } +} + +func (mcf *ModuleConfigFactory) Clone() *ModuleConfigFactory { + if mcf == nil { + return nil + } + + return &ModuleConfigFactory{ + moduleConfig: mcf.moduleConfig, + fsconfig: mcf.fsconfig, + } +} + +// GetConfig returns the latest wazero.ModuleConfig. +func (mcf *ModuleConfigFactory) GetConfig() (wazero.ModuleConfig, error) { + if mcf == nil { + return wazero.NewModuleConfig(), nil + } + + return mcf.moduleConfig.WithFSConfig(mcf.fsconfig), nil +} + +func (mcf *ModuleConfigFactory) SetArgv(argv []string) { + mcf.moduleConfig = mcf.moduleConfig.WithArgs(argv...) +} + +func (mcf *ModuleConfigFactory) InheritArgv() { + // TODO: enumerate os.Args or deprecate this +} + +func (mcf *ModuleConfigFactory) SetEnv(keys, values []string) { + if len(keys) != len(values) { + panic("water: SetEnv: keys and values must have the same length") + } + + for i := range keys { + mcf.moduleConfig = mcf.moduleConfig.WithEnv(keys[i], values[i]) + } +} + +func (wcf *ModuleConfigFactory) InheritEnv() { + // TODO: enumerate os.Environ or deprecate this +} + +func (wcf *ModuleConfigFactory) SetStdin(r io.Reader) { + wcf.moduleConfig = wcf.moduleConfig.WithStdin(r) +} + +func (wcf *ModuleConfigFactory) InheritStdin() { + wcf.moduleConfig = wcf.moduleConfig.WithStdin(os.Stdin) +} + +func (wcf *ModuleConfigFactory) SetStdout(w io.Writer) { + wcf.moduleConfig = wcf.moduleConfig.WithStdout(w) +} + +func (wcf *ModuleConfigFactory) InheritStdout() { + wcf.moduleConfig = wcf.moduleConfig.WithStdout(os.Stdout) +} + +func (wcf *ModuleConfigFactory) SetStderr(w io.Writer) { + wcf.moduleConfig = wcf.moduleConfig.WithStderr(w) +} + +func (wcf *ModuleConfigFactory) InheritStderr() { + wcf.moduleConfig = wcf.moduleConfig.WithStderr(os.Stderr) +} + +func (wcf *ModuleConfigFactory) SetPreopenDir(path string, guestPath string) { + wcf.fsconfig = wcf.fsconfig.WithDirMount(path, guestPath) +} + +// TODO: consider adding SetPreopenReadonlyDir +// TODO: consider adding SetPreopenFS diff --git a/internal/wasm/net.go b/internal/wasm/net.go deleted file mode 100644 index 8226d4d..0000000 --- a/internal/wasm/net.go +++ /dev/null @@ -1,7 +0,0 @@ -package wasm - -import "github.com/bytecodealliance/wasmtime-go/v13" - -// WASMTIMEStoreIndependentFunction is a function that takes a store at -// runtime to work with. -type WASMTIMEStoreIndependentFunction = func(*wasmtime.Caller, []wasmtime.Val) ([]wasmtime.Val, *wasmtime.Trap) diff --git a/internal/wasm/wasi_config.go b/internal/wasm/wasi_config.go deleted file mode 100644 index 5723eaf..0000000 --- a/internal/wasm/wasi_config.go +++ /dev/null @@ -1,123 +0,0 @@ -package wasm - -import "github.com/bytecodealliance/wasmtime-go/v13" - -// WASIConfigFactory creates wasmtime.WasiConfig. -// Since WasiConfig cannot be cloned, we will instead save -// all the repeated setup functions in a slice and call them -// on newly created wasmtime.WasiConfig when needed. -type WASIConfigFactory struct { - setupFuncs []func(*wasmtime.WasiConfig) error // if any of these functions returns an error, the whole setup will fail. -} - -// NewWasiConfigFactory creates a new WASIConfigFactory. -func NewWasiConfigFactory() *WASIConfigFactory { - return &WASIConfigFactory{ - setupFuncs: make([]func(*wasmtime.WasiConfig) error, 0), - } -} - -func (wcf *WASIConfigFactory) Clone() *WASIConfigFactory { - if wcf == nil { - return nil - } - - if wcf.setupFuncs == nil { - return NewWasiConfigFactory() - } - - clone := &WASIConfigFactory{ - setupFuncs: make([]func(*wasmtime.WasiConfig) error, len(wcf.setupFuncs)), - } - copy(clone.setupFuncs, wcf.setupFuncs) - - return clone -} - -// GetConfig sets up and returns the finished wasmtime.WasiConfig. -// -// If the setup fails, it will return nil and an error. -func (wcf *WASIConfigFactory) GetConfig() (*wasmtime.WasiConfig, error) { - wasiConfig := wasmtime.NewWasiConfig() - if wcf != nil && wcf.setupFuncs != nil { - for _, f := range wcf.setupFuncs { - if err := f(wasiConfig); err != nil { - return nil, err - } - } - } - return wasiConfig, nil -} - -func (wcf *WASIConfigFactory) SetArgv(argv []string) { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - wasiConfig.SetArgv(argv) - return nil - }) -} - -func (wcf *WASIConfigFactory) InheritArgv() { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - wasiConfig.InheritArgv() - return nil - }) -} - -func (wcf *WASIConfigFactory) SetEnv(keys, values []string) { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - wasiConfig.SetEnv(keys, values) - return nil - }) -} - -func (wcf *WASIConfigFactory) InheritEnv() { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - wasiConfig.InheritEnv() - return nil - }) -} - -func (wcf *WASIConfigFactory) SetStdinFile(path string) { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - return wasiConfig.SetStdinFile(path) - }) -} - -func (wcf *WASIConfigFactory) InheritStdin() { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - wasiConfig.InheritStdin() - return nil - }) -} - -func (wcf *WASIConfigFactory) SetStdoutFile(path string) { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - return wasiConfig.SetStdoutFile(path) - }) -} - -func (wcf *WASIConfigFactory) InheritStdout() { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - wasiConfig.InheritStdout() - return nil - }) -} - -func (wcf *WASIConfigFactory) SetStderrFile(path string) { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - return wasiConfig.SetStderrFile(path) - }) -} - -func (wcf *WASIConfigFactory) InheritStderr() { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - wasiConfig.InheritStderr() - return nil - }) -} - -func (wcf *WASIConfigFactory) SetPreopenDir(path string, guestPath string) { - wcf.setupFuncs = append(wcf.setupFuncs, func(wasiConfig *wasmtime.WasiConfig) error { - return wasiConfig.PreopenDir(path, guestPath) - }) -} diff --git a/listener.go b/listener.go index 3775a4d..9a03b49 100644 --- a/listener.go +++ b/listener.go @@ -101,8 +101,8 @@ func NewListener(c *Config) (Listener, error) { // // TODO: detect the version of the WebAssembly Transport Module // in a more organized way. - for _, export := range core.Module().Exports() { - if f, ok := knownListenerVersions[export.Name()]; ok { + for exportName := range core.Exports() { + if f, ok := knownListenerVersions[exportName]; ok { return f(c) } } diff --git a/log.go b/log.go new file mode 100644 index 0000000..16c5a5d --- /dev/null +++ b/log.go @@ -0,0 +1,21 @@ +package water + +import ( + "github.com/gaukas/water/internal/log" +) + +// SetDefaultLogger sets the logger to be used by the package +// if no logger is specifically configured for each component. +// +// By default, slog.Default() is used. +func SetDefaultLogger(logger *log.Logger) { + log.SetDefaultLogger(logger) +} + +// SetDefaultHandler sets the handler to be used by the package +// if no logger is specifically configured for each component. +// +// It overrides the logger specified by SetDefaultLogger. +func SetDefaultHandler(handler log.Handler) { + log.SetDefaultHandler(handler) +} diff --git a/relay.go b/relay.go index e27d2ee..f8a210d 100644 --- a/relay.go +++ b/relay.go @@ -112,8 +112,8 @@ func NewRelay(c *Config) (Relay, error) { // // TODO: detect the version of the WebAssembly Transport Module // in a more organized way. - for _, export := range core.Module().Exports() { - if f, ok := knownRelayVersions[export.Name()]; ok { + for exportName := range core.Exports() { + if f, ok := knownRelayVersions[exportName]; ok { return f(c) } } diff --git a/socket.go b/socket.go new file mode 100644 index 0000000..8daf954 --- /dev/null +++ b/socket.go @@ -0,0 +1,68 @@ +package water + +import ( + "fmt" + "net" + "os" +) + +// InsertConn implements Core. +func (c *core) InsertConn(conn net.Conn) (fd int32, err error) { + if c.instance == nil { + return 0, fmt.Errorf("water: cannot insert TCPConn before instantiation") + } + + switch conn := conn.(type) { + case *net.TCPConn: + key, ok := c.instance.InsertTCPConn(conn) + if !ok { + return 0, fmt.Errorf("water: (*wazero.Module).InsertTCPConn returned false") + } + if key <= 0 { + return key, fmt.Errorf("water: (*wazero.Module).InsertTCPConn returned invalid key") + } + return key, nil + default: + // TODO: support other types of connections as much as possible + return 0, fmt.Errorf("water: unsupported connection type: %T", conn) + } +} + +// InsertListener implements Core. +func (c *core) InsertListener(listener net.Listener) (fd int32, err error) { + if c.instance == nil { + return 0, fmt.Errorf("water: cannot insert TCPListener before instantiation") + } + + switch listener := listener.(type) { + case *net.TCPListener: + key, ok := c.instance.InsertTCPListener(listener) + if !ok { + return 0, fmt.Errorf("water: (*wazero.Module).InsertTCPListener returned false") + } + if key <= 0 { + return key, fmt.Errorf("water: (*wazero.Module).InsertTCPListener returned invalid key") + } + return key, nil + default: + // TODO: support other types of listeners as much as possible + return 0, fmt.Errorf("water: unsupported listener type: %T", listener) + } +} + +// InsertFile implements Core. +func (c *core) InsertFile(osFile *os.File) (fd int32, err error) { + if c.instance == nil { + return 0, fmt.Errorf("water: cannot insert File before instantiation") + } + + key, ok := c.instance.InsertOSFile(osFile) + if !ok { + return 0, fmt.Errorf("water: (*wazero.Module).InsertFile returned false") + } + if key <= 0 { + return key, fmt.Errorf("water: (*wazero.Module).InsertFile returned invalid key") + } + + return key, nil +} diff --git a/testdata/v0/plain.wasm b/testdata/v0/plain.wasm index ebeeb6c9a5f26be4245b378f7266bed240c6c518..375787fb8b603fd7e0fd33e5bfebaafd6d2b32f5 100644 GIT binary patch delta 118806 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 diff --git a/testdata/v0/reverse.wasm b/testdata/v0/reverse.wasm index 97ae4761b4012827969517955e06d8d8fa5fe28d..f304c5f389376516984790b0a9d211318da96717 100644 GIT binary patch delta 120520 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%0AXloJ&wj8 z>X4JMv5ujL*$+i|<``$I3LO0XC`KaIi@&f*iC7M7G*NjQ4aaI&(-5W6oHAN(X>|f$ zGscaEsAs1+huA|uV%}yW8XoPAog0sB*i z@l=?YB8a(RV!0sZg$Y#0&sT1z^g*i_OtNQ0JrELbGxK) zd7{=wq|0kwZU1;@*pmTZg3`q23^vZ>%|B_ z$dURu4I0G}Coux3e_0>Tiu%|cGBqw@1VA!wc%(j#2SJaUM&as6vQQ|h)yIWkN|A;b z0laoeR#P@Q8_AaXxa$9=^N(zH;TZ3E1PzhpI3ITeH}1VtGJoTUvkANRxO(-7GfQSG zB%XH6xu9q&+QFCL9SS^KanOspLod)gdJ_ZTW6s9OpTgP$Yf;M|Eo+rVVgS;%W9$Lw zlt1o_Pd)-2YIKB7^dU()jqY0839+Z3)9<*ms^vT`RvdR0jkf=-zthrou~Q4F$KNvl z;<&Rx`XyN017F%c<5egg70{56CV8c*ahsLoEgd6#%svCsw7TpE3J$;s53 z7?LUPf=7KR-cn0t>6Rc)_)iG30Q3ge>AC zWMfrX5F$E4Ms$4karjudDY^y+6Mg)8QCG8WwUE>FxXj*ROZ5IQ9jEMt2^ZeU^JHQ8 zWf0msdESP|#%9o=LXrKUE!kVmL;4ja`!05uV~%VecY4i%8YsoJZ_cLrC+S$FYr5kyiua7 zYm@_PRpv}}`1u=&t~RW>e^Zic9J6?@po5U?%4*Q%N_g4xo3f5gh}j^>6r-+3vmI4h zGHD`Yx(i*8r#b3DeoDx>X^vKqzrP}@r;}aH<)fBlN(Zln=jyLt_>dF`sQM2t323NKz6 zvX~>;1O*zxi8+$PrPUu&T@N|f9zSoE?W)hNCh@1TT?tVc#q@4Nr~WbCFBhWT731$_ zyBaor2t0KgdsdSD-iI49i3qyWJ&VX5Wf{ji${?td*XdA-=N$|OgpA1re5o-S{nm$z z@dl+_)mhPG{#Yqj<+Pk+{Z6?XF<;br4BsbrK%b-$<{~65>~_g~e<@cV)*zWzE$zx; zwiMpGw5uvBlfsvlc9n{%o}z~+*0Z~%@B^h?8LW2-zfszi6g4ST?;m%XQql7oy2q1J z)ly|#wLPq68Xr{Mm7VqoR-9-kLEZiixb=pNZhv)HJd(!WsqQM(@oj zDCvAj4OeETNwA|l7hxE3*sYMwZbydQWMyGpb1^)d4uWRf`X*GBVpIQ=)uk?KZ$yjY-sELC1T-uM%ekH2>L7N4pwbuo!IkMPJI_SWNU#?AsX{{= z33^98gO{7&hI;346X%^Z5LE^Q)i(H=u3X+I8AOE*Oh4*jf>anx-u-!;NqLQt}M&7KjcmITpv4_yA0pi%$1CP^>j1W zsgkU08UE$Nu0;Aj^RTN@D5s3xwpar(O4H_wL^3^`Sv$G1Ml=FJu>}#Myb6uR5sggA zF#t@vu!=P*#@-2Xd&tx-LDpOd8D3;cwh7S4x`9r8QK$0@{_Jp9AT%2e=;m6BCO9_3 zTFC4Tyfpn3i1|>U7TTJSs3{0pQy>qQh$s|wI=(Q;>{a+caT*GRSn?rSkCTuoPFZ>~ zdI&#)TVc%nn+?>!B-bEoXF7L09-!mKGXY`#H=e`uvM6&q%FMZhyHNOzESSZ#c3S?URl0feDLYzyMYLT3^{r^9lSzL|g0#M5!7 zYXLgtluk7jCd`L4i?>V`bSkJ1pu<4v@K0gPd{GlW5ZA+iM*wRFjFy2IK$!2r=K^Pd z3xF_xhs)xLE07HQ=B&&>U!Ma{T`dujPE_^$6#4U@wqs3bQcY-VyJ}0GU7z zAWX3~vQ!zU2{dh^uH5J5Z*q%qXM=X_y_xB1a`Z}*z>6no^&Ze6v-}haD*^si%uq< z4vU~;Aie|6=HuTkfd3s_*#~j|fmVPp1@TC~Bwc|68x-k4h+;r~hh+aZke@fZp#X&` zjCYyB$k6p^77r^Qc`Ve_A6mR;0;hoLHTC24gkw6RZ#Fks?mbh=-0apiW4+j!dm6gD6Tlmvt^ z^Km9V1J|X2MZgOtz6!2u0gZqT145`zxF98A@+$l{_H;UqFnYkczXL*rSadh>k=W{v zghz$(bo|Yqz!g9q7zwx_zCL+YkcHs4z!N$?hmOk;hV%vh=>Qeo&Zux-09^>Z_d%VB zaiN9}Vfq{R5V!!u_r+$^fH3XAJsGyAlSzc>^Dp_)1?%50&4mR;fCA1o1zZ^a5_ER} z*MT_bmj`N_+?nk?ebw#1yB%Ecq=eLa`c97ic_G-R^aN%|djt#%ACvU@tJG4(bIUOn!U8 zo83%?{wknq-H5xpv=3>49!0>y{DkXYfXl#56HnX)K(38N13;KqT&Ds106M)v7&@<` z6+nk?>^1QuZv{Tl_)x?F5j%k|G>Zt|8FDXxQm6vL6vK5gkPc*-_#9j}1~vn95{58z zLPa)E1~76;jZ1My%j)6Fu2flF_OpAtBSc3uTz(iUDZ|ks0fqtZ2ZBHhkOa`-3x>h< zo$N`sAb*L^2JQtK4nxx`41@w5G`j;o4R-k>PWp7(LP0zo_s|1)0MHG>p9z6ZA6N){ z3zR@^gaBdg!}Wu}5MZQ;1%@&^ui@W5vK1{>Dw0rvE z))gOtwgPww5GDuLO@N-jAYe2Q8leVK+*4hlT@Y>o@ znneM81yh8gacy=JR+kFn7easJXq*-g90Y_3eF%$PzyaVSAj}WAz6_9q=S&U?wEQ8?3h zqw9KTd_BBh3G4)N0b!o{m;4Kb=wAizt&ib8kO>GA=2LF7*ngUJrgbLML|J)E^33O$@@Y#_JWZR0 zr-2H%QZWUz5+2Ze5uD8D*N3{h(p6nP>s$Co)`qRdh5dp>SKZ?9i>{fGX*t~&V-8Tw zS?n$^tIcEF!}WlCWxcLw`2pk54DU3f09aA`>8siu`1iBh%``M7_T4_1^H7Rd?dvYf4%^pa|u5sC!x^>gdvN6=GFP_-K*r#8*o?#*;omv z4zvWO0>Y5J`#<16hd+CObHD{4Z0bmbSV*^^R8YWKh)g8H>cx)kS+>wpkVk+SlQD7t zgt-$>`%)I9|1S7#0ND#e{uIVzW6e6!n}sO+0^WiM#Q-U$h-FPduMVgR)S5zT0y*Ip z&6w1t_G5rmZyM0tY^R1TOK;dBO`LWG+qGPGhsHuZTnf9CgqxIAp1s^P-jy1nU1+Cv zL2n;e0|@hf;U~ebmhfXpK7WRSe;A-`YaazjFKj}ZP!SIDM_?Y5Qo)x7{;&4m!w>Rz zIUo%A8{tj&@>5uRS%8Bh;ApSe697f%Il!D#X8Uu{xeELZ2y;h!_2vHV+160{G|XZG zCxLsXN8Bdix;Rh@C~xB1;(7q^C@|f`uf_ETz&7Ah6Mq!fR{`2bD`5sk%|I3qHs!P( zxXcQ|rV5l=1D%1MzyrXb8EWnj_bMectugkg1G+WA!XO~bN^om{w}7pHFoIX_lBdIO z-T}4(bfS$gZ|Z#LHVaaIFRc89$$_OQ7PWwAfR46F2I%-1VgAWJ2f7V_4nTLq9UgLY zl+3fhkY-pj281D=PIW1W9|V3VFbWW64X$4TJ_0^A@o(aKGeBp&`~g@HhFye157|2^ z6ksm`{L|!Fec>T2%{-mp5)H%v$v_%V2A~64ssW)I_z~vcI5fK}D3H>oKuFgdL6d&S zh}GRVpxBe1Fv6q!yhyD`W&Q|6?9p~mHWaRKXZ!r_rlM*s0$vB+1x^Bg0K&9>90d^Q z2|NI3+YXXtE`%Qe`UL7vvIv`wPoQc74*&xIVSF=jUx6ebZKhgxoI8hw?t}0kFb`M_ z2s0Sh!+|xx`zF5qlUVWw`UB&DslYryn7grm2>OG7(NAK|E58S1DFO&9X#t4Q#>h7_v;HGrCT!IMs59-IBWgI-9wOU2vt>Lc)mKvSR%&=Z&kRe+i%z9X(b1rp%LXn@|Q)=WnT-GB#x0e~3@%{f*0JN!7K@s|Ap1R@JnJ;A_I%7a9 zV8lXNU7Hn|EV#&*HT7b4fJWe2$GXU)XgGlxz{`LzX}Hb|^UF*;aiqTzFzXZF2xtnl z1nvVK0EPf}&=37v2mi6Ysbl?rOu_#aq0m2P(f<~}KlmT21%-ORo$j3|6O=>$v3>`w zaF_$A`Y$3>aHKh2&uFifa=G`4G3itnzPiMl8kvCpn%}KkS-5TnGzSLPkokhv-YHtW zh#LZCG9Wak;CjAULsgXw~{Xug4$fR}-kb{MAuOMz#AGr(EkFF^Qr1J`ZZ zW6MTCv}=zqaXX+j2TFI)a;8F)Qi%T?pbW@KfKZ-{>-#(6Ie-|wjTi`C{9i@ZA4Asn zhR&#tS_v2!M@K~60)&!;A#%gcT1YjNmocV}>lV%-I*}>2Q@G$@A|q8P+6}Xr-8J22 z%IfZTX!nd*&!GvBIa&!*X#e(%`@{awHtH$_tpI8|`01$3?4!L&MK`~K(&j-7t{)0J zXxSIVsIPvL!xEPnJzr*j>_^TDoJzLxyD6;ove5; ztNx{l(Q>z=Lg!z7JU*fr&UBHhnpj@>WIT$gNvnLFrxCf6fCyOppF(3ad_sgDiEEml z?g`MWtqRPWr02G>08@ULdo(g9zFfbasFJuL!aMOl9giKF=c8j(q^Vfy13Xi;`_N5k zj1q^58@loBGEczfdCZ2a06qg~qw@X00U&z@3I#BDhF&oIRU2c160O2ekoV5i$tH9H z`3*pXO^12X2mz*St2pBGNz1azyE`H>`MDUSJ= z_cAeB77tM>fv#qvv;5V;JPteod;=RKubZ+KB^Ny}Bg-bYISA{X3-BTZup8I|><112 zM*)!x@qY|lF7PgD(c`ExGf|ut04KqXSg83tP#KA?&=d&NEGm0(_fI~m3x3)g{WV}c z@E$bKURSWc4`JIvj@hF(mF>7b01HI7hVl)B;G(co+84bD5Cg=4q>7qC`=F-)sX$Ah z6)+x{0Nnd@B%w_e+Wq_)F!Y4*FM|-f82$h?7HfXhQ*t11UC35wWAjV8&`zQK%R4Ly zr>El*q!a>b+z6U<-4K52;oafh`f3thD#nY(v=F1cj;+08j4GkMo!wQNm&NjvSj7=9 zAQwQH)^SR;^x%c@u$Nd=qW+}zVmDT_0x~{4$NS)z*BxgpEnU^M(fizM^5*kLJexI( z$ePh-;piK0lZ$u7DKIQ@T~uMyJCeq(`f^o4o|5{~hy^XYb(JGBkGyXli3hkWS;c}? z0598UY0=+aM*=Bx*IKl+(i=Ek-4rvdb{V(uHogjS-`JWYUgz$QSLiHA@ufR(_;L-Y>G=NT0aqucTw%mc#EcH{38!0rCec#7cE5N!;e3()S|MUFo{_FmN~aBCck4 z!{An!>9~FtSOvTh;qRADKsXD;An+-KytsBytK`kP)W)4nL#EUA`p0ocX}9@W;BxVQ z9uVzZI&{hdLKgpYhnoPjMR!ktw$C1MSo6GF$|DeJA<;rv{MQDDL>kR*!3XRyTKIrHenVK(q|9x(ZqgE!osIPx&f;$qA4Q#@#u=adV(YEic z6l!}>+b2O9^gAX_0AUK_2SUH>ZN;NhO2w)W-^lo0;7OQfG|gJeE}%Om{c053e*LJNkgK_0S$rnKrf*G4GJ$ObR2p= z17}I!g56ZGW7$K1F#lxV>N@-cMgp{9p)mHp@SYA(44}ORg~`W9-sT8m53|NV8(=sf z3~jqIMb{<=p39|?C0pM4F_C*t>DRkNZ_XF=4`t@*7LV*_8jRYHaJp-%( zb^^jQ&C9F7rEW|s7>yOZ=~EpGm_K2;1+e^#?k6BjVSFNV>H{;*U>l>q6l2T1=t zfb>5FNdLF9p?~Y(|E^Dwp#)H5C;=3iZ6W+nY$yf40p=9kI)`_u&!bxbR0f1G^YP#- z{2%SfUC8Y5p9 zPV|oe698dIKOG?b@&M`I3y^+ufb>TJ!W60>`nL`W(Wl5z0w^++0E!GHfFeT)pvagL zK-=AS1*(n0&jdgiVNnp@6nbG^-MHRUkA;R~!?(uRsErN*sRIZ@d@b;_(;V4X{Xf`` zgCF_b{SNLA;5vXE=pwCh3Ia(5GJ&#yFynBY3v@sP2ACpP82>nQp9Y=*Rs+HiKQGKb zZ}14eU<*ll8A@A#9l%$H14()v*YAY+op-_evDMuq;2q#J&x z?Zft;<6jtZR~X+gtiQ#iPr4Ki`5___GGYQ>3sNxK4~4_wzyyF&B+S3%LvT9>KqNxa z1(Qbuku9{B-yz^vkwpmQPW`cgp5ETC>5AMSKWhCG#kObXipgzzL7yvvt z2tRXy`M}%2Cg3n|1Q6yaWcLzaH*ms~^>@irLF=OpwrOXBmtAk*y?AXHicxS|V`M&4 z9~7HjCyl%{k1Z?K>Z5gSIuQf@T%*stl+UW``B@j~8`91{W6*O6aG|pl52OQSO&zBZ zxSj+o0$u=K12zG|U|UP64$u*J02m64{gKuf>-(@Nmo)ntX3T(#*R(-bsGo;PLx4ws z@xWx@ao{O{c1Tl!ZGbSO-yb0TQ2^;r0Z4x?K>C{jVg5ls^lu&9rcaTf1W;rs0TdZZ z07ZrpK#?&g;1|fh1GfOhiyBk}TcO1R!k85#@MItJAKH_jO4!f%kjZ1(>5VpQqwU=~ znRqkT-NZkR>t(jH z5aw%K9|CfLN!a*JnE!y+ThM>&QBg!91;_x(0F{6mKwY3YFbEh42t)b_0O@A}q+c1R z>&N}ChYNBr7!am#2mg&eMTQcPSqwjv0*Vc#fFeUFpva8$t93v2lu|-9u<2V4&>Uz1 z^ZdWfM0=2fG`7bP5KJ~(tiga z{X+ohYlh0`T`B$xy>ak-Jn$^A9M}qM15N-Z0bxilbT^7NWOF$n2HBix%IZ7uNzgA2 zlm&$GkRM?_L+AB6T7ZS-hV}=%7ibI&0-gd^0eGyX*tOvIZxCyvX5MzPjfG|hl_6DH9J_-Kb*E&x$?!IRr;fHo-X46Fy<281!&H;&lT zrqjCV4RRnrI}VNoXg9)XfH1;7%=3*qT_HMcac_%bH@wf>g2LW7S5ySO*& z-LHJ!BSm|)^#FYxCeq15vbvgLrKJ}?E6v|E8rxXu>$-Qd)Pa==`dpBfL-h3sxgu#)5#BK?lDCnMA4LM%eRV~w{R}YH>Ee0L zhpx|zwU^Y$)?8}y&K|r2gJ@+@Cv`wLbw)_q&5A7UXfIr9oVIF~CvjN(Ml#h$Q?w5{ zarq9q#L*!-+l|g}3jwnMVV2-}BS2@befdA|bTS*A!1fDp1rUa1V&XrORhQ^gwd#N{ zVT*s_scXM0L`SR@2kHV10AbqVdN4popgsOS@N_~NorLxx@RBK#Z{d13#hy+#J9E3m zKk<6(>EJUu;H*2)3lL@yu4e#rX4%UBfu|$Q=;*Ql&KijZgh|D9&1_apqT|Rq-)`{_ zyt+5eTi+RCCD5Y*egKM>jQH-o15c-vcIp_*c=-Zbja71f6Z%O!w>6^+b{`O0jx9K61rA_4}mXD z{6$<}1Fi!%O?(wp_}V}nps}g)cfoaUpbs!0L#WKQpH$ zHm{2Q3Jpyp(DSgj{;bl!bEoHr{@63t_0cFV)#DPm$~&1ruM7MvR^Y0+F|R<5wP^+f ztT)#bna?5?w5A@=KXg~2xYQC_fz@T_pZJy!NCt#y{0H9E03HU01Hu%>kAu!EU_S7? zN&m@0_zmFS`a@2Yuw}4hF$Em95WKptrMHIHPX~ki44eUe!J8i1+i~Y0{Hnk9F@QfgpML8hl2{VSLf&)iY32CUO5>M zht2(^mVi*l@dT0^yPS)6OSSNl`s0ub$$2xPM*I8k1ZX4w{lEd>dw@3W{{g@b{n9VM zd0-Pt?FA&L=JAMooE#we&_0M@?}gpR$F*2i@UOsQX&l4w2&>GqaJmL%NjW-@?TQtB zT`WmofCZgjciM)TL12QNNsj?O2U>Jsw}Tl8NX?{EoW6Bp0s&}>Pz0JRLZUHo(_~PZjF!U1U19VvNI#ZFRBZ+H>Ovn@a z0m=gCuSBRuEo(tR(8+4&aU6gMZahlc0zk;(pB@MM03qYpBIy@^P9;jli5OJE6gpSH zRVETdZ)GVOL^OoDwYv;vXiV0oc7=NCKdZlw@(wJ{lp4I(5^t$^`cA{LOO|bR*C7@y z$+Fcg*;w-$>WU@a_7*mz2A5y-#_{sYy+QuQDzBGkE%RouDK*r#%e+0UY(Wk6_2<2n ztycO%gI8FEMTzA#$w?yHSW``Y(fgXrF4R=NTzt?z2%Ixj>92cwjur*!> zPg?8kYo%{A_zP=sBH?puy-8O3L_-s;^pS>P5zn3LynnLu&G^3c-Xgrm>t45-{EBym zh27LC%sFXR%%cBW>5C0Mcs+JWp8tl|!^^(zU1FsVHw@0fl{dU!v5n37w{Li7d+B2h z%SDT9lU0sd97CZV8bNRcN->= zKHrFl?3s4lqk4z2v+ejq)mxt3Xvbeyz4KYS_Pp+9?-~}@LH%j7cX1*s)tpZ{;GM$C zbl~zg-oM!74*c(Lyq{X>Lk&LckhijW^ILC6#;!Kt9lrB!VZA%5!NcD3R(7J(lH=Z| z(LGl2UsGl;cTxA}df$`T!cOYElit_8tY|m2&PDGNcDA~^`q^dg+X;-{r%np`E-{vM zzdE{z@52C_*+;EW(s$Xy+B~RM$o6eeSj)crhw{FqtXp6HSOs4T_Eru4c?I7-=IEt9 zSJ9Ws*tLFqTV>xPtbKpAaur`iIi9|xuq?xEu)AvO`B@S9`Q`vVsj6=zvkX*!uj=b< zV`UyvJJ#||N@J%6s|W7$J!oT3+^g1j$k#8L9U7{>FxGb;W3`8?@}s`SZnky=Z#KjC z74r>L;~)2(l-aW*)f-Rv<}!AAG@moex15dXsQ+IbqkcBq_Yh;<>#6t5^|@r$e5{%? z&*yhDbh%nA^9^*d-Q(0vt9=RO*eB!FulM_&v9hNJ^Pz`)E7++=Ro{2MfXqft;Higw zt69&9>dwPHS!U{E>aOp7^BG$(N$qjW_l46+Uoh~}r+p>V)<64h$ZUFuw><0H!QP$B z{lED3GkL0d>K9)v7i-*EO}p&d;AAJJst0cQqH!S4^u=fVjoGg0yn^g6!46F4U1a|V zR%(X&x$NIEjLktg|E z9{+vp$yq$w>+c#*Unp31S!J8cm8Q1{HIVndseGCjj<3#AZ+QI!Eo{O(wSUkbXJ?N2 z>f|_o6F;joU)`1A-;>0u&*#e;_|w@F^VMw){8@~x?W>+?KbSiqOG^G}SU&kZb2*_P=_)o=S?1pV&)YIb}7AvvBtKCm2@WSh@b zoH?kLk@d+1YSE7VpOD`RRo2-*ld-+y)j3`L%`9x{LVmD^Ka;IrxT&ZAvdrFJs9x>m z_sDGfLTaO8)uj9V$7S}-LXMWI8n4{P|1^tQ#B=)~N->L6{71|2^v!`KS8E~Dn4Lnk zAk@@F-2I?GQ=u;qESne)Jm^nj6Benx9`tWlSna2I%3%L?w(MzsVzB>S7PnYU9pYan zvz*217eoE^Wwvy&>VMdOQ)ZVJbKeO6Qr2;ax^{%W*Ccl4psHMiXRP*jy!7w>E$sY3 z^~~>nMP|Pq;=liad!2iT$N%ZiVd;l?$3OkoScSv9%_V;Y*7Pu+ddXj&^*XG+eaXMw z&K^0ej=6zC!D=5-&;0G*pUgHL7Z#{I3U0Uft20L?%H!mIN%+6{5 z8R}=H17k*LXV}$yF3?yzPixk5fd&@sJgvPe0}bhrEH&(CJiH zy@s9R=`<|$*80Hm;@UB4&+iFzw4iIrFYO83lSF+>%YNKPt-&14tdyy3k*Vlx@;ZA1 zu}Re1v|QKjbh^#nO)m?iK?g*QfQEKJ)U3UM59#Qt*831KbUgXf`vU#x$f}$B0&P)4 zB;IC!U;~{B#@T_uo9tDlZaNTnNv0E@)%(8mD}VK1;Aw_)h3g#(Ou>P!>c@uy z7MTSc>aOns_IS3}!T0?Z*leXvCOwFX@KJvRw$k~Xef|i%W3^Jhk{7=cSi`qn4XmWo zIQv`+tSU~OO3RCA!TfkAIPIU=?DlDTGHgf&x|(W<>w%YL3p$(X?!N+1#}Stg{2ge< z4&|!r{|@w2lBj=ax#bRLlVe51xg6jn?ZKON>TFtG;PsSXG@Bma_bS0SwlKguE5Qxy zvw-Sw1ixeKqagpm6|Bx~2GwHj;1cwzqxn05U^$$nsh$o5i&zq=hiQ2sDjd-Jk#KIs zsxd`^Kgz6cJiieWJjVtWhrogJXr%Dz$UkH{AE|43mjYnQ2lUME|r$Hzx}9*pNb z4+ksq4bKKD@w&T$ek*kWb&Iu!gMBrQ=k5x6)Qm5Kd!1J56!JRzgZJV4k_Uz9EA74msUgDGrSHZOTJm~KJ0kcbjI_ejvrM;}GrXQiog zj|Qj4S*aUHy`dPMaxoaC*1Qx<3|OfbxWp2brB1a))sg8e+K=o}U9>|giz!i!v_mTU zDp6?`bobO*O4McxyHHAP=#J`}M(6IRua%8@oQ|ncD_4zrzYdP2dE&RxQ9v|M1c(7* dfjA%@C<-J1i9ixi3`ho2fK>Ij(Zy|>{~t}Kp>Y5J delta 126676 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�Fu$ptEDW< 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 BXnC!jDIX$iy3czN@C=|-rLfwj(>2~P z0Nvc33eY9pxq$FPcXM~ErlrA07h5j?=mP77)rsrfa#3}BZGfWy&4tedo&pvEG&L>4 zp*y5#GFI5>2BQp2)KviHWK&q#v2;1oIp6{?9C^USM^XjMhh=-4#?lnn^C)NGe==r{ zVycka>ezwE&jWyPqk9DQL1oYO&hwpwCf*TWXq+G~y&FXp2e*)fYX3iaLWAqpkuH6n zgc?dWFJAyeq~bqah+GYoqa;3>Mu}{dS_aua%|tR9j8)*0x&dHwb*;1aC=JwU_Rt zV7k|4rJo}3aWlMi)XUSolVmotmpbHO{O-w0zenI(W_b7TPI=z_tmOdJJ<}T@v+;xY zxLIgt9;D);_ME`F4_3jY%PcTVUHXW3jiovL3c+&4BHLuNf1EZTTP={M-z410(k~S5 zWS0)(d5?QPWo3rb|E7G^9PdfiY&ah~*E^q$8P0Fb_2#lO!+DQ+-fOJ>2;OPFcb}Dh zkid^D@E%H}pCo9-=5&>{+27RDKxzJHr26F(-eofTZloG`(z{${tw!^KPkWQuk>LNV zF}i(6@PDPTeC^ZTF;@B&0VN_-cI(U=$bZ=3J;;6;uWsDw{n5%MPUOq> zdKa@r6V+<_y!B<4HAx+{-@9LCcBJJT?wqhbT#gK z?{AFlpRW2YdtdRhgn;_apWdq$b|FuFi}?x^_W3M6-Q`=#zMsWo-M)6LMNdB1?R%R& zH&w0c@g*}h|52Xn^G#%5KB}Jd`D)6n(QGdJeI;1)**wngo4}ULR_FVD18nT&nd*-* zzK2uT$94_^|7xU8@ifb z`Pes}9bByr{=|36!j27AYn}6bz}W58s{0Gy%Z$w$#*csLdyt)3%bQ>Fb!DAi;>#}i zwzDzoc>AxA(wP+`$kxpcgvpd zeQ|d7+!nRu&%Ra>?DZ|X2SuDN#opS&Yn6^jWhJ+&xuqk@GnV~`I;%_sl)MpJ`H+ec zz1dG&`O%6IJ>qFQzvXj@x|D``!qs{ylr)t3}LVR@&l^Pew$RI-q8R&%#O+@Nsn_ zGFYPmby=N=t1|0Qpf0Qz;gMOF0u?>jZ?cv4^lM!ae>ywD%6;`CvW%y$@wCf7yqB;d z;&lb;L-iw~<@k-{d|vA&Qdl#}{I%l|2U*}Zb=HXpMP_+d`TUbmU?yNA_{oTDw)-0Y@nppB?A2@hn^O@r z*vHp+;^~O$?5AsLhtm;9?96sujrbs9Jc9aNopmS|h8u`bQ{Vlbd+)^L(H?wFr zxs90WZ*HN>)e5HiE6WzBin#F2-^)cek*W1(`+Lh4sEF#)$NkI8TA&~DdK>)REKm&j zlN-^tumrS6p1RTh3Y&S0 zf4vb2qkGM&Z1NAId(EER9@zTLFs(tasOTmR7F017W(S!6aJU! za@rdw{JX8}a)!G7ZGS7-0@aW=e%hPJ3*PZNd6{?pGZ^lPUHPuR6x|c69(vcmPPRZt zRENFqUxY5A3Vx>GZ^K6ZskS`p@2iv|wa{|g9n7gCUoQ+B3gek7{N;20KbWH`KXl$7 zXD21mvX&n`?~i8Xs`8)C`wLj_s_F|D{2wvay&9kXr9YEBRZZRVrToKl}SQ zS?(Wv=M78_;BL(8H&6wj8mf(M`t!AGv(yWJ_`kN`{x$V2Ir3l8bf46sn8<84FIzno z6WP^|o0Zhm^vJrhh3*mRn-O_es3$WlE2LS$QhW<_L#mGnB@q0HvU zp~RKttMVg#yx$9vH>{-H8QyB~%Znmw>E1})(;Wg^bZ?33V=qSfWGg9re8!82Y1^8} z2dt#`X;!t-+Q=Li%W0x6+!ncmv3o2W5AFH)J0o2x64jfr*PE)>c16A@TcGsu6?-Df zV6B3`yeBf%0pFfWr zA=9nOea}bs)b3Q>b3U?#1-c&p^E^U(zy;M1& diff --git a/transport/v0/conn.go b/transport/v0/conn.go index 3623c12..114f342 100644 --- a/transport/v0/conn.go +++ b/transport/v0/conn.go @@ -12,14 +12,13 @@ import ( "github.com/gaukas/water" "github.com/gaukas/water/internal/log" "github.com/gaukas/water/internal/socket" - v0 "github.com/gaukas/water/internal/v0" ) // Conn is the first experimental version of Conn implementation. type Conn struct { // callerConn is used by DialV0() and AcceptV0(). It is used to talk to // the caller of water API by allowing the caller to Read() and Write() to it. - callerConn net.Conn // the connection from the caller, usually a *net.UnixConn + callerConn net.Conn // the connection from the caller, usually a *net.TCPConnPair // srcConn is used by AcceptV0() and RelayV0(). It is used // to talk to a remote source by accepting a connection from it. @@ -29,7 +28,7 @@ type Conn struct { // to talk to a remote destination by actively dialing to it. dstConn net.Conn // the connection to the remote destination, usually a *net.TCPConn - tm *v0.TransportModule + tm *TransportModule closeOnce *sync.Once closed atomic.Bool @@ -40,13 +39,13 @@ type Conn struct { // dial dials the network address using through the WASM module // while using the dialerFunc specified in core.config. func dial(core water.Core, network, address string) (c water.Conn, err error) { - tm := v0.Core2TransportModule(core) + tm := UpgradeCore(core) conn := &Conn{ tm: tm, closeOnce: &sync.Once{}, } - dialer := v0.NewManagedDialer(network, address, core.Config().NetworkDialerFuncOrDefault()) + dialer := NewManagedDialer(network, address, core.Config().NetworkDialerFuncOrDefault()) if err = conn.tm.LinkNetworkInterface(dialer, nil); err != nil { return nil, err @@ -56,13 +55,13 @@ func dial(core water.Core, network, address string) (c water.Conn, err error) { return nil, err } - reverseCallerConn, callerConn, err := socket.UnixConnPair() + reverseCallerConn, callerConn, err := socket.TCPConnPair() // wasmCallerConn, conn.uoConn, err = socket.TCPConnPair() if err != nil { if reverseCallerConn == nil || callerConn == nil { - return nil, fmt.Errorf("water: socket.UnixConnPair returned error: %w", err) + return nil, fmt.Errorf("water: socket.TCPConnPair returned error: %w", err) } else { // likely due to Close() call errored - log.Errorf("water: socket.UnixConnPair returned error: %v", err) + log.LErrorf(core.Logger(), "water: socket.TCPConnPair returned error: %v", err) } } conn.callerConn = callerConn @@ -76,14 +75,14 @@ func dial(core water.Core, network, address string) (c water.Conn, err error) { return nil, err } - log.Debugf("water: DialV0: conn.tm.Worker() returned") + log.LDebugf(core.Logger(), "water: DialV0: conn.tm.Worker() returned") // safety: we need to watch for the blocking worker thread's status. // If it returns, no further data can be processed by the WASM module // and we need to close this connection in that case. go func() { <-conn.tm.WorkerErrored() - log.Debugf("water: DialV0: worker thread returned") + log.LDebugf(core.Logger(), "water: DialV0: worker thread returned") conn.Close() }() @@ -93,7 +92,7 @@ func dial(core water.Core, network, address string) (c water.Conn, err error) { // accept accepts the network connection using through the WASM module // while using the net.Listener specified in core.config. func accept(core water.Core) (c water.Conn, err error) { - tm := v0.Core2TransportModule(core) + tm := UpgradeCore(core) conn := &Conn{ tm: tm, closeOnce: &sync.Once{}, @@ -107,15 +106,15 @@ func accept(core water.Core) (c water.Conn, err error) { return nil, err } - reverseCallerConn, callerConn, err := socket.UnixConnPair() + reverseCallerConn, callerConn, err := socket.TCPConnPair() if err != nil { if reverseCallerConn == nil || callerConn == nil { - return nil, fmt.Errorf("water: socket.UnixConnPair returned error: %w", err) + return nil, fmt.Errorf("water: socket.TCPConnPair returned error: %w", err) } else { // likely due to Close() call errored - log.Errorf("water: socket.UnixConnPair returned error: %v", err) + log.LErrorf(core.Logger(), "water: socket.TCPConnPair returned error: %v", err) } } else if reverseCallerConn == nil || callerConn == nil { - return nil, errors.New("water: socket.UnixConnPair returned nil") + return nil, errors.New("water: socket.TCPConnPair returned nil") } conn.callerConn = callerConn @@ -141,13 +140,13 @@ func accept(core water.Core) (c water.Conn, err error) { } func relay(core water.Core, network, address string) (c water.Conn, err error) { - tm := v0.Core2TransportModule(core) + tm := UpgradeCore(core) conn := &Conn{ tm: tm, closeOnce: &sync.Once{}, } - dialer := v0.NewManagedDialer(network, address, core.Config().NetworkDialerFuncOrDefault()) + dialer := NewManagedDialer(network, address, core.Config().NetworkDialerFuncOrDefault()) if err = conn.tm.LinkNetworkInterface(dialer, core.Config().NetworkListenerOrPanic()); err != nil { return nil, err @@ -220,13 +219,13 @@ func (c *Conn) Close() (err error) { } c.closeOnce.Do(func() { - log.Debugf("Defering TM") + log.LDebugf(c.tm.core.Logger(), "Defering TM") c.tm.DeferAll() - log.Debugf("Canceling TM") + log.LDebugf(c.tm.core.Logger(), "Canceling TM") err = c.tm.Cancel() - log.Debugf("Cleaning TM") + log.LDebugf(c.tm.core.Logger(), "Cleaning TM") c.tm.Cleanup() - log.Debugf("TM canceled") + log.LDebugf(c.tm.core.Logger(), "TM canceled") }) return err diff --git a/transport/v0/dialer_test.go b/transport/v0/dialer_test.go index c351bc3..284836a 100644 --- a/transport/v0/dialer_test.go +++ b/transport/v0/dialer_test.go @@ -14,8 +14,10 @@ import ( ) func TestDialer(t *testing.T) { + loadPlain() loadReverse() t.Run("plain must work", testDialerPlain) + t.Run("reverse must work", testDialerReverse) t.Run("bad addr must fail", testDialerBadAddr) t.Run("partial WATM must fail", testDialerPartialWATM) } @@ -23,7 +25,7 @@ func TestDialer(t *testing.T) { func testDialerBadAddr(t *testing.T) { // Dial config := &water.Config{ - TMBin: reverse, + TransportModuleBin: plain, } dialer, err := water.NewDialer(config) @@ -59,7 +61,152 @@ func testDialerPlain(t *testing.T) { // skipcq: GO-R1005 // Dial using water config := &water.Config{ - TMBin: reverse, + TransportModuleBin: plain, + } + dialer, err := water.NewDialer(config) + if err != nil { + t.Fatal(err) + } + + conn, err := dialer.Dial("tcp", tcpLis.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer conn.Close() // skipcq: GO-S2307 + + // type assertion: conn must be *v0.Conn + if _, ok := conn.(*v0.Conn); !ok { + t.Fatalf("returned conn is not *v0.Conn") + } + + wg.Wait() + if goroutineErr != nil { + t.Fatal(goroutineErr) + } + defer peerConn.Close() // skipcq: GO-S2307 + + // trigger garbage collection for several times to simulate any + // possible GC in the real world use case + runtime.GC() + time.Sleep(100 * time.Microsecond) + runtime.GC() + time.Sleep(100 * time.Microsecond) + runtime.GC() + time.Sleep(100 * time.Microsecond) + + var waterSendBuf []byte = make([]byte, 1024) + var peerSendBuf []byte = make([]byte, 1024) + var waterRecvBuf []byte = make([]byte, 1024) + var peerRecvBuf []byte = make([]byte, 1024) + // send 10 messages in each direction + for i := 0; i < 10; i++ { + _, err = rand.Read(waterSendBuf) + if err != nil { + t.Fatalf("rand.Read error: %s", err) + } + + _, err = rand.Read(peerSendBuf) + if err != nil { + t.Fatalf("rand.Read error: %s", err) + } + + // dialer -> listener + _, err = conn.Write(waterSendBuf) + if err != nil { + t.Fatalf("conn.Write error: %s", err) + } + + n, err := peerConn.Read(peerRecvBuf) + if err != nil { + t.Fatalf("peerConn.Read error: %s", err) + } + + if n != len(waterSendBuf) { + t.Fatalf("peerConn.Read error: read %d bytes, want %d bytes", n, len(waterSendBuf)) + } + + if !bytes.Equal(peerRecvBuf[:n], waterSendBuf) { + t.Fatalf("peerRecvBuf != waterSendBuf") + } + + // listener -> dialer + _, err = peerConn.Write(peerSendBuf) + if err != nil { + t.Fatalf("peerConn.Write error: %s", err) + } + + n, err = conn.Read(waterRecvBuf) + if err != nil { + t.Fatalf("conn.Read error: %s", err) + } + + if n != len(peerSendBuf) { + t.Fatalf("conn.Read error: read %d bytes, want %d bytes", n, len(peerSendBuf)) + } + + if !bytes.Equal(waterRecvBuf[:n], peerSendBuf) { + t.Fatalf("waterRecvBuf != peerSendBuf") + } + + // trigger garbage collection + runtime.GC() + time.Sleep(100 * time.Microsecond) + } + + // reading with a deadline + err = conn.SetDeadline(time.Now().Add(100 * time.Millisecond)) + if err != nil { + t.Fatal(err) + } + + _, err = conn.Read(waterRecvBuf) + if err == nil { + t.Fatalf("conn.Read must timeout") + } + + if err := conn.Close(); err != nil { + t.Fatal(err) + } + + // after closing the conn, read/write MUST fail + _, err = conn.Write(waterSendBuf) + if err == nil { + t.Fatalf("conn.Write must fail after closing the conn") + } + + _, err = conn.Read(waterRecvBuf) + if err == nil { + t.Fatalf("conn.Read must fail after closing the conn") + } + + if err := tcpLis.Close(); err != nil { + t.Fatal(err) + } + + // trigger garbage collection + runtime.GC() + time.Sleep(100 * time.Microsecond) +} + +func testDialerReverse(t *testing.T) { // skipcq: GO-R1005 + tcpLis, err := net.Listen("tcp", "localhost:0") + if err != nil { + t.Fatal(err) + } + + // goroutine to accept incoming connections + var peerConn net.Conn + var goroutineErr error + var wg *sync.WaitGroup = new(sync.WaitGroup) + wg.Add(1) + go func() { + defer wg.Done() + peerConn, goroutineErr = tcpLis.Accept() + }() + + // Dial using water + config := &water.Config{ + TransportModuleBin: reverse, } dialer, err := water.NewDialer(config) if err != nil { @@ -197,11 +344,11 @@ func testDialerPlain(t *testing.T) { // skipcq: GO-R1005 } func testDialerPartialWATM(t *testing.T) { - t.Skip() // TODO: implement this with a few WebAssembly Transport Modules which partially implement the v0 dialer spec + t.Skip("skipping [testDialerPartialWATM]...") // TODO: implement this with a few WebAssembly Transport Modules which partially implement the v0 dialer spec } // BenchmarkDialerOutbound currently measures only the outbound throughput -// of the dialer. Inbound throughput is not measured at the moment. +// of the dialer. Inbound throughput is measured for the listener instead. // // Separate benchmark for the latency measurement will be needed. func BenchmarkDialerOutbound(b *testing.B) { @@ -224,7 +371,7 @@ func BenchmarkDialerOutbound(b *testing.B) { // Dial config := &water.Config{ - TMBin: plain, + TransportModuleBin: plain, } dialer, err := water.NewDialer(config) if err != nil { @@ -259,7 +406,15 @@ func BenchmarkDialerOutbound(b *testing.B) { } } -func BenchmarkReverseDialerOutbound(b *testing.B) { +// BenchmarkDialerOutboundReverse currently measures only the outbound throughput +// of the dialer. Inbound throughput is measured for the listener instead. +// +// Different from BenchmarkDialerOutbound, this benchmark uses the reverse +// WebAssembly Transport Module, which reverse the bytes of each message before +// sending it to the peer. +// +// Separate benchmark for the latency measurement will be needed. +func BenchmarkDialerOutboundReverse(b *testing.B) { loadReverse() // create random TCP listener listening on localhost tcpLis, err := net.ListenTCP("tcp", nil) @@ -279,7 +434,7 @@ func BenchmarkReverseDialerOutbound(b *testing.B) { // Dial config := &water.Config{ - TMBin: reverse, + TransportModuleBin: reverse, } dialer, err := water.NewDialer(config) if err != nil { diff --git a/transport/v0/listener_test.go b/transport/v0/listener_test.go index c875394..b8defb6 100644 --- a/transport/v0/listener_test.go +++ b/transport/v0/listener_test.go @@ -14,8 +14,10 @@ import ( ) func TestListener(t *testing.T) { + loadPlain() loadReverse() t.Run("plain must work", testListenerPlain) + t.Run("reverse must work", testListenerReverse) t.Run("bad addr must fail", testListenerBadAddr) t.Run("partial WATM must fail", testListenerPartialWATM) } @@ -23,7 +25,7 @@ func TestListener(t *testing.T) { func testListenerBadAddr(t *testing.T) { // prepare config := &water.Config{ - TMBin: reverse, + TransportModuleBin: plain, } _, err := config.Listen("tcp", "256.267.278.289:2023") @@ -39,7 +41,150 @@ func testListenerBadAddr(t *testing.T) { func testListenerPlain(t *testing.T) { // skipcq: GO-R1005 // prepare config := &water.Config{ - TMBin: reverse, + TransportModuleBin: plain, + } + + testLis, err := config.Listen("tcp", "localhost:0") + if err != nil { + t.Fatal(err) + } + + // goroutine to accept incoming connections + var conn net.Conn + var goroutineErr error + var wg *sync.WaitGroup = new(sync.WaitGroup) + wg.Add(1) + go func() { + defer wg.Done() + conn, goroutineErr = testLis.Accept() + }() + + // Dial with net.Dial + peerConn, err := net.Dial("tcp", testLis.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer peerConn.Close() // skipcq: GO-S2307 + + // wait for listener to accept connection + wg.Wait() + if goroutineErr != nil { + t.Fatal(goroutineErr) + } + defer conn.Close() // skipcq: GO-S2307 + + // type assertion: conn must be *v0.Conn + if _, ok := conn.(*v0.Conn); !ok { + t.Fatalf("conn is not *v0.Conn") + } + + // trigger garbage collection for several times to simulate any + // possible GC in the real world use case + runtime.GC() + time.Sleep(100 * time.Microsecond) + runtime.GC() + time.Sleep(100 * time.Microsecond) + runtime.GC() + time.Sleep(100 * time.Microsecond) + + var peerSendBuf []byte = make([]byte, 1024) + var waterSendBuf []byte = make([]byte, 1024) + var peerRecvBuf []byte = make([]byte, 1024) + var waterRecvBuf []byte = make([]byte, 1024) + // send 10 messages in each direction + for i := 0; i < 10; i++ { + _, err = rand.Read(peerSendBuf) + if err != nil { + t.Fatalf("rand.Read error: %s", err) + } + + _, err = rand.Read(waterSendBuf) + if err != nil { + t.Fatalf("rand.Read error: %s", err) + } + + // water -> peer + _, err = conn.Write(waterSendBuf) + if err != nil { + t.Fatalf("conn.Write error: %s", err) + } + + n, err := peerConn.Read(peerRecvBuf) + if err != nil { + t.Fatalf("lisConn.Read error: %s", err) + } + + if n != len(waterSendBuf) { + t.Fatalf("lisConn.Read error: read %d bytes, want %d bytes", n, len(waterSendBuf)) + } + + if !bytes.Equal(peerRecvBuf[:n], waterSendBuf) { + t.Fatalf("peerRecvBuf != waterSendBuf") + } + + // peer -> water + _, err = peerConn.Write(peerSendBuf) + if err != nil { + t.Fatalf("lisConn.Write error: %s", err) + } + + n, err = conn.Read(waterRecvBuf) + if err != nil { + t.Fatalf("conn.Read error: %s", err) + } + + if n != len(peerSendBuf) { + t.Fatalf("conn.Read error: read %d bytes, want %d bytes", n, len(peerSendBuf)) + } + + if !bytes.Equal(waterRecvBuf[:n], peerSendBuf) { + t.Fatalf("waterRecvBuf != peerSendBuf") + } + + // trigger garbage collection + runtime.GC() + time.Sleep(100 * time.Microsecond) + } + + // reading with a deadline + err = conn.SetDeadline(time.Now().Add(100 * time.Millisecond)) + if err != nil { + t.Fatal(err) + } + + _, err = conn.Read(waterRecvBuf) + if err == nil { + t.Fatalf("conn.Read must timeout") + } + + if err := conn.Close(); err != nil { + t.Fatal(err) + } + + // after closing the conn, read/write MUST fail + _, err = conn.Write(waterSendBuf) + if err == nil { + t.Fatalf("conn.Write must fail after closing the conn") + } + + _, err = conn.Read(waterRecvBuf) + if err == nil { + t.Fatalf("conn.Read must fail after closing the conn") + } + + if err = testLis.Close(); err != nil { + t.Fatal(err) + } + + // trigger garbage collection + runtime.GC() + time.Sleep(100 * time.Microsecond) +} + +func testListenerReverse(t *testing.T) { // skipcq: GO-R1005 + // prepare + config := &water.Config{ + TransportModuleBin: reverse, } testLis, err := config.Listen("tcp", "localhost:0") @@ -190,18 +335,18 @@ func testListenerPlain(t *testing.T) { // skipcq: GO-R1005 } func testListenerPartialWATM(t *testing.T) { - t.Skip() // TODO: implement this with a few WebAssembly Transport Modules which partially implement the v0 listener spec + t.Skip("skipping [testListenerPartialWATM]...") // TODO: implement this with a few WebAssembly Transport Modules which partially implement the v0 listener spec } -// BenchmarkListenerInbound currently measures only the inbound throughput -// of the listener. Outbound throughput is not measured at the moment. +// BenchmarkInboundListener currently measures only the inbound throughput +// of the listener. Outbound throughput is measured for the dialer instead. // // Separate benchmark for the latency measurement will be needed. -func BenchmarkListenerInbound(b *testing.B) { +func BenchmarkInboundListener(b *testing.B) { loadPlain() // prepare config := &water.Config{ - TMBin: plain, + TransportModuleBin: plain, } testLis, err := config.Listen("tcp", "localhost:0") @@ -247,11 +392,19 @@ func BenchmarkListenerInbound(b *testing.B) { } } -func BenchmarkReverseListenerInbound(b *testing.B) { +// BenchmarkInboundListenerReverse currently measures only the inbound throughput +// of the listener. Outbound throughput is measured for the dialer instead. +// +// Different from BenchmarkInboundListener, this benchmark uses the reverse +// WebAssembly Transport Module, which reverse the bytes of each message before +// sending it to the peer. +// +// Separate benchmark for the latency measurement will be needed. +func BenchmarkInboundListenerReverse(b *testing.B) { loadReverse() // prepare config := &water.Config{ - TMBin: reverse, + TransportModuleBin: reverse, } testLis, err := config.Listen("tcp", "localhost:0") diff --git a/internal/v0/managed_dialer.go b/transport/v0/managed_dialer.go similarity index 100% rename from internal/v0/managed_dialer.go rename to transport/v0/managed_dialer.go diff --git a/transport/v0/relay_test.go b/transport/v0/relay_test.go index ab38b1b..a08454c 100644 --- a/transport/v0/relay_test.go +++ b/transport/v0/relay_test.go @@ -13,12 +13,13 @@ import ( ) func TestRelay(t *testing.T) { + loadPlain() loadReverse() t.Run("plain must work", testRelayPlain) + t.Run("reverse must work", testRelayReverse) } func testRelayPlain(t *testing.T) { // skipcq: GO-R1005 - // t.Skip() // test destination: a local TCP server tcpLis, err := net.ListenTCP("tcp", nil) if err != nil { @@ -37,7 +38,153 @@ func testRelayPlain(t *testing.T) { // skipcq: GO-R1005 // setup relay config := &water.Config{ - TMBin: reverse, + TransportModuleBin: plain, + } + relay, err := water.NewRelay(config) + if err != nil { + t.Fatal(err) + } + + // in a goroutine, start relay + var relayErr error + var relayWg *sync.WaitGroup = new(sync.WaitGroup) + relayWg.Add(1) + go func() { + relayErr = relay.ListenAndRelayTo("tcp", "localhost:0", "tcp", tcpLis.Addr().String()) + relayWg.Done() + }() + time.Sleep(100 * time.Millisecond) // 100ms to spin up relay + + // test source: a local TCP client + clientConn, err := net.Dial("tcp", relay.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer clientConn.Close() // skipcq: GO-S2307 + + // wait for server to accept connection + serverAcceptWg.Wait() + if serverAcceptErr != nil { + t.Fatal(serverAcceptErr) + } + defer serverConn.Close() // skipcq: GO-S2307 + + // trigger garbage collection for several times to simulate any + // possible GC in the real world use case + runtime.GC() + time.Sleep(100 * time.Microsecond) + runtime.GC() + time.Sleep(100 * time.Microsecond) + runtime.GC() + time.Sleep(100 * time.Microsecond) + + var clientSendBuf []byte = make([]byte, 1024) + var serverSendBuf []byte = make([]byte, 1024) + var clientRecvBuf []byte = make([]byte, 1024) + var serverRecvBuf []byte = make([]byte, 1024) + // send 10 messages in each direction + for i := 0; i < 10; i++ { + _, err = rand.Read(clientSendBuf) + if err != nil { + t.Fatalf("rand.Read error: %s", err) + } + + _, err = rand.Read(serverSendBuf) + if err != nil { + t.Fatalf("rand.Read error: %s", err) + } + + // client -> server + _, err = clientConn.Write(clientSendBuf) + if err != nil { + t.Fatalf("conn.Write error: %s", err) + } + + n, err := serverConn.Read(serverRecvBuf) + if err != nil { + t.Fatalf("serverConn.Read error: %s", err) + } + + if n != len(clientSendBuf) { + t.Fatalf("serverConn.Read error: read %d bytes, want %d bytes", n, len(clientSendBuf)) + } + + if !bytes.Equal(serverRecvBuf[:n], clientSendBuf) { + t.Fatalf("serverRecvBuf != clientSendBuf") + } + + // server -> client + _, err = serverConn.Write(serverSendBuf) + if err != nil { + t.Fatalf("serverConn.Write error: %s", err) + } + + n, err = clientConn.Read(clientRecvBuf) + if err != nil { + t.Fatalf("clientConn.Read error: %s", err) + } + + if n != len(serverSendBuf) { + t.Fatalf("clientConn.Read error: read %d bytes, want %d bytes", n, len(serverSendBuf)) + } + + if !bytes.Equal(clientRecvBuf[:n], serverSendBuf) { + t.Fatalf("clientRecvBuf != serverSendBuf") + } + + // trigger garbage collection + runtime.GC() + time.Sleep(100 * time.Microsecond) + } + + // stop relay + err = relay.Close() + if err != nil { + t.Fatal(err) + } + + // wait for relay to stop + relayWg.Wait() + if relayErr != nil { + t.Fatal(relayErr) + } + + // at this time, connection must still be alive + _, err = clientConn.Write([]byte("hello")) + if err != nil { + t.Fatal(err) + } + + n, err := serverConn.Read(serverRecvBuf) + if err != nil { + t.Fatal(err) + } + + if string(serverRecvBuf[:n]) != "hello" { + t.Fatalf("serverRecvBuf != \"hello\"") + } +} + +func testRelayReverse(t *testing.T) { // skipcq: GO-R1005 + // test destination: a local TCP server + tcpLis, err := net.ListenTCP("tcp", nil) + if err != nil { + t.Fatal(err) + } + + // goroutine to accept incoming connections + var serverConn net.Conn + var serverAcceptErr error + var serverAcceptWg *sync.WaitGroup = new(sync.WaitGroup) + serverAcceptWg.Add(1) + go func() { + serverConn, serverAcceptErr = tcpLis.Accept() + serverAcceptWg.Done() + }() + + // setup relay + config := &water.Config{ + TransportModuleBin: reverse, } relay, err := water.NewRelay(config) if err != nil { diff --git a/transport/v0/transport_module.go b/transport/v0/transport_module.go new file mode 100644 index 0000000..57e0227 --- /dev/null +++ b/transport/v0/transport_module.go @@ -0,0 +1,679 @@ +package v0 + +import ( + "fmt" + "net" + "runtime" + "sync" + + "github.com/gaukas/water" + "github.com/gaukas/water/internal/log" + "github.com/gaukas/water/internal/socket" + "github.com/gaukas/water/internal/wasm" + "github.com/tetratelabs/wazero/api" +) + +// TransportModule acts like a "managed core". It was build to provide WebAssembly +// Transport Module API-facing functions and utilities that are exclusive to +// version 0. +type TransportModule struct { + core water.Core + + _init func() (int32, error) // _init() -> (err i32) + + // _dial: + // - Calls to `env.host_dial() -> fd: i32` to dial a network connection and bind it to one + // of its file descriptors, record the fd for `remoteConnFd`. This will be the fd it used + // to read/write data from/to the remote destination. + // - Records the `callerConnFd`. This will be the fd it used to read/write data from/to + // the caller. + // - Returns `remoteConnFd` to the caller. + _dial func(int32) (int32, error) // _dial(callerConnFd i32) -> (remoteConnFd i32) + + // _accept: + // - Calls to `env.host_accept() -> fd: i32` to accept a network connection and bind it + // to one of its file descriptors, record the fd for `sourceConnFd`. This will be the fd + // it used to read/write data from/to the source address. + // - Records the `callerConnFd`. This will be the fd it used to read/write data from/to + // the caller. + // - Returns `sourceConnFd` to the caller. + _accept func(int32) (int32, error) // _accept(callerConnFd i32) -> (sourceConnFd i32) + + // _associate: + // - Calls to `env.host_accept() -> fd: i32` to accept a network connection and bind it + // to one of its file descriptors, record the fd for `sourceConnFd`. This will be the fd + // it used to read/write data from/to the source address. + // - Calls to `env.host_dial() -> fd: i32` to dial a network connection and bind it to one + // of its file descriptors, record the fd for `remoteConnFd`. This will be the fd it used + // to read/write data from/to the remote destination. + // - Returns 0 to the caller or an error code if any of the above steps failed. + _associate func() (int32, error) // _associate() -> (err i32) + + // backgroundWorker is used to replace the deprecated read-write-close model. + // We put it in a inlined struct for better code styling. + backgroundWorker *struct { + // _cancel_with: + // - Provides a socket to the WASM module for it to listen to cancellation events. + // - on Cancel() call, the pipe will be written to by the host (caller). + // - WebAssembly instance should select on the socket and handle cancellation ASAP. + // + // This is a workaround for not being able to call another WASM function until the + // current one returns. And apparently this function needs to be called BEFORE the + // blocking _worker() function. + _cancel_with func(int32) (int32, error) // _cancel_with(fd i32) -> (err i32) + + // _worker provides a blocking function for the WASM module to run a worker thread. + // In the worker thread, WASM module should select on all previously pushed sockets + // (typically, two among callerConnFd, remoteConnFd, and sourceConnFd) and handle + // data bi-directionally. The exact behavior is up to the WebAssembly module and + // overall it drives data flow below based on the identity of the module: + // - Dialer: callerConn <==> remoteConn + // - Listener: callerConn <==> sourceConn + // - Relay: sourceConn <==> remoteConn + // + // The worker thread should exit and return when the cancellation pipe is available + // for reading. For the current design, the content read from the pipe does not + // include meaningful data. + _worker func() (int32, error) // _worker() (err int32) + + // a channel used to send errors from the worker thread to the host in a non-blocking + // manner. When the worker thread exits, this channel will be closed. + // + // Read-only to the caller. Write-only to the worker thread. + chanWorkerErr chan error + + // a socket used to cancel the worker thread. When the host calls Cancel(), it should + // write to this socket. + cancelSocket net.Conn + } + + // gcfixOnce sync.Once + pushedConn map[int32]net.Conn // the conn we want to keep alive + pushedConnMutex sync.RWMutex + + deferOnce sync.Once + deferredFuncs []func() +} + +// UpgradeCore upgrades a water.Core to a v0 TransportModule. +func UpgradeCore(core water.Core) *TransportModule { + wasm := &TransportModule{ + core: core, + pushedConn: make(map[int32]net.Conn), + deferredFuncs: make([]func(), 0), + } + + err := core.WASIPreview1() + if err != nil { + log.LErrorf(core.Logger(), "water: WASI preview 1 is not supported: %v", err) + return nil + } + + // SetFinalizer, so Go GC automatically cleans up the WASM runtime + // and all opened file descriptors (if any) associated with it + // when the TransportModule is garbage collected. + runtime.SetFinalizer(wasm, func(tm *TransportModule) { + _ = tm.Cancel() // tm cannot be nil here as we just set it above + tm.DeferAll() + tm.Cleanup() + }) + + return wasm +} + +// AcceptFor is used to make the Transport Module act as a listener and +// accept a network connection. +func (tm *TransportModule) AcceptFor(reverseCallerConn net.Conn) (sourceConn net.Conn, err error) { + // check if _accept is exported + if tm._accept == nil { + return nil, fmt.Errorf("water: WASM module does not export _water_accept") + } + + callerFd, err := tm.PushConn(reverseCallerConn) + if err != nil { + return nil, fmt.Errorf("water: pushing caller conn failed: %w", err) + } + + sourceFd, err := tm._accept(callerFd) + if err != nil { + return nil, fmt.Errorf("water: calling _accept function returned error: %w", err) + } + + if sourceFd < 0 { + return nil, wasm.WASMErr(sourceFd) + } else { + sourceConn := tm.GetPushedConn(sourceFd) + if sourceConn == nil { + return nil, fmt.Errorf("water: failed to look up network connection by fd") + } + return sourceConn, nil + } +} + +// Associate is used to make the Transport Module act as a relay and +// associate two network connections, where one is from a source via +// a listener, and the other is to a destination via a dialer. +func (tm *TransportModule) Associate() error { + // check if _associate is exported + if tm._associate == nil { + return fmt.Errorf("water: WASM module does not export _water_associate") + } + + ret, err := tm._associate() + if err != nil { + return fmt.Errorf("water: calling _associate function returned error: %w", err) + } + + return wasm.WASMErr(ret) +} + +// Worker spins up a worker thread for the WASM module to run a blocking function. +// +// This function is non-blocking UNLESS the error occurred before entering the worker +// thread. In that case, the error will be returned immediately. +// +// Worker's implementation diverges by opting to use TCPConn or UnixConn. +// See transport_module_tcpconn.go and transport_module_unixconn.go for details. +// +// func (tm *TransportModule) Worker() error + +// Cancel cancels the worker thread if it is running and returns +// the error returned by the worker thread. This call is designed +// to block until the worker thread exits. +func (tm *TransportModule) Cancel() error { + if tm.backgroundWorker == nil { + return fmt.Errorf("water: Transport Module is not initialized") + } + + if tm.backgroundWorker.cancelSocket == nil { + return fmt.Errorf("water: Transport Module is cancelled") + } + + select { + case err := <-tm.backgroundWorker.chanWorkerErr: // if already returned, we don't need to cancel + if err != nil { + return fmt.Errorf("water: worker thread returned error: %w", err) + } + return nil + default: // otherwise we will need to cancel the worker thread + break + } + + // write to the cancel pipe + if _, err := tm.backgroundWorker.cancelSocket.Write([]byte{0}); err != nil { + return fmt.Errorf("water: writing to cancel pipe failed: %w", err) + } + + // wait for the worker thread to exit + if err := <-tm.backgroundWorker.chanWorkerErr; err != nil { + return fmt.Errorf("water: worker thread returned error: %w", err) + } + + if err := tm.backgroundWorker.cancelSocket.Close(); err != nil { + return fmt.Errorf("water: closing cancel pipe failed: %w", err) + } + + tm.backgroundWorker.cancelSocket = nil + + return nil +} + +// Clean up the Transport Module by closing all connections pushed into the Transport Module and +// shutdown the underlying Core. +func (tm *TransportModule) Cleanup() { + // clean up pushed files + var keyList []int32 + tm.pushedConnMutex.Lock() + for k, v := range tm.pushedConn { + if v != nil { + if err := v.Close(); err != nil { + log.LErrorf(tm.core.Logger(), "water: closing pushed connection failed: %v", err) + } + } + keyList = append(keyList, k) + } + for _, k := range keyList { + delete(tm.pushedConn, k) + } + tm.pushedConnMutex.Unlock() + + // clean up deferred functions + tm.deferredFuncs = nil + + if err := tm.core.Close(); err != nil { + log.LErrorf(tm.core.Logger(), "water: closing core failed: %v", err) + } +} + +func (tm *TransportModule) Defer(f func()) { + tm.deferredFuncs = append(tm.deferredFuncs, f) +} + +func (tm *TransportModule) DeferAll() { + tm.deferOnce.Do(func() { // execute all deferred functions ONLY IF not yet executed + for _, f := range tm.deferredFuncs { + f() + } + }) +} + +// DialFrom is used to make the Transport Module act as a dialer and +// dial a network connection. +// +// Takes the reverse caller connection as an argument, which is used +// to communicate with the caller. +func (tm *TransportModule) DialFrom(reverseCallerConn net.Conn) (destConn net.Conn, err error) { + // check if _dial is exported + if tm._dial == nil { + return nil, fmt.Errorf("water: WASM module does not export _water_dial") + } + + callerFd, err := tm.PushConn(reverseCallerConn) + if err != nil { + return nil, fmt.Errorf("water: pushing caller conn failed: %w", err) + } + + remoteFd, err := tm._dial(callerFd) + if err != nil { + return nil, fmt.Errorf("water: calling _dial function returned error: %w", err) + } + + if remoteFd < 0 { + return nil, wasm.WASMErr(remoteFd) + } else { + destConn := tm.GetPushedConn(remoteFd) + if destConn == nil { + return nil, fmt.Errorf("water: failed to look up network connection by fd") + } + return destConn, nil + } +} + +func (tm *TransportModule) LinkNetworkInterface(dialer *ManagedDialer, listener net.Listener) error { + var dialerFunc func() (fd int32) + if dialer != nil { + dialerFunc = func() (fd int32) { + conn, err := dialer.Dial() + if err != nil { + return wasm.GENERAL_ERROR + } + fd, _ = tm.PushConn(conn) + return fd + } + } else { + dialerFunc = func() (fd int32) { + return wasm.INVALID_FUNCTION + } + } + + if err := tm.core.ImportFunction("env", "host_dial", dialerFunc); err != nil { + return fmt.Errorf("water: linking dialer function, (*water.Core).ImportFunction: %w", err) + } + + var acceptFunc func() (fd int32) + if listener != nil { + acceptFunc = func() (fd int32) { + conn, err := listener.Accept() + if err != nil { + return wasm.GENERAL_ERROR + } + fd, _ = tm.PushConn(conn) + return fd + } + } else { + acceptFunc = func() (fd int32) { + return wasm.INVALID_FUNCTION + } + } + + if err := tm.core.ImportFunction("env", "host_accept", acceptFunc); err != nil { + return fmt.Errorf("water: linking listener function, (*water.Core).ImportFunction: %w", err) + } + + return nil +} + +// Initialize initializes the WASMv0 runtime by getting all the exported functions from +// the WASM module. +// +// All imports must be set before calling this function. +func (tm *TransportModule) Initialize() error { + if tm.core == nil { + return fmt.Errorf("water: core is not initialized") + } + + var err error + // import host_defer function + if err = tm.core.ImportFunction("env", "host_defer", func() { + tm.DeferAll() + }); err != nil { + return fmt.Errorf("water: (*water.Core).ImportFunction returned error "+ + "when importing host_defer function: %w", err) + } + + // import pull_config function (it is called pushConfig here in the host) + // if tm.core.ImportedFunctions()["env"]["pull_config"] != nil { + if err = tm.core.ImportFunction("env", "pull_config", tm.pushConfig); err != nil { + return fmt.Errorf("water: (*water.Core).ImportFunction returned error "+ + "when importing pull_config function: %w", err) + } + // } + + // instantiate the WASM module + if err = tm.core.Instantiate(); err != nil { + return err + } + + coreCtx := tm.core.Context() + + // _init + init := tm.core.ExportedFunction("_water_init") + if init == nil { + return fmt.Errorf("water: WASM module does not export _water_init") + } else { + // check signature: + // _water_init() -> (err i32) + if len(init.Definition().ParamTypes()) != 0 { + return fmt.Errorf("water: _water_init function expects 0 argument, got %d", len(init.Definition().ParamTypes())) + } + + if len(init.Definition().ResultTypes()) != 1 { + return fmt.Errorf("water: _water_init function expects 1 result, got %d", len(init.Definition().ResultTypes())) + } else if init.Definition().ResultTypes()[0] != api.ValueTypeI32 { + return fmt.Errorf("water: _water_init function expects result type i32, got %s", api.ValueTypeName(init.Definition().ResultTypes()[0])) + } + + tm._init = func() (int32, error) { + ret, err := init.Call(coreCtx) + if err != nil { + return wasm.INVALID_FD, fmt.Errorf("water: calling _water_init function returned error: %w", err) + } + + return api.DecodeI32(ret[0]), nil + } + } + + // _dial + dial := tm.core.ExportedFunction("_water_dial") + if dial == nil { + return fmt.Errorf("water: WASM module does not export _water_dial") + } else { + // check signature: + // _water_dial(callerFd i32) -> (remoteFd i32) + if len(dial.Definition().ParamTypes()) != 1 { + return fmt.Errorf("water: _water_dial function expects 1 argument, got %d", len(dial.Definition().ParamTypes())) + } else if dial.Definition().ParamTypes()[0] != api.ValueTypeI32 { + return fmt.Errorf("water: _water_dial function expects argument type i32, got %s", api.ValueTypeName(dial.Definition().ParamTypes()[0])) + } + + if len(dial.Definition().ResultTypes()) != 1 { + return fmt.Errorf("water: _water_dial function expects 1 result, got %d", len(dial.Definition().ResultTypes())) + } else if dial.Definition().ResultTypes()[0] != api.ValueTypeI32 { + return fmt.Errorf("water: _water_dial function expects result type i32, got %s", api.ValueTypeName(dial.Definition().ResultTypes()[0])) + } + + tm._dial = func(callerFd int32) (int32, error) { + ret, err := dial.Call(coreCtx, api.EncodeI32(callerFd)) + if err != nil { + return wasm.INVALID_FD, fmt.Errorf("water: calling _water_dial function returned error: %w", err) + } + + return api.DecodeI32(ret[0]), nil + } + } + + // _accept + accept := tm.core.ExportedFunction("_water_accept") + if accept == nil { + return fmt.Errorf("water: WASM module does not export _water_accept") + } else { + // check signature: + // _water_accept(callerFd i32) -> (sourceFd i32) + if len(accept.Definition().ParamTypes()) != 1 { + return fmt.Errorf("water: _water_accept function expects 1 argument, got %d", len(accept.Definition().ParamTypes())) + } else if accept.Definition().ParamTypes()[0] != api.ValueTypeI32 { + return fmt.Errorf("water: _water_accept function expects argument type i32, got %s", api.ValueTypeName(accept.Definition().ParamTypes()[0])) + } + + if len(accept.Definition().ResultTypes()) != 1 { + return fmt.Errorf("water: _water_accept function expects 1 result, got %d", len(accept.Definition().ResultTypes())) + } else if accept.Definition().ResultTypes()[0] != api.ValueTypeI32 { + return fmt.Errorf("water: _water_accept function expects result type i32, got %s", api.ValueTypeName(accept.Definition().ParamTypes()[0])) + } + + tm._accept = func(callerFd int32) (int32, error) { + ret, err := accept.Call(coreCtx, api.EncodeI32(callerFd)) + if err != nil { + return wasm.INVALID_FD, fmt.Errorf("water: calling _water_accept function returned error: %w", err) + } + + return api.DecodeI32(ret[0]), nil + } + } + + // _associate + associate := tm.core.ExportedFunction("_water_associate") + if associate == nil { + return fmt.Errorf("water: WASM module does not export _water_associate") + } else { + // check signature: + // _water_associate() -> (err i32) + if len(associate.Definition().ParamTypes()) != 0 { + return fmt.Errorf("water: _water_associate function expects 0 argument, got %d", len(associate.Definition().ParamTypes())) + } + + if len(associate.Definition().ResultTypes()) != 1 { + return fmt.Errorf("water: _water_associate function expects 1 result, got %d", len(associate.Definition().ResultTypes())) + } else if associate.Definition().ResultTypes()[0] != api.ValueTypeI32 { + return fmt.Errorf("water: _water_associate function expects result type i32, got %s", api.ValueTypeName(associate.Definition().ResultTypes()[0])) + } + + tm._associate = func() (int32, error) { + ret, err := associate.Call(coreCtx) + if err != nil { + return wasm.INVALID_FD, fmt.Errorf("water: calling _water_associate function returned error: %w", err) + } + + return api.DecodeI32(ret[0]), nil + } + } + + // _cancel_with + cancelWith := tm.core.ExportedFunction("_water_cancel_with") + if cancelWith == nil { + return fmt.Errorf("water: WASM module does not export _water_cancel_with") + } else { + // check signature: + // _water_cancel_with(fd i32) -> (err i32) + if len(cancelWith.Definition().ParamTypes()) != 1 { + return fmt.Errorf("water: _water_cancel_with function expects 1 argument, got %d", len(cancelWith.Definition().ParamTypes())) + } else if cancelWith.Definition().ParamTypes()[0] != api.ValueTypeI32 { + return fmt.Errorf("water: _water_cancel_with function expects argument type i32, got %s", api.ValueTypeName(cancelWith.Definition().ParamTypes()[0])) + } + + if len(cancelWith.Definition().ResultTypes()) != 1 { + return fmt.Errorf("water: _water_cancel_with function expects 1 result, got %d", len(cancelWith.Definition().ResultTypes())) + } else if cancelWith.Definition().ResultTypes()[0] != api.ValueTypeI32 { + return fmt.Errorf("water: _water_cancel_with function expects result type i32, got %s", api.ValueTypeName(cancelWith.Definition().ResultTypes()[0])) + } + } + + // _worker + worker := tm.core.ExportedFunction("_water_worker") + if worker == nil { + return fmt.Errorf("water: WASM module does not export _water_worker") + } else { + // check signature: + // _water_worker() -> (err i32) + if len(worker.Definition().ParamTypes()) != 0 { + return fmt.Errorf("water: _water_worker function expects 0 argument, got %d", len(worker.Definition().ParamTypes())) + } + + if len(worker.Definition().ResultTypes()) != 1 { + return fmt.Errorf("water: _water_worker function expects 1 result, got %d", len(worker.Definition().ResultTypes())) + } else if worker.Definition().ResultTypes()[0] != api.ValueTypeI32 { + return fmt.Errorf("water: _water_worker function expects result type i32, got %s", api.ValueTypeName(worker.Definition().ResultTypes()[0])) + } + } + + // wrap _cancel_with and _worker + tm.backgroundWorker = &struct { + _cancel_with func(int32) (int32, error) + _worker func() (int32, error) + chanWorkerErr chan error + cancelSocket net.Conn + }{ + _cancel_with: func(fd int32) (int32, error) { + ret, err := cancelWith.Call(coreCtx, api.EncodeI32(fd)) + if err != nil { + return wasm.INVALID_FD, fmt.Errorf("water: calling _water_cancel_with function returned error: %w", err) + } + + return api.DecodeI32(ret[0]), nil + }, + _worker: func() (int32, error) { + ret, err := worker.Call(coreCtx) + if err != nil { + return wasm.INVALID_FD, fmt.Errorf("water: calling _water_worker function returned error: %w", err) + } + + return api.DecodeI32(ret[0]), nil + }, + chanWorkerErr: make(chan error, 4), // at max 1 error would occur, but we can buffer more copies + // cancelSocket: nil, + } + + // call _init + if errno, err := tm._init(); err != nil { + return fmt.Errorf("water: calling _water_init function returned error: %w", err) + } else { + return wasm.WASMErr(errno) + } +} + +// Worker spins up a worker thread for the WATM to run a blocking function, which is +// expected to be the mainloop. +// +// This function is non-blocking UNLESS the error occurred before entering the worker +// thread. In that case, the error will be returned immediately. +func (tm *TransportModule) Worker() error { + // check if _worker is exported + if tm.backgroundWorker == nil { + return fmt.Errorf("water: Transport Module is not initialized properly for background worker") + } + + // create cancel pipe + cancelConnR, cancelConnW, err := socket.TCPConnPair() + if err != nil { + return fmt.Errorf("water: creating cancel pipe failed: %w", err) + } + tm.backgroundWorker.cancelSocket = cancelConnW // host will Write to this pipe to cancel the worker + + // push cancel pipe + cancelPipeFd, err := tm.PushConn(cancelConnR) + if err != nil { + return fmt.Errorf("water: pushing cancel pipe failed: %w", err) + } + + // pass the fd to the WASM module + ret, err := tm.backgroundWorker._cancel_with(cancelPipeFd) + if err != nil { + return fmt.Errorf("water: calling _water_cancel_with function returned error: %w", err) + } + if ret != 0 { + return fmt.Errorf("water: _water_cancel_with returned error: %w", wasm.WASMErr(ret)) + } + + log.LDebugf(tm.core.Logger(), "water: starting worker thread") + + // in a goroutine, call _worker + go func() { + defer close(tm.backgroundWorker.chanWorkerErr) + ret, err := tm.backgroundWorker._worker() + if err != nil { + // multiple copies in case of multiple receivers on the channel + tm.backgroundWorker.chanWorkerErr <- err + tm.backgroundWorker.chanWorkerErr <- err + tm.backgroundWorker.chanWorkerErr <- err + tm.backgroundWorker.chanWorkerErr <- err + return + } + if ret != 0 { + // multiple copies in case of multiple receivers on the channel + tm.backgroundWorker.chanWorkerErr <- wasm.WASMErr(ret) + tm.backgroundWorker.chanWorkerErr <- wasm.WASMErr(ret) + tm.backgroundWorker.chanWorkerErr <- wasm.WASMErr(ret) + tm.backgroundWorker.chanWorkerErr <- wasm.WASMErr(ret) + log.LWarnf(tm.core.Logger(), "water: worker thread exited with code %d", ret) + } else { + log.LDebugf(tm.core.Logger(), "water: worker thread exited with code 0") + } + }() + + log.LDebugf(tm.core.Logger(), "water: worker thread started") + + // last sanity check if the worker thread crashed immediately even before we return + select { + case err := <-tm.backgroundWorker.chanWorkerErr: // if already returned, basically it failed to start + return fmt.Errorf("water: worker thread returned error: %w", err) + default: + log.LDebugf(tm.core.Logger(), "water: Worker (func, not the worker thread) returning") + return nil + } +} + +// WorkerErrored returns a channel that will be closed when the worker thread exits. +func (tm *TransportModule) WorkerErrored() <-chan error { + if tm.backgroundWorker == nil { + return nil + } + return tm.backgroundWorker.chanWorkerErr +} + +func (tm *TransportModule) pushConfig() int32 { + // get config file + if tm.core.Config().TransportModuleConfig == nil { + return wasm.NOT_INITIALIZED // Not necessarily a fatal error -- it could be optional to a TransportModule + } + + configFile, err := tm.core.Config().TransportModuleConfig.AsFile() + if err == nil { + return wasm.INVALID_CONFIG // This is considered a fatal error, as the config file is supplied but cannot be loaded. + } + + // push config file into WebAssembly instance + configFd, err := tm.core.InsertFile(configFile) + if err != nil { + log.LErrorf(tm.core.Logger(), "water: pushing config file failed: %v", err) + return wasm.INVALID_FD + } + + return int32(configFd) +} + +// PushConn pushes a net.Conn into the Transport Module. +func (tm *TransportModule) PushConn(conn net.Conn) (fd int32, err error) { + fd, err = tm.core.InsertConn(conn) + if err != nil { + return wasm.INVALID_FD, err + } + + tm.pushedConnMutex.Lock() + tm.pushedConn[fd] = conn + tm.pushedConnMutex.Unlock() + + return fd, nil +} + +func (tm *TransportModule) GetPushedConn(fd int32) net.Conn { + tm.pushedConnMutex.RLock() + defer tm.pushedConnMutex.RUnlock() + if tm.pushedConn == nil { + return nil + } + if v, ok := tm.pushedConn[fd]; ok { + return v + } + + return nil +} diff --git a/transport_module_config.go b/transport_module_config.go index 504d316..c9a9b7b 100644 --- a/transport_module_config.go +++ b/transport_module_config.go @@ -1,28 +1,87 @@ package water import ( + "errors" + "fmt" "os" - - "github.com/gaukas/water/internal/log" + "runtime" ) -// TMConfig defines the configuration file used by the WebAssembly Transport Module. -type TMConfig struct { - FilePath string // Path to the config file. +// TransportModuleConfig defines the configuration file used by +// the WebAssembly Transport Module. +// +// It is optional to WATER, but may be mandatory according to the +// WebAssembly Transport Module implementation. +type TransportModuleConfig interface { + // AsFile returns the TransportModuleConfig as a file, which + // then can be loaded into the WebAssembly Transport Module. + // + // If the returned error is nil, the *os.File MUST be valid + // and in a readable state. + AsFile() (*os.File, error) +} + +// transportModuleConfigFile could be used to provide a config file +// on the local file system to the WebAssembly Transport Module by +// specifying the path to the config file. +// +// Implements TransportModuleConfig. +type transportModuleConfigFile string + +// TransportModuleConfigFromFile creates a TransportModuleConfig from +// the given file path. +func TransportModuleConfigFromFile(filePath string) (TransportModuleConfig, error) { + // Try opening the file to ensure it exists and is readable. + _, err := os.Open(filePath) + if err != nil { + return nil, fmt.Errorf("water: failed to open WATM config file: %w", err) + } + + return transportModuleConfigFile(filePath), nil } -// File opens the config file and returns the file descriptor. -func (c *TMConfig) File() *os.File { - if c.FilePath == "" { - log.Errorf("water: WASM config file path is not provided in config") - return nil +func (c transportModuleConfigFile) AsFile() (*os.File, error) { + if string(c) == "" { + return nil, errors.New("transport module config file path is empty") } - f, err := os.Open(c.FilePath) + f, err := os.Open(string(c)) if err != nil { - log.Errorf("water: failed to open WATM config file: %v", err) - return nil + return nil, fmt.Errorf("failed to open transport module config file: %w", err) + } + + return f, nil +} + +type transportModuleConfigBytes []byte + +// TransportModuleConfigFromBytes creates a TransportModuleConfig from +// the given byte slice. +func TransportModuleConfigFromBytes(configBytes []byte) TransportModuleConfig { + return transportModuleConfigBytes(configBytes) +} + +func (c transportModuleConfigBytes) AsFile() (*os.File, error) { + if len(c) == 0 { + return nil, errors.New("transport module config bytes is empty") + } + + f, err := os.CreateTemp("", "water-wasm-config-*.json") + if err != nil { + return nil, fmt.Errorf("failed to create temp file for transport module config: %w", err) + } + runtime.SetFinalizer(f, func(tmpFile *os.File) { + // Remove the temp file from local file system when collected. + // + // This does NOT guarantee the temp file will always be removed + // from the local file system before the program exits. However, + // it is still better than nothing when concurrency is high. + os.Remove(tmpFile.Name()) + }) + + if _, err := f.Write(c); err != nil { + return nil, fmt.Errorf("failed to write transport module config to temp file: %w", err) } - return f + return f, nil }