call method

  1. @override
Future<SubmitResponse> call(
  1. Principal canisterId,
  2. CallOptions fields,
  3. Identity? identity
)
override

Implementation

@override
Future<SubmitResponse> call(
  Principal canisterId,
  CallOptions fields,
  Identity? identity,
) async {
  final id = identity ?? _identity;
  final canister = Principal.from(canisterId);
  final ecid = fields.effectiveCanisterId != null
      ? Principal.from(fields.effectiveCanisterId)
      : canister;
  final sender = id != null ? id.getPrincipal() : Principal.anonymous();

  final CallRequest submit = CallRequest(
    canisterId: canister,
    methodName: fields.methodName,
    arg: fields.arg,
    sender: sender,
    ingressExpiry: Expiry(_defaultIngressExpiryDeltaInMilliseconds),
  );

  final rsRequest = HttpAgentCallRequest(
    request: {
      'method': 'POST',
      'headers': {
        'Content-Type': 'application/cbor',
        ..._baseHeaders,
      },
    },
    body: submit,
  );
  final transformedRequest = await _transform(rsRequest);

  final newTransformed = await id!.transformRequest(transformedRequest);
  final body = cbor.cborEncode(newTransformed['body']);
  final response = await withRetry(
    () => _fetch!(
      endpoint: '/api/v2/canister/${ecid.toText()}/call',
      method: FetchMethod.post,
      headers: newTransformed['request']['headers'],
      body: body,
    ),
  );
  final requestId = requestIdOf(submit.toJson());

  if (!(response['ok'] as bool)) {
    throw AgentFetchError(
      statusCode: response['statusCode'],
      statusText: response['statusText'],
      body: response[body],
    );
  }

  return CallResponseBody.fromJson({...response, 'requestId': requestId});
}