From: AsamK Date: Sun, 13 Feb 2022 19:07:08 +0000 (+0100) Subject: Load multiple accounts in parallel X-Git-Tag: v0.10.4~11 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/90c787f8e276db5db670fd9e5f0e15ad12438017?ds=inline Load multiple accounts in parallel --- diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 18954ec8..859fa0ea 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -1083,6 +1083,7 @@ "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, "methods":[ + {"name":"","parameterTypes":["java.lang.String","java.lang.String","org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack$JsonSticker","java.util.List"] }, {"name":"author","parameterTypes":[] }, {"name":"cover","parameterTypes":[] }, {"name":"stickers","parameterTypes":[] }, @@ -1095,6 +1096,7 @@ "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, "methods":[ + {"name":"","parameterTypes":["java.lang.Integer","java.lang.String","java.lang.String","java.lang.String"] }, {"name":"contentType","parameterTypes":[] }, {"name":"emoji","parameterTypes":[] }, {"name":"file","parameterTypes":[] }, diff --git a/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java b/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java index 379aa1cb..b3ed439d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java +++ b/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java @@ -47,11 +47,11 @@ public class SignalAccountFiles { } public MultiAccountManager initMultiAccountManager() { - final var managers = getAllLocalAccountNumbers().stream().map(a -> { + final var managers = accountsStore.getAllAccounts().parallelStream().map(a -> { try { - return initManager(a); + return initManager(a.path()); } catch (NotRegisteredException | IOException | AccountCheckException e) { - logger.warn("Ignoring {}: {} ({})", a, e.getMessage(), e.getClass().getSimpleName()); + logger.warn("Ignoring {}: {} ({})", a.number(), e.getMessage(), e.getClass().getSimpleName()); return null; } }).filter(Objects::nonNull).toList(); @@ -61,7 +61,16 @@ public class SignalAccountFiles { public Manager initManager(String number) throws IOException, NotRegisteredException, AccountCheckException { final var accountPath = accountsStore.getPathByNumber(number); - if (accountPath == null || !SignalAccount.accountFileExists(pathConfig.dataPath(), accountPath)) { + return this.initManager(number, accountPath); + } + + private Manager initManager( + String number, String accountPath + ) throws IOException, NotRegisteredException, AccountCheckException { + if (accountPath == null) { + throw new NotRegisteredException(); + } + if (!SignalAccount.accountFileExists(pathConfig.dataPath(), accountPath)) { throw new NotRegisteredException(); } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStorage.java b/lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStorage.java index 341d9572..7507c339 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStorage.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStorage.java @@ -2,7 +2,7 @@ package org.asamk.signal.manager.storage.accounts; import java.util.List; -record AccountsStorage(List accounts) { +public record AccountsStorage(List accounts) { - record Account(String path, String number, String uuid) {} + public record Account(String path, String number, String uuid) {} } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java index 07dfac3c..3c81c7d7 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java @@ -41,14 +41,18 @@ public class AccountsStore { } } - public Set getAllNumbers() { + public synchronized Set getAllNumbers() { return readAccounts().stream() .map(AccountsStorage.Account::number) .filter(Objects::nonNull) .collect(Collectors.toSet()); } - public String getPathByNumber(String number) { + public synchronized Set getAllAccounts() { + return readAccounts().stream().filter(a -> a.number() != null).collect(Collectors.toSet()); + } + + public synchronized String getPathByNumber(String number) { return readAccounts().stream() .filter(a -> number.equals(a.number())) .map(AccountsStorage.Account::path) @@ -56,7 +60,7 @@ public class AccountsStore { .orElse(null); } - public String getPathByAci(ACI aci) { + public synchronized String getPathByAci(ACI aci) { return readAccounts().stream() .filter(a -> aci.toString().equals(a.uuid())) .map(AccountsStorage.Account::path) @@ -64,7 +68,7 @@ public class AccountsStore { .orElse(null); } - public void updateAccount(String path, String number, ACI aci) { + public synchronized void updateAccount(String path, String number, ACI aci) { updateAccounts(accounts -> accounts.stream().map(a -> { if (path.equals(a.path())) { return new AccountsStorage.Account(a.path(), number, aci == null ? null : aci.toString()); @@ -81,7 +85,7 @@ public class AccountsStore { }).toList()); } - public String addAccount(String number, ACI aci) { + public synchronized String addAccount(String number, ACI aci) { final var accountPath = generateNewAccountPath(); final var account = new AccountsStorage.Account(accountPath, number, aci == null ? null : aci.toString()); updateAccounts(accounts -> {