feat: nreq

This commit is contained in:
2023-11-10 13:58:27 +00:00
parent b765cb29b7
commit 04a49755e6
5 changed files with 56 additions and 6 deletions

View File

@ -12,6 +12,7 @@ export const enum NostrPrefix {
Event = "nevent",
Relay = "nrelay",
Address = "naddr",
Req = "nreq",
}
export enum TLVEntryType {
@ -54,7 +55,9 @@ export function encodeTLVEntries(prefix: NostrPrefix, ...entries: Array<TLVEntry
switch (v.type) {
case TLVEntryType.Special: {
const buf =
prefix === NostrPrefix.Address ? enc.encode(v.value as string) : utils.hexToBytes(v.value as string);
prefix === NostrPrefix.Address || prefix === NostrPrefix.Req
? enc.encode(v.value as string)
: utils.hexToBytes(v.value as string);
buffers.push(0, buf.length, ...buf);
break;
}
@ -101,8 +104,8 @@ export function decodeTLV(str: string) {
function decodeTLVEntry(type: TLVEntryType, prefix: string, data: Uint8Array) {
switch (type) {
case TLVEntryType.Special: {
if (prefix === NostrPrefix.Address) {
return new TextDecoder("ASCII").decode(data);
if (prefix === NostrPrefix.Address || prefix === NostrPrefix.Req) {
return new TextDecoder().decode(data);
} else {
return utils.bytesToHex(data);
}
@ -114,7 +117,7 @@ function decodeTLVEntry(type: TLVEntryType, prefix: string, data: Uint8Array) {
return new Uint32Array(new Uint8Array(data.reverse()).buffer)[0];
}
case TLVEntryType.Relay: {
return new TextDecoder("ASCII").decode(data);
return new TextDecoder().decode(data);
}
}
}

View File

@ -237,7 +237,7 @@ export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLin
let entity = link.startsWith("web+nostr:") || link.startsWith("nostr:") ? link.split(":")[1] : link;
// trim any non-bech32 chars
entity = entity.match(/(n(?:pub|profile|event|ote|addr)1[acdefghjklmnpqrstuvwxyz023456789]+)/)?.[0] ?? entity;
entity = entity.match(/(n(?:pub|profile|event|ote|addr|req)1[acdefghjklmnpqrstuvwxyz023456789]+)/)?.[0] ?? entity;
const isPrefix = (prefix: NostrPrefix) => {
return entity.startsWith(prefix);
@ -251,7 +251,12 @@ export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLin
const id = bech32ToHex(entity);
if (id.length !== 64) throw new Error("Invalid nostr link, must contain 32 byte id");
return new NostrLink(NostrPrefix.Note, id);
} else if (isPrefix(NostrPrefix.Profile) || isPrefix(NostrPrefix.Event) || isPrefix(NostrPrefix.Address)) {
} else if (
isPrefix(NostrPrefix.Profile) ||
isPrefix(NostrPrefix.Event) ||
isPrefix(NostrPrefix.Address) ||
isPrefix(NostrPrefix.Req)
) {
const decoded = decodeTLV(entity);
const id = decoded.find(a => a.type === TLVEntryType.Special)?.value as string;
@ -267,6 +272,8 @@ export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLin
return new NostrLink(NostrPrefix.Event, id, kind, author, relays);
} else if (isPrefix(NostrPrefix.Address)) {
return new NostrLink(NostrPrefix.Address, id, kind, author, relays);
} else if (isPrefix(NostrPrefix.Req)) {
return new NostrLink(NostrPrefix.Req, id);
}
} else if (prefixHint) {
return new NostrLink(prefixHint, link);