123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /*
- * Copyright (c) 2018-2019 SignalWire, Inc
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
- #pragma once
- KS_BEGIN_EXTERN_C
- typedef struct swclt_ttl_tracker swclt_ttl_tracker_t;
- typedef struct swclt_conn swclt_conn_t;
- typedef ks_status_t (*swclt_conn_incoming_cmd_cb_t)(swclt_conn_t *conn, swclt_cmd_t cmd, void *cb_data);
- typedef ks_status_t (*swclt_conn_connect_cb_t)(swclt_conn_t *conn, ks_json_t *error, blade_connect_rpl_t *connect_rpl, void *cb_data);
- typedef ks_status_t (*swclt_conn_failed_cb_t)(swclt_conn_t *conn, void *cb_data);
- /* Information about this connection */
- typedef struct swclt_conn_info_s {
- /* We also store a copy of the wss's info structure */
- swclt_wss_info_t wss;
- /* Pulled from the blade connect result */
- ks_uuid_t sessionid;
- const char *nodeid;
- const char *master_nodeid;
- } swclt_conn_info_t;
- /* Ths client connection context represents a connections state */
- struct swclt_conn {
- ks_pool_t *pool;
- /* When we receive an incoming request we call this callback with the prepared command */
- swclt_conn_incoming_cmd_cb_t incoming_cmd_cb;
- void *incoming_cmd_cb_data;
- /* Optional callbacks for getting the initial connect result payload */
- swclt_conn_connect_cb_t connect_cb;
- void *connect_cb_data;
- /* Optional callbacks for getting notified of connection failure */
- swclt_conn_failed_cb_t failed_cb;
- void *failed_cb_data;
- /* Connection failed state */
- int failed;
- ks_mutex_t *failed_mutex;
- /* Our websocket transport, basically our connection to blade */
- swclt_wss_t *wss;
- /* Basic connection info that the caller can examine, contains
- * our sessionid, nodeid, and master_nodeid variables returned from
- * a connect result from blade, including our connected address and
- * ssl context ptr (from websocket info) */
- swclt_conn_info_t info;
- /* The result of our last connect, kept around for reference */
- blade_connect_rpl_t *blade_connect_rpl;
- /* A hash of outstanding commands, keyed by their request ids.
- * This is the outgoing queue for requests born from the client or
- * requests which have been sent from blade. Since the uuids are
- * globally unique we can just use one hash for both */
- ks_hash_t *outstanding_requests;
- /* TTLs to expire */
- swclt_ttl_tracker_t *ttl;
- };
- SWCLT_DECLARE(void) swclt_conn_destroy(swclt_conn_t **conn);
- SWCLT_DECLARE(ks_status_t) swclt_conn_connect(
- ks_pool_t *pool,
- swclt_conn_t **conn,
- swclt_conn_incoming_cmd_cb_t incoming_command_callback,
- void *incoming_command_cb_data,
- swclt_ident_t *ident,
- ks_json_t **authentication,
- const char *agent,
- const char *identity,
- const SSL_CTX *ssl);
- SWCLT_DECLARE(ks_status_t) swclt_conn_connect_ex(
- ks_pool_t *pool,
- swclt_conn_t **conn,
- swclt_conn_incoming_cmd_cb_t incoming_command_callback,
- void *incoming_command_cb_data,
- swclt_conn_connect_cb_t connect_callback,
- void *connect_cb_data,
- swclt_conn_failed_cb_t failed_callback,
- void *failed_cb_data,
- swclt_ident_t *ident,
- ks_uuid_t previous_sessionid,
- ks_json_t **authentication,
- const char *agent,
- const char *identity,
- const SSL_CTX *ssl);
- SWCLT_DECLARE(ks_status_t) swclt_conn_submit_request(swclt_conn_t *conn, swclt_cmd_t cmd);
- SWCLT_DECLARE(ks_status_t) swclt_conn_submit_result(swclt_conn_t *conn, swclt_cmd_t cmd);
- SWCLT_DECLARE(ks_status_t) swclt_conn_info(swclt_conn_t *conn, swclt_conn_info_t *info);
- SWCLT_DECLARE(char *) swclt_conn_describe(swclt_conn_t *conn);
- KS_END_EXTERN_C
- /* For Emacs:
- * Local Variables:
- * mode:c
- * indent-tabs-mode:t
- * tab-width:4
- * c-basic-offset:4
- * End:
- * For VIM:
- * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet:
- */
|