socker 0.0.1
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/lib/socker.rb +80 -0
- data/lib/socker/event_handlers.rb +28 -0
- data/lib/socker/helper.rb +15 -0
- metadata +63 -0
data/lib/socker.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require_relative './socker/event_handlers.rb'
|
2
|
+
require_relative './socker/helper.rb'
|
3
|
+
|
4
|
+
require 'faye/websocket'
|
5
|
+
require 'logger'
|
6
|
+
|
7
|
+
module Socker
|
8
|
+
|
9
|
+
class App
|
10
|
+
|
11
|
+
include Socker::EventHandlers
|
12
|
+
include Socker::Helper
|
13
|
+
|
14
|
+
WEBSOCKET_STANDARD_EVENTS = [ :open, :close, :message, :error ]
|
15
|
+
|
16
|
+
attr_reader :events, :callbacks
|
17
|
+
|
18
|
+
def initialize(callbacks={})
|
19
|
+
@callbacks = callbacks
|
20
|
+
@application = lambda do |env|
|
21
|
+
return [501, {}, ['Sorry, but I am websocket app.']] unless is_websocket?(env)
|
22
|
+
connection(env) do |c|
|
23
|
+
WEBSOCKET_STANDARD_EVENTS.each(®ister_handler(c))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
@application.freeze
|
27
|
+
@application
|
28
|
+
end
|
29
|
+
|
30
|
+
def connection(env, opts={}, &block)
|
31
|
+
conn = Faye::WebSocket.new(env)
|
32
|
+
yield conn if block_given?
|
33
|
+
conn.rack_response
|
34
|
+
end
|
35
|
+
|
36
|
+
def socket(socket=nil)
|
37
|
+
@socket = socket
|
38
|
+
end
|
39
|
+
|
40
|
+
def on(event, handler)
|
41
|
+
@events ||= {}
|
42
|
+
@events[event] ||= lambda { |socket, ev| handler.call(socket, ev) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_app
|
46
|
+
@application
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.log(message, level=:info)
|
50
|
+
@log ||= Logger.new($stdout)
|
51
|
+
@log.send(level, message)
|
52
|
+
end
|
53
|
+
|
54
|
+
def log(message); self.class.log(message); end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def is_websocket?(env)
|
59
|
+
Faye::WebSocket.websocket?(env)
|
60
|
+
end
|
61
|
+
|
62
|
+
def register_handler(connection)
|
63
|
+
lambda { |event| connection.on(event, &handle_with(event, socket: connection)) }
|
64
|
+
end
|
65
|
+
|
66
|
+
def handle_with(event, opts={})
|
67
|
+
if events[event]
|
68
|
+
lambda { |ev| handle(event, opts[:socket]); events[event].call(opts[:socket], ev) }
|
69
|
+
else
|
70
|
+
method(:handle_undefined)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def handle_undefined(event)
|
75
|
+
self.class.log("WARNING: The '#{event.type}' event is not defined.", :error)
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Socker
|
2
|
+
|
3
|
+
module EventHandlers
|
4
|
+
|
5
|
+
def connections
|
6
|
+
@connections ||= []
|
7
|
+
end
|
8
|
+
|
9
|
+
def on_open(connection)
|
10
|
+
@callbacks[:when_active].call if connections.empty? and @callbacks[:when_active]
|
11
|
+
connections << connection
|
12
|
+
end
|
13
|
+
|
14
|
+
def on_close(connection)
|
15
|
+
connections.delete(connection)
|
16
|
+
@callbacks[:when_idle].call if connections.empty? and @callbacks[:when_active]
|
17
|
+
end
|
18
|
+
|
19
|
+
def handle(event, connection)
|
20
|
+
case event
|
21
|
+
when :open then on_open(connection)
|
22
|
+
when :close then on_close(connection)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: socker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michal Fojtik
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: faye-websocket
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: A simple lib that helps you build awesome websockets apps
|
31
|
+
email: mi@mifo.sk
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- lib/socker/helper.rb
|
37
|
+
- lib/socker/event_handlers.rb
|
38
|
+
- lib/socker.rb
|
39
|
+
homepage: https://github.com/mfojtik/socker
|
40
|
+
licenses: []
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
none: false
|
47
|
+
requirements:
|
48
|
+
- - ! '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 1.8.23
|
60
|
+
signing_key:
|
61
|
+
specification_version: 3
|
62
|
+
summary: Framework for building WebSocket applications
|
63
|
+
test_files: []
|