signalapp/Signal-Server · warning · CallQualityInvalidArgumentsException

Call type not specified

Error message

Call type not specified

What it means

validateRequest in CallQualitySurveyManager throws when the survey request's callType is null or blank. callType distinguishes audio vs video calls and is required for survey analysis. The CallQualityInvalidArgumentsException includes the field name callType for the client to correct.

Solutions

  1. Set callType to a valid value (e.g. "audio" or "video") in the request body
  2. Have the client derive callType from the active call object rather than user input
  3. Log/inspect the outgoing JSON to confirm callType is non-blank before submission

Example fix

// before
{"startTimestamp": 1699999400, "endTimestamp": 1700000000}
// after
{"startTimestamp": 1699999400, "endTimestamp": 1700000000, "callType": "audio"}
Defensive patterns

Strategy: validation

Validate before calling

if (!request.callType || request.callType.trim() === '') { throw new Error('callType must be a non-empty string (e.g. audio/video)'); }

Type guard

const hasCallType = (r) => typeof r.callType === 'string' && r.callType.trim().length > 0;

Try / catch

try { await submitCallQualitySurvey(request); } catch (CallQualityInvalidArgumentsException e) { if ('callType'.equals(e.getField())) { request.setCallType(inferCallTypeFromSession()); resubmit(); } }

Prevention

When it happens

Trigger: submitCallQualitySurvey called with a SubmitCallQualitySurveyRequest whose callType is missing, empty, or whitespace-only.

Common situations: Clients omitting callType in the survey payload; enum/string mapping regressions after client upgrades; manually crafted API calls or integration tests leaving the field out.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of signalapp/Signal-Server@100ab61c82 (2026-09-09). Data as JSON: /api/errors/cd4a44b691b8ebfe. Report an issue: GitHub.

Appendix: source

Thrown at service/src/main/java/org/whispersystems/textsecuregcm/metrics/CallQualitySurveyManager.java:169

          }

          Metrics.counter(PUB_SUB_MESSAGE_COUNTER_NAME, "success", String.valueOf(throwable == null))
              .increment();
        });
  }

  @VisibleForTesting
  static void validateRequest(final SubmitCallQualitySurveyRequest request) throws CallQualityInvalidArgumentsException {
    if (request.getStartTimestamp() == 0) {
      throw new CallQualityInvalidArgumentsException("Start timestamp not specified", "startTimestamp");
    }

    if (request.getEndTimestamp() == 0) {
      throw new CallQualityInvalidArgumentsException("End timestamp not specified", "endTimestamp");
    }

    if (StringUtils.isBlank(request.getCallType())) {
      throw new CallQualityInvalidArgumentsException("Call type not specified", "callType");
    }

    if (StringUtils.isBlank(request.getCallEndReason())) {
      throw new CallQualityInvalidArgumentsException("Call end reason not specified", "callEndReason");
    }
  }
}

View on GitHub (pinned to 100ab61c82)