diff --git a/keyserver/addons/rust-node-addon/src/identity_client/compare_users.rs b/keyserver/addons/rust-node-addon/src/identity_client/compare_users.rs new file mode 100644 --- /dev/null +++ b/keyserver/addons/rust-node-addon/src/identity_client/compare_users.rs @@ -0,0 +1,36 @@ +use super::*; + +#[napi] +#[instrument(skip_all)] +async fn compare_users( + users: Vec, +) -> Result>> { + let channel = get_identity_service_channel().await?; + let token: MetadataValue<_> = IDENTITY_SERVICE_CONFIG + .identity_auth_token + .parse() + .map_err(|_| Error::from_status(Status::GenericFailure))?; + let mut identity_client = + IdentityServiceClient::with_interceptor(channel, |mut req: Request<()>| { + req.metadata_mut().insert("authorization", token.clone()); + Ok(req) + }); + let request = Request::new(CompareUsersRequest { users: users }); + + match identity_client.compare_users(request).await { + Ok(tonic_response) => { + let compare_users_response = tonic_response.into_inner(); + let mut compare_result = HashMap::new(); + compare_result.insert( + "usersMissingFromKeyserver".to_string(), + compare_users_response.users_missing_from_keyserver, + ); + compare_result.insert( + "usersMissingFromIdentity".to_string(), + compare_users_response.users_missing_from_identity, + ); + Ok(compare_result) + } + Err(e) => Err(Error::new(Status::GenericFailure, e.to_string())), + } +} diff --git a/keyserver/addons/rust-node-addon/src/identity_client/mod.rs b/keyserver/addons/rust-node-addon/src/identity_client/mod.rs --- a/keyserver/addons/rust-node-addon/src/identity_client/mod.rs +++ b/keyserver/addons/rust-node-addon/src/identity_client/mod.rs @@ -1,3 +1,4 @@ +pub mod compare_users; pub mod delete_user; pub mod login_user; pub mod register_user; @@ -21,8 +22,8 @@ registration_request::Data::PakeRegistrationRequestAndUserId, registration_request::Data::PakeRegistrationUploadAndCredentialRequest, registration_response::Data::PakeLoginResponse as RegistrationPakeLoginResponse, - registration_response::Data::PakeRegistrationResponse, DeleteUserRequest, - LoginRequest, LoginResponse, + registration_response::Data::PakeRegistrationResponse, CompareUsersRequest, + DeleteUserRequest, LoginRequest, LoginResponse, PakeCredentialRequestAndUserId as PakeCredentialRequestAndUserIdStruct, PakeLoginRequest as PakeLoginRequestStruct, PakeLoginResponse as PakeLoginResponseStruct, diff --git a/lib/types/rust-binding-types.js b/lib/types/rust-binding-types.js --- a/lib/types/rust-binding-types.js +++ b/lib/types/rust-binding-types.js @@ -15,6 +15,11 @@ publish(toDeviceId: string, payload: string): Promise; } +type UserComparisonResult = { + +usersMissingFromKeyserver: $ReadOnlyArray, + +usersMissingFromIdentity: $ReadOnlyArray, +}; + type RustNativeBindingAPI = { +registerUser: ( userId: string, @@ -39,6 +44,9 @@ ) => Promise, +deleteUser: (userId: string) => Promise, +updateUser: (userId: string, password: string) => Promise, + +compareUsers: ( + userIds: $ReadOnlyArray, + ) => Promise, +TunnelbrokerClient: Class, };