noderb 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +157 -7
- data/ext/noderb_extension/extconf.rb +1 -3
- data/ext/noderb_extension/libuv/BSDmakefile +2 -0
- data/ext/noderb_extension/libuv/all.gyp +326 -0
- data/ext/noderb_extension/libuv/config-mingw.mk +0 -1
- data/ext/noderb_extension/libuv/config-unix.mk +7 -1
- data/ext/noderb_extension/libuv/create-msvs-files.bat +13 -6
- data/ext/noderb_extension/libuv/{build/gyp_uv → gyp_uv} +1 -2
- data/ext/noderb_extension/libuv/include/uv.h +5 -0
- data/ext/noderb_extension/libuv/src/eio/config_cygwin.h +3 -0
- data/ext/noderb_extension/libuv/src/eio/config_freebsd.h +3 -0
- data/ext/noderb_extension/libuv/src/eio/config_sunos.h +3 -0
- data/ext/noderb_extension/libuv/src/eio/ecb.h +1 -1
- data/ext/noderb_extension/libuv/src/eio/eio.c +8 -1
- data/ext/noderb_extension/libuv/src/uv-common.c +1 -0
- data/ext/noderb_extension/libuv/src/uv-sunos.c +1 -1
- data/ext/noderb_extension/libuv/src/uv-unix.c +72 -59
- data/ext/noderb_extension/libuv/src/win/core.c +3 -0
- data/ext/noderb_extension/libuv/src/win/internal.h +11 -0
- data/ext/noderb_extension/libuv/src/win/ntdll.h +130 -0
- data/ext/noderb_extension/libuv/src/win/pipe.c +105 -27
- data/ext/noderb_extension/libuv/src/win/process.c +76 -5
- data/ext/noderb_extension/libuv/src/win/req.c +7 -0
- data/ext/noderb_extension/libuv/src/win/winapi.c +52 -0
- data/ext/noderb_extension/libuv/test/benchmark-pound.c +50 -48
- data/ext/noderb_extension/libuv/test/echo-server.c +2 -2
- data/ext/noderb_extension/libuv/test/test-list.h +2 -0
- data/ext/noderb_extension/libuv/test/test-spawn.c +48 -1
- data/ext/noderb_extension/noderb.c +38 -339
- data/ext/noderb_extension/noderb.h +18 -2
- data/ext/noderb_extension/noderb_common.h +13 -0
- data/ext/noderb_extension/noderb_dns.c +37 -0
- data/ext/noderb_extension/noderb_dns.h +15 -0
- data/ext/noderb_extension/noderb_process.c +126 -0
- data/ext/noderb_extension/noderb_process.h +17 -0
- data/ext/noderb_extension/noderb_tcp.c +127 -0
- data/ext/noderb_extension/noderb_tcp.h +19 -0
- data/ext/noderb_extension/noderb_timers.c +58 -0
- data/ext/noderb_extension/noderb_timers.h +16 -0
- data/ext/noderb_extension/noderb_tools.c +127 -0
- data/ext/noderb_extension/noderb_tools.h +33 -0
- data/lib/noderb/dns.rb +11 -0
- data/lib/noderb/next_tick.rb +2 -1
- data/lib/noderb/tcp.rb +27 -0
- data/lib/noderb/timers.rb +24 -0
- data/lib/noderb/version.rb +1 -1
- data/lib/noderb.rb +6 -1
- metadata +23 -7
- data/ext/noderb_extension/libuv/build/all.gyp +0 -254
- data/ext/noderb_extension/libuv/doc/desired-api.md +0 -159
- /data/ext/noderb_extension/libuv/{build/common.gypi → common.gypi} +0 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
#include <noderb_common.h>
|
2
|
+
#include <noderb_tcp.h>
|
3
|
+
|
4
|
+
#include <noderb.h>
|
5
|
+
#include <noderb_tools.h>
|
6
|
+
|
7
|
+
typedef struct {
|
8
|
+
NODERB_BASIC_HANDLE
|
9
|
+
} nodeRb_client;
|
10
|
+
|
11
|
+
/*
|
12
|
+
NodeRb TCP
|
13
|
+
*/
|
14
|
+
|
15
|
+
void nodeRb_tcp_on_close(uv_handle_t* client) {
|
16
|
+
// Read data saved in Ruby
|
17
|
+
nodeRb_client *client_data = client->data;
|
18
|
+
VALUE object = nodeRb_get_class_from_id(client_data->target);
|
19
|
+
// Call callback for connection close
|
20
|
+
rb_funcall(object, rb_intern("on_close"), 0, 0);
|
21
|
+
// Allow GC of handler instance
|
22
|
+
nodeRb_unregister_instance(object);
|
23
|
+
rb_iv_set(object, "@_handle", Qnil);
|
24
|
+
// Clean up some memory
|
25
|
+
free(client_data);
|
26
|
+
free(client);
|
27
|
+
}
|
28
|
+
|
29
|
+
void nodeRb_tcp_on_shutdown(uv_shutdown_t* req, int status) {
|
30
|
+
// When connection shutdown, close it
|
31
|
+
uv_close((uv_handle_t*) req->handle, nodeRb_tcp_on_close);
|
32
|
+
free(req);
|
33
|
+
}
|
34
|
+
|
35
|
+
VALUE nodeRb_tcp_close_connection(VALUE self) {
|
36
|
+
// Allocate new shutdown request
|
37
|
+
uv_shutdown_t* req = malloc(sizeof (uv_shutdown_t));
|
38
|
+
// Read data saved in Ruby
|
39
|
+
VALUE rhandler = rb_iv_get(self, "@_handle");
|
40
|
+
uv_stream_t *handle;
|
41
|
+
Data_Get_Struct(rhandler, uv_stream_t, handle);
|
42
|
+
// Request shutdown of stream
|
43
|
+
uv_shutdown(req, handle, nodeRb_tcp_on_shutdown);
|
44
|
+
}
|
45
|
+
|
46
|
+
VALUE nodeRb_tcp_send_data(VALUE self, VALUE data) {
|
47
|
+
// Read data saved in Ruby
|
48
|
+
uv_stream_t *handle;
|
49
|
+
Data_Get_Struct(rb_iv_get(self, "@_handle"), uv_stream_t, handle);
|
50
|
+
// Request write to stream
|
51
|
+
nodeRb_write(handle, rb_string_value_cstr(&data), RSTRING_LEN(data));
|
52
|
+
}
|
53
|
+
|
54
|
+
/*
|
55
|
+
NodeRb TCP client
|
56
|
+
*/
|
57
|
+
|
58
|
+
void nodeRb_tcp_on_client_connect(uv_connect_t* client, int status) {
|
59
|
+
nodeRb_client *client_data = client->handle->data;
|
60
|
+
VALUE obj = nodeRb_get_class_from_id(client_data->target);
|
61
|
+
rb_iv_set(obj, "@_handle", Data_Wrap_Struct(nodeRb_get_nodeRb_pointer(), 0, NULL, client->handle));
|
62
|
+
rb_funcall(obj, rb_intern("on_connect"), 0, 0);
|
63
|
+
uv_read_start((uv_stream_t*) client->handle, nodeRb_read_alloc, nodeRb_read);
|
64
|
+
}
|
65
|
+
|
66
|
+
VALUE nodeRb_tcp_startClient(VALUE self, VALUE address, VALUE port, VALUE clazz) {
|
67
|
+
// Allocate memory for connection
|
68
|
+
uv_tcp_t *handle = malloc(sizeof (uv_tcp_t));
|
69
|
+
uv_tcp_init(handle);
|
70
|
+
uv_connect_t *connect = malloc(sizeof (uv_connect_t));
|
71
|
+
// Translate IP address
|
72
|
+
struct sockaddr_in socket = uv_ip4_addr(rb_string_value_cstr(&address), (int) rb_num2long(port));
|
73
|
+
// Save client data
|
74
|
+
nodeRb_client *client_data = malloc(sizeof (nodeRb_client));
|
75
|
+
client_data->target = rb_num2long(rb_obj_id(clazz));
|
76
|
+
client_data->target_callback = (char*) "on_data";
|
77
|
+
handle->data = client_data;
|
78
|
+
// Open socket
|
79
|
+
int r = uv_tcp_connect(connect, handle, socket, nodeRb_tcp_on_client_connect);
|
80
|
+
if (nodeRb_handle_error(r)) return Qnil;
|
81
|
+
};
|
82
|
+
|
83
|
+
/*
|
84
|
+
NodeRb TCP server
|
85
|
+
*/
|
86
|
+
|
87
|
+
void nodeRb_tcp_on_server_connect(uv_stream_t* server, int status) {
|
88
|
+
// Allocate memory for client data
|
89
|
+
nodeRb_client *client_data = malloc(sizeof (nodeRb_client));
|
90
|
+
// Allocate for client
|
91
|
+
uv_stream_t *client = malloc(sizeof (uv_tcp_t));
|
92
|
+
uv_tcp_init((uv_tcp_t*) client);
|
93
|
+
// Accept connection
|
94
|
+
int r = uv_accept(server, client);
|
95
|
+
if (nodeRb_handle_error(r)) return;
|
96
|
+
// Initialise new instance of handler class
|
97
|
+
VALUE clazz = rb_path2class(server->data);
|
98
|
+
VALUE obj = rb_funcall(clazz, rb_intern("new"), 0, 0);
|
99
|
+
// Be safe from GC
|
100
|
+
nodeRb_register_instance(obj);
|
101
|
+
// Call callback
|
102
|
+
rb_funcall(obj, rb_intern("on_connect"), 0, 0);
|
103
|
+
// Save client data with this connection handler instance
|
104
|
+
rb_iv_set(obj, "@_handle", Data_Wrap_Struct(nodeRb_get_nodeRb_pointer(), 0, NULL, client));
|
105
|
+
// Get object id of handler instance
|
106
|
+
client_data->target = rb_num2long(rb_obj_id(obj));
|
107
|
+
client_data->target_callback = (char*) "on_data";
|
108
|
+
client->data = client_data;
|
109
|
+
uv_read_start(client, nodeRb_read_alloc, nodeRb_read);
|
110
|
+
}
|
111
|
+
|
112
|
+
VALUE nodeRb_tcp_startServer(VALUE self, VALUE address, VALUE port, VALUE clazz) {
|
113
|
+
// Allocate for server
|
114
|
+
uv_tcp_t *server = malloc(sizeof (uv_tcp_t));
|
115
|
+
uv_tcp_init(server);
|
116
|
+
// Translate IP address
|
117
|
+
struct sockaddr_in socket = uv_ip4_addr(rb_string_value_cstr(&address), (int) rb_num2long(port));
|
118
|
+
// Bind on socket
|
119
|
+
int r = uv_tcp_bind(server, socket);
|
120
|
+
if (nodeRb_handle_error(r)) return Qnil;
|
121
|
+
// Listen on server
|
122
|
+
r = uv_listen((uv_stream_t*) server, 128, nodeRb_tcp_on_server_connect);
|
123
|
+
if (nodeRb_handle_error(r)) return Qnil;
|
124
|
+
// Save information for server
|
125
|
+
VALUE name = rb_class_name(clazz);
|
126
|
+
server->data = rb_string_value_cstr(&name);
|
127
|
+
};
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#ifndef NODERB_TCP_SERVER_H
|
2
|
+
#define NODERB_TCP_SERVER_H
|
3
|
+
|
4
|
+
#ifdef __cplusplus
|
5
|
+
extern "C" {
|
6
|
+
#endif
|
7
|
+
|
8
|
+
VALUE nodeRb_tcp_startClient(VALUE self, VALUE address, VALUE port, VALUE clazz);
|
9
|
+
|
10
|
+
VALUE nodeRb_tcp_startServer(VALUE self, VALUE address, VALUE port, VALUE clazz);
|
11
|
+
VALUE nodeRb_tcp_send_data(VALUE self, VALUE data);
|
12
|
+
VALUE nodeRb_tcp_close_connection(VALUE self);
|
13
|
+
|
14
|
+
#ifdef __cplusplus
|
15
|
+
}
|
16
|
+
#endif
|
17
|
+
|
18
|
+
#endif /* NODERB_TCP_SERVER_H */
|
19
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#include <noderb_common.h>
|
2
|
+
#include <noderb_timers.h>
|
3
|
+
|
4
|
+
#include <noderb_tools.h>
|
5
|
+
#include <noderb.h>
|
6
|
+
|
7
|
+
typedef struct {
|
8
|
+
long target;
|
9
|
+
int repeat;
|
10
|
+
} nodeRb_timers_handle;
|
11
|
+
|
12
|
+
void nodeRb_timers_callback(uv_timer_t* handle, int status){
|
13
|
+
// Load data
|
14
|
+
nodeRb_timers_handle* data = (nodeRb_timers_handle*) handle->data;
|
15
|
+
VALUE handler = nodeRb_get_class_from_id(data->target);
|
16
|
+
// Run callback
|
17
|
+
rb_funcall(handler, rb_intern("call"), 1, handler);
|
18
|
+
if(data->repeat == 0){
|
19
|
+
// Let the GC work
|
20
|
+
nodeRb_unregister_instance(handler);
|
21
|
+
// Free memory
|
22
|
+
free(data);
|
23
|
+
free(handle);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
VALUE nodeRb_timers_stop(VALUE self){
|
28
|
+
// Load data
|
29
|
+
uv_timer_t *handle;
|
30
|
+
Data_Get_Struct(rb_iv_get(self, "@_handle"), uv_timer_t, handle);
|
31
|
+
// Stop timer
|
32
|
+
uv_timer_stop(handle);
|
33
|
+
// Let the GC work
|
34
|
+
nodeRb_unregister_instance(self);
|
35
|
+
// Free memory
|
36
|
+
free((nodeRb_timers_handle*) handle->data);
|
37
|
+
free(handle);
|
38
|
+
}
|
39
|
+
|
40
|
+
VALUE nodeRb_timers_once(VALUE self, VALUE timeout, VALUE repeat, VALUE handler){
|
41
|
+
// Allocate memory
|
42
|
+
uv_timer_t* handle = (uv_timer_t*) malloc(sizeof(uv_timer_t));
|
43
|
+
nodeRb_timers_handle* data = (nodeRb_timers_handle*) malloc(sizeof(nodeRb_timers_handle));
|
44
|
+
// Save from GC
|
45
|
+
nodeRb_register_instance(handler);
|
46
|
+
// Save data for later use
|
47
|
+
if(rb_num2long(timeout) > 0){
|
48
|
+
data->repeat = 1;
|
49
|
+
}
|
50
|
+
data->target = rb_num2long(rb_obj_id(handler));
|
51
|
+
// Initialize
|
52
|
+
uv_timer_init(handle);
|
53
|
+
handle->data = data;
|
54
|
+
// Save handle
|
55
|
+
rb_iv_set(handler, "@_handle", Data_Wrap_Struct(nodeRb_get_nodeRb_pointer(), 0, NULL, handle));
|
56
|
+
// Schedule
|
57
|
+
uv_timer_start(handle, nodeRb_timers_callback, rb_num2long(timeout), rb_num2long(repeat));
|
58
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#ifndef NODERB_TIMERS_H
|
2
|
+
#define NODERB_TIMERS_H
|
3
|
+
|
4
|
+
#ifdef __cplusplus
|
5
|
+
extern "C" {
|
6
|
+
#endif
|
7
|
+
|
8
|
+
VALUE nodeRb_timers_once(VALUE self, VALUE timeout, VALUE repeat, VALUE callback);
|
9
|
+
VALUE nodeRb_timers_stop(VALUE self);
|
10
|
+
|
11
|
+
#ifdef __cplusplus
|
12
|
+
}
|
13
|
+
#endif
|
14
|
+
|
15
|
+
#endif /* NODERB_TIMERS_H */
|
16
|
+
|
@@ -0,0 +1,127 @@
|
|
1
|
+
#include <noderb_common.h>
|
2
|
+
#include <noderb_tools.h>
|
3
|
+
#include <noderb.h>
|
4
|
+
|
5
|
+
/*
|
6
|
+
Consolidate read and write request to allow cross-functionality like proxy
|
7
|
+
*/
|
8
|
+
|
9
|
+
// Allocates memory exactly as libuv suggests, this might be one area of optimization
|
10
|
+
uv_buf_t nodeRb_read_alloc(uv_stream_t* handle, size_t suggested_size) {
|
11
|
+
uv_buf_t buf;
|
12
|
+
buf.base = (char*) malloc(suggested_size);
|
13
|
+
buf.len = suggested_size;
|
14
|
+
return buf;
|
15
|
+
}
|
16
|
+
|
17
|
+
// Called when data read from stream
|
18
|
+
void nodeRb_read(uv_stream_t* uv_handle, ssize_t nread, uv_buf_t buf) {
|
19
|
+
nodeRb_basic_handle* handle = (nodeRb_basic_handle*) uv_handle->data;
|
20
|
+
if (nread < 0) {
|
21
|
+
if (buf.base) {
|
22
|
+
free(buf.base);
|
23
|
+
}
|
24
|
+
return;
|
25
|
+
}
|
26
|
+
if (nread == 0) {
|
27
|
+
free(buf.base);
|
28
|
+
return;
|
29
|
+
}
|
30
|
+
rb_funcall(nodeRb_get_class_from_id(handle->target), rb_intern(handle->target_callback), 1, rb_str_new(buf.base, nread));
|
31
|
+
free(buf.base);
|
32
|
+
}
|
33
|
+
|
34
|
+
// Requests write to stream
|
35
|
+
void nodeRb_write(uv_stream_t* handle, char* data, size_t len){
|
36
|
+
if(handle->type != UV_TCP && handle->type != UV_NAMED_PIPE){
|
37
|
+
return;
|
38
|
+
}
|
39
|
+
write_req_t* wr = malloc(sizeof(write_req_t));
|
40
|
+
wr->buf.base = data;
|
41
|
+
wr->buf.len = len;
|
42
|
+
uv_write(&wr->req, handle, &wr->buf, 1, nodeRb_after_write);
|
43
|
+
}
|
44
|
+
|
45
|
+
// Called after data written to stream
|
46
|
+
void nodeRb_after_write(uv_write_t* req, int status) {
|
47
|
+
if (status) {
|
48
|
+
uv_err_t err = uv_last_error();
|
49
|
+
fprintf(stderr, "uv_write error: %s\n", uv_strerror(err));
|
50
|
+
}
|
51
|
+
write_req_t* wr = (write_req_t*) req;
|
52
|
+
free(wr);
|
53
|
+
}
|
54
|
+
|
55
|
+
/*
|
56
|
+
NodeRb.next_tick runs block of code on the next iteration of the loop
|
57
|
+
*/
|
58
|
+
|
59
|
+
// Indicator that we already have something to run
|
60
|
+
int nodeRbNextTickStatus = 0;
|
61
|
+
|
62
|
+
// Invoked by the loop to execute scheduled blocks in Ruby
|
63
|
+
void nodeRb_next_tick(uv_idle_t* handle, int status) {
|
64
|
+
uv_idle_stop(handle);
|
65
|
+
free(handle);
|
66
|
+
nodeRbNextTickStatus = 0;
|
67
|
+
rb_funcall(nodeRb_get_nodeRb_module(), rb_intern("next_tick_execute"), 0);
|
68
|
+
}
|
69
|
+
|
70
|
+
// Schedules invocation on the next iteration if not already scheduled
|
71
|
+
VALUE nodeRb_nextTick(VALUE self) {
|
72
|
+
if(nodeRbNextTickStatus == 0){
|
73
|
+
uv_idle_t* handle = malloc(sizeof(uv_idle_t));
|
74
|
+
uv_idle_init(handle);
|
75
|
+
nodeRbNextTickStatus = 1;
|
76
|
+
uv_idle_start(handle, nodeRb_next_tick);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
/*
|
81
|
+
Tools to simplify NodeRb development
|
82
|
+
*/
|
83
|
+
|
84
|
+
// Register object to be GC safe
|
85
|
+
VALUE nodeRb_register_instance(VALUE instance) {
|
86
|
+
rb_ary_push(rb_iv_get(nodeRb_get_nodeRb_module(), "@instances"), instance);
|
87
|
+
}
|
88
|
+
|
89
|
+
// Ruby wrapper for previous function
|
90
|
+
VALUE nodeRb_registerInstance(VALUE self, VALUE instance) {
|
91
|
+
nodeRb_register_instance(instance);
|
92
|
+
}
|
93
|
+
|
94
|
+
// Unregister object to be GC safe
|
95
|
+
VALUE nodeRb_unregister_instance(VALUE instance) {
|
96
|
+
rb_ary_delete(rb_iv_get(nodeRb_get_nodeRb_module(), "@instances"), instance);
|
97
|
+
}
|
98
|
+
|
99
|
+
// Ruby wrapper for previous function
|
100
|
+
VALUE nodeRb_unregisterInstance(VALUE self, VALUE instance) {
|
101
|
+
nodeRb_unregister_instance(instance);
|
102
|
+
}
|
103
|
+
|
104
|
+
// Transforms Ruby Object.object_id back into the Object
|
105
|
+
VALUE nodeRb_get_class_from_id(long id) {
|
106
|
+
return rb_funcall(rb_const_get(rb_cObject, rb_intern("ObjectSpace")), rb_intern("_id2ref"), 1, rb_int2inum(id));
|
107
|
+
}
|
108
|
+
|
109
|
+
// Used for handling errors inside NodeRb
|
110
|
+
int nodeRb_handle_error(int e) {
|
111
|
+
if (e) {
|
112
|
+
uv_err_t error = uv_last_error();
|
113
|
+
fprintf(stderr, "%s\n", uv_strerror(error));
|
114
|
+
return 1;
|
115
|
+
} else {
|
116
|
+
return 0;
|
117
|
+
}
|
118
|
+
};
|
119
|
+
|
120
|
+
// Starts the event loop and adds one reference to ensure loop will run
|
121
|
+
VALUE nodeRb_start(VALUE self) {
|
122
|
+
uv_ref();
|
123
|
+
if (rb_block_given_p()) {
|
124
|
+
rb_yield(Qnil);
|
125
|
+
}
|
126
|
+
uv_run();
|
127
|
+
};
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#ifndef NODERB_TOOLS_H
|
2
|
+
#define NODERB_TOOLS_H
|
3
|
+
|
4
|
+
#ifdef __cplusplus
|
5
|
+
extern "C" {
|
6
|
+
#endif
|
7
|
+
|
8
|
+
VALUE nodeRb_nextTick(VALUE self);
|
9
|
+
VALUE nodeRb_start(VALUE self);
|
10
|
+
|
11
|
+
VALUE nodeRb_register_instance(VALUE instance);
|
12
|
+
VALUE nodeRb_registerInstance(VALUE self, VALUE instance);
|
13
|
+
VALUE nodeRb_unregister_instance(VALUE instance);
|
14
|
+
VALUE nodeRb_unregisterInstance(VALUE self, VALUE instance);
|
15
|
+
|
16
|
+
VALUE nodeRb_get_class_from_id(long id);
|
17
|
+
|
18
|
+
typedef struct {
|
19
|
+
uv_write_t req;
|
20
|
+
uv_buf_t buf;
|
21
|
+
} write_req_t;
|
22
|
+
|
23
|
+
uv_buf_t nodeRb_read_alloc(uv_stream_t* handle, size_t suggested_size);
|
24
|
+
void nodeRb_read(uv_stream_t* uv_handle, ssize_t nread, uv_buf_t buf);
|
25
|
+
void nodeRb_write(uv_stream_t* handle, char* data, size_t len);
|
26
|
+
void nodeRb_after_write(uv_write_t* req, int status);
|
27
|
+
|
28
|
+
#ifdef __cplusplus
|
29
|
+
}
|
30
|
+
#endif
|
31
|
+
|
32
|
+
#endif /* NODERB_TOOLS_H */
|
33
|
+
|
data/lib/noderb/dns.rb
ADDED
data/lib/noderb/next_tick.rb
CHANGED
data/lib/noderb/tcp.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module NodeRb
|
2
|
+
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def start_server address, port, clazz
|
6
|
+
if /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.match(address)
|
7
|
+
NodeRb.start_server_native(address, port, clazz)
|
8
|
+
else
|
9
|
+
NodeRb.resolve(address) do |ip|
|
10
|
+
NodeRb.start_server_native(ip, port, clazz)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def start_client address, port, clazz
|
16
|
+
if /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.match(address)
|
17
|
+
NodeRb.start_client_native(address, port, clazz)
|
18
|
+
else
|
19
|
+
NodeRb.resolve(address) do |ip|
|
20
|
+
NodeRb.start_client_native(ip, port, clazz)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module NodeRb
|
2
|
+
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def once timeout, &block
|
6
|
+
NodeRb.once_native(timeout * 1000, 0, block)
|
7
|
+
end
|
8
|
+
|
9
|
+
def repeat repeat, handler, timeout = nil
|
10
|
+
timeout ||= repeat
|
11
|
+
NodeRb.once_native(timeout * 1000, repeat * 1000, handler)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
module Timer
|
17
|
+
|
18
|
+
def call
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/lib/noderb/version.rb
CHANGED
data/lib/noderb.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
# Native extension
|
2
2
|
require "noderb_extension"
|
3
|
-
#
|
3
|
+
# Tools
|
4
4
|
require "noderb/version"
|
5
5
|
require "noderb/next_tick"
|
6
|
+
require "noderb/timers"
|
7
|
+
# System
|
8
|
+
require "noderb/tcp"
|
9
|
+
require "noderb/dns"
|
10
|
+
# Helpers
|
6
11
|
require "noderb/connection"
|
7
12
|
require "noderb/process"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: noderb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-19 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: Port of the NodeJs library to Ruby, featuring asynchronous IO operations
|
15
15
|
of all kinds.
|
@@ -21,15 +21,18 @@ extensions:
|
|
21
21
|
extra_rdoc_files: []
|
22
22
|
files:
|
23
23
|
- lib/noderb/connection.rb
|
24
|
+
- lib/noderb/dns.rb
|
24
25
|
- lib/noderb/next_tick.rb
|
25
26
|
- lib/noderb/process.rb
|
27
|
+
- lib/noderb/tcp.rb
|
28
|
+
- lib/noderb/timers.rb
|
26
29
|
- lib/noderb/version.rb
|
27
30
|
- lib/noderb.rb
|
28
31
|
- ext/noderb_extension/extconf.rb
|
32
|
+
- ext/noderb_extension/libuv/all.gyp
|
29
33
|
- ext/noderb_extension/libuv/AUTHORS
|
30
|
-
- ext/noderb_extension/libuv/
|
31
|
-
- ext/noderb_extension/libuv/
|
32
|
-
- ext/noderb_extension/libuv/build/gyp_uv
|
34
|
+
- ext/noderb_extension/libuv/BSDmakefile
|
35
|
+
- ext/noderb_extension/libuv/common.gypi
|
33
36
|
- ext/noderb_extension/libuv/config-mingw.mk
|
34
37
|
- ext/noderb_extension/libuv/config-unix.mk
|
35
38
|
- ext/noderb_extension/libuv/create-msvs-files.bat
|
@@ -222,8 +225,8 @@ files:
|
|
222
225
|
- ext/noderb_extension/libuv/deps/pthread-win32/version.rc
|
223
226
|
- ext/noderb_extension/libuv/deps/pthread-win32/w32_CancelableWait.c
|
224
227
|
- ext/noderb_extension/libuv/deps/pthread-win32/WinCE-PORT
|
225
|
-
- ext/noderb_extension/libuv/doc/desired-api.md
|
226
228
|
- ext/noderb_extension/libuv/doc/iocp-links.html
|
229
|
+
- ext/noderb_extension/libuv/gyp_uv
|
227
230
|
- ext/noderb_extension/libuv/include/ares.h
|
228
231
|
- ext/noderb_extension/libuv/include/ares_version.h
|
229
232
|
- ext/noderb_extension/libuv/include/eio.h
|
@@ -390,6 +393,7 @@ files:
|
|
390
393
|
- ext/noderb_extension/libuv/src/win/handle.c
|
391
394
|
- ext/noderb_extension/libuv/src/win/internal.h
|
392
395
|
- ext/noderb_extension/libuv/src/win/loop-watcher.c
|
396
|
+
- ext/noderb_extension/libuv/src/win/ntdll.h
|
393
397
|
- ext/noderb_extension/libuv/src/win/pipe.c
|
394
398
|
- ext/noderb_extension/libuv/src/win/process.c
|
395
399
|
- ext/noderb_extension/libuv/src/win/req.c
|
@@ -398,6 +402,7 @@ files:
|
|
398
402
|
- ext/noderb_extension/libuv/src/win/tcp.c
|
399
403
|
- ext/noderb_extension/libuv/src/win/timer.c
|
400
404
|
- ext/noderb_extension/libuv/src/win/util.c
|
405
|
+
- ext/noderb_extension/libuv/src/win/winapi.c
|
401
406
|
- ext/noderb_extension/libuv/test/benchmark-ares.c
|
402
407
|
- ext/noderb_extension/libuv/test/benchmark-getaddrinfo.c
|
403
408
|
- ext/noderb_extension/libuv/test/benchmark-list.h
|
@@ -443,6 +448,17 @@ files:
|
|
443
448
|
- ext/noderb_extension/libuv/test/test-timer.c
|
444
449
|
- ext/noderb_extension/noderb.c
|
445
450
|
- ext/noderb_extension/noderb.h
|
451
|
+
- ext/noderb_extension/noderb_common.h
|
452
|
+
- ext/noderb_extension/noderb_dns.c
|
453
|
+
- ext/noderb_extension/noderb_dns.h
|
454
|
+
- ext/noderb_extension/noderb_process.c
|
455
|
+
- ext/noderb_extension/noderb_process.h
|
456
|
+
- ext/noderb_extension/noderb_tcp.c
|
457
|
+
- ext/noderb_extension/noderb_tcp.h
|
458
|
+
- ext/noderb_extension/noderb_timers.c
|
459
|
+
- ext/noderb_extension/noderb_timers.h
|
460
|
+
- ext/noderb_extension/noderb_tools.c
|
461
|
+
- ext/noderb_extension/noderb_tools.h
|
446
462
|
- LICENSE
|
447
463
|
- README.md
|
448
464
|
homepage: http://github.com/marekjelen/noderb
|
@@ -465,7 +481,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
465
481
|
version: 1.3.6
|
466
482
|
requirements: []
|
467
483
|
rubyforge_project: noderb
|
468
|
-
rubygems_version: 1.8.
|
484
|
+
rubygems_version: 1.8.8
|
469
485
|
signing_key:
|
470
486
|
specification_version: 3
|
471
487
|
summary: Port of the NodeJs library to Ruby
|