run method
Future<Map<String, dynamic> >
run({
- required String miniProgramId,
- required String action,
- required Map<
String, dynamic> arguments, - 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;
}