playful 0.1.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +19 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +5 -0
  6. data/Gemfile +6 -0
  7. data/History.rdoc +3 -0
  8. data/LICENSE.rdoc +22 -0
  9. data/README.rdoc +194 -0
  10. data/Rakefile +20 -0
  11. data/features/control_point.feature +13 -0
  12. data/features/device.feature +22 -0
  13. data/features/device_discovery.feature +9 -0
  14. data/features/step_definitions/control_point_steps.rb +19 -0
  15. data/features/step_definitions/device_discovery_steps.rb +40 -0
  16. data/features/step_definitions/device_steps.rb +28 -0
  17. data/features/support/common.rb +9 -0
  18. data/features/support/env.rb +17 -0
  19. data/features/support/fake_upnp_device_collection.rb +108 -0
  20. data/features/support/world_extensions.rb +15 -0
  21. data/lib/core_ext/hash_patch.rb +5 -0
  22. data/lib/core_ext/socket_patch.rb +16 -0
  23. data/lib/core_ext/to_upnp_s.rb +65 -0
  24. data/lib/playful.rb +5 -0
  25. data/lib/playful/control_point.rb +175 -0
  26. data/lib/playful/control_point/base.rb +74 -0
  27. data/lib/playful/control_point/device.rb +511 -0
  28. data/lib/playful/control_point/error.rb +13 -0
  29. data/lib/playful/control_point/service.rb +404 -0
  30. data/lib/playful/device.rb +28 -0
  31. data/lib/playful/logger.rb +8 -0
  32. data/lib/playful/ssdp.rb +195 -0
  33. data/lib/playful/ssdp/broadcast_searcher.rb +114 -0
  34. data/lib/playful/ssdp/error.rb +6 -0
  35. data/lib/playful/ssdp/listener.rb +38 -0
  36. data/lib/playful/ssdp/multicast_connection.rb +112 -0
  37. data/lib/playful/ssdp/network_constants.rb +17 -0
  38. data/lib/playful/ssdp/notifier.rb +41 -0
  39. data/lib/playful/ssdp/searcher.rb +87 -0
  40. data/lib/playful/version.rb +3 -0
  41. data/lib/rack/upnp_control_point.rb +70 -0
  42. data/playful.gemspec +38 -0
  43. data/spec/spec_helper.rb +16 -0
  44. data/spec/support/search_responses.rb +134 -0
  45. data/spec/unit/core_ext/to_upnp_s_spec.rb +105 -0
  46. data/spec/unit/playful/control_point/device_spec.rb +7 -0
  47. data/spec/unit/playful/control_point_spec.rb +45 -0
  48. data/spec/unit/playful/ssdp/listener_spec.rb +29 -0
  49. data/spec/unit/playful/ssdp/multicast_connection_spec.rb +157 -0
  50. data/spec/unit/playful/ssdp/notifier_spec.rb +76 -0
  51. data/spec/unit/playful/ssdp/searcher_spec.rb +110 -0
  52. data/spec/unit/playful/ssdp_spec.rb +214 -0
  53. data/tasks/control_point.html +30 -0
  54. data/tasks/control_point.thor +43 -0
  55. data/tasks/search.thor +128 -0
  56. data/tasks/test_js/FABridge.js +1425 -0
  57. data/tasks/test_js/WebSocketMain.swf +807 -0
  58. data/tasks/test_js/swfobject.js +825 -0
  59. data/tasks/test_js/web_socket.js +1133 -0
  60. data/test/test_ssdp.rb +298 -0
  61. data/test/test_ssdp_notification.rb +74 -0
  62. data/test/test_ssdp_response.rb +31 -0
  63. data/test/test_ssdp_search.rb +23 -0
  64. metadata +339 -0
@@ -0,0 +1,807 @@
1
+
2
+
3
+
4
+ <!DOCTYPE html>
5
+ <html>
6
+ <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# githubog: http://ogp.me/ns/fb/githubog#">
7
+ <meta charset='utf-8'>
8
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
9
+ <title>em-websocket/examples/js/WebSocketMain.swf at master · igrigorik/em-websocket · GitHub</title>
10
+ <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" />
11
+ <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub" />
12
+ <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
13
+
14
+
15
+
16
+
17
+ <meta content="authenticity_token" name="csrf-param" />
18
+ <meta content="/00GNKZoQemif5aIHle39yACwSw8QsWfrzTt0DLSK+c=" name="csrf-token" />
19
+
20
+ <link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github-bbf16587e4cb227e94d4838b0b62e06ad84f2419.css" media="screen" rel="stylesheet" type="text/css" />
21
+ <link href="https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github2-27fd7716e0bafa52297f37784a2d549774dc1969.css" media="screen" rel="stylesheet" type="text/css" />
22
+
23
+
24
+
25
+
26
+ <script src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/frameworks-a450c7f907bdc1ee6b362ab1ecca811c761fd259.js" type="text/javascript"></script>
27
+
28
+ <script defer="defer" src="https://a248.e.akamai.net/assets.github.com/javascripts/bundles/github-962475eecb5a745150445b68592ced09de5cd872.js" type="text/javascript"></script>
29
+
30
+
31
+
32
+ <link rel='permalink' href='/igrigorik/em-websocket/blob/b9d439cd3494db3225587ccf7cb060f4b37a9f13/examples/js/WebSocketMain.swf'>
33
+ <meta property="og:title" content="em-websocket"/>
34
+ <meta property="og:type" content="githubog:gitrepository"/>
35
+ <meta property="og:url" content="https://github.com/igrigorik/em-websocket"/>
36
+ <meta property="og:image" content="https://a248.e.akamai.net/assets.github.com/images/gravatars/gravatar-140.png?1329275960"/>
37
+ <meta property="og:site_name" content="GitHub"/>
38
+ <meta property="og:description" content="EventMachine based WebSocket server. Contribute to em-websocket development by creating an account on GitHub."/>
39
+
40
+ <meta name="description" content="EventMachine based WebSocket server. Contribute to em-websocket development by creating an account on GitHub." />
41
+
42
+ <link href="https://github.com/igrigorik/em-websocket/commits/master.atom" rel="alternate" title="Recent Commits to em-websocket:master" type="application/atom+xml" />
43
+
44
+ </head>
45
+
46
+
47
+ <body class="logged_out page-blob vis-public env-production " data-blob-contribs-enabled="yes">
48
+ <div id="wrapper">
49
+
50
+
51
+
52
+
53
+
54
+ <div id="header" class="true clearfix">
55
+ <div class="container clearfix">
56
+ <a class="site-logo" href="https://github.com/">
57
+ <!--[if IE]>
58
+ <img alt="GitHub" class="github-logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7.png?1323882778" />
59
+ <img alt="GitHub" class="github-logo-hover" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7-hover.png?1324325424" />
60
+ <![endif]-->
61
+ <img alt="GitHub" class="github-logo-4x" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x.png?1337118070" />
62
+ <img alt="GitHub" class="github-logo-4x-hover" height="30" src="https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x-hover.png?1337118070" />
63
+ </a>
64
+
65
+
66
+ <!--
67
+ make sure to use fully qualified URLs here since this nav
68
+ is used on error pages on other domains
69
+ -->
70
+ <ul class="top-nav logged_out">
71
+ <li class="pricing"><a href="https://github.com/plans">Signup and Pricing</a></li>
72
+ <li class="explore"><a href="https://github.com/explore">Explore GitHub</a></li>
73
+ <li class="features"><a href="https://github.com/features">Features</a></li>
74
+ <li class="blog"><a href="https://github.com/blog">Blog</a></li>
75
+ <li class="login"><a href="https://github.com/login?return_to=%2Figrigorik%2Fem-websocket%2Fblob%2Fmaster%2Fexamples%2Fjs%2FWebSocketMain.swf">Login</a></li>
76
+ </ul>
77
+
78
+
79
+
80
+
81
+ </div>
82
+ </div>
83
+
84
+
85
+
86
+ <div class="site hfeed" itemscope itemtype="http://schema.org/WebPage">
87
+ <div class="container hentry">
88
+ <div class="pagehead repohead instapaper_ignore readability-menu">
89
+ <div class="title-actions-bar">
90
+
91
+
92
+
93
+
94
+ <ul class="pagehead-actions">
95
+
96
+
97
+
98
+
99
+ <li>
100
+ <span class="watch-button"><a href="/login?return_to=%2Figrigorik%2Fem-websocket" class="minibutton btn-watch js-toggler-target entice tooltipped leftwards" title="You must be logged in to use this feature" rel="nofollow">Watch</a><a class="social-count js-social-count" href="/igrigorik/em-websocket/watchers">755</a></span>
101
+ </li>
102
+ <li>
103
+ <a href="/login?return_to=%2Figrigorik%2Fem-websocket" class="minibutton btn-fork js-toggler-target fork-button entice tooltipped leftwards" title="You must be logged in to use this feature" rel="nofollow">Fork</a><a href="/igrigorik/em-websocket/network" class="social-count">73</a>
104
+ </li>
105
+
106
+ </ul>
107
+
108
+ <h1 itemscope itemtype="http://data-vocabulary.org/Breadcrumb" class="entry-title public">
109
+ <span class="repo-label"><span>public</span></span>
110
+ <span class="mega-icon mega-icon-public-repo"></span>
111
+ <span class="author vcard">
112
+ <a href="/igrigorik" class="url fn" itemprop="url" rel="author"> <span itemprop="title">igrigorik</span>
113
+ </a></span> /
114
+ <strong><a href="/igrigorik/em-websocket" class="js-current-repository">em-websocket</a></strong>
115
+ </h1>
116
+ </div>
117
+
118
+
119
+
120
+ <ul class="tabs">
121
+ <li><a href="/igrigorik/em-websocket" class="selected" highlight="repo_sourcerepo_downloadsrepo_commitsrepo_tagsrepo_branches">Code</a></li>
122
+ <li><a href="/igrigorik/em-websocket/network" highlight="repo_network">Network</a>
123
+ <li><a href="/igrigorik/em-websocket/pulls" highlight="repo_pulls">Pull Requests <span class='counter'>2</span></a></li>
124
+
125
+ <li><a href="/igrigorik/em-websocket/issues" highlight="repo_issues">Issues <span class='counter'>14</span></a></li>
126
+
127
+ <li><a href="/igrigorik/em-websocket/wiki" highlight="repo_wiki">Wiki</a></li>
128
+
129
+ <li><a href="/igrigorik/em-websocket/graphs" highlight="repo_graphsrepo_contributors">Graphs</a></li>
130
+
131
+ </ul>
132
+
133
+ <div class="frame frame-center tree-finder" style="display:none"
134
+ data-tree-list-url="/igrigorik/em-websocket/tree-list/b9d439cd3494db3225587ccf7cb060f4b37a9f13"
135
+ data-blob-url-prefix="/igrigorik/em-websocket/blob/b9d439cd3494db3225587ccf7cb060f4b37a9f13"
136
+ >
137
+
138
+ <div class="breadcrumb">
139
+ <span class="bold"><a href="/igrigorik/em-websocket">em-websocket</a></span> /
140
+ <input class="tree-finder-input js-navigation-enable" type="text" name="query" autocomplete="off" spellcheck="false">
141
+ </div>
142
+
143
+ <div class="octotip">
144
+ <p>
145
+ <a href="/igrigorik/em-websocket/dismiss-tree-finder-help" class="dismiss js-dismiss-tree-list-help" title="Hide this notice forever" rel="nofollow">Dismiss</a>
146
+ <span class="bold">Octotip:</span> You've activated the <em>file finder</em>
147
+ by pressing <span class="kbd">t</span> Start typing to filter the
148
+ file list. Use <span class="kbd badmono">↑</span> and
149
+ <span class="kbd badmono">↓</span> to navigate,
150
+ <span class="kbd">enter</span> to view files.
151
+ </p>
152
+ </div>
153
+
154
+ <table class="tree-browser" cellpadding="0" cellspacing="0">
155
+ <tr class="js-header"><th>&nbsp;</th><th>name</th></tr>
156
+ <tr class="js-no-results no-results" style="display: none">
157
+ <th colspan="2">No matching files</th>
158
+ </tr>
159
+ <tbody class="js-results-list js-navigation-container">
160
+ </tbody>
161
+ </table>
162
+ </div>
163
+
164
+ <div id="jump-to-line" style="display:none">
165
+ <h2>Jump to Line</h2>
166
+ <form accept-charset="UTF-8">
167
+ <input class="textfield" type="text">
168
+ <div class="full-button">
169
+ <button type="submit" class="classy">
170
+ Go
171
+ </button>
172
+ </div>
173
+ </form>
174
+ </div>
175
+
176
+
177
+ <div class="subnav-bar">
178
+
179
+ <ul class="actions subnav">
180
+ <li><a href="/igrigorik/em-websocket/tags" class="" highlight="repo_tags">Tags <span class="counter">10</span></a></li>
181
+ <li><a href="/igrigorik/em-websocket/downloads" class="blank downloads-blank" highlight="repo_downloads">Downloads <span class="counter">0</span></a></li>
182
+
183
+ </ul>
184
+
185
+ <ul class="scope">
186
+ <li class="switcher">
187
+
188
+ <div class="context-menu-container js-menu-container js-context-menu">
189
+ <a href="#"
190
+ class="minibutton bigger switcher js-menu-target js-commitish-button btn-branch repo-tree"
191
+ data-hotkey="w"
192
+ data-master-branch="master"
193
+ data-ref="master">
194
+ <span><i>branch:</i> master</span>
195
+ </a>
196
+
197
+ <div class="context-pane commitish-context js-menu-content">
198
+ <a href="javascript:;" class="close js-menu-close"><span class="mini-icon mini-icon-remove-close"></span></a>
199
+ <div class="context-title">Switch Branches/Tags</div>
200
+ <div class="context-body pane-selector commitish-selector js-navigation-container">
201
+ <div class="filterbar">
202
+ <input type="text" id="context-commitish-filter-field" class="js-navigation-enable" placeholder="Filter branches/tags" data-filterable />
203
+
204
+ <ul class="tabs">
205
+ <li><a href="#" data-filter="branches" class="selected">Branches</a></li>
206
+ <li><a href="#" data-filter="tags">Tags</a></li>
207
+ </ul>
208
+ </div>
209
+
210
+ <div class="js-filter-tab js-filter-branches" data-filterable-for="context-commitish-filter-field" data-filterable-type=substring>
211
+ <div class="no-results js-not-filterable">Nothing to show</div>
212
+ <div class="commitish-item branch-commitish selector-item js-navigation-item js-navigation-target">
213
+ <h4>
214
+ <a href="/igrigorik/em-websocket/blob/master/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="master" rel="nofollow">master</a>
215
+ </h4>
216
+ </div>
217
+ </div>
218
+
219
+ <div class="js-filter-tab js-filter-tags" style="display:none" data-filterable-for="context-commitish-filter-field" data-filterable-type=substring>
220
+ <div class="no-results js-not-filterable">Nothing to show</div>
221
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
222
+ <h4>
223
+ <a href="/igrigorik/em-websocket/blob/v0.3.6/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.3.6" rel="nofollow">v0.3.6</a>
224
+ </h4>
225
+ </div>
226
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
227
+ <h4>
228
+ <a href="/igrigorik/em-websocket/blob/v0.3.5/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.3.5" rel="nofollow">v0.3.5</a>
229
+ </h4>
230
+ </div>
231
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
232
+ <h4>
233
+ <a href="/igrigorik/em-websocket/blob/v0.3.4/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.3.4" rel="nofollow">v0.3.4</a>
234
+ </h4>
235
+ </div>
236
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
237
+ <h4>
238
+ <a href="/igrigorik/em-websocket/blob/v0.3.3/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.3.3" rel="nofollow">v0.3.3</a>
239
+ </h4>
240
+ </div>
241
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
242
+ <h4>
243
+ <a href="/igrigorik/em-websocket/blob/v0.3.2/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.3.2" rel="nofollow">v0.3.2</a>
244
+ </h4>
245
+ </div>
246
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
247
+ <h4>
248
+ <a href="/igrigorik/em-websocket/blob/v0.3.1/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.3.1" rel="nofollow">v0.3.1</a>
249
+ </h4>
250
+ </div>
251
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
252
+ <h4>
253
+ <a href="/igrigorik/em-websocket/blob/v0.3.0/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.3.0" rel="nofollow">v0.3.0</a>
254
+ </h4>
255
+ </div>
256
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
257
+ <h4>
258
+ <a href="/igrigorik/em-websocket/blob/v0.2.1/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.2.1" rel="nofollow">v0.2.1</a>
259
+ </h4>
260
+ </div>
261
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
262
+ <h4>
263
+ <a href="/igrigorik/em-websocket/blob/v0.2.0/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.2.0" rel="nofollow">v0.2.0</a>
264
+ </h4>
265
+ </div>
266
+ <div class="commitish-item tag-commitish selector-item js-navigation-item js-navigation-target">
267
+ <h4>
268
+ <a href="/igrigorik/em-websocket/blob/v0.1.4/examples/js/WebSocketMain.swf" class="js-navigation-open" data-name="v0.1.4" rel="nofollow">v0.1.4</a>
269
+ </h4>
270
+ </div>
271
+ </div>
272
+ </div>
273
+ </div><!-- /.commitish-context-context -->
274
+ </div>
275
+
276
+ </li>
277
+ </ul>
278
+
279
+ <ul class="subnav with-scope">
280
+
281
+ <li><a href="/igrigorik/em-websocket" class="selected" highlight="repo_source">Files</a></li>
282
+ <li><a href="/igrigorik/em-websocket/commits/master" highlight="repo_commits">Commits</a></li>
283
+ <li><a href="/igrigorik/em-websocket/branches" class="" highlight="repo_branches" rel="nofollow">Branches <span class="counter">1</span></a></li>
284
+ </ul>
285
+
286
+ </div>
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+ </div><!-- /.repohead -->
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+ <!-- block_view_fragment_key: views10/v8/blob:v21:94f3a5a925efb3e5d1158fd63e87ddaf -->
304
+ <div id="slider">
305
+
306
+ <div class="breadcrumb" data-path="examples/js/WebSocketMain.swf/">
307
+ <b itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/igrigorik/em-websocket/tree/b9d439cd3494db3225587ccf7cb060f4b37a9f13" class="js-rewrite-sha" itemprop="url"><span itemprop="title">em-websocket</span></a></b> / <span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/igrigorik/em-websocket/tree/b9d439cd3494db3225587ccf7cb060f4b37a9f13/examples" class="js-rewrite-sha" itemscope="url"><span itemprop="title">examples</span></a></span> / <span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/igrigorik/em-websocket/tree/b9d439cd3494db3225587ccf7cb060f4b37a9f13/examples/js" class="js-rewrite-sha" itemscope="url"><span itemprop="title">js</span></a></span> / <strong class="final-path">WebSocketMain.swf</strong> <span class="js-clippy mini-icon mini-icon-clippy " data-clipboard-text="examples/js/WebSocketMain.swf" data-copied-hint="copied!" data-copy-hint="copy to clipboard"></span>
308
+ </div>
309
+
310
+
311
+ <div class="commit file-history-tease" data-path="examples/js/WebSocketMain.swf/">
312
+ <img class="main-avatar" height="24" src="https://secure.gravatar.com/avatar/aeecf4f1c835bc7d53021bac0a8a7da9?s=140&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png" width="24" />
313
+ <span class="author">Bernard Potocki</span>
314
+ <time class="js-relative-date" datetime="2010-04-17T10:55:19-07:00" title="2010-04-17 10:55:19">April 17, 2010</time>
315
+ <div class="commit-title">
316
+ <a href="/igrigorik/em-websocket/commit/12e69e7b2793a134ae81a81dc0f3d035bb6a3393" class="message">Example of use in browser not supporting WebSocket using web-socket-js.</a>
317
+ </div>
318
+
319
+ <div class="participation">
320
+ <p class="quickstat"><a href="#blob_contributors_box" rel="facebox"><strong>0</strong> contributors</a></p>
321
+
322
+ </div>
323
+ <div id="blob_contributors_box" style="display:none">
324
+ <h2>Users on GitHub who have contributed to this file</h2>
325
+ <ul class="facebox-user-list">
326
+ </ul>
327
+ </div>
328
+ </div>
329
+
330
+ <div class="frames">
331
+ <div class="frame frame-center" data-path="examples/js/WebSocketMain.swf/" data-permalink-url="/igrigorik/em-websocket/blob/b9d439cd3494db3225587ccf7cb060f4b37a9f13/examples/js/WebSocketMain.swf" data-title="em-websocket/examples/js/WebSocketMain.swf at master · igrigorik/em-websocket · GitHub" data-type="blob">
332
+
333
+ <div id="files" class="bubble">
334
+ <div class="file">
335
+ <div class="meta">
336
+ <div class="info">
337
+ <span class="icon"><b class="mini-icon mini-icon-text-file"></b></span>
338
+ <span class="mode" title="File Mode">100644</span>
339
+ <span>11.791 kb</span>
340
+ </div>
341
+ <ul class="button-group actions">
342
+
343
+ <li>
344
+ <a href="/igrigorik/em-websocket/raw/master/examples/js/WebSocketMain.swf" class="minibutton btn-raw grouped-button bigger lighter" id="raw-url">Raw</a>
345
+ </li>
346
+ <li>
347
+ <a href="/igrigorik/em-websocket/commits/master/examples/js/WebSocketMain.swf" class="minibutton btn-history grouped-button bigger lighter" rel="nofollow">History</a>
348
+ </li>
349
+ </ul>
350
+ </div>
351
+ <div class="data type-text">
352
+ <div class="image">
353
+ <a href="/igrigorik/em-websocket/blob/master/examples/js/WebSocketMain.swf?raw=true">View Raw</a>
354
+ </div>
355
+ </div>
356
+
357
+ </div>
358
+ </div>
359
+ </div>
360
+ </div>
361
+
362
+ </div>
363
+
364
+ <div class="frame frame-loading large-loading-area" style="display:none;" data-tree-list-url="/igrigorik/em-websocket/tree-list/b9d439cd3494db3225587ccf7cb060f4b37a9f13" data-blob-url-prefix="/igrigorik/em-websocket/blob/b9d439cd3494db3225587ccf7cb060f4b37a9f13">
365
+ <img src="https://a248.e.akamai.net/assets.github.com/images/spinners/octocat-spinner-64.gif?1329872008" height="64" width="64">
366
+ </div>
367
+
368
+ </div>
369
+ <div class="context-overlay"></div>
370
+ </div>
371
+
372
+ <div id="footer-push"></div><!-- hack for sticky footer -->
373
+ </div><!-- end of wrapper - hack for sticky footer -->
374
+
375
+ <!-- footer -->
376
+ <div id="footer" >
377
+
378
+ <div class="upper_footer">
379
+ <div class="container clearfix">
380
+
381
+ <!--[if IE]><h4 id="blacktocat_ie">GitHub Links</h4><![endif]-->
382
+ <![if !IE]><h4 id="blacktocat">GitHub Links</h4><![endif]>
383
+
384
+ <ul class="footer_nav">
385
+ <h4>GitHub</h4>
386
+ <li><a href="https://github.com/about">About</a></li>
387
+ <li><a href="https://github.com/blog">Blog</a></li>
388
+ <li><a href="https://github.com/features">Features</a></li>
389
+ <li><a href="https://github.com/contact">Contact &amp; Support</a></li>
390
+ <li><a href="https://github.com/training">Training</a></li>
391
+ <li><a href="http://enterprise.github.com/">GitHub Enterprise</a></li>
392
+ <li><a href="http://status.github.com/">Site Status</a></li>
393
+ </ul>
394
+
395
+ <ul class="footer_nav">
396
+ <h4>Tools</h4>
397
+ <li><a href="http://get.gaug.es/">Gauges: Analyze web traffic</a></li>
398
+ <li><a href="http://speakerdeck.com">Speaker Deck: Presentations</a></li>
399
+ <li><a href="https://gist.github.com">Gist: Code snippets</a></li>
400
+ <li><a href="http://mac.github.com/">GitHub for Mac</a></li>
401
+ <li><a href="http://windows.github.com/">GitHub for Windows</a></li>
402
+ <li><a href="http://mobile.github.com/">Issues for iPhone</a></li>
403
+ <li><a href="http://jobs.github.com/">Job Board</a></li>
404
+ </ul>
405
+
406
+ <ul class="footer_nav">
407
+ <h4>Extras</h4>
408
+ <li><a href="http://shop.github.com/">GitHub Shop</a></li>
409
+ <li><a href="http://octodex.github.com/">The Octodex</a></li>
410
+ </ul>
411
+
412
+ <ul class="footer_nav">
413
+ <h4>Documentation</h4>
414
+ <li><a href="http://help.github.com/">GitHub Help</a></li>
415
+ <li><a href="http://developer.github.com/">Developer API</a></li>
416
+ <li><a href="http://github.github.com/github-flavored-markdown/">GitHub Flavored Markdown</a></li>
417
+ <li><a href="http://pages.github.com/">GitHub Pages</a></li>
418
+ </ul>
419
+
420
+ </div><!-- /.site -->
421
+ </div><!-- /.upper_footer -->
422
+
423
+ <div class="lower_footer">
424
+ <div class="container clearfix">
425
+ <!--[if IE]><div id="legal_ie"><![endif]-->
426
+ <![if !IE]><div id="legal"><![endif]>
427
+ <ul>
428
+ <li><a href="https://github.com/site/terms">Terms of Service</a></li>
429
+ <li><a href="https://github.com/site/privacy">Privacy</a></li>
430
+ <li><a href="https://github.com/security">Security</a></li>
431
+ </ul>
432
+
433
+ <p>&copy; 2012 <span title="0.11439s from fe6.rs.github.com">GitHub</span> Inc. All rights reserved.</p>
434
+ </div><!-- /#legal or /#legal_ie-->
435
+
436
+ <div class="sponsor">
437
+ <a href="http://www.rackspace.com" class="logo">
438
+ <img alt="Dedicated Server" height="36" src="https://a248.e.akamai.net/assets.github.com/images/modules/footer/rackspaces_logo.png?1329521041" width="38" />
439
+ </a>
440
+ Powered by the <a href="http://www.rackspace.com ">Dedicated
441
+ Servers</a> and<br/> <a href="http://www.rackspacecloud.com">Cloud
442
+ Computing</a> of Rackspace Hosting<span>&reg;</span>
443
+ </div>
444
+ </div><!-- /.site -->
445
+ </div><!-- /.lower_footer -->
446
+
447
+ </div><!-- /#footer -->
448
+
449
+
450
+
451
+ <div id="keyboard_shortcuts_pane" class="instapaper_ignore readability-extra" style="display:none">
452
+ <h2>Keyboard Shortcuts <small><a href="#" class="js-see-all-keyboard-shortcuts">(see all)</a></small></h2>
453
+
454
+ <div class="columns threecols">
455
+ <div class="column first">
456
+ <h3>Site wide shortcuts</h3>
457
+ <dl class="keyboard-mappings">
458
+ <dt>s</dt>
459
+ <dd>Focus site search</dd>
460
+ </dl>
461
+ <dl class="keyboard-mappings">
462
+ <dt>?</dt>
463
+ <dd>Bring up this help dialog</dd>
464
+ </dl>
465
+ </div><!-- /.column.first -->
466
+
467
+ <div class="column middle" style='display:none'>
468
+ <h3>Commit list</h3>
469
+ <dl class="keyboard-mappings">
470
+ <dt>j</dt>
471
+ <dd>Move selection down</dd>
472
+ </dl>
473
+ <dl class="keyboard-mappings">
474
+ <dt>k</dt>
475
+ <dd>Move selection up</dd>
476
+ </dl>
477
+ <dl class="keyboard-mappings">
478
+ <dt>c <em>or</em> o <em>or</em> enter</dt>
479
+ <dd>Open commit</dd>
480
+ </dl>
481
+ <dl class="keyboard-mappings">
482
+ <dt>y</dt>
483
+ <dd>Expand URL to its canonical form</dd>
484
+ </dl>
485
+ </div><!-- /.column.first -->
486
+
487
+ <div class="column last" style='display:none'>
488
+ <h3>Pull request list</h3>
489
+ <dl class="keyboard-mappings">
490
+ <dt>j</dt>
491
+ <dd>Move selection down</dd>
492
+ </dl>
493
+ <dl class="keyboard-mappings">
494
+ <dt>k</dt>
495
+ <dd>Move selection up</dd>
496
+ </dl>
497
+ <dl class="keyboard-mappings">
498
+ <dt>o <em>or</em> enter</dt>
499
+ <dd>Open issue</dd>
500
+ </dl>
501
+ <dl class="keyboard-mappings">
502
+ <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt>
503
+ <dd>Submit comment</dd>
504
+ </dl>
505
+ </div><!-- /.columns.last -->
506
+
507
+ </div><!-- /.columns.equacols -->
508
+
509
+ <div style='display:none'>
510
+ <div class="rule"></div>
511
+
512
+ <h3>Issues</h3>
513
+
514
+ <div class="columns threecols">
515
+ <div class="column first">
516
+ <dl class="keyboard-mappings">
517
+ <dt>j</dt>
518
+ <dd>Move selection down</dd>
519
+ </dl>
520
+ <dl class="keyboard-mappings">
521
+ <dt>k</dt>
522
+ <dd>Move selection up</dd>
523
+ </dl>
524
+ <dl class="keyboard-mappings">
525
+ <dt>x</dt>
526
+ <dd>Toggle selection</dd>
527
+ </dl>
528
+ <dl class="keyboard-mappings">
529
+ <dt>o <em>or</em> enter</dt>
530
+ <dd>Open issue</dd>
531
+ </dl>
532
+ <dl class="keyboard-mappings">
533
+ <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt>
534
+ <dd>Submit comment</dd>
535
+ </dl>
536
+ </div><!-- /.column.first -->
537
+ <div class="column last">
538
+ <dl class="keyboard-mappings">
539
+ <dt>c</dt>
540
+ <dd>Create issue</dd>
541
+ </dl>
542
+ <dl class="keyboard-mappings">
543
+ <dt>l</dt>
544
+ <dd>Create label</dd>
545
+ </dl>
546
+ <dl class="keyboard-mappings">
547
+ <dt>i</dt>
548
+ <dd>Back to inbox</dd>
549
+ </dl>
550
+ <dl class="keyboard-mappings">
551
+ <dt>u</dt>
552
+ <dd>Back to issues</dd>
553
+ </dl>
554
+ <dl class="keyboard-mappings">
555
+ <dt>/</dt>
556
+ <dd>Focus issues search</dd>
557
+ </dl>
558
+ </div>
559
+ </div>
560
+ </div>
561
+
562
+ <div style='display:none'>
563
+ <div class="rule"></div>
564
+
565
+ <h3>Issues Dashboard</h3>
566
+
567
+ <div class="columns threecols">
568
+ <div class="column first">
569
+ <dl class="keyboard-mappings">
570
+ <dt>j</dt>
571
+ <dd>Move selection down</dd>
572
+ </dl>
573
+ <dl class="keyboard-mappings">
574
+ <dt>k</dt>
575
+ <dd>Move selection up</dd>
576
+ </dl>
577
+ <dl class="keyboard-mappings">
578
+ <dt>o <em>or</em> enter</dt>
579
+ <dd>Open issue</dd>
580
+ </dl>
581
+ </div><!-- /.column.first -->
582
+ </div>
583
+ </div>
584
+
585
+ <div style='display:none'>
586
+ <div class="rule"></div>
587
+
588
+ <h3>Network Graph</h3>
589
+ <div class="columns equacols">
590
+ <div class="column first">
591
+ <dl class="keyboard-mappings">
592
+ <dt><span class="badmono">←</span> <em>or</em> h</dt>
593
+ <dd>Scroll left</dd>
594
+ </dl>
595
+ <dl class="keyboard-mappings">
596
+ <dt><span class="badmono">→</span> <em>or</em> l</dt>
597
+ <dd>Scroll right</dd>
598
+ </dl>
599
+ <dl class="keyboard-mappings">
600
+ <dt><span class="badmono">↑</span> <em>or</em> k</dt>
601
+ <dd>Scroll up</dd>
602
+ </dl>
603
+ <dl class="keyboard-mappings">
604
+ <dt><span class="badmono">↓</span> <em>or</em> j</dt>
605
+ <dd>Scroll down</dd>
606
+ </dl>
607
+ <dl class="keyboard-mappings">
608
+ <dt>t</dt>
609
+ <dd>Toggle visibility of head labels</dd>
610
+ </dl>
611
+ </div><!-- /.column.first -->
612
+ <div class="column last">
613
+ <dl class="keyboard-mappings">
614
+ <dt>shift <span class="badmono">←</span> <em>or</em> shift h</dt>
615
+ <dd>Scroll all the way left</dd>
616
+ </dl>
617
+ <dl class="keyboard-mappings">
618
+ <dt>shift <span class="badmono">→</span> <em>or</em> shift l</dt>
619
+ <dd>Scroll all the way right</dd>
620
+ </dl>
621
+ <dl class="keyboard-mappings">
622
+ <dt>shift <span class="badmono">↑</span> <em>or</em> shift k</dt>
623
+ <dd>Scroll all the way up</dd>
624
+ </dl>
625
+ <dl class="keyboard-mappings">
626
+ <dt>shift <span class="badmono">↓</span> <em>or</em> shift j</dt>
627
+ <dd>Scroll all the way down</dd>
628
+ </dl>
629
+ </div><!-- /.column.last -->
630
+ </div>
631
+ </div>
632
+
633
+ <div >
634
+ <div class="rule"></div>
635
+ <div class="columns threecols">
636
+ <div class="column first" >
637
+ <h3>Source Code Browsing</h3>
638
+ <dl class="keyboard-mappings">
639
+ <dt>t</dt>
640
+ <dd>Activates the file finder</dd>
641
+ </dl>
642
+ <dl class="keyboard-mappings">
643
+ <dt>l</dt>
644
+ <dd>Jump to line</dd>
645
+ </dl>
646
+ <dl class="keyboard-mappings">
647
+ <dt>w</dt>
648
+ <dd>Switch branch/tag</dd>
649
+ </dl>
650
+ <dl class="keyboard-mappings">
651
+ <dt>y</dt>
652
+ <dd>Expand URL to its canonical form</dd>
653
+ </dl>
654
+ </div>
655
+ </div>
656
+ </div>
657
+
658
+ <div style='display:none'>
659
+ <div class="rule"></div>
660
+ <div class="columns threecols">
661
+ <div class="column first">
662
+ <h3>Browsing Commits</h3>
663
+ <dl class="keyboard-mappings">
664
+ <dt><span class="platform-mac">⌘</span><span class="platform-other">ctrl</span> <em>+</em> enter</dt>
665
+ <dd>Submit comment</dd>
666
+ </dl>
667
+ <dl class="keyboard-mappings">
668
+ <dt>escape</dt>
669
+ <dd>Close form</dd>
670
+ </dl>
671
+ <dl class="keyboard-mappings">
672
+ <dt>p</dt>
673
+ <dd>Parent commit</dd>
674
+ </dl>
675
+ <dl class="keyboard-mappings">
676
+ <dt>o</dt>
677
+ <dd>Other parent commit</dd>
678
+ </dl>
679
+ </div>
680
+ </div>
681
+ </div>
682
+ </div>
683
+
684
+ <div id="markdown-help" class="instapaper_ignore readability-extra">
685
+ <h2>Markdown Cheat Sheet</h2>
686
+
687
+ <div class="cheatsheet-content">
688
+
689
+ <div class="mod">
690
+ <div class="col">
691
+ <h3>Format Text</h3>
692
+ <p>Headers</p>
693
+ <pre>
694
+ # This is an &lt;h1&gt; tag
695
+ ## This is an &lt;h2&gt; tag
696
+ ###### This is an &lt;h6&gt; tag</pre>
697
+ <p>Text styles</p>
698
+ <pre>
699
+ *This text will be italic*
700
+ _This will also be italic_
701
+ **This text will be bold**
702
+ __This will also be bold__
703
+
704
+ *You **can** combine them*
705
+ </pre>
706
+ </div>
707
+ <div class="col">
708
+ <h3>Lists</h3>
709
+ <p>Unordered</p>
710
+ <pre>
711
+ * Item 1
712
+ * Item 2
713
+ * Item 2a
714
+ * Item 2b</pre>
715
+ <p>Ordered</p>
716
+ <pre>
717
+ 1. Item 1
718
+ 2. Item 2
719
+ 3. Item 3
720
+ * Item 3a
721
+ * Item 3b</pre>
722
+ </div>
723
+ <div class="col">
724
+ <h3>Miscellaneous</h3>
725
+ <p>Images</p>
726
+ <pre>
727
+ ![GitHub Logo](/images/logo.png)
728
+ Format: ![Alt Text](url)
729
+ </pre>
730
+ <p>Links</p>
731
+ <pre>
732
+ http://github.com - automatic!
733
+ [GitHub](http://github.com)</pre>
734
+ <p>Blockquotes</p>
735
+ <pre>
736
+ As Kanye West said:
737
+
738
+ > We're living the future so
739
+ > the present is our past.
740
+ </pre>
741
+ </div>
742
+ </div>
743
+ <div class="rule"></div>
744
+
745
+ <h3>Code Examples in Markdown</h3>
746
+ <div class="col">
747
+ <p>Syntax highlighting with <a href="http://github.github.com/github-flavored-markdown/" title="GitHub Flavored Markdown" target="_blank">GFM</a></p>
748
+ <pre>
749
+ ```javascript
750
+ function fancyAlert(arg) {
751
+ if(arg) {
752
+ $.facebox({div:'#foo'})
753
+ }
754
+ }
755
+ ```</pre>
756
+ </div>
757
+ <div class="col">
758
+ <p>Or, indent your code 4 spaces</p>
759
+ <pre>
760
+ Here is a Python code example
761
+ without syntax highlighting:
762
+
763
+ def foo:
764
+ if not bar:
765
+ return true</pre>
766
+ </div>
767
+ <div class="col">
768
+ <p>Inline code for comments</p>
769
+ <pre>
770
+ I think you should use an
771
+ `&lt;addr&gt;` element here instead.</pre>
772
+ </div>
773
+ </div>
774
+
775
+ </div>
776
+ </div>
777
+
778
+
779
+ <div id="ajax-error-message">
780
+ <span class="mini-icon mini-icon-exclamation"></span>
781
+ Something went wrong with that request. Please try again.
782
+ <a href="#" class="ajax-error-dismiss">Dismiss</a>
783
+ </div>
784
+
785
+ <div id="logo-popup">
786
+ <h2>Looking for the GitHub logo?</h2>
787
+ <ul>
788
+ <li>
789
+ <h4>GitHub Logo</h4>
790
+ <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip"><img alt="Github_logo" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/github_logo.png?1306884371" /></a>
791
+ <a href="http://github-media-downloads.s3.amazonaws.com/GitHub_Logos.zip" class="minibutton btn-download download">Download</a>
792
+ </li>
793
+ <li>
794
+ <h4>The Octocat</h4>
795
+ <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip"><img alt="Octocat" src="https://a248.e.akamai.net/assets.github.com/images/modules/about_page/octocat.png?1306884371" /></a>
796
+ <a href="http://github-media-downloads.s3.amazonaws.com/Octocats.zip" class="minibutton btn-download download">Download</a>
797
+ </li>
798
+ </ul>
799
+ </div>
800
+
801
+
802
+
803
+
804
+ <span id='server_response_time' data-time='0.11641' data-host='fe6'></span>
805
+ </body>
806
+ </html>
807
+