jstp 0.5.7 → 1.0.2
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 +26 -3
- data/jstp.gemspec +2 -1
- data/lib/jstp.rb +23 -11
- data/lib/jstp/configuration.rb +68 -0
- data/lib/jstp/controller.rb +49 -11
- data/lib/jstp/dispatch.rb +106 -0
- data/lib/jstp/engine.rb +77 -13
- data/lib/jstp/version.rb +1 -1
- data/lib/reader/jstp/dispatch.rb +36 -0
- data/lib/reader/jstp/engine.rb +66 -0
- data/lib/writer/jstp/dispatch.rb +95 -0
- data/samples/api-1.5/modular_style.rb +22 -0
- data/samples/api-1.5/references.rb +12 -0
- data/samples/api-1.5/sinatra_style.rb +18 -0
- data/samples/api-2.0/a_la_rack.rb +22 -0
- data/samples/api-2.0/clearer_sample.rb +12 -0
- data/samples/api-2.0/middleware.rb +23 -0
- data/samples/api-2.0/references.rb +11 -0
- data/samples/diff.rb +12 -0
- data/samples/hooks.rb +9 -0
- data/samples/micro.rb +6 -0
- data/samples/new_api.rb +62 -0
- data/samples/websocket.rb +11 -0
- data/spec/jstp/engine_spec.rb +39 -0
- data/spec/spec_helper.rb +0 -1
- metadata +40 -32
- data/features/map_a_la_rest.feature +0 -148
- data/features/step_definitions/map_a_la_rest_steps.rb +0 -19
- data/features/support/env.rb +0 -11
- data/lib/jstp/api.rb +0 -25
- data/lib/jstp/base.rb +0 -7
- data/lib/jstp/connector.rb +0 -17
- data/lib/jstp/tcp.rb +0 -12
- data/lib/jstp/web_socket.rb +0 -45
- data/lib/reader/jstp/connector.rb +0 -31
- data/lib/writer/jstp/connector.rb +0 -46
- data/spec/jstp/api_spec.rb +0 -79
- data/spec/jstp/base_spec.rb +0 -5
- data/spec/jstp/connector_spec.rb +0 -16
- data/spec/jstp/tcp_spec.rb +0 -7
- data/spec/jstp/web_socket_spec.rb +0 -78
- data/spec/reader/jstp/connector_spec.rb +0 -32
- data/spec/writer/jstp/connector_spec.rb +0 -71
@@ -1,31 +0,0 @@
|
|
1
|
-
module Reader
|
2
|
-
module JSTP
|
3
|
-
class Connector
|
4
|
-
attr_accessor :source
|
5
|
-
|
6
|
-
def initialize the_source
|
7
|
-
@source = the_source
|
8
|
-
end
|
9
|
-
|
10
|
-
# Start the server with the websocket strategy
|
11
|
-
def websocket
|
12
|
-
::EventMachine.run &::JSTP::WebSocket.instance.event_machine
|
13
|
-
end
|
14
|
-
|
15
|
-
# Start the server with the TCP strategy
|
16
|
-
def tcp
|
17
|
-
@server = TCPServer.open @source.port.inbound
|
18
|
-
loop {
|
19
|
-
Thread.start(@server.accept) { |client|
|
20
|
-
begin
|
21
|
-
::JSTP::Engine.instance.dispatch JSON.parse client.gets
|
22
|
-
rescue Exception => e
|
23
|
-
puts "\e[31m#{e.message}\e[0m"
|
24
|
-
puts e.backtrace
|
25
|
-
end
|
26
|
-
}
|
27
|
-
}
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module Writer
|
2
|
-
module JSTP
|
3
|
-
class Connector
|
4
|
-
attr_accessor :source
|
5
|
-
|
6
|
-
def initialize source
|
7
|
-
@source = source
|
8
|
-
end
|
9
|
-
|
10
|
-
# Dispatch this applying the websocket strategy
|
11
|
-
def websocket message
|
12
|
-
begin
|
13
|
-
this_client = ::JSTP::WebSocket.instance
|
14
|
-
.client message["resource"]
|
15
|
-
json = message.to_json
|
16
|
-
this_client.callback do
|
17
|
-
this_client.send_msg json
|
18
|
-
this_client.close_connection_after_writing
|
19
|
-
end
|
20
|
-
rescue RuntimeError => e
|
21
|
-
EM.run {
|
22
|
-
this_client = ::JSTP::WebSocket.instance
|
23
|
-
.client message["resource"]
|
24
|
-
json = message.to_json
|
25
|
-
|
26
|
-
this_client.callback do
|
27
|
-
this_client.send_msg json
|
28
|
-
this_client.close_connection_after_writing
|
29
|
-
end
|
30
|
-
|
31
|
-
this_client.disconnect do
|
32
|
-
EM::stop_event_loop
|
33
|
-
end
|
34
|
-
}
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
# Dispatch thid applying the TCP strategy
|
39
|
-
def tcp message
|
40
|
-
client = TCPSocket.open message["resource"].first, @source.port.outbound
|
41
|
-
client.puts message.to_json
|
42
|
-
client.close
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
data/spec/jstp/api_spec.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe JSTP::API do
|
5
|
-
describe '#strategy' do
|
6
|
-
it 'should set the strategy' do
|
7
|
-
o = Object.new
|
8
|
-
o.extend JSTP::API
|
9
|
-
|
10
|
-
o.strategy inbound: :websocket, outbound: :tcp
|
11
|
-
|
12
|
-
JSTP::Connector.instance.strategy.inbound.should == :websocket
|
13
|
-
JSTP::Connector.instance.strategy.outbound.should == :tcp
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe '#dispatch' do
|
18
|
-
before do
|
19
|
-
JSTP::Connector.instance.strategy = SymbolMatrix inbound: :tcp, outbound: :websocket
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'a block is passed' do
|
23
|
-
it 'should register the block and send JSTP::Server to the EventMachine reactor' do
|
24
|
-
block = proc { "lalal" }
|
25
|
-
reader = stub 'reader'
|
26
|
-
|
27
|
-
JSTP::Connector.instance.should_receive(:block=)
|
28
|
-
.with block
|
29
|
-
|
30
|
-
JSTP::Connector.instance.should_receive(:from)
|
31
|
-
.and_return reader
|
32
|
-
reader.should_receive :tcp
|
33
|
-
|
34
|
-
o = Object.new
|
35
|
-
o.extend JSTP::API
|
36
|
-
o.dispatch &block
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
context 'an argument is passed' do
|
41
|
-
it 'should dispatch the message via the Connector' do
|
42
|
-
message = stub 'message'
|
43
|
-
writer = stub 'writer'
|
44
|
-
|
45
|
-
JSTP::Connector.instance.should_receive(:to)
|
46
|
-
.and_return writer
|
47
|
-
|
48
|
-
writer.should_receive(:websocket)
|
49
|
-
.with message
|
50
|
-
|
51
|
-
o = Object.new
|
52
|
-
o.extend JSTP::API
|
53
|
-
o.dispatch message
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'no argument, no block' do
|
58
|
-
it 'should return the JSTP::Connector.instance' do
|
59
|
-
o = Object.new
|
60
|
-
o.extend JSTP::API
|
61
|
-
o.dispatch.should == JSTP::Connector.instance
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe '#port' do
|
67
|
-
it 'should configure the port number' do
|
68
|
-
message = {
|
69
|
-
"resource" => ["localhost"]
|
70
|
-
}
|
71
|
-
o = Object.new
|
72
|
-
o.extend JSTP::API
|
73
|
-
o.port inbound: 3000, outbound: 4000
|
74
|
-
|
75
|
-
JSTP::Connector.instance.port.inbound.should == 3000
|
76
|
-
JSTP::Connector.instance.port.outbound.should == 4000
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
data/spec/jstp/base_spec.rb
DELETED
data/spec/jstp/connector_spec.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe JSTP::Connector do
|
5
|
-
it 'should be a singleton' do
|
6
|
-
JSTP::Connector.ancestors.should include Singleton
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should include a discoverer for Writer' do
|
10
|
-
JSTP::Connector.ancestors.should include Discoverer::Writer
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'should include a discoverer for Reader' do
|
14
|
-
JSTP::Connector.ancestors.should include Discoverer::Reader
|
15
|
-
end
|
16
|
-
end
|
data/spec/jstp/tcp_spec.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe JSTP::WebSocket do
|
4
|
-
it 'should be a singleton' do
|
5
|
-
JSTP::WebSocket.ancestors.should include Singleton
|
6
|
-
end
|
7
|
-
|
8
|
-
describe '#event_machine' do
|
9
|
-
before do
|
10
|
-
JSTP::Connector.instance.port = SymbolMatrix inbound: 33333, outbound: 44444
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'should start a websocket server in 33333' do
|
14
|
-
JSTP::WebSocket.instance.server_setup
|
15
|
-
.should_receive :call
|
16
|
-
|
17
|
-
EventMachine::WebSocket.should_receive(:start)
|
18
|
-
.with({ host: '0.0.0.0', port: JSTP::Connector.instance.port.inbound },
|
19
|
-
&JSTP::WebSocket.instance.server_setup)
|
20
|
-
|
21
|
-
JSTP::WebSocket.instance.event_machine.call
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe '#server_setup' do
|
26
|
-
it 'should set #event_on_message to onmessage' do
|
27
|
-
pending 'Outdated example'
|
28
|
-
|
29
|
-
server = stub 'server'
|
30
|
-
JSTP::WebSocket.instance.event_on_message.should_receive :call
|
31
|
-
|
32
|
-
server.should_receive(:onmessage)
|
33
|
-
.with &JSTP::WebSocket.instance.event_on_message
|
34
|
-
|
35
|
-
JSTP::WebSocket.instance.server_setup.call server
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe '#event_on_message' do
|
40
|
-
it 'should call the registered block with the parsed message' do
|
41
|
-
pending 'Outdated example'
|
42
|
-
|
43
|
-
@the_proc = stub 'the proc'
|
44
|
-
@message = stub 'message'
|
45
|
-
@parsed_message = stub 'parsed message'
|
46
|
-
|
47
|
-
JSON.should_receive(:parse).with(@message)
|
48
|
-
.and_return @parsed_message
|
49
|
-
|
50
|
-
JSTP::Connector.instance.should_receive(:block)
|
51
|
-
.and_return @the_proc
|
52
|
-
|
53
|
-
@the_proc.should_receive(:call)
|
54
|
-
.with @parsed_message
|
55
|
-
|
56
|
-
JSTP::WebSocket.instance.event_on_message.call @message
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe '#client' do
|
61
|
-
context 'there is no connection for that address' do
|
62
|
-
before do
|
63
|
-
@web_socket_client = stub 'web socket client'
|
64
|
-
@resource = ["localhost", "hola", "quetal"]
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'should initialize the websocket client' do
|
68
|
-
EventMachine::WebSocketClient.should_receive(:connect)
|
69
|
-
.with("ws://#{@resource.first}:#{JSTP::Connector.instance.port.outbound}/#{@resource[1..-1].join('/')}")
|
70
|
-
.and_return @web_socket_client
|
71
|
-
|
72
|
-
JSTP::WebSocket.instance
|
73
|
-
.client(@resource)
|
74
|
-
.should == @web_socket_client
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Reader::JSTP::Connector do
|
4
|
-
describe '#websocket' do
|
5
|
-
it 'should run EventMachine with the JSTP::EventMachine proc' do
|
6
|
-
JSTP::WebSocket.instance.event_machine.should_receive :call
|
7
|
-
|
8
|
-
EventMachine.should_receive(:run)
|
9
|
-
.with &JSTP::WebSocket.instance.event_machine
|
10
|
-
|
11
|
-
reader = Reader::JSTP::Connector.new stub 'connector'
|
12
|
-
reader.websocket
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe '#tcp' do
|
17
|
-
it 'should create the server and start it' do
|
18
|
-
pending 'I still can test infinite loops'
|
19
|
-
|
20
|
-
tcp_server = stub 'tcp server'
|
21
|
-
|
22
|
-
TCPServer.should_receive(:open)
|
23
|
-
.with(JSTP::Connector.instance.port.inbound)
|
24
|
-
.and_return tcp_server
|
25
|
-
|
26
|
-
tcp_server.should_receive(:accept)
|
27
|
-
|
28
|
-
reader = Reader::JSTP::Connector.new stub 'connector'
|
29
|
-
reader.tcp
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Writer::JSTP::Connector do
|
4
|
-
describe '#websocket' do
|
5
|
-
before do
|
6
|
-
@connector = stub 'connector'
|
7
|
-
@message = { "resource" => ["lala"] }
|
8
|
-
@message_json = stub 'message_json'
|
9
|
-
@web_socket_client = stub 'web socket client'
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'should get the client from the pool and set the callback' do
|
13
|
-
@writer = Writer::JSTP::Connector.new @connector
|
14
|
-
|
15
|
-
JSTP::WebSocket.instance.should_receive(:client)
|
16
|
-
.with(@message["resource"])
|
17
|
-
.and_return @web_socket_client
|
18
|
-
|
19
|
-
@web_socket_client.should_receive(:callback)
|
20
|
-
|
21
|
-
@message.should_receive(:to_json).and_return @message_json
|
22
|
-
|
23
|
-
@writer.websocket @message
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should send the message from the callback' do
|
27
|
-
pending "I'm unable to test this properly since providing a Proc will make me lose scope for the client"
|
28
|
-
@writer = Writer::JSTP::Connector.new @connector
|
29
|
-
|
30
|
-
JSTP::WebSocket.should_receive(:client)
|
31
|
-
.with(@message["resource"])
|
32
|
-
.and_return @web_socket_client
|
33
|
-
|
34
|
-
@web_socket_client.should_receive(:callback)
|
35
|
-
|
36
|
-
@message.should_receive(:to_json).and_return @message_json
|
37
|
-
@web_socket_client.should_receive(:send_msg)
|
38
|
-
.with(@message_json)
|
39
|
-
|
40
|
-
@writer.websocket @message
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe '#tcp' do
|
45
|
-
it 'should get the resource and use it as host, then send the dispatch in JSON' do
|
46
|
-
message = stub 'message'
|
47
|
-
message_json = stub 'message json'
|
48
|
-
resource = stub 'resource'
|
49
|
-
hostname = stub 'hostname'
|
50
|
-
socket = stub 'socket'
|
51
|
-
|
52
|
-
message.should_receive(:[]).with("resource")
|
53
|
-
.and_return resource
|
54
|
-
|
55
|
-
resource.should_receive(:first).and_return hostname
|
56
|
-
|
57
|
-
JSTP::Connector.instance.port = SymbolMatrix inbound: 4444, outbound: 3333
|
58
|
-
|
59
|
-
TCPSocket.should_receive(:open).with(hostname, JSTP::Connector.instance.port.outbound)
|
60
|
-
.and_return socket
|
61
|
-
|
62
|
-
message.should_receive(:to_json).and_return message_json
|
63
|
-
|
64
|
-
socket.should_receive(:puts).with message_json
|
65
|
-
socket.should_receive(:close)
|
66
|
-
|
67
|
-
writer = Writer::JSTP::Connector.new ::JSTP::Connector.instance
|
68
|
-
writer.tcp message
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|