moleculer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +44 -0
  5. data/.travis.yml +23 -0
  6. data/.yardopts +1 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +6 -0
  9. data/Gemfile.lock +57 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +59 -0
  12. data/Rakefile +6 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/examples/benchmark_server.rb +21 -0
  16. data/examples/client-server/client.rb +13 -0
  17. data/examples/client-server/server.rb +25 -0
  18. data/lib/moleculer/broker.rb +318 -0
  19. data/lib/moleculer/configuration.rb +109 -0
  20. data/lib/moleculer/context.rb +24 -0
  21. data/lib/moleculer/errors/action_not_found.rb +6 -0
  22. data/lib/moleculer/errors/invalid_action_response.rb +11 -0
  23. data/lib/moleculer/errors/local_node_already_registered.rb +6 -0
  24. data/lib/moleculer/errors/node_not_found.rb +6 -0
  25. data/lib/moleculer/errors/transporter_already_started.rb +6 -0
  26. data/lib/moleculer/node.rb +105 -0
  27. data/lib/moleculer/packets/base.rb +47 -0
  28. data/lib/moleculer/packets/disconnect.rb +10 -0
  29. data/lib/moleculer/packets/discover.rb +10 -0
  30. data/lib/moleculer/packets/event.rb +37 -0
  31. data/lib/moleculer/packets/heartbeat.rb +18 -0
  32. data/lib/moleculer/packets/info.rb +97 -0
  33. data/lib/moleculer/packets/req.rb +57 -0
  34. data/lib/moleculer/packets/res.rb +43 -0
  35. data/lib/moleculer/packets.rb +25 -0
  36. data/lib/moleculer/registry.rb +325 -0
  37. data/lib/moleculer/serializers/json.rb +23 -0
  38. data/lib/moleculer/serializers.rb +10 -0
  39. data/lib/moleculer/service/action.rb +60 -0
  40. data/lib/moleculer/service/base.rb +117 -0
  41. data/lib/moleculer/service/event.rb +50 -0
  42. data/lib/moleculer/service/remote.rb +80 -0
  43. data/lib/moleculer/service.rb +2 -0
  44. data/lib/moleculer/support/hash_util.rb +48 -0
  45. data/lib/moleculer/support/log_proxy.rb +67 -0
  46. data/lib/moleculer/support/open_struct.rb +15 -0
  47. data/lib/moleculer/support/string_util.rb +25 -0
  48. data/lib/moleculer/support.rb +4 -0
  49. data/lib/moleculer/transporters/redis.rb +207 -0
  50. data/lib/moleculer/transporters.rb +22 -0
  51. data/lib/moleculer/version.rb +3 -0
  52. data/lib/moleculer.rb +103 -0
  53. data/moleculer.gemspec +50 -0
  54. metadata +238 -0
data/lib/moleculer.rb ADDED
@@ -0,0 +1,103 @@
1
+ require "concurrent"
2
+ require "securerandom"
3
+ require "socket"
4
+ require "ougai"
5
+
6
+ require "moleculer/broker"
7
+ require "moleculer/context"
8
+ require "moleculer/service"
9
+ require "moleculer/support"
10
+ require "moleculer/version"
11
+ require "moleculer/node"
12
+ require "moleculer/serializers"
13
+ require "moleculer/packets"
14
+ require "moleculer/configuration"
15
+
16
+ # Moleculer is a fast, modern and powerful microservices framework for originally written for
17
+ # {Node.js}[https://nodejs.org/en/]. It helps you to build efficient, reliable & scalable services. Moleculer provides
18
+ # many features for building and managing your microservices.
19
+ #
20
+ # This is a Ruby port of the Moleculer protocol, allowing a seamless mesh between NodeJS service nodes, Ruby service
21
+ # nodes, and nodes in other
22
+ # {supported languages}[https://github.com/moleculerjs/awesome-moleculer#polyglot-implementations].
23
+ module Moleculer
24
+ extend self
25
+ PROTOCOL_VERSION = "3".freeze
26
+
27
+ # @return [Symbol] the service prefix. When used will prefix all services name with `<service_prefix>.`, defaults
28
+ # to `nil`
29
+ attr_accessor :service_prefix
30
+
31
+ ##
32
+ # @!attribute broker [r]
33
+ #
34
+ # @return [Moleculer::Broker] the Moleculer Broker instance. Only one broker can exist per node.
35
+ def broker
36
+ @broker ||= Broker.new(config)
37
+ end
38
+
39
+ ##
40
+ # Calls the given action. This method will block until the timeout is hit (default 5 seconds) or the action returns
41
+ # a response
42
+ #
43
+ # @param action [Symbol] the name of the action to call
44
+ # @param params [Hash] params to pass to the action
45
+ # @param kwargs [Hash] call options (see Moleculer::Broker#call)
46
+ #
47
+ # @return [Hash] the request response
48
+ def call(action, params = {}, **kwargs)
49
+ return broker.call(action.to_s, kwargs) if params.empty?
50
+
51
+ broker.call(action.to_s, params, kwargs)
52
+ end
53
+
54
+ def config
55
+ @config ||= Configuration.new
56
+ end
57
+
58
+ ##
59
+ # Allows configuration of moleculer. For more information on configuration see the [Readme](/index.html)
60
+ #
61
+ # @yield [self]
62
+ def configure
63
+ yield config
64
+ end
65
+
66
+ ##
67
+ # Emits the given event to the Moleculer network.
68
+ #
69
+ # @param event [String] the name of the event
70
+ # @param data [Hash] the data related to the event
71
+ def emit(event, data)
72
+ broker.emit(event, data)
73
+ end
74
+
75
+ ##
76
+ # Runs the moleculer broker. This is synchronous and blocks.
77
+ def run
78
+ broker.run
79
+ end
80
+
81
+ ##
82
+ # Starts the moleculer broker. This is asynchronous and does not block.
83
+ def start
84
+ broker.start
85
+ end
86
+
87
+ ##
88
+ # Stops the moleculer broker.
89
+ def stop
90
+ broker.stop
91
+ end
92
+
93
+ ##
94
+ # Blocks the processes until the requested services have been registered on the network.
95
+ #
96
+ # @param services [Array<String>] a list of service to wait for.
97
+ #
98
+ # @example
99
+ # Moleculer.wait_for_services("some.service", "someother.service")
100
+ def wait_for_services(*services)
101
+ broker.wait_for_services(*services)
102
+ end
103
+ end
data/moleculer.gemspec ADDED
@@ -0,0 +1,50 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "moleculer/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "moleculer"
8
+ spec.version = Moleculer::VERSION
9
+ spec.authors = ["fugufish"]
10
+ spec.email = ["therealfugu@gmail.com"]
11
+
12
+ spec.summary = %q{This is a Ruby implementation of the Moleculer framework.}
13
+ spec.description = %q{This is a Ruby implementation of the Moleculer framework.}
14
+ spec.homepage = "https://github.com/moleculer-ruby/moleculer"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
21
+
22
+ spec.metadata["homepage_uri"] = spec.homepage
23
+ # spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
24
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
25
+ else
26
+ raise "RubyGems 2.0 or newer is required to protect against " \
27
+ "public gem pushes."
28
+ end
29
+
30
+ # Specify which files should be added to the gem when it is released.
31
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
32
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
33
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
34
+ end
35
+ spec.bindir = "exe"
36
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
+ spec.require_paths = ["lib"]
38
+
39
+ spec.add_dependency "concurrent-ruby", "~> 1.0"
40
+ spec.add_dependency "ougai", "~> 1.7"
41
+ spec.add_dependency "awesome_print", "~> 1.8"
42
+
43
+ spec.add_development_dependency "bundler", "~> 1.16"
44
+ spec.add_development_dependency "yard", "~> 0.9.11"
45
+ spec.add_development_dependency "rake", "~> 10.0"
46
+ spec.add_development_dependency "redis", "~> 4.0"
47
+ spec.add_development_dependency "rspec", "~> 3.0"
48
+ spec.add_development_dependency "simplecov", "~> 0.16"
49
+ spec.add_development_dependency "timecop", "~> 0.9.1"
50
+ end
metadata ADDED
@@ -0,0 +1,238 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: moleculer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - fugufish
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-04-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: concurrent-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ougai
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: awesome_print
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.16'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.16'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.9.11
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.9.11
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: redis
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '4.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '4.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.16'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.16'
139
+ - !ruby/object:Gem::Dependency
140
+ name: timecop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.9.1
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.9.1
153
+ description: This is a Ruby implementation of the Moleculer framework.
154
+ email:
155
+ - therealfugu@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".rspec"
162
+ - ".rubocop.yml"
163
+ - ".travis.yml"
164
+ - ".yardopts"
165
+ - CODE_OF_CONDUCT.md
166
+ - Gemfile
167
+ - Gemfile.lock
168
+ - LICENSE.txt
169
+ - README.md
170
+ - Rakefile
171
+ - bin/console
172
+ - bin/setup
173
+ - examples/benchmark_server.rb
174
+ - examples/client-server/client.rb
175
+ - examples/client-server/server.rb
176
+ - lib/moleculer.rb
177
+ - lib/moleculer/broker.rb
178
+ - lib/moleculer/configuration.rb
179
+ - lib/moleculer/context.rb
180
+ - lib/moleculer/errors/action_not_found.rb
181
+ - lib/moleculer/errors/invalid_action_response.rb
182
+ - lib/moleculer/errors/local_node_already_registered.rb
183
+ - lib/moleculer/errors/node_not_found.rb
184
+ - lib/moleculer/errors/transporter_already_started.rb
185
+ - lib/moleculer/node.rb
186
+ - lib/moleculer/packets.rb
187
+ - lib/moleculer/packets/base.rb
188
+ - lib/moleculer/packets/disconnect.rb
189
+ - lib/moleculer/packets/discover.rb
190
+ - lib/moleculer/packets/event.rb
191
+ - lib/moleculer/packets/heartbeat.rb
192
+ - lib/moleculer/packets/info.rb
193
+ - lib/moleculer/packets/req.rb
194
+ - lib/moleculer/packets/res.rb
195
+ - lib/moleculer/registry.rb
196
+ - lib/moleculer/serializers.rb
197
+ - lib/moleculer/serializers/json.rb
198
+ - lib/moleculer/service.rb
199
+ - lib/moleculer/service/action.rb
200
+ - lib/moleculer/service/base.rb
201
+ - lib/moleculer/service/event.rb
202
+ - lib/moleculer/service/remote.rb
203
+ - lib/moleculer/support.rb
204
+ - lib/moleculer/support/hash_util.rb
205
+ - lib/moleculer/support/log_proxy.rb
206
+ - lib/moleculer/support/open_struct.rb
207
+ - lib/moleculer/support/string_util.rb
208
+ - lib/moleculer/transporters.rb
209
+ - lib/moleculer/transporters/redis.rb
210
+ - lib/moleculer/version.rb
211
+ - moleculer.gemspec
212
+ homepage: https://github.com/moleculer-ruby/moleculer
213
+ licenses:
214
+ - MIT
215
+ metadata:
216
+ allowed_push_host: https://rubygems.org
217
+ homepage_uri: https://github.com/moleculer-ruby/moleculer
218
+ post_install_message:
219
+ rdoc_options: []
220
+ require_paths:
221
+ - lib
222
+ required_ruby_version: !ruby/object:Gem::Requirement
223
+ requirements:
224
+ - - ">="
225
+ - !ruby/object:Gem::Version
226
+ version: '0'
227
+ required_rubygems_version: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ requirements: []
233
+ rubyforge_project:
234
+ rubygems_version: 2.7.7
235
+ signing_key:
236
+ specification_version: 4
237
+ summary: This is a Ruby implementation of the Moleculer framework.
238
+ test_files: []