bougyman-freeswitcher 0.1.3 → 0.1.4
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/AUTHORS +13 -0
- data/CHANGELOG +1136 -0
- data/MANIFEST +101 -0
- data/README +66 -70
- data/Rakefile +31 -77
- data/examples/inbound_event_socket.rb +18 -0
- data/examples/inbound_socket_events.rb +25 -0
- data/examples/outbound_event_socket.rb +28 -0
- data/freeswitcher.gemspec +155 -0
- data/lib/fsr.rb +14 -4
- data/lib/fsr/listener/outbound.rb +21 -10
- data/lib/fsr/version.rb +3 -0
- data/spec/helper.rb +11 -6
- data/tasks/authors.rake +30 -0
- data/tasks/bacon.rake +66 -0
- data/tasks/changelog.rake +19 -0
- data/tasks/copyright.rake +21 -0
- data/tasks/gem.rake +23 -0
- data/tasks/gem_installer.rake +76 -0
- data/tasks/install_dependencies.rake +6 -0
- data/tasks/manifest.rake +4 -0
- data/tasks/rcov.rake +23 -0
- data/tasks/release.rake +52 -0
- data/tasks/reversion.rake +8 -0
- data/tasks/setup.rake +16 -0
- data/tasks/spec.rake +0 -59
- data/tasks/yard.rake +4 -0
- metadata +123 -106
- data/examples/oes_demo.rb +0 -21
- data/examples/play_and_get_test.rb +0 -35
- data/tasks/package.rake +0 -29
data/MANIFEST
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
.gitignore
|
2
|
+
AUTHORS
|
3
|
+
CHANGELOG
|
4
|
+
License.txt
|
5
|
+
MANIFEST
|
6
|
+
NEWS
|
7
|
+
README
|
8
|
+
Rakefile
|
9
|
+
examples/bin/cmd_demo.rb
|
10
|
+
examples/bin/dtmf_test.rb
|
11
|
+
examples/bin/ies_demo.rb
|
12
|
+
examples/bin/ies_demo_with_hook.rb
|
13
|
+
examples/bin/oes_demo.rb
|
14
|
+
examples/dtmf_test.rb
|
15
|
+
examples/ies_demo.rb
|
16
|
+
examples/ies_demo_with_hook.rb
|
17
|
+
examples/inbound_event_socket.rb
|
18
|
+
examples/inbound_socket_events.rb
|
19
|
+
examples/outbound_event_socket.rb
|
20
|
+
freeswitcher.gemspec
|
21
|
+
lib/fsr.rb
|
22
|
+
lib/fsr/app.rb
|
23
|
+
lib/fsr/app/answer.rb
|
24
|
+
lib/fsr/app/bridge.rb
|
25
|
+
lib/fsr/app/conference.rb
|
26
|
+
lib/fsr/app/fifo.rb
|
27
|
+
lib/fsr/app/fs_break.rb
|
28
|
+
lib/fsr/app/fs_sleep.rb
|
29
|
+
lib/fsr/app/hangup.rb
|
30
|
+
lib/fsr/app/limit.rb
|
31
|
+
lib/fsr/app/log.rb
|
32
|
+
lib/fsr/app/play_and_get_digits.rb
|
33
|
+
lib/fsr/app/playback.rb
|
34
|
+
lib/fsr/app/read.rb
|
35
|
+
lib/fsr/app/set.rb
|
36
|
+
lib/fsr/app/speak.rb
|
37
|
+
lib/fsr/app/transfer.rb
|
38
|
+
lib/fsr/app/uuid_dump.rb
|
39
|
+
lib/fsr/app/uuid_getvar.rb
|
40
|
+
lib/fsr/app/uuid_setvar.rb
|
41
|
+
lib/fsr/cmd.rb
|
42
|
+
lib/fsr/cmd/calls.rb
|
43
|
+
lib/fsr/cmd/fsctl.rb
|
44
|
+
lib/fsr/cmd/originate.rb
|
45
|
+
lib/fsr/cmd/sofia.rb
|
46
|
+
lib/fsr/cmd/sofia/profile.rb
|
47
|
+
lib/fsr/cmd/sofia/status.rb
|
48
|
+
lib/fsr/cmd/sofia_contact.rb
|
49
|
+
lib/fsr/cmd/status.rb
|
50
|
+
lib/fsr/command_socket.rb
|
51
|
+
lib/fsr/database.rb
|
52
|
+
lib/fsr/database/call_limit.rb
|
53
|
+
lib/fsr/database/core.rb
|
54
|
+
lib/fsr/database/sofia_reg_external.rb
|
55
|
+
lib/fsr/database/sofia_reg_internal.rb
|
56
|
+
lib/fsr/database/voicemail_default.rb
|
57
|
+
lib/fsr/event_socket.rb
|
58
|
+
lib/fsr/fake_socket.rb
|
59
|
+
lib/fsr/listener.rb
|
60
|
+
lib/fsr/listener/header_and_content_response.rb
|
61
|
+
lib/fsr/listener/inbound.rb
|
62
|
+
lib/fsr/listener/inbound/event.rb
|
63
|
+
lib/fsr/listener/outbound.rb
|
64
|
+
lib/fsr/listener/outbound.rb.orig
|
65
|
+
lib/fsr/model/call.rb
|
66
|
+
lib/fsr/version.rb
|
67
|
+
tasks/authors.rake
|
68
|
+
tasks/bacon.rake
|
69
|
+
tasks/changelog.rake
|
70
|
+
tasks/copyright.rake
|
71
|
+
tasks/gem.rake
|
72
|
+
tasks/gem_installer.rake
|
73
|
+
tasks/install_dependencies.rake
|
74
|
+
tasks/manifest.rake
|
75
|
+
tasks/rcov.rake
|
76
|
+
tasks/release.rake
|
77
|
+
tasks/reversion.rake
|
78
|
+
tasks/setup.rake
|
79
|
+
tasks/spec.rake
|
80
|
+
tasks/yard.rake
|
81
|
+
spec/helper.rb
|
82
|
+
spec/fsr/app.rb
|
83
|
+
spec/fsr/app/bridge.rb
|
84
|
+
spec/fsr/app/conference.rb
|
85
|
+
spec/fsr/app/fifo.rb
|
86
|
+
spec/fsr/app/hangup.rb
|
87
|
+
spec/fsr/app/limit.rb
|
88
|
+
spec/fsr/app/log.rb
|
89
|
+
spec/fsr/app/play_and_get_digits.rb
|
90
|
+
spec/fsr/app/playback.rb
|
91
|
+
spec/fsr/app/set.rb
|
92
|
+
spec/fsr/app/transfer.rb
|
93
|
+
spec/fsr/cmd.rb
|
94
|
+
spec/fsr/cmd/calls.rb
|
95
|
+
spec/fsr/cmd/originate.rb
|
96
|
+
spec/fsr/cmd/sofia.rb
|
97
|
+
spec/fsr/cmd/sofia/profile.rb
|
98
|
+
spec/fsr/listener.rb
|
99
|
+
spec/fsr/listener/inbound.rb
|
100
|
+
spec/fsr/listener/outbound.rb
|
101
|
+
spec/fsr/loading.rb
|
data/README
CHANGED
@@ -4,108 +4,88 @@ Copyright (c) 2009 The Rubyists (Jayson Vaughn, Tj Vanderpoel, Michael Fellinger
|
|
4
4
|
Distributed under the terms of the MIT License.
|
5
5
|
==========================================================
|
6
6
|
|
7
|
-
|
7
|
+
ABOUT
|
8
8
|
-----
|
9
|
-
*** STILL UNDER HEAVY DEVELOPMENT ***
|
10
|
-
|
11
9
|
A ruby library for interacting with the "FreeSWITCH" (http://www.freeswitch.org) opensource telephony platform
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
Requirements
|
11
|
+
REQUIREMENTS
|
16
12
|
------------
|
17
13
|
- ruby (>= 1.8)
|
18
14
|
- eventmachine (If you wish to use Outbound and Inbound listener)
|
19
15
|
|
20
|
-
|
16
|
+
USAGE
|
21
17
|
-----
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
irb(main):001:0> require 'fsr'
|
26
|
-
=> true
|
27
|
-
|
28
|
-
irb(main):002:0> FSR.load_all_commands
|
29
|
-
=> [:sofia, :originate]
|
30
|
-
|
31
|
-
irb(main):003:0> sock = FSR::CommandSocket.new
|
32
|
-
=> #<FSR::CommandSocket:0xb7a89104 @server="127.0.0.1", @socket=#<TCPSocket:0xb7a8908c>, @port="8021", @auth="ClueCon">
|
19
|
+
An Outbound Event Listener Example that reads and returns DTMF input:
|
20
|
+
--------------------------------------------------------------------
|
33
21
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
#!/usr/bin/env ruby
|
22
|
+
Simply just create a subclass of FSR::Listner::Outbound and all
|
23
|
+
new calls/sessions will invoke the "session_initiated" callback method.
|
24
|
+
|
25
|
+
* NOTE: FSR uses blocks within the 'session_inititated' method to ensure
|
26
|
+
that the next "freeswich command" is not executed until the previous
|
27
|
+
"Freeswitch command" has finished. This is kicked off by "answer do"
|
41
28
|
|
42
29
|
require 'fsr'
|
43
|
-
require
|
30
|
+
require 'fsr/listener/outbound'
|
44
31
|
|
45
|
-
class
|
32
|
+
class OutboundDemo < FSR::Listener::Outbound
|
46
33
|
|
47
34
|
def session_initiated
|
48
|
-
|
49
|
-
FSR::Log.info "*** Answering incoming call from #{
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
35
|
+
exten = @session.headers[:caller_caller_id_number]
|
36
|
+
FSR::Log.info "*** Answering incoming call from #{exten}"
|
37
|
+
|
38
|
+
answer do
|
39
|
+
FSR::Log.info "***Reading DTMF from #{exten}"
|
40
|
+
read("/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav", 4, 10, "input", 7000) do
|
41
|
+
FSR::Log.info "*** Updating session for #{exten}"
|
42
|
+
update_session do
|
43
|
+
FSR::Log.info "***Success, grabbed #{@session.headers[:variable_input].strip} from #{exten}"
|
44
|
+
hangup #Hangup the call
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
54
49
|
end
|
55
50
|
|
56
51
|
end
|
57
52
|
|
58
|
-
FSR.start_oes!
|
53
|
+
FSR.start_oes! OutboundDemo, :port => 8084, :host => "127.0.0.1"
|
59
54
|
|
60
55
|
|
56
|
+
An Inbound Event Socket Listener example using FreeSWITCHeR's hook system:
|
57
|
+
--------------------------------------------------------------------------
|
61
58
|
|
62
|
-
|
63
|
-
|
64
|
-
#!/usr/bin/env ruby
|
65
|
-
|
59
|
+
require 'pp'
|
66
60
|
require 'fsr'
|
67
|
-
require
|
68
|
-
|
69
|
-
FSR.load_all_applications
|
70
|
-
FSR.load_all_commands
|
61
|
+
require "fsr/listener/inbound"
|
71
62
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
exten = @session.headers[:caller_caller_id_number]
|
76
|
-
FSR::Log.info "*** Answering incoming call from #{exten}"
|
77
|
-
answer # Answer the call
|
78
|
-
end
|
79
|
-
|
80
|
-
def receive_reply(reply)
|
81
|
-
exten = @session.headers[:caller_caller_id_number]
|
82
|
-
case @step
|
83
|
-
when 1
|
84
|
-
FSR::Log.info "*** Reading dtmf for #{exten}"
|
85
|
-
read "/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav",4,10,"test",15000 # read test
|
86
|
-
when 2
|
87
|
-
FSR::Log.info "*** updating session for #{exten}"
|
88
|
-
update_session
|
89
|
-
when 3
|
90
|
-
FSR::Log.info "** Success, grabbed #{@session.headers[:variable_test].strip} from #{exten}"
|
91
|
-
FSR::Log.info "*** Hanging up call"
|
92
|
-
hangup # Hangup the call
|
93
|
-
end
|
94
|
-
end
|
63
|
+
# EXAMPLE 1
|
64
|
+
# This adds a hook on CHANNEL_CREATE events. You can also create a method to handle the event you're after. See the next example
|
65
|
+
FSL::Inbound.add_event_hook(:CHANNEL_CREATE) {|event| FSR::Log.info "*** [#{event.content[:unique_id]}] Channel created - greetings from the hook!" }
|
95
66
|
|
67
|
+
# EXAMPLE 2
|
68
|
+
# Define a method to handle CHANNEL_HANGUP events.
|
69
|
+
def custom_channel_hangup_handler(event)
|
70
|
+
FSR::Log.info "*** [#{event.content[:unique_id]}] Channel hangup. The event:"
|
71
|
+
pp event
|
96
72
|
end
|
97
73
|
|
98
|
-
|
74
|
+
# This adds a hook for EXAMPLE 2
|
75
|
+
FSL::Inbound.add_event_hook(:CHANNEL_HANGUP) {|event| custom_channel_hangup_handler(event) }
|
99
76
|
|
100
77
|
|
78
|
+
# Start FSR Inbound Listener
|
79
|
+
FSR.start_ies!(FSL::Inbound, :host => "localhost", :port => 8021)
|
101
80
|
|
102
|
-
Example of creating an Inbound Eventsocket listener:
|
103
81
|
|
104
|
-
|
82
|
+
An Inbound Event Socket Listener example using the on_event callback method instead of hooks:
|
83
|
+
---------------------------------------------------------------------------------------------
|
105
84
|
|
106
|
-
require 'fsr'
|
107
|
-
require 'fsr/listener/inbound'
|
108
85
|
require 'pp'
|
86
|
+
require 'fsr'
|
87
|
+
require "fsr/listener/inbound"
|
88
|
+
|
109
89
|
|
110
90
|
class IesDemo < FSR::Listener::Inbound
|
111
91
|
|
@@ -119,8 +99,24 @@ Example of creating an Inbound Eventsocket listener:
|
|
119
99
|
FSR.start_ies!(IesDemo, :host => "localhost", :port => 8021)
|
120
100
|
|
121
101
|
|
102
|
+
An example of using FSR::CommandSocket to originate a new call in irb:
|
103
|
+
----------------------------------------------------------------------
|
104
|
+
|
105
|
+
irb(main):001:0> require 'fsr'
|
106
|
+
=> true
|
107
|
+
|
108
|
+
irb(main):002:0> FSR.load_all_commands
|
109
|
+
=> [:sofia, :originate]
|
110
|
+
|
111
|
+
irb(main):003:0> sock = FSR::CommandSocket.new
|
112
|
+
=> #<FSR::CommandSocket:0xb7a89104 @server="127.0.0.1", @socket=#<TCPSocket:0xb7a8908c>, @port="8021", @auth="ClueCon">
|
113
|
+
|
114
|
+
irb(main):007:0> sock.originate(:target => 'sofia/gateway/carlos/8179395222', :endpoint => FSR::App::Bridge.new("user/bougyman")).run
|
115
|
+
=> {"Job-UUID"=>"732075a4-7dd5-4258-b124-6284a82a5ae7", "body"=>"", "Content-Type"=>"command/reply", "Reply-Text"=>"+OK Job-UUID: 732075a4-7dd5-4258-b124-6284a82a5ae7"}
|
116
|
+
|
117
|
+
|
122
118
|
|
123
|
-
|
119
|
+
SUPPORT
|
124
120
|
-------
|
125
121
|
Home page at http://code.rubyists.com/projects/fs
|
126
122
|
#rubyists on FreeNode
|
data/Rakefile
CHANGED
@@ -1,82 +1,36 @@
|
|
1
1
|
require 'rake/clean'
|
2
2
|
require "rubygems"
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
3
|
+
require "lib/fsr"
|
4
|
+
require "pathname"
|
5
|
+
|
6
|
+
PROJECT_COPYRIGHT = File.read(Pathname.new(__FILE__).dirname.join("License.txt"))
|
7
|
+
PROJECT_README = Pathname.new(__FILE__).dirname.join("README").expand_path.to_s
|
8
|
+
PROJECT_FILES = %x{git ls-files}.split
|
9
|
+
RELEASE_FILES = PROJECT_FILES.reject { |f| f.match(/^(?:contrib)(?:\/|$)/) }
|
10
|
+
GEM_FILES = RELEASE_FILES.reject { |f| f.match(/^(?:spec)(?:\/|$)/) }
|
11
|
+
PROJECT_SPECS = (RELEASE_FILES - GEM_FILES).reject { |d| d.match(/(?:helper.rb)$/) }
|
12
|
+
GEM_FILES << "spec/helper.rb" if Pathname.new("spec/helper.rb").file?
|
13
|
+
|
14
|
+
|
15
|
+
GEMSPEC = Gem::Specification.new do |spec|
|
16
|
+
spec.name = "freeswitcher"
|
17
|
+
spec.version = ENV["FSR_VERSION"] || FSR::VERSION
|
18
|
+
spec.summary = 'A library for interacting with the "FreeSWITCH":http://freeswitch.org telephony platform'
|
19
|
+
spec.authors = ["Jayson Vaughn", "Michael Fellinger", "Kevin Berry", "TJ Vanderpoel"]
|
20
|
+
spec.email = "FreeSWITCHeR@rubyists.com"
|
21
|
+
spec.homepage = "http://code.rubyists.com/projects/fs"
|
22
|
+
spec.add_dependency "eventmachine"
|
23
|
+
|
24
|
+
spec.files = GEM_FILES
|
25
|
+
spec.test_files = PROJECT_SPECS
|
26
|
+
spec.require_path = "lib"
|
27
|
+
|
28
|
+
description = File.read(PROJECT_README)
|
29
|
+
spec.description = description
|
30
|
+
spec.rubyforge_project = "freeswitcher"
|
31
|
+
spec.post_install_message = description
|
17
32
|
end
|
18
33
|
|
19
|
-
|
20
|
-
def initialize(options = {}, &block)
|
21
|
-
@gems = []
|
22
|
-
@options = options
|
23
|
-
|
24
|
-
run(&block)
|
25
|
-
end
|
26
|
-
|
27
|
-
def run(&block)
|
28
|
-
instance_eval(&block) if block_given?
|
29
|
-
end
|
30
|
-
|
31
|
-
def gem(name, version = nil, options = {})
|
32
|
-
if version.respond_to?(:merge!)
|
33
|
-
options = version
|
34
|
-
else
|
35
|
-
options[:version] = version
|
36
|
-
end
|
37
|
-
|
38
|
-
@gems << [name, options]
|
39
|
-
end
|
40
|
-
|
41
|
-
def setup
|
42
|
-
require 'rubygems'
|
43
|
-
require 'rubygems/dependency_installer'
|
44
|
-
|
45
|
-
@gems.each do |name, options|
|
46
|
-
setup_gem(name, options)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def setup_gem(name, options, try_install = true)
|
51
|
-
print "activating #{name} ... "
|
52
|
-
Gem.activate(name, *[options[:version]].compact)
|
53
|
-
require(options[:lib] || name)
|
54
|
-
puts "success."
|
55
|
-
rescue LoadError => error
|
56
|
-
puts error
|
57
|
-
install_gem(name, options) if try_install
|
58
|
-
setup_gem(name, options, try_install = false)
|
59
|
-
end
|
60
|
-
|
61
|
-
def install_gem(name, options)
|
62
|
-
installer = Gem::DependencyInstaller.new(options)
|
63
|
-
|
64
|
-
temp_argv(options[:extconf]) do
|
65
|
-
print "Installing #{name} ... "
|
66
|
-
installer.install(name, options[:version])
|
67
|
-
puts "done."
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def temp_argv(extconf)
|
72
|
-
if extconf ||= @options[:extconf]
|
73
|
-
old_argv = ARGV.clone
|
74
|
-
ARGV.replace(extconf.split(' '))
|
75
|
-
end
|
76
|
-
|
77
|
-
yield
|
34
|
+
import(*Dir['tasks/*rake'])
|
78
35
|
|
79
|
-
|
80
|
-
ARGV.replace(old_argv) if extconf
|
81
|
-
end
|
82
|
-
end
|
36
|
+
task :default => :bacon
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'pp'
|
4
|
+
require File.join(File.dirname(__FILE__), "..", 'lib', 'fsr')
|
5
|
+
$stdout.flush
|
6
|
+
require "fsr/listener/inbound"
|
7
|
+
|
8
|
+
|
9
|
+
class IesDemo < FSR::Listener::Inbound
|
10
|
+
|
11
|
+
def on_event(event)
|
12
|
+
pp event.headers
|
13
|
+
pp event.content[:event_name]
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
FSR.start_ies!(IesDemo, :host => "localhost", :port => 8021)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'pp'
|
4
|
+
require File.join(File.dirname(__FILE__), "..", 'lib', 'fsr')
|
5
|
+
$stdout.flush
|
6
|
+
require "fsr/listener/inbound"
|
7
|
+
|
8
|
+
# EXAMPLE 1
|
9
|
+
# This adds a hook on CHANNEL_CREATE events. You can also create a method to handle the event you're after. See the next example
|
10
|
+
FSL::Inbound.add_event_hook(:CHANNEL_CREATE) {|event| FSR::Log.info "*** [#{event.content[:unique_id]}] Channel created - greetings from the hook!" }
|
11
|
+
|
12
|
+
# EXAMPLE 2
|
13
|
+
# Define a method to handle CHANNEL_HANGUP events.
|
14
|
+
def custom_channel_hangup_handler(event)
|
15
|
+
FSR::Log.info "*** [#{event.content[:unique_id]}] Channel hangup. The event:"
|
16
|
+
pp event
|
17
|
+
end
|
18
|
+
|
19
|
+
# This adds a hook for EXAMPLE 2
|
20
|
+
FSL::Inbound.add_event_hook(:CHANNEL_HANGUP) {|event| custom_channel_hangup_handler(event) }
|
21
|
+
|
22
|
+
|
23
|
+
# Start FSR Inbound Listener
|
24
|
+
FSR.start_ies!(FSL::Inbound, :host => "localhost", :port => 8021)
|
25
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), "..", 'lib', 'fsr')
|
4
|
+
require "fsr/listener/outbound"
|
5
|
+
$stdout.flush
|
6
|
+
|
7
|
+
class OutboundDemo < FSR::Listener::Outbound
|
8
|
+
|
9
|
+
def session_initiated
|
10
|
+
exten = @session.headers[:caller_caller_id_number]
|
11
|
+
FSR::Log.info "*** Answering incoming call from #{exten}"
|
12
|
+
|
13
|
+
answer do
|
14
|
+
FSR::Log.info "***Reading DTMF from #{exten}"
|
15
|
+
read("/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav", 4, 10, "input", 7000) do
|
16
|
+
FSR::Log.info "*** Updating session for #{exten}"
|
17
|
+
update_session do
|
18
|
+
FSR::Log.info "***Success, grabbed #{@session.headers[:variable_input].strip} from #{exten}"
|
19
|
+
hangup #Hangup the call
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
FSR.start_oes! OutboundDemo, :port => 8084, :host => "127.0.0.1"
|