Reupload
This commit is contained in:
105
api/index.js
105
api/index.js
@@ -41,7 +41,7 @@
|
||||
const relayConnectionStatus = document.getElementById('relay-connection-status');
|
||||
const connectRelayBtn = document.getElementById('connect-relay-btn');
|
||||
const disconnectRelayBtn = document.getElementById('disconnect-relay-btn');
|
||||
const testWebSocketBtn = document.getElementById('test-websocket-btn');
|
||||
const restartRelayBtn = document.getElementById('restart-relay-btn');
|
||||
const configDisplay = document.getElementById('config-display');
|
||||
const configTableBody = document.getElementById('config-table-body');
|
||||
|
||||
@@ -369,28 +369,28 @@
|
||||
relayConnectionStatus.className = 'status connected';
|
||||
connectRelayBtn.disabled = true;
|
||||
disconnectRelayBtn.disabled = true;
|
||||
testWebSocketBtn.disabled = true;
|
||||
restartRelayBtn.disabled = true;
|
||||
break;
|
||||
case 'connected':
|
||||
relayConnectionStatus.textContent = 'CONNECTED';
|
||||
relayConnectionStatus.className = 'status connected';
|
||||
connectRelayBtn.disabled = true;
|
||||
disconnectRelayBtn.disabled = false;
|
||||
testWebSocketBtn.disabled = false;
|
||||
restartRelayBtn.disabled = false;
|
||||
break;
|
||||
case 'disconnected':
|
||||
relayConnectionStatus.textContent = 'NOT CONNECTED';
|
||||
relayConnectionStatus.className = 'status disconnected';
|
||||
connectRelayBtn.disabled = false;
|
||||
disconnectRelayBtn.disabled = true;
|
||||
testWebSocketBtn.disabled = true;
|
||||
restartRelayBtn.disabled = true;
|
||||
break;
|
||||
case 'error':
|
||||
relayConnectionStatus.textContent = 'CONNECTION FAILED';
|
||||
relayConnectionStatus.className = 'status error';
|
||||
connectRelayBtn.disabled = false;
|
||||
disconnectRelayBtn.disabled = true;
|
||||
testWebSocketBtn.disabled = true;
|
||||
restartRelayBtn.disabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1670,22 +1670,12 @@
|
||||
disconnectFromRelay();
|
||||
});
|
||||
|
||||
testWebSocketBtn.addEventListener('click', function (e) {
|
||||
restartRelayBtn.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
const url = relayConnectionUrl.value.trim();
|
||||
if (!url) {
|
||||
log('Please enter a relay URL first', 'ERROR');
|
||||
return;
|
||||
}
|
||||
|
||||
testWebSocketConnection(url)
|
||||
.then(() => {
|
||||
log('WebSocket test successful', 'INFO');
|
||||
})
|
||||
.catch(error => {
|
||||
log(`WebSocket test failed: ${error.message}`, 'ERROR');
|
||||
});
|
||||
sendRestartCommand().catch(error => {
|
||||
log(`Restart command failed: ${error.message}`, 'ERROR');
|
||||
});
|
||||
});
|
||||
|
||||
// ================================
|
||||
@@ -3148,6 +3138,83 @@
|
||||
// DATABASE STATISTICS FUNCTIONS
|
||||
// ================================
|
||||
|
||||
// Send restart command to restart the relay using Administrator API
|
||||
async function sendRestartCommand() {
|
||||
if (!isLoggedIn || !userPubkey) {
|
||||
log('Must be logged in to restart relay', 'ERROR');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!relayPool) {
|
||||
log('SimplePool connection not available', 'ERROR');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
log('Sending restart command to relay...', 'INFO');
|
||||
|
||||
// Create command array for restart
|
||||
const command_array = ["system_command", "restart"];
|
||||
|
||||
// Encrypt the command array directly using NIP-44
|
||||
const encrypted_content = await encryptForRelay(JSON.stringify(command_array));
|
||||
if (!encrypted_content) {
|
||||
throw new Error('Failed to encrypt command array');
|
||||
}
|
||||
|
||||
// Create single kind 23456 admin event
|
||||
const restartEvent = {
|
||||
kind: 23456,
|
||||
pubkey: userPubkey,
|
||||
created_at: Math.floor(Date.now() / 1000),
|
||||
tags: [["p", getRelayPubkey()]],
|
||||
content: encrypted_content
|
||||
};
|
||||
|
||||
// Sign the event
|
||||
const signedEvent = await window.nostr.signEvent(restartEvent);
|
||||
if (!signedEvent || !signedEvent.sig) {
|
||||
throw new Error('Event signing failed');
|
||||
}
|
||||
|
||||
// Publish via SimplePool
|
||||
const url = relayConnectionUrl.value.trim();
|
||||
const publishPromises = relayPool.publish([url], signedEvent);
|
||||
|
||||
// Use Promise.allSettled to capture per-relay outcomes
|
||||
const results = await Promise.allSettled(publishPromises);
|
||||
|
||||
// Check if any relay accepted the event
|
||||
let successCount = 0;
|
||||
results.forEach((result, index) => {
|
||||
if (result.status === 'fulfilled') {
|
||||
successCount++;
|
||||
log(`Restart command published successfully to relay ${index}`, 'INFO');
|
||||
} else {
|
||||
log(`Restart command failed on relay ${index}: ${result.reason?.message || result.reason}`, 'ERROR');
|
||||
}
|
||||
});
|
||||
|
||||
if (successCount === 0) {
|
||||
const errorDetails = results.map((r, i) => `Relay ${i}: ${r.reason?.message || r.reason}`).join('; ');
|
||||
throw new Error(`All relays rejected restart command. Details: ${errorDetails}`);
|
||||
}
|
||||
|
||||
log('Restart command sent successfully - relay should restart shortly...', 'INFO');
|
||||
|
||||
// Update connection status to indicate restart is in progress
|
||||
updateRelayConnectionStatus('connecting');
|
||||
relayConnectionStatus.textContent = 'RESTARTING...';
|
||||
|
||||
// The relay will disconnect and need to be reconnected after restart
|
||||
// This will be handled by the WebSocket disconnection event
|
||||
|
||||
} catch (error) {
|
||||
log(`Failed to send restart command: ${error.message}`, 'ERROR');
|
||||
updateRelayConnectionStatus('error');
|
||||
}
|
||||
}
|
||||
|
||||
// Send stats_query command to get database statistics using Administrator API (inner events)
|
||||
async function sendStatsQuery() {
|
||||
if (!isLoggedIn || !userPubkey) {
|
||||
|
||||
Reference in New Issue
Block a user