celluloid_pubsub 0.0.5 → 0.0.6

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.
@@ -0,0 +1,3502 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ Class: CelluloidPubsub::Reactor
8
+
9
+ &mdash; Documentation by YARD 0.8.7.6
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="../css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="../css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '../';
20
+ framesUrl = "../frames.html#!CelluloidPubsub/Reactor.html";
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="../js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="../_index.html">Index (R)</a> &raquo;
35
+ <span class='title'><span class='object_link'><a href="../CelluloidPubsub.html" title="CelluloidPubsub (module)">CelluloidPubsub</a></span></span>
36
+ &raquo;
37
+ <span class="title">Reactor</span>
38
+
39
+
40
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
41
+ </div>
42
+
43
+ <div id="search">
44
+
45
+ <a class="full_list_link" id="class_list_link"
46
+ href="../class_list.html">
47
+ Class List
48
+ </a>
49
+
50
+ <a class="full_list_link" id="method_list_link"
51
+ href="../method_list.html">
52
+ Method List
53
+ </a>
54
+
55
+ <a class="full_list_link" id="file_list_link"
56
+ href="../file_list.html">
57
+ File List
58
+ </a>
59
+
60
+ </div>
61
+ <div class="clear"></div>
62
+ </div>
63
+
64
+ <iframe id="search_frame"></iframe>
65
+
66
+ <div id="content"><h1>Class: CelluloidPubsub::Reactor
67
+
68
+
69
+
70
+ </h1>
71
+
72
+ <dl class="box">
73
+
74
+ <dt class="r1">Inherits:</dt>
75
+ <dd class="r1">
76
+ <span class="inheritName">Object</span>
77
+
78
+ <ul class="fullTree">
79
+ <li>Object</li>
80
+
81
+ <li class="next">CelluloidPubsub::Reactor</li>
82
+
83
+ </ul>
84
+ <a href="#" class="inheritanceTree">show all</a>
85
+
86
+ </dd>
87
+
88
+
89
+
90
+
91
+
92
+
93
+ <dt class="r2">Includes:</dt>
94
+ <dd class="r2">Celluloid, Celluloid::IO, Celluloid::Logger</dd>
95
+
96
+
97
+
98
+
99
+
100
+ <dt class="r1 last">Defined in:</dt>
101
+ <dd class="r1 last">lib/celluloid_pubsub/reactor.rb</dd>
102
+
103
+ </dl>
104
+ <div class="clear"></div>
105
+
106
+ <h2>Overview</h2><div class="docstring">
107
+ <div class="discussion">
108
+
109
+ <p>The reactor handles new connections. Based on what the client sends it
110
+ either subscribes to a channel or will publish to a channel or just
111
+ dispatch to the server if command is neither subscribe, publish or
112
+ unsubscribe</p>
113
+
114
+
115
+ </div>
116
+ </div>
117
+ <div class="tags">
118
+
119
+
120
+ </div>
121
+
122
+
123
+
124
+ <h2>Instance Attribute Summary <small>(<a href="#" class="summary_toggle">collapse</a>)</small></h2>
125
+ <ul class="summary">
126
+
127
+ <li class="public ">
128
+ <span class="summary_signature">
129
+
130
+ <a href="#channels-instance_method" title="#channels (instance method)">- (Array) <strong>channels</strong> </a>
131
+
132
+
133
+
134
+ </span>
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+ <span class="summary_desc"><div class='inline'>
148
+ <p>Array of channels to which the current reactor has subscribed to.</p>
149
+ </div></span>
150
+
151
+ </li>
152
+
153
+
154
+ <li class="public ">
155
+ <span class="summary_signature">
156
+
157
+ <a href="#mutex-instance_method" title="#mutex (instance method)">- (Mutex) <strong>mutex</strong> </a>
158
+
159
+
160
+
161
+ </span>
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+ <span class="summary_desc"><div class='inline'>
175
+ <p>Mutex used to lock when subscribing to a channel.</p>
176
+ </div></span>
177
+
178
+ </li>
179
+
180
+
181
+ <li class="public ">
182
+ <span class="summary_signature">
183
+
184
+ <a href="#server-instance_method" title="#server (instance method)">- (CelluloidPubsub::Webserver) <strong>server</strong> </a>
185
+
186
+
187
+
188
+ </span>
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+ <span class="summary_desc"><div class='inline'>
202
+ <p>The server actor to which the reactor is connected to.</p>
203
+ </div></span>
204
+
205
+ </li>
206
+
207
+
208
+ <li class="public ">
209
+ <span class="summary_signature">
210
+
211
+ <a href="#websocket-instance_method" title="#websocket (instance method)">- (Reel::WebSocket) <strong>websocket</strong> </a>
212
+
213
+
214
+
215
+ </span>
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+ <span class="summary_desc"><div class='inline'>
229
+ <p>Websocket connection.</p>
230
+ </div></span>
231
+
232
+ </li>
233
+
234
+
235
+ </ul>
236
+
237
+
238
+
239
+
240
+
241
+ <h2>
242
+ Instance Method Summary
243
+ <small>(<a href="#" class="summary_toggle">collapse</a>)</small>
244
+ </h2>
245
+
246
+ <ul class="summary">
247
+
248
+ <li class="public ">
249
+ <span class="summary_signature">
250
+
251
+ <a href="#add_subscriber_to_channel-instance_method" title="#add_subscriber_to_channel (instance method)">- (void) <strong>add_subscriber_to_channel</strong>(channel, message) </a>
252
+
253
+
254
+
255
+ </span>
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+ <span class="summary_desc"><div class='inline'>
266
+ <p>adds the curent actor the list of the subscribers for a particular channel
267
+ and registers the new channel.</p>
268
+ </div></span>
269
+
270
+ </li>
271
+
272
+
273
+ <li class="public ">
274
+ <span class="summary_signature">
275
+
276
+ <a href="#delegate_action-instance_method" title="#delegate_action (instance method)">- (void) <strong>delegate_action</strong>(json_data) </a>
277
+
278
+
279
+
280
+ </span>
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+ <span class="summary_desc"><div class='inline'>
291
+ <p>method that checks if the data is a Hash.</p>
292
+ </div></span>
293
+
294
+ </li>
295
+
296
+
297
+ <li class="public ">
298
+ <span class="summary_signature">
299
+
300
+ <a href="#handle_parsed_websocket_message-instance_method" title="#handle_parsed_websocket_message (instance method)">- (void) <strong>handle_parsed_websocket_message</strong>(json_data) </a>
301
+
302
+
303
+
304
+ </span>
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+
314
+ <span class="summary_desc"><div class='inline'>
315
+ <p>method that checks if the data is a Hash.</p>
316
+ </div></span>
317
+
318
+ </li>
319
+
320
+
321
+ <li class="public ">
322
+ <span class="summary_signature">
323
+
324
+ <a href="#handle_unknown_action-instance_method" title="#handle_unknown_action (instance method)">- (void) <strong>handle_unknown_action</strong>(json_data) </a>
325
+
326
+
327
+
328
+ </span>
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+ <span class="summary_desc"><div class='inline'>
339
+ <p>the method will delegate the message to the server in an asyncronous way by
340
+ sending the current actor and the message.</p>
341
+ </div></span>
342
+
343
+ </li>
344
+
345
+
346
+ <li class="public ">
347
+ <span class="summary_signature">
348
+
349
+ <a href="#handle_websocket_message-instance_method" title="#handle_websocket_message (instance method)">- (void) <strong>handle_websocket_message</strong>(message) </a>
350
+
351
+
352
+
353
+ </span>
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+ <span class="summary_desc"><div class='inline'>
364
+ <p>method that handles the message received from the websocket connection
365
+ first will try to parse the message <span class='object_link'><a href="#parse_json_data-instance_method" title="CelluloidPubsub::Reactor#parse_json_data (method)">#parse_json_data</a></span> and then it will
366
+ dispatch it to another method that will decide depending the message what
367
+ action should the reactor take <span class='object_link'><a href="#handle_parsed_websocket_message-instance_method" title="CelluloidPubsub::Reactor#handle_parsed_websocket_message (method)">#handle_parsed_websocket_message</a></span>.</p>
368
+ </div></span>
369
+
370
+ </li>
371
+
372
+
373
+ <li class="public ">
374
+ <span class="summary_signature">
375
+
376
+ <a href="#parse_json_data-instance_method" title="#parse_json_data (instance method)">- (Hash) <strong>parse_json_data</strong>(message) </a>
377
+
378
+
379
+
380
+ </span>
381
+
382
+
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+ <span class="summary_desc"><div class='inline'>
391
+ <p>method used to parse a JSON object into a Hash object.</p>
392
+ </div></span>
393
+
394
+ </li>
395
+
396
+
397
+ <li class="public ">
398
+ <span class="summary_signature">
399
+
400
+ <a href="#run-instance_method" title="#run (instance method)">- (void) <strong>run</strong> </a>
401
+
402
+
403
+
404
+ </span>
405
+
406
+
407
+
408
+
409
+
410
+
411
+
412
+
413
+
414
+ <span class="summary_desc"><div class='inline'>
415
+ <p>reads from the socket the message and dispatches it to the
416
+ handle_websocket_message method.</p>
417
+ </div></span>
418
+
419
+ </li>
420
+
421
+
422
+ <li class="public ">
423
+ <span class="summary_signature">
424
+
425
+ <a href="#shutdown-instance_method" title="#shutdown (instance method)">- (void) <strong>shutdown</strong> </a>
426
+
427
+
428
+
429
+ </span>
430
+
431
+
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+ <span class="summary_desc"><div class='inline'>
440
+ <p>the method will terminate the current actor.</p>
441
+ </div></span>
442
+
443
+ </li>
444
+
445
+
446
+ <li class="public ">
447
+ <span class="summary_signature">
448
+
449
+ <a href="#start_subscriber-instance_method" title="#start_subscriber (instance method)">- (void) <strong>start_subscriber</strong>(channel, message) </a>
450
+
451
+
452
+
453
+ </span>
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+ <span class="summary_desc"><div class='inline'>
464
+ <p>this method will add the current actor to the list of the subscribers
465
+ <span class='object_link'><a href="#add_subscriber_to_channel-instance_method" title="CelluloidPubsub::Reactor#add_subscriber_to_channel (method)">#add_subscriber_to_channel</a></span> and will write to the socket a message for
466
+ succesful subscription.</p>
467
+ </div></span>
468
+
469
+ </li>
470
+
471
+
472
+ <li class="public ">
473
+ <span class="summary_signature">
474
+
475
+ <a href="#unsubscribe_all-instance_method" title="#unsubscribe_all (instance method)">- (void) <strong>unsubscribe_all</strong> </a>
476
+
477
+
478
+
479
+ </span>
480
+
481
+
482
+
483
+
484
+
485
+
486
+
487
+
488
+
489
+ <span class="summary_desc"><div class='inline'>
490
+ <p>unsubscribes all actors from all channels and terminates the curent actor.</p>
491
+ </div></span>
492
+
493
+ </li>
494
+
495
+
496
+ <li class="public ">
497
+ <span class="summary_signature">
498
+
499
+ <a href="#unsubscribe_client-instance_method" title="#unsubscribe_client (instance method)">- (void) <strong>unsubscribe_client</strong>(channel) </a>
500
+
501
+
502
+
503
+ </span>
504
+
505
+
506
+
507
+
508
+
509
+
510
+
511
+
512
+
513
+ <span class="summary_desc"><div class='inline'>
514
+ <p>the method will unsubscribe a client by closing the websocket connection if
515
+ has unscribed from all channels and deleting the reactor from the channel
516
+ list on the server.</p>
517
+ </div></span>
518
+
519
+ </li>
520
+
521
+
522
+ <li class="public ">
523
+ <span class="summary_signature">
524
+
525
+ <a href="#work-instance_method" title="#work (instance method)">- (void) <strong>work</strong>(websocket, server) </a>
526
+
527
+
528
+
529
+ </span>
530
+
531
+
532
+
533
+
534
+
535
+
536
+
537
+
538
+
539
+ <span class="summary_desc"><div class='inline'>
540
+ <p>rececives a new socket connection from the server and initiates a new
541
+ mutex that can be used when subsribing to a channel.</p>
542
+ </div></span>
543
+
544
+ </li>
545
+
546
+
547
+ </ul>
548
+
549
+
550
+
551
+
552
+
553
+
554
+ <div id="instance_attr_details" class="attr_details">
555
+ <h2>Instance Attribute Details</h2>
556
+
557
+
558
+ <span id="channels=-instance_method"></span>
559
+ <div class="method_details first">
560
+ <h3 class="signature first" id="channels-instance_method">
561
+
562
+ - (<tt>Array</tt>) <strong>channels</strong>
563
+
564
+
565
+
566
+
567
+
568
+ </h3><div class="docstring">
569
+ <div class="discussion">
570
+
571
+ <p>Returns array of channels to which the current reactor has subscribed to</p>
572
+
573
+
574
+ </div>
575
+ </div>
576
+ <div class="tags">
577
+
578
+ <p class="tag_title">Returns:</p>
579
+ <ul class="return">
580
+
581
+ <li>
582
+
583
+
584
+ <span class='type'>(<tt>Array</tt>)</span>
585
+
586
+
587
+
588
+ &mdash;
589
+ <div class='inline'>
590
+ <p>array of channels to which the current reactor has subscribed to</p>
591
+ </div>
592
+
593
+ </li>
594
+
595
+ </ul>
596
+
597
+ </div><table class="source_code">
598
+ <tr>
599
+ <td>
600
+ <pre class="lines">
601
+
602
+
603
+ 16
604
+ 17
605
+ 18
606
+ 19
607
+ 20
608
+ 21
609
+ 22
610
+ 23
611
+ 24
612
+ 25
613
+ 26
614
+ 27
615
+ 28
616
+ 29
617
+ 30
618
+ 31
619
+ 32
620
+ 33
621
+ 34
622
+ 35
623
+ 36
624
+ 37
625
+ 38
626
+ 39
627
+ 40
628
+ 41
629
+ 42
630
+ 43
631
+ 44
632
+ 45
633
+ 46
634
+ 47
635
+ 48
636
+ 49
637
+ 50
638
+ 51
639
+ 52
640
+ 53
641
+ 54
642
+ 55
643
+ 56
644
+ 57
645
+ 58
646
+ 59
647
+ 60
648
+ 61
649
+ 62
650
+ 63
651
+ 64
652
+ 65
653
+ 66
654
+ 67
655
+ 68
656
+ 69
657
+ 70
658
+ 71
659
+ 72
660
+ 73
661
+ 74
662
+ 75
663
+ 76
664
+ 77
665
+ 78
666
+ 79
667
+ 80
668
+ 81
669
+ 82
670
+ 83
671
+ 84
672
+ 85
673
+ 86
674
+ 87
675
+ 88
676
+ 89
677
+ 90
678
+ 91
679
+ 92
680
+ 93
681
+ 94
682
+ 95
683
+ 96
684
+ 97
685
+ 98
686
+ 99
687
+ 100
688
+ 101
689
+ 102
690
+ 103
691
+ 104
692
+ 105
693
+ 106
694
+ 107
695
+ 108
696
+ 109
697
+ 110
698
+ 111
699
+ 112
700
+ 113
701
+ 114
702
+ 115
703
+ 116
704
+ 117
705
+ 118
706
+ 119
707
+ 120
708
+ 121
709
+ 122
710
+ 123
711
+ 124
712
+ 125
713
+ 126
714
+ 127
715
+ 128
716
+ 129
717
+ 130
718
+ 131
719
+ 132
720
+ 133
721
+ 134
722
+ 135
723
+ 136
724
+ 137
725
+ 138
726
+ 139
727
+ 140
728
+ 141
729
+ 142
730
+ 143
731
+ 144
732
+ 145
733
+ 146
734
+ 147
735
+ 148
736
+ 149
737
+ 150
738
+ 151
739
+ 152
740
+ 153
741
+ 154
742
+ 155
743
+ 156
744
+ 157
745
+ 158
746
+ 159
747
+ 160
748
+ 161
749
+ 162
750
+ 163
751
+ 164
752
+ 165
753
+ 166
754
+ 167
755
+ 168
756
+ 169
757
+ 170
758
+ 171
759
+ 172
760
+ 173
761
+ 174
762
+ 175
763
+ 176
764
+ 177
765
+ 178
766
+ 179
767
+ 180
768
+ 181
769
+ 182
770
+ 183
771
+ 184
772
+ 185
773
+ 186
774
+ 187
775
+ 188
776
+ 189
777
+ 190
778
+ 191
779
+ 192
780
+ 193
781
+ 194
782
+ 195
783
+ 196
784
+ 197
785
+ 198
786
+ 199
787
+ 200
788
+ 201
789
+ 202
790
+ 203
791
+ 204
792
+ 205
793
+ 206
794
+ 207
795
+ 208
796
+ 209
797
+ 210
798
+ 211
799
+ 212
800
+ 213
801
+ 214
802
+ 215
803
+ 216
804
+ 217
805
+ 218
806
+ 219
807
+ 220
808
+ 221
809
+ 222
810
+ 223
811
+ 224
812
+ 225
813
+ 226
814
+ 227
815
+ 228
816
+ 229
817
+ 230
818
+ 231
819
+ 232
820
+ 233
821
+ 234
822
+ 235
823
+ 236
824
+ 237
825
+ 238
826
+ 239
827
+ 240
828
+ 241
829
+ 242
830
+ 243
831
+ 244</pre>
832
+ </td>
833
+ <td>
834
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 16</span>
835
+
836
+ <span class='kw'>class</span> <span class='const'>Reactor</span>
837
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span>
838
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span><span class='op'>::</span><span class='const'>IO</span>
839
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span><span class='op'>::</span><span class='const'>Logger</span>
840
+
841
+ <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:websocket</span><span class='comma'>,</span> <span class='symbol'>:server</span><span class='comma'>,</span> <span class='symbol'>:mutex</span><span class='comma'>,</span> <span class='symbol'>:channels</span>
842
+
843
+ <span class='comment'># rececives a new socket connection from the server
844
+ </span> <span class='comment'># and initiates a new mutex that can be used when subsribing to a channel
845
+ </span> <span class='comment'>#
846
+ </span> <span class='comment'># @param [Reel::WebSocket] websocket
847
+ </span> <span class='comment'>#
848
+ </span> <span class='comment'># @return [void]
849
+ </span> <span class='comment'>#
850
+ </span> <span class='comment'># @api public
851
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_work'>work</span><span class='lparen'>(</span><span class='id identifier rubyid_websocket'>websocket</span><span class='comma'>,</span> <span class='id identifier rubyid_server'>server</span><span class='rparen'>)</span>
852
+ <span class='ivar'>@server</span> <span class='op'>=</span> <span class='id identifier rubyid_server'>server</span>
853
+ <span class='ivar'>@mutex</span> <span class='op'>=</span> <span class='const'>Mutex</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
854
+ <span class='ivar'>@channels</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
855
+ <span class='ivar'>@websocket</span> <span class='op'>=</span> <span class='id identifier rubyid_websocket'>websocket</span>
856
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Streaming changes for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_url'>url</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
857
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_run'>run</span>
858
+ <span class='kw'>end</span>
859
+
860
+ <span class='comment'># reads from the socket the message
861
+ </span> <span class='comment'># and dispatches it to the handle_websocket_message method
862
+ </span> <span class='comment'># @see #handle_websocket_message
863
+ </span> <span class='comment'>#
864
+ </span> <span class='comment'># @return [void]
865
+ </span> <span class='comment'>#
866
+ </span> <span class='comment'># @api public
867
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_run'>run</span>
868
+ <span class='kw'>while</span> <span class='id identifier rubyid_message'>message</span> <span class='op'>=</span> <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span>
869
+ <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
870
+ <span class='kw'>end</span>
871
+ <span class='kw'>end</span>
872
+
873
+ <span class='comment'># method used to parse a JSON object into a Hash object
874
+ </span> <span class='comment'>#
875
+ </span> <span class='comment'># @param [JSON] message
876
+ </span> <span class='comment'>#
877
+ </span> <span class='comment'># @return [Hash]
878
+ </span> <span class='comment'>#
879
+ </span> <span class='comment'># @api public
880
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
881
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor read message </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
882
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='kw'>nil</span>
883
+ <span class='kw'>begin</span>
884
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='const'>JSON</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
885
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
886
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor could not parse </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_content'> because of </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
887
+ <span class='comment'># do nothing
888
+ </span> <span class='kw'>end</span>
889
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_message'>message</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
890
+ <span class='id identifier rubyid_json_data'>json_data</span>
891
+ <span class='kw'>end</span>
892
+
893
+ <span class='comment'># method that handles the message received from the websocket connection
894
+ </span> <span class='comment'># first will try to parse the message {#parse_json_data} and then it will dispatch
895
+ </span> <span class='comment'># it to another method that will decide depending the message what action
896
+ </span> <span class='comment'># should the reactor take {#handle_parsed_websocket_message}
897
+ </span> <span class='comment'>#
898
+ </span> <span class='comment'># @see #parse_json_data
899
+ </span> <span class='comment'># @see #handle_parsed_websocket_message
900
+ </span> <span class='comment'>#
901
+ </span> <span class='comment'># @param [JSON] message
902
+ </span> <span class='comment'>#
903
+ </span> <span class='comment'># @return [void]
904
+ </span> <span class='comment'>#
905
+ </span> <span class='comment'># @api public
906
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
907
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
908
+ <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
909
+ <span class='kw'>end</span>
910
+
911
+ <span class='comment'># method that checks if the data is a Hash
912
+ </span> <span class='comment'>#
913
+ </span> <span class='comment'># if the data is a hash then will stringify the keys and will call the method {#delegate_action}
914
+ </span> <span class='comment'># that will handle the message, otherwise will call the method {#handle_unknown_action}
915
+ </span> <span class='comment'>#
916
+ </span> <span class='comment'># @see #delegate_action
917
+ </span> <span class='comment'># @see #handle_unknown_action
918
+ </span> <span class='comment'>#
919
+ </span> <span class='comment'># @param [Hash] json_data
920
+ </span> <span class='comment'>#
921
+ </span> <span class='comment'># @return [void]
922
+ </span> <span class='comment'>#
923
+ </span> <span class='comment'># @api public
924
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
925
+ <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>Hash</span><span class='rparen'>)</span>
926
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_stringify_keys'>stringify_keys</span>
927
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor finds actions for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
928
+ <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
929
+ <span class='kw'>else</span>
930
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
931
+ <span class='kw'>end</span>
932
+ <span class='kw'>end</span>
933
+
934
+ <span class='comment'># method that checks if the data is a Hash
935
+ </span> <span class='comment'>#
936
+ </span> <span class='comment'># if the data is a hash then will stringify the keys and will call the method {#delegate_action}
937
+ </span> <span class='comment'># that will handle the message, otherwise will call the method {#handle_unknown_action}
938
+ </span> <span class='comment'>#
939
+ </span> <span class='comment'># @see #delegate_action
940
+ </span> <span class='comment'># @see #handle_unknown_action
941
+ </span> <span class='comment'>#
942
+ </span> <span class='comment'># @param [Hash] json_data
943
+ </span> <span class='comment'># @option json_data [String] :client_action The action based on which the reactor will decide what action should make
944
+ </span> <span class='comment'>#
945
+ </span> <span class='comment'># Possible values are:
946
+ </span> <span class='comment'># unsubscribe_client
947
+ </span> <span class='comment'># unsubscribe
948
+ </span> <span class='comment'># subscribe
949
+ </span> <span class='comment'># publish
950
+ </span> <span class='comment'>#
951
+ </span> <span class='comment'>#
952
+ </span> <span class='comment'># @return [void]
953
+ </span> <span class='comment'>#
954
+ </span> <span class='comment'># @api public
955
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
956
+ <span class='kw'>case</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span>
957
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe_all</span><span class='tstring_end'>&#39;</span></span>
958
+ <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
959
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe</span><span class='tstring_end'>&#39;</span></span>
960
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
961
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>subscribe</span><span class='tstring_end'>&#39;</span></span>
962
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
963
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>publish</span><span class='tstring_end'>&#39;</span></span>
964
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_publish_event'>publish_event</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>data</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span><span class='rparen'>)</span>
965
+ <span class='kw'>else</span>
966
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
967
+ <span class='kw'>end</span>
968
+ <span class='kw'>end</span>
969
+
970
+ <span class='comment'># the method will delegate the message to the server in an asyncronous way by sending the current actor and the message
971
+ </span> <span class='comment'># @see {CelluloidPubsub::WebServer#handle_dispatched_message}
972
+ </span> <span class='comment'>#
973
+ </span> <span class='comment'># @param [Hash] json_data
974
+ </span> <span class='comment'>#
975
+ </span> <span class='comment'># @return [void]
976
+ </span> <span class='comment'>#
977
+ </span> <span class='comment'># @api public
978
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
979
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Trying to dispatch to server </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
980
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_handle_dispatched_message'>handle_dispatched_message</span><span class='lparen'>(</span><span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
981
+ <span class='kw'>end</span>
982
+
983
+ <span class='comment'># the method will unsubscribe a client by closing the websocket connection if has unscribed from all channels
984
+ </span> <span class='comment'># and deleting the reactor from the channel list on the server
985
+ </span> <span class='comment'>#
986
+ </span> <span class='comment'># @param [String] channel
987
+ </span> <span class='comment'>#
988
+ </span> <span class='comment'># @return [void]
989
+ </span> <span class='comment'>#
990
+ </span> <span class='comment'># @api public
991
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
992
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
993
+ <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
994
+ <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span> <span class='kw'>if</span> <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span>
995
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_delete_if'>delete_if</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
996
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span>
997
+ <span class='kw'>end</span>
998
+ <span class='kw'>end</span>
999
+
1000
+ <span class='comment'># the method will terminate the current actor
1001
+ </span> <span class='comment'>#
1002
+ </span> <span class='comment'>#
1003
+ </span> <span class='comment'># @return [void]
1004
+ </span> <span class='comment'>#
1005
+ </span> <span class='comment'># @api public
1006
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_shutdown'>shutdown</span>
1007
+ <span class='id identifier rubyid_terminate'>terminate</span>
1008
+ <span class='kw'>end</span>
1009
+
1010
+ <span class='comment'># this method will add the current actor to the list of the subscribers {#add_subscriber_to_channel}
1011
+ </span> <span class='comment'># and will write to the socket a message for succesful subscription
1012
+ </span> <span class='comment'>#
1013
+ </span> <span class='comment'># @see #add_subscriber_to_channel
1014
+ </span> <span class='comment'>#
1015
+ </span> <span class='comment'># @param [String] channel
1016
+ </span> <span class='comment'># @param [Object] message
1017
+ </span> <span class='comment'>#
1018
+ </span> <span class='comment'># @return [void]
1019
+ </span> <span class='comment'>#
1020
+ </span> <span class='comment'># @api public
1021
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1022
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
1023
+ <span class='kw'>begin</span>
1024
+ <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1025
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Subscribed to </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_channel'>channel</span><span class='embexpr_end'>}</span><span class='tstring_content'> with </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1026
+ <span class='ivar'>@websocket</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_message'>message</span><span class='period'>.</span><span class='id identifier rubyid_merge'>merge</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>successful_subscription</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span>
1027
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
1028
+ <span class='id identifier rubyid_raise'>raise</span> <span class='lbracket'>[</span><span class='id identifier rubyid_e'>e</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='symbol'>:backtrace</span><span class='rparen'>)</span> <span class='op'>?</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_backtrace'>backtrace</span> <span class='op'>:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
1029
+ <span class='kw'>end</span>
1030
+ <span class='kw'>end</span>
1031
+
1032
+ <span class='comment'># adds the curent actor the list of the subscribers for a particular channel
1033
+ </span> <span class='comment'># and registers the new channel
1034
+ </span> <span class='comment'>#
1035
+ </span> <span class='comment'># @param [String] channel
1036
+ </span> <span class='comment'># @param [Object] message
1037
+ </span> <span class='comment'>#
1038
+ </span> <span class='comment'># @return [void]
1039
+ </span> <span class='comment'>#
1040
+ </span> <span class='comment'># @api public
1041
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1042
+ <span class='ivar'>@channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span>
1043
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span> <span class='kw'>unless</span> <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
1044
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>||=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1045
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>&lt;&lt;</span> <span class='lbrace'>{</span> <span class='label'>reactor:</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='label'>message:</span> <span class='id identifier rubyid_message'>message</span> <span class='rbrace'>}</span>
1046
+ <span class='kw'>end</span>
1047
+
1048
+ <span class='comment'># unsubscribes all actors from all channels and terminates the curent actor
1049
+ </span> <span class='comment'>#
1050
+ </span> <span class='comment'># @return [void]
1051
+ </span> <span class='comment'>#
1052
+ </span> <span class='comment'># @api public
1053
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
1054
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_channel'>channel</span><span class='op'>|</span>
1055
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
1056
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span>
1057
+ <span class='kw'>end</span>
1058
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1059
+ <span class='kw'>end</span>
1060
+
1061
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>clearing connections</span><span class='tstring_end'>&#39;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1062
+ <span class='id identifier rubyid_shutdown'>shutdown</span>
1063
+ <span class='kw'>end</span>
1064
+ <span class='kw'>end</span></pre>
1065
+ </td>
1066
+ </tr>
1067
+ </table>
1068
+ </div>
1069
+
1070
+
1071
+ <span id="mutex=-instance_method"></span>
1072
+ <div class="method_details ">
1073
+ <h3 class="signature " id="mutex-instance_method">
1074
+
1075
+ - (<tt>Mutex</tt>) <strong>mutex</strong>
1076
+
1077
+
1078
+
1079
+
1080
+
1081
+ </h3><div class="docstring">
1082
+ <div class="discussion">
1083
+
1084
+ <p>Returns mutex used to lock when subscribing to a channel</p>
1085
+
1086
+
1087
+ </div>
1088
+ </div>
1089
+ <div class="tags">
1090
+
1091
+ <p class="tag_title">Returns:</p>
1092
+ <ul class="return">
1093
+
1094
+ <li>
1095
+
1096
+
1097
+ <span class='type'>(<tt>Mutex</tt>)</span>
1098
+
1099
+
1100
+
1101
+ &mdash;
1102
+ <div class='inline'>
1103
+ <p>mutex used to lock when subscribing to a channel</p>
1104
+ </div>
1105
+
1106
+ </li>
1107
+
1108
+ </ul>
1109
+
1110
+ </div><table class="source_code">
1111
+ <tr>
1112
+ <td>
1113
+ <pre class="lines">
1114
+
1115
+
1116
+ 16
1117
+ 17
1118
+ 18
1119
+ 19
1120
+ 20
1121
+ 21
1122
+ 22
1123
+ 23
1124
+ 24
1125
+ 25
1126
+ 26
1127
+ 27
1128
+ 28
1129
+ 29
1130
+ 30
1131
+ 31
1132
+ 32
1133
+ 33
1134
+ 34
1135
+ 35
1136
+ 36
1137
+ 37
1138
+ 38
1139
+ 39
1140
+ 40
1141
+ 41
1142
+ 42
1143
+ 43
1144
+ 44
1145
+ 45
1146
+ 46
1147
+ 47
1148
+ 48
1149
+ 49
1150
+ 50
1151
+ 51
1152
+ 52
1153
+ 53
1154
+ 54
1155
+ 55
1156
+ 56
1157
+ 57
1158
+ 58
1159
+ 59
1160
+ 60
1161
+ 61
1162
+ 62
1163
+ 63
1164
+ 64
1165
+ 65
1166
+ 66
1167
+ 67
1168
+ 68
1169
+ 69
1170
+ 70
1171
+ 71
1172
+ 72
1173
+ 73
1174
+ 74
1175
+ 75
1176
+ 76
1177
+ 77
1178
+ 78
1179
+ 79
1180
+ 80
1181
+ 81
1182
+ 82
1183
+ 83
1184
+ 84
1185
+ 85
1186
+ 86
1187
+ 87
1188
+ 88
1189
+ 89
1190
+ 90
1191
+ 91
1192
+ 92
1193
+ 93
1194
+ 94
1195
+ 95
1196
+ 96
1197
+ 97
1198
+ 98
1199
+ 99
1200
+ 100
1201
+ 101
1202
+ 102
1203
+ 103
1204
+ 104
1205
+ 105
1206
+ 106
1207
+ 107
1208
+ 108
1209
+ 109
1210
+ 110
1211
+ 111
1212
+ 112
1213
+ 113
1214
+ 114
1215
+ 115
1216
+ 116
1217
+ 117
1218
+ 118
1219
+ 119
1220
+ 120
1221
+ 121
1222
+ 122
1223
+ 123
1224
+ 124
1225
+ 125
1226
+ 126
1227
+ 127
1228
+ 128
1229
+ 129
1230
+ 130
1231
+ 131
1232
+ 132
1233
+ 133
1234
+ 134
1235
+ 135
1236
+ 136
1237
+ 137
1238
+ 138
1239
+ 139
1240
+ 140
1241
+ 141
1242
+ 142
1243
+ 143
1244
+ 144
1245
+ 145
1246
+ 146
1247
+ 147
1248
+ 148
1249
+ 149
1250
+ 150
1251
+ 151
1252
+ 152
1253
+ 153
1254
+ 154
1255
+ 155
1256
+ 156
1257
+ 157
1258
+ 158
1259
+ 159
1260
+ 160
1261
+ 161
1262
+ 162
1263
+ 163
1264
+ 164
1265
+ 165
1266
+ 166
1267
+ 167
1268
+ 168
1269
+ 169
1270
+ 170
1271
+ 171
1272
+ 172
1273
+ 173
1274
+ 174
1275
+ 175
1276
+ 176
1277
+ 177
1278
+ 178
1279
+ 179
1280
+ 180
1281
+ 181
1282
+ 182
1283
+ 183
1284
+ 184
1285
+ 185
1286
+ 186
1287
+ 187
1288
+ 188
1289
+ 189
1290
+ 190
1291
+ 191
1292
+ 192
1293
+ 193
1294
+ 194
1295
+ 195
1296
+ 196
1297
+ 197
1298
+ 198
1299
+ 199
1300
+ 200
1301
+ 201
1302
+ 202
1303
+ 203
1304
+ 204
1305
+ 205
1306
+ 206
1307
+ 207
1308
+ 208
1309
+ 209
1310
+ 210
1311
+ 211
1312
+ 212
1313
+ 213
1314
+ 214
1315
+ 215
1316
+ 216
1317
+ 217
1318
+ 218
1319
+ 219
1320
+ 220
1321
+ 221
1322
+ 222
1323
+ 223
1324
+ 224
1325
+ 225
1326
+ 226
1327
+ 227
1328
+ 228
1329
+ 229
1330
+ 230
1331
+ 231
1332
+ 232
1333
+ 233
1334
+ 234
1335
+ 235
1336
+ 236
1337
+ 237
1338
+ 238
1339
+ 239
1340
+ 240
1341
+ 241
1342
+ 242
1343
+ 243
1344
+ 244</pre>
1345
+ </td>
1346
+ <td>
1347
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 16</span>
1348
+
1349
+ <span class='kw'>class</span> <span class='const'>Reactor</span>
1350
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span>
1351
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span><span class='op'>::</span><span class='const'>IO</span>
1352
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span><span class='op'>::</span><span class='const'>Logger</span>
1353
+
1354
+ <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:websocket</span><span class='comma'>,</span> <span class='symbol'>:server</span><span class='comma'>,</span> <span class='symbol'>:mutex</span><span class='comma'>,</span> <span class='symbol'>:channels</span>
1355
+
1356
+ <span class='comment'># rececives a new socket connection from the server
1357
+ </span> <span class='comment'># and initiates a new mutex that can be used when subsribing to a channel
1358
+ </span> <span class='comment'>#
1359
+ </span> <span class='comment'># @param [Reel::WebSocket] websocket
1360
+ </span> <span class='comment'>#
1361
+ </span> <span class='comment'># @return [void]
1362
+ </span> <span class='comment'>#
1363
+ </span> <span class='comment'># @api public
1364
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_work'>work</span><span class='lparen'>(</span><span class='id identifier rubyid_websocket'>websocket</span><span class='comma'>,</span> <span class='id identifier rubyid_server'>server</span><span class='rparen'>)</span>
1365
+ <span class='ivar'>@server</span> <span class='op'>=</span> <span class='id identifier rubyid_server'>server</span>
1366
+ <span class='ivar'>@mutex</span> <span class='op'>=</span> <span class='const'>Mutex</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
1367
+ <span class='ivar'>@channels</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1368
+ <span class='ivar'>@websocket</span> <span class='op'>=</span> <span class='id identifier rubyid_websocket'>websocket</span>
1369
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Streaming changes for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_url'>url</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1370
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_run'>run</span>
1371
+ <span class='kw'>end</span>
1372
+
1373
+ <span class='comment'># reads from the socket the message
1374
+ </span> <span class='comment'># and dispatches it to the handle_websocket_message method
1375
+ </span> <span class='comment'># @see #handle_websocket_message
1376
+ </span> <span class='comment'>#
1377
+ </span> <span class='comment'># @return [void]
1378
+ </span> <span class='comment'>#
1379
+ </span> <span class='comment'># @api public
1380
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_run'>run</span>
1381
+ <span class='kw'>while</span> <span class='id identifier rubyid_message'>message</span> <span class='op'>=</span> <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span>
1382
+ <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1383
+ <span class='kw'>end</span>
1384
+ <span class='kw'>end</span>
1385
+
1386
+ <span class='comment'># method used to parse a JSON object into a Hash object
1387
+ </span> <span class='comment'>#
1388
+ </span> <span class='comment'># @param [JSON] message
1389
+ </span> <span class='comment'>#
1390
+ </span> <span class='comment'># @return [Hash]
1391
+ </span> <span class='comment'>#
1392
+ </span> <span class='comment'># @api public
1393
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1394
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor read message </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1395
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='kw'>nil</span>
1396
+ <span class='kw'>begin</span>
1397
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='const'>JSON</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1398
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
1399
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor could not parse </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_content'> because of </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1400
+ <span class='comment'># do nothing
1401
+ </span> <span class='kw'>end</span>
1402
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_message'>message</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
1403
+ <span class='id identifier rubyid_json_data'>json_data</span>
1404
+ <span class='kw'>end</span>
1405
+
1406
+ <span class='comment'># method that handles the message received from the websocket connection
1407
+ </span> <span class='comment'># first will try to parse the message {#parse_json_data} and then it will dispatch
1408
+ </span> <span class='comment'># it to another method that will decide depending the message what action
1409
+ </span> <span class='comment'># should the reactor take {#handle_parsed_websocket_message}
1410
+ </span> <span class='comment'>#
1411
+ </span> <span class='comment'># @see #parse_json_data
1412
+ </span> <span class='comment'># @see #handle_parsed_websocket_message
1413
+ </span> <span class='comment'>#
1414
+ </span> <span class='comment'># @param [JSON] message
1415
+ </span> <span class='comment'>#
1416
+ </span> <span class='comment'># @return [void]
1417
+ </span> <span class='comment'>#
1418
+ </span> <span class='comment'># @api public
1419
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1420
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1421
+ <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1422
+ <span class='kw'>end</span>
1423
+
1424
+ <span class='comment'># method that checks if the data is a Hash
1425
+ </span> <span class='comment'>#
1426
+ </span> <span class='comment'># if the data is a hash then will stringify the keys and will call the method {#delegate_action}
1427
+ </span> <span class='comment'># that will handle the message, otherwise will call the method {#handle_unknown_action}
1428
+ </span> <span class='comment'>#
1429
+ </span> <span class='comment'># @see #delegate_action
1430
+ </span> <span class='comment'># @see #handle_unknown_action
1431
+ </span> <span class='comment'>#
1432
+ </span> <span class='comment'># @param [Hash] json_data
1433
+ </span> <span class='comment'>#
1434
+ </span> <span class='comment'># @return [void]
1435
+ </span> <span class='comment'>#
1436
+ </span> <span class='comment'># @api public
1437
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1438
+ <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>Hash</span><span class='rparen'>)</span>
1439
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_stringify_keys'>stringify_keys</span>
1440
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor finds actions for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1441
+ <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
1442
+ <span class='kw'>else</span>
1443
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1444
+ <span class='kw'>end</span>
1445
+ <span class='kw'>end</span>
1446
+
1447
+ <span class='comment'># method that checks if the data is a Hash
1448
+ </span> <span class='comment'>#
1449
+ </span> <span class='comment'># if the data is a hash then will stringify the keys and will call the method {#delegate_action}
1450
+ </span> <span class='comment'># that will handle the message, otherwise will call the method {#handle_unknown_action}
1451
+ </span> <span class='comment'>#
1452
+ </span> <span class='comment'># @see #delegate_action
1453
+ </span> <span class='comment'># @see #handle_unknown_action
1454
+ </span> <span class='comment'>#
1455
+ </span> <span class='comment'># @param [Hash] json_data
1456
+ </span> <span class='comment'># @option json_data [String] :client_action The action based on which the reactor will decide what action should make
1457
+ </span> <span class='comment'>#
1458
+ </span> <span class='comment'># Possible values are:
1459
+ </span> <span class='comment'># unsubscribe_client
1460
+ </span> <span class='comment'># unsubscribe
1461
+ </span> <span class='comment'># subscribe
1462
+ </span> <span class='comment'># publish
1463
+ </span> <span class='comment'>#
1464
+ </span> <span class='comment'>#
1465
+ </span> <span class='comment'># @return [void]
1466
+ </span> <span class='comment'>#
1467
+ </span> <span class='comment'># @api public
1468
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1469
+ <span class='kw'>case</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span>
1470
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe_all</span><span class='tstring_end'>&#39;</span></span>
1471
+ <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
1472
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe</span><span class='tstring_end'>&#39;</span></span>
1473
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
1474
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>subscribe</span><span class='tstring_end'>&#39;</span></span>
1475
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1476
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>publish</span><span class='tstring_end'>&#39;</span></span>
1477
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_publish_event'>publish_event</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>data</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span><span class='rparen'>)</span>
1478
+ <span class='kw'>else</span>
1479
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1480
+ <span class='kw'>end</span>
1481
+ <span class='kw'>end</span>
1482
+
1483
+ <span class='comment'># the method will delegate the message to the server in an asyncronous way by sending the current actor and the message
1484
+ </span> <span class='comment'># @see {CelluloidPubsub::WebServer#handle_dispatched_message}
1485
+ </span> <span class='comment'>#
1486
+ </span> <span class='comment'># @param [Hash] json_data
1487
+ </span> <span class='comment'>#
1488
+ </span> <span class='comment'># @return [void]
1489
+ </span> <span class='comment'>#
1490
+ </span> <span class='comment'># @api public
1491
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1492
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Trying to dispatch to server </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1493
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_handle_dispatched_message'>handle_dispatched_message</span><span class='lparen'>(</span><span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1494
+ <span class='kw'>end</span>
1495
+
1496
+ <span class='comment'># the method will unsubscribe a client by closing the websocket connection if has unscribed from all channels
1497
+ </span> <span class='comment'># and deleting the reactor from the channel list on the server
1498
+ </span> <span class='comment'>#
1499
+ </span> <span class='comment'># @param [String] channel
1500
+ </span> <span class='comment'>#
1501
+ </span> <span class='comment'># @return [void]
1502
+ </span> <span class='comment'>#
1503
+ </span> <span class='comment'># @api public
1504
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
1505
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
1506
+ <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
1507
+ <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span> <span class='kw'>if</span> <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span>
1508
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_delete_if'>delete_if</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
1509
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span>
1510
+ <span class='kw'>end</span>
1511
+ <span class='kw'>end</span>
1512
+
1513
+ <span class='comment'># the method will terminate the current actor
1514
+ </span> <span class='comment'>#
1515
+ </span> <span class='comment'>#
1516
+ </span> <span class='comment'># @return [void]
1517
+ </span> <span class='comment'>#
1518
+ </span> <span class='comment'># @api public
1519
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_shutdown'>shutdown</span>
1520
+ <span class='id identifier rubyid_terminate'>terminate</span>
1521
+ <span class='kw'>end</span>
1522
+
1523
+ <span class='comment'># this method will add the current actor to the list of the subscribers {#add_subscriber_to_channel}
1524
+ </span> <span class='comment'># and will write to the socket a message for succesful subscription
1525
+ </span> <span class='comment'>#
1526
+ </span> <span class='comment'># @see #add_subscriber_to_channel
1527
+ </span> <span class='comment'>#
1528
+ </span> <span class='comment'># @param [String] channel
1529
+ </span> <span class='comment'># @param [Object] message
1530
+ </span> <span class='comment'>#
1531
+ </span> <span class='comment'># @return [void]
1532
+ </span> <span class='comment'>#
1533
+ </span> <span class='comment'># @api public
1534
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1535
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
1536
+ <span class='kw'>begin</span>
1537
+ <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1538
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Subscribed to </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_channel'>channel</span><span class='embexpr_end'>}</span><span class='tstring_content'> with </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1539
+ <span class='ivar'>@websocket</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_message'>message</span><span class='period'>.</span><span class='id identifier rubyid_merge'>merge</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>successful_subscription</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span>
1540
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
1541
+ <span class='id identifier rubyid_raise'>raise</span> <span class='lbracket'>[</span><span class='id identifier rubyid_e'>e</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='symbol'>:backtrace</span><span class='rparen'>)</span> <span class='op'>?</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_backtrace'>backtrace</span> <span class='op'>:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
1542
+ <span class='kw'>end</span>
1543
+ <span class='kw'>end</span>
1544
+
1545
+ <span class='comment'># adds the curent actor the list of the subscribers for a particular channel
1546
+ </span> <span class='comment'># and registers the new channel
1547
+ </span> <span class='comment'>#
1548
+ </span> <span class='comment'># @param [String] channel
1549
+ </span> <span class='comment'># @param [Object] message
1550
+ </span> <span class='comment'>#
1551
+ </span> <span class='comment'># @return [void]
1552
+ </span> <span class='comment'>#
1553
+ </span> <span class='comment'># @api public
1554
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1555
+ <span class='ivar'>@channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span>
1556
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span> <span class='kw'>unless</span> <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
1557
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>||=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1558
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>&lt;&lt;</span> <span class='lbrace'>{</span> <span class='label'>reactor:</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='label'>message:</span> <span class='id identifier rubyid_message'>message</span> <span class='rbrace'>}</span>
1559
+ <span class='kw'>end</span>
1560
+
1561
+ <span class='comment'># unsubscribes all actors from all channels and terminates the curent actor
1562
+ </span> <span class='comment'>#
1563
+ </span> <span class='comment'># @return [void]
1564
+ </span> <span class='comment'>#
1565
+ </span> <span class='comment'># @api public
1566
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
1567
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_channel'>channel</span><span class='op'>|</span>
1568
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
1569
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span>
1570
+ <span class='kw'>end</span>
1571
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1572
+ <span class='kw'>end</span>
1573
+
1574
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>clearing connections</span><span class='tstring_end'>&#39;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1575
+ <span class='id identifier rubyid_shutdown'>shutdown</span>
1576
+ <span class='kw'>end</span>
1577
+ <span class='kw'>end</span></pre>
1578
+ </td>
1579
+ </tr>
1580
+ </table>
1581
+ </div>
1582
+
1583
+
1584
+ <span id="server=-instance_method"></span>
1585
+ <div class="method_details ">
1586
+ <h3 class="signature " id="server-instance_method">
1587
+
1588
+ - (<tt>CelluloidPubsub::Webserver</tt>) <strong>server</strong>
1589
+
1590
+
1591
+
1592
+
1593
+
1594
+ </h3><div class="docstring">
1595
+ <div class="discussion">
1596
+
1597
+ <p>Returns the server actor to which the reactor is connected to</p>
1598
+
1599
+
1600
+ </div>
1601
+ </div>
1602
+ <div class="tags">
1603
+
1604
+ <p class="tag_title">Returns:</p>
1605
+ <ul class="return">
1606
+
1607
+ <li>
1608
+
1609
+
1610
+ <span class='type'>(<tt>CelluloidPubsub::Webserver</tt>)</span>
1611
+
1612
+
1613
+
1614
+ &mdash;
1615
+ <div class='inline'>
1616
+ <p>the server actor to which the reactor is connected to</p>
1617
+ </div>
1618
+
1619
+ </li>
1620
+
1621
+ </ul>
1622
+
1623
+ </div><table class="source_code">
1624
+ <tr>
1625
+ <td>
1626
+ <pre class="lines">
1627
+
1628
+
1629
+ 16
1630
+ 17
1631
+ 18
1632
+ 19
1633
+ 20
1634
+ 21
1635
+ 22
1636
+ 23
1637
+ 24
1638
+ 25
1639
+ 26
1640
+ 27
1641
+ 28
1642
+ 29
1643
+ 30
1644
+ 31
1645
+ 32
1646
+ 33
1647
+ 34
1648
+ 35
1649
+ 36
1650
+ 37
1651
+ 38
1652
+ 39
1653
+ 40
1654
+ 41
1655
+ 42
1656
+ 43
1657
+ 44
1658
+ 45
1659
+ 46
1660
+ 47
1661
+ 48
1662
+ 49
1663
+ 50
1664
+ 51
1665
+ 52
1666
+ 53
1667
+ 54
1668
+ 55
1669
+ 56
1670
+ 57
1671
+ 58
1672
+ 59
1673
+ 60
1674
+ 61
1675
+ 62
1676
+ 63
1677
+ 64
1678
+ 65
1679
+ 66
1680
+ 67
1681
+ 68
1682
+ 69
1683
+ 70
1684
+ 71
1685
+ 72
1686
+ 73
1687
+ 74
1688
+ 75
1689
+ 76
1690
+ 77
1691
+ 78
1692
+ 79
1693
+ 80
1694
+ 81
1695
+ 82
1696
+ 83
1697
+ 84
1698
+ 85
1699
+ 86
1700
+ 87
1701
+ 88
1702
+ 89
1703
+ 90
1704
+ 91
1705
+ 92
1706
+ 93
1707
+ 94
1708
+ 95
1709
+ 96
1710
+ 97
1711
+ 98
1712
+ 99
1713
+ 100
1714
+ 101
1715
+ 102
1716
+ 103
1717
+ 104
1718
+ 105
1719
+ 106
1720
+ 107
1721
+ 108
1722
+ 109
1723
+ 110
1724
+ 111
1725
+ 112
1726
+ 113
1727
+ 114
1728
+ 115
1729
+ 116
1730
+ 117
1731
+ 118
1732
+ 119
1733
+ 120
1734
+ 121
1735
+ 122
1736
+ 123
1737
+ 124
1738
+ 125
1739
+ 126
1740
+ 127
1741
+ 128
1742
+ 129
1743
+ 130
1744
+ 131
1745
+ 132
1746
+ 133
1747
+ 134
1748
+ 135
1749
+ 136
1750
+ 137
1751
+ 138
1752
+ 139
1753
+ 140
1754
+ 141
1755
+ 142
1756
+ 143
1757
+ 144
1758
+ 145
1759
+ 146
1760
+ 147
1761
+ 148
1762
+ 149
1763
+ 150
1764
+ 151
1765
+ 152
1766
+ 153
1767
+ 154
1768
+ 155
1769
+ 156
1770
+ 157
1771
+ 158
1772
+ 159
1773
+ 160
1774
+ 161
1775
+ 162
1776
+ 163
1777
+ 164
1778
+ 165
1779
+ 166
1780
+ 167
1781
+ 168
1782
+ 169
1783
+ 170
1784
+ 171
1785
+ 172
1786
+ 173
1787
+ 174
1788
+ 175
1789
+ 176
1790
+ 177
1791
+ 178
1792
+ 179
1793
+ 180
1794
+ 181
1795
+ 182
1796
+ 183
1797
+ 184
1798
+ 185
1799
+ 186
1800
+ 187
1801
+ 188
1802
+ 189
1803
+ 190
1804
+ 191
1805
+ 192
1806
+ 193
1807
+ 194
1808
+ 195
1809
+ 196
1810
+ 197
1811
+ 198
1812
+ 199
1813
+ 200
1814
+ 201
1815
+ 202
1816
+ 203
1817
+ 204
1818
+ 205
1819
+ 206
1820
+ 207
1821
+ 208
1822
+ 209
1823
+ 210
1824
+ 211
1825
+ 212
1826
+ 213
1827
+ 214
1828
+ 215
1829
+ 216
1830
+ 217
1831
+ 218
1832
+ 219
1833
+ 220
1834
+ 221
1835
+ 222
1836
+ 223
1837
+ 224
1838
+ 225
1839
+ 226
1840
+ 227
1841
+ 228
1842
+ 229
1843
+ 230
1844
+ 231
1845
+ 232
1846
+ 233
1847
+ 234
1848
+ 235
1849
+ 236
1850
+ 237
1851
+ 238
1852
+ 239
1853
+ 240
1854
+ 241
1855
+ 242
1856
+ 243
1857
+ 244</pre>
1858
+ </td>
1859
+ <td>
1860
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 16</span>
1861
+
1862
+ <span class='kw'>class</span> <span class='const'>Reactor</span>
1863
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span>
1864
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span><span class='op'>::</span><span class='const'>IO</span>
1865
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span><span class='op'>::</span><span class='const'>Logger</span>
1866
+
1867
+ <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:websocket</span><span class='comma'>,</span> <span class='symbol'>:server</span><span class='comma'>,</span> <span class='symbol'>:mutex</span><span class='comma'>,</span> <span class='symbol'>:channels</span>
1868
+
1869
+ <span class='comment'># rececives a new socket connection from the server
1870
+ </span> <span class='comment'># and initiates a new mutex that can be used when subsribing to a channel
1871
+ </span> <span class='comment'>#
1872
+ </span> <span class='comment'># @param [Reel::WebSocket] websocket
1873
+ </span> <span class='comment'>#
1874
+ </span> <span class='comment'># @return [void]
1875
+ </span> <span class='comment'>#
1876
+ </span> <span class='comment'># @api public
1877
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_work'>work</span><span class='lparen'>(</span><span class='id identifier rubyid_websocket'>websocket</span><span class='comma'>,</span> <span class='id identifier rubyid_server'>server</span><span class='rparen'>)</span>
1878
+ <span class='ivar'>@server</span> <span class='op'>=</span> <span class='id identifier rubyid_server'>server</span>
1879
+ <span class='ivar'>@mutex</span> <span class='op'>=</span> <span class='const'>Mutex</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
1880
+ <span class='ivar'>@channels</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1881
+ <span class='ivar'>@websocket</span> <span class='op'>=</span> <span class='id identifier rubyid_websocket'>websocket</span>
1882
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Streaming changes for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_url'>url</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1883
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_run'>run</span>
1884
+ <span class='kw'>end</span>
1885
+
1886
+ <span class='comment'># reads from the socket the message
1887
+ </span> <span class='comment'># and dispatches it to the handle_websocket_message method
1888
+ </span> <span class='comment'># @see #handle_websocket_message
1889
+ </span> <span class='comment'>#
1890
+ </span> <span class='comment'># @return [void]
1891
+ </span> <span class='comment'>#
1892
+ </span> <span class='comment'># @api public
1893
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_run'>run</span>
1894
+ <span class='kw'>while</span> <span class='id identifier rubyid_message'>message</span> <span class='op'>=</span> <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span>
1895
+ <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1896
+ <span class='kw'>end</span>
1897
+ <span class='kw'>end</span>
1898
+
1899
+ <span class='comment'># method used to parse a JSON object into a Hash object
1900
+ </span> <span class='comment'>#
1901
+ </span> <span class='comment'># @param [JSON] message
1902
+ </span> <span class='comment'>#
1903
+ </span> <span class='comment'># @return [Hash]
1904
+ </span> <span class='comment'>#
1905
+ </span> <span class='comment'># @api public
1906
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1907
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor read message </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1908
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='kw'>nil</span>
1909
+ <span class='kw'>begin</span>
1910
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='const'>JSON</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1911
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
1912
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor could not parse </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_content'> because of </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1913
+ <span class='comment'># do nothing
1914
+ </span> <span class='kw'>end</span>
1915
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_message'>message</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
1916
+ <span class='id identifier rubyid_json_data'>json_data</span>
1917
+ <span class='kw'>end</span>
1918
+
1919
+ <span class='comment'># method that handles the message received from the websocket connection
1920
+ </span> <span class='comment'># first will try to parse the message {#parse_json_data} and then it will dispatch
1921
+ </span> <span class='comment'># it to another method that will decide depending the message what action
1922
+ </span> <span class='comment'># should the reactor take {#handle_parsed_websocket_message}
1923
+ </span> <span class='comment'>#
1924
+ </span> <span class='comment'># @see #parse_json_data
1925
+ </span> <span class='comment'># @see #handle_parsed_websocket_message
1926
+ </span> <span class='comment'>#
1927
+ </span> <span class='comment'># @param [JSON] message
1928
+ </span> <span class='comment'>#
1929
+ </span> <span class='comment'># @return [void]
1930
+ </span> <span class='comment'>#
1931
+ </span> <span class='comment'># @api public
1932
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1933
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
1934
+ <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1935
+ <span class='kw'>end</span>
1936
+
1937
+ <span class='comment'># method that checks if the data is a Hash
1938
+ </span> <span class='comment'>#
1939
+ </span> <span class='comment'># if the data is a hash then will stringify the keys and will call the method {#delegate_action}
1940
+ </span> <span class='comment'># that will handle the message, otherwise will call the method {#handle_unknown_action}
1941
+ </span> <span class='comment'>#
1942
+ </span> <span class='comment'># @see #delegate_action
1943
+ </span> <span class='comment'># @see #handle_unknown_action
1944
+ </span> <span class='comment'>#
1945
+ </span> <span class='comment'># @param [Hash] json_data
1946
+ </span> <span class='comment'>#
1947
+ </span> <span class='comment'># @return [void]
1948
+ </span> <span class='comment'>#
1949
+ </span> <span class='comment'># @api public
1950
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1951
+ <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>Hash</span><span class='rparen'>)</span>
1952
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_stringify_keys'>stringify_keys</span>
1953
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor finds actions for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
1954
+ <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
1955
+ <span class='kw'>else</span>
1956
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1957
+ <span class='kw'>end</span>
1958
+ <span class='kw'>end</span>
1959
+
1960
+ <span class='comment'># method that checks if the data is a Hash
1961
+ </span> <span class='comment'>#
1962
+ </span> <span class='comment'># if the data is a hash then will stringify the keys and will call the method {#delegate_action}
1963
+ </span> <span class='comment'># that will handle the message, otherwise will call the method {#handle_unknown_action}
1964
+ </span> <span class='comment'>#
1965
+ </span> <span class='comment'># @see #delegate_action
1966
+ </span> <span class='comment'># @see #handle_unknown_action
1967
+ </span> <span class='comment'>#
1968
+ </span> <span class='comment'># @param [Hash] json_data
1969
+ </span> <span class='comment'># @option json_data [String] :client_action The action based on which the reactor will decide what action should make
1970
+ </span> <span class='comment'>#
1971
+ </span> <span class='comment'># Possible values are:
1972
+ </span> <span class='comment'># unsubscribe_client
1973
+ </span> <span class='comment'># unsubscribe
1974
+ </span> <span class='comment'># subscribe
1975
+ </span> <span class='comment'># publish
1976
+ </span> <span class='comment'>#
1977
+ </span> <span class='comment'>#
1978
+ </span> <span class='comment'># @return [void]
1979
+ </span> <span class='comment'>#
1980
+ </span> <span class='comment'># @api public
1981
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1982
+ <span class='kw'>case</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span>
1983
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe_all</span><span class='tstring_end'>&#39;</span></span>
1984
+ <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
1985
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe</span><span class='tstring_end'>&#39;</span></span>
1986
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
1987
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>subscribe</span><span class='tstring_end'>&#39;</span></span>
1988
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1989
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>publish</span><span class='tstring_end'>&#39;</span></span>
1990
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_publish_event'>publish_event</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>data</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span><span class='rparen'>)</span>
1991
+ <span class='kw'>else</span>
1992
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
1993
+ <span class='kw'>end</span>
1994
+ <span class='kw'>end</span>
1995
+
1996
+ <span class='comment'># the method will delegate the message to the server in an asyncronous way by sending the current actor and the message
1997
+ </span> <span class='comment'># @see {CelluloidPubsub::WebServer#handle_dispatched_message}
1998
+ </span> <span class='comment'>#
1999
+ </span> <span class='comment'># @param [Hash] json_data
2000
+ </span> <span class='comment'>#
2001
+ </span> <span class='comment'># @return [void]
2002
+ </span> <span class='comment'>#
2003
+ </span> <span class='comment'># @api public
2004
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2005
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Trying to dispatch to server </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2006
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_handle_dispatched_message'>handle_dispatched_message</span><span class='lparen'>(</span><span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2007
+ <span class='kw'>end</span>
2008
+
2009
+ <span class='comment'># the method will unsubscribe a client by closing the websocket connection if has unscribed from all channels
2010
+ </span> <span class='comment'># and deleting the reactor from the channel list on the server
2011
+ </span> <span class='comment'>#
2012
+ </span> <span class='comment'># @param [String] channel
2013
+ </span> <span class='comment'>#
2014
+ </span> <span class='comment'># @return [void]
2015
+ </span> <span class='comment'>#
2016
+ </span> <span class='comment'># @api public
2017
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
2018
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
2019
+ <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
2020
+ <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span> <span class='kw'>if</span> <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span>
2021
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_delete_if'>delete_if</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
2022
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span>
2023
+ <span class='kw'>end</span>
2024
+ <span class='kw'>end</span>
2025
+
2026
+ <span class='comment'># the method will terminate the current actor
2027
+ </span> <span class='comment'>#
2028
+ </span> <span class='comment'>#
2029
+ </span> <span class='comment'># @return [void]
2030
+ </span> <span class='comment'>#
2031
+ </span> <span class='comment'># @api public
2032
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_shutdown'>shutdown</span>
2033
+ <span class='id identifier rubyid_terminate'>terminate</span>
2034
+ <span class='kw'>end</span>
2035
+
2036
+ <span class='comment'># this method will add the current actor to the list of the subscribers {#add_subscriber_to_channel}
2037
+ </span> <span class='comment'># and will write to the socket a message for succesful subscription
2038
+ </span> <span class='comment'>#
2039
+ </span> <span class='comment'># @see #add_subscriber_to_channel
2040
+ </span> <span class='comment'>#
2041
+ </span> <span class='comment'># @param [String] channel
2042
+ </span> <span class='comment'># @param [Object] message
2043
+ </span> <span class='comment'>#
2044
+ </span> <span class='comment'># @return [void]
2045
+ </span> <span class='comment'>#
2046
+ </span> <span class='comment'># @api public
2047
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2048
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
2049
+ <span class='kw'>begin</span>
2050
+ <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2051
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Subscribed to </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_channel'>channel</span><span class='embexpr_end'>}</span><span class='tstring_content'> with </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2052
+ <span class='ivar'>@websocket</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_message'>message</span><span class='period'>.</span><span class='id identifier rubyid_merge'>merge</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>successful_subscription</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span>
2053
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
2054
+ <span class='id identifier rubyid_raise'>raise</span> <span class='lbracket'>[</span><span class='id identifier rubyid_e'>e</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='symbol'>:backtrace</span><span class='rparen'>)</span> <span class='op'>?</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_backtrace'>backtrace</span> <span class='op'>:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
2055
+ <span class='kw'>end</span>
2056
+ <span class='kw'>end</span>
2057
+
2058
+ <span class='comment'># adds the curent actor the list of the subscribers for a particular channel
2059
+ </span> <span class='comment'># and registers the new channel
2060
+ </span> <span class='comment'>#
2061
+ </span> <span class='comment'># @param [String] channel
2062
+ </span> <span class='comment'># @param [Object] message
2063
+ </span> <span class='comment'>#
2064
+ </span> <span class='comment'># @return [void]
2065
+ </span> <span class='comment'>#
2066
+ </span> <span class='comment'># @api public
2067
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2068
+ <span class='ivar'>@channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span>
2069
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span> <span class='kw'>unless</span> <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
2070
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>||=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
2071
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>&lt;&lt;</span> <span class='lbrace'>{</span> <span class='label'>reactor:</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='label'>message:</span> <span class='id identifier rubyid_message'>message</span> <span class='rbrace'>}</span>
2072
+ <span class='kw'>end</span>
2073
+
2074
+ <span class='comment'># unsubscribes all actors from all channels and terminates the curent actor
2075
+ </span> <span class='comment'>#
2076
+ </span> <span class='comment'># @return [void]
2077
+ </span> <span class='comment'>#
2078
+ </span> <span class='comment'># @api public
2079
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
2080
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_channel'>channel</span><span class='op'>|</span>
2081
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
2082
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span>
2083
+ <span class='kw'>end</span>
2084
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
2085
+ <span class='kw'>end</span>
2086
+
2087
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>clearing connections</span><span class='tstring_end'>&#39;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2088
+ <span class='id identifier rubyid_shutdown'>shutdown</span>
2089
+ <span class='kw'>end</span>
2090
+ <span class='kw'>end</span></pre>
2091
+ </td>
2092
+ </tr>
2093
+ </table>
2094
+ </div>
2095
+
2096
+
2097
+ <span id="websocket=-instance_method"></span>
2098
+ <div class="method_details ">
2099
+ <h3 class="signature " id="websocket-instance_method">
2100
+
2101
+ - (<tt>Reel::WebSocket</tt>) <strong>websocket</strong>
2102
+
2103
+
2104
+
2105
+
2106
+
2107
+ </h3><div class="docstring">
2108
+ <div class="discussion">
2109
+
2110
+ <p>Returns websocket connection</p>
2111
+
2112
+
2113
+ </div>
2114
+ </div>
2115
+ <div class="tags">
2116
+
2117
+ <p class="tag_title">Returns:</p>
2118
+ <ul class="return">
2119
+
2120
+ <li>
2121
+
2122
+
2123
+ <span class='type'>(<tt>Reel::WebSocket</tt>)</span>
2124
+
2125
+
2126
+
2127
+ &mdash;
2128
+ <div class='inline'>
2129
+ <p>websocket connection</p>
2130
+ </div>
2131
+
2132
+ </li>
2133
+
2134
+ </ul>
2135
+
2136
+ </div><table class="source_code">
2137
+ <tr>
2138
+ <td>
2139
+ <pre class="lines">
2140
+
2141
+
2142
+ 16
2143
+ 17
2144
+ 18
2145
+ 19
2146
+ 20
2147
+ 21
2148
+ 22
2149
+ 23
2150
+ 24
2151
+ 25
2152
+ 26
2153
+ 27
2154
+ 28
2155
+ 29
2156
+ 30
2157
+ 31
2158
+ 32
2159
+ 33
2160
+ 34
2161
+ 35
2162
+ 36
2163
+ 37
2164
+ 38
2165
+ 39
2166
+ 40
2167
+ 41
2168
+ 42
2169
+ 43
2170
+ 44
2171
+ 45
2172
+ 46
2173
+ 47
2174
+ 48
2175
+ 49
2176
+ 50
2177
+ 51
2178
+ 52
2179
+ 53
2180
+ 54
2181
+ 55
2182
+ 56
2183
+ 57
2184
+ 58
2185
+ 59
2186
+ 60
2187
+ 61
2188
+ 62
2189
+ 63
2190
+ 64
2191
+ 65
2192
+ 66
2193
+ 67
2194
+ 68
2195
+ 69
2196
+ 70
2197
+ 71
2198
+ 72
2199
+ 73
2200
+ 74
2201
+ 75
2202
+ 76
2203
+ 77
2204
+ 78
2205
+ 79
2206
+ 80
2207
+ 81
2208
+ 82
2209
+ 83
2210
+ 84
2211
+ 85
2212
+ 86
2213
+ 87
2214
+ 88
2215
+ 89
2216
+ 90
2217
+ 91
2218
+ 92
2219
+ 93
2220
+ 94
2221
+ 95
2222
+ 96
2223
+ 97
2224
+ 98
2225
+ 99
2226
+ 100
2227
+ 101
2228
+ 102
2229
+ 103
2230
+ 104
2231
+ 105
2232
+ 106
2233
+ 107
2234
+ 108
2235
+ 109
2236
+ 110
2237
+ 111
2238
+ 112
2239
+ 113
2240
+ 114
2241
+ 115
2242
+ 116
2243
+ 117
2244
+ 118
2245
+ 119
2246
+ 120
2247
+ 121
2248
+ 122
2249
+ 123
2250
+ 124
2251
+ 125
2252
+ 126
2253
+ 127
2254
+ 128
2255
+ 129
2256
+ 130
2257
+ 131
2258
+ 132
2259
+ 133
2260
+ 134
2261
+ 135
2262
+ 136
2263
+ 137
2264
+ 138
2265
+ 139
2266
+ 140
2267
+ 141
2268
+ 142
2269
+ 143
2270
+ 144
2271
+ 145
2272
+ 146
2273
+ 147
2274
+ 148
2275
+ 149
2276
+ 150
2277
+ 151
2278
+ 152
2279
+ 153
2280
+ 154
2281
+ 155
2282
+ 156
2283
+ 157
2284
+ 158
2285
+ 159
2286
+ 160
2287
+ 161
2288
+ 162
2289
+ 163
2290
+ 164
2291
+ 165
2292
+ 166
2293
+ 167
2294
+ 168
2295
+ 169
2296
+ 170
2297
+ 171
2298
+ 172
2299
+ 173
2300
+ 174
2301
+ 175
2302
+ 176
2303
+ 177
2304
+ 178
2305
+ 179
2306
+ 180
2307
+ 181
2308
+ 182
2309
+ 183
2310
+ 184
2311
+ 185
2312
+ 186
2313
+ 187
2314
+ 188
2315
+ 189
2316
+ 190
2317
+ 191
2318
+ 192
2319
+ 193
2320
+ 194
2321
+ 195
2322
+ 196
2323
+ 197
2324
+ 198
2325
+ 199
2326
+ 200
2327
+ 201
2328
+ 202
2329
+ 203
2330
+ 204
2331
+ 205
2332
+ 206
2333
+ 207
2334
+ 208
2335
+ 209
2336
+ 210
2337
+ 211
2338
+ 212
2339
+ 213
2340
+ 214
2341
+ 215
2342
+ 216
2343
+ 217
2344
+ 218
2345
+ 219
2346
+ 220
2347
+ 221
2348
+ 222
2349
+ 223
2350
+ 224
2351
+ 225
2352
+ 226
2353
+ 227
2354
+ 228
2355
+ 229
2356
+ 230
2357
+ 231
2358
+ 232
2359
+ 233
2360
+ 234
2361
+ 235
2362
+ 236
2363
+ 237
2364
+ 238
2365
+ 239
2366
+ 240
2367
+ 241
2368
+ 242
2369
+ 243
2370
+ 244</pre>
2371
+ </td>
2372
+ <td>
2373
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 16</span>
2374
+
2375
+ <span class='kw'>class</span> <span class='const'>Reactor</span>
2376
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span>
2377
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span><span class='op'>::</span><span class='const'>IO</span>
2378
+ <span class='id identifier rubyid_include'>include</span> <span class='const'>Celluloid</span><span class='op'>::</span><span class='const'>Logger</span>
2379
+
2380
+ <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:websocket</span><span class='comma'>,</span> <span class='symbol'>:server</span><span class='comma'>,</span> <span class='symbol'>:mutex</span><span class='comma'>,</span> <span class='symbol'>:channels</span>
2381
+
2382
+ <span class='comment'># rececives a new socket connection from the server
2383
+ </span> <span class='comment'># and initiates a new mutex that can be used when subsribing to a channel
2384
+ </span> <span class='comment'>#
2385
+ </span> <span class='comment'># @param [Reel::WebSocket] websocket
2386
+ </span> <span class='comment'>#
2387
+ </span> <span class='comment'># @return [void]
2388
+ </span> <span class='comment'>#
2389
+ </span> <span class='comment'># @api public
2390
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_work'>work</span><span class='lparen'>(</span><span class='id identifier rubyid_websocket'>websocket</span><span class='comma'>,</span> <span class='id identifier rubyid_server'>server</span><span class='rparen'>)</span>
2391
+ <span class='ivar'>@server</span> <span class='op'>=</span> <span class='id identifier rubyid_server'>server</span>
2392
+ <span class='ivar'>@mutex</span> <span class='op'>=</span> <span class='const'>Mutex</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
2393
+ <span class='ivar'>@channels</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
2394
+ <span class='ivar'>@websocket</span> <span class='op'>=</span> <span class='id identifier rubyid_websocket'>websocket</span>
2395
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Streaming changes for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_url'>url</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2396
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_run'>run</span>
2397
+ <span class='kw'>end</span>
2398
+
2399
+ <span class='comment'># reads from the socket the message
2400
+ </span> <span class='comment'># and dispatches it to the handle_websocket_message method
2401
+ </span> <span class='comment'># @see #handle_websocket_message
2402
+ </span> <span class='comment'>#
2403
+ </span> <span class='comment'># @return [void]
2404
+ </span> <span class='comment'>#
2405
+ </span> <span class='comment'># @api public
2406
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_run'>run</span>
2407
+ <span class='kw'>while</span> <span class='id identifier rubyid_message'>message</span> <span class='op'>=</span> <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span>
2408
+ <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2409
+ <span class='kw'>end</span>
2410
+ <span class='kw'>end</span>
2411
+
2412
+ <span class='comment'># method used to parse a JSON object into a Hash object
2413
+ </span> <span class='comment'>#
2414
+ </span> <span class='comment'># @param [JSON] message
2415
+ </span> <span class='comment'>#
2416
+ </span> <span class='comment'># @return [Hash]
2417
+ </span> <span class='comment'>#
2418
+ </span> <span class='comment'># @api public
2419
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2420
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor read message </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2421
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='kw'>nil</span>
2422
+ <span class='kw'>begin</span>
2423
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='const'>JSON</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2424
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
2425
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor could not parse </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_content'> because of </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2426
+ <span class='comment'># do nothing
2427
+ </span> <span class='kw'>end</span>
2428
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_message'>message</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
2429
+ <span class='id identifier rubyid_json_data'>json_data</span>
2430
+ <span class='kw'>end</span>
2431
+
2432
+ <span class='comment'># method that handles the message received from the websocket connection
2433
+ </span> <span class='comment'># first will try to parse the message {#parse_json_data} and then it will dispatch
2434
+ </span> <span class='comment'># it to another method that will decide depending the message what action
2435
+ </span> <span class='comment'># should the reactor take {#handle_parsed_websocket_message}
2436
+ </span> <span class='comment'>#
2437
+ </span> <span class='comment'># @see #parse_json_data
2438
+ </span> <span class='comment'># @see #handle_parsed_websocket_message
2439
+ </span> <span class='comment'>#
2440
+ </span> <span class='comment'># @param [JSON] message
2441
+ </span> <span class='comment'>#
2442
+ </span> <span class='comment'># @return [void]
2443
+ </span> <span class='comment'>#
2444
+ </span> <span class='comment'># @api public
2445
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2446
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2447
+ <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2448
+ <span class='kw'>end</span>
2449
+
2450
+ <span class='comment'># method that checks if the data is a Hash
2451
+ </span> <span class='comment'>#
2452
+ </span> <span class='comment'># if the data is a hash then will stringify the keys and will call the method {#delegate_action}
2453
+ </span> <span class='comment'># that will handle the message, otherwise will call the method {#handle_unknown_action}
2454
+ </span> <span class='comment'>#
2455
+ </span> <span class='comment'># @see #delegate_action
2456
+ </span> <span class='comment'># @see #handle_unknown_action
2457
+ </span> <span class='comment'>#
2458
+ </span> <span class='comment'># @param [Hash] json_data
2459
+ </span> <span class='comment'>#
2460
+ </span> <span class='comment'># @return [void]
2461
+ </span> <span class='comment'>#
2462
+ </span> <span class='comment'># @api public
2463
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2464
+ <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>Hash</span><span class='rparen'>)</span>
2465
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_stringify_keys'>stringify_keys</span>
2466
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor finds actions for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2467
+ <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
2468
+ <span class='kw'>else</span>
2469
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2470
+ <span class='kw'>end</span>
2471
+ <span class='kw'>end</span>
2472
+
2473
+ <span class='comment'># method that checks if the data is a Hash
2474
+ </span> <span class='comment'>#
2475
+ </span> <span class='comment'># if the data is a hash then will stringify the keys and will call the method {#delegate_action}
2476
+ </span> <span class='comment'># that will handle the message, otherwise will call the method {#handle_unknown_action}
2477
+ </span> <span class='comment'>#
2478
+ </span> <span class='comment'># @see #delegate_action
2479
+ </span> <span class='comment'># @see #handle_unknown_action
2480
+ </span> <span class='comment'>#
2481
+ </span> <span class='comment'># @param [Hash] json_data
2482
+ </span> <span class='comment'># @option json_data [String] :client_action The action based on which the reactor will decide what action should make
2483
+ </span> <span class='comment'>#
2484
+ </span> <span class='comment'># Possible values are:
2485
+ </span> <span class='comment'># unsubscribe_client
2486
+ </span> <span class='comment'># unsubscribe
2487
+ </span> <span class='comment'># subscribe
2488
+ </span> <span class='comment'># publish
2489
+ </span> <span class='comment'>#
2490
+ </span> <span class='comment'>#
2491
+ </span> <span class='comment'># @return [void]
2492
+ </span> <span class='comment'>#
2493
+ </span> <span class='comment'># @api public
2494
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2495
+ <span class='kw'>case</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span>
2496
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe_all</span><span class='tstring_end'>&#39;</span></span>
2497
+ <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
2498
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe</span><span class='tstring_end'>&#39;</span></span>
2499
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
2500
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>subscribe</span><span class='tstring_end'>&#39;</span></span>
2501
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2502
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>publish</span><span class='tstring_end'>&#39;</span></span>
2503
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_publish_event'>publish_event</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>data</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span><span class='rparen'>)</span>
2504
+ <span class='kw'>else</span>
2505
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2506
+ <span class='kw'>end</span>
2507
+ <span class='kw'>end</span>
2508
+
2509
+ <span class='comment'># the method will delegate the message to the server in an asyncronous way by sending the current actor and the message
2510
+ </span> <span class='comment'># @see {CelluloidPubsub::WebServer#handle_dispatched_message}
2511
+ </span> <span class='comment'>#
2512
+ </span> <span class='comment'># @param [Hash] json_data
2513
+ </span> <span class='comment'>#
2514
+ </span> <span class='comment'># @return [void]
2515
+ </span> <span class='comment'>#
2516
+ </span> <span class='comment'># @api public
2517
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2518
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Trying to dispatch to server </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2519
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_handle_dispatched_message'>handle_dispatched_message</span><span class='lparen'>(</span><span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2520
+ <span class='kw'>end</span>
2521
+
2522
+ <span class='comment'># the method will unsubscribe a client by closing the websocket connection if has unscribed from all channels
2523
+ </span> <span class='comment'># and deleting the reactor from the channel list on the server
2524
+ </span> <span class='comment'>#
2525
+ </span> <span class='comment'># @param [String] channel
2526
+ </span> <span class='comment'>#
2527
+ </span> <span class='comment'># @return [void]
2528
+ </span> <span class='comment'>#
2529
+ </span> <span class='comment'># @api public
2530
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
2531
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
2532
+ <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
2533
+ <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span> <span class='kw'>if</span> <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span>
2534
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_delete_if'>delete_if</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
2535
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span>
2536
+ <span class='kw'>end</span>
2537
+ <span class='kw'>end</span>
2538
+
2539
+ <span class='comment'># the method will terminate the current actor
2540
+ </span> <span class='comment'>#
2541
+ </span> <span class='comment'>#
2542
+ </span> <span class='comment'># @return [void]
2543
+ </span> <span class='comment'>#
2544
+ </span> <span class='comment'># @api public
2545
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_shutdown'>shutdown</span>
2546
+ <span class='id identifier rubyid_terminate'>terminate</span>
2547
+ <span class='kw'>end</span>
2548
+
2549
+ <span class='comment'># this method will add the current actor to the list of the subscribers {#add_subscriber_to_channel}
2550
+ </span> <span class='comment'># and will write to the socket a message for succesful subscription
2551
+ </span> <span class='comment'>#
2552
+ </span> <span class='comment'># @see #add_subscriber_to_channel
2553
+ </span> <span class='comment'>#
2554
+ </span> <span class='comment'># @param [String] channel
2555
+ </span> <span class='comment'># @param [Object] message
2556
+ </span> <span class='comment'>#
2557
+ </span> <span class='comment'># @return [void]
2558
+ </span> <span class='comment'>#
2559
+ </span> <span class='comment'># @api public
2560
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2561
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
2562
+ <span class='kw'>begin</span>
2563
+ <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2564
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Subscribed to </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_channel'>channel</span><span class='embexpr_end'>}</span><span class='tstring_content'> with </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2565
+ <span class='ivar'>@websocket</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_message'>message</span><span class='period'>.</span><span class='id identifier rubyid_merge'>merge</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>successful_subscription</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span>
2566
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
2567
+ <span class='id identifier rubyid_raise'>raise</span> <span class='lbracket'>[</span><span class='id identifier rubyid_e'>e</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='symbol'>:backtrace</span><span class='rparen'>)</span> <span class='op'>?</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_backtrace'>backtrace</span> <span class='op'>:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
2568
+ <span class='kw'>end</span>
2569
+ <span class='kw'>end</span>
2570
+
2571
+ <span class='comment'># adds the curent actor the list of the subscribers for a particular channel
2572
+ </span> <span class='comment'># and registers the new channel
2573
+ </span> <span class='comment'>#
2574
+ </span> <span class='comment'># @param [String] channel
2575
+ </span> <span class='comment'># @param [Object] message
2576
+ </span> <span class='comment'>#
2577
+ </span> <span class='comment'># @return [void]
2578
+ </span> <span class='comment'>#
2579
+ </span> <span class='comment'># @api public
2580
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2581
+ <span class='ivar'>@channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span>
2582
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span> <span class='kw'>unless</span> <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
2583
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>||=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
2584
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>&lt;&lt;</span> <span class='lbrace'>{</span> <span class='label'>reactor:</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='label'>message:</span> <span class='id identifier rubyid_message'>message</span> <span class='rbrace'>}</span>
2585
+ <span class='kw'>end</span>
2586
+
2587
+ <span class='comment'># unsubscribes all actors from all channels and terminates the curent actor
2588
+ </span> <span class='comment'>#
2589
+ </span> <span class='comment'># @return [void]
2590
+ </span> <span class='comment'>#
2591
+ </span> <span class='comment'># @api public
2592
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
2593
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_channel'>channel</span><span class='op'>|</span>
2594
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
2595
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span>
2596
+ <span class='kw'>end</span>
2597
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
2598
+ <span class='kw'>end</span>
2599
+
2600
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>clearing connections</span><span class='tstring_end'>&#39;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2601
+ <span class='id identifier rubyid_shutdown'>shutdown</span>
2602
+ <span class='kw'>end</span>
2603
+ <span class='kw'>end</span></pre>
2604
+ </td>
2605
+ </tr>
2606
+ </table>
2607
+ </div>
2608
+
2609
+ </div>
2610
+
2611
+
2612
+ <div id="instance_method_details" class="method_details_list">
2613
+ <h2>Instance Method Details</h2>
2614
+
2615
+
2616
+ <div class="method_details first">
2617
+ <h3 class="signature first" id="add_subscriber_to_channel-instance_method">
2618
+
2619
+ - (<tt>void</tt>) <strong>add_subscriber_to_channel</strong>(channel, message)
2620
+
2621
+
2622
+
2623
+
2624
+
2625
+ </h3><div class="docstring">
2626
+ <div class="discussion">
2627
+ <p class="note returns_void">This method returns an undefined value.</p>
2628
+ <p>adds the curent actor the list of the subscribers for a particular channel
2629
+ and registers the new channel</p>
2630
+
2631
+
2632
+ </div>
2633
+ </div>
2634
+ <div class="tags">
2635
+ <p class="tag_title">Parameters:</p>
2636
+ <ul class="param">
2637
+
2638
+ <li>
2639
+
2640
+ <span class='name'>channel</span>
2641
+
2642
+
2643
+ <span class='type'>(<tt>String</tt>)</span>
2644
+
2645
+
2646
+
2647
+ </li>
2648
+
2649
+ <li>
2650
+
2651
+ <span class='name'>message</span>
2652
+
2653
+
2654
+ <span class='type'>(<tt>Object</tt>)</span>
2655
+
2656
+
2657
+
2658
+ </li>
2659
+
2660
+ </ul>
2661
+
2662
+
2663
+ </div><table class="source_code">
2664
+ <tr>
2665
+ <td>
2666
+ <pre class="lines">
2667
+
2668
+
2669
+ 221
2670
+ 222
2671
+ 223
2672
+ 224
2673
+ 225
2674
+ 226</pre>
2675
+ </td>
2676
+ <td>
2677
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 221</span>
2678
+
2679
+ <span class='kw'>def</span> <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
2680
+ <span class='ivar'>@channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span>
2681
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_channel'>channel</span> <span class='kw'>unless</span> <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
2682
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>||=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
2683
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>&lt;&lt;</span> <span class='lbrace'>{</span> <span class='label'>reactor:</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='label'>message:</span> <span class='id identifier rubyid_message'>message</span> <span class='rbrace'>}</span>
2684
+ <span class='kw'>end</span></pre>
2685
+ </td>
2686
+ </tr>
2687
+ </table>
2688
+ </div>
2689
+
2690
+ <div class="method_details ">
2691
+ <h3 class="signature " id="delegate_action-instance_method">
2692
+
2693
+ - (<tt>void</tt>) <strong>delegate_action</strong>(json_data)
2694
+
2695
+
2696
+
2697
+
2698
+
2699
+ </h3><div class="docstring">
2700
+ <div class="discussion">
2701
+ <p class="note returns_void">This method returns an undefined value.</p>
2702
+ <p>method that checks if the data is a Hash</p>
2703
+
2704
+ <p>if the data is a hash then will stringify the keys and will call the method
2705
+ <span class='object_link'><a href="#delegate_action-instance_method" title="CelluloidPubsub::Reactor#delegate_action (method)">#delegate_action</a></span> that will handle the message, otherwise will call the
2706
+ method <span class='object_link'><a href="#handle_unknown_action-instance_method" title="CelluloidPubsub::Reactor#handle_unknown_action (method)">#handle_unknown_action</a></span></p>
2707
+
2708
+
2709
+ </div>
2710
+ </div>
2711
+ <div class="tags">
2712
+ <p class="tag_title">Parameters:</p>
2713
+ <ul class="param">
2714
+
2715
+ <li>
2716
+
2717
+ <span class='name'>json_data</span>
2718
+
2719
+
2720
+ <span class='type'>(<tt>Hash</tt>)</span>
2721
+
2722
+
2723
+
2724
+ </li>
2725
+
2726
+ </ul>
2727
+
2728
+
2729
+
2730
+
2731
+ <p class="tag_title">Options Hash (<tt>json_data</tt>):</p>
2732
+ <ul class="option">
2733
+
2734
+ <li>
2735
+ <span class="name">:client_action</span>
2736
+ <span class="type">(<tt>String</tt>)</span>
2737
+ <span class="default">
2738
+
2739
+ </span>
2740
+
2741
+ &mdash; <div class='inline'>
2742
+ <p>The action based on which the reactor will decide what action should make</p>
2743
+
2744
+ <p>Possible values are:</p>
2745
+
2746
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span>
2747
+ <span class='id identifier rubyid_unsubscribe'>unsubscribe</span>
2748
+ <span class='id identifier rubyid_subscribe'>subscribe</span>
2749
+ <span class='id identifier rubyid_publish'>publish</span></code></pre>
2750
+ </div>
2751
+
2752
+ </li>
2753
+
2754
+ </ul>
2755
+
2756
+
2757
+
2758
+ <p class="tag_title">See Also:</p>
2759
+ <ul class="see">
2760
+
2761
+ <li><span class='object_link'><a href="#delegate_action-instance_method" title="CelluloidPubsub::Reactor#delegate_action (method)">#delegate_action</a></span></li>
2762
+
2763
+ <li><span class='object_link'><a href="#handle_unknown_action-instance_method" title="CelluloidPubsub::Reactor#handle_unknown_action (method)">#handle_unknown_action</a></span></li>
2764
+
2765
+ </ul>
2766
+
2767
+ </div><table class="source_code">
2768
+ <tr>
2769
+ <td>
2770
+ <pre class="lines">
2771
+
2772
+
2773
+ 135
2774
+ 136
2775
+ 137
2776
+ 138
2777
+ 139
2778
+ 140
2779
+ 141
2780
+ 142
2781
+ 143
2782
+ 144
2783
+ 145
2784
+ 146
2785
+ 147
2786
+ 148</pre>
2787
+ </td>
2788
+ <td>
2789
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 135</span>
2790
+
2791
+ <span class='kw'>def</span> <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2792
+ <span class='kw'>case</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span>
2793
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe_all</span><span class='tstring_end'>&#39;</span></span>
2794
+ <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
2795
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unsubscribe</span><span class='tstring_end'>&#39;</span></span>
2796
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
2797
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>subscribe</span><span class='tstring_end'>&#39;</span></span>
2798
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2799
+ <span class='kw'>when</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>publish</span><span class='tstring_end'>&#39;</span></span>
2800
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_publish_event'>publish_event</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>data</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span><span class='rparen'>)</span>
2801
+ <span class='kw'>else</span>
2802
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2803
+ <span class='kw'>end</span>
2804
+ <span class='kw'>end</span></pre>
2805
+ </td>
2806
+ </tr>
2807
+ </table>
2808
+ </div>
2809
+
2810
+ <div class="method_details ">
2811
+ <h3 class="signature " id="handle_parsed_websocket_message-instance_method">
2812
+
2813
+ - (<tt>void</tt>) <strong>handle_parsed_websocket_message</strong>(json_data)
2814
+
2815
+
2816
+
2817
+
2818
+
2819
+ </h3><div class="docstring">
2820
+ <div class="discussion">
2821
+ <p class="note returns_void">This method returns an undefined value.</p>
2822
+ <p>method that checks if the data is a Hash</p>
2823
+
2824
+ <p>if the data is a hash then will stringify the keys and will call the method
2825
+ <span class='object_link'><a href="#delegate_action-instance_method" title="CelluloidPubsub::Reactor#delegate_action (method)">#delegate_action</a></span> that will handle the message, otherwise will call the
2826
+ method <span class='object_link'><a href="#handle_unknown_action-instance_method" title="CelluloidPubsub::Reactor#handle_unknown_action (method)">#handle_unknown_action</a></span></p>
2827
+
2828
+
2829
+ </div>
2830
+ </div>
2831
+ <div class="tags">
2832
+ <p class="tag_title">Parameters:</p>
2833
+ <ul class="param">
2834
+
2835
+ <li>
2836
+
2837
+ <span class='name'>json_data</span>
2838
+
2839
+
2840
+ <span class='type'>(<tt>Hash</tt>)</span>
2841
+
2842
+
2843
+
2844
+ </li>
2845
+
2846
+ </ul>
2847
+
2848
+
2849
+ <p class="tag_title">See Also:</p>
2850
+ <ul class="see">
2851
+
2852
+ <li><span class='object_link'><a href="#delegate_action-instance_method" title="CelluloidPubsub::Reactor#delegate_action (method)">#delegate_action</a></span></li>
2853
+
2854
+ <li><span class='object_link'><a href="#handle_unknown_action-instance_method" title="CelluloidPubsub::Reactor#handle_unknown_action (method)">#handle_unknown_action</a></span></li>
2855
+
2856
+ </ul>
2857
+
2858
+ </div><table class="source_code">
2859
+ <tr>
2860
+ <td>
2861
+ <pre class="lines">
2862
+
2863
+
2864
+ 104
2865
+ 105
2866
+ 106
2867
+ 107
2868
+ 108
2869
+ 109
2870
+ 110
2871
+ 111
2872
+ 112</pre>
2873
+ </td>
2874
+ <td>
2875
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 104</span>
2876
+
2877
+ <span class='kw'>def</span> <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2878
+ <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>Hash</span><span class='rparen'>)</span>
2879
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_stringify_keys'>stringify_keys</span>
2880
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor finds actions for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2881
+ <span class='id identifier rubyid_delegate_action'>delegate_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
2882
+ <span class='kw'>else</span>
2883
+ <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2884
+ <span class='kw'>end</span>
2885
+ <span class='kw'>end</span></pre>
2886
+ </td>
2887
+ </tr>
2888
+ </table>
2889
+ </div>
2890
+
2891
+ <div class="method_details ">
2892
+ <h3 class="signature " id="handle_unknown_action-instance_method">
2893
+
2894
+ - (<tt>void</tt>) <strong>handle_unknown_action</strong>(json_data)
2895
+
2896
+
2897
+
2898
+
2899
+
2900
+ </h3><div class="docstring">
2901
+ <div class="discussion">
2902
+ <p class="note returns_void">This method returns an undefined value.</p>
2903
+ <p>the method will delegate the message to the server in an asyncronous way by
2904
+ sending the current actor and the message</p>
2905
+
2906
+
2907
+ </div>
2908
+ </div>
2909
+ <div class="tags">
2910
+ <p class="tag_title">Parameters:</p>
2911
+ <ul class="param">
2912
+
2913
+ <li>
2914
+
2915
+ <span class='name'>json_data</span>
2916
+
2917
+
2918
+ <span class='type'>(<tt>Hash</tt>)</span>
2919
+
2920
+
2921
+
2922
+ </li>
2923
+
2924
+ </ul>
2925
+
2926
+
2927
+ <p class="tag_title">See Also:</p>
2928
+ <ul class="see">
2929
+
2930
+ <li>CelluloidPubsub::Reactor.{CelluloidPubsub{CelluloidPubsub::WebServer{CelluloidPubsub::WebServer#handle_dispatched_message}</li>
2931
+
2932
+ </ul>
2933
+
2934
+ </div><table class="source_code">
2935
+ <tr>
2936
+ <td>
2937
+ <pre class="lines">
2938
+
2939
+
2940
+ 158
2941
+ 159
2942
+ 160
2943
+ 161</pre>
2944
+ </td>
2945
+ <td>
2946
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 158</span>
2947
+
2948
+ <span class='kw'>def</span> <span class='id identifier rubyid_handle_unknown_action'>handle_unknown_action</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2949
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Trying to dispatch to server </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_json_data'>json_data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
2950
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_handle_dispatched_message'>handle_dispatched_message</span><span class='lparen'>(</span><span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='comma'>,</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
2951
+ <span class='kw'>end</span></pre>
2952
+ </td>
2953
+ </tr>
2954
+ </table>
2955
+ </div>
2956
+
2957
+ <div class="method_details ">
2958
+ <h3 class="signature " id="handle_websocket_message-instance_method">
2959
+
2960
+ - (<tt>void</tt>) <strong>handle_websocket_message</strong>(message)
2961
+
2962
+
2963
+
2964
+
2965
+
2966
+ </h3><div class="docstring">
2967
+ <div class="discussion">
2968
+ <p class="note returns_void">This method returns an undefined value.</p>
2969
+ <p>method that handles the message received from the websocket connection
2970
+ first will try to parse the message <span class='object_link'><a href="#parse_json_data-instance_method" title="CelluloidPubsub::Reactor#parse_json_data (method)">#parse_json_data</a></span> and then it will
2971
+ dispatch it to another method that will decide depending the message what
2972
+ action should the reactor take <span class='object_link'><a href="#handle_parsed_websocket_message-instance_method" title="CelluloidPubsub::Reactor#handle_parsed_websocket_message (method)">#handle_parsed_websocket_message</a></span></p>
2973
+
2974
+
2975
+ </div>
2976
+ </div>
2977
+ <div class="tags">
2978
+ <p class="tag_title">Parameters:</p>
2979
+ <ul class="param">
2980
+
2981
+ <li>
2982
+
2983
+ <span class='name'>message</span>
2984
+
2985
+
2986
+ <span class='type'>(<tt>JSON</tt>)</span>
2987
+
2988
+
2989
+
2990
+ </li>
2991
+
2992
+ </ul>
2993
+
2994
+
2995
+ <p class="tag_title">See Also:</p>
2996
+ <ul class="see">
2997
+
2998
+ <li><span class='object_link'><a href="#parse_json_data-instance_method" title="CelluloidPubsub::Reactor#parse_json_data (method)">#parse_json_data</a></span></li>
2999
+
3000
+ <li><span class='object_link'><a href="#handle_parsed_websocket_message-instance_method" title="CelluloidPubsub::Reactor#handle_parsed_websocket_message (method)">#handle_parsed_websocket_message</a></span></li>
3001
+
3002
+ </ul>
3003
+
3004
+ </div><table class="source_code">
3005
+ <tr>
3006
+ <td>
3007
+ <pre class="lines">
3008
+
3009
+
3010
+ 86
3011
+ 87
3012
+ 88
3013
+ 89</pre>
3014
+ </td>
3015
+ <td>
3016
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 86</span>
3017
+
3018
+ <span class='kw'>def</span> <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
3019
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
3020
+ <span class='id identifier rubyid_handle_parsed_websocket_message'>handle_parsed_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_json_data'>json_data</span><span class='rparen'>)</span>
3021
+ <span class='kw'>end</span></pre>
3022
+ </td>
3023
+ </tr>
3024
+ </table>
3025
+ </div>
3026
+
3027
+ <div class="method_details ">
3028
+ <h3 class="signature " id="parse_json_data-instance_method">
3029
+
3030
+ - (<tt>Hash</tt>) <strong>parse_json_data</strong>(message)
3031
+
3032
+
3033
+
3034
+
3035
+
3036
+ </h3><div class="docstring">
3037
+ <div class="discussion">
3038
+
3039
+ <p>method used to parse a JSON object into a Hash object</p>
3040
+
3041
+
3042
+ </div>
3043
+ </div>
3044
+ <div class="tags">
3045
+ <p class="tag_title">Parameters:</p>
3046
+ <ul class="param">
3047
+
3048
+ <li>
3049
+
3050
+ <span class='name'>message</span>
3051
+
3052
+
3053
+ <span class='type'>(<tt>JSON</tt>)</span>
3054
+
3055
+
3056
+
3057
+ </li>
3058
+
3059
+ </ul>
3060
+
3061
+ <p class="tag_title">Returns:</p>
3062
+ <ul class="return">
3063
+
3064
+ <li>
3065
+
3066
+
3067
+ <span class='type'>(<tt>Hash</tt>)</span>
3068
+
3069
+
3070
+
3071
+ </li>
3072
+
3073
+ </ul>
3074
+
3075
+ </div><table class="source_code">
3076
+ <tr>
3077
+ <td>
3078
+ <pre class="lines">
3079
+
3080
+
3081
+ 60
3082
+ 61
3083
+ 62
3084
+ 63
3085
+ 64
3086
+ 65
3087
+ 66
3088
+ 67
3089
+ 68
3090
+ 69
3091
+ 70
3092
+ 71</pre>
3093
+ </td>
3094
+ <td>
3095
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 60</span>
3096
+
3097
+ <span class='kw'>def</span> <span class='id identifier rubyid_parse_json_data'>parse_json_data</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
3098
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor read message </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
3099
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='kw'>nil</span>
3100
+ <span class='kw'>begin</span>
3101
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='const'>JSON</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
3102
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
3103
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Reactor could not parse </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_content'> because of </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
3104
+ <span class='comment'># do nothing
3105
+ </span> <span class='kw'>end</span>
3106
+ <span class='id identifier rubyid_json_data'>json_data</span> <span class='op'>=</span> <span class='id identifier rubyid_message'>message</span> <span class='kw'>if</span> <span class='id identifier rubyid_json_data'>json_data</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
3107
+ <span class='id identifier rubyid_json_data'>json_data</span>
3108
+ <span class='kw'>end</span></pre>
3109
+ </td>
3110
+ </tr>
3111
+ </table>
3112
+ </div>
3113
+
3114
+ <div class="method_details ">
3115
+ <h3 class="signature " id="run-instance_method">
3116
+
3117
+ - (<tt>void</tt>) <strong>run</strong>
3118
+
3119
+
3120
+
3121
+
3122
+
3123
+ </h3><div class="docstring">
3124
+ <div class="discussion">
3125
+ <p class="note returns_void">This method returns an undefined value.</p>
3126
+ <p>reads from the socket the message and dispatches it to the
3127
+ handle_websocket_message method</p>
3128
+
3129
+
3130
+ </div>
3131
+ </div>
3132
+ <div class="tags">
3133
+
3134
+
3135
+ <p class="tag_title">See Also:</p>
3136
+ <ul class="see">
3137
+
3138
+ <li><span class='object_link'><a href="#handle_websocket_message-instance_method" title="CelluloidPubsub::Reactor#handle_websocket_message (method)">#handle_websocket_message</a></span></li>
3139
+
3140
+ </ul>
3141
+
3142
+ </div><table class="source_code">
3143
+ <tr>
3144
+ <td>
3145
+ <pre class="lines">
3146
+
3147
+
3148
+ 47
3149
+ 48
3150
+ 49
3151
+ 50
3152
+ 51</pre>
3153
+ </td>
3154
+ <td>
3155
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 47</span>
3156
+
3157
+ <span class='kw'>def</span> <span class='id identifier rubyid_run'>run</span>
3158
+ <span class='kw'>while</span> <span class='id identifier rubyid_message'>message</span> <span class='op'>=</span> <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span>
3159
+ <span class='id identifier rubyid_handle_websocket_message'>handle_websocket_message</span><span class='lparen'>(</span><span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
3160
+ <span class='kw'>end</span>
3161
+ <span class='kw'>end</span></pre>
3162
+ </td>
3163
+ </tr>
3164
+ </table>
3165
+ </div>
3166
+
3167
+ <div class="method_details ">
3168
+ <h3 class="signature " id="shutdown-instance_method">
3169
+
3170
+ - (<tt>void</tt>) <strong>shutdown</strong>
3171
+
3172
+
3173
+
3174
+
3175
+
3176
+ </h3><div class="docstring">
3177
+ <div class="discussion">
3178
+ <p class="note returns_void">This method returns an undefined value.</p>
3179
+ <p>the method will terminate the current actor</p>
3180
+
3181
+
3182
+ </div>
3183
+ </div>
3184
+ <div class="tags">
3185
+
3186
+
3187
+ </div><table class="source_code">
3188
+ <tr>
3189
+ <td>
3190
+ <pre class="lines">
3191
+
3192
+
3193
+ 186
3194
+ 187
3195
+ 188</pre>
3196
+ </td>
3197
+ <td>
3198
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 186</span>
3199
+
3200
+ <span class='kw'>def</span> <span class='id identifier rubyid_shutdown'>shutdown</span>
3201
+ <span class='id identifier rubyid_terminate'>terminate</span>
3202
+ <span class='kw'>end</span></pre>
3203
+ </td>
3204
+ </tr>
3205
+ </table>
3206
+ </div>
3207
+
3208
+ <div class="method_details ">
3209
+ <h3 class="signature " id="start_subscriber-instance_method">
3210
+
3211
+ - (<tt>void</tt>) <strong>start_subscriber</strong>(channel, message)
3212
+
3213
+
3214
+
3215
+
3216
+
3217
+ </h3><div class="docstring">
3218
+ <div class="discussion">
3219
+ <p class="note returns_void">This method returns an undefined value.</p>
3220
+ <p>this method will add the current actor to the list of the subscribers
3221
+ <span class='object_link'><a href="#add_subscriber_to_channel-instance_method" title="CelluloidPubsub::Reactor#add_subscriber_to_channel (method)">#add_subscriber_to_channel</a></span> and will write to the socket a message for
3222
+ succesful subscription</p>
3223
+
3224
+
3225
+ </div>
3226
+ </div>
3227
+ <div class="tags">
3228
+ <p class="tag_title">Parameters:</p>
3229
+ <ul class="param">
3230
+
3231
+ <li>
3232
+
3233
+ <span class='name'>channel</span>
3234
+
3235
+
3236
+ <span class='type'>(<tt>String</tt>)</span>
3237
+
3238
+
3239
+
3240
+ </li>
3241
+
3242
+ <li>
3243
+
3244
+ <span class='name'>message</span>
3245
+
3246
+
3247
+ <span class='type'>(<tt>Object</tt>)</span>
3248
+
3249
+
3250
+
3251
+ </li>
3252
+
3253
+ </ul>
3254
+
3255
+
3256
+ <p class="tag_title">See Also:</p>
3257
+ <ul class="see">
3258
+
3259
+ <li><span class='object_link'><a href="#add_subscriber_to_channel-instance_method" title="CelluloidPubsub::Reactor#add_subscriber_to_channel (method)">#add_subscriber_to_channel</a></span></li>
3260
+
3261
+ </ul>
3262
+
3263
+ </div><table class="source_code">
3264
+ <tr>
3265
+ <td>
3266
+ <pre class="lines">
3267
+
3268
+
3269
+ 201
3270
+ 202
3271
+ 203
3272
+ 204
3273
+ 205
3274
+ 206
3275
+ 207
3276
+ 208
3277
+ 209
3278
+ 210</pre>
3279
+ </td>
3280
+ <td>
3281
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 201</span>
3282
+
3283
+ <span class='kw'>def</span> <span class='id identifier rubyid_start_subscriber'>start_subscriber</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
3284
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
3285
+ <span class='kw'>begin</span>
3286
+ <span class='id identifier rubyid_add_subscriber_to_channel'>add_subscriber_to_channel</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rparen'>)</span>
3287
+ <span class='id identifier rubyid_debug'>debug</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Subscribed to </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_channel'>channel</span><span class='embexpr_end'>}</span><span class='tstring_content'> with </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
3288
+ <span class='ivar'>@websocket</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_message'>message</span><span class='period'>.</span><span class='id identifier rubyid_merge'>merge</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>client_action</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>successful_subscription</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>channel</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span>
3289
+ <span class='kw'>rescue</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
3290
+ <span class='id identifier rubyid_raise'>raise</span> <span class='lbracket'>[</span><span class='id identifier rubyid_e'>e</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='symbol'>:backtrace</span><span class='rparen'>)</span> <span class='op'>?</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_backtrace'>backtrace</span> <span class='op'>:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='id identifier rubyid_channel'>channel</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span>
3291
+ <span class='kw'>end</span>
3292
+ <span class='kw'>end</span></pre>
3293
+ </td>
3294
+ </tr>
3295
+ </table>
3296
+ </div>
3297
+
3298
+ <div class="method_details ">
3299
+ <h3 class="signature " id="unsubscribe_all-instance_method">
3300
+
3301
+ - (<tt>void</tt>) <strong>unsubscribe_all</strong>
3302
+
3303
+
3304
+
3305
+
3306
+
3307
+ </h3><div class="docstring">
3308
+ <div class="discussion">
3309
+ <p class="note returns_void">This method returns an undefined value.</p>
3310
+ <p>unsubscribes all actors from all channels and terminates the curent actor</p>
3311
+
3312
+
3313
+ </div>
3314
+ </div>
3315
+ <div class="tags">
3316
+
3317
+
3318
+ </div><table class="source_code">
3319
+ <tr>
3320
+ <td>
3321
+ <pre class="lines">
3322
+
3323
+
3324
+ 233
3325
+ 234
3326
+ 235
3327
+ 236
3328
+ 237
3329
+ 238
3330
+ 239
3331
+ 240
3332
+ 241
3333
+ 242
3334
+ 243</pre>
3335
+ </td>
3336
+ <td>
3337
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 233</span>
3338
+
3339
+ <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_all'>unsubscribe_all</span>
3340
+ <span class='const'>CelluloidPubsub</span><span class='op'>::</span><span class='const'>Registry</span><span class='period'>.</span><span class='id identifier rubyid_channels'>channels</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_channel'>channel</span><span class='op'>|</span>
3341
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
3342
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span>
3343
+ <span class='kw'>end</span>
3344
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
3345
+ <span class='kw'>end</span>
3346
+
3347
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>clearing connections</span><span class='tstring_end'>&#39;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
3348
+ <span class='id identifier rubyid_shutdown'>shutdown</span>
3349
+ <span class='kw'>end</span></pre>
3350
+ </td>
3351
+ </tr>
3352
+ </table>
3353
+ </div>
3354
+
3355
+ <div class="method_details ">
3356
+ <h3 class="signature " id="unsubscribe_client-instance_method">
3357
+
3358
+ - (<tt>void</tt>) <strong>unsubscribe_client</strong>(channel)
3359
+
3360
+
3361
+
3362
+
3363
+
3364
+ </h3><div class="docstring">
3365
+ <div class="discussion">
3366
+ <p class="note returns_void">This method returns an undefined value.</p>
3367
+ <p>the method will unsubscribe a client by closing the websocket connection if
3368
+ has unscribed from all channels and deleting the reactor from the channel
3369
+ list on the server</p>
3370
+
3371
+
3372
+ </div>
3373
+ </div>
3374
+ <div class="tags">
3375
+ <p class="tag_title">Parameters:</p>
3376
+ <ul class="param">
3377
+
3378
+ <li>
3379
+
3380
+ <span class='name'>channel</span>
3381
+
3382
+
3383
+ <span class='type'>(<tt>String</tt>)</span>
3384
+
3385
+
3386
+
3387
+ </li>
3388
+
3389
+ </ul>
3390
+
3391
+
3392
+ </div><table class="source_code">
3393
+ <tr>
3394
+ <td>
3395
+ <pre class="lines">
3396
+
3397
+
3398
+ 171
3399
+ 172
3400
+ 173
3401
+ 174
3402
+ 175
3403
+ 176
3404
+ 177
3405
+ 178</pre>
3406
+ </td>
3407
+ <td>
3408
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 171</span>
3409
+
3410
+ <span class='kw'>def</span> <span class='id identifier rubyid_unsubscribe_client'>unsubscribe_client</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
3411
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='id identifier rubyid_channel'>channel</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span>
3412
+ <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_channel'>channel</span><span class='rparen'>)</span>
3413
+ <span class='ivar'>@websocket</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span> <span class='kw'>if</span> <span class='ivar'>@channels</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span>
3414
+ <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_subscribers'>subscribers</span><span class='lbracket'>[</span><span class='id identifier rubyid_channel'>channel</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_delete_if'>delete_if</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_hash'>hash</span><span class='op'>|</span>
3415
+ <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='symbol'>:reactor</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='const'>Actor</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span>
3416
+ <span class='kw'>end</span>
3417
+ <span class='kw'>end</span></pre>
3418
+ </td>
3419
+ </tr>
3420
+ </table>
3421
+ </div>
3422
+
3423
+ <div class="method_details ">
3424
+ <h3 class="signature " id="work-instance_method">
3425
+
3426
+ - (<tt>void</tt>) <strong>work</strong>(websocket, server)
3427
+
3428
+
3429
+
3430
+
3431
+
3432
+ </h3><div class="docstring">
3433
+ <div class="discussion">
3434
+ <p class="note returns_void">This method returns an undefined value.</p>
3435
+ <p>rececives a new socket connection from the server</p>
3436
+
3437
+ <pre class="code ruby"><code class="ruby">and initiates a new mutex that can be used when subsribing to a channel</code></pre>
3438
+
3439
+
3440
+ </div>
3441
+ </div>
3442
+ <div class="tags">
3443
+ <p class="tag_title">Parameters:</p>
3444
+ <ul class="param">
3445
+
3446
+ <li>
3447
+
3448
+ <span class='name'>websocket</span>
3449
+
3450
+
3451
+ <span class='type'>(<tt>Reel::WebSocket</tt>)</span>
3452
+
3453
+
3454
+
3455
+ </li>
3456
+
3457
+ </ul>
3458
+
3459
+
3460
+ </div><table class="source_code">
3461
+ <tr>
3462
+ <td>
3463
+ <pre class="lines">
3464
+
3465
+
3466
+ 31
3467
+ 32
3468
+ 33
3469
+ 34
3470
+ 35
3471
+ 36
3472
+ 37
3473
+ 38</pre>
3474
+ </td>
3475
+ <td>
3476
+ <pre class="code"><span class="info file"># File 'lib/celluloid_pubsub/reactor.rb', line 31</span>
3477
+
3478
+ <span class='kw'>def</span> <span class='id identifier rubyid_work'>work</span><span class='lparen'>(</span><span class='id identifier rubyid_websocket'>websocket</span><span class='comma'>,</span> <span class='id identifier rubyid_server'>server</span><span class='rparen'>)</span>
3479
+ <span class='ivar'>@server</span> <span class='op'>=</span> <span class='id identifier rubyid_server'>server</span>
3480
+ <span class='ivar'>@mutex</span> <span class='op'>=</span> <span class='const'>Mutex</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
3481
+ <span class='ivar'>@channels</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
3482
+ <span class='ivar'>@websocket</span> <span class='op'>=</span> <span class='id identifier rubyid_websocket'>websocket</span>
3483
+ <span class='id identifier rubyid_info'>info</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Streaming changes for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_websocket'>websocket</span><span class='period'>.</span><span class='id identifier rubyid_url'>url</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='ivar'>@server</span><span class='period'>.</span><span class='id identifier rubyid_debug_enabled?'>debug_enabled?</span>
3484
+ <span class='id identifier rubyid_async'>async</span><span class='period'>.</span><span class='id identifier rubyid_run'>run</span>
3485
+ <span class='kw'>end</span></pre>
3486
+ </td>
3487
+ </tr>
3488
+ </table>
3489
+ </div>
3490
+
3491
+ </div>
3492
+
3493
+ </div>
3494
+
3495
+ <div id="footer">
3496
+ Generated on Fri Mar 13 12:25:42 2015 by
3497
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
3498
+ 0.8.7.6 (ruby-2.0.0).
3499
+ </div>
3500
+
3501
+ </body>
3502
+ </html>