Compare commits

...

5 Commits

Author SHA1 Message Date
fiatjaf
75df47421f v2.1.1 2023-12-26 07:57:36 -03:00
fiatjaf
1cfe705baf auth() returns a promise that resolves on OK.
fixes https://github.com/nbd-wtf/nostr-tools/issues/336
2023-12-26 07:56:55 -03:00
fiatjaf
566437fe2e nip19: length 0 on TLV is not forbidden. 2023-12-26 07:56:55 -03:00
fiatjaf
5d6c2b9e5d nip19: reverse TLV ordering just to keep other implementations honest. 2023-12-26 07:56:55 -03:00
jiftechnify
a43f2a708c fix problem when required from CommonJS 2023-12-23 08:31:39 -03:00
5 changed files with 50 additions and 27 deletions

View File

@@ -1,6 +1,6 @@
/* global WebSocket */ /* global WebSocket */
import type { Event, EventTemplate, Nostr } from './core.ts' import type { Event, EventTemplate, VerifiedEvent, Nostr } from './core.ts'
import { matchFilters, type Filter } from './filter.ts' import { matchFilters, type Filter } from './filter.ts'
import { getHex64, getSubscriptionId } from './fakejson.ts' import { getHex64, getSubscriptionId } from './fakejson.ts'
import { Queue, normalizeURL } from './utils.ts' import { Queue, normalizeURL } from './utils.ts'
@@ -218,11 +218,14 @@ export class AbstractRelay {
}) })
} }
public async auth(signAuthEvent: (authEvent: EventTemplate) => Promise<void>) { public async auth(signAuthEvent: (evt: EventTemplate) => Promise<VerifiedEvent>) {
if (!this.challenge) throw new Error("can't perform auth, no challenge was received") if (!this.challenge) throw new Error("can't perform auth, no challenge was received")
const evt = makeAuthEvent(this.url, this.challenge) const evt = await signAuthEvent(makeAuthEvent(this.url, this.challenge))
await signAuthEvent(evt) const ret = new Promise<string>((resolve, reject) => {
this.openEventPublishes.set(evt.id, { resolve, reject })
})
this.send('["AUTH",' + JSON.stringify(evt) + ']') this.send('["AUTH",' + JSON.stringify(evt) + ']')
return ret
} }
public async publish(event: Event): Promise<string> { public async publish(event: Event): Promise<string> {

View File

@@ -28,12 +28,7 @@ esbuild
format: 'esm', format: 'esm',
packages: 'external', packages: 'external',
}) })
.then(() => { .then(() => console.log('esm build success.'))
const packageJson = JSON.stringify({ type: 'module' })
fs.writeFileSync(`${__dirname}/lib/esm/package.json`, packageJson, 'utf8')
console.log('esm build success.')
})
esbuild esbuild
.build({ .build({
@@ -42,7 +37,12 @@ esbuild
format: 'cjs', format: 'cjs',
packages: 'external', packages: 'external',
}) })
.then(() => console.log('cjs build success.')) .then(() => {
const packageJson = JSON.stringify({ type: 'commonjs' })
fs.writeFileSync(`${__dirname}/lib/cjs/package.json`, packageJson, 'utf8')
console.log('cjs build success.')
})
esbuild esbuild
.build({ .build({

View File

@@ -78,13 +78,13 @@ test('encode and decode naddr', () => {
test('encode and decode nevent', () => { test('encode and decode nevent', () => {
let pk = getPublicKey(generateSecretKey()) let pk = getPublicKey(generateSecretKey())
let relays = ['wss://relay.nostr.example.mydomain.example.com', 'wss://nostr.banana.com'] let relays = ['wss://relay.nostr.example.mydomain.example.com', 'wss://nostr.banana.com']
let naddr = neventEncode({ let nevent = neventEncode({
id: pk, id: pk,
relays, relays,
kind: 30023, kind: 30023,
}) })
expect(naddr).toMatch(/nevent1\w+/) expect(nevent).toMatch(/nevent1\w+/)
let { type, data } = decode(naddr) let { type, data } = decode(nevent)
expect(type).toEqual('nevent') expect(type).toEqual('nevent')
const pointer = data as EventPointer const pointer = data as EventPointer
expect(pointer.id).toEqual(pk) expect(pointer.id).toEqual(pk)
@@ -95,13 +95,13 @@ test('encode and decode nevent', () => {
test('encode and decode nevent with kind 0', () => { test('encode and decode nevent with kind 0', () => {
let pk = getPublicKey(generateSecretKey()) let pk = getPublicKey(generateSecretKey())
let relays = ['wss://relay.nostr.example.mydomain.example.com', 'wss://nostr.banana.com'] let relays = ['wss://relay.nostr.example.mydomain.example.com', 'wss://nostr.banana.com']
let naddr = neventEncode({ let nevent = neventEncode({
id: pk, id: pk,
relays, relays,
kind: 0, kind: 0,
}) })
expect(naddr).toMatch(/nevent1\w+/) expect(nevent).toMatch(/nevent1\w+/)
let { type, data } = decode(naddr) let { type, data } = decode(nevent)
expect(type).toEqual('nevent') expect(type).toEqual('nevent')
const pointer = data as EventPointer const pointer = data as EventPointer
expect(pointer.id).toEqual(pk) expect(pointer.id).toEqual(pk)
@@ -109,6 +109,25 @@ test('encode and decode nevent with kind 0', () => {
expect(pointer.kind).toEqual(0) expect(pointer.kind).toEqual(0)
}) })
test('encode and decode naddr with empty "d"', () => {
let pk = getPublicKey(generateSecretKey())
let relays = ['wss://relay.nostr.example.mydomain.example.com', 'wss://nostr.banana.com']
let naddr = naddrEncode({
identifier: '',
pubkey: pk,
relays,
kind: 3,
})
expect(naddr).toMatch(/naddr\w+/)
let { type, data } = decode(naddr)
expect(type).toEqual('naddr')
const pointer = data as AddressPointer
expect(pointer.identifier).toEqual('')
expect(pointer.relays).toContain(relays[0])
expect(pointer.kind).toEqual(3)
expect(pointer.pubkey).toEqual(pk)
})
test('decode naddr from habla.news', () => { test('decode naddr from habla.news', () => {
let { type, data } = decode( let { type, data } = decode(
'naddr1qq98yetxv4ex2mnrv4esygrl54h466tz4v0re4pyuavvxqptsejl0vxcmnhfl60z3rth2xkpjspsgqqqw4rsf34vl5', 'naddr1qq98yetxv4ex2mnrv4esygrl54h466tz4v0re4pyuavvxqptsejl0vxcmnhfl60z3rth2xkpjspsgqqqw4rsf34vl5',

View File

@@ -149,7 +149,6 @@ function parseTLV(data: Uint8Array): TLV {
while (rest.length > 0) { while (rest.length > 0) {
let t = rest[0] let t = rest[0]
let l = rest[1] let l = rest[1]
if (!l) throw new Error(`malformed TLV ${t}`)
let v = rest.slice(2, 2 + l) let v = rest.slice(2, 2 + l)
rest = rest.slice(2 + l) rest = rest.slice(2 + l)
if (v.length < l) throw new Error(`not enough data to read on TLV ${t}`) if (v.length < l) throw new Error(`not enough data to read on TLV ${t}`)
@@ -227,7 +226,9 @@ export function nrelayEncode(url: string): `nrelay1${string}` {
function encodeTLV(tlv: TLV): Uint8Array { function encodeTLV(tlv: TLV): Uint8Array {
let entries: Uint8Array[] = [] let entries: Uint8Array[] = []
Object.entries(tlv).forEach(([t, vs]) => { Object.entries(tlv)
.reverse()
.forEach(([t, vs]) => {
vs.forEach(v => { vs.forEach(v => {
let entry = new Uint8Array(v.length + 2) let entry = new Uint8Array(v.length + 2)
entry.set([parseInt(t)], 0) entry.set([parseInt(t)], 0)

View File

@@ -1,7 +1,7 @@
{ {
"type": "module", "type": "module",
"name": "nostr-tools", "name": "nostr-tools",
"version": "2.1.0", "version": "2.1.1",
"description": "Tools for making a Nostr client.", "description": "Tools for making a Nostr client.",
"repository": { "repository": {
"type": "git", "type": "git",