query_sync: forward non-matching relay messages to pool dispatch

This commit is contained in:
Your Name
2026-03-05 14:07:11 -04:00
parent ea84795911
commit e77973aea0
+73 -67
View File
@@ -1302,87 +1302,93 @@ cJSON** nostr_relay_pool_query_sync(
// Handle pong response for connection health monitoring
handle_pong_response(relay);
} else {
// Process as regular NOSTR message
// Parse once: query-sync consumes only its own sub-id messages;
// everything else is forwarded to normal pool dispatch.
char* msg_type = NULL;
cJSON* parsed = NULL;
if (nostr_parse_relay_message(buffer, &msg_type, &parsed) == 0) {
int handled_for_query = 0;
if (msg_type && strcmp(msg_type, "EVENT") == 0) {
// Handle EVENT message
if (cJSON_IsArray(parsed) && cJSON_GetArraySize(parsed) >= 3) {
cJSON* sub_id_json = cJSON_GetArrayItem(parsed, 1);
cJSON* event = cJSON_GetArrayItem(parsed, 2);
if (cJSON_IsString(sub_id_json) && event &&
strcmp(cJSON_GetStringValue(sub_id_json), subscription_id) == 0) {
cJSON* event_id_json = cJSON_GetObjectItem(event, "id");
if (event_id_json && cJSON_IsString(event_id_json)) {
const char* event_id = cJSON_GetStringValue(event_id_json);
// Check for duplicate
if (!is_event_seen(pool, event_id)) {
mark_event_seen(pool, event_id);
relay->stats.events_received++;
// Add to results array
if (*event_count >= events_capacity) {
events_capacity = events_capacity == 0 ? 10 : events_capacity * 2;
events = realloc(events, events_capacity * sizeof(cJSON*));
if (!events) {
*event_count = 0;
break;
if (cJSON_IsArray(parsed) && cJSON_GetArraySize(parsed) >= 3) {
cJSON* sub_id_json = cJSON_GetArrayItem(parsed, 1);
cJSON* event = cJSON_GetArrayItem(parsed, 2);
if (cJSON_IsString(sub_id_json) && event &&
strcmp(cJSON_GetStringValue(sub_id_json), subscription_id) == 0) {
handled_for_query = 1;
cJSON* event_id_json = cJSON_GetObjectItem(event, "id");
if (event_id_json && cJSON_IsString(event_id_json)) {
const char* event_id = cJSON_GetStringValue(event_id_json);
if (!is_event_seen(pool, event_id)) {
mark_event_seen(pool, event_id);
relay->stats.events_received++;
if (*event_count >= events_capacity) {
events_capacity = events_capacity == 0 ? 10 : events_capacity * 2;
events = realloc(events, events_capacity * sizeof(cJSON*));
if (!events) {
*event_count = 0;
break;
}
}
events[(*event_count)++] = cJSON_Duplicate(event, 1);
}
events[(*event_count)++] = cJSON_Duplicate(event, 1);
}
}
}
} else if (msg_type && strcmp(msg_type, "EOSE") == 0) {
if (cJSON_IsArray(parsed) && cJSON_GetArraySize(parsed) >= 2) {
cJSON* sub_id_json = cJSON_GetArrayItem(parsed, 1);
if (cJSON_IsString(sub_id_json) &&
strcmp(cJSON_GetStringValue(sub_id_json), subscription_id) == 0) {
handled_for_query = 1;
eose_count++;
}
}
} else if (msg_type && strcmp(msg_type, "AUTH") == 0) {
if (relay->nip42_enabled && pool->has_private_key &&
cJSON_IsArray(parsed) && cJSON_GetArraySize(parsed) >= 2) {
cJSON* challenge_json = cJSON_GetArrayItem(parsed, 1);
if (cJSON_IsString(challenge_json)) {
handled_for_query = 1;
const char* challenge = cJSON_GetStringValue(challenge_json);
strncpy(relay->auth_challenge, challenge, sizeof(relay->auth_challenge) - 1);
relay->auth_challenge[sizeof(relay->auth_challenge) - 1] = '\0';
relay->auth_challenge_time = time(NULL);
relay->auth_state = NOSTR_AUTH_STATE_CHALLENGE_RECEIVED;
cJSON* auth_event = nostr_nip42_create_auth_event(
challenge,
relay->url,
pool->private_key,
0
);
if (auth_event) {
char* auth_message = nostr_nip42_create_auth_message(auth_event);
if (auth_message) {
if (nostr_ws_send_text(relay->ws_client, auth_message) >= 0) {
relay->auth_state = NOSTR_AUTH_STATE_AUTHENTICATING;
}
free(auth_message);
}
cJSON_Delete(auth_event);
}
}
}
}
} else if (msg_type && strcmp(msg_type, "EOSE") == 0) {
// Handle EOSE message
if (cJSON_IsArray(parsed) && cJSON_GetArraySize(parsed) >= 2) {
cJSON* sub_id_json = cJSON_GetArrayItem(parsed, 1);
if (cJSON_IsString(sub_id_json) &&
strcmp(cJSON_GetStringValue(sub_id_json), subscription_id) == 0) {
eose_count++;
}
}
} else if (msg_type && strcmp(msg_type, "AUTH") == 0) {
// Handle AUTH challenge message: ["AUTH", <challenge-string>]
if (relay->nip42_enabled && pool->has_private_key &&
cJSON_IsArray(parsed) && cJSON_GetArraySize(parsed) >= 2) {
cJSON* challenge_json = cJSON_GetArrayItem(parsed, 1);
if (cJSON_IsString(challenge_json)) {
const char* challenge = cJSON_GetStringValue(challenge_json);
strncpy(relay->auth_challenge, challenge, sizeof(relay->auth_challenge) - 1);
relay->auth_challenge[sizeof(relay->auth_challenge) - 1] = '\0';
relay->auth_challenge_time = time(NULL);
relay->auth_state = NOSTR_AUTH_STATE_CHALLENGE_RECEIVED;
if (msg_type) free(msg_type);
if (parsed) cJSON_Delete(parsed);
cJSON* auth_event = nostr_nip42_create_auth_event(
challenge,
relay->url,
pool->private_key,
0
);
if (auth_event) {
char* auth_message = nostr_nip42_create_auth_message(auth_event);
if (auth_message) {
if (nostr_ws_send_text(relay->ws_client, auth_message) >= 0) {
relay->auth_state = NOSTR_AUTH_STATE_AUTHENTICATING;
}
free(auth_message);
}
cJSON_Delete(auth_event);
}
}
if (!handled_for_query) {
process_relay_message(pool, relay, buffer);
}
}
if (msg_type) free(msg_type);
if (parsed) cJSON_Delete(parsed);
}
}
}
}