-
Notifications
You must be signed in to change notification settings - Fork 4
/
P2PMulticast.as
112 lines (94 loc) · 4.22 KB
/
P2PMulticast.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package sk.yoz.net
{
import flash.events.EventDispatcher;
import flash.events.TimerEvent;
import flash.utils.Timer;
import sk.yoz.events.P2PMulticastEvent;
import sk.yoz.events.P2PMulticastPersistenceEvent;
import sk.yoz.events.P2PMulticastStreamEvent;
public class P2PMulticast extends EventDispatcher
{
private var stream:P2PMulticastStream;
private var persistence:IP2PMulticastPersistence;
private var clientReloadTimer:Timer;
public function P2PMulticast(persistence:IP2PMulticastPersistence, developerKey:String = "",
publishName:String = "", maxPeerConnections:uint = 0, handshakeURL:String = "",
clientConnectionTimeout:uint = 0)
{
super();
stream = new P2PMulticastStream(developerKey, publishName, maxPeerConnections,
handshakeURL, clientConnectionTimeout);
stream.addEventListener(P2PMulticastStreamEvent.CLIENT_ID_ASSIGNED, clientIdAssignedHandler);
stream.addEventListener(P2PMulticastStreamEvent.PEER_CONNECTED, peerConnectedHandler);
stream.addEventListener(P2PMulticastStreamEvent.PEER_DISCONNECTED, peerDisconnectedHandler);
stream.addEventListener(P2PMulticastStreamEvent.PEER_DATA, peerDataHandler);
this.persistence = persistence;
persistence.addEventListener(P2PMulticastPersistenceEvent.CLIENTS_DEFINED, clientsDefinedHandler);
}
public function get connected():Boolean
{
return stream.connected;
}
public function set debug(value:Boolean):void
{
if(stream)
stream.debug = value;
}
public function get onlineClients():Array
{
return stream.onlineClients;
}
public function broadcast(data:Object):Boolean
{
return stream.broadcast(data);
}
private function clientIdAssignedHandler(event:P2PMulticastStreamEvent):void
{
persistence.getClientList();
dispatchEvent(new P2PMulticastEvent(P2PMulticastEvent.STREAM_CONNECTED));
}
private function clientsDefinedHandler(event:P2PMulticastPersistenceEvent):void
{
var list:Array = event.data.list;
for each(var farID:String in list)
stream.connectClient(farID);
if(list.indexOf(stream.nearID) == -1)
list.push(stream.nearID);
persistence.saveClientList(list);
clientReloadTimer = new Timer(10000 + Math.random() * 5000, 1);
clientReloadTimer.addEventListener(TimerEvent.TIMER_COMPLETE, clientReloadTimerComplete);
clientReloadTimer.start();
}
private function clientReloadTimerComplete(event:TimerEvent):void
{
persistence.getClientList();
var timer:Timer = event.target as Timer;
timer.removeEventListener(TimerEvent.TIMER_COMPLETE, clientReloadTimerComplete);
timer = null;
}
private function peerDataHandler(event:P2PMulticastStreamEvent):void
{
dispatchEvent(new P2PMulticastEvent(P2PMulticastEvent.PEER_DATA, false, false, event.data));
}
private function peerConnectedHandler(event:P2PMulticastStreamEvent):void
{
var farID:String = event.data.farID;
verifyClient(farID);
dispatchEvent(new P2PMulticastEvent(P2PMulticastEvent.PEER_CONNECTED, false, true, event.data));
}
private function peerDisconnectedHandler(event:P2PMulticastStreamEvent):void
{
var farID:String = event.data.farID;
verifyClient(farID);
dispatchEvent(new P2PMulticastEvent(P2PMulticastEvent.PEER_DISCONNECTED, false, false, event.data));
}
private function verifyClient(farID:String):void
{
if(!stream.allConnected)
return;
var list:Array = stream.getClientList();
list.push(stream.nearID);
persistence.saveClientList(list);
}
}
}