remove old protobuf model

This commit is contained in:
otsmr 2026-08-29 15:43:32 +02:00
parent e43169c2d2
commit 3a27f3b24b
58 changed files with 2334 additions and 10929 deletions

@ -1 +1 @@
Subproject commit 76a36c4d3da1fd0da04da3aa5a6c2b3b9c984925 Subproject commit f46500ce45dbce12ee4431e5becb759ac7f26098

View file

@ -227,14 +227,12 @@ class _AppMainWidgetState extends State<AppMainWidget> {
// This means the user is in the onboarding screen, so start with the Proof of Work. // This means the user is in the onboarding screen, so start with the Proof of Work.
final proofResult = await rustApiResult(RustApi.getProofOfWork()); final proofResult = await rustApiResult(RustApi.getProofOfWork());
final proof = proofResult.value == null final proof = proofResult.value;
? null
: decodeProofOfWork(proofResult.value!);
final disabled = proofResult.error == ErrorCode.RegistrationDisabled; final disabled = proofResult.error == ErrorCode.RegistrationDisabled;
if (proof != null) { if (proof != null) {
Log.info('Starting with proof of work calculation.'); Log.info('Starting with proof of work calculation.');
_proofOfWork = ( _proofOfWork = (
calculatePoW(proof.prefix, proof.difficulty.toInt()), calculatePoW(proof.prefix, proof.difficulty),
false, false,
); );
} else { } else {

View file

@ -0,0 +1,42 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.12.0.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
import '../../../../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
class PqcPreKey {
final PlatformInt64 eccPreKeyId;
final Uint8List eccPreKey;
final PlatformInt64 kyberPreKeyId;
final Uint8List kyberPreKey;
final Uint8List kyberPreKeySignature;
const PqcPreKey({
required this.eccPreKeyId,
required this.eccPreKey,
required this.kyberPreKeyId,
required this.kyberPreKey,
required this.kyberPreKeySignature,
});
@override
int get hashCode =>
eccPreKeyId.hashCode ^
eccPreKey.hashCode ^
kyberPreKeyId.hashCode ^
kyberPreKey.hashCode ^
kyberPreKeySignature.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is PqcPreKey &&
runtimeType == other.runtimeType &&
eccPreKeyId == other.eccPreKeyId &&
eccPreKey == other.eccPreKey &&
kyberPreKeyId == other.kyberPreKeyId &&
kyberPreKey == other.kyberPreKey &&
kyberPreKeySignature == other.kyberPreKeySignature;
}

View file

@ -0,0 +1,28 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.12.0.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
import '../../../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
class PreKey {
final PlatformInt64 id;
final Uint8List prekey;
const PreKey({
required this.id,
required this.prekey,
});
@override
int get hashCode => id.hashCode ^ prekey.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is PreKey &&
runtimeType == other.runtimeType &&
id == other.id &&
prekey == other.prekey;
}

View file

@ -4,8 +4,213 @@
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import // ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
import '../../../frb_generated.dart'; import '../../../frb_generated.dart';
import '../client_to_server/handshake/initial_pqc_keys.dart';
import '../client_to_server/response.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
class AdditionalAccount {
final PlatformInt64 userId;
final String planId;
const AdditionalAccount({
required this.userId,
required this.planId,
});
@override
int get hashCode => userId.hashCode ^ planId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is AdditionalAccount &&
runtimeType == other.runtimeType &&
userId == other.userId &&
planId == other.planId;
}
class MemoriesUploadUrls {
final String mediaId;
final PresignedPost? thumbnailUpload;
final PresignedPost? fullUpload;
const MemoriesUploadUrls({
required this.mediaId,
this.thumbnailUpload,
this.fullUpload,
});
@override
int get hashCode =>
mediaId.hashCode ^ thumbnailUpload.hashCode ^ fullUpload.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is MemoriesUploadUrls &&
runtimeType == other.runtimeType &&
mediaId == other.mediaId &&
thumbnailUpload == other.thumbnailUpload &&
fullUpload == other.fullUpload;
}
class MemoriesUsage {
final PlatformInt64 maxBytes;
final PlatformInt64 currentBytes;
final PlatformInt64 count;
const MemoriesUsage({
required this.maxBytes,
required this.currentBytes,
required this.count,
});
@override
int get hashCode =>
maxBytes.hashCode ^ currentBytes.hashCode ^ count.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is MemoriesUsage &&
runtimeType == other.runtimeType &&
maxBytes == other.maxBytes &&
currentBytes == other.currentBytes &&
count == other.count;
}
class PasswordlessNotificationMessage {
final PlatformInt64 id;
final Uint8List encryptedMessage;
const PasswordlessNotificationMessage({
required this.id,
required this.encryptedMessage,
});
@override
int get hashCode => id.hashCode ^ encryptedMessage.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is PasswordlessNotificationMessage &&
runtimeType == other.runtimeType &&
id == other.id &&
encryptedMessage == other.encryptedMessage;
}
class PlanBallance {
final PlatformInt64 usedDailyMediaUploadLimit;
final PlatformInt64 usedUploadMediaSizeLimit;
final PlatformInt64? paymentPeriodDays;
final PlatformInt64? lastPaymentDoneUnixTimestamp;
final List<Transaction> transactions;
final List<AdditionalAccount> additionalAccounts;
final bool? autoRenewal;
final PlatformInt64? additionalAccountOwnerId;
const PlanBallance({
required this.usedDailyMediaUploadLimit,
required this.usedUploadMediaSizeLimit,
this.paymentPeriodDays,
this.lastPaymentDoneUnixTimestamp,
required this.transactions,
required this.additionalAccounts,
this.autoRenewal,
this.additionalAccountOwnerId,
});
@override
int get hashCode =>
usedDailyMediaUploadLimit.hashCode ^
usedUploadMediaSizeLimit.hashCode ^
paymentPeriodDays.hashCode ^
lastPaymentDoneUnixTimestamp.hashCode ^
transactions.hashCode ^
additionalAccounts.hashCode ^
autoRenewal.hashCode ^
additionalAccountOwnerId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is PlanBallance &&
runtimeType == other.runtimeType &&
usedDailyMediaUploadLimit == other.usedDailyMediaUploadLimit &&
usedUploadMediaSizeLimit == other.usedUploadMediaSizeLimit &&
paymentPeriodDays == other.paymentPeriodDays &&
lastPaymentDoneUnixTimestamp == other.lastPaymentDoneUnixTimestamp &&
transactions == other.transactions &&
additionalAccounts == other.additionalAccounts &&
autoRenewal == other.autoRenewal &&
additionalAccountOwnerId == other.additionalAccountOwnerId;
}
class PqcBundle {
final PlatformInt64 eccSignedPrekeyId;
final Uint8List eccSignedPrekey;
final Uint8List eccSignedPrekeySignature;
final PlatformInt64 kyberSignedPrekeyId;
final Uint8List kyberSignedPrekey;
final Uint8List kyberSignedPrekeySignature;
final PqcPreKey? prekey;
const PqcBundle({
required this.eccSignedPrekeyId,
required this.eccSignedPrekey,
required this.eccSignedPrekeySignature,
required this.kyberSignedPrekeyId,
required this.kyberSignedPrekey,
required this.kyberSignedPrekeySignature,
this.prekey,
});
@override
int get hashCode =>
eccSignedPrekeyId.hashCode ^
eccSignedPrekey.hashCode ^
eccSignedPrekeySignature.hashCode ^
kyberSignedPrekeyId.hashCode ^
kyberSignedPrekey.hashCode ^
kyberSignedPrekeySignature.hashCode ^
prekey.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is PqcBundle &&
runtimeType == other.runtimeType &&
eccSignedPrekeyId == other.eccSignedPrekeyId &&
eccSignedPrekey == other.eccSignedPrekey &&
eccSignedPrekeySignature == other.eccSignedPrekeySignature &&
kyberSignedPrekeyId == other.kyberSignedPrekeyId &&
kyberSignedPrekey == other.kyberSignedPrekey &&
kyberSignedPrekeySignature == other.kyberSignedPrekeySignature &&
prekey == other.prekey;
}
class PresignedPost {
final String url;
final Map<String, String> fields;
const PresignedPost({
required this.url,
required this.fields,
});
@override
int get hashCode => url.hashCode ^ fields.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is PresignedPost &&
runtimeType == other.runtimeType &&
url == other.url &&
fields == other.fields;
}
class ProofOfWork { class ProofOfWork {
final String prefix; final String prefix;
final PlatformInt64 difficulty; final PlatformInt64 difficulty;
@ -26,3 +231,66 @@ class ProofOfWork {
prefix == other.prefix && prefix == other.prefix &&
difficulty == other.difficulty; difficulty == other.difficulty;
} }
class Transaction {
const Transaction();
@override
int get hashCode => 0;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Transaction && runtimeType == other.runtimeType;
}
class UserData {
final PlatformInt64 userId;
final List<PreKey> prekeys;
final Uint8List? username;
final Uint8List? publicIdentityKey;
final Uint8List? signedPrekey;
final Uint8List? signedPrekeySignature;
final PlatformInt64? signedPrekeyId;
final PlatformInt64? registrationId;
final PqcBundle? pqcBundle;
const UserData({
required this.userId,
required this.prekeys,
this.username,
this.publicIdentityKey,
this.signedPrekey,
this.signedPrekeySignature,
this.signedPrekeyId,
this.registrationId,
this.pqcBundle,
});
@override
int get hashCode =>
userId.hashCode ^
prekeys.hashCode ^
username.hashCode ^
publicIdentityKey.hashCode ^
signedPrekey.hashCode ^
signedPrekeySignature.hashCode ^
signedPrekeyId.hashCode ^
registrationId.hashCode ^
pqcBundle.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is UserData &&
runtimeType == other.runtimeType &&
userId == other.userId &&
prekeys == other.prekeys &&
username == other.username &&
publicIdentityKey == other.publicIdentityKey &&
signedPrekey == other.signedPrekey &&
signedPrekeySignature == other.signedPrekeySignature &&
signedPrekeyId == other.signedPrekeyId &&
registrationId == other.registrationId &&
pqcBundle == other.pqcBundle;
}

View file

@ -7,9 +7,9 @@ import '../api/server/prekeys.dart';
import '../frb_generated.dart'; import '../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
// These functions are ignored because they are not marked as `pub`: `api_result`, `empty_api_response`, `encoded_api_response`, `from_rust_state` // These functions are ignored because they are not marked as `pub`: `api_result`, `empty_api_response`, `from_rust_state`
// These types are ignored because they are neither used by any `pub` functions nor (for structs and enums) marked `#[frb(unignore)]`: `ApiConfig`, `ServerResult` // These types are ignored because they are neither used by any `pub` functions nor (for structs and enums) marked `#[frb(unignore)]`: `ApiConfig`, `ServerResult`
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `assert_fields_are_eq`, `assert_fields_are_eq`, `clone`, `clone`, `clone`, `clone`, `eq`, `eq`, `fmt`, `fmt`, `fmt`, `fmt` // These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`
enum ApiConnectionState { enum ApiConnectionState {
stopped, stopped,
@ -56,6 +56,208 @@ enum ApiEventKind {
loginTokenMigrated, loginTokenMigrated,
} }
class FrbAdditionalAccount {
final PlatformInt64 userId;
final String planId;
const FrbAdditionalAccount({
required this.userId,
required this.planId,
});
@override
int get hashCode => userId.hashCode ^ planId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FrbAdditionalAccount &&
runtimeType == other.runtimeType &&
userId == other.userId &&
planId == other.planId;
}
class FrbMemoriesUploadUrls {
final String mediaId;
final FrbPresignedPost? thumbnailUpload;
final FrbPresignedPost? fullUpload;
const FrbMemoriesUploadUrls({
required this.mediaId,
this.thumbnailUpload,
this.fullUpload,
});
@override
int get hashCode =>
mediaId.hashCode ^ thumbnailUpload.hashCode ^ fullUpload.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FrbMemoriesUploadUrls &&
runtimeType == other.runtimeType &&
mediaId == other.mediaId &&
thumbnailUpload == other.thumbnailUpload &&
fullUpload == other.fullUpload;
}
class FrbMemoriesUsage {
final PlatformInt64 currentBytes;
final PlatformInt64 count;
final PlatformInt64 maxBytes;
const FrbMemoriesUsage({
required this.currentBytes,
required this.count,
required this.maxBytes,
});
@override
int get hashCode =>
currentBytes.hashCode ^ count.hashCode ^ maxBytes.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FrbMemoriesUsage &&
runtimeType == other.runtimeType &&
currentBytes == other.currentBytes &&
count == other.count &&
maxBytes == other.maxBytes;
}
class FrbPasswordlessNotificationMessage {
final PlatformInt64 id;
final Uint8List encryptedMessage;
const FrbPasswordlessNotificationMessage({
required this.id,
required this.encryptedMessage,
});
@override
int get hashCode => id.hashCode ^ encryptedMessage.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FrbPasswordlessNotificationMessage &&
runtimeType == other.runtimeType &&
id == other.id &&
encryptedMessage == other.encryptedMessage;
}
class FrbPlanBalance {
final PlatformInt64 usedDailyMediaUploadLimit;
final PlatformInt64 usedUploadMediaSizeLimit;
final PlatformInt64? paymentPeriodDays;
final PlatformInt64? lastPaymentDoneUnixTimestamp;
final List<FrbAdditionalAccount> additionalAccounts;
final bool? autoRenewal;
final PlatformInt64? additionalAccountOwnerId;
const FrbPlanBalance({
required this.usedDailyMediaUploadLimit,
required this.usedUploadMediaSizeLimit,
this.paymentPeriodDays,
this.lastPaymentDoneUnixTimestamp,
required this.additionalAccounts,
this.autoRenewal,
this.additionalAccountOwnerId,
});
@override
int get hashCode =>
usedDailyMediaUploadLimit.hashCode ^
usedUploadMediaSizeLimit.hashCode ^
paymentPeriodDays.hashCode ^
lastPaymentDoneUnixTimestamp.hashCode ^
additionalAccounts.hashCode ^
autoRenewal.hashCode ^
additionalAccountOwnerId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FrbPlanBalance &&
runtimeType == other.runtimeType &&
usedDailyMediaUploadLimit == other.usedDailyMediaUploadLimit &&
usedUploadMediaSizeLimit == other.usedUploadMediaSizeLimit &&
paymentPeriodDays == other.paymentPeriodDays &&
lastPaymentDoneUnixTimestamp == other.lastPaymentDoneUnixTimestamp &&
additionalAccounts == other.additionalAccounts &&
autoRenewal == other.autoRenewal &&
additionalAccountOwnerId == other.additionalAccountOwnerId;
}
class FrbPresignedPost {
final String url;
final List<(String, String)> fields;
const FrbPresignedPost({
required this.url,
required this.fields,
});
@override
int get hashCode => url.hashCode ^ fields.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FrbPresignedPost &&
runtimeType == other.runtimeType &&
url == other.url &&
fields == other.fields;
}
class FrbProofOfWork {
final String prefix;
final PlatformInt64 difficulty;
const FrbProofOfWork({
required this.prefix,
required this.difficulty,
});
@override
int get hashCode => prefix.hashCode ^ difficulty.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FrbProofOfWork &&
runtimeType == other.runtimeType &&
prefix == other.prefix &&
difficulty == other.difficulty;
}
class FrbUserData {
final PlatformInt64 userId;
final Uint8List username;
final Uint8List publicIdentityKey;
const FrbUserData({
required this.userId,
required this.username,
required this.publicIdentityKey,
});
@override
int get hashCode =>
userId.hashCode ^ username.hashCode ^ publicIdentityKey.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FrbUserData &&
runtimeType == other.runtimeType &&
userId == other.userId &&
username == other.username &&
publicIdentityKey == other.publicIdentityKey;
}
/// Flutter-facing facade for the Rust-owned API runtime. /// Flutter-facing facade for the Rust-owned API runtime.
class RustApi { class RustApi {
const RustApi(); const RustApi();
@ -79,7 +281,8 @@ class RustApi {
static Future<void> checkForDeletedUsernames() => static Future<void> checkForDeletedUsernames() =>
RustLib.instance.api.crateBridgeApiRustApiCheckForDeletedUsernames(); RustLib.instance.api.crateBridgeApiRustApiCheckForDeletedUsernames();
static Future<Uint8List> checkForPasswordlessNotification({ static Future<List<FrbPasswordlessNotificationMessage>>
checkForPasswordlessNotification({
required String notificationId, required String notificationId,
required List<int> downloadAuthToken, required List<int> downloadAuthToken,
required Int64List alreadyReceivedMessageIds, required Int64List alreadyReceivedMessageIds,
@ -136,7 +339,7 @@ class RustApi {
static Future<void> forceIpaCheck() => static Future<void> forceIpaCheck() =>
RustLib.instance.api.crateBridgeApiRustApiForceIpaCheck(); RustLib.instance.api.crateBridgeApiRustApiForceIpaCheck();
static Future<Uint8List> getMemoriesUrl({ static Future<String> getMemoriesUrl({
required String mediaId, required String mediaId,
required bool thumbnail, required bool thumbnail,
}) => RustLib.instance.api.crateBridgeApiRustApiGetMemoriesUrl( }) => RustLib.instance.api.crateBridgeApiRustApiGetMemoriesUrl(
@ -144,13 +347,13 @@ class RustApi {
thumbnail: thumbnail, thumbnail: thumbnail,
); );
static Future<Uint8List> getMemoriesUsage() => static Future<FrbMemoriesUsage> getMemoriesUsage() =>
RustLib.instance.api.crateBridgeApiRustApiGetMemoriesUsage(); RustLib.instance.api.crateBridgeApiRustApiGetMemoriesUsage();
static Future<Uint8List> getPlanBalance() => static Future<FrbPlanBalance> getPlanBalance() =>
RustLib.instance.api.crateBridgeApiRustApiGetPlanBalance(); RustLib.instance.api.crateBridgeApiRustApiGetPlanBalance();
static Future<Uint8List> getProofOfWork() => static Future<FrbProofOfWork> getProofOfWork() =>
RustLib.instance.api.crateBridgeApiRustApiGetProofOfWork(); RustLib.instance.api.crateBridgeApiRustApiGetProofOfWork();
static Future<Uint8List> getServerKeyForPasswordlessRecovery({ static Future<Uint8List> getServerKeyForPasswordlessRecovery({
@ -168,10 +371,10 @@ class RustApi {
email: email, email: email,
); );
static Future<Uint8List> getUserById({required PlatformInt64 userId}) => static Future<FrbUserData> getUserById({required PlatformInt64 userId}) =>
RustLib.instance.api.crateBridgeApiRustApiGetUserById(userId: userId); RustLib.instance.api.crateBridgeApiRustApiGetUserById(userId: userId);
static Future<Uint8List> getUserData({required String username}) => static Future<FrbUserData> getUserData({required String username}) =>
RustLib.instance.api.crateBridgeApiRustApiGetUserData(username: username); RustLib.instance.api.crateBridgeApiRustApiGetUserData(username: username);
static Future<PlatformInt64> getUserIdFromUsername({ static Future<PlatformInt64> getUserIdFromUsername({
@ -226,7 +429,7 @@ class RustApi {
verificationData: verificationData, verificationData: verificationData,
); );
static Future<Uint8List> loadPlanBalance() => static Future<FrbPlanBalance> loadPlanBalance() =>
RustLib.instance.api.crateBridgeApiRustApiLoadPlanBalance(); RustLib.instance.api.crateBridgeApiRustApiLoadPlanBalance();
static Future<void> notifyMessagesOpened({ static Future<void> notifyMessagesOpened({
@ -313,7 +516,7 @@ class RustApi {
.api .api
.crateBridgeApiRustApiRequestMediaReupload(mediaId: mediaId); .crateBridgeApiRustApiRequestMediaReupload(mediaId: mediaId);
static Future<Uint8List> requestMemoriesUpload({ static Future<FrbMemoriesUploadUrls> requestMemoriesUpload({
required PlatformInt64 size, required PlatformInt64 size,
required PlatformInt64 originalDate, required PlatformInt64 originalDate,
required String mediaId, required String mediaId,

View file

@ -180,7 +180,8 @@ abstract class RustLibApi extends BaseApi {
Future<void> crateBridgeApiRustApiCheckForDeletedUsernames(); Future<void> crateBridgeApiRustApiCheckForDeletedUsernames();
Future<Uint8List> crateBridgeApiRustApiCheckForPasswordlessNotification({ Future<List<FrbPasswordlessNotificationMessage>>
crateBridgeApiRustApiCheckForPasswordlessNotification({
required String notificationId, required String notificationId,
required List<int> downloadAuthToken, required List<int> downloadAuthToken,
required Int64List alreadyReceivedMessageIds, required Int64List alreadyReceivedMessageIds,
@ -217,16 +218,16 @@ abstract class RustLibApi extends BaseApi {
Future<void> crateBridgeApiRustApiForceIpaCheck(); Future<void> crateBridgeApiRustApiForceIpaCheck();
Future<Uint8List> crateBridgeApiRustApiGetMemoriesUrl({ Future<String> crateBridgeApiRustApiGetMemoriesUrl({
required String mediaId, required String mediaId,
required bool thumbnail, required bool thumbnail,
}); });
Future<Uint8List> crateBridgeApiRustApiGetMemoriesUsage(); Future<FrbMemoriesUsage> crateBridgeApiRustApiGetMemoriesUsage();
Future<Uint8List> crateBridgeApiRustApiGetPlanBalance(); Future<FrbPlanBalance> crateBridgeApiRustApiGetPlanBalance();
Future<Uint8List> crateBridgeApiRustApiGetProofOfWork(); Future<FrbProofOfWork> crateBridgeApiRustApiGetProofOfWork();
Future<Uint8List> crateBridgeApiRustApiGetServerKeyForPasswordlessRecovery({ Future<Uint8List> crateBridgeApiRustApiGetServerKeyForPasswordlessRecovery({
required PlatformInt64 userId, required PlatformInt64 userId,
@ -236,11 +237,11 @@ abstract class RustLibApi extends BaseApi {
String? email, String? email,
}); });
Future<Uint8List> crateBridgeApiRustApiGetUserById({ Future<FrbUserData> crateBridgeApiRustApiGetUserById({
required PlatformInt64 userId, required PlatformInt64 userId,
}); });
Future<Uint8List> crateBridgeApiRustApiGetUserData({ Future<FrbUserData> crateBridgeApiRustApiGetUserData({
required String username, required String username,
}); });
@ -276,7 +277,7 @@ abstract class RustLibApi extends BaseApi {
required String verificationData, required String verificationData,
}); });
Future<Uint8List> crateBridgeApiRustApiLoadPlanBalance(); Future<FrbPlanBalance> crateBridgeApiRustApiLoadPlanBalance();
Future<void> crateBridgeApiRustApiNotifyMessagesOpened({ Future<void> crateBridgeApiRustApiNotifyMessagesOpened({
required PlatformInt64 contactId, required PlatformInt64 contactId,
@ -331,7 +332,7 @@ abstract class RustLibApi extends BaseApi {
required String mediaId, required String mediaId,
}); });
Future<Uint8List> crateBridgeApiRustApiRequestMemoriesUpload({ Future<FrbMemoriesUploadUrls> crateBridgeApiRustApiRequestMemoriesUpload({
required PlatformInt64 size, required PlatformInt64 size,
required PlatformInt64 originalDate, required PlatformInt64 originalDate,
required String mediaId, required String mediaId,
@ -1303,7 +1304,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
@override @override
Future<Uint8List> crateBridgeApiRustApiCheckForPasswordlessNotification({ Future<List<FrbPasswordlessNotificationMessage>>
crateBridgeApiRustApiCheckForPasswordlessNotification({
required String notificationId, required String notificationId,
required List<int> downloadAuthToken, required List<int> downloadAuthToken,
required Int64List alreadyReceivedMessageIds, required Int64List alreadyReceivedMessageIds,
@ -1326,7 +1328,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
}, },
codec: SseCodec( codec: SseCodec(
decodeSuccessData: sse_decode_list_prim_u_8_strict, decodeSuccessData:
sse_decode_list_frb_passwordless_notification_message,
decodeErrorData: sse_decode_AnyhowException, decodeErrorData: sse_decode_AnyhowException,
), ),
constMeta: constMeta:
@ -1758,7 +1761,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
@override @override
Future<Uint8List> crateBridgeApiRustApiGetMemoriesUrl({ Future<String> crateBridgeApiRustApiGetMemoriesUrl({
required String mediaId, required String mediaId,
required bool thumbnail, required bool thumbnail,
}) { }) {
@ -1776,7 +1779,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
}, },
codec: SseCodec( codec: SseCodec(
decodeSuccessData: sse_decode_list_prim_u_8_strict, decodeSuccessData: sse_decode_String,
decodeErrorData: sse_decode_AnyhowException, decodeErrorData: sse_decode_AnyhowException,
), ),
constMeta: kCrateBridgeApiRustApiGetMemoriesUrlConstMeta, constMeta: kCrateBridgeApiRustApiGetMemoriesUrlConstMeta,
@ -1793,7 +1796,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
@override @override
Future<Uint8List> crateBridgeApiRustApiGetMemoriesUsage() { Future<FrbMemoriesUsage> crateBridgeApiRustApiGetMemoriesUsage() {
return handler.executeNormal( return handler.executeNormal(
NormalTask( NormalTask(
callFfi: (port_) { callFfi: (port_) {
@ -1806,7 +1809,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
}, },
codec: SseCodec( codec: SseCodec(
decodeSuccessData: sse_decode_list_prim_u_8_strict, decodeSuccessData: sse_decode_frb_memories_usage,
decodeErrorData: sse_decode_AnyhowException, decodeErrorData: sse_decode_AnyhowException,
), ),
constMeta: kCrateBridgeApiRustApiGetMemoriesUsageConstMeta, constMeta: kCrateBridgeApiRustApiGetMemoriesUsageConstMeta,
@ -1823,7 +1826,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
@override @override
Future<Uint8List> crateBridgeApiRustApiGetPlanBalance() { Future<FrbPlanBalance> crateBridgeApiRustApiGetPlanBalance() {
return handler.executeNormal( return handler.executeNormal(
NormalTask( NormalTask(
callFfi: (port_) { callFfi: (port_) {
@ -1836,7 +1839,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
}, },
codec: SseCodec( codec: SseCodec(
decodeSuccessData: sse_decode_list_prim_u_8_strict, decodeSuccessData: sse_decode_frb_plan_balance,
decodeErrorData: sse_decode_AnyhowException, decodeErrorData: sse_decode_AnyhowException,
), ),
constMeta: kCrateBridgeApiRustApiGetPlanBalanceConstMeta, constMeta: kCrateBridgeApiRustApiGetPlanBalanceConstMeta,
@ -1853,7 +1856,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
@override @override
Future<Uint8List> crateBridgeApiRustApiGetProofOfWork() { Future<FrbProofOfWork> crateBridgeApiRustApiGetProofOfWork() {
return handler.executeNormal( return handler.executeNormal(
NormalTask( NormalTask(
callFfi: (port_) { callFfi: (port_) {
@ -1866,7 +1869,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
}, },
codec: SseCodec( codec: SseCodec(
decodeSuccessData: sse_decode_list_prim_u_8_strict, decodeSuccessData: sse_decode_frb_proof_of_work,
decodeErrorData: sse_decode_AnyhowException, decodeErrorData: sse_decode_AnyhowException,
), ),
constMeta: kCrateBridgeApiRustApiGetProofOfWorkConstMeta, constMeta: kCrateBridgeApiRustApiGetProofOfWorkConstMeta,
@ -1938,7 +1941,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
@override @override
Future<Uint8List> crateBridgeApiRustApiGetUserById({ Future<FrbUserData> crateBridgeApiRustApiGetUserById({
required PlatformInt64 userId, required PlatformInt64 userId,
}) { }) {
return handler.executeNormal( return handler.executeNormal(
@ -1954,7 +1957,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
}, },
codec: SseCodec( codec: SseCodec(
decodeSuccessData: sse_decode_list_prim_u_8_strict, decodeSuccessData: sse_decode_frb_user_data,
decodeErrorData: sse_decode_AnyhowException, decodeErrorData: sse_decode_AnyhowException,
), ),
constMeta: kCrateBridgeApiRustApiGetUserByIdConstMeta, constMeta: kCrateBridgeApiRustApiGetUserByIdConstMeta,
@ -1971,7 +1974,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
@override @override
Future<Uint8List> crateBridgeApiRustApiGetUserData({ Future<FrbUserData> crateBridgeApiRustApiGetUserData({
required String username, required String username,
}) { }) {
return handler.executeNormal( return handler.executeNormal(
@ -1987,7 +1990,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
}, },
codec: SseCodec( codec: SseCodec(
decodeSuccessData: sse_decode_list_prim_u_8_strict, decodeSuccessData: sse_decode_frb_user_data,
decodeErrorData: sse_decode_AnyhowException, decodeErrorData: sse_decode_AnyhowException,
), ),
constMeta: kCrateBridgeApiRustApiGetUserDataConstMeta, constMeta: kCrateBridgeApiRustApiGetUserDataConstMeta,
@ -2219,7 +2222,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
@override @override
Future<Uint8List> crateBridgeApiRustApiLoadPlanBalance() { Future<FrbPlanBalance> crateBridgeApiRustApiLoadPlanBalance() {
return handler.executeNormal( return handler.executeNormal(
NormalTask( NormalTask(
callFfi: (port_) { callFfi: (port_) {
@ -2232,7 +2235,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
}, },
codec: SseCodec( codec: SseCodec(
decodeSuccessData: sse_decode_list_prim_u_8_strict, decodeSuccessData: sse_decode_frb_plan_balance,
decodeErrorData: sse_decode_AnyhowException, decodeErrorData: sse_decode_AnyhowException,
), ),
constMeta: kCrateBridgeApiRustApiLoadPlanBalanceConstMeta, constMeta: kCrateBridgeApiRustApiLoadPlanBalanceConstMeta,
@ -2667,7 +2670,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
@override @override
Future<Uint8List> crateBridgeApiRustApiRequestMemoriesUpload({ Future<FrbMemoriesUploadUrls> crateBridgeApiRustApiRequestMemoriesUpload({
required PlatformInt64 size, required PlatformInt64 size,
required PlatformInt64 originalDate, required PlatformInt64 originalDate,
required String mediaId, required String mediaId,
@ -2687,7 +2690,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
}, },
codec: SseCodec( codec: SseCodec(
decodeSuccessData: sse_decode_list_prim_u_8_strict, decodeSuccessData: sse_decode_frb_memories_upload_urls,
decodeErrorData: sse_decode_AnyhowException, decodeErrorData: sse_decode_AnyhowException,
), ),
constMeta: kCrateBridgeApiRustApiRequestMemoriesUploadConstMeta, constMeta: kCrateBridgeApiRustApiRequestMemoriesUploadConstMeta,
@ -5077,6 +5080,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return dco_decode_frb_pre_key_bundle(raw); return dco_decode_frb_pre_key_bundle(raw);
} }
@protected
FrbPresignedPost dco_decode_box_autoadd_frb_presigned_post(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return dco_decode_frb_presigned_post(raw);
}
@protected @protected
PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw) { PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
@ -5129,6 +5138,74 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return FlutterUserDiscovery(); return FlutterUserDiscovery();
} }
@protected
FrbAdditionalAccount dco_decode_frb_additional_account(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 2)
throw Exception('unexpected arr length: expect 2 but see ${arr.length}');
return FrbAdditionalAccount(
userId: dco_decode_i_64(arr[0]),
planId: dco_decode_String(arr[1]),
);
}
@protected
FrbMemoriesUploadUrls dco_decode_frb_memories_upload_urls(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 3)
throw Exception('unexpected arr length: expect 3 but see ${arr.length}');
return FrbMemoriesUploadUrls(
mediaId: dco_decode_String(arr[0]),
thumbnailUpload: dco_decode_opt_box_autoadd_frb_presigned_post(arr[1]),
fullUpload: dco_decode_opt_box_autoadd_frb_presigned_post(arr[2]),
);
}
@protected
FrbMemoriesUsage dco_decode_frb_memories_usage(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 3)
throw Exception('unexpected arr length: expect 3 but see ${arr.length}');
return FrbMemoriesUsage(
currentBytes: dco_decode_i_64(arr[0]),
count: dco_decode_i_64(arr[1]),
maxBytes: dco_decode_i_64(arr[2]),
);
}
@protected
FrbPasswordlessNotificationMessage
dco_decode_frb_passwordless_notification_message(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 2)
throw Exception('unexpected arr length: expect 2 but see ${arr.length}');
return FrbPasswordlessNotificationMessage(
id: dco_decode_i_64(arr[0]),
encryptedMessage: dco_decode_list_prim_u_8_strict(arr[1]),
);
}
@protected
FrbPlanBalance dco_decode_frb_plan_balance(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 7)
throw Exception('unexpected arr length: expect 7 but see ${arr.length}');
return FrbPlanBalance(
usedDailyMediaUploadLimit: dco_decode_i_64(arr[0]),
usedUploadMediaSizeLimit: dco_decode_i_64(arr[1]),
paymentPeriodDays: dco_decode_opt_box_autoadd_i_64(arr[2]),
lastPaymentDoneUnixTimestamp: dco_decode_opt_box_autoadd_i_64(arr[3]),
additionalAccounts: dco_decode_list_frb_additional_account(arr[4]),
autoRenewal: dco_decode_opt_box_autoadd_bool(arr[5]),
additionalAccountOwnerId: dco_decode_opt_box_autoadd_i_64(arr[6]),
);
}
@protected @protected
FrbPqcPreKey dco_decode_frb_pqc_pre_key(dynamic raw) { FrbPqcPreKey dco_decode_frb_pqc_pre_key(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
@ -5165,6 +5242,43 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
} }
@protected
FrbPresignedPost dco_decode_frb_presigned_post(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 2)
throw Exception('unexpected arr length: expect 2 but see ${arr.length}');
return FrbPresignedPost(
url: dco_decode_String(arr[0]),
fields: dco_decode_list_record_string_string(arr[1]),
);
}
@protected
FrbProofOfWork dco_decode_frb_proof_of_work(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 2)
throw Exception('unexpected arr length: expect 2 but see ${arr.length}');
return FrbProofOfWork(
prefix: dco_decode_String(arr[0]),
difficulty: dco_decode_i_64(arr[1]),
);
}
@protected
FrbUserData dco_decode_frb_user_data(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 3)
throw Exception('unexpected arr length: expect 3 but see ${arr.length}');
return FrbUserData(
userId: dco_decode_i_64(arr[0]),
username: dco_decode_list_prim_u_8_strict(arr[1]),
publicIdentityKey: dco_decode_list_prim_u_8_strict(arr[2]),
);
}
@protected @protected
int dco_decode_i_32(dynamic raw) { int dco_decode_i_32(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
@ -5233,6 +5347,25 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return (raw as List<dynamic>).map(dco_decode_String).toList(); return (raw as List<dynamic>).map(dco_decode_String).toList();
} }
@protected
List<FrbAdditionalAccount> dco_decode_list_frb_additional_account(
dynamic raw,
) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return (raw as List<dynamic>)
.map(dco_decode_frb_additional_account)
.toList();
}
@protected
List<FrbPasswordlessNotificationMessage>
dco_decode_list_frb_passwordless_notification_message(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return (raw as List<dynamic>)
.map(dco_decode_frb_passwordless_notification_message)
.toList();
}
@protected @protected
List<FrbPqcPreKey> dco_decode_list_frb_pqc_pre_key(dynamic raw) { List<FrbPqcPreKey> dco_decode_list_frb_pqc_pre_key(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
@ -5289,6 +5422,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
.toList(); .toList();
} }
@protected
List<(String, String)> dco_decode_list_record_string_string(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return (raw as List<dynamic>).map(dco_decode_record_string_string).toList();
}
@protected @protected
List<SqlRow> dco_decode_list_sql_row(dynamic raw) { List<SqlRow> dco_decode_list_sql_row(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
@ -5343,6 +5482,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return raw == null ? null : dco_decode_box_autoadd_f_64(raw); return raw == null ? null : dco_decode_box_autoadd_f_64(raw);
} }
@protected
FrbPresignedPost? dco_decode_opt_box_autoadd_frb_presigned_post(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return raw == null ? null : dco_decode_box_autoadd_frb_presigned_post(raw);
}
@protected @protected
PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw) { PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
@ -5862,6 +6007,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return (sse_decode_frb_pre_key_bundle(deserializer)); return (sse_decode_frb_pre_key_bundle(deserializer));
} }
@protected
FrbPresignedPost sse_decode_box_autoadd_frb_presigned_post(
SseDeserializer deserializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
return (sse_decode_frb_presigned_post(deserializer));
}
@protected @protected
PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer) { PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -5917,6 +6070,89 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return FlutterUserDiscovery(); return FlutterUserDiscovery();
} }
@protected
FrbAdditionalAccount sse_decode_frb_additional_account(
SseDeserializer deserializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_userId = sse_decode_i_64(deserializer);
var var_planId = sse_decode_String(deserializer);
return FrbAdditionalAccount(userId: var_userId, planId: var_planId);
}
@protected
FrbMemoriesUploadUrls sse_decode_frb_memories_upload_urls(
SseDeserializer deserializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_mediaId = sse_decode_String(deserializer);
var var_thumbnailUpload = sse_decode_opt_box_autoadd_frb_presigned_post(
deserializer,
);
var var_fullUpload = sse_decode_opt_box_autoadd_frb_presigned_post(
deserializer,
);
return FrbMemoriesUploadUrls(
mediaId: var_mediaId,
thumbnailUpload: var_thumbnailUpload,
fullUpload: var_fullUpload,
);
}
@protected
FrbMemoriesUsage sse_decode_frb_memories_usage(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_currentBytes = sse_decode_i_64(deserializer);
var var_count = sse_decode_i_64(deserializer);
var var_maxBytes = sse_decode_i_64(deserializer);
return FrbMemoriesUsage(
currentBytes: var_currentBytes,
count: var_count,
maxBytes: var_maxBytes,
);
}
@protected
FrbPasswordlessNotificationMessage
sse_decode_frb_passwordless_notification_message(
SseDeserializer deserializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_id = sse_decode_i_64(deserializer);
var var_encryptedMessage = sse_decode_list_prim_u_8_strict(deserializer);
return FrbPasswordlessNotificationMessage(
id: var_id,
encryptedMessage: var_encryptedMessage,
);
}
@protected
FrbPlanBalance sse_decode_frb_plan_balance(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_usedDailyMediaUploadLimit = sse_decode_i_64(deserializer);
var var_usedUploadMediaSizeLimit = sse_decode_i_64(deserializer);
var var_paymentPeriodDays = sse_decode_opt_box_autoadd_i_64(deserializer);
var var_lastPaymentDoneUnixTimestamp = sse_decode_opt_box_autoadd_i_64(
deserializer,
);
var var_additionalAccounts = sse_decode_list_frb_additional_account(
deserializer,
);
var var_autoRenewal = sse_decode_opt_box_autoadd_bool(deserializer);
var var_additionalAccountOwnerId = sse_decode_opt_box_autoadd_i_64(
deserializer,
);
return FrbPlanBalance(
usedDailyMediaUploadLimit: var_usedDailyMediaUploadLimit,
usedUploadMediaSizeLimit: var_usedUploadMediaSizeLimit,
paymentPeriodDays: var_paymentPeriodDays,
lastPaymentDoneUnixTimestamp: var_lastPaymentDoneUnixTimestamp,
additionalAccounts: var_additionalAccounts,
autoRenewal: var_autoRenewal,
additionalAccountOwnerId: var_additionalAccountOwnerId,
);
}
@protected @protected
FrbPqcPreKey sse_decode_frb_pqc_pre_key(SseDeserializer deserializer) { FrbPqcPreKey sse_decode_frb_pqc_pre_key(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -5969,6 +6205,35 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
} }
@protected
FrbPresignedPost sse_decode_frb_presigned_post(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_url = sse_decode_String(deserializer);
var var_fields = sse_decode_list_record_string_string(deserializer);
return FrbPresignedPost(url: var_url, fields: var_fields);
}
@protected
FrbProofOfWork sse_decode_frb_proof_of_work(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_prefix = sse_decode_String(deserializer);
var var_difficulty = sse_decode_i_64(deserializer);
return FrbProofOfWork(prefix: var_prefix, difficulty: var_difficulty);
}
@protected
FrbUserData sse_decode_frb_user_data(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_userId = sse_decode_i_64(deserializer);
var var_username = sse_decode_list_prim_u_8_strict(deserializer);
var var_publicIdentityKey = sse_decode_list_prim_u_8_strict(deserializer);
return FrbUserData(
userId: var_userId,
username: var_username,
publicIdentityKey: var_publicIdentityKey,
);
}
@protected @protected
int sse_decode_i_32(SseDeserializer deserializer) { int sse_decode_i_32(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -6039,6 +6304,35 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return ans_; return ans_;
} }
@protected
List<FrbAdditionalAccount> sse_decode_list_frb_additional_account(
SseDeserializer deserializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
var len_ = sse_decode_i_32(deserializer);
var ans_ = <FrbAdditionalAccount>[];
for (var idx_ = 0; idx_ < len_; ++idx_) {
ans_.add(sse_decode_frb_additional_account(deserializer));
}
return ans_;
}
@protected
List<FrbPasswordlessNotificationMessage>
sse_decode_list_frb_passwordless_notification_message(
SseDeserializer deserializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
var len_ = sse_decode_i_32(deserializer);
var ans_ = <FrbPasswordlessNotificationMessage>[];
for (var idx_ = 0; idx_ < len_; ++idx_) {
ans_.add(sse_decode_frb_passwordless_notification_message(deserializer));
}
return ans_;
}
@protected @protected
List<FrbPqcPreKey> sse_decode_list_frb_pqc_pre_key( List<FrbPqcPreKey> sse_decode_list_frb_pqc_pre_key(
SseDeserializer deserializer, SseDeserializer deserializer,
@ -6130,6 +6424,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return ans_; return ans_;
} }
@protected
List<(String, String)> sse_decode_list_record_string_string(
SseDeserializer deserializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
var len_ = sse_decode_i_32(deserializer);
var ans_ = <(String, String)>[];
for (var idx_ = 0; idx_ < len_; ++idx_) {
ans_.add(sse_decode_record_string_string(deserializer));
}
return ans_;
}
@protected @protected
List<SqlRow> sse_decode_list_sql_row(SseDeserializer deserializer) { List<SqlRow> sse_decode_list_sql_row(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -6226,6 +6534,19 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
} }
@protected
FrbPresignedPost? sse_decode_opt_box_autoadd_frb_presigned_post(
SseDeserializer deserializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
if (sse_decode_bool(deserializer)) {
return (sse_decode_box_autoadd_frb_presigned_post(deserializer));
} else {
return null;
}
}
@protected @protected
PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer) { PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -6947,6 +7268,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
sse_encode_frb_pre_key_bundle(self, serializer); sse_encode_frb_pre_key_bundle(self, serializer);
} }
@protected
void sse_encode_box_autoadd_frb_presigned_post(
FrbPresignedPost self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_frb_presigned_post(self, serializer);
}
@protected @protected
void sse_encode_box_autoadd_i_64( void sse_encode_box_autoadd_i_64(
PlatformInt64 self, PlatformInt64 self,
@ -7012,6 +7342,69 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
} }
@protected
void sse_encode_frb_additional_account(
FrbAdditionalAccount self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_64(self.userId, serializer);
sse_encode_String(self.planId, serializer);
}
@protected
void sse_encode_frb_memories_upload_urls(
FrbMemoriesUploadUrls self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_String(self.mediaId, serializer);
sse_encode_opt_box_autoadd_frb_presigned_post(
self.thumbnailUpload,
serializer,
);
sse_encode_opt_box_autoadd_frb_presigned_post(self.fullUpload, serializer);
}
@protected
void sse_encode_frb_memories_usage(
FrbMemoriesUsage self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_64(self.currentBytes, serializer);
sse_encode_i_64(self.count, serializer);
sse_encode_i_64(self.maxBytes, serializer);
}
@protected
void sse_encode_frb_passwordless_notification_message(
FrbPasswordlessNotificationMessage self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_64(self.id, serializer);
sse_encode_list_prim_u_8_strict(self.encryptedMessage, serializer);
}
@protected
void sse_encode_frb_plan_balance(
FrbPlanBalance self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_64(self.usedDailyMediaUploadLimit, serializer);
sse_encode_i_64(self.usedUploadMediaSizeLimit, serializer);
sse_encode_opt_box_autoadd_i_64(self.paymentPeriodDays, serializer);
sse_encode_opt_box_autoadd_i_64(
self.lastPaymentDoneUnixTimestamp,
serializer,
);
sse_encode_list_frb_additional_account(self.additionalAccounts, serializer);
sse_encode_opt_box_autoadd_bool(self.autoRenewal, serializer);
sse_encode_opt_box_autoadd_i_64(self.additionalAccountOwnerId, serializer);
}
@protected @protected
void sse_encode_frb_pqc_pre_key(FrbPqcPreKey self, SseSerializer serializer) { void sse_encode_frb_pqc_pre_key(FrbPqcPreKey self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -7041,6 +7434,34 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
sse_encode_list_prim_u_8_strict(self.identityKey, serializer); sse_encode_list_prim_u_8_strict(self.identityKey, serializer);
} }
@protected
void sse_encode_frb_presigned_post(
FrbPresignedPost self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_String(self.url, serializer);
sse_encode_list_record_string_string(self.fields, serializer);
}
@protected
void sse_encode_frb_proof_of_work(
FrbProofOfWork self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_String(self.prefix, serializer);
sse_encode_i_64(self.difficulty, serializer);
}
@protected
void sse_encode_frb_user_data(FrbUserData self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_64(self.userId, serializer);
sse_encode_list_prim_u_8_strict(self.username, serializer);
sse_encode_list_prim_u_8_strict(self.publicIdentityKey, serializer);
}
@protected @protected
void sse_encode_i_32(int self, SseSerializer serializer) { void sse_encode_i_32(int self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -7104,6 +7525,30 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
} }
@protected
void sse_encode_list_frb_additional_account(
List<FrbAdditionalAccount> self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_32(self.length, serializer);
for (final item in self) {
sse_encode_frb_additional_account(item, serializer);
}
}
@protected
void sse_encode_list_frb_passwordless_notification_message(
List<FrbPasswordlessNotificationMessage> self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_32(self.length, serializer);
for (final item in self) {
sse_encode_frb_passwordless_notification_message(item, serializer);
}
}
@protected @protected
void sse_encode_list_frb_pqc_pre_key( void sse_encode_list_frb_pqc_pre_key(
List<FrbPqcPreKey> self, List<FrbPqcPreKey> self,
@ -7196,6 +7641,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
} }
@protected
void sse_encode_list_record_string_string(
List<(String, String)> self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_32(self.length, serializer);
for (final item in self) {
sse_encode_record_string_string(item, serializer);
}
}
@protected @protected
void sse_encode_list_sql_row(List<SqlRow> self, SseSerializer serializer) { void sse_encode_list_sql_row(List<SqlRow> self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -7286,6 +7743,19 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
} }
@protected
void sse_encode_opt_box_autoadd_frb_presigned_post(
FrbPresignedPost? self,
SseSerializer serializer,
) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_bool(self != null, serializer);
if (self != null) {
sse_encode_box_autoadd_frb_presigned_post(self, serializer);
}
}
@protected @protected
void sse_encode_opt_box_autoadd_i_64( void sse_encode_opt_box_autoadd_i_64(
PlatformInt64? self, PlatformInt64? self,

View file

@ -118,6 +118,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
FrbPreKeyBundle dco_decode_box_autoadd_frb_pre_key_bundle(dynamic raw); FrbPreKeyBundle dco_decode_box_autoadd_frb_pre_key_bundle(dynamic raw);
@protected
FrbPresignedPost dco_decode_box_autoadd_frb_presigned_post(dynamic raw);
@protected @protected
PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw); PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw);
@ -143,12 +146,37 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
FlutterUserDiscovery dco_decode_flutter_user_discovery(dynamic raw); FlutterUserDiscovery dco_decode_flutter_user_discovery(dynamic raw);
@protected
FrbAdditionalAccount dco_decode_frb_additional_account(dynamic raw);
@protected
FrbMemoriesUploadUrls dco_decode_frb_memories_upload_urls(dynamic raw);
@protected
FrbMemoriesUsage dco_decode_frb_memories_usage(dynamic raw);
@protected
FrbPasswordlessNotificationMessage
dco_decode_frb_passwordless_notification_message(dynamic raw);
@protected
FrbPlanBalance dco_decode_frb_plan_balance(dynamic raw);
@protected @protected
FrbPqcPreKey dco_decode_frb_pqc_pre_key(dynamic raw); FrbPqcPreKey dco_decode_frb_pqc_pre_key(dynamic raw);
@protected @protected
FrbPreKeyBundle dco_decode_frb_pre_key_bundle(dynamic raw); FrbPreKeyBundle dco_decode_frb_pre_key_bundle(dynamic raw);
@protected
FrbPresignedPost dco_decode_frb_presigned_post(dynamic raw);
@protected
FrbProofOfWork dco_decode_frb_proof_of_work(dynamic raw);
@protected
FrbUserData dco_decode_frb_user_data(dynamic raw);
@protected @protected
int dco_decode_i_32(dynamic raw); int dco_decode_i_32(dynamic raw);
@ -175,6 +203,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
List<String> dco_decode_list_String(dynamic raw); List<String> dco_decode_list_String(dynamic raw);
@protected
List<FrbAdditionalAccount> dco_decode_list_frb_additional_account(
dynamic raw,
);
@protected
List<FrbPasswordlessNotificationMessage>
dco_decode_list_frb_passwordless_notification_message(dynamic raw);
@protected @protected
List<FrbPqcPreKey> dco_decode_list_frb_pqc_pre_key(dynamic raw); List<FrbPqcPreKey> dco_decode_list_frb_pqc_pre_key(dynamic raw);
@ -203,6 +240,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
dynamic raw, dynamic raw,
); );
@protected
List<(String, String)> dco_decode_list_record_string_string(dynamic raw);
@protected @protected
List<SqlRow> dco_decode_list_sql_row(dynamic raw); List<SqlRow> dco_decode_list_sql_row(dynamic raw);
@ -231,6 +271,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
double? dco_decode_opt_box_autoadd_f_64(dynamic raw); double? dco_decode_opt_box_autoadd_f_64(dynamic raw);
@protected
FrbPresignedPost? dco_decode_opt_box_autoadd_frb_presigned_post(dynamic raw);
@protected @protected
PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw); PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw);
@ -408,6 +451,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseDeserializer deserializer, SseDeserializer deserializer,
); );
@protected
FrbPresignedPost sse_decode_box_autoadd_frb_presigned_post(
SseDeserializer deserializer,
);
@protected @protected
PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer); PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer);
@ -439,12 +487,43 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseDeserializer deserializer, SseDeserializer deserializer,
); );
@protected
FrbAdditionalAccount sse_decode_frb_additional_account(
SseDeserializer deserializer,
);
@protected
FrbMemoriesUploadUrls sse_decode_frb_memories_upload_urls(
SseDeserializer deserializer,
);
@protected
FrbMemoriesUsage sse_decode_frb_memories_usage(SseDeserializer deserializer);
@protected
FrbPasswordlessNotificationMessage
sse_decode_frb_passwordless_notification_message(
SseDeserializer deserializer,
);
@protected
FrbPlanBalance sse_decode_frb_plan_balance(SseDeserializer deserializer);
@protected @protected
FrbPqcPreKey sse_decode_frb_pqc_pre_key(SseDeserializer deserializer); FrbPqcPreKey sse_decode_frb_pqc_pre_key(SseDeserializer deserializer);
@protected @protected
FrbPreKeyBundle sse_decode_frb_pre_key_bundle(SseDeserializer deserializer); FrbPreKeyBundle sse_decode_frb_pre_key_bundle(SseDeserializer deserializer);
@protected
FrbPresignedPost sse_decode_frb_presigned_post(SseDeserializer deserializer);
@protected
FrbProofOfWork sse_decode_frb_proof_of_work(SseDeserializer deserializer);
@protected
FrbUserData sse_decode_frb_user_data(SseDeserializer deserializer);
@protected @protected
int sse_decode_i_32(SseDeserializer deserializer); int sse_decode_i_32(SseDeserializer deserializer);
@ -475,6 +554,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
List<String> sse_decode_list_String(SseDeserializer deserializer); List<String> sse_decode_list_String(SseDeserializer deserializer);
@protected
List<FrbAdditionalAccount> sse_decode_list_frb_additional_account(
SseDeserializer deserializer,
);
@protected
List<FrbPasswordlessNotificationMessage>
sse_decode_list_frb_passwordless_notification_message(
SseDeserializer deserializer,
);
@protected @protected
List<FrbPqcPreKey> sse_decode_list_frb_pqc_pre_key( List<FrbPqcPreKey> sse_decode_list_frb_pqc_pre_key(
SseDeserializer deserializer, SseDeserializer deserializer,
@ -509,6 +599,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseDeserializer deserializer, SseDeserializer deserializer,
); );
@protected
List<(String, String)> sse_decode_list_record_string_string(
SseDeserializer deserializer,
);
@protected @protected
List<SqlRow> sse_decode_list_sql_row(SseDeserializer deserializer); List<SqlRow> sse_decode_list_sql_row(SseDeserializer deserializer);
@ -537,6 +632,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer); double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer);
@protected
FrbPresignedPost? sse_decode_opt_box_autoadd_frb_presigned_post(
SseDeserializer deserializer,
);
@protected @protected
PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer); PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer);
@ -782,6 +882,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer, SseSerializer serializer,
); );
@protected
void sse_encode_box_autoadd_frb_presigned_post(
FrbPresignedPost self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_box_autoadd_i_64( void sse_encode_box_autoadd_i_64(
PlatformInt64 self, PlatformInt64 self,
@ -824,6 +930,36 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer, SseSerializer serializer,
); );
@protected
void sse_encode_frb_additional_account(
FrbAdditionalAccount self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_memories_upload_urls(
FrbMemoriesUploadUrls self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_memories_usage(
FrbMemoriesUsage self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_passwordless_notification_message(
FrbPasswordlessNotificationMessage self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_plan_balance(
FrbPlanBalance self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_frb_pqc_pre_key(FrbPqcPreKey self, SseSerializer serializer); void sse_encode_frb_pqc_pre_key(FrbPqcPreKey self, SseSerializer serializer);
@ -833,6 +969,21 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer, SseSerializer serializer,
); );
@protected
void sse_encode_frb_presigned_post(
FrbPresignedPost self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_proof_of_work(
FrbProofOfWork self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_user_data(FrbUserData self, SseSerializer serializer);
@protected @protected
void sse_encode_i_32(int self, SseSerializer serializer); void sse_encode_i_32(int self, SseSerializer serializer);
@ -866,6 +1017,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
void sse_encode_list_String(List<String> self, SseSerializer serializer); void sse_encode_list_String(List<String> self, SseSerializer serializer);
@protected
void sse_encode_list_frb_additional_account(
List<FrbAdditionalAccount> self,
SseSerializer serializer,
);
@protected
void sse_encode_list_frb_passwordless_notification_message(
List<FrbPasswordlessNotificationMessage> self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_list_frb_pqc_pre_key( void sse_encode_list_frb_pqc_pre_key(
List<FrbPqcPreKey> self, List<FrbPqcPreKey> self,
@ -911,6 +1074,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer, SseSerializer serializer,
); );
@protected
void sse_encode_list_record_string_string(
List<(String, String)> self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_list_sql_row(List<SqlRow> self, SseSerializer serializer); void sse_encode_list_sql_row(List<SqlRow> self, SseSerializer serializer);
@ -944,6 +1113,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
void sse_encode_opt_box_autoadd_f_64(double? self, SseSerializer serializer); void sse_encode_opt_box_autoadd_f_64(double? self, SseSerializer serializer);
@protected
void sse_encode_opt_box_autoadd_frb_presigned_post(
FrbPresignedPost? self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_opt_box_autoadd_i_64( void sse_encode_opt_box_autoadd_i_64(
PlatformInt64? self, PlatformInt64? self,

View file

@ -120,6 +120,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
FrbPreKeyBundle dco_decode_box_autoadd_frb_pre_key_bundle(dynamic raw); FrbPreKeyBundle dco_decode_box_autoadd_frb_pre_key_bundle(dynamic raw);
@protected
FrbPresignedPost dco_decode_box_autoadd_frb_presigned_post(dynamic raw);
@protected @protected
PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw); PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw);
@ -145,12 +148,37 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
FlutterUserDiscovery dco_decode_flutter_user_discovery(dynamic raw); FlutterUserDiscovery dco_decode_flutter_user_discovery(dynamic raw);
@protected
FrbAdditionalAccount dco_decode_frb_additional_account(dynamic raw);
@protected
FrbMemoriesUploadUrls dco_decode_frb_memories_upload_urls(dynamic raw);
@protected
FrbMemoriesUsage dco_decode_frb_memories_usage(dynamic raw);
@protected
FrbPasswordlessNotificationMessage
dco_decode_frb_passwordless_notification_message(dynamic raw);
@protected
FrbPlanBalance dco_decode_frb_plan_balance(dynamic raw);
@protected @protected
FrbPqcPreKey dco_decode_frb_pqc_pre_key(dynamic raw); FrbPqcPreKey dco_decode_frb_pqc_pre_key(dynamic raw);
@protected @protected
FrbPreKeyBundle dco_decode_frb_pre_key_bundle(dynamic raw); FrbPreKeyBundle dco_decode_frb_pre_key_bundle(dynamic raw);
@protected
FrbPresignedPost dco_decode_frb_presigned_post(dynamic raw);
@protected
FrbProofOfWork dco_decode_frb_proof_of_work(dynamic raw);
@protected
FrbUserData dco_decode_frb_user_data(dynamic raw);
@protected @protected
int dco_decode_i_32(dynamic raw); int dco_decode_i_32(dynamic raw);
@ -177,6 +205,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
List<String> dco_decode_list_String(dynamic raw); List<String> dco_decode_list_String(dynamic raw);
@protected
List<FrbAdditionalAccount> dco_decode_list_frb_additional_account(
dynamic raw,
);
@protected
List<FrbPasswordlessNotificationMessage>
dco_decode_list_frb_passwordless_notification_message(dynamic raw);
@protected @protected
List<FrbPqcPreKey> dco_decode_list_frb_pqc_pre_key(dynamic raw); List<FrbPqcPreKey> dco_decode_list_frb_pqc_pre_key(dynamic raw);
@ -205,6 +242,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
dynamic raw, dynamic raw,
); );
@protected
List<(String, String)> dco_decode_list_record_string_string(dynamic raw);
@protected @protected
List<SqlRow> dco_decode_list_sql_row(dynamic raw); List<SqlRow> dco_decode_list_sql_row(dynamic raw);
@ -233,6 +273,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
double? dco_decode_opt_box_autoadd_f_64(dynamic raw); double? dco_decode_opt_box_autoadd_f_64(dynamic raw);
@protected
FrbPresignedPost? dco_decode_opt_box_autoadd_frb_presigned_post(dynamic raw);
@protected @protected
PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw); PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw);
@ -410,6 +453,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseDeserializer deserializer, SseDeserializer deserializer,
); );
@protected
FrbPresignedPost sse_decode_box_autoadd_frb_presigned_post(
SseDeserializer deserializer,
);
@protected @protected
PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer); PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer);
@ -441,12 +489,43 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseDeserializer deserializer, SseDeserializer deserializer,
); );
@protected
FrbAdditionalAccount sse_decode_frb_additional_account(
SseDeserializer deserializer,
);
@protected
FrbMemoriesUploadUrls sse_decode_frb_memories_upload_urls(
SseDeserializer deserializer,
);
@protected
FrbMemoriesUsage sse_decode_frb_memories_usage(SseDeserializer deserializer);
@protected
FrbPasswordlessNotificationMessage
sse_decode_frb_passwordless_notification_message(
SseDeserializer deserializer,
);
@protected
FrbPlanBalance sse_decode_frb_plan_balance(SseDeserializer deserializer);
@protected @protected
FrbPqcPreKey sse_decode_frb_pqc_pre_key(SseDeserializer deserializer); FrbPqcPreKey sse_decode_frb_pqc_pre_key(SseDeserializer deserializer);
@protected @protected
FrbPreKeyBundle sse_decode_frb_pre_key_bundle(SseDeserializer deserializer); FrbPreKeyBundle sse_decode_frb_pre_key_bundle(SseDeserializer deserializer);
@protected
FrbPresignedPost sse_decode_frb_presigned_post(SseDeserializer deserializer);
@protected
FrbProofOfWork sse_decode_frb_proof_of_work(SseDeserializer deserializer);
@protected
FrbUserData sse_decode_frb_user_data(SseDeserializer deserializer);
@protected @protected
int sse_decode_i_32(SseDeserializer deserializer); int sse_decode_i_32(SseDeserializer deserializer);
@ -477,6 +556,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
List<String> sse_decode_list_String(SseDeserializer deserializer); List<String> sse_decode_list_String(SseDeserializer deserializer);
@protected
List<FrbAdditionalAccount> sse_decode_list_frb_additional_account(
SseDeserializer deserializer,
);
@protected
List<FrbPasswordlessNotificationMessage>
sse_decode_list_frb_passwordless_notification_message(
SseDeserializer deserializer,
);
@protected @protected
List<FrbPqcPreKey> sse_decode_list_frb_pqc_pre_key( List<FrbPqcPreKey> sse_decode_list_frb_pqc_pre_key(
SseDeserializer deserializer, SseDeserializer deserializer,
@ -511,6 +601,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseDeserializer deserializer, SseDeserializer deserializer,
); );
@protected
List<(String, String)> sse_decode_list_record_string_string(
SseDeserializer deserializer,
);
@protected @protected
List<SqlRow> sse_decode_list_sql_row(SseDeserializer deserializer); List<SqlRow> sse_decode_list_sql_row(SseDeserializer deserializer);
@ -539,6 +634,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer); double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer);
@protected
FrbPresignedPost? sse_decode_opt_box_autoadd_frb_presigned_post(
SseDeserializer deserializer,
);
@protected @protected
PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer); PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer);
@ -784,6 +884,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer, SseSerializer serializer,
); );
@protected
void sse_encode_box_autoadd_frb_presigned_post(
FrbPresignedPost self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_box_autoadd_i_64( void sse_encode_box_autoadd_i_64(
PlatformInt64 self, PlatformInt64 self,
@ -826,6 +932,36 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer, SseSerializer serializer,
); );
@protected
void sse_encode_frb_additional_account(
FrbAdditionalAccount self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_memories_upload_urls(
FrbMemoriesUploadUrls self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_memories_usage(
FrbMemoriesUsage self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_passwordless_notification_message(
FrbPasswordlessNotificationMessage self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_plan_balance(
FrbPlanBalance self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_frb_pqc_pre_key(FrbPqcPreKey self, SseSerializer serializer); void sse_encode_frb_pqc_pre_key(FrbPqcPreKey self, SseSerializer serializer);
@ -835,6 +971,21 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer, SseSerializer serializer,
); );
@protected
void sse_encode_frb_presigned_post(
FrbPresignedPost self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_proof_of_work(
FrbProofOfWork self,
SseSerializer serializer,
);
@protected
void sse_encode_frb_user_data(FrbUserData self, SseSerializer serializer);
@protected @protected
void sse_encode_i_32(int self, SseSerializer serializer); void sse_encode_i_32(int self, SseSerializer serializer);
@ -868,6 +1019,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
void sse_encode_list_String(List<String> self, SseSerializer serializer); void sse_encode_list_String(List<String> self, SseSerializer serializer);
@protected
void sse_encode_list_frb_additional_account(
List<FrbAdditionalAccount> self,
SseSerializer serializer,
);
@protected
void sse_encode_list_frb_passwordless_notification_message(
List<FrbPasswordlessNotificationMessage> self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_list_frb_pqc_pre_key( void sse_encode_list_frb_pqc_pre_key(
List<FrbPqcPreKey> self, List<FrbPqcPreKey> self,
@ -913,6 +1076,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
SseSerializer serializer, SseSerializer serializer,
); );
@protected
void sse_encode_list_record_string_string(
List<(String, String)> self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_list_sql_row(List<SqlRow> self, SseSerializer serializer); void sse_encode_list_sql_row(List<SqlRow> self, SseSerializer serializer);
@ -946,6 +1115,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
void sse_encode_opt_box_autoadd_f_64(double? self, SseSerializer serializer); void sse_encode_opt_box_autoadd_f_64(double? self, SseSerializer serializer);
@protected
void sse_encode_opt_box_autoadd_frb_presigned_post(
FrbPresignedPost? self,
SseSerializer serializer,
);
@protected @protected
void sse_encode_opt_box_autoadd_i_64( void sse_encode_opt_box_autoadd_i_64(
PlatformInt64? self, PlatformInt64? self,

View file

@ -5,7 +5,6 @@ import 'package:twonly/src/services/news.service.dart';
import 'package:twonly/src/services/user.service.dart'; import 'package:twonly/src/services/user.service.dart';
export 'package:twonly/core/bridge/api.dart'; export 'package:twonly/core/bridge/api.dart';
export 'package:twonly/src/model/protobuf/api/websocket/error.pb.dart';
export 'package:twonly/src/services/api/rust_api_result.dart'; export 'package:twonly/src/services/api/rust_api_result.dart';
final GetIt locator = GetIt.instance; final GetIt locator = GetIt.instance;

View file

@ -0,0 +1,58 @@
// ignore_for_file: constant_identifier_names
enum ErrorCode {
Unknown(0),
BadRequest(400),
TooManyRequests(429),
InternalError(500),
InvalidInvitationCode(1002),
UsernameAlreadyTaken(1003),
SignatureNotValid(1004),
UsernameNotFound(1005),
UsernameNotValid(1006),
InvalidPublicKey(1007),
SessionAlreadyAuthenticated(1008),
SessionNotAuthenticated(1009),
OnlyOneSessionAllowed(1010),
UploadLimitReached(1011),
InvalidUpdateToken(1012),
InvalidOffset(1013),
InvalidGoogleFcmToken(1014),
UploadTokenIsBlocked(1015),
UploadChecksumInvalid(1016),
InvalidDownloadToken(1017),
ApiEndpointNotFound(1018),
AuthTokenNotValid(1019),
InvalidPreKeys(1020),
VoucherInValid(1021),
PlanNotAllowed(1022),
PlanLimitReached(1023),
NotEnoughCredit(1024),
PlanDowngrade(1025),
PlanUpgradeNotYearly(1026),
InvalidSignedPreKey(1027),
UserIdNotFound(1028),
UserIdAlreadyTaken(1029),
AppVersionOutdated(1030),
NewDeviceRegistered(1031),
InvalidProofOfWork(1032),
RegistrationDisabled(1033),
IPAPaymentExpired(1034),
UserIsNotInFreePlan(1035),
ForegroundSessionConnected(1036),
NoRecoveryData(1037),
InvalidRecoveryData(1038);
const ErrorCode(this.value);
final int value;
static ErrorCode fromValue(int? value) {
return ErrorCode.values.firstWhere(
(e) => e.value == value,
orElse: () => ErrorCode.Unknown,
);
}
static ErrorCode valueOf(int? value) => fromValue(value);
}

View file

@ -1,13 +0,0 @@
//
// Generated code. Do not modify.
// source: api/http/http_requests.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'http_requests.pb.dart';

File diff suppressed because it is too large Load diff

View file

@ -1,11 +0,0 @@
// This is a generated file - do not edit.
//
// Generated from api/websocket/client_to_server.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports

View file

@ -1,13 +0,0 @@
//
// Generated code. Do not modify.
// source: api/websocket/client_to_server.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'client_to_server.pb.dart';

View file

@ -1,17 +0,0 @@
// This is a generated file - do not edit.
//
// Generated from api/websocket/error.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
export 'error.pbenum.dart';

View file

@ -1,153 +0,0 @@
// This is a generated file - do not edit.
//
// Generated from api/websocket/error.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class ErrorCode extends $pb.ProtobufEnum {
static const ErrorCode Unknown =
ErrorCode._(0, _omitEnumNames ? '' : 'Unknown');
static const ErrorCode BadRequest =
ErrorCode._(400, _omitEnumNames ? '' : 'BadRequest');
static const ErrorCode TooManyRequests =
ErrorCode._(429, _omitEnumNames ? '' : 'TooManyRequests');
static const ErrorCode InternalError =
ErrorCode._(500, _omitEnumNames ? '' : 'InternalError');
static const ErrorCode InvalidInvitationCode =
ErrorCode._(1002, _omitEnumNames ? '' : 'InvalidInvitationCode');
static const ErrorCode UsernameAlreadyTaken =
ErrorCode._(1003, _omitEnumNames ? '' : 'UsernameAlreadyTaken');
static const ErrorCode SignatureNotValid =
ErrorCode._(1004, _omitEnumNames ? '' : 'SignatureNotValid');
static const ErrorCode UsernameNotFound =
ErrorCode._(1005, _omitEnumNames ? '' : 'UsernameNotFound');
static const ErrorCode UsernameNotValid =
ErrorCode._(1006, _omitEnumNames ? '' : 'UsernameNotValid');
static const ErrorCode InvalidPublicKey =
ErrorCode._(1007, _omitEnumNames ? '' : 'InvalidPublicKey');
static const ErrorCode SessionAlreadyAuthenticated =
ErrorCode._(1008, _omitEnumNames ? '' : 'SessionAlreadyAuthenticated');
static const ErrorCode SessionNotAuthenticated =
ErrorCode._(1009, _omitEnumNames ? '' : 'SessionNotAuthenticated');
static const ErrorCode OnlyOneSessionAllowed =
ErrorCode._(1010, _omitEnumNames ? '' : 'OnlyOneSessionAllowed');
static const ErrorCode UploadLimitReached =
ErrorCode._(1011, _omitEnumNames ? '' : 'UploadLimitReached');
static const ErrorCode InvalidUpdateToken =
ErrorCode._(1012, _omitEnumNames ? '' : 'InvalidUpdateToken');
static const ErrorCode InvalidOffset =
ErrorCode._(1013, _omitEnumNames ? '' : 'InvalidOffset');
static const ErrorCode InvalidGoogleFcmToken =
ErrorCode._(1014, _omitEnumNames ? '' : 'InvalidGoogleFcmToken');
static const ErrorCode UploadTokenIsBlocked =
ErrorCode._(1015, _omitEnumNames ? '' : 'UploadTokenIsBlocked');
static const ErrorCode UploadChecksumInvalid =
ErrorCode._(1016, _omitEnumNames ? '' : 'UploadChecksumInvalid');
static const ErrorCode InvalidDownloadToken =
ErrorCode._(1017, _omitEnumNames ? '' : 'InvalidDownloadToken');
static const ErrorCode ApiEndpointNotFound =
ErrorCode._(1018, _omitEnumNames ? '' : 'ApiEndpointNotFound');
static const ErrorCode AuthTokenNotValid =
ErrorCode._(1019, _omitEnumNames ? '' : 'AuthTokenNotValid');
static const ErrorCode InvalidPreKeys =
ErrorCode._(1020, _omitEnumNames ? '' : 'InvalidPreKeys');
static const ErrorCode VoucherInValid =
ErrorCode._(1021, _omitEnumNames ? '' : 'VoucherInValid');
static const ErrorCode PlanNotAllowed =
ErrorCode._(1022, _omitEnumNames ? '' : 'PlanNotAllowed');
static const ErrorCode PlanLimitReached =
ErrorCode._(1023, _omitEnumNames ? '' : 'PlanLimitReached');
static const ErrorCode NotEnoughCredit =
ErrorCode._(1024, _omitEnumNames ? '' : 'NotEnoughCredit');
static const ErrorCode PlanDowngrade =
ErrorCode._(1025, _omitEnumNames ? '' : 'PlanDowngrade');
static const ErrorCode PlanUpgradeNotYearly =
ErrorCode._(1026, _omitEnumNames ? '' : 'PlanUpgradeNotYearly');
static const ErrorCode InvalidSignedPreKey =
ErrorCode._(1027, _omitEnumNames ? '' : 'InvalidSignedPreKey');
static const ErrorCode UserIdNotFound =
ErrorCode._(1028, _omitEnumNames ? '' : 'UserIdNotFound');
static const ErrorCode UserIdAlreadyTaken =
ErrorCode._(1029, _omitEnumNames ? '' : 'UserIdAlreadyTaken');
static const ErrorCode AppVersionOutdated =
ErrorCode._(1030, _omitEnumNames ? '' : 'AppVersionOutdated');
static const ErrorCode NewDeviceRegistered =
ErrorCode._(1031, _omitEnumNames ? '' : 'NewDeviceRegistered');
static const ErrorCode InvalidProofOfWork =
ErrorCode._(1032, _omitEnumNames ? '' : 'InvalidProofOfWork');
static const ErrorCode RegistrationDisabled =
ErrorCode._(1033, _omitEnumNames ? '' : 'RegistrationDisabled');
static const ErrorCode IPAPaymentExpired =
ErrorCode._(1034, _omitEnumNames ? '' : 'IPAPaymentExpired');
static const ErrorCode UserIsNotInFreePlan =
ErrorCode._(1035, _omitEnumNames ? '' : 'UserIsNotInFreePlan');
static const ErrorCode ForegroundSessionConnected =
ErrorCode._(1036, _omitEnumNames ? '' : 'ForegroundSessionConnected');
static const ErrorCode NoRecoveryData =
ErrorCode._(1037, _omitEnumNames ? '' : 'NoRecoveryData');
static const ErrorCode InvalidRecoveryData =
ErrorCode._(1038, _omitEnumNames ? '' : 'InvalidRecoveryData');
static const $core.List<ErrorCode> values = <ErrorCode>[
Unknown,
BadRequest,
TooManyRequests,
InternalError,
InvalidInvitationCode,
UsernameAlreadyTaken,
SignatureNotValid,
UsernameNotFound,
UsernameNotValid,
InvalidPublicKey,
SessionAlreadyAuthenticated,
SessionNotAuthenticated,
OnlyOneSessionAllowed,
UploadLimitReached,
InvalidUpdateToken,
InvalidOffset,
InvalidGoogleFcmToken,
UploadTokenIsBlocked,
UploadChecksumInvalid,
InvalidDownloadToken,
ApiEndpointNotFound,
AuthTokenNotValid,
InvalidPreKeys,
VoucherInValid,
PlanNotAllowed,
PlanLimitReached,
NotEnoughCredit,
PlanDowngrade,
PlanUpgradeNotYearly,
InvalidSignedPreKey,
UserIdNotFound,
UserIdAlreadyTaken,
AppVersionOutdated,
NewDeviceRegistered,
InvalidProofOfWork,
RegistrationDisabled,
IPAPaymentExpired,
UserIsNotInFreePlan,
ForegroundSessionConnected,
NoRecoveryData,
InvalidRecoveryData,
];
static final $core.Map<$core.int, ErrorCode> _byValue =
$pb.ProtobufEnum.initByValue(values);
static ErrorCode? valueOf($core.int value) => _byValue[value];
const ErrorCode._(super.value, super.name);
}
const $core.bool _omitEnumNames =
$core.bool.fromEnvironment('protobuf.omit_enum_names');

View file

@ -1,86 +0,0 @@
// This is a generated file - do not edit.
//
// Generated from api/websocket/error.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
// ignore_for_file: unused_import
import 'dart:convert' as $convert;
import 'dart:core' as $core;
import 'dart:typed_data' as $typed_data;
@$core.Deprecated('Use errorCodeDescriptor instead')
const ErrorCode$json = {
'1': 'ErrorCode',
'2': [
{'1': 'Unknown', '2': 0},
{'1': 'BadRequest', '2': 400},
{'1': 'TooManyRequests', '2': 429},
{'1': 'InternalError', '2': 500},
{'1': 'InvalidInvitationCode', '2': 1002},
{'1': 'UsernameAlreadyTaken', '2': 1003},
{'1': 'SignatureNotValid', '2': 1004},
{'1': 'UsernameNotFound', '2': 1005},
{'1': 'UsernameNotValid', '2': 1006},
{'1': 'InvalidPublicKey', '2': 1007},
{'1': 'SessionAlreadyAuthenticated', '2': 1008},
{'1': 'SessionNotAuthenticated', '2': 1009},
{'1': 'OnlyOneSessionAllowed', '2': 1010},
{'1': 'UploadLimitReached', '2': 1011},
{'1': 'InvalidUpdateToken', '2': 1012},
{'1': 'InvalidOffset', '2': 1013},
{'1': 'InvalidGoogleFcmToken', '2': 1014},
{'1': 'UploadTokenIsBlocked', '2': 1015},
{'1': 'UploadChecksumInvalid', '2': 1016},
{'1': 'InvalidDownloadToken', '2': 1017},
{'1': 'ApiEndpointNotFound', '2': 1018},
{'1': 'AuthTokenNotValid', '2': 1019},
{'1': 'InvalidPreKeys', '2': 1020},
{'1': 'VoucherInValid', '2': 1021},
{'1': 'PlanNotAllowed', '2': 1022},
{'1': 'PlanLimitReached', '2': 1023},
{'1': 'NotEnoughCredit', '2': 1024},
{'1': 'PlanDowngrade', '2': 1025},
{'1': 'PlanUpgradeNotYearly', '2': 1026},
{'1': 'InvalidSignedPreKey', '2': 1027},
{'1': 'UserIdNotFound', '2': 1028},
{'1': 'UserIdAlreadyTaken', '2': 1029},
{'1': 'AppVersionOutdated', '2': 1030},
{'1': 'NewDeviceRegistered', '2': 1031},
{'1': 'InvalidProofOfWork', '2': 1032},
{'1': 'RegistrationDisabled', '2': 1033},
{'1': 'IPAPaymentExpired', '2': 1034},
{'1': 'UserIsNotInFreePlan', '2': 1035},
{'1': 'ForegroundSessionConnected', '2': 1036},
{'1': 'NoRecoveryData', '2': 1037},
{'1': 'InvalidRecoveryData', '2': 1038},
],
};
/// Descriptor for `ErrorCode`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode(
'CglFcnJvckNvZGUSCwoHVW5rbm93bhAAEg8KCkJhZFJlcXVlc3QQkAMSFAoPVG9vTWFueVJlcX'
'Vlc3RzEK0DEhIKDUludGVybmFsRXJyb3IQ9AMSGgoVSW52YWxpZEludml0YXRpb25Db2RlEOoH'
'EhkKFFVzZXJuYW1lQWxyZWFkeVRha2VuEOsHEhYKEVNpZ25hdHVyZU5vdFZhbGlkEOwHEhUKEF'
'VzZXJuYW1lTm90Rm91bmQQ7QcSFQoQVXNlcm5hbWVOb3RWYWxpZBDuBxIVChBJbnZhbGlkUHVi'
'bGljS2V5EO8HEiAKG1Nlc3Npb25BbHJlYWR5QXV0aGVudGljYXRlZBDwBxIcChdTZXNzaW9uTm'
'90QXV0aGVudGljYXRlZBDxBxIaChVPbmx5T25lU2Vzc2lvbkFsbG93ZWQQ8gcSFwoSVXBsb2Fk'
'TGltaXRSZWFjaGVkEPMHEhcKEkludmFsaWRVcGRhdGVUb2tlbhD0BxISCg1JbnZhbGlkT2Zmc2'
'V0EPUHEhoKFUludmFsaWRHb29nbGVGY21Ub2tlbhD2BxIZChRVcGxvYWRUb2tlbklzQmxvY2tl'
'ZBD3BxIaChVVcGxvYWRDaGVja3N1bUludmFsaWQQ+AcSGQoUSW52YWxpZERvd25sb2FkVG9rZW'
'4Q+QcSGAoTQXBpRW5kcG9pbnROb3RGb3VuZBD6BxIWChFBdXRoVG9rZW5Ob3RWYWxpZBD7BxIT'
'Cg5JbnZhbGlkUHJlS2V5cxD8BxITCg5Wb3VjaGVySW5WYWxpZBD9BxITCg5QbGFuTm90QWxsb3'
'dlZBD+BxIVChBQbGFuTGltaXRSZWFjaGVkEP8HEhQKD05vdEVub3VnaENyZWRpdBCACBISCg1Q'
'bGFuRG93bmdyYWRlEIEIEhkKFFBsYW5VcGdyYWRlTm90WWVhcmx5EIIIEhgKE0ludmFsaWRTaW'
'duZWRQcmVLZXkQgwgSEwoOVXNlcklkTm90Rm91bmQQhAgSFwoSVXNlcklkQWxyZWFkeVRha2Vu'
'EIUIEhcKEkFwcFZlcnNpb25PdXRkYXRlZBCGCBIYChNOZXdEZXZpY2VSZWdpc3RlcmVkEIcIEh'
'cKEkludmFsaWRQcm9vZk9mV29yaxCICBIZChRSZWdpc3RyYXRpb25EaXNhYmxlZBCJCBIWChFJ'
'UEFQYXltZW50RXhwaXJlZBCKCBIYChNVc2VySXNOb3RJbkZyZWVQbGFuEIsIEh8KGkZvcmVncm'
'91bmRTZXNzaW9uQ29ubmVjdGVkEIwIEhMKDk5vUmVjb3ZlcnlEYXRhEI0IEhgKE0ludmFsaWRS'
'ZWNvdmVyeURhdGEQjgg=');

View file

@ -1,13 +0,0 @@
//
// Generated code. Do not modify.
// source: api/websocket/error.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'error.pb.dart';

File diff suppressed because it is too large Load diff

View file

@ -1,11 +0,0 @@
// This is a generated file - do not edit.
//
// Generated from api/websocket/server_to_client.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports

View file

@ -1,13 +0,0 @@
//
// Generated code. Do not modify.
// source: api/websocket/server_to_client.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
export 'server_to_client.pb.dart';

View file

@ -1,6 +1,6 @@
// This is a generated file - do not edit. // This is a generated file - do not edit.
// //
// Generated from api/http/http_requests.proto. // Generated from http_requests.proto.
// @dart = 3.3 // @dart = 3.3

View file

@ -1,6 +1,6 @@
// This is a generated file - do not edit. // This is a generated file - do not edit.
// //
// Generated from api/http/http_requests.proto. // Generated from http_requests.proto.
// @dart = 3.3 // @dart = 3.3

View file

@ -1,6 +1,6 @@
// This is a generated file - do not edit. // This is a generated file - do not edit.
// //
// Generated from api/http/http_requests.proto. // Generated from http_requests.proto.
// @dart = 3.3 // @dart = 3.3

View file

@ -0,0 +1,70 @@
syntax = "proto3";
package http_requests;
message TextMessage {
int64 user_id = 1;
bytes body = 2;
optional bytes push_data = 3;
}
message UploadRequest {
bytes encrypted_data = 1;
repeated bytes download_tokens = 2;
repeated TextMessage messages_on_success = 3;
}
message SealedSenderMessageRequest {
reserved 4;
int64 recipient_user_id = 1;
bytes sealed_sender_message = 2;
bytes privacy_pass_token = 3;
}
message SealedSenderMessageResponse {
string message_id = 1;
}
// plaintext message send to the server
message UpdateGroupState {
message UpdateTBS {
uint64 version_id = 1;
bytes encrypted_group_state = 3;
bytes public_key = 4;
// public group key
optional bytes remove_admin = 5;
optional bytes add_admin = 6;
bytes nonce = 7;
}
UpdateTBS update = 1;
bytes signature = 2;
}
message NewGroupState {
string group_id = 1;
uint64 version_id = 2;
bytes encrypted_group_state = 3;
bytes public_key = 4;
}
message AppendGroupState {
message AppendTBS {
bytes encrypted_group_state_append = 1;
bytes public_key = 2;
string group_id = 3;
bytes nonce = 4;
}
bytes signature = 1;
AppendTBS appendTBS = 2;
uint64 versionId = 3;
}
message GroupState {
uint64 version_id = 1;
bytes encrypted_group_state = 2;
repeated AppendGroupState appended_group_states = 3;
}
// this is just a database helper to store multiple appends
message AppendGroupStateHelper {
repeated AppendGroupState appended_group_states = 1;
}

View file

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:clock/clock.dart'; import 'package:clock/clock.dart';
import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:connectivity_plus/connectivity_plus.dart';
@ -13,8 +14,8 @@ import 'package:twonly/locator.dart';
import 'package:twonly/src/database/tables/mediafiles.table.dart'; import 'package:twonly/src/database/tables/mediafiles.table.dart';
import 'package:twonly/src/database/tables/messages.table.dart'; import 'package:twonly/src/database/tables/messages.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/protobuf/api/http/http_requests.pb.dart';
import 'package:twonly/src/model/protobuf/client/generated/data.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/data.pb.dart';
import 'package:twonly/src/model/protobuf/client/generated/http_requests.pb.dart';
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart';
import 'package:twonly/src/services/api/mediafiles/media_background.api.dart'; import 'package:twonly/src/services/api/mediafiles/media_background.api.dart';
import 'package:twonly/src/services/api/messages.api.dart'; import 'package:twonly/src/services/api/messages.api.dart';

View file

@ -1,11 +1,9 @@
import 'dart:typed_data'; import 'package:twonly/src/model/error_code.dart';
import 'package:twonly/src/model/protobuf/api/websocket/error.pb.dart';
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart'
as server;
import 'package:twonly/src/services/api/utils.api.dart'; import 'package:twonly/src/services/api/utils.api.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
export 'package:twonly/src/model/error_code.dart';
Future<Result<T, ErrorCode>> rustApiResult<T>(Future<T> request) async { Future<Result<T, ErrorCode>> rustApiResult<T>(Future<T> request) async {
try { try {
return Result.success(await request); return Result.success(await request);
@ -18,33 +16,3 @@ Future<Result<T, ErrorCode>> rustApiResult<T>(Future<T> request) async {
return Result.error(ErrorCode.InternalError); return Result.error(ErrorCode.InternalError);
} }
} }
Future<T?> rustApiProtobuf<T>(
Future<Uint8List> request,
T Function(List<int>) decode,
) async {
try {
return decode(await request);
} catch (error) {
Log.error('Rust API call failed', error: error);
return null;
}
}
server.Response_UserData decodeUserData(List<int> bytes) =>
server.Response_UserData.fromBuffer(bytes);
server.Response_ProofOfWork decodeProofOfWork(List<int> bytes) =>
server.Response_ProofOfWork.fromBuffer(bytes);
server.Response_MemoriesUrl decodeMemoriesUrl(List<int> bytes) =>
server.Response_MemoriesUrl.fromBuffer(bytes);
server.Response_MemoriesUploadUrls decodeMemoriesUploadUrls(List<int> bytes) =>
server.Response_MemoriesUploadUrls.fromBuffer(bytes);
server.Response_MemoriesUsage decodeMemoriesUsage(List<int> bytes) =>
server.Response_MemoriesUsage.fromBuffer(bytes);
server.Response_PlanBallance decodePlanBalance(List<int> bytes) =>
server.Response_PlanBallance.fromBuffer(bytes);

View file

@ -6,8 +6,6 @@ import 'package:twonly/core/bridge/wrapper/key_manager.dart';
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/database/tables/mediafiles.table.dart'; import 'package:twonly/src/database/tables/mediafiles.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart'
as server;
import 'package:twonly/src/model/protobuf/client/generated/messages.pbserver.dart' import 'package:twonly/src/model/protobuf/client/generated/messages.pbserver.dart'
hide Message; hide Message;
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
@ -35,18 +33,6 @@ DateTime fromTimestamp(Int64 timeStamp) {
return date; return date;
} }
// ignore: strict_raw_type
Result asResult(server.ServerToClient? msg) {
if (msg == null) {
return Result.error(ErrorCode.InternalError);
}
if (msg.v0.response.hasOk()) {
return Result.success(msg.v0.response.ok);
} else {
return Result.error(msg.v0.response.error);
}
}
Future<void> handleMediaError(MediaFile media) async { Future<void> handleMediaError(MediaFile media) async {
await twonlyDB.mediaFilesDao.updateMedia( await twonlyDB.mediaFilesDao.updateMedia(
media.mediaId, media.mediaId,
@ -72,17 +58,17 @@ Future<void> handleMediaError(MediaFile media) async {
} }
Future<bool> importSignalContactAndCreateRequest( Future<bool> importSignalContactAndCreateRequest(
server.Response_UserData userdata, FrbUserData userdata,
) async { ) async {
try { try {
await RustApi.establishSignalSession( await RustApi.establishSignalSession(
contactId: userdata.userId.toInt(), contactId: userdata.userId,
expectedPublicKey: Uint8List.fromList(userdata.publicIdentityKey), expectedPublicKey: Uint8List.fromList(userdata.publicIdentityKey),
); );
// 2. Then send user request // 2. Then send user request
await RustApi.sendEncryptedContent( await RustApi.sendEncryptedContent(
contactId: userdata.userId.toInt(), contactId: userdata.userId,
content: EncryptedContent( content: EncryptedContent(
contactRequest: EncryptedContent_ContactRequest( contactRequest: EncryptedContent_ContactRequest(
type: EncryptedContent_ContactRequest_Type.REQUEST, type: EncryptedContent_ContactRequest_Type.REQUEST,

View file

@ -1,56 +0,0 @@
import 'dart:typed_data' show Uint8List;
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'
show Int64List;
import 'package:twonly/core/bridge/groups.dart' as rust_groups;
import 'package:twonly/src/database/twonly.db.dart';
Future<bool> createNewGroup(String groupName, List<Contact> members) =>
rust_groups.createNewGroup(
groupName: groupName,
memberIds: Int64List.fromList(
members.map((contact) => contact.userId).toList(),
),
);
Future<void> fetchGroupStatesForUnjoinedGroups() =>
rust_groups.fetchGroupStatesForUnjoinedGroups();
Future<void> fetchMissingGroupPublicKey() =>
rust_groups.fetchMissingGroupPublicKeys();
Future<bool> fetchGroupState(Group group) =>
rust_groups.fetchGroupState(groupId: group.groupId);
Future<bool> addNewHiddenContact(int contactId) =>
rust_groups.addHiddenContact(contactId: contactId);
Future<bool> manageAdminState(
Group group,
Uint8List key,
int contactId,
bool remove,
) => rust_groups.manageAdminState(
groupId: group.groupId,
groupPublicKey: key,
contactId: contactId,
remove: remove,
);
Future<bool> updateGroupName(Group group, String name) =>
rust_groups.updateGroupName(groupId: group.groupId, groupName: name);
Future<bool> updateChatDeletionTime(Group group, int milliseconds) =>
rust_groups.updateChatDeletionTime(
groupId: group.groupId,
deleteMessagesAfterMilliseconds: milliseconds,
);
Future<bool> addNewGroupMembers(Group group, List<int> ids) =>
rust_groups.addNewGroupMembers(
groupId: group.groupId,
memberIds: Int64List.fromList(ids),
);
Future<bool> removeMemberFromGroup(Group group, Uint8List key, int contactId) =>
rust_groups.removeMemberFromGroup(
groupId: group.groupId,
groupPublicKey: key,
contactId: contactId,
);
Future<bool> leaveGroup(Group group) =>
rust_groups.leaveGroup(groupId: group.groupId);
Future<bool> leaveAsNonAdminFromGroup(Group group) => leaveGroup(group);

View file

@ -12,8 +12,6 @@ import 'package:twonly/core/bridge/wrapper/key_manager.dart';
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/database/tables/mediafiles.table.dart'; import 'package:twonly/src/database/tables/mediafiles.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart'
as server;
import 'package:twonly/src/model/protobuf/client/generated/backup.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/backup.pb.dart';
import 'package:twonly/src/services/mediafiles/mediafile.service.dart'; import 'package:twonly/src/services/mediafiles/mediafile.service.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
@ -171,14 +169,17 @@ class MemoriesCloudService {
return true; return true;
} }
final urls = await rustApiProtobuf( String? downloadUrl;
RustApi.getMemoriesUrl(mediaId: mediaId, thumbnail: isThumbnail), try {
decodeMemoriesUrl, downloadUrl = await RustApi.getMemoriesUrl(
mediaId: mediaId,
thumbnail: isThumbnail,
); );
if (urls == null || !urls.hasFullDownloadUrl()) return false; } catch (_) {}
if (downloadUrl == null || downloadUrl.isEmpty) return false;
try { try {
final response = await http.get(Uri.parse(urls.fullDownloadUrl)); final response = await http.get(Uri.parse(downloadUrl));
if (response.statusCode == 200) { if (response.statusCode == 200) {
return await _decryptFile(response.bodyBytes, targetPath); return await _decryptFile(response.bodyBytes, targetPath);
@ -208,17 +209,18 @@ class MemoriesCloudService {
} }
final sizeBytes = ms.storedPath.lengthSync(); final sizeBytes = ms.storedPath.lengthSync();
final urls = await rustApiProtobuf( final FrbMemoriesUploadUrls? urls;
RustApi.requestMemoriesUpload( try {
urls = await RustApi.requestMemoriesUpload(
size: sizeBytes, size: sizeBytes,
originalDate: mediaFile.createdAt.millisecondsSinceEpoch, originalDate: mediaFile.createdAt.millisecondsSinceEpoch,
mediaId: mediaFile.mediaId, mediaId: mediaFile.mediaId,
),
decodeMemoriesUploadUrls,
); );
} catch (error) {
if (urls == null) { Log.error(
Log.error('Could not get upload URLs for memory ${mediaFile.mediaId}'); 'Could not get upload URLs for memory ${mediaFile.mediaId}',
error: error,
);
return false; return false;
} }
@ -238,7 +240,8 @@ class MemoriesCloudService {
final tempDir = await getTemporaryDirectory(); final tempDir = await getTemporaryDirectory();
// 1. Upload thumbnail if exists // 1. Upload thumbnail if exists
if (ms.thumbnailPath.existsSync() && urls.hasThumbnailUpload()) { final thumbUpload = urls.thumbnailUpload;
if (ms.thumbnailPath.existsSync() && thumbUpload != null) {
final thumbFile = await _encryptFile( final thumbFile = await _encryptFile(
ms.thumbnailPath, ms.thumbnailPath,
mediaKey, mediaKey,
@ -247,7 +250,7 @@ class MemoriesCloudService {
'thumb_${mediaFile.mediaId}', 'thumb_${mediaFile.mediaId}',
); );
try { try {
await _uploadToS3(urls.thumbnailUpload, thumbFile, (_) {}); await _uploadToS3(thumbUpload, thumbFile, (_) {});
} finally { } finally {
if (thumbFile.existsSync()) { if (thumbFile.existsSync()) {
thumbFile.deleteSync(); thumbFile.deleteSync();
@ -256,7 +259,8 @@ class MemoriesCloudService {
} }
// 2. Upload full media if exists // 2. Upload full media if exists
if (urls.hasFullUpload()) { final fullUpload = urls.fullUpload;
if (fullUpload != null) {
final fullFile = await _encryptFile( final fullFile = await _encryptFile(
ms.storedPath, ms.storedPath,
mediaKey, mediaKey,
@ -265,7 +269,7 @@ class MemoriesCloudService {
'full_${mediaFile.mediaId}', 'full_${mediaFile.mediaId}',
); );
try { try {
await _uploadToS3(urls.fullUpload, fullFile, onProgress); await _uploadToS3(fullUpload, fullFile, onProgress);
} finally { } finally {
if (fullFile.existsSync()) { if (fullFile.existsSync()) {
fullFile.deleteSync(); fullFile.deleteSync();
@ -304,7 +308,7 @@ class MemoriesCloudService {
} }
Future<void> _uploadToS3( Future<void> _uploadToS3(
server.Response_PresignedPost presignedPost, FrbPresignedPost presignedPost,
File file, File file,
void Function(double progress) onProgress, void Function(double progress) onProgress,
) async { ) async {
@ -318,7 +322,9 @@ class MemoriesCloudService {
}, },
); );
request.fields.addAll(presignedPost.fields); request.fields.addAll(
Map.fromEntries(presignedPost.fields.map((f) => MapEntry(f.$1, f.$2))),
);
request.files.add( request.files.add(
await http.MultipartFile.fromPath( await http.MultipartFile.fromPath(
'file', 'file',

View file

@ -16,8 +16,6 @@ import 'package:twonly/src/database/daos/contacts.dao.dart'
show getContactDisplayName; show getContactDisplayName;
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/json/onboarding_state.model.dart'; import 'package:twonly/src/model/json/onboarding_state.model.dart';
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart'
as server;
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart' import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart'
as pb; as pb;
import 'package:twonly/src/model/protobuf/client/generated/passwordless_recovery.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/passwordless_recovery.pb.dart';
@ -312,6 +310,7 @@ class PasswordlessRecoveryService {
} }
unawaited( unawaited(
// ignore: inference_failure_on_untyped_parameter
RustApi.performPasswordlessRecoveryHeartbeat().catchError((e) { RustApi.performPasswordlessRecoveryHeartbeat().catchError((e) {
Log.warn('Failed to perform passwordless recovery heartbeat: $e'); Log.warn('Failed to perform passwordless recovery heartbeat: $e');
}), }),
@ -377,16 +376,13 @@ class PasswordlessRecoveryService {
state.receivedShares.map((share) => share.messageId).toList(), state.receivedShares.map((share) => share.messageId).toList(),
); );
late final server.Response_PasswordlessNotificationMessages response; late final List<FrbPasswordlessNotificationMessage> messages;
try { try {
final responseBytes = await RustApi.checkForPasswordlessNotification( messages = await RustApi.checkForPasswordlessNotification(
notificationId: state.notificationId!, notificationId: state.notificationId!,
downloadAuthToken: state.downloadAuthToken!, downloadAuthToken: state.downloadAuthToken!,
alreadyReceivedMessageIds: alreadyReceivedIds, alreadyReceivedMessageIds: alreadyReceivedIds,
); );
response = server.Response_PasswordlessNotificationMessages.fromBuffer(
responseBytes,
);
} catch (error) { } catch (error) {
Log.error( Log.error(
'Failed to load passwordless recovery messages', 'Failed to load passwordless recovery messages',
@ -395,7 +391,7 @@ class PasswordlessRecoveryService {
return false; return false;
} }
if (response.messages.isEmpty) { if (messages.isEmpty) {
return false; return false;
} }
@ -403,8 +399,8 @@ class PasswordlessRecoveryService {
final secretKey = SecretKey(state.encryptionKey!); final secretKey = SecretKey(state.encryptionKey!);
var didUpdate = false; var didUpdate = false;
for (final msg in response.messages) { for (final msg in messages) {
final msgId = msg.id.toInt(); final msgId = msg.id;
try { try {
final envelope = EncryptedEnvelope.fromBuffer(msg.encryptedMessage); final envelope = EncryptedEnvelope.fromBuffer(msg.encryptedMessage);

View file

@ -17,11 +17,14 @@ class UserDiscoveryService {
.getNewAnnouncementsWithoutData(); .getNewAnnouncementsWithoutData();
for (final announcedUser in announcedUsers) { for (final announcedUser in announcedUsers) {
final userdata = await rustApiProtobuf( final FrbUserData? userdata;
RustApi.getUserById(userId: announcedUser.announcedUserId), try {
decodeUserData, userdata = await RustApi.getUserById(
userId: announcedUser.announcedUserId,
); );
if (userdata == null) continue; } catch (_) {
continue;
}
if (!userdata.publicIdentityKey.equals( if (!userdata.publicIdentityKey.equals(
announcedUser.announcedPublicKey.toList(), announcedUser.announcedPublicKey.toList(),
)) { )) {

View file

@ -14,7 +14,7 @@ import 'package:local_auth/local_auth.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:twonly/src/localization/generated/app_localizations.dart'; import 'package:twonly/src/localization/generated/app_localizations.dart';
import 'package:twonly/src/model/protobuf/api/websocket/error.pb.dart'; import 'package:twonly/src/model/error_code.dart';
import 'package:twonly/src/providers/settings.provider.dart'; import 'package:twonly/src/providers/settings.provider.dart';
import 'package:twonly/src/services/backup.service.dart'; import 'package:twonly/src/services/backup.service.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
@ -150,7 +150,6 @@ String getRandomString(int length) => String.fromCharCodes(
); );
String errorCodeToText(BuildContext context, ErrorCode code) { String errorCodeToText(BuildContext context, ErrorCode code) {
// ignore: exhaustive_cases
switch (code) { switch (code) {
case ErrorCode.InternalError: case ErrorCode.InternalError:
return context.lang.errorInternalError; return context.lang.errorInternalError;
@ -170,8 +169,10 @@ String errorCodeToText(BuildContext context, ErrorCode code) {
return context.lang.errorVoucherInvalid; return context.lang.errorVoucherInvalid;
case ErrorCode.PlanUpgradeNotYearly: case ErrorCode.PlanUpgradeNotYearly:
return context.lang.errorPlanUpgradeNotYearly; return context.lang.errorPlanUpgradeNotYearly;
} // ignore: no_default_cases
default:
return code.toString(); return code.toString();
}
} }
String formatDuration(BuildContext context, int seconds) { String formatDuration(BuildContext context, int seconds) {

View file

@ -4,11 +4,11 @@ import 'package:drift/drift.dart' show Value;
import 'package:fixnum/fixnum.dart'; import 'package:fixnum/fixnum.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:twonly/core/bridge/groups.dart' as rust_groups;
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/database/tables/groups.table.dart'; import 'package:twonly/src/database/tables/groups.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart';
import 'package:twonly/src/services/group.service.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/visual/elements/better_list_title.element.dart'; import 'package:twonly/src/visual/elements/better_list_title.element.dart';
import 'package:twonly/src/visual/views/groups/group.view.dart'; import 'package:twonly/src/visual/views/groups/group.view.dart';
@ -106,7 +106,10 @@ class _SelectChatDeletionTimeListTitleState
onlySendIfNoReceiptsAreOpen: false, onlySendIfNoReceiptsAreOpen: false,
); );
} else { } else {
if (!await updateChatDeletionTime(group!, selected)) { if (!await rust_groups.updateChatDeletionTime(
groupId: group!.groupId,
deleteMessagesAfterMilliseconds: selected,
)) {
if (mounted) { if (mounted) {
showNetworkIssue(context); showNetworkIssue(context);
} }

View file

@ -88,7 +88,10 @@ class _ChatAskAFriendEntryState extends State<ChatAskAFriendEntry> {
_username = contact.displayName ?? contact.username; _username = contact.displayName ?? contact.username;
} else { } else {
// Fetch from API // Fetch from API
final userdata = await rustApiProtobuf(RustApi.getUserById(userId: userId), decodeUserData); FrbUserData? userdata;
try {
userdata = await RustApi.getUserById(userId: userId);
} catch (_) {}
if (userdata != null) { if (userdata != null) {
_username = utf8.decode(userdata.username); _username = utf8.decode(userdata.username);
} }
@ -122,12 +125,15 @@ class _ChatAskAFriendEntryState extends State<ChatAskAFriendEntry> {
}); });
try { try {
final userId = _data!.askAboutUserId.toInt(); final userId = _data!.askAboutUserId.toInt();
final userdata = await rustApiProtobuf(RustApi.getUserById(userId: userId), decodeUserData); FrbUserData? userdata;
try {
userdata = await RustApi.getUserById(userId: userId);
} catch (_) {}
if (userdata != null) { if (userdata != null) {
await twonlyDB.contactsDao.insertOnConflictUpdate( await twonlyDB.contactsDao.insertOnConflictUpdate(
ContactsCompanion( ContactsCompanion(
username: Value(utf8.decode(userdata.username)), username: Value(utf8.decode(userdata.username)),
userId: Value(userdata.userId.toInt()), userId: Value(userdata.userId),
requested: const Value(false), requested: const Value(false),
blocked: const Value(false), blocked: const Value(false),
deletedByUser: const Value(false), deletedByUser: const Value(false),

View file

@ -117,11 +117,9 @@ class _ContactRowState extends State<_ContactRow> {
}); });
try { try {
final userdata = await rustApiProtobuf( final userdata = await RustApi.getUserById(
RustApi.getUserById(userId: widget.contact.userId.toInt()), userId: widget.contact.userId.toInt(),
decodeUserData,
); );
if (userdata == null) return;
final username = utf8.decode(userdata.username); final username = utf8.decode(userdata.username);
@ -140,7 +138,7 @@ class _ContactRowState extends State<_ContactRow> {
final added = await twonlyDB.contactsDao.insertOnConflictUpdate( final added = await twonlyDB.contactsDao.insertOnConflictUpdate(
ContactsCompanion( ContactsCompanion(
username: Value(username), username: Value(username),
userId: Value(userdata.userId.toInt()), userId: Value(userdata.userId),
requested: const Value(false), requested: const Value(false),
blocked: const Value(false), blocked: const Value(false),
deletedByUser: const Value(false), deletedByUser: const Value(false),
@ -150,7 +148,7 @@ class _ContactRowState extends State<_ContactRow> {
if (added > 0) await importSignalContactAndCreateRequest(userdata); if (added > 0) await importSignalContactAndCreateRequest(userdata);
await KeyVerificationService.verifySharedContact( await KeyVerificationService.verifySharedContact(
contactId: userdata.userId.toInt(), contactId: userdata.userId,
sharedPublicIdentityKey: widget.contact.publicIdentityKey, sharedPublicIdentityKey: widget.contact.publicIdentityKey,
senderId: widget.message.senderId!, senderId: widget.message.senderId!,
); );

View file

@ -6,8 +6,6 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart'
as server;
import 'package:twonly/src/model/protobuf/client/generated/qr.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/qr.pb.dart';
import 'package:twonly/src/services/api/utils.api.dart'; import 'package:twonly/src/services/api/utils.api.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
@ -39,14 +37,10 @@ class _AddContactViaQrLinkViewState extends State<AddContactViaQrLinkView> {
}); });
try { try {
final userData = server.Response_UserData( final userData = FrbUserData(
userId: widget.profile.userId, userId: widget.profile.userId.toInt(),
publicIdentityKey: widget.profile.publicIdentityKey, publicIdentityKey: Uint8List.fromList(widget.profile.publicIdentityKey),
signedPrekey: widget.profile.signedPrekey, username: Uint8List.fromList(utf8.encode(widget.profile.username)),
signedPrekeySignature: widget.profile.signedPrekeySignature,
signedPrekeyId: widget.profile.signedPrekeyId,
username: utf8.encode(widget.profile.username),
registrationId: widget.profile.registrationId,
); );
final added = await twonlyDB.contactsDao.insertOnConflictUpdate( final added = await twonlyDB.contactsDao.insertOnConflictUpdate(

View file

@ -117,10 +117,12 @@ class _SearchUsernameView extends State<AddNewUserView> {
_isLoading = true; _isLoading = true;
}); });
final userdata = await rustApiProtobuf( FrbUserData? userdata;
RustApi.getUserData(username: username), try {
decodeUserData, userdata = await RustApi.getUserData(username: username);
); } catch (_) {
userdata = null;
}
if (!mounted) return; if (!mounted) return;
setState(() { setState(() {
@ -149,7 +151,7 @@ class _SearchUsernameView extends State<AddNewUserView> {
final added = await twonlyDB.contactsDao.insertOnConflictUpdate( final added = await twonlyDB.contactsDao.insertOnConflictUpdate(
ContactsCompanion( ContactsCompanion(
username: Value(username), username: Value(username),
userId: Value(userdata.userId.toInt()), userId: Value(userdata.userId),
requested: const Value(false), requested: const Value(false),
blocked: const Value(false), blocked: const Value(false),
deletedByUser: const Value(false), deletedByUser: const Value(false),
@ -167,7 +169,7 @@ class _SearchUsernameView extends State<AddNewUserView> {
); );
if (markAsVerified) { if (markAsVerified) {
await twonlyDB.keyVerificationDao.addKeyVerification( await twonlyDB.keyVerificationDao.addKeyVerification(
userdata.userId.toInt(), userdata.userId,
VerificationType.link, VerificationType.link,
); );
} }

View file

@ -46,7 +46,14 @@ class FriendSuggestionsComp extends StatelessWidget {
) async { ) async {
Log.info('Requesting user via friend suggestions'); Log.info('Requesting user via friend suggestions');
final userdata = await rustApiProtobuf(RustApi.getUserById(userId: user.announcedUserId), decodeUserData); FrbUserData? userdata;
try {
userdata = await RustApi.getUserById(
userId: user.announcedUserId,
);
} catch (_) {
userdata = null;
}
if (userdata == null) { if (userdata == null) {
if (context.mounted) { if (context.mounted) {
@ -58,7 +65,7 @@ class FriendSuggestionsComp extends StatelessWidget {
final added = await twonlyDB.contactsDao.insertOnConflictUpdate( final added = await twonlyDB.contactsDao.insertOnConflictUpdate(
ContactsCompanion( ContactsCompanion(
username: Value(user.username!), username: Value(user.username!),
userId: Value(userdata.userId.toInt()), userId: Value(userdata.userId),
requested: const Value(false), requested: const Value(false),
blocked: const Value(false), blocked: const Value(false),
deletedByUser: const Value(false), deletedByUser: const Value(false),

View file

@ -1,12 +1,14 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'
show Int64List;
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:twonly/core/bridge/groups.dart' as rust_groups;
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/database/daos/contacts.dao.dart'; import 'package:twonly/src/database/daos/contacts.dao.dart';
import 'package:twonly/src/database/tables/groups.table.dart'; import 'package:twonly/src/database/tables/groups.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/services/group.service.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/visual/components/alert.dialog.dart'; import 'package:twonly/src/visual/components/alert.dialog.dart';
import 'package:twonly/src/visual/components/avatar_icon.comp.dart'; import 'package:twonly/src/visual/components/avatar_icon.comp.dart';
@ -78,7 +80,10 @@ class _GroupViewState extends State<GroupView> {
newGroupName != null && newGroupName != null &&
newGroupName != '' && newGroupName != '' &&
newGroupName != _group!.groupName) { newGroupName != _group!.groupName) {
if (!await updateGroupName(_group!, newGroupName)) { if (!await rust_groups.updateGroupName(
groupId: _group!.groupId,
groupName: newGroupName,
)) {
if (mounted) { if (mounted) {
showNetworkIssue(context); showNetworkIssue(context);
} }
@ -98,7 +103,10 @@ class _GroupViewState extends State<GroupView> {
) )
as List<int>?; as List<int>?;
if (selectedUserIds == null) return; if (selectedUserIds == null) return;
if (!await addNewGroupMembers(_group!, selectedUserIds)) { if (!await rust_groups.addNewGroupMembers(
groupId: _group!.groupId,
memberIds: Int64List.fromList(selectedUserIds),
)) {
if (mounted) { if (mounted) {
showNetworkIssue(context); showNetworkIssue(context);
} }
@ -134,7 +142,7 @@ class _GroupViewState extends State<GroupView> {
} }
} }
final success = await leaveGroup(_group!); final success = await rust_groups.leaveGroup(groupId: _group!.groupId);
if (!success) { if (!success) {
if (mounted) { if (mounted) {

View file

@ -1,8 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'
show Int64List;
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:twonly/core/bridge/groups.dart' as rust_groups;
import 'package:twonly/src/database/daos/contacts.dao.dart'; import 'package:twonly/src/database/daos/contacts.dao.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/services/group.service.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/visual/components/avatar_icon.comp.dart'; import 'package:twonly/src/visual/components/avatar_icon.comp.dart';
import 'package:twonly/src/visual/components/contact_labels.comp.dart'; import 'package:twonly/src/visual/components/contact_labels.comp.dart';
@ -36,9 +38,11 @@ class _GroupCreateSelectGroupNameViewState
_isLoading = true; _isLoading = true;
}); });
final wasSuccess = await createNewGroup( final wasSuccess = await rust_groups.createNewGroup(
textFieldGroupName.text, groupName: textFieldGroupName.text,
widget.selectedUsers, memberIds: Int64List.fromList(
widget.selectedUsers.map((contact) => contact.userId).toList(),
),
); );
if (wasSuccess) { if (wasSuccess) {
// POP // POP

View file

@ -2,13 +2,13 @@ import 'package:drift/drift.dart' show Value;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:twonly/core/bridge/groups.dart' as rust_groups;
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/constants/routes.keys.dart'; import 'package:twonly/src/constants/routes.keys.dart';
import 'package:twonly/src/database/daos/contacts.dao.dart'; import 'package:twonly/src/database/daos/contacts.dao.dart';
import 'package:twonly/src/database/tables/groups.table.dart'; import 'package:twonly/src/database/tables/groups.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart';
import 'package:twonly/src/services/group.service.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/visual/components/alert.dialog.dart'; import 'package:twonly/src/visual/components/alert.dialog.dart';
import 'package:twonly/src/visual/components/snackbar.dart'; import 'package:twonly/src/visual/components/snackbar.dart';
@ -36,11 +36,11 @@ class GroupMemberContextMenu extends StatelessWidget {
customOk: context.lang.makeAdminRightsOkBtn, customOk: context.lang.makeAdminRightsOkBtn,
); );
if (ok) { if (ok) {
if (!await manageAdminState( if (!await rust_groups.manageAdminState(
group, groupId: group.groupId,
member.groupPublicKey!, groupPublicKey: member.groupPublicKey!,
contact.userId, contactId: contact.userId,
false, remove: false,
)) { )) {
if (context.mounted) { if (context.mounted) {
showNetworkIssue(context); showNetworkIssue(context);
@ -57,11 +57,11 @@ class GroupMemberContextMenu extends StatelessWidget {
customOk: context.lang.revokeAdminRightsOkBtn, customOk: context.lang.revokeAdminRightsOkBtn,
); );
if (ok) { if (ok) {
if (!await manageAdminState( if (!await rust_groups.manageAdminState(
group, groupId: group.groupId,
member.groupPublicKey!, groupPublicKey: member.groupPublicKey!,
contact.userId, contactId: contact.userId,
true, remove: true,
)) { )) {
if (context.mounted) { if (context.mounted) {
showNetworkIssue(context); showNetworkIssue(context);
@ -77,10 +77,10 @@ class GroupMemberContextMenu extends StatelessWidget {
'', '',
); );
if (ok) { if (ok) {
if (!await removeMemberFromGroup( if (!await rust_groups.removeMemberFromGroup(
group, groupId: group.groupId,
member.groupPublicKey!, groupPublicKey: member.groupPublicKey!,
contact.userId, contactId: contact.userId,
)) { )) {
if (context.mounted) { if (context.mounted) {
showNetworkIssue(context); showNetworkIssue(context);

View file

@ -46,7 +46,10 @@ class MemoriesViewState extends State<MemoriesView>
} }
Future<void> _checkUsage() async { Future<void> _checkUsage() async {
final usage = await rustApiProtobuf(RustApi.getMemoriesUsage(), decodeMemoriesUsage); FrbMemoriesUsage? usage;
try {
usage = await RustApi.getMemoriesUsage();
} catch (_) {}
if (usage != null && if (usage != null &&
usage.maxBytes > 0 && usage.maxBytes > 0 &&
usage.currentBytes >= usage.maxBytes) { usage.currentBytes >= usage.maxBytes) {

View file

@ -78,9 +78,7 @@ class _RegisterViewState extends State<RegisterView> {
proof = await proofOfWork!; proof = await proofOfWork!;
} else { } else {
final proofResult = await rustApiResult(RustApi.getProofOfWork()); final proofResult = await rustApiResult(RustApi.getProofOfWork());
final pow = proofResult.value == null final pow = proofResult.value;
? null
: decodeProofOfWork(proofResult.value!);
final registrationDisabled = final registrationDisabled =
proofResult.error == ErrorCode.RegistrationDisabled; proofResult.error == ErrorCode.RegistrationDisabled;
if (pow == null) { if (pow == null) {
@ -93,7 +91,7 @@ class _RegisterViewState extends State<RegisterView> {
} }
return; return;
} }
proof = await calculatePoW(pow.prefix, pow.difficulty.toInt()); proof = await calculatePoW(pow.prefix, pow.difficulty);
} }
Log.info('The result of the POW is $proof'); Log.info('The result of the POW is $proof');

View file

@ -7,8 +7,6 @@ import 'package:provider/provider.dart';
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/constants/routes.keys.dart'; import 'package:twonly/src/constants/routes.keys.dart';
import 'package:twonly/src/model/json/backup.model.dart'; import 'package:twonly/src/model/json/backup.model.dart';
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart'
as server;
import 'package:twonly/src/providers/purchases.provider.dart'; import 'package:twonly/src/providers/purchases.provider.dart';
import 'package:twonly/src/services/backup.service.dart'; import 'package:twonly/src/services/backup.service.dart';
import 'package:twonly/src/services/memories/memories_cloud.service.dart'; import 'package:twonly/src/services/memories/memories_cloud.service.dart';
@ -33,7 +31,7 @@ class BackupView extends StatefulWidget {
class _BackupViewState extends State<BackupView> { class _BackupViewState extends State<BackupView> {
bool _isLoading = false; bool _isLoading = false;
CurrentBackupStatus? _backupStatus; CurrentBackupStatus? _backupStatus;
server.Response_MemoriesUsage? _memoriesUsage; FrbMemoriesUsage? _memoriesUsage;
StreamSubscription<void>? _backupUpdateSub; StreamSubscription<void>? _backupUpdateSub;
@override @override
@ -54,7 +52,10 @@ class _BackupViewState extends State<BackupView> {
Future<void> _loadBackupStatus() async { Future<void> _loadBackupStatus() async {
setState(() => _isLoading = true); setState(() => _isLoading = true);
final status = await BackupService.getData(); final status = await BackupService.getData();
final memoriesUsage = await rustApiProtobuf(RustApi.getMemoriesUsage(), decodeMemoriesUsage); FrbMemoriesUsage? memoriesUsage;
try {
memoriesUsage = await RustApi.getMemoriesUsage();
} catch (_) {}
if (!mounted) return; if (!mounted) return;
setState(() { setState(() {
_backupStatus = status; _backupStatus = status;
@ -197,7 +198,7 @@ class _BackupViewState extends State<BackupView> {
: (!userService.currentUser.isCloudBackupEnabled : (!userService.currentUser.isCloudBackupEnabled
? context.lang.backupMemoriesNotEnabled ? context.lang.backupMemoriesNotEnabled
: (_memoriesUsage != null : (_memoriesUsage != null
? '${formatBytes(_memoriesUsage!.currentBytes.toInt())} / ${formatBytes(_memoriesUsage!.maxBytes.toInt())}' ? '${formatBytes(_memoriesUsage!.currentBytes)} / ${formatBytes(_memoriesUsage!.maxBytes)}'
: '-')), : '-')),
), ),
trailing: isFreePlan trailing: isFreePlan

View file

@ -1,8 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart'
as server;
import 'package:twonly/src/services/memories/memories_cloud.service.dart'; import 'package:twonly/src/services/memories/memories_cloud.service.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/visual/components/snackbar.dart'; import 'package:twonly/src/visual/components/snackbar.dart';
@ -19,7 +17,7 @@ class MemoriesBackupDetailView extends StatefulWidget {
} }
class _MemoriesBackupDetailViewState extends State<MemoriesBackupDetailView> { class _MemoriesBackupDetailViewState extends State<MemoriesBackupDetailView> {
server.Response_MemoriesUsage? _memoriesUsage; FrbMemoriesUsage? _memoriesUsage;
bool _isLoading = true; bool _isLoading = true;
@override @override
@ -29,7 +27,10 @@ class _MemoriesBackupDetailViewState extends State<MemoriesBackupDetailView> {
} }
Future<void> _loadStats() async { Future<void> _loadStats() async {
final memoriesUsage = await rustApiProtobuf(RustApi.getMemoriesUsage(), decodeMemoriesUsage); FrbMemoriesUsage? memoriesUsage;
try {
memoriesUsage = await RustApi.getMemoriesUsage();
} catch (_) {}
if (mounted) { if (mounted) {
setState(() { setState(() {
_memoriesUsage = memoriesUsage; _memoriesUsage = memoriesUsage;
@ -58,7 +59,7 @@ class _MemoriesBackupDetailViewState extends State<MemoriesBackupDetailView> {
children: [ children: [
Text( Text(
_memoriesUsage != null _memoriesUsage != null
? '${formatBytes(_memoriesUsage!.currentBytes.toInt())} / ${formatBytes(_memoriesUsage!.maxBytes.toInt())}' ? '${formatBytes(_memoriesUsage!.currentBytes)} / ${formatBytes(_memoriesUsage!.maxBytes)}'
: '-', : '-',
style: Theme.of(context).textTheme.headlineMedium?.copyWith( style: Theme.of(context).textTheme.headlineMedium?.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,

View file

@ -10,7 +10,7 @@ import 'package:http/http.dart' as http;
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/constants/routes.keys.dart'; import 'package:twonly/src/constants/routes.keys.dart';
import 'package:twonly/src/model/protobuf/api/http/http_requests.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/http_requests.pb.dart';
import 'package:twonly/src/services/api/utils.api.dart'; import 'package:twonly/src/services/api/utils.api.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';

View file

@ -5,7 +5,6 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/database/daos/contacts.dao.dart'; import 'package:twonly/src/database/daos/contacts.dao.dart';
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart';
import 'package:twonly/src/providers/purchases.provider.dart'; import 'package:twonly/src/providers/purchases.provider.dart';
import 'package:twonly/src/services/subscription.service.dart'; import 'package:twonly/src/services/subscription.service.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
@ -17,14 +16,14 @@ import 'package:twonly/src/visual/views/settings/subscription/select_additional_
class AdditionalUsersView extends StatefulWidget { class AdditionalUsersView extends StatefulWidget {
const AdditionalUsersView({required this.ballance, super.key}); const AdditionalUsersView({required this.ballance, super.key});
final Response_PlanBallance? ballance; final FrbPlanBalance? ballance;
@override @override
State<AdditionalUsersView> createState() => _AdditionalUsersViewState(); State<AdditionalUsersView> createState() => _AdditionalUsersViewState();
} }
class _AdditionalUsersViewState extends State<AdditionalUsersView> { class _AdditionalUsersViewState extends State<AdditionalUsersView> {
Response_PlanBallance? ballance; FrbPlanBalance? ballance;
late int _unusedAdditionalAccounts; late int _unusedAdditionalAccounts;
int _planLimit = 0; int _planLimit = 0;
@ -48,10 +47,11 @@ class _AdditionalUsersViewState extends State<AdditionalUsersView> {
Future<void> initAsync({required bool force}) async { Future<void> initAsync({required bool force}) async {
if (force) { if (force) {
ballance = await rustApiProtobuf( try {
RustApi.loadPlanBalance(), ballance = await RustApi.loadPlanBalance();
decodePlanBalance, } catch (_) {
); ballance = null;
}
_unusedAdditionalAccounts = _unusedAdditionalAccounts =
_planLimit - (ballance?.additionalAccounts.length ?? _planLimit); _planLimit - (ballance?.additionalAccounts.length ?? _planLimit);
} }
@ -65,7 +65,7 @@ class _AdditionalUsersViewState extends State<AdditionalUsersView> {
limit: _planLimit, limit: _planLimit,
alreadySelected: alreadySelected:
ballance?.additionalAccounts ballance?.additionalAccounts
.map((e) => e.userId.toInt()) .map((e) => e.userId)
.toList() ?? .toList() ??
[], [],
), ),
@ -162,7 +162,7 @@ class AdditionalAccount extends StatefulWidget {
}); });
final void Function() refresh; final void Function() refresh;
final Response_AdditionalAccount account; final FrbAdditionalAccount account;
@override @override
State<AdditionalAccount> createState() => _AdditionalAccountState(); State<AdditionalAccount> createState() => _AdditionalAccountState();
} }
@ -179,7 +179,7 @@ class _AdditionalAccountState extends State<AdditionalAccount> {
Future<void> initAsync() async { Future<void> initAsync() async {
final contact = await twonlyDB.contactsDao final contact = await twonlyDB.contactsDao
.getContactByUserId(widget.account.userId.toInt()) .getContactByUserId(widget.account.userId)
.getSingleOrNull(); .getSingleOrNull();
if (contact != null) { if (contact != null) {
username = getContactDisplayName(contact); username = getContactDisplayName(contact);
@ -225,7 +225,7 @@ class _AdditionalAccountState extends State<AdditionalAccount> {
if (remove) { if (remove) {
final res = await rustApiResult( final res = await rustApiResult(
RustApi.removeAdditionalUser( RustApi.removeAdditionalUser(
userId: widget.account.userId.toInt(), userId: widget.account.userId,
), ),
); );
if (!context.mounted) return; if (!context.mounted) return;

View file

@ -6,7 +6,6 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
import 'package:twonly/src/database/daos/contacts.dao.dart'; import 'package:twonly/src/database/daos/contacts.dao.dart';
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart';
import 'package:twonly/src/model/purchasable_product.model.dart'; import 'package:twonly/src/model/purchasable_product.model.dart';
import 'package:twonly/src/providers/purchases.provider.dart'; import 'package:twonly/src/providers/purchases.provider.dart';
import 'package:twonly/src/services/subscription.service.dart'; import 'package:twonly/src/services/subscription.service.dart';
@ -26,7 +25,7 @@ class SubscriptionView extends StatefulWidget {
class _SubscriptionViewState extends State<SubscriptionView> { class _SubscriptionViewState extends State<SubscriptionView> {
bool loaded = false; bool loaded = false;
bool testerRequested = true; bool testerRequested = true;
Response_PlanBallance? ballance; FrbPlanBalance? ballance;
String? additionalOwnerName; String? additionalOwnerName;
@override @override
@ -36,12 +35,13 @@ class _SubscriptionViewState extends State<SubscriptionView> {
} }
Future<void> initAsync() async { Future<void> initAsync() async {
ballance = await rustApiProtobuf( try {
RustApi.loadPlanBalance(), ballance = await RustApi.loadPlanBalance();
decodePlanBalance, } catch (_) {
); ballance = null;
if (ballance != null && ballance!.hasAdditionalAccountOwnerId()) { }
final ownerId = ballance!.additionalAccountOwnerId.toInt(); if (ballance != null && ballance!.additionalAccountOwnerId != null) {
final ownerId = ballance!.additionalAccountOwnerId!;
final contact = await twonlyDB.contactsDao final contact = await twonlyDB.contactsDao
.getContactByUserId(ownerId) .getContactByUserId(ownerId)
.getSingleOrNull(); .getSingleOrNull();

View file

@ -140,3 +140,10 @@ pub(crate) fn decode_ok_value<T>(
ServerResult::ErrorCode(code) => Ok(ServerResult::ErrorCode(code)), ServerResult::ErrorCode(code) => Ok(ServerResult::ErrorCode(code)),
} }
} }
pub(crate) fn decode_empty_ok(bytes: Vec<u8>) -> Result<ServerResult<()>> {
decode_ok_value(bytes, |value| match value {
server_to_client::response::ok::Ok::None(_) => Some(()),
_ => None,
})
}

View file

@ -4,8 +4,8 @@
*/ */
use super::Server; use super::Server;
use crate::api::proto::client_to_server;
use crate::api::proto::server_to_client::response::ok::Ok as ResponseOk; use crate::api::proto::server_to_client::response::ok::Ok as ResponseOk;
use crate::api::proto::{client_to_server, server_to_client};
use crate::api::runtime::helpers::decode_ok_value; use crate::api::runtime::helpers::decode_ok_value;
use crate::api::server::server_ok; use crate::api::server::server_ok;
use crate::bridge::api::ServerResult; use crate::bridge::api::ServerResult;
@ -24,6 +24,16 @@ impl Server {
.await .await
} }
pub async fn get_plan_balance_model(
ctx: &Arc<Context>,
) -> Result<ServerResult<server_to_client::response::PlanBallance>> {
let bytes = Self::get_plan_balance(ctx).await?;
decode_ok_value(bytes, |value| match value {
server_to_client::response::ok::Ok::Planballance(balance) => Some(balance),
_ => None,
})
}
pub async fn load_plan_balance(ctx: &Arc<Context>) -> Result<Vec<u8>> { pub async fn load_plan_balance(ctx: &Arc<Context>) -> Result<Vec<u8>> {
Self::get_plan_balance(ctx).await Self::get_plan_balance(ctx).await
} }

View file

@ -3,12 +3,10 @@
* *
*/ */
use crate::api::messages::incoming::messages;
use crate::api::ApiRuntime; use crate::api::ApiRuntime;
pub use crate::api::PqcPreKeyInput; pub use crate::api::PqcPreKeyInput;
use crate::api::Server; use crate::api::Server;
use crate::api::messages::incoming::messages;
use crate::api::proto::server_to_client::response::ok::Ok as ResponseOk;
use crate::api::runtime::helpers::decode_ok_value;
use crate::context::Context; use crate::context::Context;
use crate::error::{Result, TwonlyError}; use crate::error::{Result, TwonlyError};
use crate::frb_generated::StreamSink; use crate::frb_generated::StreamSink;
@ -16,7 +14,6 @@ use crate::services::contacts::ContactService;
use crate::services::messages::MessageService; use crate::services::messages::MessageService;
use crate::user_config::UserConfig; use crate::user_config::UserConfig;
use flutter_rust_bridge::frb; use flutter_rust_bridge::frb;
use prost::Message;
#[frb(ignore)] #[frb(ignore)]
pub enum ServerResult<T> { pub enum ServerResult<T> {
@ -32,17 +29,7 @@ fn api_result<T>(result: ServerResult<T>) -> Result<T> {
} }
fn empty_api_response(bytes: Vec<u8>) -> Result<()> { fn empty_api_response(bytes: Vec<u8>) -> Result<()> {
api_result(decode_ok_value(bytes, |value| match value { crate::api::runtime::helpers::decode_empty_ok(bytes).and_then(api_result)
ResponseOk::None(_) => Some(()),
_ => None,
})?)
}
fn encoded_api_response<T: Message>(
bytes: Vec<u8>,
extract: impl FnOnce(ResponseOk) -> Option<T>,
) -> Result<Vec<u8>> {
api_result(decode_ok_value(bytes, extract)?).map(|value| value.encode_to_vec())
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -102,6 +89,62 @@ pub enum ApiEventKind {
LoginTokenMigrated, LoginTokenMigrated,
} }
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FrbPasswordlessNotificationMessage {
pub id: i64,
pub encrypted_message: Vec<u8>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FrbUserData {
pub user_id: i64,
pub username: Vec<u8>,
pub public_identity_key: Vec<u8>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FrbProofOfWork {
pub prefix: String,
pub difficulty: i64,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FrbMemoriesUsage {
pub current_bytes: i64,
pub count: i64,
pub max_bytes: i64,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FrbAdditionalAccount {
pub user_id: i64,
pub plan_id: String,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FrbPlanBalance {
pub used_daily_media_upload_limit: i64,
pub used_upload_media_size_limit: i64,
pub payment_period_days: Option<i64>,
pub last_payment_done_unix_timestamp: Option<i64>,
pub additional_accounts: Vec<FrbAdditionalAccount>,
pub auto_renewal: Option<bool>,
pub additional_account_owner_id: Option<i64>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FrbPresignedPost {
pub url: String,
pub fields: Vec<(String, String)>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FrbMemoriesUploadUrls {
pub media_id: String,
pub thumbnail_upload: Option<FrbPresignedPost>,
pub full_upload: Option<FrbPresignedPost>,
}
/// Flutter-facing facade for the Rust-owned API runtime. /// Flutter-facing facade for the Rust-owned API runtime.
pub struct RustApi {} pub struct RustApi {}
@ -188,12 +231,16 @@ impl RustApi {
.and_then(api_result) .and_then(api_result)
} }
pub async fn get_user_by_id(user_id: i64) -> Result<Vec<u8>> { pub async fn get_user_by_id(user_id: i64) -> Result<FrbUserData> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
Server::get_user_by_id(ctx, user_id) let res = Server::get_user_by_id(ctx, user_id)
.await .await
.and_then(api_result) .and_then(api_result)?;
.map(|value| value.encode_to_vec()) Ok(FrbUserData {
user_id: res.user_id,
username: res.username.unwrap_or_default(),
public_identity_key: res.public_identity_key.unwrap_or_default(),
})
} }
pub async fn check_for_deleted_usernames() -> Result<()> { pub async fn check_for_deleted_usernames() -> Result<()> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
@ -205,19 +252,24 @@ impl RustApi {
.await .await
.and_then(api_result) .and_then(api_result)
} }
pub async fn get_user_data(username: String) -> Result<Vec<u8>> { pub async fn get_user_data(username: String) -> Result<FrbUserData> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
Server::get_user_by_username(ctx, username) let res = Server::get_user_by_username(ctx, username)
.await .await
.and_then(api_result) .and_then(api_result)?;
.map(|value| value.encode_to_vec()) Ok(FrbUserData {
user_id: res.user_id,
username: res.username.unwrap_or_default(),
public_identity_key: res.public_identity_key.unwrap_or_default(),
})
} }
pub async fn get_proof_of_work() -> Result<Vec<u8>> { pub async fn get_proof_of_work() -> Result<FrbProofOfWork> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
Server::get_proof_of_work(ctx) let res = Server::get_proof_of_work(ctx).await.and_then(api_result)?;
.await Ok(FrbProofOfWork {
.and_then(api_result) prefix: res.prefix,
.map(|value| value.encode_to_vec()) difficulty: res.difficulty,
})
} }
pub async fn download_done(token: Vec<u8>) -> Result<()> { pub async fn download_done(token: Vec<u8>) -> Result<()> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
@ -250,30 +302,43 @@ impl RustApi {
.await .await
.and_then(api_result) .and_then(api_result)
} }
pub async fn request_memories_upload( pub async fn request_memories_upload(
size: i64, size: i64,
original_date: i64, original_date: i64,
media_id: String, media_id: String,
) -> Result<Vec<u8>> { ) -> Result<FrbMemoriesUploadUrls> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
Server::request_memories_upload(ctx, size, original_date, media_id) let res = Server::request_memories_upload(ctx, size, original_date, media_id)
.await .await
.and_then(api_result) .and_then(api_result)?;
.map(|value| value.encode_to_vec()) Ok(FrbMemoriesUploadUrls {
media_id: res.media_id,
thumbnail_upload: res.thumbnail_upload.map(|p| FrbPresignedPost {
url: p.url,
fields: p.fields.into_iter().collect(),
}),
full_upload: res.full_upload.map(|p| FrbPresignedPost {
url: p.url,
fields: p.fields.into_iter().collect(),
}),
})
} }
pub async fn get_memories_usage() -> Result<Vec<u8>> { pub async fn get_memories_usage() -> Result<FrbMemoriesUsage> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
Server::get_memories_usage(ctx) let res = Server::get_memories_usage(ctx).await.and_then(api_result)?;
.await Ok(FrbMemoriesUsage {
.and_then(api_result) current_bytes: res.current_bytes,
.map(|value| value.encode_to_vec()) count: res.count,
max_bytes: res.max_bytes,
})
} }
pub async fn get_memories_url(media_id: String, thumbnail: bool) -> Result<Vec<u8>> { pub async fn get_memories_url(media_id: String, thumbnail: bool) -> Result<String> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
Server::get_memories_url(ctx, media_id, thumbnail) let res = Server::get_memories_url(ctx, media_id, thumbnail)
.await .await
.and_then(api_result) .and_then(api_result)?;
.map(|value| value.encode_to_vec()) Ok(res.full_download_url)
} }
pub async fn confirm_memories_upload(media_id: String) -> Result<()> { pub async fn confirm_memories_upload(media_id: String) -> Result<()> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
@ -293,19 +358,30 @@ impl RustApi {
.await .await
.and_then(api_result) .and_then(api_result)
} }
pub async fn get_plan_balance() -> Result<Vec<u8>> { pub async fn get_plan_balance() -> Result<FrbPlanBalance> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
encoded_api_response(Server::get_plan_balance(ctx).await?, |value| match value { let res = Server::get_plan_balance_model(ctx)
ResponseOk::Planballance(balance) => Some(balance), .await
_ => None, .and_then(api_result)?;
Ok(FrbPlanBalance {
used_daily_media_upload_limit: res.used_daily_media_upload_limit,
used_upload_media_size_limit: res.used_upload_media_size_limit,
payment_period_days: res.payment_period_days,
last_payment_done_unix_timestamp: res.last_payment_done_unix_timestamp,
additional_accounts: res
.additional_accounts
.into_iter()
.map(|a| FrbAdditionalAccount {
user_id: a.user_id,
plan_id: a.plan_id,
})
.collect(),
auto_renewal: res.auto_renewal,
additional_account_owner_id: res.additional_account_owner_id,
}) })
} }
pub async fn load_plan_balance() -> Result<Vec<u8>> { pub async fn load_plan_balance() -> Result<FrbPlanBalance> {
let ctx = Context::get_static()?; Self::get_plan_balance().await
encoded_api_response(Server::load_plan_balance(ctx).await?, |value| match value {
ResponseOk::Planballance(balance) => Some(balance),
_ => None,
})
} }
pub async fn remove_additional_user(user_id: i64) -> Result<()> { pub async fn remove_additional_user(user_id: i64) -> Result<()> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
@ -377,22 +453,31 @@ impl RustApi {
.await .await
.and_then(api_result) .and_then(api_result)
} }
pub async fn check_for_passwordless_notification( pub async fn check_for_passwordless_notification(
notification_id: String, notification_id: String,
download_auth_token: Vec<u8>, download_auth_token: Vec<u8>,
already_received_message_ids: Vec<i64>, already_received_message_ids: Vec<i64>,
) -> Result<Vec<u8>> { ) -> Result<Vec<FrbPasswordlessNotificationMessage>> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
Server::check_for_passwordless_notification( let res = Server::check_for_passwordless_notification(
ctx, ctx,
notification_id, notification_id,
download_auth_token, download_auth_token,
already_received_message_ids, already_received_message_ids,
) )
.await .await
.and_then(api_result) .and_then(api_result)?;
.map(|value| value.encode_to_vec()) Ok(res
.messages
.into_iter()
.map(|msg| FrbPasswordlessNotificationMessage {
id: msg.id,
encrypted_message: msg.encrypted_message,
})
.collect())
} }
pub async fn report_user(user_id: i64, reason: String) -> Result<()> { pub async fn report_user(user_id: i64, reason: String) -> Result<()> {
let ctx = Context::get_static()?; let ctx = Context::get_static()?;
Server::report_user(ctx, user_id, reason) Server::report_user(ctx, user_id, reason)

View file

@ -4553,6 +4553,83 @@ impl SseDecode for crate::bridge::wrapper::user_discovery::FlutterUserDiscovery
} }
} }
impl SseDecode for crate::bridge::api::FrbAdditionalAccount {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_userId = <i64>::sse_decode(deserializer);
let mut var_planId = <String>::sse_decode(deserializer);
return crate::bridge::api::FrbAdditionalAccount {
user_id: var_userId,
plan_id: var_planId,
};
}
}
impl SseDecode for crate::bridge::api::FrbMemoriesUploadUrls {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_mediaId = <String>::sse_decode(deserializer);
let mut var_thumbnailUpload =
<Option<crate::bridge::api::FrbPresignedPost>>::sse_decode(deserializer);
let mut var_fullUpload =
<Option<crate::bridge::api::FrbPresignedPost>>::sse_decode(deserializer);
return crate::bridge::api::FrbMemoriesUploadUrls {
media_id: var_mediaId,
thumbnail_upload: var_thumbnailUpload,
full_upload: var_fullUpload,
};
}
}
impl SseDecode for crate::bridge::api::FrbMemoriesUsage {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_currentBytes = <i64>::sse_decode(deserializer);
let mut var_count = <i64>::sse_decode(deserializer);
let mut var_maxBytes = <i64>::sse_decode(deserializer);
return crate::bridge::api::FrbMemoriesUsage {
current_bytes: var_currentBytes,
count: var_count,
max_bytes: var_maxBytes,
};
}
}
impl SseDecode for crate::bridge::api::FrbPasswordlessNotificationMessage {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_id = <i64>::sse_decode(deserializer);
let mut var_encryptedMessage = <Vec<u8>>::sse_decode(deserializer);
return crate::bridge::api::FrbPasswordlessNotificationMessage {
id: var_id,
encrypted_message: var_encryptedMessage,
};
}
}
impl SseDecode for crate::bridge::api::FrbPlanBalance {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_usedDailyMediaUploadLimit = <i64>::sse_decode(deserializer);
let mut var_usedUploadMediaSizeLimit = <i64>::sse_decode(deserializer);
let mut var_paymentPeriodDays = <Option<i64>>::sse_decode(deserializer);
let mut var_lastPaymentDoneUnixTimestamp = <Option<i64>>::sse_decode(deserializer);
let mut var_additionalAccounts =
<Vec<crate::bridge::api::FrbAdditionalAccount>>::sse_decode(deserializer);
let mut var_autoRenewal = <Option<bool>>::sse_decode(deserializer);
let mut var_additionalAccountOwnerId = <Option<i64>>::sse_decode(deserializer);
return crate::bridge::api::FrbPlanBalance {
used_daily_media_upload_limit: var_usedDailyMediaUploadLimit,
used_upload_media_size_limit: var_usedUploadMediaSizeLimit,
payment_period_days: var_paymentPeriodDays,
last_payment_done_unix_timestamp: var_lastPaymentDoneUnixTimestamp,
additional_accounts: var_additionalAccounts,
auto_renewal: var_autoRenewal,
additional_account_owner_id: var_additionalAccountOwnerId,
};
}
}
impl SseDecode for crate::signal::engine::FrbPqcPreKey { impl SseDecode for crate::signal::engine::FrbPqcPreKey {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
@ -4601,6 +4678,44 @@ impl SseDecode for crate::signal::engine::FrbPreKeyBundle {
} }
} }
impl SseDecode for crate::bridge::api::FrbPresignedPost {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_url = <String>::sse_decode(deserializer);
let mut var_fields = <Vec<(String, String)>>::sse_decode(deserializer);
return crate::bridge::api::FrbPresignedPost {
url: var_url,
fields: var_fields,
};
}
}
impl SseDecode for crate::bridge::api::FrbProofOfWork {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_prefix = <String>::sse_decode(deserializer);
let mut var_difficulty = <i64>::sse_decode(deserializer);
return crate::bridge::api::FrbProofOfWork {
prefix: var_prefix,
difficulty: var_difficulty,
};
}
}
impl SseDecode for crate::bridge::api::FrbUserData {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_userId = <i64>::sse_decode(deserializer);
let mut var_username = <Vec<u8>>::sse_decode(deserializer);
let mut var_publicIdentityKey = <Vec<u8>>::sse_decode(deserializer);
return crate::bridge::api::FrbUserData {
user_id: var_userId,
username: var_username,
public_identity_key: var_publicIdentityKey,
};
}
}
impl SseDecode for i32 { impl SseDecode for i32 {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
@ -4687,6 +4802,34 @@ impl SseDecode for Vec<String> {
} }
} }
impl SseDecode for Vec<crate::bridge::api::FrbAdditionalAccount> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut len_ = <i32>::sse_decode(deserializer);
let mut ans_ = Vec::with_capacity(len_ as usize);
for idx_ in 0..len_ {
ans_.push(<crate::bridge::api::FrbAdditionalAccount>::sse_decode(
deserializer,
));
}
return ans_;
}
}
impl SseDecode for Vec<crate::bridge::api::FrbPasswordlessNotificationMessage> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut len_ = <i32>::sse_decode(deserializer);
let mut ans_ = Vec::with_capacity(len_ as usize);
for idx_ in 0..len_ {
ans_.push(
<crate::bridge::api::FrbPasswordlessNotificationMessage>::sse_decode(deserializer),
);
}
return ans_;
}
}
impl SseDecode for Vec<crate::signal::engine::FrbPqcPreKey> { impl SseDecode for Vec<crate::signal::engine::FrbPqcPreKey> {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
@ -4779,6 +4922,18 @@ impl SseDecode for Vec<(String, Vec<String>)> {
} }
} }
impl SseDecode for Vec<(String, String)> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut len_ = <i32>::sse_decode(deserializer);
let mut ans_ = Vec::with_capacity(len_ as usize);
for idx_ in 0..len_ {
ans_.push(<(String, String)>::sse_decode(deserializer));
}
return ans_;
}
}
impl SseDecode for Vec<crate::database::app::SqlRow> { impl SseDecode for Vec<crate::database::app::SqlRow> {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
@ -4873,6 +5028,19 @@ impl SseDecode for Option<f64> {
} }
} }
impl SseDecode for Option<crate::bridge::api::FrbPresignedPost> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
if (<bool>::sse_decode(deserializer)) {
return Some(<crate::bridge::api::FrbPresignedPost>::sse_decode(
deserializer,
));
} else {
return None;
}
}
}
impl SseDecode for Option<i64> { impl SseDecode for Option<i64> {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
@ -5606,6 +5774,126 @@ impl flutter_rust_bridge::IntoIntoDart<crate::bridge::wrapper::user_discovery::F
} }
} }
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::bridge::api::FrbAdditionalAccount {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[
self.user_id.into_into_dart().into_dart(),
self.plan_id.into_into_dart().into_dart(),
]
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for crate::bridge::api::FrbAdditionalAccount
{
}
impl flutter_rust_bridge::IntoIntoDart<crate::bridge::api::FrbAdditionalAccount>
for crate::bridge::api::FrbAdditionalAccount
{
fn into_into_dart(self) -> crate::bridge::api::FrbAdditionalAccount {
self
}
}
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::bridge::api::FrbMemoriesUploadUrls {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[
self.media_id.into_into_dart().into_dart(),
self.thumbnail_upload.into_into_dart().into_dart(),
self.full_upload.into_into_dart().into_dart(),
]
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for crate::bridge::api::FrbMemoriesUploadUrls
{
}
impl flutter_rust_bridge::IntoIntoDart<crate::bridge::api::FrbMemoriesUploadUrls>
for crate::bridge::api::FrbMemoriesUploadUrls
{
fn into_into_dart(self) -> crate::bridge::api::FrbMemoriesUploadUrls {
self
}
}
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::bridge::api::FrbMemoriesUsage {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[
self.current_bytes.into_into_dart().into_dart(),
self.count.into_into_dart().into_dart(),
self.max_bytes.into_into_dart().into_dart(),
]
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for crate::bridge::api::FrbMemoriesUsage
{
}
impl flutter_rust_bridge::IntoIntoDart<crate::bridge::api::FrbMemoriesUsage>
for crate::bridge::api::FrbMemoriesUsage
{
fn into_into_dart(self) -> crate::bridge::api::FrbMemoriesUsage {
self
}
}
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::bridge::api::FrbPasswordlessNotificationMessage {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[
self.id.into_into_dart().into_dart(),
self.encrypted_message.into_into_dart().into_dart(),
]
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for crate::bridge::api::FrbPasswordlessNotificationMessage
{
}
impl flutter_rust_bridge::IntoIntoDart<crate::bridge::api::FrbPasswordlessNotificationMessage>
for crate::bridge::api::FrbPasswordlessNotificationMessage
{
fn into_into_dart(self) -> crate::bridge::api::FrbPasswordlessNotificationMessage {
self
}
}
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::bridge::api::FrbPlanBalance {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[
self.used_daily_media_upload_limit
.into_into_dart()
.into_dart(),
self.used_upload_media_size_limit
.into_into_dart()
.into_dart(),
self.payment_period_days.into_into_dart().into_dart(),
self.last_payment_done_unix_timestamp
.into_into_dart()
.into_dart(),
self.additional_accounts.into_into_dart().into_dart(),
self.auto_renewal.into_into_dart().into_dart(),
self.additional_account_owner_id
.into_into_dart()
.into_dart(),
]
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for crate::bridge::api::FrbPlanBalance
{
}
impl flutter_rust_bridge::IntoIntoDart<crate::bridge::api::FrbPlanBalance>
for crate::bridge::api::FrbPlanBalance
{
fn into_into_dart(self) -> crate::bridge::api::FrbPlanBalance {
self
}
}
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::signal::engine::FrbPqcPreKey { impl flutter_rust_bridge::IntoDart for crate::signal::engine::FrbPqcPreKey {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[ [
@ -5660,6 +5948,70 @@ impl flutter_rust_bridge::IntoIntoDart<crate::signal::engine::FrbPreKeyBundle>
} }
} }
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::bridge::api::FrbPresignedPost {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[
self.url.into_into_dart().into_dart(),
self.fields.into_into_dart().into_dart(),
]
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for crate::bridge::api::FrbPresignedPost
{
}
impl flutter_rust_bridge::IntoIntoDart<crate::bridge::api::FrbPresignedPost>
for crate::bridge::api::FrbPresignedPost
{
fn into_into_dart(self) -> crate::bridge::api::FrbPresignedPost {
self
}
}
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::bridge::api::FrbProofOfWork {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[
self.prefix.into_into_dart().into_dart(),
self.difficulty.into_into_dart().into_dart(),
]
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for crate::bridge::api::FrbProofOfWork
{
}
impl flutter_rust_bridge::IntoIntoDart<crate::bridge::api::FrbProofOfWork>
for crate::bridge::api::FrbProofOfWork
{
fn into_into_dart(self) -> crate::bridge::api::FrbProofOfWork {
self
}
}
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::bridge::api::FrbUserData {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[
self.user_id.into_into_dart().into_dart(),
self.username.into_into_dart().into_dart(),
self.public_identity_key.into_into_dart().into_dart(),
]
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for crate::bridge::api::FrbUserData
{
}
impl flutter_rust_bridge::IntoIntoDart<crate::bridge::api::FrbUserData>
for crate::bridge::api::FrbUserData
{
fn into_into_dart(self) -> crate::bridge::api::FrbUserData {
self
}
}
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::bridge::InitConfig { impl flutter_rust_bridge::IntoDart for crate::bridge::InitConfig {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
[ [
@ -6304,6 +6656,59 @@ impl SseEncode for crate::bridge::wrapper::user_discovery::FlutterUserDiscovery
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {}
} }
impl SseEncode for crate::bridge::api::FrbAdditionalAccount {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<i64>::sse_encode(self.user_id, serializer);
<String>::sse_encode(self.plan_id, serializer);
}
}
impl SseEncode for crate::bridge::api::FrbMemoriesUploadUrls {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<String>::sse_encode(self.media_id, serializer);
<Option<crate::bridge::api::FrbPresignedPost>>::sse_encode(
self.thumbnail_upload,
serializer,
);
<Option<crate::bridge::api::FrbPresignedPost>>::sse_encode(self.full_upload, serializer);
}
}
impl SseEncode for crate::bridge::api::FrbMemoriesUsage {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<i64>::sse_encode(self.current_bytes, serializer);
<i64>::sse_encode(self.count, serializer);
<i64>::sse_encode(self.max_bytes, serializer);
}
}
impl SseEncode for crate::bridge::api::FrbPasswordlessNotificationMessage {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<i64>::sse_encode(self.id, serializer);
<Vec<u8>>::sse_encode(self.encrypted_message, serializer);
}
}
impl SseEncode for crate::bridge::api::FrbPlanBalance {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<i64>::sse_encode(self.used_daily_media_upload_limit, serializer);
<i64>::sse_encode(self.used_upload_media_size_limit, serializer);
<Option<i64>>::sse_encode(self.payment_period_days, serializer);
<Option<i64>>::sse_encode(self.last_payment_done_unix_timestamp, serializer);
<Vec<crate::bridge::api::FrbAdditionalAccount>>::sse_encode(
self.additional_accounts,
serializer,
);
<Option<bool>>::sse_encode(self.auto_renewal, serializer);
<Option<i64>>::sse_encode(self.additional_account_owner_id, serializer);
}
}
impl SseEncode for crate::signal::engine::FrbPqcPreKey { impl SseEncode for crate::signal::engine::FrbPqcPreKey {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
@ -6332,6 +6737,31 @@ impl SseEncode for crate::signal::engine::FrbPreKeyBundle {
} }
} }
impl SseEncode for crate::bridge::api::FrbPresignedPost {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<String>::sse_encode(self.url, serializer);
<Vec<(String, String)>>::sse_encode(self.fields, serializer);
}
}
impl SseEncode for crate::bridge::api::FrbProofOfWork {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<String>::sse_encode(self.prefix, serializer);
<i64>::sse_encode(self.difficulty, serializer);
}
}
impl SseEncode for crate::bridge::api::FrbUserData {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<i64>::sse_encode(self.user_id, serializer);
<Vec<u8>>::sse_encode(self.username, serializer);
<Vec<u8>>::sse_encode(self.public_identity_key, serializer);
}
}
impl SseEncode for i32 { impl SseEncode for i32 {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
@ -6411,6 +6841,26 @@ impl SseEncode for Vec<String> {
} }
} }
impl SseEncode for Vec<crate::bridge::api::FrbAdditionalAccount> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<i32>::sse_encode(self.len() as _, serializer);
for item in self {
<crate::bridge::api::FrbAdditionalAccount>::sse_encode(item, serializer);
}
}
}
impl SseEncode for Vec<crate::bridge::api::FrbPasswordlessNotificationMessage> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<i32>::sse_encode(self.len() as _, serializer);
for item in self {
<crate::bridge::api::FrbPasswordlessNotificationMessage>::sse_encode(item, serializer);
}
}
}
impl SseEncode for Vec<crate::signal::engine::FrbPqcPreKey> { impl SseEncode for Vec<crate::signal::engine::FrbPqcPreKey> {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
@ -6483,6 +6933,16 @@ impl SseEncode for Vec<(String, Vec<String>)> {
} }
} }
impl SseEncode for Vec<(String, String)> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<i32>::sse_encode(self.len() as _, serializer);
for item in self {
<(String, String)>::sse_encode(item, serializer);
}
}
}
impl SseEncode for Vec<crate::database::app::SqlRow> { impl SseEncode for Vec<crate::database::app::SqlRow> {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
@ -6563,6 +7023,16 @@ impl SseEncode for Option<f64> {
} }
} }
impl SseEncode for Option<crate::bridge::api::FrbPresignedPost> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<bool>::sse_encode(self.is_some(), serializer);
if let Some(value) = self {
<crate::bridge::api::FrbPresignedPost>::sse_encode(value, serializer);
}
}
}
impl SseEncode for Option<i64> { impl SseEncode for Option<i64> {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {

View file

@ -4,13 +4,13 @@ import 'dart:io';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:drift/drift.dart' hide isNotNull, isNull; import 'package:drift/drift.dart' hide isNotNull, isNull;
import 'package:fixnum/fixnum.dart'; import 'package:fixnum/fixnum.dart';
import 'package:flutter/foundation.dart';
import 'package:twonly/core/bridge/api.dart'; import 'package:twonly/core/bridge/api.dart';
import 'package:twonly/src/database/tables/messages.table.dart'; import 'package:twonly/src/database/tables/messages.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart' import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart'
as pb; as pb;
import 'package:twonly/src/services/api/api.service.dart'; import 'package:twonly/src/services/api/api.service.dart';
import 'package:twonly/src/services/api/rust_api_result.dart';
import 'package:twonly/src/services/user.service.dart'; import 'package:twonly/src/services/user.service.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
import 'package:twonly/src/utils/pow.dart'; import 'package:twonly/src/utils/pow.dart';
@ -50,19 +50,18 @@ class TestClient {
await run(() async { await run(() async {
Log.info('Requesting POW...'); Log.info('Requesting POW...');
final dynamic pow; final FrbProofOfWork pow;
try { try {
final raw = await RustApi.getProofOfWork(); pow = await RustApi.getProofOfWork();
pow = decodeProofOfWork(raw);
} catch (e, st) { } catch (e, st) {
if (kDebugMode) {
print('POW EXCEPTION: $e\n$st'); print('POW EXCEPTION: $e\n$st');
}
rethrow; rethrow;
} }
Log.info('POW result: $pow'); Log.info('POW result: $pow');
final prefix = pow.prefix; final proof = await calculatePoW(pow.prefix, pow.difficulty);
final difficulty = pow.difficulty.toInt();
final proof = await calculatePoW(prefix, difficulty);
realUserId = await RustApi.register( realUserId = await RustApi.register(
username: username, username: username,

View file

@ -5,7 +5,6 @@ import 'package:drift/native.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:twonly/core/bridge.dart' as bridge; import 'package:twonly/core/bridge.dart' as bridge;
import 'package:twonly/core/bridge/wrapper/signal.dart';
import 'package:twonly/core/frb_generated.dart'; import 'package:twonly/core/frb_generated.dart';
import 'package:twonly/globals.dart'; import 'package:twonly/globals.dart';
import 'package:twonly/locator.dart'; import 'package:twonly/locator.dart';
@ -99,15 +98,6 @@ void main() {
} }
}); });
Future<void> setupSignalSession(int contactId) async {
final bundle = await RustSignal.generateBundle();
await RustSignal.processPrekeyBundle(
name: contactId.toString(),
deviceId: 1,
bundle: bundle,
);
}
group('PasswordlessRecoveryService - enablePasswordlessRecovery', () { group('PasswordlessRecoveryService - enablePasswordlessRecovery', () {
test('works with SecondFactorType.none', () async { test('works with SecondFactorType.none', () async {
await twonlyDB.contactsDao.insertOnConflictUpdate( await twonlyDB.contactsDao.insertOnConflictUpdate(