Class: Up::Ruby::Server
- Inherits:
-
Object
- Object
- Up::Ruby::Server
- Defined in:
- ext/up_ext/up_ext.c
Direct Known Subclasses
Instance Method Summary collapse
- #initialize(*args) ⇒ Object constructor
- #listen ⇒ Object
- #publish(channel, message) ⇒ Object
- #stop ⇒ Object
Constructor Details
#initialize(*args) ⇒ Object
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 |
# File 'ext/up_ext/up_ext.c', line 619
static VALUE up_server_init(int argc, VALUE *argv, VALUE self) {
if (!rb_keyword_given_p())
rb_raise(rb_eArgError, "no args given, must at least provide app:");
ID kwargs[] = {id_app, id_host, id_port, id_logger};
VALUE rargs[4] = {Qnil, Qnil, Qnil, Qnil};
VALUE options = Qnil;
rb_scan_args_kw(1, argc, argv, ":", &options);
rb_get_kwargs(options, kwargs, 1, 2, rargs);
VALUE rapp = rargs[0];
VALUE rhost = rargs[1];
VALUE rport = rargs[2];
up_internal_check_arg_types(rapp, &rhost, &rport);
server_s *s = DATA_PTR(self);
s->rapp = rapp;
s->host = rb_obj_freeze(rhost);
s->port = rport;
s->logger = rargs[3];
rb_ivar_set(self, at_port, s->port);
return self;
}
|
Instance Method Details
#listen ⇒ Object
793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 |
# File 'ext/up_ext/up_ext.c', line 793
static VALUE up_server_listen(VALUE self) {
server_s *s = DATA_PTR(self);
up_internal_check_arg_types(s->rapp, &s->host, &s->port);
rb_ivar_set(mUp, at_instance, self);
s->env_template = rb_hash_dup(rack_env_template);
// When combined with SCRIPT_NAME and PATH_INFO, these variables can be used
// to complete the URL.
rb_hash_aset(s->env_template, SERVER_NAME, s->host);
// An optional Integer which is the port the server is running on.
rb_hash_aset(s->env_template, SERVER_PORT, s->port);
if (s->logger && s->logger != Qundef && s->logger != Qnil) {
rb_hash_aset(s->env_template, rack_logger, s->logger);
}
struct us_socket_context_options_t options = {.key_file_name = NULL,
.cert_file_name = NULL,
.ca_file_name = NULL,
.passphrase = NULL,
.dh_params_file_name = NULL,
.ssl_ciphers = NULL};
s->app = uws_create_app(USE_SSL, options);
if (!s->app)
rb_raise(rb_eRuntimeError, "could not init uws app");
uws_app_listen_config_t config = {
.port = FIX2INT(s->port), .host = RSTRING_PTR(s->host), .options = 0};
VALUE rmember_id = rb_ivar_get(self, at_member_id);
if (rmember_id != Qnil) {
// got a cluster
s->member_id = FIX2INT(rmember_id);
// install signal handler
cluster_app = s->app;
cluster_socket = NULL;
struct sigaction upclcl = {.sa_handler = up_internal_close_sockets,
.sa_flags = 0};
sigemptyset(&upclcl.sa_mask);
sigaction(SIGINT, &upclcl, NULL);
// open publish ports
VALUE rworkers = rb_ivar_get(self, at_workers);
s->workers = FIX2INT(rworkers);
VALUE rsecret = rb_ivar_get(self, at_secret);
if (TYPE(rsecret) != T_STRING || RSTRING_LEN(rsecret) != 36)
rb_raise(rb_eTypeError, "cluster secret of unknown type");
memcpy(s->secret, RSTRING_PTR(rsecret), 36);
s->secret[36] = '\0';
uws_app_any(USE_SSL, s->app, INTERNAL_PUBLISH_PATH,
up_internal_publish_handler, (void *)s);
uws_app_listen_config_t config_internal = {
.port = config.port + s->member_id, .host = "localhost", .options = 0};
uws_app_listen_with_config(false, s->app, config_internal,
up_server_cluster_listen_handler, NULL);
} else {
cluster_app = s->app;
cluster_socket = NULL;
struct sigaction upclcl = {.sa_handler = up_internal_close_sockets,
.sa_flags = 0};
sigemptyset(&upclcl.sa_mask);
sigaction(SIGINT, &upclcl, NULL);
}
uws_app_post(USE_SSL, s->app, "/*", up_server_post_handler, (void *)s);
uws_app_any(USE_SSL, s->app, "/*", up_server_any_handler, (void *)s);
uws_ws(USE_SSL, s->app, "/*",
(uws_socket_behavior_t){.compression = DISABLED,
.maxPayloadLength = 5 * 1024 * 1024,
.idleTimeout = 120,
.upgrade = up_ws_upgrade_handler,
.open = up_ws_open_handler,
.message = up_ws_message_handler,
.close = up_ws_close_handler,
.drain = up_ws_drain_handler,
.ping = up_ws_ping_handler,
.pong = up_ws_pong_handler},
s);
uws_app_listen_with_config(USE_SSL, s->app, config, up_server_listen_handler,
NULL);
uws_app_run(USE_SSL, s->app);
return self;
}
|
#publish(channel, message) ⇒ Object
871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 |
# File 'ext/up_ext/up_ext.c', line 871
static VALUE up_server_publish(VALUE self, VALUE channel, VALUE message) {
if (TYPE(channel) != T_STRING)
channel = rb_obj_as_string(channel);
if (TYPE(message) != T_STRING)
message = rb_obj_as_string(message);
server_s *s = DATA_PTR(self);
VALUE members = rb_ivar_get(self, at_members);
if (members != Qnil) {
long i, mb_cnt = RARRAY_LEN(members);
for (i = 0; i < mb_cnt; i++) {
up_internal_publish_to_member(s, channel, message, i);
}
} else {
uws_publish(USE_SSL, s->app, RSTRING_PTR(channel), RSTRING_LEN(channel),
RSTRING_PTR(message), RSTRING_LEN(message), TEXT, false);
if (s->member_id > 0) {
// publish to cluster members
int i;
for (i = 1; i <= s->workers; i++) {
if (i != s->member_id)
up_internal_publish_to_member(s, channel, message, i);
}
}
}
return Qtrue;
}
|
#stop ⇒ Object
898 899 900 901 902 903 904 905 906 |
# File 'ext/up_ext/up_ext.c', line 898
static VALUE up_server_stop(VALUE self) {
server_s *s = DATA_PTR(self);
if (!s->app)
rb_raise(rb_eRuntimeError, "no uws, did initialize call super?");
uws_app_close(USE_SSL, s->app);
uws_app_destroy(USE_SSL, s->app);
s->app = NULL;
return Qnil;
}
|