socketclusterclient 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ require 'socketclusterclient/version'
2
+
3
+ require_relative './sc_client'
4
+
5
+ #
6
+ # Module SocketclusterClient provides an interface for Socketcluster Client
7
+ #
8
+ # @author Maanav Shah <shahmaanav07@gmail.com>
9
+ #
10
+ module Socketclusterclient
11
+ end
@@ -0,0 +1,120 @@
1
+ require 'ostruct'
2
+
3
+ # Module DataModels provides JSON format based serialized and deserialized
4
+ # objects that ensures tight coupling
5
+ # @author Piyush Wani <piyushwww13@gmail.com>
6
+ #
7
+ module DataModels
8
+ # Returns a data model for an acknowledgment event
9
+ #
10
+ # @param [String] error An acknowledgment event
11
+ # @param [String] data A data object
12
+ # @param [Integer] cid A remote counter id
13
+ #
14
+ # @return An acknowledgement object
15
+ #
16
+ def get_ack_object(error, data, cid)
17
+ OpenStruct.new(
18
+ cid: cid,
19
+ data: data,
20
+ error: error
21
+ ).to_h
22
+ end
23
+
24
+ # Returns a data model for an emitter event
25
+ #
26
+ # @param [String] event An emit event
27
+ # @param [Hash] object A data object
28
+ #
29
+ # @return An emit object
30
+ #
31
+ def get_emit_object(event, object)
32
+ OpenStruct.new(
33
+ event: event,
34
+ data: object
35
+ ).to_h
36
+ end
37
+
38
+ # Returns a data model for an emitter acknowledgment event
39
+ #
40
+ # @param [String] event An emitter acknowledgment event
41
+ # @param [Hash] object A data object
42
+ # @param [Integer] counter A counter for a particular event
43
+ #
44
+ # @return An emitter acknowledgment object
45
+ #
46
+ def get_emit_ack_object(event, object, counter)
47
+ OpenStruct.new(
48
+ event: event,
49
+ data: object,
50
+ c_id: counter
51
+ ).to_h
52
+ end
53
+
54
+ # Returns a data model for a handshake event
55
+ #
56
+ # @param [Integer] counter A counter for a particular event
57
+ #
58
+ # @return A handshake object
59
+ #
60
+ def get_handshake_object(counter)
61
+ OpenStruct.new(
62
+ cid: counter,
63
+ data: OpenStruct.new(
64
+ authToken: @auth_token
65
+ ).to_h,
66
+ event: '#handshake'
67
+ ).to_h
68
+ end
69
+
70
+ # Returns a data model for publish and publish with acknowledgment event
71
+ #
72
+ # @param [String] channel A channel for publishing data
73
+ # @param [String] data A data object
74
+ # @param [Integer] counter A counter for a particular event
75
+ #
76
+ # @return A publish object
77
+ #
78
+ def get_publish_object(channel, data, counter)
79
+ OpenStruct.new(
80
+ cid: counter,
81
+ data: OpenStruct.new(
82
+ channel: channel,
83
+ data: data
84
+ ).to_h,
85
+ event: '#publish'
86
+ ).to_h
87
+ end
88
+
89
+ # Returns a data model for subscribe and subscribe with acknowledgment event
90
+ #
91
+ # @param [String] channel A channel to subscribe
92
+ # @param [Integer] counter A counter for a particular event
93
+ #
94
+ # @return A subscribe object
95
+ #
96
+ def get_subscribe_object(channel, counter)
97
+ OpenStruct.new(
98
+ event: '#subscribe',
99
+ data: OpenStruct.new(
100
+ channel: channel
101
+ ).to_h,
102
+ cid: counter
103
+ ).to_h
104
+ end
105
+
106
+ # Returns a data model for unsubscribe and unsubscribe with acknowledgment event
107
+ #
108
+ # @param [String] channel A channel to unsubscribe
109
+ # @param [Integer] counter A counter for a particular event
110
+ #
111
+ # @return An unsubscribe object
112
+ #
113
+ def get_unsubscribe_object(channel, counter)
114
+ OpenStruct.new(
115
+ event: '#unsubscribe',
116
+ data: channel,
117
+ cid: counter
118
+ ).to_h
119
+ end
120
+ end
@@ -0,0 +1,91 @@
1
+ #
2
+ # Module Emitter provides interface to execute events and acknowledgments
3
+ #
4
+ # @author Maanav Shah <shahmaanav07@gmail.com>
5
+ #
6
+ module Emitter
7
+ #
8
+ # Initiarizes events and acks in emitter
9
+ #
10
+ #
11
+ #
12
+ #
13
+ def initialize_emitter
14
+ @events = {}
15
+ @events_ack = {}
16
+ end
17
+
18
+ #
19
+ # Adds a handler for a particular event
20
+ #
21
+ # @param [String] key An index to insert handler in events
22
+ # @param [Lambda] function A block to execute on event
23
+ #
24
+ #
25
+ #
26
+ def on(key, function)
27
+ @events[key] = function
28
+ end
29
+
30
+ #
31
+ # Adds a handler for a particular channel event
32
+ #
33
+ # @param [String] key An index to insert handler in events
34
+ # @param [Lambda] function A block to execute on event
35
+ #
36
+ #
37
+ #
38
+ def onchannel(key, function)
39
+ @events[key] = function
40
+ end
41
+
42
+ #
43
+ # Adds an acknowledgment handler for a particular event
44
+ #
45
+ # @param [String] key An index to insert handler in acknowledgment
46
+ # @param [Lambda] function An acknowledgment block to execute on event
47
+ #
48
+ #
49
+ #
50
+ def onack(key, function)
51
+ @events_ack[key] = function
52
+ end
53
+
54
+ #
55
+ # Executes a handler for a particular event
56
+ #
57
+ # @param [String] key An index to insert handler in events
58
+ # @param [Hash] object Data received from ScServer
59
+ #
60
+ #
61
+ #
62
+ def execute(key, object)
63
+ function = @events[key] if @events.key?(key)
64
+ function.call(key, object) if function
65
+ end
66
+
67
+ #
68
+ # Checks acknowledgment for an event
69
+ #
70
+ # @param [String] key An index to retrieve handler from events
71
+ #
72
+ #
73
+ #
74
+ def haseventack(key)
75
+ @events_ack[key]
76
+ end
77
+
78
+ #
79
+ # Executes a handler and an acknowledgment for a particular event
80
+ #
81
+ # @param [String] key An index to retrieve handler from events
82
+ # @param [Hash] object Data received from ScServer
83
+ # @param [Lambda] ack A block to execute as acknowledgment
84
+ #
85
+ #
86
+ #
87
+ def executeack(key, object, ack)
88
+ function = @events_ack[key] if @events_ack.key?(key)
89
+ function.call(key, object, ack) if function
90
+ end
91
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # Module Logger provides an interface to log events
3
+ #
4
+ # @author Maanav Shah <shahmaanav07@gmail.com>
5
+ #
6
+ module Log
7
+ #
8
+ # Initializes logger instance and sets logger level
9
+ #
10
+ #
11
+ #
12
+ #
13
+ def initialize_logger
14
+ @logger = Logger.new(STDOUT)
15
+ end
16
+
17
+ #
18
+ # Method to get the logger instance
19
+ #
20
+ #
21
+ # @return [Logger] An instance of logger
22
+ #
23
+ def logger
24
+ initialize_logger unless @logger
25
+ @logger
26
+ end
27
+
28
+ #
29
+ # Method to disable logging
30
+ #
31
+ #
32
+ #
33
+ #
34
+ def disable_logging
35
+ @logger = nil
36
+ end
37
+
38
+ #
39
+ # Method to enable logging
40
+ #
41
+ #
42
+ #
43
+ #
44
+ def enable_logging
45
+ initialize_logger
46
+ end
47
+ end
@@ -0,0 +1,39 @@
1
+ #
2
+ # Module Parser returns the event to be executed
3
+ #
4
+ # @author Maanav Shah <shahmaanav07@gmail.com>
5
+ #
6
+ module Parser
7
+ CHECK_AUTHENTICATION = 1
8
+ PUBLISH = 2
9
+ REMOVE_AUTHENTICATION = 3
10
+ SET_AUTHENTICATION = 4
11
+ EVENT = 5
12
+ ACKNOWLEDGEMENT = 6
13
+
14
+ #
15
+ # Provides a handler for a particular event
16
+ #
17
+ # @param [String] event An event to execute
18
+ # @param [Integer] rid An id received from ScServer
19
+ #
20
+ # @return [Enum] Result of parsing event and rid
21
+ #
22
+ def self.parse(event, rid)
23
+ if event.to_s != ''
24
+ if event == '#publish'
25
+ PUBLISH
26
+ elsif event == '#removeAuthToken'
27
+ REMOVE_AUTHENTICATION
28
+ elsif event == '#setAuthToken'
29
+ SET_AUTHENTICATION
30
+ else
31
+ EVENT
32
+ end
33
+ elsif rid == 1
34
+ CHECK_AUTHENTICATION
35
+ else
36
+ ACKNOWLEDGEMENT
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # Module Reconnect provides Reconnection Support
3
+ #
4
+ # @author Piyush Wani <piyushwww13@gmail.com>
5
+ #
6
+ module Reconnect
7
+ #
8
+ # Initializes Reconnection related entities
9
+ #
10
+ #
11
+ #
12
+ #
13
+ def initialize_reconnect
14
+ @reconnect_interval = 2000
15
+ @max_reconnect_interval = 30_000
16
+ @max_attempts = nil # unlimited reconnection attempt
17
+ @attempts_made = 0
18
+ end
19
+
20
+ #
21
+ # Adds a handler for Reconnection
22
+ #
23
+ # @param [Integer] reconnect_interval A interval for reconnection attempt( in milliseconds )
24
+ # @param [Integer] max_reconnect_interval A max Limit for reconnection interval (in milliseconds)
25
+ # @param [Integer] max_attempts A max number of Reconnection Attempts allowed
26
+ #
27
+ #
28
+ #
29
+ def set_reconnection_listener(reconnect_interval, max_reconnect_interval, max_attempts = @max_attempts)
30
+ @reconnect_interval = reconnect_interval > max_reconnect_interval ? max_reconnect_interval : reconnect_interval
31
+ @max_reconnect_interval = max_reconnect_interval
32
+ @max_attempts = max_attempts
33
+ @attempts_made = 0
34
+ end
35
+
36
+ private
37
+
38
+ #
39
+ # Check for reconnection to server
40
+ #
41
+ #
42
+ # @return [Boolean] Allow reconnection
43
+ #
44
+ def should_reconnect
45
+ @enable_reconnection && (@max_attempts.nil? || (@attempts_made < @max_attempts))
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ module Socketclusterclient
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,32 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'socketclusterclient/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'socketclusterclient'
7
+ spec.version = Socketclusterclient::VERSION
8
+ spec.authors = ['Maanav Shah', 'Piyush Wani', 'Sachin Shinde']
9
+ spec.email = %w[shahmaanav07@gmail.com piyushwww13@gmail.com sachinshinde7676@gmail.com]
10
+
11
+ spec.platform = Gem::Platform::RUBY
12
+ spec.licenses = ['MIT']
13
+
14
+ spec.summary = 'Ruby client for socketcluster'
15
+ spec.description = 'A socketcluster client designed in ruby'
16
+ spec.homepage = 'https://socketcluster.io/'
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^(test|spec|features)/})
20
+ end
21
+ spec.bindir = 'exe'
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.required_ruby_version = '>= 2.2.0'
26
+
27
+ spec.add_development_dependency('bundler', '~> 1.16')
28
+ spec.add_development_dependency('rake', '~> 10.0')
29
+ spec.add_development_dependency('rspec', '~> 3.0')
30
+ spec.add_development_dependency('simplecov', '~> 0.16')
31
+ spec.add_dependency('websocket-eventmachine-client', '~> 1.2')
32
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: socketclusterclient
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Maanav Shah
8
+ - Piyush Wani
9
+ - Sachin Shinde
10
+ autorequire:
11
+ bindir: exe
12
+ cert_chain: []
13
+ date: 2018-07-29 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: bundler
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.16'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '1.16'
29
+ - !ruby/object:Gem::Dependency
30
+ name: rake
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '10.0'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '10.0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: rspec
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '3.0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '3.0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: simplecov
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0.16'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '0.16'
71
+ - !ruby/object:Gem::Dependency
72
+ name: websocket-eventmachine-client
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.2'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '1.2'
85
+ description: A socketcluster client designed in ruby
86
+ email:
87
+ - shahmaanav07@gmail.com
88
+ - piyushwww13@gmail.com
89
+ - sachinshinde7676@gmail.com
90
+ executables: []
91
+ extensions: []
92
+ extra_rdoc_files: []
93
+ files:
94
+ - ".gitignore"
95
+ - ".rspec"
96
+ - ".simplecov"
97
+ - ".travis.yml"
98
+ - CHANGELOG.md
99
+ - Gemfile
100
+ - Gemfile.lock
101
+ - LICENSE
102
+ - README.md
103
+ - Rakefile
104
+ - bin/console
105
+ - bin/setup
106
+ - examples/authentication.rb
107
+ - examples/channel.rb
108
+ - examples/emitter.rb
109
+ - examples/receiver.rb
110
+ - examples/reconnection.rb
111
+ - examples/ssl_connect.rb
112
+ - lib/sc_client.rb
113
+ - lib/socketclusterclient.rb
114
+ - lib/socketclusterclient/data_models.rb
115
+ - lib/socketclusterclient/emitter.rb
116
+ - lib/socketclusterclient/log.rb
117
+ - lib/socketclusterclient/parser.rb
118
+ - lib/socketclusterclient/reconnect.rb
119
+ - lib/socketclusterclient/version.rb
120
+ - socketclusterclient.gemspec
121
+ homepage: https://socketcluster.io/
122
+ licenses:
123
+ - MIT
124
+ metadata: {}
125
+ post_install_message:
126
+ rdoc_options: []
127
+ require_paths:
128
+ - lib
129
+ required_ruby_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: 2.2.0
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project:
141
+ rubygems_version: 2.6.14
142
+ signing_key:
143
+ specification_version: 4
144
+ summary: Ruby client for socketcluster
145
+ test_files: []