68 lines
2.5 KiB
TypeScript
68 lines
2.5 KiB
TypeScript
import { assertEquals } from '@std/assert'
|
|
import {
|
|
extractReadRelays,
|
|
type RelayListLoader,
|
|
loadReadRelays,
|
|
normalizeRelayUrl,
|
|
} from '../src/core/relays.ts'
|
|
import type { SignedEvent } from '../src/core/types.ts'
|
|
|
|
const KIND_10002: SignedEvent = {
|
|
id: 'r', pubkey: 'P', created_at: 1, kind: 10002, sig: 's', content: '',
|
|
tags: [
|
|
['r', 'wss://relay.damus.io'],
|
|
['r', 'wss://nos.lol', 'read'],
|
|
['r', 'wss://relay.write-only.example', 'write'],
|
|
],
|
|
}
|
|
|
|
Deno.test('extractReadRelays: ohne marker = read+write, "read" = read, "write" = nicht', () => {
|
|
assertEquals(extractReadRelays(KIND_10002), [
|
|
'wss://relay.damus.io',
|
|
'wss://nos.lol',
|
|
])
|
|
})
|
|
|
|
Deno.test('loadReadRelays: nutzt fallback wenn kein kind:10002', async () => {
|
|
const loader: RelayListLoader = async () => undefined
|
|
const relays = await loadReadRelays('wss://bootstrap', 'P', loader, [
|
|
'wss://fallback1', 'wss://fallback2',
|
|
])
|
|
assertEquals(relays, ['wss://fallback1', 'wss://fallback2'])
|
|
})
|
|
|
|
Deno.test('loadReadRelays: kind:10002-relays stehen vorn, fallback haengt an', async () => {
|
|
const loader: RelayListLoader = async () => KIND_10002
|
|
const relays = await loadReadRelays('wss://bootstrap', 'P', loader, ['wss://fallback'])
|
|
assertEquals(relays, ['wss://relay.damus.io', 'wss://nos.lol', 'wss://fallback'])
|
|
})
|
|
|
|
Deno.test('normalizeRelayUrl: trailing slash und case werden vereinheitlicht', () => {
|
|
assertEquals(normalizeRelayUrl('wss://NOS.lol/'), 'wss://nos.lol')
|
|
assertEquals(normalizeRelayUrl('wss://nos.lol'), 'wss://nos.lol')
|
|
assertEquals(normalizeRelayUrl(' wss://nos.lol/ '), 'wss://nos.lol')
|
|
})
|
|
|
|
Deno.test('loadReadRelays: union aus kind:10002 UND fallback', async () => {
|
|
// Regression fuer den 404 von protocol-anthropology: das event lag nur auf
|
|
// einem relay, das je nach codepfad nicht abgefragt wurde. Union statt
|
|
// entweder-oder.
|
|
const loader: RelayListLoader = async () => KIND_10002
|
|
const relays = await loadReadRelays('wss://bootstrap', 'P', loader, [
|
|
'wss://relay.primal.net',
|
|
'wss://nos.lol',
|
|
])
|
|
assertEquals(relays, [
|
|
'wss://relay.damus.io',
|
|
'wss://nos.lol',
|
|
'wss://relay.primal.net',
|
|
])
|
|
})
|
|
|
|
Deno.test('loadReadRelays: union dedupliziert ueber normalisierung', async () => {
|
|
const withSlash: SignedEvent = { ...KIND_10002, tags: [['r', 'wss://nos.lol/']] }
|
|
const loader: RelayListLoader = async () => withSlash
|
|
const relays = await loadReadRelays('wss://bootstrap', 'P', loader, ['wss://nos.lol'])
|
|
assertEquals(relays, ['wss://nos.lol'])
|
|
})
|