noderb 0.0.3 → 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.
- 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
|