From e858698cb9578d4637ed93f5e5fd68705e81c709 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 12 Apr 2024 17:45:23 -0500 Subject: [PATCH] Add stable sortEvents function --- core.test.ts | 19 +++++++++++++++++++ core.ts | 14 ++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 core.test.ts diff --git a/core.test.ts b/core.test.ts new file mode 100644 index 0000000..7271f80 --- /dev/null +++ b/core.test.ts @@ -0,0 +1,19 @@ +import { test, expect } from 'bun:test' + +import { sortEvents } from './core.ts' + +test('sortEvents', () => { + const events = [ + { id: 'abc123', pubkey: 'key1', created_at: 1610000000, kind: 1, tags: [], content: 'Hello', sig: 'sig1' }, + { id: 'abc124', pubkey: 'key2', created_at: 1620000000, kind: 1, tags: [], content: 'World', sig: 'sig2' }, + { id: 'abc125', pubkey: 'key3', created_at: 1620000000, kind: 1, tags: [], content: '!', sig: 'sig3' }, + ] + + const sortedEvents = sortEvents(events) + + expect(sortedEvents).toEqual([ + { id: 'abc124', pubkey: 'key2', created_at: 1620000000, kind: 1, tags: [], content: 'World', sig: 'sig2' }, + { id: 'abc125', pubkey: 'key3', created_at: 1620000000, kind: 1, tags: [], content: '!', sig: 'sig3' }, + { id: 'abc123', pubkey: 'key1', created_at: 1610000000, kind: 1, tags: [], content: 'Hello', sig: 'sig1' }, + ]) +}) diff --git a/core.ts b/core.ts index d8be6aa..a92b824 100644 --- a/core.ts +++ b/core.ts @@ -49,3 +49,17 @@ export function validateEvent(event: T): event is T & UnsignedEvent { return true } + +/** + * Sort events in reverse-chronological order by the `created_at` timestamp, + * and then by the event `id` (lexicographically) in case of ties. + * This mutates the array. + */ +export function sortEvents(events: Event[]): Event[] { + return events.sort((a: NostrEvent, b: NostrEvent): number => { + if (a.created_at !== b.created_at) { + return b.created_at - a.created_at + } + return a.id.localeCompare(b.id) + }) +}