simplify nip-42.

This commit is contained in:
fiatjaf 2023-12-16 11:21:49 -03:00
parent bf31f2eba3
commit 2ac69278ce
No known key found for this signature in database
GPG Key ID: BAD43C4BE5C1A3A1
2 changed files with 12 additions and 40 deletions

View File

@ -1,26 +1,14 @@
import 'websocket-polyfill' import 'websocket-polyfill'
import { finishEvent } from './event.ts' import { makeAuthEvent } from './nip42.ts'
import { generatePrivateKey } from './keys.ts'
import { authenticate } from './nip42.ts'
import { relayInit } from './relay.ts' import { relayInit } from './relay.ts'
test('auth flow', () => { test('auth flow', () => {
const relay = relayInit('wss://nostr.kollider.xyz') const relay = relayInit('wss://nostr.wine')
relay.connect()
const sk = generatePrivateKey()
return new Promise<void>(resolve => { const auth = makeAuthEvent(relay.url, 'chachacha')
relay.on('auth', async challenge => { expect(auth.tags).toHaveLength(2)
await expect( expect(auth.tags[0]).toEqual(['relay', 'wss://nostr.wine'])
authenticate({ expect(auth.tags[1]).toEqual(['challenge', 'chachacha'])
challenge, expect(auth.kind).toEqual(22242)
relay,
sign: e => finishEvent(e, sk),
}),
).rejects.toBeTruthy()
relay.close()
resolve()
})
})
}) })

View File

@ -1,33 +1,17 @@
import { type EventTemplate, type Event } from './event.ts' import { EventTemplate } from './event.ts'
import { ClientAuth } from './kinds.ts' import { ClientAuth } from './kinds.ts'
import { Relay } from './relay.ts'
/** /**
* Authenticate via NIP-42 flow. * creates an EventTemplate for an AUTH event to be signed.
*
* @example
* const sign = window.nostr.signEvent
* relay.on('auth', challenge =>
* authenticate({ relay, sign, challenge })
* )
*/ */
export const authenticate = async ({ export function makeAuthEvent(relayURL: string, challenge: string): EventTemplate {
challenge, return {
relay,
sign,
}: {
challenge: string
relay: Relay
sign: (e: EventTemplate) => Promise<Event> | Event
}): Promise<void> => {
const evt: EventTemplate = {
kind: ClientAuth, kind: ClientAuth,
created_at: Math.floor(Date.now() / 1000), created_at: Math.floor(Date.now() / 1000),
tags: [ tags: [
['relay', relay.url], ['relay', relayURL],
['challenge', challenge], ['challenge', challenge],
], ],
content: '', content: '',
} }
return relay.auth(await sign(evt))
} }