chore: improve event syncing #29
@@ -64,7 +64,8 @@ object NostrManager {
|
|||||||
|
|
||||||
val BOOTSTRAP_RELAYS = listOf(
|
val BOOTSTRAP_RELAYS = listOf(
|
||||||
"wss://relay.primal.net",
|
"wss://relay.primal.net",
|
||||||
"wss://purplepag.es"
|
"wss://relay.ditto.pub",
|
||||||
|
"wss://user.kindpag.es",
|
||||||
)
|
)
|
||||||
|
|
||||||
val INDEXER_RELAY = listOf(
|
val INDEXER_RELAY = listOf(
|
||||||
@@ -113,7 +114,7 @@ class Nostr {
|
|||||||
|
|
||||||
suspend fun init(
|
suspend fun init(
|
||||||
dbPath: String,
|
dbPath: String,
|
||||||
logLevel: LogLevel = LogLevel.DEBUG
|
logLevel: LogLevel = LogLevel.WARN
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
if (isInitialized.value) return
|
if (isInitialized.value) return
|
||||||
@@ -646,7 +647,7 @@ class Nostr {
|
|||||||
|
|
||||||
suspend fun fetchMetadataBatch(keys: List<PublicKey>) {
|
suspend fun fetchMetadataBatch(keys: List<PublicKey>) {
|
||||||
try {
|
try {
|
||||||
val limit = keys.size.toULong() * 4u
|
val limit = keys.size.toULong() * 2u
|
||||||
val opts = SubscribeAutoCloseOptions().exitPolicy(ReqExitPolicy.ExitOnEose)
|
val opts = SubscribeAutoCloseOptions().exitPolicy(ReqExitPolicy.ExitOnEose)
|
||||||
|
|
||||||
// Construct a filter for metadata events
|
// Construct a filter for metadata events
|
||||||
@@ -655,16 +656,13 @@ class Nostr {
|
|||||||
.authors(keys)
|
.authors(keys)
|
||||||
.limit(limit)
|
.limit(limit)
|
||||||
|
|
||||||
// Construct a target that includes all filters
|
// Construct request target
|
||||||
val target =
|
val target = mutableMapOf<RelayUrl, List<Filter>>()
|
||||||
ReqTarget.manual(
|
NostrManager.BOOTSTRAP_RELAYS.forEach { relay ->
|
||||||
mapOf(
|
target[RelayUrl.parse(relay)] = listOf(filter)
|
||||||
RelayUrl.parse("wss://purplepag.es") to listOf(filter),
|
}
|
||||||
RelayUrl.parse("wss://relay.primal.net") to listOf(filter),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
client?.subscribe(target = target, closeOn = opts)
|
client?.subscribe(target = ReqTarget.manual(target), closeOn = opts)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
throw IllegalStateException("Failed to fetch metadata batch: ${e.message}", e)
|
throw IllegalStateException("Failed to fetch metadata batch: ${e.message}", e)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,16 +213,20 @@ class NostrViewModel(
|
|||||||
val timeout = 500L // 500ms timeout for batching
|
val timeout = 500L // 500ms timeout for batching
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
// Get the first pubkey
|
||||||
val firstKey = metadataRequestChannel.receive()
|
val firstKey = metadataRequestChannel.receive()
|
||||||
batch.add(firstKey)
|
batch.add(firstKey)
|
||||||
|
|
||||||
|
// Get current time
|
||||||
val lastFlushTime = Clock.System.now().toEpochMilliseconds()
|
val lastFlushTime = Clock.System.now().toEpochMilliseconds()
|
||||||
|
|
||||||
while (batch.isNotEmpty()) {
|
while (batch.isNotEmpty()) {
|
||||||
|
// Get the next pubkey
|
||||||
val nextKey = withTimeoutOrNull(timeout.milliseconds) {
|
val nextKey = withTimeoutOrNull(timeout.milliseconds) {
|
||||||
metadataRequestChannel.receive()
|
metadataRequestChannel.receive()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only add the key if it's not null
|
// Only add the pubkey if it's not null
|
||||||
if (nextKey != null) batch.add(nextKey)
|
if (nextKey != null) batch.add(nextKey)
|
||||||
|
|
||||||
// Get current time
|
// Get current time
|
||||||
|
|||||||
Reference in New Issue
Block a user