space_elevator 0.1.0
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 +7 -0
- data/.gitignore +11 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.md +74 -0
- data/Rakefile +10 -0
- data/lib/space_elevator.rb +84 -0
- data/lib/space_elevator/version.rb +3 -0
- data/space_elevator.gemspec +28 -0
- metadata +112 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d5c508252df0ffc2f5f92b49f94034b9e869ea59
|
4
|
+
data.tar.gz: f8c316961a39b24f63c9608326336888a117a9be
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: '069f5e2925bd28ec63d1eef3b3ff926374ccfaeee6e74523f60e825c8ebc39a10718bc9e1977a12b3dbe0d2d37962e74b9a6a394e7e228713f5bf519d0fced51'
|
7
|
+
data.tar.gz: 1906914eafafe526dbc65acfea27cf004feede44429dd4a65fd836336ed1208d07501161421027d2a445de0c5d028750f8ebc32013cfe115f01a2fd6290bb00b
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# space_elevator - The ActionCable Client for Ruby
|
2
|
+
|
3
|
+
space_elevator is a _client_ for integrating a ruby application with a remote ActionCable-based backend provided by Rails 5 or compatible framework. It allows for subscription and publication to multiple _channels_ simultaneously, and eavesdropping on wire-level messages. Harness the power of WebSockets to receive push notifications in your own Ruby applications!
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'space_elevator'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install space_elevator
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
require 'space_elevator'
|
25
|
+
require 'eventmachine'
|
26
|
+
require 'em-websocket-client'
|
27
|
+
|
28
|
+
EventMachine.run do
|
29
|
+
|
30
|
+
url = 'ws://example.com'
|
31
|
+
|
32
|
+
# Create a SpaceElevator::Client with a disconnect handler.
|
33
|
+
client = SpaceElevator::Client.new(url) do
|
34
|
+
puts 'Disconnected. Exiting...'
|
35
|
+
EventMachine.stop_event_loop
|
36
|
+
end
|
37
|
+
|
38
|
+
# Connect the client using the provided callback block.
|
39
|
+
client.connect do |msg|
|
40
|
+
case msg['type'] # The server will always set a 'type'.
|
41
|
+
when 'welcome' # Sent after a successful connection.
|
42
|
+
puts 'The server says "welcome".'
|
43
|
+
|
44
|
+
# Subscribe to something..
|
45
|
+
client.subscribe(channel: 'ChatChannel') do |chat|
|
46
|
+
puts "Received Chat Event: #{chat}"
|
47
|
+
if chat['type'] == 'confirm_subscription'
|
48
|
+
puts "Subscription to #{chat['identifier']['channel']} confirmed!"
|
49
|
+
# Broadcast to the channel!
|
50
|
+
client.publish('ChatChannel', {subject: 'Hi', text: "What's up, y'all!?!?"})
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Subscribe to something else simultaneously. Note the additional parameters!
|
55
|
+
client.subscribe(channel: 'PlatformChannel', platform_id: platform_id) do |m|
|
56
|
+
puts "Received Platform #{platform_id} Event: #{m}"
|
57
|
+
# Do whatever, here.
|
58
|
+
end
|
59
|
+
when 'ping'
|
60
|
+
puts 'The server just pinged us.'
|
61
|
+
else
|
62
|
+
puts msg
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
## Contributing
|
69
|
+
|
70
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/preston/space_elevator. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
71
|
+
|
72
|
+
## License
|
73
|
+
|
74
|
+
This work is published under the Apache 2.0 license. Copyright (c) 2017 Preston Lee.
|
data/Rakefile
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'space_elevator/version'
|
2
|
+
|
3
|
+
module SpaceElevator
|
4
|
+
# Super-light utility for integrating with ActionCable-based backends.
|
5
|
+
class Client
|
6
|
+
attr_accessor :client
|
7
|
+
attr_accessor :connected
|
8
|
+
attr_accessor :connection_handler
|
9
|
+
attr_accessor :channel_handlers
|
10
|
+
attr_accessor :disconnect_handler
|
11
|
+
attr_accessor :url
|
12
|
+
|
13
|
+
def initialize(url, &disconnect_handler)
|
14
|
+
self.url = url
|
15
|
+
self.disconnect_handler = disconnect_handler
|
16
|
+
end
|
17
|
+
|
18
|
+
def connect(&block)
|
19
|
+
self.connection_handler = block
|
20
|
+
self.channel_handlers = {}
|
21
|
+
self.client = EventMachine::WebSocketClient.connect(url)
|
22
|
+
client.callback do
|
23
|
+
puts "Connected WebSocket to #{url}."
|
24
|
+
self.connected = true
|
25
|
+
end
|
26
|
+
client.stream do |raw|
|
27
|
+
message = parse_message(raw.to_s)
|
28
|
+
if message['identifier'] && message['identifier']['channel']
|
29
|
+
channel_handlers[message['identifier']['channel']].call(message)
|
30
|
+
else
|
31
|
+
connection_handler.call(message)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
client.disconnect do
|
35
|
+
self.connected = false
|
36
|
+
disconnect_handler.call
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def subscribe(identifier, &block)
|
41
|
+
push(create_subscribe_message(identifier))
|
42
|
+
channel_handlers[identifier[:channel]] = block
|
43
|
+
end
|
44
|
+
|
45
|
+
def push(msg)
|
46
|
+
client.send_msg(msg)
|
47
|
+
end
|
48
|
+
|
49
|
+
def publish(channel, data)
|
50
|
+
msg = create_publish_message(channel, data)
|
51
|
+
# puts "PUSHING: #{msg}"
|
52
|
+
push(msg)
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_publish_message(channel, data)
|
56
|
+
message = {
|
57
|
+
command: 'message',
|
58
|
+
identifier: { channel: channel }
|
59
|
+
}
|
60
|
+
message[:data] = data.to_json if data
|
61
|
+
message[:identifier] = message[:identifier].to_json
|
62
|
+
message.to_json
|
63
|
+
end
|
64
|
+
|
65
|
+
def create_subscribe_message(identifier)
|
66
|
+
message = {
|
67
|
+
command: 'subscribe',
|
68
|
+
identifier: identifier.to_json
|
69
|
+
}
|
70
|
+
# message[:identifier].merge!(data) if data
|
71
|
+
# message[:data] = data.to_json if data
|
72
|
+
# message[:identifier] = message[:identifier].to_json
|
73
|
+
# puts message
|
74
|
+
message.to_json
|
75
|
+
end
|
76
|
+
|
77
|
+
def parse_message(message)
|
78
|
+
result = JSON.parse(message)
|
79
|
+
result['identifier'] = JSON.parse(result['identifier']) if result['identifier']
|
80
|
+
result['data'] = JSON.parse(result['data']) if result['data']
|
81
|
+
result
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'space_elevator/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "space_elevator"
|
8
|
+
spec.version = SpaceElevator::VERSION
|
9
|
+
spec.authors = ["Preston Lee"]
|
10
|
+
spec.email = ["preston.lee@prestonlee.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Ruby client for integrating a ruby application with a remote ActionCable-based backend provided by Rails 5 or compatible framework.}
|
13
|
+
spec.description = %q{Ruby client for integrating a ruby application with a remote ActionCable-based backend provided by Rails 5 or compatible framework. It allows for subscription and publication to multiple _channels_ simultaneously, and eavesdropping on wire-level messages. Harness the power of WebSockets to receive push notifications in your own Ruby applications!}
|
14
|
+
spec.homepage = "https://github.com/preston/space_elevator"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
|
+
f.match(%r{^(test|spec|features)/})
|
18
|
+
end
|
19
|
+
spec.bindir = "exe"
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_dependency "eventmachine", ">= 1.2.3"
|
24
|
+
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
26
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
27
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: space_elevator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Preston Lee
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: eventmachine
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.2.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.2.3
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.14'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.14'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.0'
|
69
|
+
description: Ruby client for integrating a ruby application with a remote ActionCable-based
|
70
|
+
backend provided by Rails 5 or compatible framework. It allows for subscription
|
71
|
+
and publication to multiple _channels_ simultaneously, and eavesdropping on wire-level
|
72
|
+
messages. Harness the power of WebSockets to receive push notifications in your
|
73
|
+
own Ruby applications!
|
74
|
+
email:
|
75
|
+
- preston.lee@prestonlee.com
|
76
|
+
executables: []
|
77
|
+
extensions: []
|
78
|
+
extra_rdoc_files: []
|
79
|
+
files:
|
80
|
+
- ".gitignore"
|
81
|
+
- ".travis.yml"
|
82
|
+
- Gemfile
|
83
|
+
- README.md
|
84
|
+
- Rakefile
|
85
|
+
- lib/space_elevator.rb
|
86
|
+
- lib/space_elevator/version.rb
|
87
|
+
- space_elevator.gemspec
|
88
|
+
homepage: https://github.com/preston/space_elevator
|
89
|
+
licenses: []
|
90
|
+
metadata: {}
|
91
|
+
post_install_message:
|
92
|
+
rdoc_options: []
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
requirements: []
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.6.8
|
108
|
+
signing_key:
|
109
|
+
specification_version: 4
|
110
|
+
summary: Ruby client for integrating a ruby application with a remote ActionCable-based
|
111
|
+
backend provided by Rails 5 or compatible framework.
|
112
|
+
test_files: []
|