Add kind to nevent decode and encode (#304)

This commit is contained in:
Sherry
2023-09-26 23:20:17 +08:00
committed by GitHub
parent 6874f58c0a
commit c73268c4e2
4 changed files with 169 additions and 209 deletions

View File

@@ -11,6 +11,19 @@ const Bech32MaxSize = 5000
*/
export const BECH32_REGEX = /[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/
function integerToUint8Array(number: number) {
// Create a Uint8Array with enough space to hold a 32-bit integer (4 bytes).
const uint8Array = new Uint8Array(4)
// Use bitwise operations to extract the bytes.
uint8Array[0] = (number >> 24) & 0xff // Most significant byte (MSB)
uint8Array[1] = (number >> 16) & 0xff
uint8Array[2] = (number >> 8) & 0xff
uint8Array[3] = number & 0xff // Least significant byte (LSB)
return uint8Array
}
export type ProfilePointer = {
pubkey: string // hex
relays?: string[]
@@ -20,6 +33,7 @@ export type EventPointer = {
id: string // hex
relays?: string[]
author?: string
kind?: number
}
export type AddressPointer = {
@@ -73,6 +87,7 @@ export function decode(nip19: string): DecodeResult {
if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nevent')
if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')
if (tlv[2] && tlv[2][0].length !== 32) throw new Error('TLV 2 should be 32 bytes')
if (tlv[3] && tlv[3][0].length !== 4) throw new Error('TLV 3 should be 4 bytes')
return {
type: 'nevent',
@@ -80,6 +95,7 @@ export function decode(nip19: string): DecodeResult {
id: bytesToHex(tlv[0][0]),
relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],
author: tlv[2]?.[0] ? bytesToHex(tlv[2][0]) : undefined,
kind: tlv[3]?.[0] ? parseInt(bytesToHex(tlv[3][0]), 16) : undefined,
},
}
}
@@ -172,11 +188,18 @@ export function nprofileEncode(profile: ProfilePointer): `nprofile1${string}` {
}
export function neventEncode(event: EventPointer): `nevent1${string}` {
let kindArray
if (event.kind != undefined) {
kindArray = integerToUint8Array(event.kind)
}
let data = encodeTLV({
0: [hexToBytes(event.id)],
1: (event.relays || []).map(url => utf8Encoder.encode(url)),
2: event.author ? [hexToBytes(event.author)] : [],
3: kindArray ? [new Uint8Array(kindArray)] : [],
})
return encodeBech32('nevent', data)
}