228 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			V
		
	
	
| module websocket
 | |
| 
 | |
| // MessageEventHandler represents a callback on a new message
 | |
| struct MessageEventHandler {
 | |
| 	handler  SocketMessageFn  // callback function
 | |
| 	handler2 SocketMessageFn2 // callback function with reference
 | |
| 	is_ref   bool    // true if has a reference object
 | |
| 	ref      voidptr // referenced object
 | |
| }
 | |
| 
 | |
| // ErrorEventHandler represents a callback on error
 | |
| struct ErrorEventHandler {
 | |
| 	handler  SocketErrorFn  // callback function
 | |
| 	handler2 SocketErrorFn2 // callback function with reference
 | |
| 	is_ref   bool    // true if has a reference object
 | |
| 	ref      voidptr // referenced object
 | |
| }
 | |
| 
 | |
| // OpenEventHandler represents a callback when connection is opened
 | |
| struct OpenEventHandler {
 | |
| 	handler  SocketOpenFn  // callback function
 | |
| 	handler2 SocketOpenFn2 // callback function with reference
 | |
| 	is_ref   bool    // true if has a reference object
 | |
| 	ref      voidptr // referenced object
 | |
| }
 | |
| 
 | |
| // CloseEventHandler represents a callback on a closing event
 | |
| struct CloseEventHandler {
 | |
| 	handler  SocketCloseFn  // callback function
 | |
| 	handler2 SocketCloseFn2 // callback function with reference
 | |
| 	is_ref   bool    // true if has a reference object
 | |
| 	ref      voidptr // referenced object
 | |
| }
 | |
| 
 | |
| pub type AcceptClientFn = fn (mut c ServerClient) ?bool
 | |
| 
 | |
| pub type SocketMessageFn = fn (mut c Client, msg &Message) ?
 | |
| 
 | |
| pub type SocketMessageFn2 = fn (mut c Client, msg &Message, v voidptr) ?
 | |
| 
 | |
| pub type SocketErrorFn = fn (mut c Client, err string) ?
 | |
| 
 | |
| pub type SocketErrorFn2 = fn (mut c Client, err string, v voidptr) ?
 | |
| 
 | |
| pub type SocketOpenFn = fn (mut c Client) ?
 | |
| 
 | |
| pub type SocketOpenFn2 = fn (mut c Client, v voidptr) ?
 | |
| 
 | |
| pub type SocketCloseFn = fn (mut c Client, code int, reason string) ?
 | |
| 
 | |
| pub type SocketCloseFn2 = fn (mut c Client, code int, reason string, v voidptr) ?
 | |
| 
 | |
| // on_connect registers a callback when client connects to the server
 | |
| pub fn (mut s Server) on_connect(fun AcceptClientFn) ? {
 | |
| 	if s.accept_client_callbacks.len > 0 {
 | |
| 		return error('only one callback can be registered for accept client')
 | |
| 	}
 | |
| 	s.accept_client_callbacks << fun
 | |
| }
 | |
| 
 | |
| // on_message registers a callback on new messages
 | |
| pub fn (mut s Server) on_message(fun SocketMessageFn) {
 | |
| 	s.message_callbacks << MessageEventHandler{
 | |
| 		handler: fun
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_message_ref registers a callback on new messages and provides a reference object
 | |
| pub fn (mut s Server) on_message_ref(fun SocketMessageFn2, ref voidptr) {
 | |
| 	s.message_callbacks << MessageEventHandler{
 | |
| 		handler2: fun
 | |
| 		ref: ref
 | |
| 		is_ref: true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_close registers a callback on closed socket
 | |
| pub fn (mut s Server) on_close(fun SocketCloseFn) {
 | |
| 	s.close_callbacks << CloseEventHandler{
 | |
| 		handler: fun
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_close_ref registers a callback on closed socket and provides a reference object
 | |
| pub fn (mut s Server) on_close_ref(fun SocketCloseFn2, ref voidptr) {
 | |
| 	s.close_callbacks << CloseEventHandler{
 | |
| 		handler2: fun
 | |
| 		ref: ref
 | |
| 		is_ref: true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_message registers a callback on new messages
 | |
| pub fn (mut ws Client) on_message(fun SocketMessageFn) {
 | |
| 	ws.message_callbacks << MessageEventHandler{
 | |
| 		handler: fun
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_message_ref registers a callback on new messages and provides a reference object
 | |
| pub fn (mut ws Client) on_message_ref(fun SocketMessageFn2, ref voidptr) {
 | |
| 	ws.message_callbacks << MessageEventHandler{
 | |
| 		handler2: fun
 | |
| 		ref: ref
 | |
| 		is_ref: true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_error registers a callback on errors
 | |
| pub fn (mut ws Client) on_error(fun SocketErrorFn) {
 | |
| 	ws.error_callbacks << ErrorEventHandler{
 | |
| 		handler: fun
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_error_ref registers a callback on errors and provides a reference object
 | |
| pub fn (mut ws Client) on_error_ref(fun SocketErrorFn2, ref voidptr) {
 | |
| 	ws.error_callbacks << ErrorEventHandler{
 | |
| 		handler2: fun
 | |
| 		ref: ref
 | |
| 		is_ref: true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_open registers a callback on successful opening the websocket
 | |
| pub fn (mut ws Client) on_open(fun SocketOpenFn) {
 | |
| 	ws.open_callbacks << OpenEventHandler{
 | |
| 		handler: fun
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_open_ref registers a callback on successful opening the websocket
 | |
| // and provides a reference object
 | |
| pub fn (mut ws Client) on_open_ref(fun SocketOpenFn2, ref voidptr) {
 | |
| 	ws.open_callbacks << OpenEventHandler{
 | |
| 		handler2: fun
 | |
| 		ref: ref
 | |
| 		is_ref: true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_close registers a callback on closed socket
 | |
| pub fn (mut ws Client) on_close(fun SocketCloseFn) {
 | |
| 	ws.close_callbacks << CloseEventHandler{
 | |
| 		handler: fun
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // on_close_ref registers a callback on closed socket and provides a reference object
 | |
| pub fn (mut ws Client) on_close_ref(fun SocketCloseFn2, ref voidptr) {
 | |
| 	ws.close_callbacks << CloseEventHandler{
 | |
| 		handler2: fun
 | |
| 		ref: ref
 | |
| 		is_ref: true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // send_connect_event invokes the on_connect callback
 | |
| fn (mut s Server) send_connect_event(mut c ServerClient) ?bool {
 | |
| 	if s.accept_client_callbacks.len == 0 {
 | |
| 		// If no callback all client will be accepted
 | |
| 		return true
 | |
| 	}
 | |
| 	fun := s.accept_client_callbacks[0]
 | |
| 	res := fun(mut c) ?
 | |
| 	return res
 | |
| }
 | |
| 
 | |
| // send_message_event invokes the on_message callback
 | |
| fn (mut ws Client) send_message_event(msg &Message) {
 | |
| 	ws.debug_log('sending on_message event')
 | |
| 	for ev_handler in ws.message_callbacks {
 | |
| 		if !ev_handler.is_ref {
 | |
| 			ev_handler.handler(ws, msg) or { ws.logger.error('send_message_event error: $err') }
 | |
| 		} else {
 | |
| 			ev_handler.handler2(ws, msg, ev_handler.ref) or {
 | |
| 				ws.logger.error('send_message_event error: $err')
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // send_error_event invokes the on_error callback
 | |
| fn (mut ws Client) send_error_event(error string) {
 | |
| 	ws.debug_log('sending on_error event')
 | |
| 	for ev_handler in ws.error_callbacks {
 | |
| 		if !ev_handler.is_ref {
 | |
| 			ev_handler.handler(mut ws, error) or {
 | |
| 				ws.logger.error('send_error_event error: $error, err: $err')
 | |
| 			}
 | |
| 		} else {
 | |
| 			ev_handler.handler2(mut ws, error, ev_handler.ref) or {
 | |
| 				ws.logger.error('send_error_event error: $error, err: $err')
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // send_close_event invokes the on_close callback
 | |
| fn (mut ws Client) send_close_event(code int, reason string) {
 | |
| 	ws.debug_log('sending on_close event')
 | |
| 	for ev_handler in ws.close_callbacks {
 | |
| 		if !ev_handler.is_ref {
 | |
| 			ev_handler.handler(mut ws, code, reason) or {
 | |
| 				ws.logger.error('send_close_event error: $err')
 | |
| 			}
 | |
| 		} else {
 | |
| 			ev_handler.handler2(mut ws, code, reason, ev_handler.ref) or {
 | |
| 				ws.logger.error('send_close_event error: $err')
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // send_open_event invokes the on_open callback
 | |
| fn (mut ws Client) send_open_event() {
 | |
| 	ws.debug_log('sending on_open event')
 | |
| 	for ev_handler in ws.open_callbacks {
 | |
| 		if !ev_handler.is_ref {
 | |
| 			ev_handler.handler(mut ws) or { ws.logger.error('send_open_event error: $err') }
 | |
| 		} else {
 | |
| 			ev_handler.handler2(mut ws, ev_handler.ref) or {
 | |
| 				ws.logger.error('send_open_event error: $err')
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |