opal-up 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +209 -0
- data/README.md +97 -29
- data/bin/up_ruby +4 -0
- data/bin/up_ruby_cluster +4 -0
- data/ext/up_ext/App.h +606 -0
- data/ext/up_ext/AsyncSocket.h +355 -0
- data/ext/up_ext/AsyncSocketData.h +87 -0
- data/ext/up_ext/BloomFilter.h +83 -0
- data/ext/up_ext/ChunkedEncoding.h +236 -0
- data/ext/up_ext/ClientApp.h +36 -0
- data/ext/up_ext/HttpContext.h +502 -0
- data/ext/up_ext/HttpContextData.h +56 -0
- data/ext/up_ext/HttpErrors.h +53 -0
- data/ext/up_ext/HttpParser.h +680 -0
- data/ext/up_ext/HttpResponse.h +578 -0
- data/ext/up_ext/HttpResponseData.h +95 -0
- data/ext/up_ext/HttpRouter.h +380 -0
- data/ext/up_ext/Loop.h +204 -0
- data/ext/up_ext/LoopData.h +112 -0
- data/ext/up_ext/MoveOnlyFunction.h +377 -0
- data/ext/up_ext/PerMessageDeflate.h +315 -0
- data/ext/up_ext/ProxyParser.h +163 -0
- data/ext/up_ext/QueryParser.h +120 -0
- data/ext/up_ext/TopicTree.h +363 -0
- data/ext/up_ext/Utilities.h +66 -0
- data/ext/up_ext/WebSocket.h +381 -0
- data/ext/up_ext/WebSocketContext.h +434 -0
- data/ext/up_ext/WebSocketContextData.h +109 -0
- data/ext/up_ext/WebSocketData.h +86 -0
- data/ext/up_ext/WebSocketExtensions.h +256 -0
- data/ext/up_ext/WebSocketHandshake.h +145 -0
- data/ext/up_ext/WebSocketProtocol.h +506 -0
- data/ext/up_ext/bsd.c +767 -0
- data/ext/up_ext/bsd.h +109 -0
- data/ext/up_ext/context.c +524 -0
- data/ext/up_ext/epoll_kqueue.c +458 -0
- data/ext/up_ext/epoll_kqueue.h +67 -0
- data/ext/up_ext/extconf.rb +5 -0
- data/ext/up_ext/internal.h +224 -0
- data/ext/up_ext/libusockets.h +350 -0
- data/ext/up_ext/libuwebsockets.cpp +1344 -0
- data/ext/up_ext/libuwebsockets.h +396 -0
- data/ext/up_ext/loop.c +386 -0
- data/ext/up_ext/loop_data.h +38 -0
- data/ext/up_ext/socket.c +231 -0
- data/ext/up_ext/up_ext.c +930 -0
- data/lib/up/bun/rack_env.rb +1 -13
- data/lib/up/bun/server.rb +93 -19
- data/lib/up/cli.rb +3 -0
- data/lib/up/client.rb +68 -0
- data/lib/up/ruby/cluster.rb +39 -0
- data/lib/up/ruby/cluster_cli.rb +10 -0
- data/lib/up/{node → ruby}/rack_cluster.rb +5 -4
- data/lib/up/{node → ruby}/rack_server.rb +4 -4
- data/lib/up/ruby/server_cli.rb +10 -0
- data/lib/up/u_web_socket/cluster.rb +18 -3
- data/lib/up/u_web_socket/server.rb +108 -15
- data/lib/up/version.rb +1 -1
- metadata +72 -30
- data/.gitignore +0 -5
- data/Gemfile +0 -2
- data/bin/up_node +0 -12
- data/bin/up_node_cluster +0 -12
- data/example_rack_app/Gemfile +0 -3
- data/example_rack_app/config.ru +0 -6
- data/example_rack_app/rack_app.rb +0 -5
- data/example_roda_app/Gemfile +0 -6
- data/example_roda_app/config.ru +0 -6
- data/example_roda_app/roda_app.rb +0 -37
- data/example_sinatra_app/Gemfile +0 -6
- data/example_sinatra_app/config.ru +0 -6
- data/example_sinatra_app/sinatra_app.rb +0 -7
- data/lib/up/node/cluster.rb +0 -39
- data/lib/up/node/cluster_cli.rb +0 -15
- data/lib/up/node/rack_env.rb +0 -106
- data/lib/up/node/server.rb +0 -84
- data/lib/up/node/server_cli.rb +0 -15
- data/lib/up/u_web_socket/rack_env.rb +0 -101
- data/opal-up.gemspec +0 -27
- data/up_logo.svg +0 -256
@@ -0,0 +1,224 @@
|
|
1
|
+
/*
|
2
|
+
* Authored by Alex Hultman, 2018-2019.
|
3
|
+
* Intellectual property of third-party.
|
4
|
+
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#ifndef INTERNAL_H
|
19
|
+
#define INTERNAL_H
|
20
|
+
|
21
|
+
#if defined(_MSC_VER)
|
22
|
+
#define alignas(x) __declspec(align(x))
|
23
|
+
#else
|
24
|
+
#include <stdalign.h>
|
25
|
+
#endif
|
26
|
+
|
27
|
+
/* We only have one networking implementation so far */
|
28
|
+
#include "bsd.h"
|
29
|
+
|
30
|
+
// WARNING: This MUST be included after bsd.h, otherwise sys/socket includes
|
31
|
+
// fail surprisingly.
|
32
|
+
#include <stdint.h>
|
33
|
+
|
34
|
+
#ifndef LIBUS_USE_IO_URING
|
35
|
+
|
36
|
+
/* We have many different eventing implementations */
|
37
|
+
#if defined(LIBUS_USE_EPOLL) || defined(LIBUS_USE_KQUEUE)
|
38
|
+
#include "epoll_kqueue.h"
|
39
|
+
#endif
|
40
|
+
#ifdef LIBUS_USE_LIBUV
|
41
|
+
#include "internal/eventing/libuv.h"
|
42
|
+
#endif
|
43
|
+
#ifdef LIBUS_USE_GCD
|
44
|
+
#include "internal/eventing/gcd.h"
|
45
|
+
#endif
|
46
|
+
#ifdef LIBUS_USE_ASIO
|
47
|
+
#include "internal/eventing/asio.h"
|
48
|
+
#endif
|
49
|
+
|
50
|
+
/* Poll type and what it polls for */
|
51
|
+
enum {
|
52
|
+
/* Two first bits */
|
53
|
+
POLL_TYPE_SOCKET = 0,
|
54
|
+
POLL_TYPE_SOCKET_SHUT_DOWN = 1,
|
55
|
+
POLL_TYPE_SEMI_SOCKET = 2,
|
56
|
+
POLL_TYPE_CALLBACK = 3,
|
57
|
+
|
58
|
+
/* Two last bits */
|
59
|
+
POLL_TYPE_POLLING_OUT = 4,
|
60
|
+
POLL_TYPE_POLLING_IN = 8
|
61
|
+
};
|
62
|
+
|
63
|
+
/* Loop related */
|
64
|
+
void us_internal_dispatch_ready_poll(struct us_poll_t *p, int error, int events);
|
65
|
+
void us_internal_timer_sweep(struct us_loop_t *loop);
|
66
|
+
void us_internal_free_closed_sockets(struct us_loop_t *loop);
|
67
|
+
void us_internal_loop_link(struct us_loop_t *loop, struct us_socket_context_t *context);
|
68
|
+
void us_internal_loop_unlink(struct us_loop_t *loop, struct us_socket_context_t *context);
|
69
|
+
void us_internal_loop_data_init(struct us_loop_t *loop, void (*wakeup_cb)(struct us_loop_t *loop),
|
70
|
+
void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop));
|
71
|
+
void us_internal_loop_data_free(struct us_loop_t *loop);
|
72
|
+
void us_internal_loop_pre(struct us_loop_t *loop);
|
73
|
+
void us_internal_loop_post(struct us_loop_t *loop);
|
74
|
+
|
75
|
+
/* Asyncs (old) */
|
76
|
+
struct us_internal_async *us_internal_create_async(struct us_loop_t *loop, int fallthrough, unsigned int ext_size);
|
77
|
+
void us_internal_async_close(struct us_internal_async *a);
|
78
|
+
void us_internal_async_set(struct us_internal_async *a, void (*cb)(struct us_internal_async *));
|
79
|
+
void us_internal_async_wakeup(struct us_internal_async *a);
|
80
|
+
|
81
|
+
/* Eventing related */
|
82
|
+
unsigned int us_internal_accept_poll_event(struct us_poll_t *p);
|
83
|
+
int us_internal_poll_type(struct us_poll_t *p);
|
84
|
+
void us_internal_poll_set_type(struct us_poll_t *p, int poll_type);
|
85
|
+
|
86
|
+
/* SSL loop data */
|
87
|
+
void us_internal_init_loop_ssl_data(struct us_loop_t *loop);
|
88
|
+
void us_internal_free_loop_ssl_data(struct us_loop_t *loop);
|
89
|
+
|
90
|
+
/* Socket context related */
|
91
|
+
void us_internal_socket_context_link_socket(struct us_socket_context_t *context, struct us_socket_t *s);
|
92
|
+
void us_internal_socket_context_unlink_socket(struct us_socket_context_t *context, struct us_socket_t *s);
|
93
|
+
|
94
|
+
/* Sockets are polls */
|
95
|
+
struct us_socket_t {
|
96
|
+
alignas(LIBUS_EXT_ALIGNMENT) struct us_poll_t p; // 4 bytes
|
97
|
+
unsigned char timeout; // 1 byte
|
98
|
+
unsigned char long_timeout; // 1 byte
|
99
|
+
unsigned short low_prio_state; /* 0 = not in low-prio queue, 1 = is in low-prio queue, 2 = was in low-prio queue in this iteration */
|
100
|
+
struct us_socket_context_t *context;
|
101
|
+
struct us_socket_t *prev, *next;
|
102
|
+
};
|
103
|
+
|
104
|
+
/* Internal callback types are polls just like sockets */
|
105
|
+
struct us_internal_callback_t {
|
106
|
+
alignas(LIBUS_EXT_ALIGNMENT) struct us_poll_t p;
|
107
|
+
struct us_loop_t *loop;
|
108
|
+
int cb_expects_the_loop;
|
109
|
+
int leave_poll_ready;
|
110
|
+
void (*cb)(struct us_internal_callback_t *cb);
|
111
|
+
};
|
112
|
+
|
113
|
+
/* Listen sockets are sockets */
|
114
|
+
struct us_listen_socket_t {
|
115
|
+
alignas(LIBUS_EXT_ALIGNMENT) struct us_socket_t s;
|
116
|
+
unsigned int socket_ext_size;
|
117
|
+
};
|
118
|
+
|
119
|
+
/* Listen sockets are keps in their own list */
|
120
|
+
void us_internal_socket_context_link_listen_socket(struct us_socket_context_t *context, struct us_listen_socket_t *s);
|
121
|
+
void us_internal_socket_context_unlink_listen_socket(struct us_socket_context_t *context, struct us_listen_socket_t *s);
|
122
|
+
|
123
|
+
struct us_socket_context_t {
|
124
|
+
alignas(LIBUS_EXT_ALIGNMENT) struct us_loop_t *loop;
|
125
|
+
uint32_t global_tick;
|
126
|
+
unsigned char timestamp;
|
127
|
+
unsigned char long_timestamp;
|
128
|
+
struct us_socket_t *head_sockets;
|
129
|
+
struct us_listen_socket_t *head_listen_sockets;
|
130
|
+
struct us_socket_t *iterator;
|
131
|
+
struct us_socket_context_t *prev, *next;
|
132
|
+
|
133
|
+
LIBUS_SOCKET_DESCRIPTOR (*on_pre_open)(LIBUS_SOCKET_DESCRIPTOR fd);
|
134
|
+
struct us_socket_t *(*on_open)(struct us_socket_t *, int is_client, char *ip, int ip_length);
|
135
|
+
struct us_socket_t *(*on_data)(struct us_socket_t *, char *data, int length);
|
136
|
+
struct us_socket_t *(*on_writable)(struct us_socket_t *);
|
137
|
+
struct us_socket_t *(*on_close)(struct us_socket_t *, int code, void *reason);
|
138
|
+
//void (*on_timeout)(struct us_socket_context *);
|
139
|
+
struct us_socket_t *(*on_socket_timeout)(struct us_socket_t *);
|
140
|
+
struct us_socket_t *(*on_socket_long_timeout)(struct us_socket_t *);
|
141
|
+
struct us_socket_t *(*on_end)(struct us_socket_t *);
|
142
|
+
struct us_socket_t *(*on_connect_error)(struct us_socket_t *, int code);
|
143
|
+
int (*is_low_prio)(struct us_socket_t *);
|
144
|
+
};
|
145
|
+
|
146
|
+
#endif
|
147
|
+
|
148
|
+
/* Internal SSL interface */
|
149
|
+
#ifndef LIBUS_NO_SSL
|
150
|
+
|
151
|
+
struct us_internal_ssl_socket_context_t;
|
152
|
+
struct us_internal_ssl_socket_t;
|
153
|
+
|
154
|
+
/* SNI functions */
|
155
|
+
void us_internal_ssl_socket_context_add_server_name(struct us_internal_ssl_socket_context_t *context, const char *hostname_pattern, struct us_socket_context_options_t options, void *user);
|
156
|
+
void us_internal_ssl_socket_context_remove_server_name(struct us_internal_ssl_socket_context_t *context, const char *hostname_pattern);
|
157
|
+
void us_internal_ssl_socket_context_on_server_name(struct us_internal_ssl_socket_context_t *context, void (*cb)(struct us_internal_ssl_socket_context_t *, const char *));
|
158
|
+
void *us_internal_ssl_socket_get_sni_userdata(struct us_internal_ssl_socket_t *s);
|
159
|
+
void *us_internal_ssl_socket_context_find_server_name_userdata(struct us_internal_ssl_socket_context_t *context, const char *hostname_pattern);
|
160
|
+
|
161
|
+
void *us_internal_ssl_socket_get_native_handle(struct us_internal_ssl_socket_t *s);
|
162
|
+
void *us_internal_ssl_socket_context_get_native_handle(struct us_internal_ssl_socket_context_t *context);
|
163
|
+
|
164
|
+
struct us_internal_ssl_socket_context_t *us_internal_create_ssl_socket_context(struct us_loop_t *loop,
|
165
|
+
int context_ext_size, struct us_socket_context_options_t options);
|
166
|
+
|
167
|
+
void us_internal_ssl_socket_context_free(struct us_internal_ssl_socket_context_t *context);
|
168
|
+
void us_internal_ssl_socket_context_on_open(struct us_internal_ssl_socket_context_t *context,
|
169
|
+
struct us_internal_ssl_socket_t *(*on_open)(struct us_internal_ssl_socket_t *s, int is_client, char *ip, int ip_length));
|
170
|
+
|
171
|
+
void us_internal_ssl_socket_context_on_close(struct us_internal_ssl_socket_context_t *context,
|
172
|
+
struct us_internal_ssl_socket_t *(*on_close)(struct us_internal_ssl_socket_t *s, int code, void *reason));
|
173
|
+
|
174
|
+
void us_internal_ssl_socket_context_on_data(struct us_internal_ssl_socket_context_t *context,
|
175
|
+
struct us_internal_ssl_socket_t *(*on_data)(struct us_internal_ssl_socket_t *s, char *data, int length));
|
176
|
+
|
177
|
+
void us_internal_ssl_socket_context_on_writable(struct us_internal_ssl_socket_context_t *context,
|
178
|
+
struct us_internal_ssl_socket_t *(*on_writable)(struct us_internal_ssl_socket_t *s));
|
179
|
+
|
180
|
+
void us_internal_ssl_socket_context_on_timeout(struct us_internal_ssl_socket_context_t *context,
|
181
|
+
struct us_internal_ssl_socket_t *(*on_timeout)(struct us_internal_ssl_socket_t *s));
|
182
|
+
|
183
|
+
void us_internal_ssl_socket_context_on_long_timeout(struct us_internal_ssl_socket_context_t *context,
|
184
|
+
struct us_internal_ssl_socket_t *(*on_timeout)(struct us_internal_ssl_socket_t *s));
|
185
|
+
|
186
|
+
void us_internal_ssl_socket_context_on_end(struct us_internal_ssl_socket_context_t *context,
|
187
|
+
struct us_internal_ssl_socket_t *(*on_end)(struct us_internal_ssl_socket_t *s));
|
188
|
+
|
189
|
+
void us_internal_ssl_socket_context_on_connect_error(struct us_internal_ssl_socket_context_t *context,
|
190
|
+
struct us_internal_ssl_socket_t *(*on_connect_error)(struct us_internal_ssl_socket_t *s, int code));
|
191
|
+
|
192
|
+
struct us_listen_socket_t *us_internal_ssl_socket_context_listen(struct us_internal_ssl_socket_context_t *context,
|
193
|
+
const char *host, int port, int options, int socket_ext_size);
|
194
|
+
|
195
|
+
struct us_listen_socket_t *us_internal_ssl_socket_context_listen_unix(struct us_internal_ssl_socket_context_t *context,
|
196
|
+
const char *path, int options, int socket_ext_size);
|
197
|
+
|
198
|
+
struct us_internal_ssl_socket_t *us_internal_ssl_adopt_accepted_socket(struct us_internal_ssl_socket_context_t *context, LIBUS_SOCKET_DESCRIPTOR accepted_fd,
|
199
|
+
unsigned int socket_ext_size, char *addr_ip, int addr_ip_length);
|
200
|
+
|
201
|
+
struct us_internal_ssl_socket_t *us_internal_ssl_socket_context_connect(struct us_internal_ssl_socket_context_t *context,
|
202
|
+
const char *host, int port, const char *source_host, int options, int socket_ext_size);
|
203
|
+
|
204
|
+
|
205
|
+
struct us_internal_ssl_socket_t *us_internal_ssl_socket_context_connect_unix(struct us_internal_ssl_socket_context_t *context,
|
206
|
+
const char *server_path, int options, int socket_ext_size);
|
207
|
+
|
208
|
+
int us_internal_ssl_socket_write(struct us_internal_ssl_socket_t *s, const char *data, int length, int msg_more);
|
209
|
+
void us_internal_ssl_socket_timeout(struct us_internal_ssl_socket_t *s, unsigned int seconds);
|
210
|
+
void *us_internal_ssl_socket_context_ext(struct us_internal_ssl_socket_context_t *s);
|
211
|
+
struct us_internal_ssl_socket_context_t *us_internal_ssl_socket_get_context(struct us_internal_ssl_socket_t *s);
|
212
|
+
void *us_internal_ssl_socket_ext(struct us_internal_ssl_socket_t *s);
|
213
|
+
int us_internal_ssl_socket_is_shut_down(struct us_internal_ssl_socket_t *s);
|
214
|
+
void us_internal_ssl_socket_shutdown(struct us_internal_ssl_socket_t *s);
|
215
|
+
|
216
|
+
struct us_internal_ssl_socket_t *us_internal_ssl_socket_context_adopt_socket(struct us_internal_ssl_socket_context_t *context,
|
217
|
+
struct us_internal_ssl_socket_t *s, int ext_size);
|
218
|
+
|
219
|
+
struct us_internal_ssl_socket_context_t *us_internal_create_child_ssl_socket_context(struct us_internal_ssl_socket_context_t *context, int context_ext_size);
|
220
|
+
struct us_loop_t *us_internal_ssl_socket_context_loop(struct us_internal_ssl_socket_context_t *context);
|
221
|
+
|
222
|
+
#endif
|
223
|
+
|
224
|
+
#endif // INTERNAL_H
|
@@ -0,0 +1,350 @@
|
|
1
|
+
/*
|
2
|
+
* Authored by Alex Hultman, 2018-2019.
|
3
|
+
* Intellectual property of third-party.
|
4
|
+
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#ifndef LIBUSOCKETS_H
|
19
|
+
#define LIBUSOCKETS_H
|
20
|
+
|
21
|
+
/* 512kb shared receive buffer */
|
22
|
+
#define LIBUS_RECV_BUFFER_LENGTH 524288
|
23
|
+
/* A timeout granularity of 4 seconds means give or take 4 seconds from set timeout */
|
24
|
+
#define LIBUS_TIMEOUT_GRANULARITY 4
|
25
|
+
/* 32 byte padding of receive buffer ends */
|
26
|
+
#define LIBUS_RECV_BUFFER_PADDING 32
|
27
|
+
/* Guaranteed alignment of extension memory */
|
28
|
+
#define LIBUS_EXT_ALIGNMENT 16
|
29
|
+
|
30
|
+
/* Define what a socket descriptor is based on platform */
|
31
|
+
#ifdef _WIN32
|
32
|
+
#ifndef NOMINMAX
|
33
|
+
#define NOMINMAX
|
34
|
+
#endif
|
35
|
+
#include <winsock2.h>
|
36
|
+
#define LIBUS_SOCKET_DESCRIPTOR SOCKET
|
37
|
+
#else
|
38
|
+
#define LIBUS_SOCKET_DESCRIPTOR int
|
39
|
+
#endif
|
40
|
+
|
41
|
+
#ifdef __cplusplus
|
42
|
+
extern "C" {
|
43
|
+
#endif
|
44
|
+
|
45
|
+
enum {
|
46
|
+
/* No meaning, default listen option */
|
47
|
+
LIBUS_LISTEN_DEFAULT,
|
48
|
+
/* We exclusively own this port, do not share it */
|
49
|
+
LIBUS_LISTEN_EXCLUSIVE_PORT
|
50
|
+
};
|
51
|
+
|
52
|
+
/* Library types publicly available */
|
53
|
+
struct us_socket_t;
|
54
|
+
struct us_timer_t;
|
55
|
+
struct us_socket_context_t;
|
56
|
+
struct us_loop_t;
|
57
|
+
struct us_poll_t;
|
58
|
+
struct us_udp_socket_t;
|
59
|
+
struct us_udp_packet_buffer_t;
|
60
|
+
|
61
|
+
/* Extra for io_uring */
|
62
|
+
char *us_socket_send_buffer(int ssl, struct us_socket_t *s);
|
63
|
+
|
64
|
+
/* Public interface for UDP sockets */
|
65
|
+
|
66
|
+
/* Peeks data and length of UDP payload */
|
67
|
+
char *us_udp_packet_buffer_payload(struct us_udp_packet_buffer_t *buf, int index);
|
68
|
+
int us_udp_packet_buffer_payload_length(struct us_udp_packet_buffer_t *buf, int index);
|
69
|
+
|
70
|
+
/* Copies out local (received destination) ip (4 or 16 bytes) of received packet */
|
71
|
+
int us_udp_packet_buffer_local_ip(struct us_udp_packet_buffer_t *buf, int index, char *ip);
|
72
|
+
|
73
|
+
/* Get the bound port in host byte order */
|
74
|
+
int us_udp_socket_bound_port(struct us_udp_socket_t *s);
|
75
|
+
|
76
|
+
/* Peeks peer addr (sockaddr) of received packet */
|
77
|
+
char *us_udp_packet_buffer_peer(struct us_udp_packet_buffer_t *buf, int index);
|
78
|
+
|
79
|
+
/* Peeks ECN of received packet */
|
80
|
+
int us_udp_packet_buffer_ecn(struct us_udp_packet_buffer_t *buf, int index);
|
81
|
+
|
82
|
+
/* Receives a set of packets into specified packet buffer */
|
83
|
+
int us_udp_socket_receive(struct us_udp_socket_t *s, struct us_udp_packet_buffer_t *buf);
|
84
|
+
|
85
|
+
void us_udp_buffer_set_packet_payload(struct us_udp_packet_buffer_t *send_buf, int index, int offset, void *payload, int length, void *peer_addr);
|
86
|
+
|
87
|
+
int us_udp_socket_send(struct us_udp_socket_t *s, struct us_udp_packet_buffer_t *buf, int num);
|
88
|
+
|
89
|
+
/* Allocates a packet buffer that is reuable per thread. Mutated by us_udp_socket_receive. */
|
90
|
+
struct us_udp_packet_buffer_t *us_create_udp_packet_buffer();
|
91
|
+
|
92
|
+
/* Creates a (heavy-weight) UDP socket with a user space ring buffer. Again, this one is heavy weight and
|
93
|
+
* shoud be reused. One entire QUIC server can be implemented using only one single UDP socket so weight
|
94
|
+
* is not a concern as is the case for TCP sockets which are 1-to-1 with TCP connections. */
|
95
|
+
//struct us_udp_socket_t *us_create_udp_socket(struct us_loop_t *loop, void (*read_cb)(struct us_udp_socket_t *), unsigned short port);
|
96
|
+
|
97
|
+
//struct us_udp_socket_t *us_create_udp_socket(struct us_loop_t *loop, void (*data_cb)(struct us_udp_socket_t *, struct us_udp_packet_buffer_t *, int), void (*drain_cb)(struct us_udp_socket_t *), char *host, unsigned short port);
|
98
|
+
|
99
|
+
struct us_udp_socket_t *us_create_udp_socket(struct us_loop_t *loop, struct us_udp_packet_buffer_t *buf, void (*data_cb)(struct us_udp_socket_t *, struct us_udp_packet_buffer_t *, int), void (*drain_cb)(struct us_udp_socket_t *), const char *host, unsigned short port, void *user);
|
100
|
+
|
101
|
+
/* This one is ugly, should be ext! not user */
|
102
|
+
void *us_udp_socket_user(struct us_udp_socket_t *s);
|
103
|
+
|
104
|
+
/* Binds the UDP socket to an interface and port */
|
105
|
+
int us_udp_socket_bind(struct us_udp_socket_t *s, const char *hostname, unsigned int port);
|
106
|
+
|
107
|
+
/* Public interfaces for timers */
|
108
|
+
|
109
|
+
/* Create a new high precision, low performance timer. May fail and return null */
|
110
|
+
struct us_timer_t *us_create_timer(struct us_loop_t *loop, int fallthrough, unsigned int ext_size);
|
111
|
+
|
112
|
+
/* Returns user data extension for this timer */
|
113
|
+
void *us_timer_ext(struct us_timer_t *timer);
|
114
|
+
|
115
|
+
/* */
|
116
|
+
void us_timer_close(struct us_timer_t *timer);
|
117
|
+
|
118
|
+
/* Arm a timer with a delay from now and eventually a repeat delay.
|
119
|
+
* Specify 0 as repeat delay to disable repeating. Specify both 0 to disarm. */
|
120
|
+
void us_timer_set(struct us_timer_t *timer, void (*cb)(struct us_timer_t *t), int ms, int repeat_ms);
|
121
|
+
|
122
|
+
/* Returns the loop for this timer */
|
123
|
+
struct us_loop_t *us_timer_loop(struct us_timer_t *t);
|
124
|
+
|
125
|
+
/* Public interfaces for contexts */
|
126
|
+
|
127
|
+
struct us_socket_context_options_t {
|
128
|
+
const char *key_file_name;
|
129
|
+
const char *cert_file_name;
|
130
|
+
const char *passphrase;
|
131
|
+
const char *dh_params_file_name;
|
132
|
+
const char *ca_file_name;
|
133
|
+
const char *ssl_ciphers;
|
134
|
+
int ssl_prefer_low_memory_usage; /* Todo: rename to prefer_low_memory_usage and apply for TCP as well */
|
135
|
+
};
|
136
|
+
|
137
|
+
/* Return 15-bit timestamp for this context */
|
138
|
+
unsigned short us_socket_context_timestamp(int ssl, struct us_socket_context_t *context);
|
139
|
+
|
140
|
+
/* Adds SNI domain and cert in asn1 format */
|
141
|
+
void us_socket_context_add_server_name(int ssl, struct us_socket_context_t *context, const char *hostname_pattern, struct us_socket_context_options_t options, void *user);
|
142
|
+
void us_socket_context_remove_server_name(int ssl, struct us_socket_context_t *context, const char *hostname_pattern);
|
143
|
+
void us_socket_context_on_server_name(int ssl, struct us_socket_context_t *context, void (*cb)(struct us_socket_context_t *, const char *hostname));
|
144
|
+
void *us_socket_server_name_userdata(int ssl, struct us_socket_t *s);
|
145
|
+
void *us_socket_context_find_server_name_userdata(int ssl, struct us_socket_context_t *context, const char *hostname_pattern);
|
146
|
+
|
147
|
+
/* Returns the underlying SSL native handle, such as SSL_CTX or nullptr */
|
148
|
+
void *us_socket_context_get_native_handle(int ssl, struct us_socket_context_t *context);
|
149
|
+
|
150
|
+
/* A socket context holds shared callbacks and user data extension for associated sockets */
|
151
|
+
struct us_socket_context_t *us_create_socket_context(int ssl, struct us_loop_t *loop,
|
152
|
+
int ext_size, struct us_socket_context_options_t options);
|
153
|
+
|
154
|
+
/* Delete resources allocated at creation time. */
|
155
|
+
void us_socket_context_free(int ssl, struct us_socket_context_t *context);
|
156
|
+
|
157
|
+
/* Setters of various async callbacks */
|
158
|
+
void us_socket_context_on_pre_open(int ssl, struct us_socket_context_t *context,
|
159
|
+
LIBUS_SOCKET_DESCRIPTOR (*on_pre_open)(LIBUS_SOCKET_DESCRIPTOR fd));
|
160
|
+
void us_socket_context_on_open(int ssl, struct us_socket_context_t *context,
|
161
|
+
struct us_socket_t *(*on_open)(struct us_socket_t *s, int is_client, char *ip, int ip_length));
|
162
|
+
void us_socket_context_on_close(int ssl, struct us_socket_context_t *context,
|
163
|
+
struct us_socket_t *(*on_close)(struct us_socket_t *s, int code, void *reason));
|
164
|
+
void us_socket_context_on_data(int ssl, struct us_socket_context_t *context,
|
165
|
+
struct us_socket_t *(*on_data)(struct us_socket_t *s, char *data, int length));
|
166
|
+
void us_socket_context_on_writable(int ssl, struct us_socket_context_t *context,
|
167
|
+
struct us_socket_t *(*on_writable)(struct us_socket_t *s));
|
168
|
+
void us_socket_context_on_timeout(int ssl, struct us_socket_context_t *context,
|
169
|
+
struct us_socket_t *(*on_timeout)(struct us_socket_t *s));
|
170
|
+
void us_socket_context_on_long_timeout(int ssl, struct us_socket_context_t *context,
|
171
|
+
struct us_socket_t *(*on_timeout)(struct us_socket_t *s));
|
172
|
+
/* This one is only used for when a connecting socket fails in a late stage. */
|
173
|
+
void us_socket_context_on_connect_error(int ssl, struct us_socket_context_t *context,
|
174
|
+
struct us_socket_t *(*on_connect_error)(struct us_socket_t *s, int code));
|
175
|
+
|
176
|
+
/* Emitted when a socket has been half-closed */
|
177
|
+
void us_socket_context_on_end(int ssl, struct us_socket_context_t *context, struct us_socket_t *(*on_end)(struct us_socket_t *s));
|
178
|
+
|
179
|
+
/* Returns user data extension for this socket context */
|
180
|
+
void *us_socket_context_ext(int ssl, struct us_socket_context_t *context);
|
181
|
+
|
182
|
+
/* Closes all open sockets, including listen sockets. Does not invalidate the socket context. */
|
183
|
+
void us_socket_context_close(int ssl, struct us_socket_context_t *context);
|
184
|
+
|
185
|
+
/* Listen for connections. Acts as the main driving cog in a server. Will call set async callbacks. */
|
186
|
+
struct us_listen_socket_t *us_socket_context_listen(int ssl, struct us_socket_context_t *context,
|
187
|
+
const char *host, int port, int options, int socket_ext_size);
|
188
|
+
|
189
|
+
struct us_listen_socket_t *us_socket_context_listen_unix(int ssl, struct us_socket_context_t *context,
|
190
|
+
const char *path, int options, int socket_ext_size);
|
191
|
+
|
192
|
+
/* listen_socket.c/.h */
|
193
|
+
void us_listen_socket_close(int ssl, struct us_listen_socket_t *ls);
|
194
|
+
|
195
|
+
/* Adopt a socket which was accepted either internally, or from another accept() outside libusockets */
|
196
|
+
struct us_socket_t *us_adopt_accepted_socket(int ssl, struct us_socket_context_t *context, LIBUS_SOCKET_DESCRIPTOR client_fd,
|
197
|
+
unsigned int socket_ext_size, char *addr_ip, int addr_ip_length);
|
198
|
+
|
199
|
+
/* Land in on_open or on_connection_error or return null or return socket */
|
200
|
+
struct us_socket_t *us_socket_context_connect(int ssl, struct us_socket_context_t *context,
|
201
|
+
const char *host, int port, const char *source_host, int options, int socket_ext_size);
|
202
|
+
|
203
|
+
struct us_socket_t *us_socket_context_connect_unix(int ssl, struct us_socket_context_t *context,
|
204
|
+
const char *server_path, int options, int socket_ext_size);
|
205
|
+
|
206
|
+
/* Is this socket established? Can be used to check if a connecting socket has fired the on_open event yet.
|
207
|
+
* Can also be used to determine if a socket is a listen_socket or not, but you probably know that already. */
|
208
|
+
int us_socket_is_established(int ssl, struct us_socket_t *s);
|
209
|
+
|
210
|
+
/* Cancel a connecting socket. Can be used together with us_socket_timeout to limit connection times.
|
211
|
+
* Entirely destroys the socket - this function works like us_socket_close but does not trigger on_close event since
|
212
|
+
* you never got the on_open event first. */
|
213
|
+
struct us_socket_t *us_socket_close_connecting(int ssl, struct us_socket_t *s);
|
214
|
+
|
215
|
+
/* Returns the loop for this socket context. */
|
216
|
+
struct us_loop_t *us_socket_context_loop(int ssl, struct us_socket_context_t *context);
|
217
|
+
|
218
|
+
/* Invalidates passed socket, returning a new resized socket which belongs to a different socket context.
|
219
|
+
* Used mainly for "socket upgrades" such as when transitioning from HTTP to WebSocket. */
|
220
|
+
struct us_socket_t *us_socket_context_adopt_socket(int ssl, struct us_socket_context_t *context, struct us_socket_t *s, int ext_size);
|
221
|
+
|
222
|
+
/* Create a child socket context which acts much like its own socket context with its own callbacks yet still relies on the
|
223
|
+
* parent socket context for some shared resources. Child socket contexts should be used together with socket adoptions and nothing else. */
|
224
|
+
struct us_socket_context_t *us_create_child_socket_context(int ssl, struct us_socket_context_t *context, int context_ext_size);
|
225
|
+
|
226
|
+
/* Public interfaces for loops */
|
227
|
+
|
228
|
+
/* Returns a new event loop with user data extension */
|
229
|
+
struct us_loop_t *us_create_loop(void *hint, void (*wakeup_cb)(struct us_loop_t *loop),
|
230
|
+
void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop), unsigned int ext_size);
|
231
|
+
|
232
|
+
/* Frees the loop immediately */
|
233
|
+
void us_loop_free(struct us_loop_t *loop);
|
234
|
+
|
235
|
+
/* Returns the loop user data extension */
|
236
|
+
void *us_loop_ext(struct us_loop_t *loop);
|
237
|
+
|
238
|
+
/* Blocks the calling thread and drives the event loop until no more non-fallthrough polls are scheduled */
|
239
|
+
void us_loop_run(struct us_loop_t *loop);
|
240
|
+
|
241
|
+
/* Signals the loop from any thread to wake up and execute its wakeup handler from the loop's own running thread.
|
242
|
+
* This is the only fully thread-safe function and serves as the basis for thread safety */
|
243
|
+
void us_wakeup_loop(struct us_loop_t *loop);
|
244
|
+
|
245
|
+
/* Hook up timers in existing loop */
|
246
|
+
void us_loop_integrate(struct us_loop_t *loop);
|
247
|
+
|
248
|
+
/* Returns the loop iteration number */
|
249
|
+
long long us_loop_iteration_number(struct us_loop_t *loop);
|
250
|
+
|
251
|
+
/* Public interfaces for polls */
|
252
|
+
|
253
|
+
/* A fallthrough poll does not keep the loop running, it falls through */
|
254
|
+
struct us_poll_t *us_create_poll(struct us_loop_t *loop, int fallthrough, unsigned int ext_size);
|
255
|
+
|
256
|
+
/* After stopping a poll you must manually free the memory */
|
257
|
+
void us_poll_free(struct us_poll_t *p, struct us_loop_t *loop);
|
258
|
+
|
259
|
+
/* Associate this poll with a socket descriptor and poll type */
|
260
|
+
void us_poll_init(struct us_poll_t *p, LIBUS_SOCKET_DESCRIPTOR fd, int poll_type);
|
261
|
+
|
262
|
+
/* Start, change and stop polling for events */
|
263
|
+
void us_poll_start(struct us_poll_t *p, struct us_loop_t *loop, int events);
|
264
|
+
void us_poll_change(struct us_poll_t *p, struct us_loop_t *loop, int events);
|
265
|
+
void us_poll_stop(struct us_poll_t *p, struct us_loop_t *loop);
|
266
|
+
|
267
|
+
/* Return what events we are polling for */
|
268
|
+
int us_poll_events(struct us_poll_t *p);
|
269
|
+
|
270
|
+
/* Returns the user data extension of this poll */
|
271
|
+
void *us_poll_ext(struct us_poll_t *p);
|
272
|
+
|
273
|
+
/* Get associated socket descriptor from a poll */
|
274
|
+
LIBUS_SOCKET_DESCRIPTOR us_poll_fd(struct us_poll_t *p);
|
275
|
+
|
276
|
+
/* Resize an active poll */
|
277
|
+
struct us_poll_t *us_poll_resize(struct us_poll_t *p, struct us_loop_t *loop, unsigned int ext_size);
|
278
|
+
|
279
|
+
/* Public interfaces for sockets */
|
280
|
+
|
281
|
+
/* Returns the underlying native handle for a socket, such as SSL or file descriptor.
|
282
|
+
* In the case of file descriptor, the value of pointer is fd. */
|
283
|
+
void *us_socket_get_native_handle(int ssl, struct us_socket_t *s);
|
284
|
+
|
285
|
+
/* Write up to length bytes of data. Returns actual bytes written.
|
286
|
+
* Will call the on_writable callback of active socket context on failure to write everything off in one go.
|
287
|
+
* Set hint msg_more if you have more immediate data to write. */
|
288
|
+
int us_socket_write(int ssl, struct us_socket_t *s, const char *data, int length, int msg_more);
|
289
|
+
|
290
|
+
/* Special path for non-SSL sockets. Used to send header and payload in one go. Works like us_socket_write. */
|
291
|
+
int us_socket_write2(int ssl, struct us_socket_t *s, const char *header, int header_length, const char *payload, int payload_length);
|
292
|
+
|
293
|
+
/* Set a low precision, high performance timer on a socket. A socket can only have one single active timer
|
294
|
+
* at any given point in time. Will remove any such pre set timer */
|
295
|
+
void us_socket_timeout(int ssl, struct us_socket_t *s, unsigned int seconds);
|
296
|
+
|
297
|
+
/* Set a low precision, high performance timer on a socket. Suitable for per-minute precision. */
|
298
|
+
void us_socket_long_timeout(int ssl, struct us_socket_t *s, unsigned int minutes);
|
299
|
+
|
300
|
+
/* Return the user data extension of this socket */
|
301
|
+
void *us_socket_ext(int ssl, struct us_socket_t *s);
|
302
|
+
|
303
|
+
/* Return the socket context of this socket */
|
304
|
+
struct us_socket_context_t *us_socket_context(int ssl, struct us_socket_t *s);
|
305
|
+
|
306
|
+
/* Withdraw any msg_more status and flush any pending data */
|
307
|
+
void us_socket_flush(int ssl, struct us_socket_t *s);
|
308
|
+
|
309
|
+
/* Shuts down the connection by sending FIN and/or close_notify */
|
310
|
+
void us_socket_shutdown(int ssl, struct us_socket_t *s);
|
311
|
+
|
312
|
+
/* Shuts down the connection in terms of read, meaning next event loop
|
313
|
+
* iteration will catch the socket being closed. Can be used to defer closing
|
314
|
+
* to next event loop iteration. */
|
315
|
+
void us_socket_shutdown_read(int ssl, struct us_socket_t *s);
|
316
|
+
|
317
|
+
/* Returns whether the socket has been shut down or not */
|
318
|
+
int us_socket_is_shut_down(int ssl, struct us_socket_t *s);
|
319
|
+
|
320
|
+
/* Returns whether this socket has been closed. Only valid if memory has not yet been released. */
|
321
|
+
int us_socket_is_closed(int ssl, struct us_socket_t *s);
|
322
|
+
|
323
|
+
/* Immediately closes the socket */
|
324
|
+
struct us_socket_t *us_socket_close(int ssl, struct us_socket_t *s, int code, void *reason);
|
325
|
+
|
326
|
+
/* Returns local port or -1 on failure. */
|
327
|
+
int us_socket_local_port(int ssl, struct us_socket_t *s);
|
328
|
+
|
329
|
+
/* Returns remote ephemeral port or -1 on failure. */
|
330
|
+
int us_socket_remote_port(int ssl, struct us_socket_t *s);
|
331
|
+
|
332
|
+
/* Copy remote (IP) address of socket, or fail with zero length. */
|
333
|
+
void us_socket_remote_address(int ssl, struct us_socket_t *s, char *buf, int *length);
|
334
|
+
|
335
|
+
#ifdef __cplusplus
|
336
|
+
}
|
337
|
+
#endif
|
338
|
+
|
339
|
+
/* Decide what eventing system to use by default */
|
340
|
+
#if !defined(LIBUS_USE_IO_URING) && !defined(LIBUS_USE_EPOLL) && !defined(LIBUS_USE_LIBUV) && !defined(LIBUS_USE_GCD) && !defined(LIBUS_USE_KQUEUE) && !defined(LIBUS_USE_ASIO)
|
341
|
+
#if defined(_WIN32)
|
342
|
+
#define LIBUS_USE_LIBUV
|
343
|
+
#elif defined(__APPLE__) || defined(__FreeBSD__)
|
344
|
+
#define LIBUS_USE_KQUEUE
|
345
|
+
#else
|
346
|
+
#define LIBUS_USE_EPOLL
|
347
|
+
#endif
|
348
|
+
#endif
|
349
|
+
|
350
|
+
#endif // LIBUSOCKETS_H
|