## API ### *Overview* There're just 3 roles in this library - `socket`, `client` and `message`. `client` is for physical connection while `socket` is for "namespace" (which is like a logical channel), which means one `socket` paired with one namespace, and one `client` paired with one physical connection. Since a physical connection can have multiple namespaces (which is called multiplex), a `client` object may have multiple `socket` objects, each of which is bound to a distinct `namespace`. Use `client` to setup the connection to the server, manange the connection status, also session id for the connection. Use `socket` to send messages under namespace and receives messages in the namespace, also handle special types of message. The `message` is just about the content you want to send, with text, binary or structured combinations. ### *Socket* #### Constructors Sockets are all managed by `client`, no public constructors. You can get it's pointer by `client.socket(namespace)`. #### Event Emitter `void emit(std::string const& name, message::list const& msglist, std::function const& ack)` Universal event emission interface, by applying implicit conversion magic, it is backward compatible with all previous `emit` interfaces. #### Event Bindings `void on(std::string const& event_name,event_listener const& func)` `void on(std::string const& event_name,event_listener_aux const& func)` Bind a callback to specified event name. Same as `socket.on()` function in JS, `event_listener` is for full content event object, `event_listener_aux` is for convenience. `void off(std::string const& event_name)` Unbind the event callback with specified name. `void off_all()` Clear all event bindings (not including the error listener). `void on_error(error_listener const& l)` Bind the error handler for socket.io error messages. `void off_error()` Unbind the error handler. ```C++ //event object: class event { public: const std::string& get_nsp() const; const std::string& get_name() const; const message::ptr& get_message() const; bool need_ack() const; void put_ack_message(message::ptr const& ack_message); message::ptr const& get_ack_message() const; ... }; //event listener declare: typedef std::function event_listener_aux; typedef std::function event_listener; typedef std::function error_listener; ``` #### Connect and close socket `connect` will happen for existing `socket`s automatically when `client` have opened up the physical connection. `socket` opened with connected `client` will connect to its namespace immediately. `void close()` Positively disconnect from namespace. #### Get name of namespace `std::string const& get_namespace() const` Get current namespace name which the client is inside. ### *Client* #### Constructors `client()` default constructor. #### Connection Listeners `void set_open_listener(con_listener const& l)` Call when websocket is open, especially means good connectivity. `void set_fail_listener(con_listener const& l)` Call when failed in connecting. `void set_close_listener(close_listener const& l)` Call when closed or drop. See `client::close_reason` ```C++ //connection listener declare: enum close_reason { close_reason_normal, close_reason_drop }; typedef std::function con_listener; typedef std::function close_listener; ``` #### Socket listeners `void set_socket_open_listener(socket_listener const& l)` Set listener for socket connect event, called when any sockets being ready to send message. `void set_socket_close_listener(socket_listener const& l)` Set listener for socket close event, called when any sockets being closed, afterward, corresponding `socket` object will be cleared from client. ```C++ //socket_listener declare: typedef std::function socket_listener; ``` #### Connect and Close `void connect(const std::string& uri)` Connect to socket.io server, e.g., `client.connect("ws://localhost:3000");` `void close()` Close the client, return immediately. `void sync_close()` Close the client, don't return until it is really closed. `bool opened() const` Check if client's connection is opened. #### Transparent reconnecting `void set_reconnect_attempts(int attempts)` Set max reconnect attempts, set to 0 to disable transparent reconnecting. `void set_reconnect_delay(unsigned millis)` Set minimum delay for reconnecting, this is the delay for 1st reconnecting attempt, then the delay duration grows by attempts made. `void set_reconnect_delay_max(unsigned millis)` Set maximum delay for reconnecting. `void set_reconnecting_listener(con_listener const& l)` Set listener for reconnecting is in process. `void set_reconnect_listener(reconnect_listener const& l)` Set listener for reconnecting event, called once a delayed connecting is scheduled. #### Logs `void set_logs_default()` Configure logs to the default level (connect, disconnect, app) `void set_logs_quiet()` Configure logs to the quiet level `void set_logs_verbose()` Configure logs to the verbose level #### Namespace `socket::ptr socket(std::string const& nsp)` Get a pointer to a socket which is paired with the specified namespace. #### Session ID `std::string const& get_sessionid() const` Get socket.io session id. ### *Message* `message` Base class of all message object. `int_message` message contains a 64-bit integer. `double_message` message contains a double. `string_message` message contains a string. `array_message` message contains a `vector`. `object_message` message contains a `map`. `message::ptr` pointer to `message` object, it will be one of its derived classes, judge by `message.get_flag()`. All designated constructor of `message` objects is hidden, you need to create message and get the `message::ptr` by `[derived]_message:create()`.