Fix connect to members workflow

This commit is contained in:
NicolasCantu 2025-01-17 10:49:16 +01:00
parent 38425bbb08
commit 5f2e123b9d
2 changed files with 27 additions and 26 deletions

View File

@ -174,32 +174,35 @@ export default class Services {
} }
public async checkConnections(members: Member[]): Promise<void> { public async checkConnections(members: Member[]): Promise<void> {
const memberPromises = members.map(async (member) => { // Ensure the amount is available before proceeding
const addressPromises = member.sp_addresses.map(async (address) => { try {
await this.ensureSufficientAmount();
} catch (e) {
console.error('Failed to get tokens from relay, check connection');
return;
}
let unconnectedAddresses = [];
for (const member of members) {
for (const address of member.sp_addresses) {
const sharedSecret = await this.getSecretForAddress(address); const sharedSecret = await this.getSecretForAddress(address);
if (!sharedSecret) { if (!sharedSecret) {
const connectMemberResult = await this.connectMember([{ sp_addresses: [address] }]); unconnectedAddresses.push(address);
await this.handleApiReturn(connectMemberResult); }
}
}
if (unconnectedAddresses && unconnectedAddresses.length != 0) {
const apiResult = await this.connectAddresses(unconnectedAddresses);
await this.handleApiReturn(apiResult);
} }
});
await Promise.all(addressPromises);
});
await Promise.all(memberPromises);
} }
public async connectMember(members: Member[]): Promise<ApiReturn> { public async connectAddresses(addresses: string[]): Promise<ApiReturn> {
if (members.length === 0) { if (addresses.length === 0) {
throw new Error('Trying to connect to empty members list'); throw new Error('Trying to connect to empty addresses list');
} }
const members_str = members.map((member) => JSON.stringify(member));
try { try {
// Ensure the amount is available before proceeding return this.sdkClient.create_connect_transaction(addresses, 1);
await this.ensureSufficientAmount();
return this.sdkClient.create_connect_transaction(members_str, 1);
} catch (e) { } catch (e) {
console.error('Failed to connect member:', e); console.error('Failed to connect member:', e);
throw e; throw e;
@ -245,8 +248,8 @@ export default class Services {
throw new Error('No paired member in device'); throw new Error('No paired member in device');
} }
const allMembers: Member[] = otherMembers; const allMembers: Member[] = otherMembers;
allMembers.push({ sp_addresses: me });
const meAndOne = [{ sp_addresses: me }, otherMembers.pop()!]; const meAndOne = [{ sp_addresses: me }, otherMembers.pop()!];
allMembers.push({ sp_addresses: me });
const everyOneElse = otherMembers; const everyOneElse = otherMembers;
const messagingTemplate = { const messagingTemplate = {
description: 'messaging', description: 'messaging',
@ -531,6 +534,7 @@ export default class Services {
public async handleApiReturn(apiReturn: ApiReturn) { public async handleApiReturn(apiReturn: ApiReturn) {
if (apiReturn.new_tx_to_send && apiReturn.new_tx_to_send.transaction.length != 0) { if (apiReturn.new_tx_to_send && apiReturn.new_tx_to_send.transaction.length != 0) {
await this.sendNewTxMessage(JSON.stringify(apiReturn.new_tx_to_send)); await this.sendNewTxMessage(JSON.stringify(apiReturn.new_tx_to_send));
await new Promise(r => setTimeout(r, 500));
} }
if (apiReturn.secrets) { if (apiReturn.secrets) {

View File

@ -164,13 +164,10 @@ export async function prepareAndSendPairingTx(secondDeviceAddress: string) {
// Device 1 wait Device 2 // Device 1 wait Device 2
service.device1 = true; service.device1 = true;
const sharedSecret = await service.getSecretForAddress(secondDeviceAddress); try {
if (!sharedSecret) { await service.checkConnections([{ sp_addresses: [secondDeviceAddress] }]);
const member = { } catch (e) {
sp_addresses: [secondDeviceAddress], throw e;
};
const connectMemberResult = await service.connectMember([member]);
await service.handleApiReturn(connectMemberResult);
} }
// Create the process // Create the process
setTimeout(async () => { setTimeout(async () => {