diff --git a/cmd/tools/modules/testing/common.v b/cmd/tools/modules/testing/common.v index fe8f921053..8284f24ddd 100644 --- a/cmd/tools/modules/testing/common.v +++ b/cmd/tools/modules/testing/common.v @@ -165,6 +165,7 @@ pub fn new_test_session(_vargs string, will_compile bool) TestSession { skip_files << 'examples/websocket/ping.v' // requires OpenSSL skip_files << 'examples/websocket/client-server/client.v' // requires OpenSSL skip_files << 'examples/websocket/client-server/server.v' // requires OpenSSL + skip_files << 'vlib/v/tests/websocket_logger_interface_should_compile_test.v' // requires OpenSSL skip_files << 'examples/vweb_orm_jwt' // requires mysql $if tinyc { skip_files << 'examples/database/orm.v' // try fix it diff --git a/cmd/tools/vtest-self.v b/cmd/tools/vtest-self.v index 5031d2e6f0..a97a57ee27 100644 --- a/cmd/tools/vtest-self.v +++ b/cmd/tools/vtest-self.v @@ -135,9 +135,11 @@ const ( 'vlib/net/websocket/websocket_test.v', 'vlib/crypto/rand/crypto_rand_read_test.v', 'vlib/net/smtp/smtp_test.v', + 'vlib/v/tests/websocket_logger_interface_should_compile_test.v', ] skip_with_fsanitize_address = [ 'vlib/net/websocket/websocket_test.v', + 'vlib/v/tests/websocket_logger_interface_should_compile_test.v', ] skip_with_fsanitize_undefined = [ 'do_not_remove', @@ -184,6 +186,7 @@ const ( 'vlib/net/http/response_test.v', 'vlib/builtin/js/array_test.js.v', 'vlib/net/smtp/smtp_test.v', + 'vlib/v/tests/websocket_logger_interface_should_compile_test.v', ] skip_on_linux = [ 'do_not_remove', @@ -214,6 +217,7 @@ const ( 'vlib/sync/many_times_test.v', 'vlib/sync/once_test.v', 'vlib/net/smtp/smtp_test.v', + 'vlib/v/tests/websocket_logger_interface_should_compile_test.v', ] skip_on_non_windows = [ 'do_not_remove', diff --git a/vlib/net/websocket/websocket_client.v b/vlib/net/websocket/websocket_client.v index 82f1f22355..bc3d86334d 100644 --- a/vlib/net/websocket/websocket_client.v +++ b/vlib/net/websocket/websocket_client.v @@ -36,11 +36,14 @@ pub mut: header http.Header // headers that will be passed when connecting conn &net.TcpConn = unsafe { nil } // underlying TCP socket connection nonce_size int = 16 // size of nounce used for masking - panic_on_callback bool // set to true of callbacks can panic - state State // current state of connection - logger &log.Logger = unsafe { nil } // logger used to log messages - resource_name string // name of current resource - last_pong_ut i64 // last time in unix time we got a pong message + panic_on_callback bool // set to true of callbacks can panic + state State // current state of connection + // logger used to log messages + logger &log.Logger = &log.Logger(&log.Log{ + level: .info +}) + resource_name string // name of current resource + last_pong_ut i64 // last time in unix time we got a pong message } // Flag represents different types of headers in websocket handshake diff --git a/vlib/net/websocket/websocket_server.v b/vlib/net/websocket/websocket_server.v index 228f48f50c..e7480f85ef 100644 --- a/vlib/net/websocket/websocket_server.v +++ b/vlib/net/websocket/websocket_server.v @@ -9,7 +9,9 @@ import rand // Server represents a websocket server connection pub struct Server { mut: - logger &log.Logger = unsafe { nil } // logger used to log + logger &log.Logger = &log.Logger(&log.Log{ + level: .info +}) ls &net.TcpListener = unsafe { nil } // listener used to get incoming connection to socket accept_client_callbacks []AcceptClientFn // accept client callback functions message_callbacks []MessageEventHandler // new message callback functions diff --git a/vlib/v/tests/websocket_logger_interface_should_compile_test.v b/vlib/v/tests/websocket_logger_interface_should_compile_test.v new file mode 100644 index 0000000000..fca808540c --- /dev/null +++ b/vlib/v/tests/websocket_logger_interface_should_compile_test.v @@ -0,0 +1,68 @@ +import net.websocket as ws + +pub type RawMessage = ws.Message + +pub struct WsTransport { +pub mut: + ws ws.Client +} + +struct WsClient { +pub mut: + transport Transport +} + +pub interface Transport { + send() + wait() +} + +fn (wst WsTransport) send() { + println('send is called') +} + +fn (wst WsTransport) wait() { + println('wait is called') +} + +pub fn new_ws_client(transport Transport) ?WsClient { + return WsClient{ + transport: transport + } +} + +fn server() ? { + mut s := ws.new_server(.ip6, 8081, '/') + + s.on_connect(fn (mut s ws.ServerClient) ?bool { + if s.resource_name != '/' { + return false + } + println('Client has connected...') + return true + })? + + s.on_message(fn (mut ws ws.Client, msg &RawMessage) ? { + mut transport := WsTransport{} + mut ws_client := new_ws_client(transport)? + _ := ws_client + }) + + s.on_close(fn (mut ws ws.Client, code int, reason string) ? { + println('client ($ws.id) closed connection') + }) + + s.listen() or { println('error on server listen: $err') } + + unsafe { + s.free() + } +} + +fn abc() ? { + server()? +} + +fn test_compilation_of_the_example_code_in_issue_15839() { + assert true +}