Browse Source

fix ephemeral handling to not save

main
mleku 3 months ago
parent
commit
075838150d
No known key found for this signature in database
  1. 6
      app/handle-event.go
  2. 10
      app/web/src/App.svelte
  3. 6
      pkg/database/save-event.go
  4. 69
      pkg/database/save-event_test.go
  5. 2
      pkg/version/version

6
app/handle-event.go

@ -207,6 +207,12 @@ func (l *Listener) HandleEvent(msg []byte) (err error) { @@ -207,6 +207,12 @@ func (l *Listener) HandleEvent(msg []byte) (err error) {
}
}
}
// Check if the event is ephemeral (kinds 20000-29999) and just deliver to subscribers.
if kind.IsEphemeral(env.E.Kind) {
go l.publishers.Deliver(env.E)
return
}
// store the event - use a separate context to prevent cancellation issues
saveCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

10
app/web/src/App.svelte

@ -138,6 +138,12 @@ @@ -138,6 +138,12 @@
return kindNames[kind] || `Kind ${kind}`;
}
function formatTimestamp(timestamp) {
if (!timestamp) return 'Unknown time';
const date = new Date(timestamp * 1000);
return date.toLocaleString();
}
function truncatePubkey(pubkey) {
return pubkey.slice(0, 8) + '...' + pubkey.slice(-8);
}
@ -1482,7 +1488,7 @@ @@ -1482,7 +1488,7 @@
<div class="events-view-content" on:scroll={handleScroll}>
{#if filteredEvents.length > 0}
{#each filteredEvents as event}
<div class="events-view-item" class:expanded={expandedEvents.has(event.id)}>
<div class="events-view-item" class:expanded={expandedEvents.has(event.id)} title="Event created: {formatTimestamp(event.created_at)}">
<div class="events-view-row" on:click={() => toggleEventExpansion(event.id)} on:keydown={(e) => e.key === 'Enter' && toggleEventExpansion(event.id)} role="button" tabindex="0">
<div class="events-view-avatar">
<div class="avatar-placeholder">👤</div>
@ -1681,7 +1687,7 @@ @@ -1681,7 +1687,7 @@
<div class="search-results-content" on:scroll={(e) => handleSearchScroll(e, searchTab.id)}>
{#if searchResults.get(searchTab.id)?.events?.length > 0}
{#each searchResults.get(searchTab.id).events as event}
<div class="search-result-item" class:expanded={expandedEvents.has(event.id)}>
<div class="search-result-item" class:expanded={expandedEvents.has(event.id)} title="Event created: {formatTimestamp(event.created_at)}">
<div class="search-result-row" on:click={() => toggleEventExpansion(event.id)} on:keydown={(e) => e.key === 'Enter' && toggleEventExpansion(event.id)} role="button" tabindex="0">
<div class="search-result-avatar">
<div class="avatar-placeholder">👤</div>

6
pkg/database/save-event.go

@ -108,6 +108,12 @@ func (d *D) SaveEvent(c context.Context, ev *event.E) (kc, vc int, err error) { @@ -108,6 +108,12 @@ func (d *D) SaveEvent(c context.Context, ev *event.E) (kc, vc int, err error) {
err = errors.New("nil event")
return
}
// Check if the event is ephemeral (kinds 20000-29999) and reject if so
if kind.IsEphemeral(ev.Kind) {
err = errors.New("blocked: ephemeral events (kinds 20000-29999) are not stored")
return
}
// check if the event already exists
var ser *types.Uint40
if ser, err = d.GetSerialById(ev.ID); err == nil && ser != nil {

69
pkg/database/save-event_test.go

@ -215,7 +215,7 @@ func TestSaveExistingEvent(t *testing.T) { @@ -215,7 +215,7 @@ func TestSaveExistingEvent(t *testing.T) {
}
// Verify the error message
expectedErrorPrefix := "event already exists: "
expectedErrorPrefix := "blocked: event already exists"
if !bytes.HasPrefix([]byte(err.Error()), []byte(expectedErrorPrefix)) {
t.Fatalf(
"Expected error message to start with '%s', got '%s'",
@ -223,3 +223,70 @@ func TestSaveExistingEvent(t *testing.T) { @@ -223,3 +223,70 @@ func TestSaveExistingEvent(t *testing.T) {
)
}
}
// TestEphemeralEventRejection tests that ephemeral events (kinds 20000-29999) are rejected.
func TestEphemeralEventRejection(t *testing.T) {
// Create a temporary directory for the database
tempDir, err := os.MkdirTemp("", "test-db-*")
if err != nil {
t.Fatalf("Failed to create temporary directory: %v", err)
}
defer os.RemoveAll(tempDir) // Clean up after the test
// Create a context and cancel function for the database
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Initialize the database
db, err := New(ctx, cancel, tempDir, "info")
if err != nil {
t.Fatalf("Failed to create database: %v", err)
}
defer db.Close()
// Create a signer
sign := new(p256k.Signer)
if err := sign.Generate(); chk.E(err) {
t.Fatal(err)
}
// Test different ephemeral event kinds
ephemeralKinds := []uint16{
20000, // EphemeralStart
21000, // LightningPubRPC
22242, // ClientAuthentication
23194, // NWCWalletRequest
23195, // NWCWalletResponse
23196, // NWCNotification
23197, // WalletNotification
24133, // NostrConnect
27235, // HTTPAuth
29998, // Just before EphemeralEnd
}
for _, kindValue := range ephemeralKinds {
// Create an ephemeral event
ev := event.New()
ev.Kind = kindValue
ev.Pubkey = sign.Pub()
ev.CreatedAt = timestamp.Now().V
ev.Content = []byte("Ephemeral event")
ev.Tags = tag.NewS()
ev.Sign(sign)
// Try to save the ephemeral event, it should be rejected
_, _, err = db.SaveEvent(ctx, ev)
if err == nil {
t.Fatalf("Expected ephemeral event with kind %d to be rejected, but it was accepted", kindValue)
}
// Verify the error message
expectedError := "blocked: ephemeral events (kinds 20000-29999) are not stored"
if err.Error() != expectedError {
t.Fatalf(
"Expected error message '%s', got '%s' for kind %d",
expectedError, err.Error(), kindValue,
)
}
}
}

2
pkg/version/version

@ -1 +1 @@ @@ -1 +1 @@
v0.12.3
v0.13.1
Loading…
Cancel
Save