fix: delay
This commit is contained in:
+20
-3
@@ -14,7 +14,9 @@ const (
|
|||||||
pongWait = 60 * time.Second
|
pongWait = 60 * time.Second
|
||||||
pingPeriod = (pongWait * 9) / 10
|
pingPeriod = (pongWait * 9) / 10
|
||||||
maxMessageSize = 4096
|
maxMessageSize = 4096
|
||||||
sendBuffer = 32
|
// بافرِ بزرگتر تا در سرورِ تکهستهای، هجومِ کوتاهِ وضعیتها (پخشِ کارت + چند حرکتِ
|
||||||
|
// بات) روی کلاینتِ کند باعثِ دورریختنِ پیام نشود.
|
||||||
|
sendBuffer = 256
|
||||||
)
|
)
|
||||||
|
|
||||||
// Client یک اتصال WebSocket یک بازیکن.
|
// Client یک اتصال WebSocket یک بازیکن.
|
||||||
@@ -96,14 +98,29 @@ func (c *Client) writePump() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// trySend ارسال غیرمسدودکننده؛ اگر اتصال بسته یا بافر پر بود پیام را میاندازد.
|
// trySend ارسالِ غیرمسدودکننده. اگر بافر پر باشد، بهجای دورریختنِ پیامِ جدید،
|
||||||
|
// «قدیمیترین» پیام دور ریخته میشود تا کلاینت روی جدیدترین وضعیت همگرا بماند
|
||||||
|
// (هر وضعیتِ کامل، وضعیتِ قبلی را باطل میکند). قبلاً جدیدترین دور ریخته میشد و
|
||||||
|
// کلاینت روی حالتِ کهنه گیر میکرد: کارتهای دست دیده نمیشد ولی باتها بازی میکردند.
|
||||||
// send هیچگاه close نمیشود؛ پس از done صرفاً پیام دور ریخته میشود (بدون panic).
|
// send هیچگاه close نمیشود؛ پس از done صرفاً پیام دور ریخته میشود (بدون panic).
|
||||||
func (c *Client) trySend(b []byte) {
|
func (c *Client) trySend(b []byte) {
|
||||||
|
for {
|
||||||
select {
|
select {
|
||||||
case <-c.done:
|
case <-c.done:
|
||||||
|
return
|
||||||
case c.send <- b:
|
case c.send <- b:
|
||||||
|
return
|
||||||
default:
|
default:
|
||||||
slog.Warn("client send buffer full, dropping message", "user", c.UserID)
|
// بافر پر است: یک پیامِ قدیمی را خالی کن و دوباره تلاش کن.
|
||||||
|
select {
|
||||||
|
case <-c.send:
|
||||||
|
slog.Warn("client send buffer full, dropping oldest", "user", c.UserID)
|
||||||
|
case <-c.done:
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
// بافر بین دو تلاش خالی شد (تولیدکنندهی دیگر آن را خالی کرد)؛ ادامه بده.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user