grim/amongchat
Clone
Summary
Browse
Changes
Graph
Initial revision
draft
default
tip
2020-09-23, Gary Kramlich
dead8a9014bd
Initial revision
package
muxer
type
Muxer
struct
{
secret
string
clients
map
[
*
Client
]
bool
queue
chan
interface
{}
register
chan
*
Client
shutdown
chan
bool
unregister
chan
*
Client
}
func
New
(
secret
string
)
*
Muxer
{
return
&
Muxer
{
secret
:
secret
,
queue
:
make
(
chan
interface
{},
10
),
register
:
make
(
chan
*
Client
),
shutdown
:
make
(
chan
bool
),
unregister
:
make
(
chan
*
Client
),
}
}
// Run manages all of the client connections and sends messages to them when
// necessary.
func
(
m
*
Muxer
)
Run
()
error
{
for
{
select
{
case
client
:=
<-
m
.
unregister
:
if
_
,
found
:=
m
.
clients
[
client
];
found
{
delete
(
m
.
clients
,
client
)
close
(
client
.
queue
)
}
case
client
:=
<-
m
.
register
:
m
.
clients
[
client
]
=
true
case
message
:=
<-
m
.
queue
:
for
client
:=
range
m
.
clients
{
select
{
case
client
.
queue
<-
message
:
default
:
m
.
unregister
<-
client
}
}
case
<-
m
.
shutdown
:
break
}
}
return
nil
}
// Close closes all connections and exits the run loop.
func
(
m
*
Muxer
)
Close
()
{
for
client
:=
range
m
.
clients
{
m
.
unregister
<-
client
}
m
.
shutdown
<-
true
}