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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// (C) Copyright 2024- ECMWF and individual contributors.
//
// This software is licensed under the terms of the Apache Licence Version 2.0
// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
// In applying this licence, ECMWF does not waive the privileges and immunities
// granted to it by virtue of its status as an intergovernmental organisation nor
// does it submit to any jurisdiction.
//! Replay-phase and supporting enums.
//!
//! The replay phase is one of the two axes of [`super::WatchMode`]-aware
//! watch state, alongside [`super::ConnectionStatus`]. It tracks where
//! the stream is in its replay-or-live lifecycle (D2, D15).
/// Initial resume position the watch was started from.
///
/// The reducer carries the start position inside [`ReplayPhase::Replaying`]
/// so it can be logged or inspected during a replay. Note the variants:
/// the reducer has no `Head` / `Live` variant because a live-only watch
/// starts directly in [`ReplayPhase::Live`] (no replay to do).
///
/// D17 caveat: a `Date` start is opaque to the reducer. The supervisor
/// converts it to a sequence cursor after the first committed
/// notification; the reducer does not own checkpoint state.
/// Replay-or-live phase of the watch.
///
/// Quoted directly from D2:
/// `Replaying { start, replay_completed: false }` is the initial phase
/// when constructed with a resume position; `Live` is the initial phase
/// when constructed without one. The reducer transitions to `Live`
/// only on receipt of a `replay_completed` event in `Watch` mode; in
/// `ReplayOnly` mode the phase stays in `Replaying` and flips
/// `replay_completed` to `true`. `GapDetected` records a gap reason;
/// `Closed` is terminal.
/// Why a gap was detected in the stream.
/// Why the watch session closed terminally.
///
/// The reducer enters [`ReplayPhase::Closed`] with one of these
/// reasons. `max_duration_reached` and `server_shutdown` are NOT close
/// reasons; per D2 they are routine reconnect triggers that mutate
/// only [`super::ConnectionStatus`].
/// Specific fatal-error kinds the watch can terminate with.
///
/// Each variant is reachable through [`super::WatchEvent::Fatal`] (or,
/// for `AuthenticationRejectedAfterRefresh`, through
/// [`super::WatchEvent::AuthRefreshCompleted`] with `success: false`).