poll method
Polls pending Streamable HTTP events for the active session.
Implementation
Future<List<McpSseEvent>> poll({
String? lastEventId,
Map<String, String> headers = const <String, String>{},
}) async {
if (protocolVersion == latestProtocolVersion) {
throw const McpStreamableProtocolException(
'MCP 2026 HTTP does not support GET polling',
);
}
return _runTrackedHttpOperation<List<McpSseEvent>>((operation) async {
final requestSessionState = _sessionStateSnapshot;
final requestAuthorizationState = _authorizationStateSnapshot;
final requestResumeState = _resumeStateSnapshot;
final requestProtocolVersion = protocolVersion;
final requestLastEventId = lastEventId ?? requestResumeState.lastEventId;
final request = await _openTrackedHttpRequest(
() => _httpClient.getUrl(endpoint),
operation,
requestAuthorizationState,
);
_applyHeaders(
request,
accept: _acceptSse,
lastEventId: requestLastEventId,
protocolVersion: requestProtocolVersion,
sessionState: requestSessionState,
authorizationState: requestAuthorizationState,
extraHeaders: headers,
);
final response = await _sendTrackedHttpRequest(request, operation);
final body = await _readTrackedHttpResponseBody(
request,
response,
operation,
);
_throwIfHttpErrorForSession(
response,
body,
expectedSessionToken: requestSessionState.token,
expectedAuthorizationToken: requestAuthorizationState.token,
);
if (!_isSse(response)) {
throw FormatException(
'Expected $_acceptSse response, got ${response.headers.contentType?.mimeType ?? 'unknown'}',
);
}
final events = parseMcpSseEvents(body);
for (final event in events) {
final value = event.jsonValue;
if (value != null) {
_validateJsonRpcSseMessageValue(value);
}
}
_validateMcpSseEventIds(events);
final ownsSessionState = identical(
_sessionStateToken,
requestSessionState.token,
);
_captureSessionHeaders(
response,
captureSessionState: ownsSessionState,
expectedSessionState: requestSessionState,
expectedProtocolVersion: requestProtocolVersion,
);
if (ownsSessionState) {
_captureLastEventId(
events,
expectedResumeToken: requestResumeState.token,
);
}
return events;
});
}