chore: expose option to retry computations

Fixes: https://gitlab.com/famedly/company/frontend/famedly-web/-/issues/536

Signed-off-by: Lanna Michalke <l.michalke@famedly.com>
This commit is contained in:
Lanna Michalke 2022-08-10 07:50:09 +02:00
parent 543875e8cf
commit a983db4946
2 changed files with 84 additions and 23 deletions

View File

@ -25,22 +25,37 @@ abstract class NativeImplementations {
/// the UI to likely freeze
static const dummy = NativeImplementationsDummy();
FutureOr<RoomKeys> generateUploadKeys(GenerateUploadKeysArgs args);
FutureOr<RoomKeys> generateUploadKeys(
GenerateUploadKeysArgs args, {
bool retryInDummy = true,
});
FutureOr<Uint8List> keyFromPassphrase(KeyFromPassphraseArgs args);
FutureOr<Uint8List> keyFromPassphrase(
KeyFromPassphraseArgs args, {
bool retryInDummy = true,
});
FutureOr<Uint8List?> decryptFile(EncryptedFile file);
FutureOr<Uint8List?> decryptFile(
EncryptedFile file, {
bool retryInDummy = true,
});
FutureOr<MatrixImageFileResizedResponse?> shrinkImage(
MatrixImageFileResizeArguments args);
MatrixImageFileResizeArguments args, {
bool retryInDummy = false,
});
FutureOr<MatrixImageFileResizedResponse?> calcImageMetadata(Uint8List bytes);
FutureOr<MatrixImageFileResizedResponse?> calcImageMetadata(
Uint8List bytes, {
bool retryInDummy = false,
});
@override
/// this implementation will catch any non-implemented method
dynamic noSuchMethod(Invocation invocation) {
final dynamic argument = invocation.positionalArguments.single;
final bool retryInDummy = invocation.namedArguments['retryInDummy'] as bool;
final memberName = invocation.memberName.toString().split('"')[1];
Logs().w(
@ -50,15 +65,15 @@ abstract class NativeImplementations {
);
switch (memberName) {
case 'generateUploadKeys':
return dummy.generateUploadKeys(argument);
return dummy.generateUploadKeys(argument, retryInDummy: retryInDummy);
case 'keyFromPassphrase':
return dummy.keyFromPassphrase(argument);
return dummy.keyFromPassphrase(argument, retryInDummy: retryInDummy);
case 'decryptFile':
return dummy.decryptFile(argument);
return dummy.decryptFile(argument, retryInDummy: retryInDummy);
case 'shrinkImage':
return dummy.shrinkImage(argument);
return dummy.shrinkImage(argument, retryInDummy: retryInDummy);
case 'calcImageMetadata':
return dummy.calcImageMetadata(argument);
return dummy.calcImageMetadata(argument, retryInDummy: retryInDummy);
default:
return super.noSuchMethod(invocation);
}
@ -69,28 +84,42 @@ class NativeImplementationsDummy extends NativeImplementations {
const NativeImplementationsDummy();
@override
Future<Uint8List?> decryptFile(EncryptedFile file) {
Future<Uint8List?> decryptFile(
EncryptedFile file, {
bool retryInDummy = true,
}) {
return decryptFileImplementation(file);
}
@override
Future<RoomKeys> generateUploadKeys(GenerateUploadKeysArgs args) async {
Future<RoomKeys> generateUploadKeys(
GenerateUploadKeysArgs args, {
bool retryInDummy = true,
}) async {
return generateUploadKeysImplementation(args);
}
@override
Future<Uint8List> keyFromPassphrase(KeyFromPassphraseArgs args) {
Future<Uint8List> keyFromPassphrase(
KeyFromPassphraseArgs args, {
bool retryInDummy = true,
}) {
return generateKeyFromPassphrase(args);
}
@override
MatrixImageFileResizedResponse? shrinkImage(
MatrixImageFileResizeArguments args) {
MatrixImageFileResizeArguments args, {
bool retryInDummy = false,
}) {
return MatrixImageFile.resizeImplementation(args);
}
@override
MatrixImageFileResizedResponse? calcImageMetadata(Uint8List bytes) {
MatrixImageFileResizedResponse? calcImageMetadata(
Uint8List bytes, {
bool retryInDummy = false,
}) {
return MatrixImageFile.calcMetadataImplementation(bytes);
}
}
@ -122,7 +151,10 @@ class NativeImplementationsIsolate extends NativeImplementations {
}
@override
Future<Uint8List?> decryptFile(EncryptedFile file) {
Future<Uint8List?> decryptFile(
EncryptedFile file, {
bool retryInDummy = true,
}) {
return runInBackground<Uint8List?, EncryptedFile>(
NativeImplementations.dummy.decryptFile,
file,
@ -130,7 +162,10 @@ class NativeImplementationsIsolate extends NativeImplementations {
}
@override
Future<RoomKeys> generateUploadKeys(GenerateUploadKeysArgs args) async {
Future<RoomKeys> generateUploadKeys(
GenerateUploadKeysArgs args, {
bool retryInDummy = true,
}) async {
return runInBackground<RoomKeys, GenerateUploadKeysArgs>(
NativeImplementations.dummy.generateUploadKeys,
args,
@ -138,7 +173,10 @@ class NativeImplementationsIsolate extends NativeImplementations {
}
@override
Future<Uint8List> keyFromPassphrase(KeyFromPassphraseArgs args) {
Future<Uint8List> keyFromPassphrase(
KeyFromPassphraseArgs args, {
bool retryInDummy = true,
}) {
return runInBackground<Uint8List, KeyFromPassphraseArgs>(
NativeImplementations.dummy.keyFromPassphrase,
args,
@ -147,7 +185,9 @@ class NativeImplementationsIsolate extends NativeImplementations {
@override
Future<MatrixImageFileResizedResponse?> shrinkImage(
MatrixImageFileResizeArguments args) {
MatrixImageFileResizeArguments args, {
bool retryInDummy = false,
}) {
return runInBackground<MatrixImageFileResizedResponse?,
MatrixImageFileResizeArguments>(
NativeImplementations.dummy.shrinkImage,
@ -156,7 +196,10 @@ class NativeImplementationsIsolate extends NativeImplementations {
}
@override
FutureOr<MatrixImageFileResizedResponse?> calcImageMetadata(Uint8List bytes) {
FutureOr<MatrixImageFileResizedResponse?> calcImageMetadata(
Uint8List bytes, {
bool retryInDummy = false,
}) {
return runInBackground<MatrixImageFileResizedResponse?, Uint8List>(
NativeImplementations.dummy.calcImageMetadata,
bytes,

View File

@ -62,7 +62,9 @@ class NativeImplementationsWebWorker extends NativeImplementations {
@override
Future<MatrixImageFileResizedResponse?> calcImageMetadata(
Uint8List bytes) async {
Uint8List bytes, {
bool retryInDummy = false,
}) async {
try {
final result = await operation<Map<dynamic, dynamic>, Uint8List>(
WebWorkerOperations.calcImageMetadata,
@ -70,6 +72,11 @@ class NativeImplementationsWebWorker extends NativeImplementations {
);
return MatrixImageFileResizedResponse.fromJson(Map.from(result));
} catch (e, s) {
if (!retryInDummy) {
Logs().e(
'Web worker computation error. Ignoring and returning null', e, s);
return null;
}
Logs().e('Web worker computation error. Fallback to main thread', e, s);
return NativeImplementations.dummy.calcImageMetadata(bytes);
}
@ -77,7 +84,9 @@ class NativeImplementationsWebWorker extends NativeImplementations {
@override
Future<MatrixImageFileResizedResponse?> shrinkImage(
MatrixImageFileResizeArguments args) async {
MatrixImageFileResizeArguments args, {
bool retryInDummy = false,
}) async {
try {
final result =
await operation<Map<dynamic, dynamic>, Map<String, dynamic>>(
@ -86,13 +95,21 @@ class NativeImplementationsWebWorker extends NativeImplementations {
);
return MatrixImageFileResizedResponse.fromJson(Map.from(result));
} catch (e, s) {
if (!retryInDummy) {
Logs().e(
'Web worker computation error. Ignoring and returning null', e, s);
return null;
}
Logs().e('Web worker computation error. Fallback to main thread', e, s);
return NativeImplementations.dummy.shrinkImage(args);
}
}
@override
Future<RoomKeys> generateUploadKeys(GenerateUploadKeysArgs args) async {
Future<RoomKeys> generateUploadKeys(
GenerateUploadKeysArgs args, {
bool retryInDummy = true,
}) async {
try {
final result =
await operation<Map<dynamic, dynamic>, Map<String, dynamic>>(
@ -101,6 +118,7 @@ class NativeImplementationsWebWorker extends NativeImplementations {
);
return RoomKeys.fromJson(Map.from(result));
} catch (e, s) {
if (!retryInDummy) rethrow;
Logs().e('Web worker computation error. Fallback to main thread', e, s);
return NativeImplementations.dummy.generateUploadKeys(args);
}