run method

Future<Map<String, dynamic>> run({
  1. required String miniProgramId,
  2. required String action,
  3. required Map<String, dynamic> arguments,
  4. required MiniProgramNfcPolicy policy,
})

Implementation

Future<Map<String, dynamic>> run({
  required String miniProgramId,
  required String action,
  required Map<String, dynamic> arguments,
  required MiniProgramNfcPolicy policy,
}) async {
  if (_disposed) _fail('request_cancelled');
  final args = MiniProgramNfc.arguments(action, arguments);
  if (action == 'nfc.cancel') {
    final changed = _pending?.appId == miniProgramId;
    await releaseFor(miniProgramId);
    return {'cancelled': changed};
  }
  policy.validate();
  if (!policy.enabled) _fail('not_accepted');
  if (_pending != null) _fail('request_in_progress');
  final accepted = MiniProgramNfcPolicy(
    enabled: policy.enabled,
    allowedRecordTypes: List.unmodifiable(
      MiniProgramNfc.recordTypes(policy.allowedRecordTypes),
    ),
    maxReadMs: policy.maxReadMs,
    maxRecords: policy.maxRecords,
    maxMessageBytes: policy.maxMessageBytes,
  );
  if (action == 'nfc.read') {
    args['timeoutMs'] = (args['timeoutMs'] as int).clamp(
      1000,
      accepted.maxReadMs,
    );
    args.addAll({
      'allowedRecordTypes': accepted.allowedRecordTypes,
      'maxRecords': accepted.maxRecords,
      'maxMessageBytes': accepted.maxMessageBytes,
    });
  }
  final request = _NfcRequest(
    miniProgramId,
    'nfc_${++_sequence}',
    ++_generation,
  );
  _pending = request;
  request.watchdog = Timer(
    Duration(
      milliseconds: action == 'nfc.read'
          ? (args['timeoutMs'] as int) + 1000
          : 5000,
    ),
    () => _finish(request, error: _error('timeout')),
  );
  unawaited(_invoke(request, action, args, accepted));
  return request.result.future;
}