fix(gateway): имена событий и resumable-флаг по спецификации §8.3
- ROLE_CREATE/ROLE_UPDATE/ROLE_DELETE вместо GUILD_ROLE_*;
- выдача/снятие роли приходит как MEMBER_UPDATE с полным списком role_ids:
клиент пересчитывает доступные действия сразу после события;
- промах RESUME отдаёт INVALID_SESSION с {"resumable": true} и следом полный
READY — сессия сохраняется, повторный вход не нужен;
- тесты обновлены под новый контракт.
This commit is contained in:
@@ -357,9 +357,23 @@ func TestResumeReplaysMissedEvents(t *testing.T) {
|
||||
t.Fatalf("resume replay = %q, want CHANNEL_CREATE", replayed.T)
|
||||
}
|
||||
|
||||
// RESUME с неизвестной последовательностью приводит к полному READY.
|
||||
// RESUME с неизвестной последовательностью: INVALID_SESSION с признаком
|
||||
// resumable и следом полный READY (AGENT.md 8.3).
|
||||
third, _ := f.dial(t)
|
||||
send(t, third, gateway.OpResume, map[string]any{"token": token, "resume_seq": ready.S + 10000})
|
||||
invalid := readEnvelope(t, third)
|
||||
if invalid.Op != gateway.OpInvalidSess {
|
||||
t.Fatalf("stale resume op = %d, want INVALID_SESSION", invalid.Op)
|
||||
}
|
||||
var invalidPayload struct {
|
||||
Resumable bool `json:"resumable"`
|
||||
}
|
||||
if err := json.Unmarshal(invalid.D, &invalidPayload); err != nil {
|
||||
t.Fatalf("decode INVALID_SESSION: %v", err)
|
||||
}
|
||||
if !invalidPayload.Resumable {
|
||||
t.Fatal("resume failure must be marked resumable: the client keeps the session")
|
||||
}
|
||||
full := readEnvelope(t, third)
|
||||
if full.T != "READY" {
|
||||
t.Fatalf("stale resume = %q, want full READY", full.T)
|
||||
|
||||
Reference in New Issue
Block a user