From 075838150d030159ec9992eabc10c0c72b2242a7 Mon Sep 17 00:00:00 2001 From: mleku Date: Fri, 10 Oct 2025 09:35:15 +0100 Subject: [PATCH] fix ephemeral handling to not save --- app/handle-event.go | 6 +++ app/web/src/App.svelte | 10 ++++- pkg/database/save-event.go | 6 +++ pkg/database/save-event_test.go | 69 ++++++++++++++++++++++++++++++++- pkg/version/version | 2 +- 5 files changed, 89 insertions(+), 4 deletions(-) diff --git a/app/handle-event.go b/app/handle-event.go index 6576e2e..3fb7224 100644 --- a/app/handle-event.go +++ b/app/handle-event.go @@ -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() diff --git a/app/web/src/App.svelte b/app/web/src/App.svelte index 760f34c..6bd38ae 100644 --- a/app/web/src/App.svelte +++ b/app/web/src/App.svelte @@ -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 @@
{#if filteredEvents.length > 0} {#each filteredEvents as event} -
+
toggleEventExpansion(event.id)} on:keydown={(e) => e.key === 'Enter' && toggleEventExpansion(event.id)} role="button" tabindex="0">
👤
@@ -1681,7 +1687,7 @@
handleSearchScroll(e, searchTab.id)}> {#if searchResults.get(searchTab.id)?.events?.length > 0} {#each searchResults.get(searchTab.id).events as event} -
+
toggleEventExpansion(event.id)} on:keydown={(e) => e.key === 'Enter' && toggleEventExpansion(event.id)} role="button" tabindex="0">
👤
diff --git a/pkg/database/save-event.go b/pkg/database/save-event.go index 9f30ab4..b22aea4 100644 --- a/pkg/database/save-event.go +++ b/pkg/database/save-event.go @@ -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 { diff --git a/pkg/database/save-event_test.go b/pkg/database/save-event_test.go index ce4200b..025f461 100644 --- a/pkg/database/save-event_test.go +++ b/pkg/database/save-event_test.go @@ -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) { ) } } + +// 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, + ) + } + } +} diff --git a/pkg/version/version b/pkg/version/version index 1af39b3..d609fec 100644 --- a/pkg/version/version +++ b/pkg/version/version @@ -1 +1 @@ -v0.12.3 \ No newline at end of file +v0.13.1 \ No newline at end of file