nostr-tools 1.7.1 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -11
- package/lib/esm/nostr.mjs +8 -1
- package/lib/esm/nostr.mjs.map +2 -2
- package/lib/event.d.ts +42 -0
- package/lib/fakejson.d.ts +6 -0
- package/lib/filter.d.ts +16 -0
- package/lib/index.d.ts +13 -0
- package/lib/keys.d.ts +2 -0
- package/lib/nip04.d.ts +2 -0
- package/lib/nip05.d.ts +6 -0
- package/lib/nip06.d.ts +3 -0
- package/lib/nip19.d.ts +24 -0
- package/lib/nip26.d.ts +15 -0
- package/lib/nip57.d.ts +17 -0
- package/lib/nostr.bundle.js +8 -1
- package/lib/nostr.bundle.js.map +2 -2
- package/lib/nostr.cjs.js +8 -1
- package/lib/nostr.cjs.js.map +2 -2
- package/lib/pool.d.ts +21 -0
- package/lib/relay.d.ts +35 -0
- package/lib/utils.d.ts +6 -0
- package/package.json +6 -2
- package/.eslintrc.json +0 -157
- package/.github/workflows/npm-publish.yml +0 -22
- package/.github/workflows/test.yml +0 -19
- package/.prettierrc.yaml +0 -10
- package/build.js +0 -47
- package/event.test.js +0 -48
- package/event.ts +0 -112
- package/fakejson.test.js +0 -49
- package/fakejson.ts +0 -41
- package/filter.test.js +0 -42
- package/filter.ts +0 -50
- package/index.ts +0 -24
- package/justfile +0 -16
- package/keys.test.js +0 -20
- package/keys.ts +0 -9
- package/nip04.test.js +0 -15
- package/nip04.ts +0 -66
- package/nip05.test.js +0 -20
- package/nip05.ts +0 -54
- package/nip06.test.js +0 -15
- package/nip06.ts +0 -23
- package/nip19.test.js +0 -70
- package/nip19.ts +0 -170
- package/nip26.test.js +0 -105
- package/nip26.ts +0 -90
- package/nip57.ts +0 -138
- package/pool.test.js +0 -133
- package/pool.ts +0 -192
- package/relay.test.js +0 -140
- package/relay.ts +0 -320
- package/tsconfig.json +0 -15
- package/utils.test.js +0 -183
- package/utils.ts +0 -111
package/README.md
CHANGED
|
@@ -10,7 +10,6 @@ Only depends on _@scure_ and _@noble_ packages.
|
|
|
10
10
|
npm install nostr-tools # or yarn add nostr-tools
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
14
13
|
## Usage
|
|
15
14
|
|
|
16
15
|
### Generating a private key and a public key
|
|
@@ -138,11 +137,16 @@ const pool = new SimplePool()
|
|
|
138
137
|
|
|
139
138
|
let relays = ['wss://relay.example.com', 'wss://relay.example2.com']
|
|
140
139
|
|
|
141
|
-
let
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
let sub = pool.sub(
|
|
141
|
+
[...relays, 'wss://relay.example3.com'],
|
|
142
|
+
[
|
|
143
|
+
{
|
|
144
|
+
authors: [
|
|
145
|
+
'32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245'
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
)
|
|
146
150
|
|
|
147
151
|
sub.on('event', event => {
|
|
148
152
|
// this will only be called once the first time the event is received
|
|
@@ -150,11 +154,10 @@ sub.on('event', event => {
|
|
|
150
154
|
})
|
|
151
155
|
|
|
152
156
|
let pubs = pool.publish(relays, newEvent)
|
|
153
|
-
pubs.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
)
|
|
157
|
+
pubs.on('ok', () => {
|
|
158
|
+
// this may be called multiple times, once for every relay that accepts the event
|
|
159
|
+
// ...
|
|
160
|
+
})
|
|
158
161
|
|
|
159
162
|
let events = await pool.list(relays, [{kinds: [0, 1]}])
|
|
160
163
|
let event = await pool.get(relays, {
|
package/lib/esm/nostr.mjs
CHANGED
|
@@ -168,6 +168,8 @@ function getEventHash(event) {
|
|
|
168
168
|
function validateEvent(event) {
|
|
169
169
|
if (typeof event !== "object")
|
|
170
170
|
return false;
|
|
171
|
+
if (typeof event.kind !== "number")
|
|
172
|
+
return false;
|
|
171
173
|
if (typeof event.content !== "string")
|
|
172
174
|
return false;
|
|
173
175
|
if (typeof event.created_at !== "number")
|
|
@@ -768,7 +770,12 @@ async function queryProfile(fullname) {
|
|
|
768
770
|
}
|
|
769
771
|
if (!name.match(/^[A-Za-z0-9-_]+$/))
|
|
770
772
|
return null;
|
|
771
|
-
let res
|
|
773
|
+
let res;
|
|
774
|
+
try {
|
|
775
|
+
res = await (await _fetch(`https://${domain}/.well-known/nostr.json?name=${name}`)).json();
|
|
776
|
+
} catch (err) {
|
|
777
|
+
return null;
|
|
778
|
+
}
|
|
772
779
|
if (!res?.names?.[name])
|
|
773
780
|
return null;
|
|
774
781
|
let pubkey = res.names[name];
|
package/lib/esm/nostr.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../keys.ts", "../../event.ts", "../../utils.ts", "../../filter.ts", "../../fakejson.ts", "../../relay.ts", "../../pool.ts", "../../nip04.ts", "../../nip05.ts", "../../nip06.ts", "../../nip19.ts", "../../nip26.ts", "../../nip57.ts", "../../index.ts"],
|
|
4
|
-
"sourcesContent": ["import * as secp256k1 from '@noble/secp256k1'\n\nexport function generatePrivateKey(): string {\n return secp256k1.utils.bytesToHex(secp256k1.utils.randomPrivateKey())\n}\n\nexport function getPublicKey(privateKey: string): string {\n return secp256k1.utils.bytesToHex(secp256k1.schnorr.getPublicKey(privateKey))\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {sha256} from '@noble/hashes/sha256'\n\nimport {utf8Encoder} from './utils'\nimport {getPublicKey} from './keys'\n\n/* eslint-disable no-unused-vars */\nexport enum Kind {\n Metadata = 0,\n Text = 1,\n RecommendRelay = 2,\n Contacts = 3,\n EncryptedDirectMessage = 4,\n EventDeletion = 5,\n Reaction = 7,\n ChannelCreation = 40,\n ChannelMetadata = 41,\n ChannelMessage = 42,\n ChannelHideMessage = 43,\n ChannelMuteUser = 44,\n Report = 1984,\n ZapRequest = 9734,\n Zap = 9735,\n RelayList = 10002,\n ClientAuth = 22242,\n Article = 30023\n}\n\nexport type EventTemplate = {\n kind: Kind\n tags: string[][]\n content: string\n created_at: number\n}\n\nexport type UnsignedEvent = EventTemplate & {\n pubkey: string\n}\n\nexport type Event = UnsignedEvent & {\n id: string\n sig: string\n}\n\nexport function getBlankEvent(): EventTemplate {\n return {\n kind: 255,\n content: '',\n tags: [],\n created_at: 0\n }\n}\n\nexport function finishEvent(t: EventTemplate, privateKey: string): Event {\n let event = t as Event\n event.pubkey = getPublicKey(privateKey)\n event.id = getEventHash(event)\n event.sig = signEvent(event, privateKey)\n return event\n}\n\nexport function serializeEvent(evt: UnsignedEvent): string {\n if (!validateEvent(evt))\n throw new Error(\"can't serialize event with wrong or missing properties\")\n\n return JSON.stringify([\n 0,\n evt.pubkey,\n evt.created_at,\n evt.kind,\n evt.tags,\n evt.content\n ])\n}\n\nexport function getEventHash(event: UnsignedEvent): string {\n let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)))\n return secp256k1.utils.bytesToHex(eventHash)\n}\n\nexport function validateEvent(event: UnsignedEvent): boolean {\n if (typeof event !== 'object') return false\n if (typeof event.content !== 'string') return false\n if (typeof event.created_at !== 'number') return false\n if (typeof event.pubkey !== 'string') return false\n if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false\n\n if (!Array.isArray(event.tags)) return false\n for (let i = 0; i < event.tags.length; i++) {\n let tag = event.tags[i]\n if (!Array.isArray(tag)) return false\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] === 'object') return false\n }\n }\n\n return true\n}\n\nexport function verifySignature(event: Event & {sig: string}): boolean {\n return secp256k1.schnorr.verifySync(\n event.sig,\n getEventHash(event),\n event.pubkey\n )\n}\n\nexport function signEvent(event: UnsignedEvent, key: string): string {\n return secp256k1.utils.bytesToHex(\n secp256k1.schnorr.signSync(getEventHash(event), key)\n )\n}\n", "import {Event} from './event'\n\nexport const utf8Decoder = new TextDecoder('utf-8')\nexport const utf8Encoder = new TextEncoder()\n\nexport function normalizeURL(url: string): string {\n let p = new URL(url)\n p.pathname = p.pathname.replace(/\\/+/g, '/')\n if (p.pathname.endsWith('/')) p.pathname = p.pathname.slice(0, -1)\n if (\n (p.port === '80' && p.protocol === 'ws:') ||\n (p.port === '443' && p.protocol === 'wss:')\n )\n p.port = ''\n p.searchParams.sort()\n p.hash = ''\n return p.toString()\n}\n\n//\n// fast insert-into-sorted-array functions adapted from https://github.com/terrymorse58/fast-sorted-array\n//\nexport function insertEventIntoDescendingList(\n sortedArray: Event[],\n event: Event\n) {\n let start = 0\n let end = sortedArray.length - 1\n let midPoint\n let position = start\n\n if (end < 0) {\n position = 0\n } else if (event.created_at < sortedArray[end].created_at) {\n position = end + 1\n } else if (event.created_at >= sortedArray[start].created_at) {\n position = start\n } else\n while (true) {\n if (end <= start + 1) {\n position = end\n break\n }\n midPoint = Math.floor(start + (end - start) / 2)\n if (sortedArray[midPoint].created_at > event.created_at) {\n start = midPoint\n } else if (sortedArray[midPoint].created_at < event.created_at) {\n end = midPoint\n } else {\n // aMidPoint === num\n position = midPoint\n break\n }\n }\n\n // insert when num is NOT already in (no duplicates)\n if (sortedArray[position]?.id !== event.id) {\n return [\n ...sortedArray.slice(0, position),\n event,\n ...sortedArray.slice(position)\n ]\n }\n\n return sortedArray\n}\n\nexport function insertEventIntoAscendingList(\n sortedArray: Event[],\n event: Event\n) {\n let start = 0\n let end = sortedArray.length - 1\n let midPoint\n let position = start\n\n if (end < 0) {\n position = 0\n } else if (event.created_at > sortedArray[end].created_at) {\n position = end + 1\n } else if (event.created_at <= sortedArray[start].created_at) {\n position = start\n } else\n while (true) {\n if (end <= start + 1) {\n position = end\n break\n }\n midPoint = Math.floor(start + (end - start) / 2)\n if (sortedArray[midPoint].created_at < event.created_at) {\n start = midPoint\n } else if (sortedArray[midPoint].created_at > event.created_at) {\n end = midPoint\n } else {\n // aMidPoint === num\n position = midPoint\n break\n }\n }\n\n // insert when num is NOT already in (no duplicates)\n if (sortedArray[position]?.id !== event.id) {\n return [\n ...sortedArray.slice(0, position),\n event,\n ...sortedArray.slice(position)\n ]\n }\n\n return sortedArray\n}\n", "import {Event} from './event'\n\nexport type Filter = {\n ids?: string[]\n kinds?: number[]\n authors?: string[]\n since?: number\n until?: number\n limit?: number\n [key: `#${string}`]: string[]\n}\n\nexport function matchFilter(\n filter: Filter,\n event: Event & {id: string}\n): boolean {\n if (filter.ids && filter.ids.indexOf(event.id) === -1) return false\n if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) return false\n if (filter.authors && filter.authors.indexOf(event.pubkey) === -1)\n return false\n\n for (let f in filter) {\n if (f[0] === '#') {\n let tagName = f.slice(1)\n let values = filter[`#${tagName}`]\n if (\n values &&\n !event.tags.find(\n ([t, v]) => t === f.slice(1) && values.indexOf(v) !== -1\n )\n )\n return false\n }\n }\n\n if (filter.since && event.created_at < filter.since) return false\n if (filter.until && event.created_at >= filter.until) return false\n\n return true\n}\n\nexport function matchFilters(\n filters: Filter[],\n event: Event & {id: string}\n): boolean {\n for (let i = 0; i < filters.length; i++) {\n if (matchFilter(filters[i], event)) return true\n }\n return false\n}\n", "export function getHex64(json: string, field: string): string {\n let len = field.length + 3\n let idx = json.indexOf(`\"${field}\":`) + len\n let s = json.slice(idx).indexOf(`\"`) + idx + 1\n return json.slice(s, s + 64)\n}\n\nexport function getInt(json: string, field: string): number {\n let len = field.length\n let idx = json.indexOf(`\"${field}\":`) + len + 3\n let sliced = json.slice(idx)\n let end = Math.min(sliced.indexOf(','), sliced.indexOf('}'))\n return parseInt(sliced.slice(0, end), 10)\n}\n\nexport function getSubscriptionId(json: string): string | null {\n let idx = json.slice(0, 22).indexOf(`\"EVENT\"`)\n if (idx === -1) return null\n\n let pstart = json.slice(idx + 7 + 1).indexOf(`\"`)\n if (pstart === -1) return null\n let start = idx + 7 + 1 + pstart\n\n let pend = json.slice(start + 1, 80).indexOf(`\"`)\n if (pend === -1) return null\n let end = start + 1 + pend\n\n return json.slice(start + 1, end)\n}\n\nexport function matchEventId(json: string, id: string): boolean {\n return id === getHex64(json, 'id')\n}\n\nexport function matchEventPubkey(json: string, pubkey: string): boolean {\n return pubkey === getHex64(json, 'pubkey')\n}\n\nexport function matchEventKind(json: string, kind: number): boolean {\n return kind === getInt(json, 'kind')\n}\n", "/* global WebSocket */\n\nimport {Event, verifySignature, validateEvent} from './event'\nimport {Filter, matchFilters} from './filter'\nimport {getHex64, getSubscriptionId} from './fakejson'\n\ntype RelayEvent = 'connect' | 'disconnect' | 'error' | 'notice'\n\nexport type Relay = {\n url: string\n status: number\n connect: () => Promise<void>\n close: () => void\n sub: (filters: Filter[], opts?: SubscriptionOptions) => Sub\n list: (filters: Filter[], opts?: SubscriptionOptions) => Promise<Event[]>\n get: (filter: Filter, opts?: SubscriptionOptions) => Promise<Event | null>\n publish: (event: Event) => Pub\n on: (type: RelayEvent, cb: any) => void\n off: (type: RelayEvent, cb: any) => void\n}\nexport type Pub = {\n on: (type: 'ok' | 'failed', cb: any) => void\n off: (type: 'ok' | 'failed', cb: any) => void\n}\nexport type Sub = {\n sub: (filters: Filter[], opts: SubscriptionOptions) => Sub\n unsub: () => void\n on: (type: 'event' | 'eose', cb: any) => void\n off: (type: 'event' | 'eose', cb: any) => void\n}\n\nexport type SubscriptionOptions = {\n id?: string\n skipVerification?: boolean\n alreadyHaveEvent?: null | ((id: string, relay: string) => boolean)\n}\n\nexport function relayInit(\n url: string,\n options: {\n getTimeout?: number\n listTimeout?: number\n } = {}\n): Relay {\n let {listTimeout = 3000, getTimeout = 3000} = options\n\n var ws: WebSocket\n var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {}\n var listeners: {\n connect: Array<() => void>\n disconnect: Array<() => void>\n error: Array<() => void>\n notice: Array<(msg: string) => void>\n } = {\n connect: [],\n disconnect: [],\n error: [],\n notice: []\n }\n var subListeners: {\n [subid: string]: {\n event: Array<(event: Event) => void>\n eose: Array<() => void>\n }\n } = {}\n var pubListeners: {\n [eventid: string]: {\n ok: Array<() => void>\n seen: Array<() => void>\n failed: Array<(reason: string) => void>\n }\n } = {}\n\n async function connectRelay(): Promise<void> {\n return new Promise((resolve, reject) => {\n ws = new WebSocket(url)\n\n ws.onopen = () => {\n listeners.connect.forEach(cb => cb())\n resolve()\n }\n ws.onerror = () => {\n listeners.error.forEach(cb => cb())\n reject()\n }\n ws.onclose = async () => {\n listeners.disconnect.forEach(cb => cb())\n }\n\n let incomingMessageQueue: string[] = []\n let handleNextInterval: any\n\n ws.onmessage = e => {\n incomingMessageQueue.push(e.data)\n if (!handleNextInterval) {\n handleNextInterval = setInterval(handleNext, 0)\n }\n }\n\n function handleNext() {\n if (incomingMessageQueue.length === 0) {\n clearInterval(handleNextInterval)\n handleNextInterval = null\n return\n }\n\n var json = incomingMessageQueue.shift()\n if (!json) return\n\n let subid = getSubscriptionId(json)\n if (subid) {\n let so = openSubs[subid]\n if (\n so &&\n so.alreadyHaveEvent &&\n so.alreadyHaveEvent(getHex64(json, 'id'), url)\n ) {\n return\n }\n }\n\n try {\n let data = JSON.parse(json)\n\n // we won't do any checks against the data since all failures (i.e. invalid messages from relays)\n // will naturally be caught by the encompassing try..catch block\n\n switch (data[0]) {\n case 'EVENT':\n let id = data[1]\n let event = data[2]\n if (\n validateEvent(event) &&\n openSubs[id] &&\n (openSubs[id].skipVerification || verifySignature(event)) &&\n matchFilters(openSubs[id].filters, event)\n ) {\n openSubs[id]\n ;(subListeners[id]?.event || []).forEach(cb => cb(event))\n }\n return\n case 'EOSE': {\n let id = data[1]\n if (id in subListeners) {\n subListeners[id].eose.forEach(cb => cb())\n subListeners[id].eose = [] // 'eose' only happens once per sub, so stop listeners here\n }\n return\n }\n case 'OK': {\n let id: string = data[1]\n let ok: boolean = data[2]\n let reason: string = data[3] || ''\n if (id in pubListeners) {\n if (ok) pubListeners[id].ok.forEach(cb => cb())\n else pubListeners[id].failed.forEach(cb => cb(reason))\n pubListeners[id].ok = [] // 'ok' only happens once per pub, so stop listeners here\n pubListeners[id].failed = []\n }\n return\n }\n case 'NOTICE':\n let notice = data[1]\n listeners.notice.forEach(cb => cb(notice))\n return\n }\n } catch (err) {\n return\n }\n }\n })\n }\n\n function connected() {\n return ws?.readyState === 1\n }\n\n async function connect(): Promise<void> {\n if (connected()) return // ws already open\n await connectRelay()\n }\n\n async function trySend(params: [string, ...any]) {\n let msg = JSON.stringify(params)\n if (!connected()) {\n await new Promise(resolve => setTimeout(resolve, 1000))\n if (!connected()) {\n return\n }\n }\n try {\n ws.send(msg)\n } catch (err) {\n console.log(err)\n }\n }\n\n const sub = (\n filters: Filter[],\n {\n skipVerification = false,\n alreadyHaveEvent = null,\n id = Math.random().toString().slice(2)\n }: SubscriptionOptions = {}\n ): Sub => {\n let subid = id\n\n openSubs[subid] = {\n id: subid,\n filters,\n skipVerification,\n alreadyHaveEvent\n }\n trySend(['REQ', subid, ...filters])\n\n return {\n sub: (newFilters, newOpts = {}) =>\n sub(newFilters || filters, {\n skipVerification: newOpts.skipVerification || skipVerification,\n alreadyHaveEvent: newOpts.alreadyHaveEvent || alreadyHaveEvent,\n id: subid\n }),\n unsub: () => {\n delete openSubs[subid]\n delete subListeners[subid]\n trySend(['CLOSE', subid])\n },\n on: (type: 'event' | 'eose', cb: any): void => {\n subListeners[subid] = subListeners[subid] || {\n event: [],\n eose: []\n }\n subListeners[subid][type].push(cb)\n },\n off: (type: 'event' | 'eose', cb: any): void => {\n let listeners = subListeners[subid]\n let idx = listeners[type].indexOf(cb)\n if (idx >= 0) listeners[type].splice(idx, 1)\n }\n }\n }\n\n return {\n url,\n sub,\n on: (type: RelayEvent, cb: any): void => {\n listeners[type].push(cb)\n if (type === 'connect' && ws?.readyState === 1) {\n cb()\n }\n },\n off: (type: RelayEvent, cb: any): void => {\n let index = listeners[type].indexOf(cb)\n if (index !== -1) listeners[type].splice(index, 1)\n },\n list: (filters: Filter[], opts?: SubscriptionOptions): Promise<Event[]> =>\n new Promise(resolve => {\n let s = sub(filters, opts)\n let events: Event[] = []\n let timeout = setTimeout(() => {\n s.unsub()\n resolve(events)\n }, listTimeout)\n s.on('eose', () => {\n s.unsub()\n clearTimeout(timeout)\n resolve(events)\n })\n s.on('event', (event: Event) => {\n events.push(event)\n })\n }),\n get: (filter: Filter, opts?: SubscriptionOptions): Promise<Event | null> =>\n new Promise(resolve => {\n let s = sub([filter], opts)\n let timeout = setTimeout(() => {\n s.unsub()\n resolve(null)\n }, getTimeout)\n s.on('event', (event: Event) => {\n s.unsub()\n clearTimeout(timeout)\n resolve(event)\n })\n }),\n publish(event: Event): Pub {\n if (!event.id) throw new Error(`event ${event} has no id`)\n let id = event.id\n\n trySend(['EVENT', event])\n\n return {\n on: (type: 'ok' | 'failed', cb: any) => {\n pubListeners[id] = pubListeners[id] || {\n ok: [],\n failed: []\n }\n pubListeners[id][type].push(cb)\n },\n off: (type: 'ok' | 'failed', cb: any) => {\n let listeners = pubListeners[id]\n if (!listeners) return\n let idx = listeners[type].indexOf(cb)\n if (idx >= 0) listeners[type].splice(idx, 1)\n }\n }\n },\n connect,\n close(): void {\n listeners = {connect: [], disconnect: [], error: [], notice: []}\n subListeners = {}\n pubListeners = {}\n\n ws?.close()\n },\n get status() {\n return ws?.readyState ?? 3\n }\n }\n}\n", "import {Relay, relayInit} from './relay'\nimport {normalizeURL} from './utils'\nimport {Filter} from './filter'\nimport {Event} from './event'\nimport {SubscriptionOptions, Sub, Pub} from './relay'\n\nexport class SimplePool {\n private _conn: {[url: string]: Relay}\n private _seenOn: {[id: string]: Set<string>} = {} // a map of all events we've seen in each relay\n\n private eoseSubTimeout: number\n private getTimeout: number\n\n constructor(options: {eoseSubTimeout?: number; getTimeout?: number} = {}) {\n this._conn = {}\n this.eoseSubTimeout = options.eoseSubTimeout || 3400\n this.getTimeout = options.getTimeout || 3400\n }\n\n close(relays: string[]): void {\n relays.forEach(url => {\n let relay = this._conn[normalizeURL(url)]\n if (relay) relay.close()\n })\n }\n\n async ensureRelay(url: string): Promise<Relay> {\n const nm = normalizeURL(url)\n const existing = this._conn[nm]\n if (existing) return existing\n\n const relay = relayInit(nm, {\n getTimeout: this.getTimeout * 0.9,\n listTimeout: this.getTimeout * 0.9\n })\n this._conn[nm] = relay\n\n await relay.connect()\n\n return relay\n }\n\n sub(relays: string[], filters: Filter[], opts?: SubscriptionOptions): Sub {\n let _knownIds: Set<string> = new Set()\n let modifiedOpts = opts || {}\n modifiedOpts.alreadyHaveEvent = (id, url) => {\n let set = this._seenOn[id] || new Set()\n set.add(url)\n this._seenOn[id] = set\n return _knownIds.has(id)\n }\n\n let subs: Sub[] = []\n let eventListeners: Set<(event: Event) => void> = new Set()\n let eoseListeners: Set<() => void> = new Set()\n let eosesMissing = relays.length\n\n let eoseSent = false\n let eoseTimeout = setTimeout(() => {\n eoseSent = true\n for (let cb of eoseListeners.values()) cb()\n }, this.eoseSubTimeout)\n\n relays.forEach(async relay => {\n let r\n try {\n r = await this.ensureRelay(relay)\n } catch (err) {\n handleEose()\n return\n }\n if (!r) return\n let s = r.sub(filters, modifiedOpts)\n s.on('event', (event: Event) => {\n _knownIds.add(event.id as string)\n for (let cb of eventListeners.values()) cb(event)\n })\n s.on('eose', () => {\n if (eoseSent) return\n handleEose()\n })\n subs.push(s)\n\n function handleEose() {\n eosesMissing--\n if (eosesMissing === 0) {\n clearTimeout(eoseTimeout)\n for (let cb of eoseListeners.values()) cb()\n }\n }\n })\n\n let greaterSub: Sub = {\n sub(filters, opts) {\n subs.forEach(sub => sub.sub(filters, opts))\n return greaterSub\n },\n unsub() {\n subs.forEach(sub => sub.unsub())\n },\n on(type, cb) {\n switch (type) {\n case 'event':\n eventListeners.add(cb)\n break\n case 'eose':\n eoseListeners.add(cb)\n break\n }\n },\n off(type, cb) {\n if (type === 'event') {\n eventListeners.delete(cb)\n } else if (type === 'eose') eoseListeners.delete(cb)\n }\n }\n\n return greaterSub\n }\n\n get(\n relays: string[],\n filter: Filter,\n opts?: SubscriptionOptions\n ): Promise<Event | null> {\n return new Promise(resolve => {\n let sub = this.sub(relays, [filter], opts)\n let timeout = setTimeout(() => {\n sub.unsub()\n resolve(null)\n }, this.getTimeout)\n sub.on('event', (event: Event) => {\n resolve(event)\n clearTimeout(timeout)\n sub.unsub()\n })\n })\n }\n\n list(\n relays: string[],\n filters: Filter[],\n opts?: SubscriptionOptions\n ): Promise<Event[]> {\n return new Promise(resolve => {\n let events: Event[] = []\n let sub = this.sub(relays, filters, opts)\n\n sub.on('event', (event: Event) => {\n events.push(event)\n })\n\n // we can rely on an eose being emitted here because pool.sub() will fake one\n sub.on('eose', () => {\n sub.unsub()\n resolve(events)\n })\n })\n }\n\n publish(relays: string[], event: Event): Pub {\n let pubs = relays.map(relay => {\n let r = this._conn[normalizeURL(relay)]\n if (!r) return badPub(relay)\n return r.publish(event)\n })\n\n return {\n on(type, cb) {\n pubs.forEach((pub, i) => {\n pub.on(type, () => cb(relays[i]))\n })\n },\n off() {\n // do nothing here, FIXME\n }\n }\n }\n\n seenOn(id: string): string[] {\n return Array.from(this._seenOn[id]?.values?.() || [])\n }\n}\n\nfunction badPub(relay: string): Pub {\n return {\n on(typ, cb) {\n if (typ === 'failed') cb(`relay ${relay} not connected`)\n },\n off() {}\n }\n}\n", "import {randomBytes} from '@noble/hashes/utils'\nimport * as secp256k1 from '@noble/secp256k1'\nimport {base64} from '@scure/base'\n\nimport {utf8Decoder, utf8Encoder} from './utils'\n\nexport async function encrypt(\n privkey: string,\n pubkey: string,\n text: string\n): Promise<string> {\n const key = secp256k1.getSharedSecret(privkey, '02' + pubkey)\n const normalizedKey = getNormalizedX(key)\n\n let iv = Uint8Array.from(randomBytes(16))\n let plaintext = utf8Encoder.encode(text)\n let cryptoKey = await crypto.subtle.importKey(\n 'raw',\n normalizedKey,\n {name: 'AES-CBC'},\n false,\n ['encrypt']\n )\n let ciphertext = await crypto.subtle.encrypt(\n {name: 'AES-CBC', iv},\n cryptoKey,\n plaintext\n )\n let ctb64 = base64.encode(new Uint8Array(ciphertext))\n let ivb64 = base64.encode(new Uint8Array(iv.buffer))\n\n return `${ctb64}?iv=${ivb64}`\n}\n\nexport async function decrypt(\n privkey: string,\n pubkey: string,\n data: string\n): Promise<string> {\n let [ctb64, ivb64] = data.split('?iv=')\n let key = secp256k1.getSharedSecret(privkey, '02' + pubkey)\n let normalizedKey = getNormalizedX(key)\n\n let cryptoKey = await crypto.subtle.importKey(\n 'raw',\n normalizedKey,\n {name: 'AES-CBC'},\n false,\n ['decrypt']\n )\n let ciphertext = base64.decode(ctb64)\n let iv = base64.decode(ivb64)\n\n let plaintext = await crypto.subtle.decrypt(\n {name: 'AES-CBC', iv},\n cryptoKey,\n ciphertext\n )\n\n let text = utf8Decoder.decode(plaintext)\n return text\n}\n\nfunction getNormalizedX(key: Uint8Array): Uint8Array {\n return key.slice(1, 33)\n}\n", "import {ProfilePointer} from './nip19'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function searchDomain(\n domain: string,\n query = ''\n): Promise<{[name: string]: string}> {\n try {\n let res = await (\n await _fetch(`https://${domain}/.well-known/nostr.json?name=${query}`)\n ).json()\n\n return res.names\n } catch (_) {\n return {}\n }\n}\n\nexport async function queryProfile(\n fullname: string\n): Promise<ProfilePointer | null> {\n let [name, domain] = fullname.split('@')\n\n if (!domain) {\n // if there is no @, it is because it is just a domain, so assume the name is \"_\"\n domain = name\n name = '_'\n }\n\n if (!name.match(/^[A-Za-z0-9-_]+$/)) return null\n\n let res = await (\n await _fetch(`https://${domain}/.well-known/nostr.json?name=${name}`)\n ).json()\n\n if (!res?.names?.[name]) return null\n\n let pubkey = res.names[name] as string\n let relays = (res.relays?.[pubkey] || []) as string[] // nip35\n\n return {\n pubkey,\n relays\n }\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {wordlist} from '@scure/bip39/wordlists/english.js'\nimport {\n generateMnemonic,\n mnemonicToSeedSync,\n validateMnemonic\n} from '@scure/bip39'\nimport {HDKey} from '@scure/bip32'\n\nexport function privateKeyFromSeedWords(mnemonic: string, passphrase?: string): string {\n let root = HDKey.fromMasterSeed(mnemonicToSeedSync(mnemonic, passphrase))\n let privateKey = root.derive(`m/44'/1237'/0'/0/0`).privateKey\n if (!privateKey) throw new Error('could not derive private key')\n return secp256k1.utils.bytesToHex(privateKey)\n}\n\nexport function generateSeedWords(): string {\n return generateMnemonic(wordlist)\n}\n\nexport function validateWords(words: string): boolean {\n return validateMnemonic(words, wordlist)\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {bech32} from '@scure/base'\n\nimport {utf8Decoder, utf8Encoder} from './utils'\n\nconst Bech32MaxSize = 5000\n\nexport type ProfilePointer = {\n pubkey: string // hex\n relays?: string[]\n}\n\nexport type EventPointer = {\n id: string // hex\n relays?: string[]\n}\n\nexport type AddressPointer = {\n identifier: string\n pubkey: string\n kind: number\n relays?: string[]\n}\n\nexport function decode(nip19: string): {\n type: string\n data: ProfilePointer | EventPointer | AddressPointer | string\n} {\n let {prefix, words} = bech32.decode(nip19, Bech32MaxSize)\n let data = new Uint8Array(bech32.fromWords(words))\n\n switch (prefix) {\n case 'nprofile': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nprofile')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n\n return {\n type: 'nprofile',\n data: {\n pubkey: secp256k1.utils.bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n case 'nevent': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nevent')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n\n return {\n type: 'nevent',\n data: {\n id: secp256k1.utils.bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n\n case 'naddr': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for naddr')\n if (!tlv[2]?.[0]) throw new Error('missing TLV 2 for naddr')\n if (tlv[2][0].length !== 32) throw new Error('TLV 2 should be 32 bytes')\n if (!tlv[3]?.[0]) throw new Error('missing TLV 3 for naddr')\n if (tlv[3][0].length !== 4) throw new Error('TLV 3 should be 4 bytes')\n\n return {\n type: 'naddr',\n data: {\n identifier: utf8Decoder.decode(tlv[0][0]),\n pubkey: secp256k1.utils.bytesToHex(tlv[2][0]),\n kind: parseInt(secp256k1.utils.bytesToHex(tlv[3][0]), 16),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n\n case 'nsec':\n case 'npub':\n case 'note':\n return {type: prefix, data: secp256k1.utils.bytesToHex(data)}\n\n default:\n throw new Error(`unknown prefix ${prefix}`)\n }\n}\n\ntype TLV = {[t: number]: Uint8Array[]}\n\nfunction parseTLV(data: Uint8Array): TLV {\n let result: TLV = {}\n let rest = data\n while (rest.length > 0) {\n let t = rest[0]\n let l = rest[1]\n let v = rest.slice(2, 2 + l)\n rest = rest.slice(2 + l)\n if (v.length < l) continue\n result[t] = result[t] || []\n result[t].push(v)\n }\n return result\n}\n\nexport function nsecEncode(hex: string): string {\n return encodeBytes('nsec', hex)\n}\n\nexport function npubEncode(hex: string): string {\n return encodeBytes('npub', hex)\n}\n\nexport function noteEncode(hex: string): string {\n return encodeBytes('note', hex)\n}\n\nfunction encodeBytes(prefix: string, hex: string): string {\n let data = secp256k1.utils.hexToBytes(hex)\n let words = bech32.toWords(data)\n return bech32.encode(prefix, words, Bech32MaxSize)\n}\n\nexport function nprofileEncode(profile: ProfilePointer): string {\n let data = encodeTLV({\n 0: [secp256k1.utils.hexToBytes(profile.pubkey)],\n 1: (profile.relays || []).map(url => utf8Encoder.encode(url))\n })\n let words = bech32.toWords(data)\n return bech32.encode('nprofile', words, Bech32MaxSize)\n}\n\nexport function neventEncode(event: EventPointer): string {\n let data = encodeTLV({\n 0: [secp256k1.utils.hexToBytes(event.id)],\n 1: (event.relays || []).map(url => utf8Encoder.encode(url))\n })\n let words = bech32.toWords(data)\n return bech32.encode('nevent', words, Bech32MaxSize)\n}\n\nexport function naddrEncode(addr: AddressPointer): string {\n let kind = new ArrayBuffer(4)\n new DataView(kind).setUint32(0, addr.kind, false)\n\n let data = encodeTLV({\n 0: [utf8Encoder.encode(addr.identifier)],\n 1: (addr.relays || []).map(url => utf8Encoder.encode(url)),\n 2: [secp256k1.utils.hexToBytes(addr.pubkey)],\n 3: [new Uint8Array(kind)]\n })\n let words = bech32.toWords(data)\n return bech32.encode('naddr', words, Bech32MaxSize)\n}\n\nfunction encodeTLV(tlv: TLV): Uint8Array {\n let entries: Uint8Array[] = []\n\n Object.entries(tlv).forEach(([t, vs]) => {\n vs.forEach(v => {\n let entry = new Uint8Array(v.length + 2)\n entry.set([parseInt(t)], 0)\n entry.set([v.length], 1)\n entry.set(v, 2)\n entries.push(entry)\n })\n })\n\n return secp256k1.utils.concatBytes(...entries)\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {sha256} from '@noble/hashes/sha256'\n\nimport {Event} from './event'\nimport {utf8Encoder} from './utils'\nimport {getPublicKey} from './keys'\n\nexport type Parameters = {\n pubkey: string // the key to whom the delegation will be given\n kind: number | undefined\n until: number | undefined // delegation will only be valid until this date\n since: number | undefined // delegation will be valid from this date on\n}\n\nexport type Delegation = {\n from: string // the pubkey who signed the delegation\n to: string // the pubkey that is allowed to use the delegation\n cond: string // the string of conditions as they should be included in the event tag\n sig: string\n}\n\nexport function createDelegation(\n privateKey: string,\n parameters: Parameters\n): Delegation {\n let conditions = []\n if ((parameters.kind || -1) >= 0) conditions.push(`kind=${parameters.kind}`)\n if (parameters.until) conditions.push(`created_at<${parameters.until}`)\n if (parameters.since) conditions.push(`created_at>${parameters.since}`)\n let cond = conditions.join('&')\n\n if (cond === '')\n throw new Error('refusing to create a delegation without any conditions')\n\n let sighash = sha256(\n utf8Encoder.encode(`nostr:delegation:${parameters.pubkey}:${cond}`)\n )\n\n let sig = secp256k1.utils.bytesToHex(\n secp256k1.schnorr.signSync(sighash, privateKey)\n )\n\n return {\n from: getPublicKey(privateKey),\n to: parameters.pubkey,\n cond,\n sig\n }\n}\n\nexport function getDelegator(event: Event): string | null {\n // find delegation tag\n let tag = event.tags.find(tag => tag[0] === 'delegation' && tag.length >= 4)\n if (!tag) return null\n\n let pubkey = tag[1]\n let cond = tag[2]\n let sig = tag[3]\n\n // check conditions\n let conditions = cond.split('&')\n for (let i = 0; i < conditions.length; i++) {\n let [key, operator, value] = conditions[i].split(/\\b/)\n\n // the supported conditions are just 'kind' and 'created_at' for now\n if (key === 'kind' && operator === '=' && event.kind === parseInt(value))\n continue\n else if (\n key === 'created_at' &&\n operator === '<' &&\n event.created_at < parseInt(value)\n )\n continue\n else if (\n key === 'created_at' &&\n operator === '>' &&\n event.created_at > parseInt(value)\n )\n continue\n else return null // invalid condition\n }\n\n // check signature\n let sighash = sha256(\n utf8Encoder.encode(`nostr:delegation:${event.pubkey}:${cond}`)\n )\n if (!secp256k1.schnorr.verifySync(sig, sighash, pubkey)) return null\n\n return pubkey\n}\n", "import {bech32} from '@scure/base'\n\nimport {Event, EventTemplate, validateEvent, verifySignature} from './event'\nimport {utf8Decoder} from './utils'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function getZapEndpoint(metadata: Event): Promise<null | string> {\n try {\n let lnurl: string = ''\n let {lud06, lud16} = JSON.parse(metadata.content)\n if (lud06) {\n let {words} = bech32.decode(lud06, 1000)\n let data = bech32.fromWords(words)\n lnurl = utf8Decoder.decode(data)\n } else if (lud16) {\n let [name, domain] = lud16.split('@')\n lnurl = `https://${domain}/.well-known/lnurlp/${name}`\n } else {\n return null\n }\n\n let res = await _fetch(lnurl)\n let body = await res.json()\n\n if (body.allowsNostr && body.nostrPubkey) {\n return body.callback\n }\n } catch (err) {\n /*-*/\n }\n\n return null\n}\n\nexport function makeZapRequest({\n profile,\n event,\n amount,\n relays,\n comment = ''\n}: {\n profile: string\n event: string | null\n amount: number\n comment: string\n relays: string[]\n}): EventTemplate {\n if (!amount) throw new Error('amount not given')\n if (!profile) throw new Error('profile not given')\n\n let zr = {\n kind: 9734,\n created_at: Math.round(Date.now() / 1000),\n content: comment,\n tags: [\n ['p', profile],\n ['amount', amount.toString()],\n ['relays', ...relays]\n ]\n }\n\n if (event) {\n zr.tags.push(['e', event])\n }\n\n return zr\n}\n\nexport function validateZapRequest(zapRequestString: string): string | null {\n let zapRequest: Event\n\n try {\n zapRequest = JSON.parse(zapRequestString)\n } catch (err) {\n return 'Invalid zap request JSON.'\n }\n\n if (!validateEvent(zapRequest))\n return 'Zap request is not a valid Nostr event.'\n if (!verifySignature(zapRequest)) return 'Invalid signature on zap request.'\n\n let p = zapRequest.tags.find(([t, v]) => t === 'p' && v)\n if (!p) return \"Zap request doesn't have a 'p' tag.\"\n if (!p[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'p' tag is not valid hex.\"\n\n let e = zapRequest.tags.find(([t, v]) => t === 'e' && v)\n if (e && !e[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'e' tag is not valid hex.\"\n\n let relays = zapRequest.tags.find(([t, v]) => t === 'relays' && v)\n if (!relays) return \"Zap request doesn't have a 'relays' tag.\"\n\n return null\n}\n\nexport function makeZapReceipt({\n zapRequest,\n preimage,\n bolt11,\n paidAt\n}: {\n zapRequest: string\n preimage: string | null\n bolt11: string\n paidAt: Date\n}): EventTemplate {\n let zr: Event = JSON.parse(zapRequest)\n let tagsFromZapRequest = zr.tags.filter(\n ([t]) => t === 'e' || t === 'p' || t === 'a'\n )\n\n let zap = {\n kind: 9735,\n created_at: Math.round(paidAt.getTime() / 1000),\n content: '',\n tags: [\n ...tagsFromZapRequest,\n ['bolt11', bolt11],\n ['description', zapRequest]\n ]\n }\n\n if (preimage) {\n zap.tags.push(['preimage', preimage])\n }\n\n return zap\n}\n", "export * from './keys'\nexport * from './relay'\nexport * from './event'\nexport * from './filter'\nexport * from './pool'\n\nexport * as nip04 from './nip04'\nexport * as nip05 from './nip05'\nexport * as nip06 from './nip06'\nexport * as nip19 from './nip19'\nexport * as nip26 from './nip26'\nexport * as nip57 from './nip57'\n\nexport * as fj from './fakejson'\nexport * as utils from './utils'\n\n// monkey patch secp256k1\nimport * as secp256k1 from '@noble/secp256k1'\nimport {hmac} from '@noble/hashes/hmac'\nimport {sha256} from '@noble/hashes/sha256'\nsecp256k1.utils.hmacSha256Sync = (key, ...msgs) =>\n hmac(sha256, key, secp256k1.utils.concatBytes(...msgs))\nsecp256k1.utils.sha256Sync = (...msgs) =>\n sha256(secp256k1.utils.concatBytes(...msgs))\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import * as secp256k1 from '@noble/secp256k1'\n\nexport function generatePrivateKey(): string {\n return secp256k1.utils.bytesToHex(secp256k1.utils.randomPrivateKey())\n}\n\nexport function getPublicKey(privateKey: string): string {\n return secp256k1.utils.bytesToHex(secp256k1.schnorr.getPublicKey(privateKey))\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {sha256} from '@noble/hashes/sha256'\n\nimport {utf8Encoder} from './utils'\nimport {getPublicKey} from './keys'\n\n/* eslint-disable no-unused-vars */\nexport enum Kind {\n Metadata = 0,\n Text = 1,\n RecommendRelay = 2,\n Contacts = 3,\n EncryptedDirectMessage = 4,\n EventDeletion = 5,\n Reaction = 7,\n ChannelCreation = 40,\n ChannelMetadata = 41,\n ChannelMessage = 42,\n ChannelHideMessage = 43,\n ChannelMuteUser = 44,\n Report = 1984,\n ZapRequest = 9734,\n Zap = 9735,\n RelayList = 10002,\n ClientAuth = 22242,\n Article = 30023\n}\n\nexport type EventTemplate = {\n kind: Kind\n tags: string[][]\n content: string\n created_at: number\n}\n\nexport type UnsignedEvent = EventTemplate & {\n pubkey: string\n}\n\nexport type Event = UnsignedEvent & {\n id: string\n sig: string\n}\n\nexport function getBlankEvent(): EventTemplate {\n return {\n kind: 255,\n content: '',\n tags: [],\n created_at: 0\n }\n}\n\nexport function finishEvent(t: EventTemplate, privateKey: string): Event {\n let event = t as Event\n event.pubkey = getPublicKey(privateKey)\n event.id = getEventHash(event)\n event.sig = signEvent(event, privateKey)\n return event\n}\n\nexport function serializeEvent(evt: UnsignedEvent): string {\n if (!validateEvent(evt))\n throw new Error(\"can't serialize event with wrong or missing properties\")\n\n return JSON.stringify([\n 0,\n evt.pubkey,\n evt.created_at,\n evt.kind,\n evt.tags,\n evt.content\n ])\n}\n\nexport function getEventHash(event: UnsignedEvent): string {\n let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)))\n return secp256k1.utils.bytesToHex(eventHash)\n}\n\nexport function validateEvent(event: UnsignedEvent): boolean {\n if (typeof event !== 'object') return false\n if (typeof event.kind !== 'number') return false\n if (typeof event.content !== 'string') return false\n if (typeof event.created_at !== 'number') return false\n if (typeof event.pubkey !== 'string') return false\n if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false\n\n if (!Array.isArray(event.tags)) return false\n for (let i = 0; i < event.tags.length; i++) {\n let tag = event.tags[i]\n if (!Array.isArray(tag)) return false\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] === 'object') return false\n }\n }\n\n return true\n}\n\nexport function verifySignature(event: Event & {sig: string}): boolean {\n return secp256k1.schnorr.verifySync(\n event.sig,\n getEventHash(event),\n event.pubkey\n )\n}\n\nexport function signEvent(event: UnsignedEvent, key: string): string {\n return secp256k1.utils.bytesToHex(\n secp256k1.schnorr.signSync(getEventHash(event), key)\n )\n}\n", "import {Event} from './event'\n\nexport const utf8Decoder = new TextDecoder('utf-8')\nexport const utf8Encoder = new TextEncoder()\n\nexport function normalizeURL(url: string): string {\n let p = new URL(url)\n p.pathname = p.pathname.replace(/\\/+/g, '/')\n if (p.pathname.endsWith('/')) p.pathname = p.pathname.slice(0, -1)\n if (\n (p.port === '80' && p.protocol === 'ws:') ||\n (p.port === '443' && p.protocol === 'wss:')\n )\n p.port = ''\n p.searchParams.sort()\n p.hash = ''\n return p.toString()\n}\n\n//\n// fast insert-into-sorted-array functions adapted from https://github.com/terrymorse58/fast-sorted-array\n//\nexport function insertEventIntoDescendingList(\n sortedArray: Event[],\n event: Event\n) {\n let start = 0\n let end = sortedArray.length - 1\n let midPoint\n let position = start\n\n if (end < 0) {\n position = 0\n } else if (event.created_at < sortedArray[end].created_at) {\n position = end + 1\n } else if (event.created_at >= sortedArray[start].created_at) {\n position = start\n } else\n while (true) {\n if (end <= start + 1) {\n position = end\n break\n }\n midPoint = Math.floor(start + (end - start) / 2)\n if (sortedArray[midPoint].created_at > event.created_at) {\n start = midPoint\n } else if (sortedArray[midPoint].created_at < event.created_at) {\n end = midPoint\n } else {\n // aMidPoint === num\n position = midPoint\n break\n }\n }\n\n // insert when num is NOT already in (no duplicates)\n if (sortedArray[position]?.id !== event.id) {\n return [\n ...sortedArray.slice(0, position),\n event,\n ...sortedArray.slice(position)\n ]\n }\n\n return sortedArray\n}\n\nexport function insertEventIntoAscendingList(\n sortedArray: Event[],\n event: Event\n) {\n let start = 0\n let end = sortedArray.length - 1\n let midPoint\n let position = start\n\n if (end < 0) {\n position = 0\n } else if (event.created_at > sortedArray[end].created_at) {\n position = end + 1\n } else if (event.created_at <= sortedArray[start].created_at) {\n position = start\n } else\n while (true) {\n if (end <= start + 1) {\n position = end\n break\n }\n midPoint = Math.floor(start + (end - start) / 2)\n if (sortedArray[midPoint].created_at < event.created_at) {\n start = midPoint\n } else if (sortedArray[midPoint].created_at > event.created_at) {\n end = midPoint\n } else {\n // aMidPoint === num\n position = midPoint\n break\n }\n }\n\n // insert when num is NOT already in (no duplicates)\n if (sortedArray[position]?.id !== event.id) {\n return [\n ...sortedArray.slice(0, position),\n event,\n ...sortedArray.slice(position)\n ]\n }\n\n return sortedArray\n}\n", "import {Event} from './event'\n\nexport type Filter = {\n ids?: string[]\n kinds?: number[]\n authors?: string[]\n since?: number\n until?: number\n limit?: number\n [key: `#${string}`]: string[]\n}\n\nexport function matchFilter(\n filter: Filter,\n event: Event & {id: string}\n): boolean {\n if (filter.ids && filter.ids.indexOf(event.id) === -1) return false\n if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) return false\n if (filter.authors && filter.authors.indexOf(event.pubkey) === -1)\n return false\n\n for (let f in filter) {\n if (f[0] === '#') {\n let tagName = f.slice(1)\n let values = filter[`#${tagName}`]\n if (\n values &&\n !event.tags.find(\n ([t, v]) => t === f.slice(1) && values.indexOf(v) !== -1\n )\n )\n return false\n }\n }\n\n if (filter.since && event.created_at < filter.since) return false\n if (filter.until && event.created_at >= filter.until) return false\n\n return true\n}\n\nexport function matchFilters(\n filters: Filter[],\n event: Event & {id: string}\n): boolean {\n for (let i = 0; i < filters.length; i++) {\n if (matchFilter(filters[i], event)) return true\n }\n return false\n}\n", "export function getHex64(json: string, field: string): string {\n let len = field.length + 3\n let idx = json.indexOf(`\"${field}\":`) + len\n let s = json.slice(idx).indexOf(`\"`) + idx + 1\n return json.slice(s, s + 64)\n}\n\nexport function getInt(json: string, field: string): number {\n let len = field.length\n let idx = json.indexOf(`\"${field}\":`) + len + 3\n let sliced = json.slice(idx)\n let end = Math.min(sliced.indexOf(','), sliced.indexOf('}'))\n return parseInt(sliced.slice(0, end), 10)\n}\n\nexport function getSubscriptionId(json: string): string | null {\n let idx = json.slice(0, 22).indexOf(`\"EVENT\"`)\n if (idx === -1) return null\n\n let pstart = json.slice(idx + 7 + 1).indexOf(`\"`)\n if (pstart === -1) return null\n let start = idx + 7 + 1 + pstart\n\n let pend = json.slice(start + 1, 80).indexOf(`\"`)\n if (pend === -1) return null\n let end = start + 1 + pend\n\n return json.slice(start + 1, end)\n}\n\nexport function matchEventId(json: string, id: string): boolean {\n return id === getHex64(json, 'id')\n}\n\nexport function matchEventPubkey(json: string, pubkey: string): boolean {\n return pubkey === getHex64(json, 'pubkey')\n}\n\nexport function matchEventKind(json: string, kind: number): boolean {\n return kind === getInt(json, 'kind')\n}\n", "/* global WebSocket */\n\nimport {Event, verifySignature, validateEvent} from './event'\nimport {Filter, matchFilters} from './filter'\nimport {getHex64, getSubscriptionId} from './fakejson'\n\ntype RelayEvent = 'connect' | 'disconnect' | 'error' | 'notice'\n\nexport type Relay = {\n url: string\n status: number\n connect: () => Promise<void>\n close: () => void\n sub: (filters: Filter[], opts?: SubscriptionOptions) => Sub\n list: (filters: Filter[], opts?: SubscriptionOptions) => Promise<Event[]>\n get: (filter: Filter, opts?: SubscriptionOptions) => Promise<Event | null>\n publish: (event: Event) => Pub\n on: (type: RelayEvent, cb: any) => void\n off: (type: RelayEvent, cb: any) => void\n}\nexport type Pub = {\n on: (type: 'ok' | 'failed', cb: any) => void\n off: (type: 'ok' | 'failed', cb: any) => void\n}\nexport type Sub = {\n sub: (filters: Filter[], opts: SubscriptionOptions) => Sub\n unsub: () => void\n on: (type: 'event' | 'eose', cb: any) => void\n off: (type: 'event' | 'eose', cb: any) => void\n}\n\nexport type SubscriptionOptions = {\n id?: string\n skipVerification?: boolean\n alreadyHaveEvent?: null | ((id: string, relay: string) => boolean)\n}\n\nexport function relayInit(\n url: string,\n options: {\n getTimeout?: number\n listTimeout?: number\n } = {}\n): Relay {\n let {listTimeout = 3000, getTimeout = 3000} = options\n\n var ws: WebSocket\n var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {}\n var listeners: {\n connect: Array<() => void>\n disconnect: Array<() => void>\n error: Array<() => void>\n notice: Array<(msg: string) => void>\n } = {\n connect: [],\n disconnect: [],\n error: [],\n notice: []\n }\n var subListeners: {\n [subid: string]: {\n event: Array<(event: Event) => void>\n eose: Array<() => void>\n }\n } = {}\n var pubListeners: {\n [eventid: string]: {\n ok: Array<() => void>\n seen: Array<() => void>\n failed: Array<(reason: string) => void>\n }\n } = {}\n\n async function connectRelay(): Promise<void> {\n return new Promise((resolve, reject) => {\n ws = new WebSocket(url)\n\n ws.onopen = () => {\n listeners.connect.forEach(cb => cb())\n resolve()\n }\n ws.onerror = () => {\n listeners.error.forEach(cb => cb())\n reject()\n }\n ws.onclose = async () => {\n listeners.disconnect.forEach(cb => cb())\n }\n\n let incomingMessageQueue: string[] = []\n let handleNextInterval: any\n\n ws.onmessage = e => {\n incomingMessageQueue.push(e.data)\n if (!handleNextInterval) {\n handleNextInterval = setInterval(handleNext, 0)\n }\n }\n\n function handleNext() {\n if (incomingMessageQueue.length === 0) {\n clearInterval(handleNextInterval)\n handleNextInterval = null\n return\n }\n\n var json = incomingMessageQueue.shift()\n if (!json) return\n\n let subid = getSubscriptionId(json)\n if (subid) {\n let so = openSubs[subid]\n if (\n so &&\n so.alreadyHaveEvent &&\n so.alreadyHaveEvent(getHex64(json, 'id'), url)\n ) {\n return\n }\n }\n\n try {\n let data = JSON.parse(json)\n\n // we won't do any checks against the data since all failures (i.e. invalid messages from relays)\n // will naturally be caught by the encompassing try..catch block\n\n switch (data[0]) {\n case 'EVENT':\n let id = data[1]\n let event = data[2]\n if (\n validateEvent(event) &&\n openSubs[id] &&\n (openSubs[id].skipVerification || verifySignature(event)) &&\n matchFilters(openSubs[id].filters, event)\n ) {\n openSubs[id]\n ;(subListeners[id]?.event || []).forEach(cb => cb(event))\n }\n return\n case 'EOSE': {\n let id = data[1]\n if (id in subListeners) {\n subListeners[id].eose.forEach(cb => cb())\n subListeners[id].eose = [] // 'eose' only happens once per sub, so stop listeners here\n }\n return\n }\n case 'OK': {\n let id: string = data[1]\n let ok: boolean = data[2]\n let reason: string = data[3] || ''\n if (id in pubListeners) {\n if (ok) pubListeners[id].ok.forEach(cb => cb())\n else pubListeners[id].failed.forEach(cb => cb(reason))\n pubListeners[id].ok = [] // 'ok' only happens once per pub, so stop listeners here\n pubListeners[id].failed = []\n }\n return\n }\n case 'NOTICE':\n let notice = data[1]\n listeners.notice.forEach(cb => cb(notice))\n return\n }\n } catch (err) {\n return\n }\n }\n })\n }\n\n function connected() {\n return ws?.readyState === 1\n }\n\n async function connect(): Promise<void> {\n if (connected()) return // ws already open\n await connectRelay()\n }\n\n async function trySend(params: [string, ...any]) {\n let msg = JSON.stringify(params)\n if (!connected()) {\n await new Promise(resolve => setTimeout(resolve, 1000))\n if (!connected()) {\n return\n }\n }\n try {\n ws.send(msg)\n } catch (err) {\n console.log(err)\n }\n }\n\n const sub = (\n filters: Filter[],\n {\n skipVerification = false,\n alreadyHaveEvent = null,\n id = Math.random().toString().slice(2)\n }: SubscriptionOptions = {}\n ): Sub => {\n let subid = id\n\n openSubs[subid] = {\n id: subid,\n filters,\n skipVerification,\n alreadyHaveEvent\n }\n trySend(['REQ', subid, ...filters])\n\n return {\n sub: (newFilters, newOpts = {}) =>\n sub(newFilters || filters, {\n skipVerification: newOpts.skipVerification || skipVerification,\n alreadyHaveEvent: newOpts.alreadyHaveEvent || alreadyHaveEvent,\n id: subid\n }),\n unsub: () => {\n delete openSubs[subid]\n delete subListeners[subid]\n trySend(['CLOSE', subid])\n },\n on: (type: 'event' | 'eose', cb: any): void => {\n subListeners[subid] = subListeners[subid] || {\n event: [],\n eose: []\n }\n subListeners[subid][type].push(cb)\n },\n off: (type: 'event' | 'eose', cb: any): void => {\n let listeners = subListeners[subid]\n let idx = listeners[type].indexOf(cb)\n if (idx >= 0) listeners[type].splice(idx, 1)\n }\n }\n }\n\n return {\n url,\n sub,\n on: (type: RelayEvent, cb: any): void => {\n listeners[type].push(cb)\n if (type === 'connect' && ws?.readyState === 1) {\n cb()\n }\n },\n off: (type: RelayEvent, cb: any): void => {\n let index = listeners[type].indexOf(cb)\n if (index !== -1) listeners[type].splice(index, 1)\n },\n list: (filters: Filter[], opts?: SubscriptionOptions): Promise<Event[]> =>\n new Promise(resolve => {\n let s = sub(filters, opts)\n let events: Event[] = []\n let timeout = setTimeout(() => {\n s.unsub()\n resolve(events)\n }, listTimeout)\n s.on('eose', () => {\n s.unsub()\n clearTimeout(timeout)\n resolve(events)\n })\n s.on('event', (event: Event) => {\n events.push(event)\n })\n }),\n get: (filter: Filter, opts?: SubscriptionOptions): Promise<Event | null> =>\n new Promise(resolve => {\n let s = sub([filter], opts)\n let timeout = setTimeout(() => {\n s.unsub()\n resolve(null)\n }, getTimeout)\n s.on('event', (event: Event) => {\n s.unsub()\n clearTimeout(timeout)\n resolve(event)\n })\n }),\n publish(event: Event): Pub {\n if (!event.id) throw new Error(`event ${event} has no id`)\n let id = event.id\n\n trySend(['EVENT', event])\n\n return {\n on: (type: 'ok' | 'failed', cb: any) => {\n pubListeners[id] = pubListeners[id] || {\n ok: [],\n failed: []\n }\n pubListeners[id][type].push(cb)\n },\n off: (type: 'ok' | 'failed', cb: any) => {\n let listeners = pubListeners[id]\n if (!listeners) return\n let idx = listeners[type].indexOf(cb)\n if (idx >= 0) listeners[type].splice(idx, 1)\n }\n }\n },\n connect,\n close(): void {\n listeners = {connect: [], disconnect: [], error: [], notice: []}\n subListeners = {}\n pubListeners = {}\n\n ws?.close()\n },\n get status() {\n return ws?.readyState ?? 3\n }\n }\n}\n", "import {Relay, relayInit} from './relay'\nimport {normalizeURL} from './utils'\nimport {Filter} from './filter'\nimport {Event} from './event'\nimport {SubscriptionOptions, Sub, Pub} from './relay'\n\nexport class SimplePool {\n private _conn: {[url: string]: Relay}\n private _seenOn: {[id: string]: Set<string>} = {} // a map of all events we've seen in each relay\n\n private eoseSubTimeout: number\n private getTimeout: number\n\n constructor(options: {eoseSubTimeout?: number; getTimeout?: number} = {}) {\n this._conn = {}\n this.eoseSubTimeout = options.eoseSubTimeout || 3400\n this.getTimeout = options.getTimeout || 3400\n }\n\n close(relays: string[]): void {\n relays.forEach(url => {\n let relay = this._conn[normalizeURL(url)]\n if (relay) relay.close()\n })\n }\n\n async ensureRelay(url: string): Promise<Relay> {\n const nm = normalizeURL(url)\n const existing = this._conn[nm]\n if (existing) return existing\n\n const relay = relayInit(nm, {\n getTimeout: this.getTimeout * 0.9,\n listTimeout: this.getTimeout * 0.9\n })\n this._conn[nm] = relay\n\n await relay.connect()\n\n return relay\n }\n\n sub(relays: string[], filters: Filter[], opts?: SubscriptionOptions): Sub {\n let _knownIds: Set<string> = new Set()\n let modifiedOpts = opts || {}\n modifiedOpts.alreadyHaveEvent = (id, url) => {\n let set = this._seenOn[id] || new Set()\n set.add(url)\n this._seenOn[id] = set\n return _knownIds.has(id)\n }\n\n let subs: Sub[] = []\n let eventListeners: Set<(event: Event) => void> = new Set()\n let eoseListeners: Set<() => void> = new Set()\n let eosesMissing = relays.length\n\n let eoseSent = false\n let eoseTimeout = setTimeout(() => {\n eoseSent = true\n for (let cb of eoseListeners.values()) cb()\n }, this.eoseSubTimeout)\n\n relays.forEach(async relay => {\n let r\n try {\n r = await this.ensureRelay(relay)\n } catch (err) {\n handleEose()\n return\n }\n if (!r) return\n let s = r.sub(filters, modifiedOpts)\n s.on('event', (event: Event) => {\n _knownIds.add(event.id as string)\n for (let cb of eventListeners.values()) cb(event)\n })\n s.on('eose', () => {\n if (eoseSent) return\n handleEose()\n })\n subs.push(s)\n\n function handleEose() {\n eosesMissing--\n if (eosesMissing === 0) {\n clearTimeout(eoseTimeout)\n for (let cb of eoseListeners.values()) cb()\n }\n }\n })\n\n let greaterSub: Sub = {\n sub(filters, opts) {\n subs.forEach(sub => sub.sub(filters, opts))\n return greaterSub\n },\n unsub() {\n subs.forEach(sub => sub.unsub())\n },\n on(type, cb) {\n switch (type) {\n case 'event':\n eventListeners.add(cb)\n break\n case 'eose':\n eoseListeners.add(cb)\n break\n }\n },\n off(type, cb) {\n if (type === 'event') {\n eventListeners.delete(cb)\n } else if (type === 'eose') eoseListeners.delete(cb)\n }\n }\n\n return greaterSub\n }\n\n get(\n relays: string[],\n filter: Filter,\n opts?: SubscriptionOptions\n ): Promise<Event | null> {\n return new Promise(resolve => {\n let sub = this.sub(relays, [filter], opts)\n let timeout = setTimeout(() => {\n sub.unsub()\n resolve(null)\n }, this.getTimeout)\n sub.on('event', (event: Event) => {\n resolve(event)\n clearTimeout(timeout)\n sub.unsub()\n })\n })\n }\n\n list(\n relays: string[],\n filters: Filter[],\n opts?: SubscriptionOptions\n ): Promise<Event[]> {\n return new Promise(resolve => {\n let events: Event[] = []\n let sub = this.sub(relays, filters, opts)\n\n sub.on('event', (event: Event) => {\n events.push(event)\n })\n\n // we can rely on an eose being emitted here because pool.sub() will fake one\n sub.on('eose', () => {\n sub.unsub()\n resolve(events)\n })\n })\n }\n\n publish(relays: string[], event: Event): Pub {\n let pubs = relays.map(relay => {\n let r = this._conn[normalizeURL(relay)]\n if (!r) return badPub(relay)\n return r.publish(event)\n })\n\n return {\n on(type, cb) {\n pubs.forEach((pub, i) => {\n pub.on(type, () => cb(relays[i]))\n })\n },\n off() {\n // do nothing here, FIXME\n }\n }\n }\n\n seenOn(id: string): string[] {\n return Array.from(this._seenOn[id]?.values?.() || [])\n }\n}\n\nfunction badPub(relay: string): Pub {\n return {\n on(typ, cb) {\n if (typ === 'failed') cb(`relay ${relay} not connected`)\n },\n off() {}\n }\n}\n", "import {randomBytes} from '@noble/hashes/utils'\nimport * as secp256k1 from '@noble/secp256k1'\nimport {base64} from '@scure/base'\n\nimport {utf8Decoder, utf8Encoder} from './utils'\n\nexport async function encrypt(\n privkey: string,\n pubkey: string,\n text: string\n): Promise<string> {\n const key = secp256k1.getSharedSecret(privkey, '02' + pubkey)\n const normalizedKey = getNormalizedX(key)\n\n let iv = Uint8Array.from(randomBytes(16))\n let plaintext = utf8Encoder.encode(text)\n let cryptoKey = await crypto.subtle.importKey(\n 'raw',\n normalizedKey,\n {name: 'AES-CBC'},\n false,\n ['encrypt']\n )\n let ciphertext = await crypto.subtle.encrypt(\n {name: 'AES-CBC', iv},\n cryptoKey,\n plaintext\n )\n let ctb64 = base64.encode(new Uint8Array(ciphertext))\n let ivb64 = base64.encode(new Uint8Array(iv.buffer))\n\n return `${ctb64}?iv=${ivb64}`\n}\n\nexport async function decrypt(\n privkey: string,\n pubkey: string,\n data: string\n): Promise<string> {\n let [ctb64, ivb64] = data.split('?iv=')\n let key = secp256k1.getSharedSecret(privkey, '02' + pubkey)\n let normalizedKey = getNormalizedX(key)\n\n let cryptoKey = await crypto.subtle.importKey(\n 'raw',\n normalizedKey,\n {name: 'AES-CBC'},\n false,\n ['decrypt']\n )\n let ciphertext = base64.decode(ctb64)\n let iv = base64.decode(ivb64)\n\n let plaintext = await crypto.subtle.decrypt(\n {name: 'AES-CBC', iv},\n cryptoKey,\n ciphertext\n )\n\n let text = utf8Decoder.decode(plaintext)\n return text\n}\n\nfunction getNormalizedX(key: Uint8Array): Uint8Array {\n return key.slice(1, 33)\n}\n", "import {ProfilePointer} from './nip19'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function searchDomain(\n domain: string,\n query = ''\n): Promise<{[name: string]: string}> {\n try {\n let res = await (\n await _fetch(`https://${domain}/.well-known/nostr.json?name=${query}`)\n ).json()\n\n return res.names\n } catch (_) {\n return {}\n }\n}\n\nexport async function queryProfile(\n fullname: string\n): Promise<ProfilePointer | null> {\n let [name, domain] = fullname.split('@')\n\n if (!domain) {\n // if there is no @, it is because it is just a domain, so assume the name is \"_\"\n domain = name\n name = '_'\n }\n\n if (!name.match(/^[A-Za-z0-9-_]+$/)) return null\n\n let res\n try {\n res = await (\n await _fetch(`https://${domain}/.well-known/nostr.json?name=${name}`)\n ).json()\n } catch (err) {\n return null\n }\n\n if (!res?.names?.[name]) return null\n\n let pubkey = res.names[name] as string\n let relays = (res.relays?.[pubkey] || []) as string[] // nip35\n\n return {\n pubkey,\n relays\n }\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {wordlist} from '@scure/bip39/wordlists/english.js'\nimport {\n generateMnemonic,\n mnemonicToSeedSync,\n validateMnemonic\n} from '@scure/bip39'\nimport {HDKey} from '@scure/bip32'\n\nexport function privateKeyFromSeedWords(\n mnemonic: string,\n passphrase?: string\n): string {\n let root = HDKey.fromMasterSeed(mnemonicToSeedSync(mnemonic, passphrase))\n let privateKey = root.derive(`m/44'/1237'/0'/0/0`).privateKey\n if (!privateKey) throw new Error('could not derive private key')\n return secp256k1.utils.bytesToHex(privateKey)\n}\n\nexport function generateSeedWords(): string {\n return generateMnemonic(wordlist)\n}\n\nexport function validateWords(words: string): boolean {\n return validateMnemonic(words, wordlist)\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {bech32} from '@scure/base'\n\nimport {utf8Decoder, utf8Encoder} from './utils'\n\nconst Bech32MaxSize = 5000\n\nexport type ProfilePointer = {\n pubkey: string // hex\n relays?: string[]\n}\n\nexport type EventPointer = {\n id: string // hex\n relays?: string[]\n}\n\nexport type AddressPointer = {\n identifier: string\n pubkey: string\n kind: number\n relays?: string[]\n}\n\nexport function decode(nip19: string): {\n type: string\n data: ProfilePointer | EventPointer | AddressPointer | string\n} {\n let {prefix, words} = bech32.decode(nip19, Bech32MaxSize)\n let data = new Uint8Array(bech32.fromWords(words))\n\n switch (prefix) {\n case 'nprofile': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nprofile')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n\n return {\n type: 'nprofile',\n data: {\n pubkey: secp256k1.utils.bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n case 'nevent': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nevent')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n\n return {\n type: 'nevent',\n data: {\n id: secp256k1.utils.bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n\n case 'naddr': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for naddr')\n if (!tlv[2]?.[0]) throw new Error('missing TLV 2 for naddr')\n if (tlv[2][0].length !== 32) throw new Error('TLV 2 should be 32 bytes')\n if (!tlv[3]?.[0]) throw new Error('missing TLV 3 for naddr')\n if (tlv[3][0].length !== 4) throw new Error('TLV 3 should be 4 bytes')\n\n return {\n type: 'naddr',\n data: {\n identifier: utf8Decoder.decode(tlv[0][0]),\n pubkey: secp256k1.utils.bytesToHex(tlv[2][0]),\n kind: parseInt(secp256k1.utils.bytesToHex(tlv[3][0]), 16),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : []\n }\n }\n }\n\n case 'nsec':\n case 'npub':\n case 'note':\n return {type: prefix, data: secp256k1.utils.bytesToHex(data)}\n\n default:\n throw new Error(`unknown prefix ${prefix}`)\n }\n}\n\ntype TLV = {[t: number]: Uint8Array[]}\n\nfunction parseTLV(data: Uint8Array): TLV {\n let result: TLV = {}\n let rest = data\n while (rest.length > 0) {\n let t = rest[0]\n let l = rest[1]\n let v = rest.slice(2, 2 + l)\n rest = rest.slice(2 + l)\n if (v.length < l) continue\n result[t] = result[t] || []\n result[t].push(v)\n }\n return result\n}\n\nexport function nsecEncode(hex: string): string {\n return encodeBytes('nsec', hex)\n}\n\nexport function npubEncode(hex: string): string {\n return encodeBytes('npub', hex)\n}\n\nexport function noteEncode(hex: string): string {\n return encodeBytes('note', hex)\n}\n\nfunction encodeBytes(prefix: string, hex: string): string {\n let data = secp256k1.utils.hexToBytes(hex)\n let words = bech32.toWords(data)\n return bech32.encode(prefix, words, Bech32MaxSize)\n}\n\nexport function nprofileEncode(profile: ProfilePointer): string {\n let data = encodeTLV({\n 0: [secp256k1.utils.hexToBytes(profile.pubkey)],\n 1: (profile.relays || []).map(url => utf8Encoder.encode(url))\n })\n let words = bech32.toWords(data)\n return bech32.encode('nprofile', words, Bech32MaxSize)\n}\n\nexport function neventEncode(event: EventPointer): string {\n let data = encodeTLV({\n 0: [secp256k1.utils.hexToBytes(event.id)],\n 1: (event.relays || []).map(url => utf8Encoder.encode(url))\n })\n let words = bech32.toWords(data)\n return bech32.encode('nevent', words, Bech32MaxSize)\n}\n\nexport function naddrEncode(addr: AddressPointer): string {\n let kind = new ArrayBuffer(4)\n new DataView(kind).setUint32(0, addr.kind, false)\n\n let data = encodeTLV({\n 0: [utf8Encoder.encode(addr.identifier)],\n 1: (addr.relays || []).map(url => utf8Encoder.encode(url)),\n 2: [secp256k1.utils.hexToBytes(addr.pubkey)],\n 3: [new Uint8Array(kind)]\n })\n let words = bech32.toWords(data)\n return bech32.encode('naddr', words, Bech32MaxSize)\n}\n\nfunction encodeTLV(tlv: TLV): Uint8Array {\n let entries: Uint8Array[] = []\n\n Object.entries(tlv).forEach(([t, vs]) => {\n vs.forEach(v => {\n let entry = new Uint8Array(v.length + 2)\n entry.set([parseInt(t)], 0)\n entry.set([v.length], 1)\n entry.set(v, 2)\n entries.push(entry)\n })\n })\n\n return secp256k1.utils.concatBytes(...entries)\n}\n", "import * as secp256k1 from '@noble/secp256k1'\nimport {sha256} from '@noble/hashes/sha256'\n\nimport {Event} from './event'\nimport {utf8Encoder} from './utils'\nimport {getPublicKey} from './keys'\n\nexport type Parameters = {\n pubkey: string // the key to whom the delegation will be given\n kind: number | undefined\n until: number | undefined // delegation will only be valid until this date\n since: number | undefined // delegation will be valid from this date on\n}\n\nexport type Delegation = {\n from: string // the pubkey who signed the delegation\n to: string // the pubkey that is allowed to use the delegation\n cond: string // the string of conditions as they should be included in the event tag\n sig: string\n}\n\nexport function createDelegation(\n privateKey: string,\n parameters: Parameters\n): Delegation {\n let conditions = []\n if ((parameters.kind || -1) >= 0) conditions.push(`kind=${parameters.kind}`)\n if (parameters.until) conditions.push(`created_at<${parameters.until}`)\n if (parameters.since) conditions.push(`created_at>${parameters.since}`)\n let cond = conditions.join('&')\n\n if (cond === '')\n throw new Error('refusing to create a delegation without any conditions')\n\n let sighash = sha256(\n utf8Encoder.encode(`nostr:delegation:${parameters.pubkey}:${cond}`)\n )\n\n let sig = secp256k1.utils.bytesToHex(\n secp256k1.schnorr.signSync(sighash, privateKey)\n )\n\n return {\n from: getPublicKey(privateKey),\n to: parameters.pubkey,\n cond,\n sig\n }\n}\n\nexport function getDelegator(event: Event): string | null {\n // find delegation tag\n let tag = event.tags.find(tag => tag[0] === 'delegation' && tag.length >= 4)\n if (!tag) return null\n\n let pubkey = tag[1]\n let cond = tag[2]\n let sig = tag[3]\n\n // check conditions\n let conditions = cond.split('&')\n for (let i = 0; i < conditions.length; i++) {\n let [key, operator, value] = conditions[i].split(/\\b/)\n\n // the supported conditions are just 'kind' and 'created_at' for now\n if (key === 'kind' && operator === '=' && event.kind === parseInt(value))\n continue\n else if (\n key === 'created_at' &&\n operator === '<' &&\n event.created_at < parseInt(value)\n )\n continue\n else if (\n key === 'created_at' &&\n operator === '>' &&\n event.created_at > parseInt(value)\n )\n continue\n else return null // invalid condition\n }\n\n // check signature\n let sighash = sha256(\n utf8Encoder.encode(`nostr:delegation:${event.pubkey}:${cond}`)\n )\n if (!secp256k1.schnorr.verifySync(sig, sighash, pubkey)) return null\n\n return pubkey\n}\n", "import {bech32} from '@scure/base'\n\nimport {Event, EventTemplate, validateEvent, verifySignature} from './event'\nimport {utf8Decoder} from './utils'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function getZapEndpoint(metadata: Event): Promise<null | string> {\n try {\n let lnurl: string = ''\n let {lud06, lud16} = JSON.parse(metadata.content)\n if (lud06) {\n let {words} = bech32.decode(lud06, 1000)\n let data = bech32.fromWords(words)\n lnurl = utf8Decoder.decode(data)\n } else if (lud16) {\n let [name, domain] = lud16.split('@')\n lnurl = `https://${domain}/.well-known/lnurlp/${name}`\n } else {\n return null\n }\n\n let res = await _fetch(lnurl)\n let body = await res.json()\n\n if (body.allowsNostr && body.nostrPubkey) {\n return body.callback\n }\n } catch (err) {\n /*-*/\n }\n\n return null\n}\n\nexport function makeZapRequest({\n profile,\n event,\n amount,\n relays,\n comment = ''\n}: {\n profile: string\n event: string | null\n amount: number\n comment: string\n relays: string[]\n}): EventTemplate {\n if (!amount) throw new Error('amount not given')\n if (!profile) throw new Error('profile not given')\n\n let zr = {\n kind: 9734,\n created_at: Math.round(Date.now() / 1000),\n content: comment,\n tags: [\n ['p', profile],\n ['amount', amount.toString()],\n ['relays', ...relays]\n ]\n }\n\n if (event) {\n zr.tags.push(['e', event])\n }\n\n return zr\n}\n\nexport function validateZapRequest(zapRequestString: string): string | null {\n let zapRequest: Event\n\n try {\n zapRequest = JSON.parse(zapRequestString)\n } catch (err) {\n return 'Invalid zap request JSON.'\n }\n\n if (!validateEvent(zapRequest))\n return 'Zap request is not a valid Nostr event.'\n if (!verifySignature(zapRequest)) return 'Invalid signature on zap request.'\n\n let p = zapRequest.tags.find(([t, v]) => t === 'p' && v)\n if (!p) return \"Zap request doesn't have a 'p' tag.\"\n if (!p[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'p' tag is not valid hex.\"\n\n let e = zapRequest.tags.find(([t, v]) => t === 'e' && v)\n if (e && !e[1].match(/^[a-f0-9]{64}$/))\n return \"Zap request 'e' tag is not valid hex.\"\n\n let relays = zapRequest.tags.find(([t, v]) => t === 'relays' && v)\n if (!relays) return \"Zap request doesn't have a 'relays' tag.\"\n\n return null\n}\n\nexport function makeZapReceipt({\n zapRequest,\n preimage,\n bolt11,\n paidAt\n}: {\n zapRequest: string\n preimage: string | null\n bolt11: string\n paidAt: Date\n}): EventTemplate {\n let zr: Event = JSON.parse(zapRequest)\n let tagsFromZapRequest = zr.tags.filter(\n ([t]) => t === 'e' || t === 'p' || t === 'a'\n )\n\n let zap = {\n kind: 9735,\n created_at: Math.round(paidAt.getTime() / 1000),\n content: '',\n tags: [\n ...tagsFromZapRequest,\n ['bolt11', bolt11],\n ['description', zapRequest]\n ]\n }\n\n if (preimage) {\n zap.tags.push(['preimage', preimage])\n }\n\n return zap\n}\n", "export * from './keys'\nexport * from './relay'\nexport * from './event'\nexport * from './filter'\nexport * from './pool'\n\nexport * as nip04 from './nip04'\nexport * as nip05 from './nip05'\nexport * as nip06 from './nip06'\nexport * as nip19 from './nip19'\nexport * as nip26 from './nip26'\nexport * as nip57 from './nip57'\n\nexport * as fj from './fakejson'\nexport * as utils from './utils'\n\n// monkey patch secp256k1\nimport * as secp256k1 from '@noble/secp256k1'\nimport {hmac} from '@noble/hashes/hmac'\nimport {sha256} from '@noble/hashes/sha256'\nsecp256k1.utils.hmacSha256Sync = (key, ...msgs) =>\n hmac(sha256, key, secp256k1.utils.concatBytes(...msgs))\nsecp256k1.utils.sha256Sync = (...msgs) =>\n sha256(secp256k1.utils.concatBytes(...msgs))\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["secp256k1", "Kind", "id", "listeners", "filters", "opts", "secp256k1", "secp256k1", "secp256k1", "secp256k1", "sha256", "sha256", "tag", "useFetchImplementation", "bech32", "_fetch", "useFetchImplementation", "bech32", "secp256k1", "sha256"]
|
|
7
7
|
}
|
package/lib/event.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export declare enum Kind {
|
|
2
|
+
Metadata = 0,
|
|
3
|
+
Text = 1,
|
|
4
|
+
RecommendRelay = 2,
|
|
5
|
+
Contacts = 3,
|
|
6
|
+
EncryptedDirectMessage = 4,
|
|
7
|
+
EventDeletion = 5,
|
|
8
|
+
Reaction = 7,
|
|
9
|
+
ChannelCreation = 40,
|
|
10
|
+
ChannelMetadata = 41,
|
|
11
|
+
ChannelMessage = 42,
|
|
12
|
+
ChannelHideMessage = 43,
|
|
13
|
+
ChannelMuteUser = 44,
|
|
14
|
+
Report = 1984,
|
|
15
|
+
ZapRequest = 9734,
|
|
16
|
+
Zap = 9735,
|
|
17
|
+
RelayList = 10002,
|
|
18
|
+
ClientAuth = 22242,
|
|
19
|
+
Article = 30023
|
|
20
|
+
}
|
|
21
|
+
export type EventTemplate = {
|
|
22
|
+
kind: Kind;
|
|
23
|
+
tags: string[][];
|
|
24
|
+
content: string;
|
|
25
|
+
created_at: number;
|
|
26
|
+
};
|
|
27
|
+
export type UnsignedEvent = EventTemplate & {
|
|
28
|
+
pubkey: string;
|
|
29
|
+
};
|
|
30
|
+
export type Event = UnsignedEvent & {
|
|
31
|
+
id: string;
|
|
32
|
+
sig: string;
|
|
33
|
+
};
|
|
34
|
+
export declare function getBlankEvent(): EventTemplate;
|
|
35
|
+
export declare function finishEvent(t: EventTemplate, privateKey: string): Event;
|
|
36
|
+
export declare function serializeEvent(evt: UnsignedEvent): string;
|
|
37
|
+
export declare function getEventHash(event: UnsignedEvent): string;
|
|
38
|
+
export declare function validateEvent(event: UnsignedEvent): boolean;
|
|
39
|
+
export declare function verifySignature(event: Event & {
|
|
40
|
+
sig: string;
|
|
41
|
+
}): boolean;
|
|
42
|
+
export declare function signEvent(event: UnsignedEvent, key: string): string;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function getHex64(json: string, field: string): string;
|
|
2
|
+
export declare function getInt(json: string, field: string): number;
|
|
3
|
+
export declare function getSubscriptionId(json: string): string | null;
|
|
4
|
+
export declare function matchEventId(json: string, id: string): boolean;
|
|
5
|
+
export declare function matchEventPubkey(json: string, pubkey: string): boolean;
|
|
6
|
+
export declare function matchEventKind(json: string, kind: number): boolean;
|
package/lib/filter.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Event } from './event';
|
|
2
|
+
export type Filter = {
|
|
3
|
+
ids?: string[];
|
|
4
|
+
kinds?: number[];
|
|
5
|
+
authors?: string[];
|
|
6
|
+
since?: number;
|
|
7
|
+
until?: number;
|
|
8
|
+
limit?: number;
|
|
9
|
+
[key: `#${string}`]: string[];
|
|
10
|
+
};
|
|
11
|
+
export declare function matchFilter(filter: Filter, event: Event & {
|
|
12
|
+
id: string;
|
|
13
|
+
}): boolean;
|
|
14
|
+
export declare function matchFilters(filters: Filter[], event: Event & {
|
|
15
|
+
id: string;
|
|
16
|
+
}): boolean;
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './keys';
|
|
2
|
+
export * from './relay';
|
|
3
|
+
export * from './event';
|
|
4
|
+
export * from './filter';
|
|
5
|
+
export * from './pool';
|
|
6
|
+
export * as nip04 from './nip04';
|
|
7
|
+
export * as nip05 from './nip05';
|
|
8
|
+
export * as nip06 from './nip06';
|
|
9
|
+
export * as nip19 from './nip19';
|
|
10
|
+
export * as nip26 from './nip26';
|
|
11
|
+
export * as nip57 from './nip57';
|
|
12
|
+
export * as fj from './fakejson';
|
|
13
|
+
export * as utils from './utils';
|
package/lib/keys.d.ts
ADDED
package/lib/nip04.d.ts
ADDED
package/lib/nip05.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ProfilePointer } from './nip19';
|
|
2
|
+
export declare function useFetchImplementation(fetchImplementation: any): void;
|
|
3
|
+
export declare function searchDomain(domain: string, query?: string): Promise<{
|
|
4
|
+
[name: string]: string;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function queryProfile(fullname: string): Promise<ProfilePointer | null>;
|
package/lib/nip06.d.ts
ADDED
package/lib/nip19.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type ProfilePointer = {
|
|
2
|
+
pubkey: string;
|
|
3
|
+
relays?: string[];
|
|
4
|
+
};
|
|
5
|
+
export type EventPointer = {
|
|
6
|
+
id: string;
|
|
7
|
+
relays?: string[];
|
|
8
|
+
};
|
|
9
|
+
export type AddressPointer = {
|
|
10
|
+
identifier: string;
|
|
11
|
+
pubkey: string;
|
|
12
|
+
kind: number;
|
|
13
|
+
relays?: string[];
|
|
14
|
+
};
|
|
15
|
+
export declare function decode(nip19: string): {
|
|
16
|
+
type: string;
|
|
17
|
+
data: ProfilePointer | EventPointer | AddressPointer | string;
|
|
18
|
+
};
|
|
19
|
+
export declare function nsecEncode(hex: string): string;
|
|
20
|
+
export declare function npubEncode(hex: string): string;
|
|
21
|
+
export declare function noteEncode(hex: string): string;
|
|
22
|
+
export declare function nprofileEncode(profile: ProfilePointer): string;
|
|
23
|
+
export declare function neventEncode(event: EventPointer): string;
|
|
24
|
+
export declare function naddrEncode(addr: AddressPointer): string;
|
package/lib/nip26.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Event } from './event';
|
|
2
|
+
export type Parameters = {
|
|
3
|
+
pubkey: string;
|
|
4
|
+
kind: number | undefined;
|
|
5
|
+
until: number | undefined;
|
|
6
|
+
since: number | undefined;
|
|
7
|
+
};
|
|
8
|
+
export type Delegation = {
|
|
9
|
+
from: string;
|
|
10
|
+
to: string;
|
|
11
|
+
cond: string;
|
|
12
|
+
sig: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function createDelegation(privateKey: string, parameters: Parameters): Delegation;
|
|
15
|
+
export declare function getDelegator(event: Event): string | null;
|
package/lib/nip57.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Event, EventTemplate } from './event';
|
|
2
|
+
export declare function useFetchImplementation(fetchImplementation: any): void;
|
|
3
|
+
export declare function getZapEndpoint(metadata: Event): Promise<null | string>;
|
|
4
|
+
export declare function makeZapRequest({ profile, event, amount, relays, comment }: {
|
|
5
|
+
profile: string;
|
|
6
|
+
event: string | null;
|
|
7
|
+
amount: number;
|
|
8
|
+
comment: string;
|
|
9
|
+
relays: string[];
|
|
10
|
+
}): EventTemplate;
|
|
11
|
+
export declare function validateZapRequest(zapRequestString: string): string | null;
|
|
12
|
+
export declare function makeZapReceipt({ zapRequest, preimage, bolt11, paidAt }: {
|
|
13
|
+
zapRequest: string;
|
|
14
|
+
preimage: string | null;
|
|
15
|
+
bolt11: string;
|
|
16
|
+
paidAt: Date;
|
|
17
|
+
}): EventTemplate;
|
package/lib/nostr.bundle.js
CHANGED
|
@@ -5144,6 +5144,8 @@ zoo`.split("\n");
|
|
|
5144
5144
|
function validateEvent(event) {
|
|
5145
5145
|
if (typeof event !== "object")
|
|
5146
5146
|
return false;
|
|
5147
|
+
if (typeof event.kind !== "number")
|
|
5148
|
+
return false;
|
|
5147
5149
|
if (typeof event.content !== "string")
|
|
5148
5150
|
return false;
|
|
5149
5151
|
if (typeof event.created_at !== "number")
|
|
@@ -6130,7 +6132,12 @@ zoo`.split("\n");
|
|
|
6130
6132
|
}
|
|
6131
6133
|
if (!name.match(/^[A-Za-z0-9-_]+$/))
|
|
6132
6134
|
return null;
|
|
6133
|
-
let res
|
|
6135
|
+
let res;
|
|
6136
|
+
try {
|
|
6137
|
+
res = await (await _fetch(`https://${domain}/.well-known/nostr.json?name=${name}`)).json();
|
|
6138
|
+
} catch (err) {
|
|
6139
|
+
return null;
|
|
6140
|
+
}
|
|
6134
6141
|
if (!res?.names?.[name])
|
|
6135
6142
|
return null;
|
|
6136
6143
|
let pubkey = res.names[name];
|