You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
3.2 KiB
159 lines
3.2 KiB
package http |
|
|
|
import ( |
|
"net/http" |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/infra/discovery/model" |
|
"go-common/library/ecode" |
|
bm "go-common/library/net/http/blademaster" |
|
) |
|
|
|
const ( |
|
_pollWaitSecond = 30 * time.Second |
|
) |
|
|
|
func register(c *bm.Context) { |
|
arg := new(model.ArgRegister) |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
i := model.NewInstance(arg) |
|
if i.Status == 0 || i.Status > 2 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
// register replication |
|
if arg.DirtyTimestamp > 0 { |
|
i.DirtyTimestamp = arg.DirtyTimestamp |
|
} |
|
svr.Register(c, i, arg.LatestTimestamp, arg.Replication) |
|
c.JSON(nil, nil) |
|
} |
|
|
|
func renew(c *bm.Context) { |
|
arg := new(model.ArgRenew) |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
// renew |
|
c.JSON(svr.Renew(c, arg)) |
|
} |
|
|
|
func cancel(c *bm.Context) { |
|
arg := new(model.ArgCancel) |
|
if err := c.Bind(arg); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(nil, svr.Cancel(c, arg)) |
|
} |
|
|
|
func fetchAll(c *bm.Context) { |
|
c.JSON(svr.FetchAll(c), nil) |
|
} |
|
|
|
func fetch(c *bm.Context) { |
|
arg := new(model.ArgFetch) |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
c.JSON(svr.Fetch(c, arg)) |
|
} |
|
|
|
func fetchs(c *bm.Context) { |
|
arg := new(model.ArgFetchs) |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
c.JSON(svr.Fetchs(c, arg)) |
|
} |
|
|
|
func poll(c *bm.Context) { |
|
arg := new(model.ArgPolls) |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
ch, new, err := svr.Polls(c, arg) |
|
if err != nil && err != ecode.NotModified { |
|
c.JSON(nil, err) |
|
return |
|
} |
|
// wait for instance change |
|
select { |
|
case e := <-ch: |
|
if len(arg.Treeid) != 0 { |
|
c.JSON(e[strconv.FormatInt(arg.Treeid[0], 10)], nil) |
|
} else { |
|
c.JSON(e[arg.Appid[0]], nil) |
|
} |
|
if !new { |
|
svr.DelConns(arg) // broadcast will delete all connections of appid |
|
} |
|
case <-time.After(_pollWaitSecond): |
|
c.JSON(nil, ecode.NotModified) |
|
svr.DelConns(arg) |
|
case <-c.Writer.(http.CloseNotifier).CloseNotify(): |
|
c.JSON(nil, ecode.NotModified) |
|
svr.DelConns(arg) |
|
} |
|
} |
|
|
|
func polls(c *bm.Context) { |
|
arg := new(model.ArgPolls) |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
if len(arg.Treeid) != len(arg.LatestTimestamp) && len(arg.Appid) != len(arg.LatestTimestamp) { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
ch, new, err := svr.Polls(c, arg) |
|
if err != nil && err != ecode.NotModified { |
|
c.JSON(nil, err) |
|
return |
|
} |
|
// wait for instance change |
|
select { |
|
case e := <-ch: |
|
c.JSON(e, nil) |
|
if !new { |
|
svr.DelConns(arg) // broadcast will delete all connections of appid |
|
} |
|
case <-time.After(_pollWaitSecond): |
|
c.JSON(nil, ecode.NotModified) |
|
svr.DelConns(arg) |
|
case <-c.Writer.(http.CloseNotifier).CloseNotify(): |
|
c.JSON(nil, ecode.NotModified) |
|
svr.DelConns(arg) |
|
} |
|
} |
|
|
|
func polling(c *bm.Context) { |
|
arg := new(model.ArgPolling) |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
c.JSON(svr.Polling(c, arg)) |
|
} |
|
|
|
func set(c *bm.Context) { |
|
var ( |
|
arg = new(model.ArgSet) |
|
) |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
// len of status,metadata must equal to len of hostname or be zero |
|
if (len(arg.Hostname) != len(arg.Status) && len(arg.Status) != 0) || |
|
(len(arg.Hostname) != len(arg.Metadata) && len(arg.Metadata) != 0) { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(nil, svr.Set(c, arg)) |
|
} |
|
|
|
func nodes(c *bm.Context) { |
|
c.JSON(svr.Nodes(c), nil) |
|
}
|
|
|