annotate seobeo/seobeo.h @ 279:b3b547563ec7

Add Google connector service and agent wiki Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code. Co-authored-by: Copilot <[email protected]> Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
author MrJuneJune <me@mrjunejune.com>
date Mon, 17 Aug 2026 22:22:36 -0700
parents 04fee26ecce0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1 #ifndef SEOBEO_SERVER_H
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
2 #define SEOBEO_SERVER_H
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
3
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
4 /**
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
5 * Seobeo
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
6 * ------
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
7 *
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
8 * Library for starting TCP, UDP server and serving static file or path.
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
9 */
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
10
96
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
11 #include "seobeo/seobeo_internal.h"
250
745fd127b2a1 [seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
12 #include "seobeo/seobeo_worker.h"
64
a30944e5719e Added vibe coded markdown to html script since it is useful for me. Updated Dowa so that it can be compiled without dirnet for windows.
June Park <parkjune1995@gmail.com>
parents: 36
diff changeset
13
96
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
14 #include <stdarg.h>
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
15 #include <unistd.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
16 #include <errno.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
17 #include <string.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
18 #include <sys/types.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
19 #include <sys/socket.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
20 #include <netinet/in.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
21 #include <netdb.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
22 #include <arpa/inet.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
23 #include <sys/wait.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
24 #include <signal.h>
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
25 #include <fcntl.h>
7
114cad94008f [Seobeo] Updated to support thread and edge server calls.
June Park <parkjune1995@gmail.com>
parents: 6
diff changeset
26 #include <pthread.h>
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
27
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
28
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
29 #define INITIAL_BUFFER_CAPACITY 4096
257
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
30 #define SEOBEO_SSE_RETRY_NONE -1
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
31 #define SEOBEO_SSE_EVENT_TOO_LARGE -2
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
32 #define SEOBEO_SSE_INVALID_EVENT -3
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
33 #define SEOBEO_SSE_BACKPRESSURE -4
4
0b3b4f5887bb [Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents: 3
diff changeset
34
6
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
35 // HTTP STATUS CODE
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
36 #define HTTP_OK 200
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
37 #define HTTP_CREATED 201
223
0e7b9464248d [hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents: 221
diff changeset
38 #define HTTP_NO_CONTENT 204
6
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
39 #define HTTP_MOVED_PERMANENTLY 301
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
40 #define HTTP_FOUND 302
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
41 #define HTTP_BAD_REQUEST 400
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
42 #define HTTP_UNAUTHORIZED 401
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
43 #define HTTP_FORBIDDEN 403
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
44 #define HTTP_NOT_FOUND 404
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 223
diff changeset
45 #define HTTP_PAYLOAD_TOO_LARGE 413
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 223
diff changeset
46 #define HTTP_UNPROCESSABLE_CONTENT 422
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 223
diff changeset
47 #define HTTP_TOO_MANY_REQUESTS 429
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents: 223
diff changeset
48 #define HTTP_SERVICE_UNAVAILABLE 503
6
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
49 #define HTTP_INTERNAL_ERROR 500
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
50
79
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
51 #define CREATE_REDIRECT_HANDLER(name, target_url) \
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
52 Seobeo_Request_Entry* GetRedirect##name(Seobeo_Request_Entry *req, Dowa_Arena *arena) \
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
53 { \
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
54 Seobeo_Request_Entry *resp = NULL; \
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
55 Dowa_HashMap_Push_Arena(resp, "status", "301", arena); \
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
56 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena); \
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
57 Dowa_HashMap_Push_Arena(resp, "Body", "", arena); \
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
58 Dowa_HashMap_Push_Arena(resp, "Location", target_url, arena); \
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
59 return resp; \
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
60 }
5710108c949e [Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents: 78
diff changeset
61
36
84672efec192 [Zenbu] WIP fixing issues regarding to using edge only. I think there is a problem where socket closes before sending back the info.
MrJuneJune <me@mrjunejune.com>
parents: 19
diff changeset
62 extern volatile sig_atomic_t stop_server;
84672efec192 [Zenbu] WIP fixing issues regarding to using edge only. I think there is a problem where socket closes before sending back the info.
MrJuneJune <me@mrjunejune.com>
parents: 19
diff changeset
63
3
2758f5527d2b [Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents: 1
diff changeset
64 // --- TCP --- //
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
65 // --- Generate a Server Handle. ---//
66
a0f0ad5e42eb [Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents: 64
diff changeset
66 extern Seobeo_Handle *Seobeo_Stream_Handle_Server_Create(const char *host, const char* port);
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
67 // --- Generate a Client Handle. ---//
66
a0f0ad5e42eb [Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents: 64
diff changeset
68 extern Seobeo_Handle *Seobeo_Stream_Handle_Client_Create(const char *host, const char* port, boolean use_tls);
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
69 // --- Generate a Client Handle from given Server Handle. ---//
66
a0f0ad5e42eb [Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents: 64
diff changeset
70 extern Seobeo_Handle *Seobeo_Stream_Handle_Server_Accept(Seobeo_Handle *p_server_handle);
6
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
71
1e61008b9980 [Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents: 5
diff changeset
72 // --- Web --- //
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
73 /* Generate HTTP 1.1 Header value with given content_types and length. */
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
74 extern void Seobeo_Web_Header_Generate(void *buffer, int status, const char *content_type, const int content_length);
183
a8976a008a9d [BenchMark] Added bun bench mark to test seoboe vs other popular benchmarks.
MrJuneJune <me@mrjunejune.com>
parents: 163
diff changeset
75 /* Generate HTTP 1.1 Header with keep-alive option. */
a8976a008a9d [BenchMark] Added bun bench mark to test seoboe vs other popular benchmarks.
MrJuneJune <me@mrjunejune.com>
parents: 163
diff changeset
76 extern void Seobeo_Web_Header_Generate_KeepAlive(void *buffer, int status, const char *content_type, const int content_length, boolean keep_alive);
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
77 /* Start a Generic HTTP static file server with given folder. It will store folder into memory. */
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
78 extern int Seobeo_Web_Server_Start(const char *folder_path, const char *port, Seobeo_ServerMode mode, int thread_count);
251
117c4d53c9a4 [ui] Add HTML-first Web Component system
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
79 /* Start a web server bound to a specific host. Pass NULL to bind all interfaces. */
117c4d53c9a4 [ui] Add HTML-first Web Component system
MrJuneJune <me@mrjunejune.com>
parents: 250
diff changeset
80 extern int Seobeo_Web_Server_Start_On(const char *host, const char *folder_path, const char *port, Seobeo_ServerMode mode, int thread_count);
260
1f9877b637e9 Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents: 257
diff changeset
81 /* Request a running server to stop and return from its start function. */
1f9877b637e9 Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents: 257
diff changeset
82 extern void Seobeo_Web_Server_Stop(void);
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
83 /* Generic HTTP GET Rquest to given host and port with path. It will mimic chrome. */
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
84 extern int Seobeo_Web_Client_Get(const char *host, const char *port, const char *path);
119
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
85
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
86 // --- HTTP Client (curl-like API) --- //
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
87 /* Create a new HTTP client request with the given URL. */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
88 extern Seobeo_Client_Request *Seobeo_Client_Request_Create(const char *url);
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
89 /* Set HTTP method (GET, POST, PUT, DELETE, etc.). Default is GET. */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
90 extern void Seobeo_Client_Request_Set_Method(Seobeo_Client_Request *p_req, const char *method);
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
91 /* Add a header using key-value pairs (stored in HashMap). */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
92 extern void Seobeo_Client_Request_Add_Header_Map(Seobeo_Client_Request *p_req, const char *key, const char *value);
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
93 /* Add a header as a string "Key: Value" (stored in Array). */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
94 extern void Seobeo_Client_Request_Add_Header_Array(Seobeo_Client_Request *p_req, const char *header);
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
95 /* Set request body with given data and length. */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
96 extern void Seobeo_Client_Request_Set_Body(Seobeo_Client_Request *p_req, const char *body, size_t length);
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
97 /* Enable/disable following redirects with max redirect count. Default is FALSE with 10 max. */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
98 extern void Seobeo_Client_Request_Set_Follow_Redirects(Seobeo_Client_Request *p_req, boolean follow, int32 max_redirects);
221
ce7f4400c2de [hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents: 186
diff changeset
99 /* Set the maximum idle time for HTTP response reads. Zero disables the timeout. */
ce7f4400c2de [hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents: 186
diff changeset
100 extern void Seobeo_Client_Request_Set_Timeout_Milliseconds(Seobeo_Client_Request *p_req, int32 timeout_ms);
119
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
101 /* Set download path to save response body to file instead of memory. */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
102 extern void Seobeo_Client_Request_Set_Download_Path(Seobeo_Client_Request *p_req, const char *path);
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
103 /* Execute the HTTP request and return response. */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
104 extern Seobeo_Client_Response *Seobeo_Client_Request_Execute(Seobeo_Client_Request *p_req);
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
105 /* Destroy request and free all resources. */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
106 extern void Seobeo_Client_Request_Destroy(Seobeo_Client_Request *p_req);
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
107 /* Destroy response and free all resources. */
c39582f937e5 [Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents: 96
diff changeset
108 extern void Seobeo_Client_Response_Destroy(Seobeo_Client_Response *p_resp);
120
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
109
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 125
diff changeset
110 // --- HTTP Web related helper functions --- //
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 125
diff changeset
111 extern void Seobeo_Url_Decode(char *dst, const char *src);
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 125
diff changeset
112
120
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
113 /**
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
114 * WebSocket Client API
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
115 * ------
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
116 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
117 * # Overview
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
118 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
119 * A clean, easy-to-use WebSocket client library following RFC 6455. It will auto handle over 64 bits long data into a continous stream.
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
120 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
121 * ## Examples
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
122 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
123 * ### 1. Simple Text Echo
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
124 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
125 * ```c
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
126 * // Connect to WebSocket server
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
127 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://echo.websocket.org");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
128 * if (!p_ws)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
129 * {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
130 * printf("Failed to connect\n");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
131 * return;
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
132 * }
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
133 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
134 * // Send text message
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
135 * const char *message = "Hello, WebSocket!";
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
136 * Seobeo_WebSocket_Send_Text(p_ws, message);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
137 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
138 * // Receive echo response
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
139 * Seobeo_WebSocket_Message *p_msg = Seobeo_WebSocket_Receive(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
140 * if (p_msg && p_msg->opcode == SEOBEO_WS_OPCODE_TEXT)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
141 * {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
142 * printf("Received: %.*s\n", (int)p_msg->length, (char*)p_msg->data);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
143 * Seobeo_WebSocket_Message_Destroy(p_msg);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
144 * }
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
145 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
146 * // Close connection
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
147 * Seobeo_WebSocket_Close(p_ws, 1000, "Normal closure");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
148 * Seobeo_WebSocket_Destroy(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
149 * ```
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
150 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
151 * ### 2. Binary Data Transfer
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
152 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
153 * ```c
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
154 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://example.com/data");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
155 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
156 * // Send binary data
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
157 * uint8 data[] = {0x01, 0x02, 0x03, 0xAA, 0xBB, 0xCC};
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
158 * Seobeo_WebSocket_Send_Binary(p_ws, data, sizeof(data));
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
159 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
160 * // Receive binary response
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
161 * Seobeo_WebSocket_Message *p_msg = Seobeo_WebSocket_Receive(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
162 * if (p_msg && p_msg->opcode == SEOBEO_WS_OPCODE_BINARY)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
163 * {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
164 * printf("Received %zu bytes\n", p_msg->length);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
165 * // Process binary data...
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
166 * Seobeo_WebSocket_Message_Destroy(p_msg);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
167 * }
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
168 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
169 * Seobeo_WebSocket_Destroy(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
170 * ```
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
171 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
172 * ### 3. Chat Application
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
173 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
174 * ```c
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
175 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://chat.example.com");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
176 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
177 * // Send chat message
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
178 * Seobeo_WebSocket_Send_Text(p_ws, "Hello everyone!");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
179 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
180 * // Continuous receive loop
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
181 * while (1)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
182 * {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
183 * Seobeo_WebSocket_Message *p_msg = Seobeo_WebSocket_Receive(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
184 * if (p_msg)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
185 * {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
186 * if (p_msg->opcode == SEOBEO_WS_OPCODE_TEXT)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
187 * {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
188 * printf("Chat: %.*s\n", (int)p_msg->length, (char*)p_msg->data);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
189 * }
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
190 * Seobeo_WebSocket_Message_Destroy(p_msg);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
191 * }
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
192 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
193 * usleep(10000); // 10ms sleep to avoid busy waiting
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
194 * }
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
195 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
196 * Seobeo_WebSocket_Destroy(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
197 * ```
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
198 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
199 * ### 4. Ping/Pong Keep-Alive
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
200 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
201 * ```c
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
202 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://api.example.com");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
203 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
204 * // Send ping to keep connection alive
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
205 * Seobeo_WebSocket_Send_Ping(p_ws, "keep-alive");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
206 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
207 * // Server will automatically receive pong responses
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
208 * // (pong responses are handled internally)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
209 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
210 * Seobeo_WebSocket_Destroy(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
211 * ```
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
212 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
213 * ### 5. Handling Different Message Types
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
214 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
215 * ```c
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
216 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://example.com");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
217 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
218 * while (1)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
219 * {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
220 * Seobeo_WebSocket_Message *p_msg = Seobeo_WebSocket_Receive(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
221 * if (p_msg)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
222 * {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
223 * switch (p_msg->opcode)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
224 * {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
225 * case SEOBEO_WS_OPCODE_TEXT:
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
226 * printf("Text: %.*s\n", (int)p_msg->length, (char*)p_msg->data);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
227 * break;
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
228 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
229 * case SEOBEO_WS_OPCODE_BINARY:
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
230 * printf("Binary: %zu bytes\n", p_msg->length);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
231 * break;
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
232 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
233 * default:
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
234 * printf("Unknown opcode: 0x%X\n", p_msg->opcode);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
235 * break;
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
236 * }
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
237 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
238 * Seobeo_WebSocket_Message_Destroy(p_msg);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
239 * }
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
240 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
241 * usleep(10000);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
242 * }
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
243 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
244 * Seobeo_WebSocket_Destroy(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
245 * ```
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
246 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
247 * ### 6. Graceful Shutdown
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
248 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
249 * ```c
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
250 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://example.com");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
251 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
252 * // Do work...
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
253 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
254 * // Close with custom status code and reason
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
255 * Seobeo_WebSocket_Close(p_ws, 1000, "Client shutting down");
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
256 * Seobeo_WebSocket_Destroy(p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
257 * ```
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
258 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
259 * ## WebSocket Close Codes
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
260 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
261 * Common close status codes (RFC 6455):
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
262 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
263 * - **1000**: Normal closure
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
264 * - **1001**: Going away (e.g., server shutdown, browser navigation)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
265 * - **1002**: Protocol error
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
266 * - **1003**: Unsupported data type
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
267 * - **1006**: Abnormal closure (no close frame received)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
268 * - **1007**: Invalid frame payload data
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
269 * - **1008**: Policy violation
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
270 * - **1009**: Message too big
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
271 * - **1010**: Mandatory extension missing
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
272 * - **1011**: Internal server error
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
273 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
274 * ## Building
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
275 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
276 * ### Build the library:
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
277 * ```bash
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
278 * bazel build //seobeo:seobeo_client
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
279 * ```
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
280 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
281 * ### Build and run the WebSocket test:
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
282 * ```bash
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
283 * bazel test //seobeo:seobeo_websocket_test
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
284 * ```
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
285 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
286 * ## Message Structure
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
287 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
288 * ```c
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
289 * typedef struct {
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
290 * Seobeo_WebSocket_Opcode opcode; // Message type
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
291 * uint8 *data; // Message payload
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
292 * size_t length; // Payload length
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
293 * boolean is_final; // Final fragment flag
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
294 * } Seobeo_WebSocket_Message;
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
295 * ```
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
296 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
297 * ## Protocol Details
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
298 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
299 * The implementation follows RFC 6455
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
300 *
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
301 * 1. **Handshake**: HTTP Upgrade request with `Sec-WebSocket-Key`
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
302 * 2. **Frame Format**: Proper FIN, opcode, mask, and payload length handling
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
303 * 3. **Masking**: All client-to-server frames are masked (required by RFC)
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
304 * 4. **Fragmentation**: Handles fragmented messages across multiple frames
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
305 * 5. **Control Frames**: Proper handling of ping, pong, and close frames
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
306 */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
307
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
308 /* Connect to WebSocket server with given URL (ws:// or wss://). */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
309 extern Seobeo_WebSocket *Seobeo_WebSocket_Connect(const char *url);
163
058de208e640 [Config] Adding os ignore files.
June Park <parkjune1995@gmail.com>
parents: 125
diff changeset
310 /* Connect to WebSocket server with custom headers. Headers should be newline-separated "Key: Value" pairs. */
058de208e640 [Config] Adding os ignore files.
June Park <parkjune1995@gmail.com>
parents: 125
diff changeset
311 extern Seobeo_WebSocket *Seobeo_WebSocket_Connect_With_Headers(const char *url, const char *headers);
120
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
312 /* Send text message over WebSocket. */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
313 extern int32 Seobeo_WebSocket_Send_Text(Seobeo_WebSocket *p_ws, const char *text);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
314 /* Send binary message over WebSocket. */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
315 extern int32 Seobeo_WebSocket_Send_Binary(Seobeo_WebSocket *p_ws, const uint8 *data, size_t length);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
316 /* Send ping frame (for keep-alive). */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
317 extern int32 Seobeo_WebSocket_Send_Ping(Seobeo_WebSocket *p_ws, const char *payload);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
318 /* Send pong frame (usually in response to ping). */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
319 extern int32 Seobeo_WebSocket_Send_Pong(Seobeo_WebSocket *p_ws, const char *payload);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
320 /* Receive a message from WebSocket. Returns NULL if no message available or on error. */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
321 extern Seobeo_WebSocket_Message *Seobeo_WebSocket_Receive(Seobeo_WebSocket *p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
322 /* Destroy received message. */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
323 extern void Seobeo_WebSocket_Message_Destroy(Seobeo_WebSocket_Message *p_msg);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
324 /* Close WebSocket connection with status code and optional reason. */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
325 extern int32 Seobeo_WebSocket_Close(Seobeo_WebSocket *p_ws, uint16 code, const char *reason);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
326 /* Destroy WebSocket and free all resources. */
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
327 extern void Seobeo_WebSocket_Destroy(Seobeo_WebSocket *p_ws);
cbbf78b17cfa [Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents: 119
diff changeset
328
121
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
329 // --- WebSocket Server API --- //
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
330 /* Initialize WebSocket server routing system. Call before registering routes. */
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
331 extern void Seobeo_WebSocket_Server_Init();
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
332 /* Register a WebSocket route handler for a specific path. */
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
333 extern void Seobeo_WebSocket_Server_Register(const char *path, Seobeo_WebSocket_Server_Handler handler, void *p_user_data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
334 /* Send text message to specific WebSocket client. */
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
335 extern int32 Seobeo_WebSocket_Server_Send_Text(Seobeo_WebSocket_Server_Connection *p_conn, const char *text);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
336 /* Send binary message to specific WebSocket client. */
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
337 extern int32 Seobeo_WebSocket_Server_Send_Binary(Seobeo_WebSocket_Server_Connection *p_conn, const uint8 *data, size_t length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
338 /* Broadcast text message to all connected WebSocket clients. */
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 121
diff changeset
339 extern void Seobeo_WebSocket_Server_Broadcast_Text(const char *text, Seobeo_WebSocket_Server_Connection *origin_p_conn);
121
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
340 /* Broadcast binary message to all connected WebSocket clients. */
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
341 extern void Seobeo_WebSocket_Server_Broadcast_Binary(const uint8 *data, size_t length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
342 /* Close WebSocket connection with status code and reason. */
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
343 extern void Seobeo_WebSocket_Server_Connection_Close(Seobeo_WebSocket_Server_Connection *p_conn, uint16 code, const char *reason);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents: 120
diff changeset
344
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 66
diff changeset
345 /* Initialize the router system (called automatically by Seobeo_Web_Server_Start) */
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 173
diff changeset
346 extern void Seobeo_Router_Init();
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 66
diff changeset
347 /* Register an API route handler. Call before starting server. */
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 173
diff changeset
348 extern void Seobeo_Router_Register(const char *method, const char *path_pattern, Seobeo_Route_Handler handler);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 173
diff changeset
349 /* Register a streaming route handler. Handler receives client handle for direct streaming. */
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 173
diff changeset
350 extern void Seobeo_Router_Register_Stream(const char *method, const char *path_pattern, Seobeo_Stream_Handler handler);
260
1f9877b637e9 Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents: 257
diff changeset
351 /* Register an SSE route for a specific HTTP method. */
1f9877b637e9 Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents: 257
diff changeset
352 extern void Seobeo_Router_Register_SSE_Method(const char *method, const char *path_pattern, Seobeo_SSE_Handler handler);
1f9877b637e9 Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents: 257
diff changeset
353 /* Register a GET SSE route for compatibility. */
257
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
354 extern void Seobeo_Router_Register_SSE(const char *path_pattern, Seobeo_SSE_Handler handler);
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 66
diff changeset
355 /* Clean up router resources */
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 173
diff changeset
356 extern void Seobeo_Router_Destroy();
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 66
diff changeset
357 /* Find matching route handler (internal use) */
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 173
diff changeset
358 extern Seobeo_Route_Handler Seobeo_Router_Find_Handler(const char *method, const char *path, Seobeo_Request_Entry **pp_request_map, Dowa_Arena *p_arena);
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 66
diff changeset
359 /* Send HTTP response from response map (internal use) */
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 173
diff changeset
360 extern void Seobeo_Router_Send_Response(Seobeo_Handle *p_handle, Seobeo_Request_Entry *p_response_map, Dowa_Arena *p_arena);
183
a8976a008a9d [BenchMark] Added bun bench mark to test seoboe vs other popular benchmarks.
MrJuneJune <me@mrjunejune.com>
parents: 163
diff changeset
361 /* Send HTTP response with keep-alive option */
186
8cf4ec5e2191 Fixed merge conflict.
MrJuneJune <me@mrjunejune.com>
parents: 175 183
diff changeset
362 extern void Seobeo_Router_Send_Response_KeepAlive(Seobeo_Handle *p_handle, Seobeo_Request_Entry *p_response_map, Dowa_Arena *p_arena, boolean keep_alive);
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 173
diff changeset
363 extern char *Seobeo_Web_LoadFile(const char *file_path, size_t *p_file_size);
186
8cf4ec5e2191 Fixed merge conflict.
MrJuneJune <me@mrjunejune.com>
parents: 175 183
diff changeset
364 /* Being a proxy and keeping the client open */
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 173
diff changeset
365 extern Seobeo_Stream_Handler Seobeo_Router_Find_Stream_Handler(const char *method, const char *path, Seobeo_Request_Entry **pp_request_map, Dowa_Arena *p_arena);
257
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
366 extern Seobeo_SSE_Handler Seobeo_Router_Find_SSE_Handler(const char *method, const char *path, Seobeo_Request_Entry **pp_request_map, Dowa_Arena *p_arena);
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
367
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
368 /* Start an SSE response and send its required HTTP headers. */
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
369 extern int32 Seobeo_SSE_Start(Seobeo_SSE_Stream *p_stream, Seobeo_Handle *p_handle);
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
370 /* Send one SSE record. retry_ms may be SEOBEO_SSE_RETRY_NONE. */
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
371 extern int32 Seobeo_SSE_Send(Seobeo_SSE_Stream *p_stream, const Seobeo_SSE_Event *p_event);
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
372 /* Send a data-only SSE record. */
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
373 extern int32 Seobeo_SSE_Send_Data(Seobeo_SSE_Stream *p_stream, const char *data);
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
374 /* Send a comment/heartbeat record. */
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
375 extern int32 Seobeo_SSE_Send_Comment(Seobeo_SSE_Stream *p_stream, const char *comment);
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
376 /* Flush queued SSE bytes. Returns 1 when the socket would block. */
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
377 extern int32 Seobeo_SSE_Flush(Seobeo_SSE_Stream *p_stream);
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
378 /* Return TRUE while the stream can still accept records. */
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
379 extern boolean Seobeo_SSE_Is_Open(const Seobeo_SSE_Stream *p_stream);
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
380 /* Retain a stream before storing it beyond the connection callback. */
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
381 extern boolean Seobeo_SSE_Retain(Seobeo_SSE_Stream *p_stream);
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
382 /* Release a previously retained stream. */
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
383 extern void Seobeo_SSE_Release(Seobeo_SSE_Stream *p_stream);
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
384 /* Stop accepting records. The router retains ownership of the handle. */
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
385 extern void Seobeo_SSE_Close(Seobeo_SSE_Stream *p_stream);
264
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
386 /*
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
387 * Register a callback invoked when the client disconnects (handle detached).
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
388 * The callback is called AFTER g_sse_mutex is released and may safely acquire
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
389 * other locks. The stream pointer remains valid for the callback's duration
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
390 * (the caller's retained reference keeps it alive).
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
391 * cb may be NULL to clear a previously registered callback.
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
392 */
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
393 extern void Seobeo_SSE_Set_Detach_Callback(
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
394 Seobeo_SSE_Stream *p_stream,
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
395 void (*cb)(Seobeo_SSE_Stream *, void *),
04fee26ecce0 add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents: 260
diff changeset
396 void *ctx);
72
4532ce6d9eb8 [Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents: 66
diff changeset
397
5
3e12bf044589 Fixed Dowa hashmap to recursively add files into memory.
June Park <parkjune1995@gmail.com>
parents: 4
diff changeset
398 // --- Helper functions --- //
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
399 /* Destroy handle. It will handle all NULL poointers. */
66
a0f0ad5e42eb [Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents: 64
diff changeset
400 extern void Seobeo_Handle_Destroy(Seobeo_Handle *p_handle);
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
401 /* Write to socket from write_buffer in the handle. */
257
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
402 extern int32 Seobeo_Handle_Flush(Seobeo_Handle *p_handle);
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
403 /* Write to socket with given data source, if the data source is bigger than the write buffer for handle then we just directly write from the data source. */
257
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
404 extern int32 Seobeo_Handle_Queue(Seobeo_Handle *p_handle, const uint8 *data, uint32 data_size);
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
405 /* Read to socket from read_buffer in the handle. */
257
609d3c6aff4e [seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents: 251
diff changeset
406 extern int32 Seobeo_Handle_Read(Seobeo_Handle *p_handle);
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
407 /* Move to read_buffer to front and we already consumed the given amount in the handle. */
66
a0f0ad5e42eb [Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents: 64
diff changeset
408 extern void Seobeo_Handle_Consume(Seobeo_Handle *p_handle, uint32 consumed);
19
875bb6e10db7 [Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents: 18
diff changeset
409 /* Assign IP4 or IP6 to sockaddr. TODO: Maybe create my own struct for this? */
96
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
410 extern void *Seobeo_Get_IP4_Or_IP6(struct sockaddr *sa);
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
411 /* Logging */
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
412 typedef enum {
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
413 SEOBEO_INFO = 0,
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
414 SEOBEO_WARNING,
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
415 SEOBEO_ERROR,
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
416 SEOBEO_DEBUG,
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
417 } Seobeo_Log_Level;
70401cf61e97 [Seobeo] Added logging.
June Park <parkjune1995@gmail.com>
parents: 79
diff changeset
418 extern int Seobeo_Log(Seobeo_Log_Level level, const char *format, ...);
1
adcfad6e86fb Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
419 #endif