sendString method

  1. @override
Future<bool> sendString(
  1. String payload
)
override

Sends the specified payload.

Returns true if sent successfully.

Implementation

@override
Future<bool> sendString(final String payload) async {
  final newRecord = PayloadRecord(
    accessToken: config.accessToken,
    endpoint: config.endpoint,
    payload: payload,
  );

  records.add(newRecord);
  records.where(didExpire).forEach(records.remove);

  if (_State.suspended) return false;

  final httpClient = config.httpClient();

  try {
    for (final record in records) {
      final response = await httpClient.post(
        uri,
        headers: headers,
        body: record.payload,
      );

      if (response.status == HttpStatus.success) {
        records.remove(record);
        continue;
      }

      log(response);
      switch (response.statusCode) {
        case 413: // Payload Too Large
        case 422: // Unprocessable Entity
          records.remove(record);
          break;
        case 429: // Too Many Requests
        case 500: // Internal Server Error
        case 501: // Not Implemented
        case 502: // Bad Gateway
        case 503: // Service Unavailable
        case 504: // Gateway Timeout
          _State.suspend(30.seconds);
          return false;
      }
    }

    return !records.contains(newRecord);
  } on http.ClientException catch (error, stackTrace) {
    log(error, stackTrace);
    return false;
  } finally {
    httpClient.close();
  }
}