certify function

Future certify(
  1. dynamic certificants,
  2. dynamic policy,
  3. PairReturnType authority, [
  4. DefaultCertifyOPTType? opt,
])

Implementation

Future certify(dynamic certificants, dynamic policy, PairReturnType authority,
    [DefaultCertifyOPTType? opt]) async {
  opt ??= DEFAULT_OPTS;

  certificants = getCertificants(certificants);

  if (certificants == null) {
    throw ("No certificant found.");
  }

  final expiry = opt.expiry;

  final readPolicy = policy is CertifyPolicyType ? policy.read : null;

  final writePolicy = policy is CertifyPolicyType
      ? policy.write
      : (policy is String || policy is List) ||
              (policy.runtimeType == {}.runtimeType &&
                  (policy.containsKey("+") ||
                      policy.containsKey("#") ||
                      policy.containsKey(".") ||
                      policy.containsKey("=") ||
                      policy.containsKey("*") ||
                      policy.containsKey(">") ||
                      policy.containsKey("<")))
          ? policy
          : null;

  final block = opt.block;
  final readBlock = (block == {}.runtimeType && block!.containsKey('read')) &&
          (block!['read'] is String ||
              (block!['read'].runtimeType == {}.runtimeType &&
                  block!['read'].containsKey('#')))
      ? block!['read']
      : null;

  final writeBlock = block is String
      ? block
      : (block.runtimeType == {}.runtimeType && block!.containsKey('write')) &&
              (block!['write'] is String ||
                  (block!['write'].runtimeType == {}.runtimeType &&
                      block!['write'].containsKey('#')))
          ? block!['write']
          : null;

  if (readPolicy == null && writePolicy == null) {
    throw ("No policy found.");
  }

  final data = jsonEncode({
    'c': certificants,
    ...(expiry != null ? {'e': expiry} : {}),
    // inject expiry if possible
    ...(readPolicy != null ? {'r': readPolicy} : {}),
    // "r" stands for read, which means read permission.
    ...(writePolicy != null ? {'w': writePolicy} : {}),
    // "w" stands for write, which means write permission.
    ...(readBlock != null ? {'rb': readBlock} : {}),
    // inject READ block if possible
    ...(writeBlock != null ? {'wb': writeBlock} : {}),
    // inject WRITE block if possible
  });

  final certificate =
      await sign(data, authority, DefaultOptSignType.from(raw: true));

  if (opt.raw != null && opt.raw!) {
    return certificate;
  }

  return "SEA${jsonEncode(certificate)}";
}