summaryrefslogtreecommitdiff
path: root/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides')
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/01_eventmachine_echo_server.rb18
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb22
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/03_simple_chat_server.rb149
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/04_simple_chat_server_step_one.rb27
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/05_simple_chat_server_step_two.rb43
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/06_simple_chat_server_step_three.rb98
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/07_simple_chat_server_step_four.rb121
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/08_simple_chat_server_step_five.rb141
8 files changed, 619 insertions, 0 deletions
diff --git a/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/01_eventmachine_echo_server.rb b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/01_eventmachine_echo_server.rb
new file mode 100644
index 0000000..51c5c7d
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/01_eventmachine_echo_server.rb
@@ -0,0 +1,18 @@
+#!/usr/bin/env ruby
+
+require 'rubygems' # or use Bundler.setup
+require 'eventmachine'
+
+class EchoServer < EM::Connection
+ def receive_data(data)
+ send_data(data)
+ end
+end
+
+EventMachine.run do
+ # hit Control + C to stop
+ Signal.trap("INT") { EventMachine.stop }
+ Signal.trap("TERM") { EventMachine.stop }
+
+ EventMachine.start_server("0.0.0.0", 10000, EchoServer)
+end \ No newline at end of file
diff --git a/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb
new file mode 100644
index 0000000..4cfff19
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+
+require 'rubygems' # or use Bundler.setup
+require 'eventmachine'
+
+class EchoServer < EM::Connection
+ def receive_data(data)
+ if data.strip =~ /exit$/i
+ EventMachine.stop
+ else
+ send_data(data)
+ end
+ end
+end
+
+EventMachine.run do
+ # hit Control + C to stop
+ Signal.trap("INT") { EventMachine.stop }
+ Signal.trap("TERM") { EventMachine.stop }
+
+ EventMachine.start_server("0.0.0.0", 10000, EchoServer)
+end
diff --git a/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/03_simple_chat_server.rb b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/03_simple_chat_server.rb
new file mode 100644
index 0000000..3352551
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/03_simple_chat_server.rb
@@ -0,0 +1,149 @@
+#!/usr/bin/env ruby
+
+require 'rubygems' # or use Bundler.setup
+require 'eventmachine'
+
+class SimpleChatServer < EM::Connection
+
+ @@connected_clients = Array.new
+ DM_REGEXP = /^@([a-zA-Z0-9]+)\s*:?\s*(.+)/.freeze
+
+ attr_reader :username
+
+
+ #
+ # EventMachine handlers
+ #
+
+ def post_init
+ @username = nil
+
+ puts "A client has connected..."
+ ask_username
+ end
+
+ def unbind
+ @@connected_clients.delete(self)
+ puts "[info] #{@username} has left" if entered_username?
+ end
+
+ def receive_data(data)
+ if entered_username?
+ handle_chat_message(data.strip)
+ else
+ handle_username(data.strip)
+ end
+ end
+
+
+ #
+ # Username handling
+ #
+
+ def entered_username?
+ !@username.nil? && !@username.empty?
+ end # entered_username?
+
+ def handle_username(input)
+ if input.empty?
+ send_line("Blank usernames are not allowed. Try again.")
+ ask_username
+ else
+ @username = input
+ @@connected_clients.push(self)
+ self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") }
+ puts "#{@username} has joined"
+
+ self.send_line("[info] Ohai, #{@username}")
+ end
+ end # handle_username(input)
+
+ def ask_username
+ self.send_line("[info] Enter your username:")
+ end # ask_username
+
+
+ #
+ # Message handling
+ #
+
+ def handle_chat_message(msg)
+ if command?(msg)
+ self.handle_command(msg)
+ else
+ if direct_message?(msg)
+ self.handle_direct_message(msg)
+ else
+ self.announce(msg, "#{@username}:")
+ end
+ end
+ end # handle_chat_message(msg)
+
+ def direct_message?(input)
+ input =~ DM_REGEXP
+ end # direct_message?(input)
+
+ def handle_direct_message(input)
+ username, message = parse_direct_message(input)
+
+ if connection = @@connected_clients.find { |c| c.username == username }
+ puts "[dm] @#{@username} => @#{username}"
+ connection.send_line("[dm] @#{@username}: #{message}")
+ else
+ send_line "@#{username} is not in the room. Here's who is: #{usernames.join(', ')}"
+ end
+ end # handle_direct_message(input)
+
+ def parse_direct_message(input)
+ return [$1, $2] if input =~ DM_REGEXP
+ end # parse_direct_message(input)
+
+
+ #
+ # Commands handling
+ #
+
+ def command?(input)
+ input =~ /(exit|status)$/i
+ end # command?(input)
+
+ def handle_command(cmd)
+ case cmd
+ when /exit$/i then self.close_connection
+ when /status$/i then self.send_line("[chat server] It's #{Time.now.strftime('%H:%M')} and there are #{self.number_of_connected_clients} people in the room")
+ end
+ end # handle_command(cmd)
+
+
+ #
+ # Helpers
+ #
+
+ def announce(msg = nil, prefix = "[chat server]")
+ @@connected_clients.each { |c| c.send_line("#{prefix} #{msg}") } unless msg.empty?
+ end # announce(msg)
+
+ def number_of_connected_clients
+ @@connected_clients.size
+ end # number_of_connected_clients
+
+ def other_peers
+ @@connected_clients.reject { |c| self == c }
+ end # other_peers
+
+ def send_line(line)
+ self.send_data("#{line}\n")
+ end # send_line(line)
+
+ def usernames
+ @@connected_clients.map { |c| c.username }
+ end # usernames
+end
+
+EventMachine.run do
+ # hit Control + C to stop
+ Signal.trap("INT") { EventMachine.stop }
+ Signal.trap("TERM") { EventMachine.stop }
+
+ EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer)
+end
diff --git a/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/04_simple_chat_server_step_one.rb b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/04_simple_chat_server_step_one.rb
new file mode 100644
index 0000000..bb283a7
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/04_simple_chat_server_step_one.rb
@@ -0,0 +1,27 @@
+#!/usr/bin/env ruby
+
+require 'rubygems' # or use Bundler.setup
+require 'eventmachine'
+
+class SimpleChatServer < EM::Connection
+
+ #
+ # EventMachine handlers
+ #
+
+ def post_init
+ puts "A client has connected..."
+ end
+
+ def unbind
+ puts "A client has left..."
+ end
+end
+
+EventMachine.run do
+ # hit Control + C to stop
+ Signal.trap("INT") { EventMachine.stop }
+ Signal.trap("TERM") { EventMachine.stop }
+
+ EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer)
+end
diff --git a/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/05_simple_chat_server_step_two.rb b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/05_simple_chat_server_step_two.rb
new file mode 100644
index 0000000..1361c5d
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/05_simple_chat_server_step_two.rb
@@ -0,0 +1,43 @@
+#!/usr/bin/env ruby
+
+require 'rubygems' # or use Bundler.setup
+require 'eventmachine'
+
+class SimpleChatServer < EM::Connection
+
+ @@connected_clients = Array.new
+
+
+ #
+ # EventMachine handlers
+ #
+
+ def post_init
+ @@connected_clients.push(self)
+ puts "A client has connected..."
+ end
+
+ def unbind
+ @@connected_clients.delete(self)
+ puts "A client has left..."
+ end
+
+
+
+
+ #
+ # Helpers
+ #
+
+ def other_peers
+ @@connected_clients.reject { |c| self == c }
+ end # other_peers
+end
+
+EventMachine.run do
+ # hit Control + C to stop
+ Signal.trap("INT") { EventMachine.stop }
+ Signal.trap("TERM") { EventMachine.stop }
+
+ EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer)
+end
diff --git a/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/06_simple_chat_server_step_three.rb b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/06_simple_chat_server_step_three.rb
new file mode 100644
index 0000000..d9b85e2
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/06_simple_chat_server_step_three.rb
@@ -0,0 +1,98 @@
+#!/usr/bin/env ruby
+
+require 'rubygems' # or use Bundler.setup
+require 'eventmachine'
+
+class SimpleChatServer < EM::Connection
+
+ @@connected_clients = Array.new
+
+
+ attr_reader :username
+
+
+ #
+ # EventMachine handlers
+ #
+
+ def post_init
+ @username = nil
+
+ puts "A client has connected..."
+ ask_username
+ end
+
+ def unbind
+ @@connected_clients.delete(self)
+ puts "A client has left..."
+ end
+
+ def receive_data(data)
+ if entered_username?
+ handle_chat_message(data.strip)
+ else
+ handle_username(data.strip)
+ end
+ end
+
+
+
+
+ #
+ # Username handling
+ #
+
+ def entered_username?
+ !@username.nil? && !@username.empty?
+ end # entered_username?
+
+ def handle_username(input)
+ if input.empty?
+ send_line("Blank usernames are not allowed. Try again.")
+ ask_username
+ else
+ @username = input
+ @@connected_clients.push(self)
+ self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") }
+ puts "#{@username} has joined"
+
+ self.send_line("[info] Ohai, #{@username}")
+ end
+ end # handle_username(input)
+
+ def ask_username
+ self.send_line("[info] Enter your username:")
+ end # ask_username
+
+
+
+ #
+ # Message handling
+ #
+
+ def handle_chat_message(msg)
+ raise NotImplementedError
+ end
+
+
+
+ #
+ # Helpers
+ #
+
+ def other_peers
+ @@connected_clients.reject { |c| self == c }
+ end # other_peers
+
+ def send_line(line)
+ self.send_data("#{line}\n")
+ end # send_line(line)
+end
+
+EventMachine.run do
+ # hit Control + C to stop
+ Signal.trap("INT") { EventMachine.stop }
+ Signal.trap("TERM") { EventMachine.stop }
+
+ EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer)
+end
diff --git a/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/07_simple_chat_server_step_four.rb b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/07_simple_chat_server_step_four.rb
new file mode 100644
index 0000000..d4948af
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/07_simple_chat_server_step_four.rb
@@ -0,0 +1,121 @@
+#!/usr/bin/env ruby
+
+require 'rubygems' # or use Bundler.setup
+require 'eventmachine'
+
+class SimpleChatServer < EM::Connection
+
+ @@connected_clients = Array.new
+
+
+ attr_reader :username
+
+
+ #
+ # EventMachine handlers
+ #
+
+ def post_init
+ @username = nil
+
+ puts "A client has connected..."
+ ask_username
+ end
+
+ def unbind
+ @@connected_clients.delete(self)
+ puts "[info] #{@username} has left" if entered_username?
+ end
+
+ def receive_data(data)
+ if entered_username?
+ handle_chat_message(data.strip)
+ else
+ handle_username(data.strip)
+ end
+ end
+
+
+
+
+ #
+ # Username handling
+ #
+
+ def entered_username?
+ !@username.nil? && !@username.empty?
+ end # entered_username?
+
+ def handle_username(input)
+ if input.empty?
+ send_line("Blank usernames are not allowed. Try again.")
+ ask_username
+ else
+ @username = input
+ @@connected_clients.push(self)
+ self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") }
+ puts "#{@username} has joined"
+
+ self.send_line("[info] Ohai, #{@username}")
+ end
+ end # handle_username(input)
+
+ def ask_username
+ self.send_line("[info] Enter your username:")
+ end # ask_username
+
+
+
+ #
+ # Message handling
+ #
+
+ def handle_chat_message(msg)
+ if command?(msg)
+ self.handle_command(msg)
+ else
+ self.announce(msg, "#{@username}:")
+ end
+ end
+
+
+ #
+ # Commands handling
+ #
+
+ def command?(input)
+ input =~ /exit$/i
+ end # command?(input)
+
+ def handle_command(cmd)
+ case cmd
+ when /exit$/i then self.close_connection
+ end
+ end # handle_command(cmd)
+
+
+
+ #
+ # Helpers
+ #
+
+ def announce(msg = nil, prefix = "[chat server]")
+ @@connected_clients.each { |c| c.send_line("#{prefix} #{msg}") } unless msg.empty?
+ end # announce(msg)
+
+ def other_peers
+ @@connected_clients.reject { |c| self == c }
+ end # other_peers
+
+ def send_line(line)
+ self.send_data("#{line}\n")
+ end # send_line(line)
+end
+
+EventMachine.run do
+ # hit Control + C to stop
+ Signal.trap("INT") { EventMachine.stop }
+ Signal.trap("TERM") { EventMachine.stop }
+
+ EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer)
+end
diff --git a/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/08_simple_chat_server_step_five.rb b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/08_simple_chat_server_step_five.rb
new file mode 100644
index 0000000..03da66b
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/examples/guides/getting_started/08_simple_chat_server_step_five.rb
@@ -0,0 +1,141 @@
+#!/usr/bin/env ruby
+
+require 'rubygems' # or use Bundler.setup
+require 'eventmachine'
+
+class SimpleChatServer < EM::Connection
+
+ @@connected_clients = Array.new
+ DM_REGEXP = /^@([a-zA-Z0-9]+)\s*:?\s+(.+)/.freeze
+
+ attr_reader :username
+
+
+ #
+ # EventMachine handlers
+ #
+
+ def post_init
+ @username = nil
+
+ puts "A client has connected..."
+ ask_username
+ end
+
+ def unbind
+ @@connected_clients.delete(self)
+ puts "[info] #{@username} has left" if entered_username?
+ end
+
+ def receive_data(data)
+ if entered_username?
+ handle_chat_message(data.strip)
+ else
+ handle_username(data.strip)
+ end
+ end
+
+
+ #
+ # Username handling
+ #
+
+ def entered_username?
+ !@username.nil? && !@username.empty?
+ end # entered_username?
+
+ def handle_username(input)
+ if input.empty?
+ send_line("Blank usernames are not allowed. Try again.")
+ ask_username
+ else
+ @username = input
+ @@connected_clients.push(self)
+ self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") }
+ puts "#{@username} has joined"
+
+ self.send_line("[info] Ohai, #{@username}")
+ end
+ end # handle_username(input)
+
+ def ask_username
+ self.send_line("[info] Enter your username:")
+ end # ask_username
+
+
+ #
+ # Message handling
+ #
+
+ def handle_chat_message(msg)
+ if command?(msg)
+ self.handle_command(msg)
+ else
+ if direct_message?(msg)
+ self.handle_direct_message(msg)
+ else
+ self.announce(msg, "#{@username}:")
+ end
+ end
+ end # handle_chat_message(msg)
+
+ def direct_message?(input)
+ input =~ DM_REGEXP
+ end # direct_message?(input)
+
+ def handle_direct_message(input)
+ username, message = parse_direct_message(input)
+
+ if connection = @@connected_clients.find { |c| c.username == username }
+ puts "[dm] @#{@username} => @#{username}"
+ connection.send_line("[dm] @#{@username}: #{message}")
+ else
+ send_line "@#{username} is not in the room. Here's who is: #{usernames.join(', ')}"
+ end
+ end # handle_direct_message(input)
+
+ def parse_direct_message(input)
+ return [$1, $2] if input =~ DM_REGEXP
+ end # parse_direct_message(input)
+
+
+ #
+ # Commands handling
+ #
+
+ def command?(input)
+ input =~ /(exit|status)$/i
+ end # command?(input)
+
+ def handle_command(cmd)
+ case cmd
+ when /exit$/i then self.close_connection
+ when /status$/i then self.send_line("[chat server] It's #{Time.now.strftime('%H:%M')} and there are #{self.number_of_connected_clients} people in the room")
+ end
+ end # handle_command(cmd)
+
+
+ #
+ # Helpers
+ #
+
+ def announce(msg = nil, prefix = "[chat server]")
+ @@connected_clients.each { |c| c.send_line("#{prefix} #{msg}") } unless msg.empty?
+ end # announce(msg)
+
+ def other_peers
+ @@connected_clients.reject { |c| self == c }
+ end # other_peers
+
+ def send_line(line)
+ self.send_data("#{line}\n")
+ end # send_line(line)
+end
+
+EventMachine.run do
+ # hit Control + C to stop
+ Signal.trap("INT") { EventMachine.stop }
+ Signal.trap("TERM") { EventMachine.stop }
+
+ EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer)
+end