nostr-tools 1.8.1 → 1.8.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/lib/esm/nostr.mjs +91 -18
- package/lib/esm/nostr.mjs.map +3 -3
- package/lib/index.d.ts +1 -0
- package/lib/nip10.d.ts +21 -0
- package/lib/nostr.bundle.js +93 -19
- package/lib/nostr.bundle.js.map +3 -3
- package/lib/nostr.cjs.js +91 -18
- package/lib/nostr.cjs.js.map +3 -3
- package/package.json +1 -1
package/lib/esm/nostr.mjs
CHANGED
|
@@ -296,8 +296,11 @@ function relayInit(url, options = {}) {
|
|
|
296
296
|
};
|
|
297
297
|
var subListeners = {};
|
|
298
298
|
var pubListeners = {};
|
|
299
|
+
var connectionPromise;
|
|
299
300
|
async function connectRelay() {
|
|
300
|
-
|
|
301
|
+
if (connectionPromise)
|
|
302
|
+
return connectionPromise;
|
|
303
|
+
connectionPromise = new Promise((resolve, reject) => {
|
|
301
304
|
try {
|
|
302
305
|
ws = new WebSocket(url);
|
|
303
306
|
} catch (err) {
|
|
@@ -308,10 +311,12 @@ function relayInit(url, options = {}) {
|
|
|
308
311
|
resolve();
|
|
309
312
|
};
|
|
310
313
|
ws.onerror = () => {
|
|
314
|
+
connectionPromise = void 0;
|
|
311
315
|
listeners.error.forEach((cb) => cb());
|
|
312
316
|
reject();
|
|
313
317
|
};
|
|
314
318
|
ws.onclose = async () => {
|
|
319
|
+
connectionPromise = void 0;
|
|
315
320
|
listeners.disconnect.forEach((cb) => cb());
|
|
316
321
|
};
|
|
317
322
|
let incomingMessageQueue = [];
|
|
@@ -381,6 +386,7 @@ function relayInit(url, options = {}) {
|
|
|
381
386
|
}
|
|
382
387
|
}
|
|
383
388
|
});
|
|
389
|
+
return connectionPromise;
|
|
384
390
|
}
|
|
385
391
|
function connected() {
|
|
386
392
|
return ws?.readyState === 1;
|
|
@@ -544,18 +550,13 @@ var SimplePool = class {
|
|
|
544
550
|
}
|
|
545
551
|
async ensureRelay(url) {
|
|
546
552
|
const nm = normalizeURL(url);
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
return existing;
|
|
553
|
+
if (!this._conn[nm]) {
|
|
554
|
+
this._conn[nm] = relayInit(nm, {
|
|
555
|
+
getTimeout: this.getTimeout * 0.9,
|
|
556
|
+
listTimeout: this.getTimeout * 0.9
|
|
557
|
+
});
|
|
553
558
|
}
|
|
554
|
-
const relay =
|
|
555
|
-
getTimeout: this.getTimeout * 0.9,
|
|
556
|
-
listTimeout: this.getTimeout * 0.9
|
|
557
|
-
});
|
|
558
|
-
this._conn[nm] = relay;
|
|
559
|
+
const relay = this._conn[nm];
|
|
559
560
|
await relay.connect();
|
|
560
561
|
return relay;
|
|
561
562
|
}
|
|
@@ -664,22 +665,35 @@ var SimplePool = class {
|
|
|
664
665
|
});
|
|
665
666
|
}
|
|
666
667
|
publish(relays, event) {
|
|
667
|
-
const
|
|
668
|
-
relays.forEach(async (relay) => {
|
|
668
|
+
const pubPromises = relays.map(async (relay) => {
|
|
669
669
|
let r;
|
|
670
670
|
try {
|
|
671
671
|
r = await this.ensureRelay(relay);
|
|
672
|
-
|
|
672
|
+
return r.publish(event);
|
|
673
673
|
} catch (_) {
|
|
674
|
+
return { on() {
|
|
675
|
+
}, off() {
|
|
676
|
+
} };
|
|
674
677
|
}
|
|
675
678
|
});
|
|
679
|
+
const callbackMap = /* @__PURE__ */ new Map();
|
|
676
680
|
return {
|
|
677
681
|
on(type, cb) {
|
|
678
|
-
|
|
679
|
-
pub
|
|
682
|
+
relays.forEach(async (relay, i) => {
|
|
683
|
+
let pub = await pubPromises[i];
|
|
684
|
+
let callback = () => cb(relay);
|
|
685
|
+
callbackMap.set(cb, callback);
|
|
686
|
+
pub.on(type, callback);
|
|
680
687
|
});
|
|
681
688
|
},
|
|
682
|
-
off() {
|
|
689
|
+
off(type, cb) {
|
|
690
|
+
relays.forEach(async (_, i) => {
|
|
691
|
+
let callback = callbackMap.get(cb);
|
|
692
|
+
if (callback) {
|
|
693
|
+
let pub = await pubPromises[i];
|
|
694
|
+
pub.off(type, callback);
|
|
695
|
+
}
|
|
696
|
+
});
|
|
683
697
|
}
|
|
684
698
|
};
|
|
685
699
|
}
|
|
@@ -1061,6 +1075,64 @@ function validateWords(words) {
|
|
|
1061
1075
|
return validateMnemonic(words, wordlist);
|
|
1062
1076
|
}
|
|
1063
1077
|
|
|
1078
|
+
// nip10.ts
|
|
1079
|
+
var nip10_exports = {};
|
|
1080
|
+
__export(nip10_exports, {
|
|
1081
|
+
parse: () => parse
|
|
1082
|
+
});
|
|
1083
|
+
function parse(event) {
|
|
1084
|
+
const result = {
|
|
1085
|
+
reply: void 0,
|
|
1086
|
+
root: void 0,
|
|
1087
|
+
mentions: [],
|
|
1088
|
+
profiles: []
|
|
1089
|
+
};
|
|
1090
|
+
const eTags = [];
|
|
1091
|
+
for (const tag of event.tags) {
|
|
1092
|
+
if (tag[0] === "e" && tag[1]) {
|
|
1093
|
+
eTags.push(tag);
|
|
1094
|
+
}
|
|
1095
|
+
if (tag[0] === "p" && tag[1]) {
|
|
1096
|
+
result.profiles.push({
|
|
1097
|
+
pubkey: tag[1],
|
|
1098
|
+
relays: tag[2] ? [tag[2]] : []
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
for (let eTagIndex = 0; eTagIndex < eTags.length; eTagIndex++) {
|
|
1103
|
+
const eTag = eTags[eTagIndex];
|
|
1104
|
+
const [_, eTagEventId, eTagRelayUrl, eTagMarker] = eTag;
|
|
1105
|
+
const eventPointer = {
|
|
1106
|
+
id: eTagEventId,
|
|
1107
|
+
relays: eTagRelayUrl ? [eTagRelayUrl] : []
|
|
1108
|
+
};
|
|
1109
|
+
const isFirstETag = eTagIndex === 0;
|
|
1110
|
+
const isLastETag = eTagIndex === eTags.length - 1;
|
|
1111
|
+
if (eTagMarker === "root") {
|
|
1112
|
+
result.root = eventPointer;
|
|
1113
|
+
continue;
|
|
1114
|
+
}
|
|
1115
|
+
if (eTagMarker === "reply") {
|
|
1116
|
+
result.reply = eventPointer;
|
|
1117
|
+
continue;
|
|
1118
|
+
}
|
|
1119
|
+
if (eTagMarker === "mention") {
|
|
1120
|
+
result.mentions.push(eventPointer);
|
|
1121
|
+
continue;
|
|
1122
|
+
}
|
|
1123
|
+
if (isFirstETag) {
|
|
1124
|
+
result.root = eventPointer;
|
|
1125
|
+
continue;
|
|
1126
|
+
}
|
|
1127
|
+
if (isLastETag) {
|
|
1128
|
+
result.reply = eventPointer;
|
|
1129
|
+
continue;
|
|
1130
|
+
}
|
|
1131
|
+
result.mentions.push(eventPointer);
|
|
1132
|
+
}
|
|
1133
|
+
return result;
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1064
1136
|
// nip26.ts
|
|
1065
1137
|
var nip26_exports = {};
|
|
1066
1138
|
__export(nip26_exports, {
|
|
@@ -1280,6 +1352,7 @@ export {
|
|
|
1280
1352
|
nip04_exports as nip04,
|
|
1281
1353
|
nip05_exports as nip05,
|
|
1282
1354
|
nip06_exports as nip06,
|
|
1355
|
+
nip10_exports as nip10,
|
|
1283
1356
|
nip19_exports as nip19,
|
|
1284
1357
|
nip26_exports as nip26,
|
|
1285
1358
|
nip39_exports as nip39,
|
package/lib/esm/nostr.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../keys.ts", "../../event.ts", "../../utils.ts", "../../filter.ts", "../../fakejson.ts", "../../relay.ts", "../../pool.ts", "../../nip19.ts", "../../references.ts", "../../nip04.ts", "../../nip05.ts", "../../nip06.ts", "../../nip26.ts", "../../nip39.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.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 search?: string\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 = {\n connect: () => void | Promise<void>\n disconnect: () => void | Promise<void>\n error: () => void | Promise<void>\n notice: (msg: string) => void | Promise<void>\n}\ntype SubEvent = {\n event: (event: Event) => void | Promise<void>\n eose: () => void | Promise<void>\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 off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n event: T,\n listener: U\n ) => void\n on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n event: T,\n listener: U\n ) => 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: <T extends keyof SubEvent, U extends SubEvent[T]>(\n event: T,\n listener: U\n ) => void\n off: <T extends keyof SubEvent, U extends SubEvent[T]>(\n event: T,\n listener: U\n ) => 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: {[TK in keyof RelayEvent]: RelayEvent[TK][]} = {\n connect: [],\n disconnect: [],\n error: [],\n notice: []\n }\n var subListeners: {\n [subid: string]: {[TK in keyof SubEvent]: SubEvent[TK][]}\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 try {\n ws = new WebSocket(url)\n } catch (err) {\n reject(err)\n }\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: <T extends keyof SubEvent, U extends SubEvent[T]>(\n type: T,\n cb: U\n ): void => {\n subListeners[subid] = subListeners[subid] || {\n event: [],\n eose: []\n }\n subListeners[subid][type].push(cb)\n },\n off: <T extends keyof SubEvent, U extends SubEvent[T]>(\n type: T,\n cb: U\n ): 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: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n type: T,\n cb: U\n ): void => {\n listeners[type].push(cb)\n if (type === 'connect' && ws?.readyState === 1) {\n // i would love to know why we need this\n ;(cb as () => void)()\n }\n },\n off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n type: T,\n cb: U\n ): 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 if (ws.readyState === WebSocket.OPEN) {\n ws?.close()\n }\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 && existing.status === 1) return existing\n\n if (existing) {\n await existing.connect()\n return existing\n }\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 if (opts?.alreadyHaveEvent?.(id, url)) {\n return true\n }\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 if (type === 'event') {\n eventListeners.add(cb)\n } else if (type === 'eose') {\n eoseListeners.add(cb as () => void | Promise<void>)\n }\n },\n off(type, cb) {\n if (type === 'event') {\n eventListeners.delete(cb)\n } else if (type === 'eose')\n eoseListeners.delete(cb as () => void | Promise<void>)\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 const pubs: Pub[] = []\n relays.forEach(async relay => {\n let r\n try {\n r = await this.ensureRelay(relay)\n pubs.push(r.publish(event))\n } catch (_) {}\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", "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 author?: 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 if (tlv[2] && tlv[2][0].length !== 32)\n throw new Error('TLV 2 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 author: tlv[2]?.[0]\n ? secp256k1.utils.bytesToHex(tlv[2][0])\n : undefined\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 2: event.author ? [secp256k1.utils.hexToBytes(event.author)] : []\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 {Event} from './event'\nimport {decode, AddressPointer, ProfilePointer, EventPointer} from './nip19'\n\ntype Reference = {\n text: string\n profile?: ProfilePointer\n event?: EventPointer\n address?: AddressPointer\n}\n\nconst mentionRegex =\n /\\bnostr:((note|npub|naddr|nevent|nprofile)1\\w+)\\b|#\\[(\\d+)\\]/g\n\nexport function parseReferences(evt: Event): Reference[] {\n let references: Reference[] = []\n for (let ref of evt.content.matchAll(mentionRegex)) {\n if (ref[2]) {\n // it's a NIP-27 mention\n try {\n let {type, data} = decode(ref[1])\n switch (type) {\n case 'npub': {\n references.push({\n text: ref[0],\n profile: {pubkey: data as string, relays: []}\n })\n break\n }\n case 'nprofile': {\n references.push({\n text: ref[0],\n profile: data as ProfilePointer\n })\n break\n }\n case 'note': {\n references.push({\n text: ref[0],\n event: {id: data as string, relays: []}\n })\n break\n }\n case 'nevent': {\n references.push({\n text: ref[0],\n event: data as EventPointer\n })\n break\n }\n case 'naddr': {\n references.push({\n text: ref[0],\n address: data as AddressPointer\n })\n break\n }\n }\n } catch (err) {\n /***/\n }\n } else if (ref[3]) {\n // it's a NIP-10 mention\n let idx = parseInt(ref[3], 10)\n let tag = evt.tags[idx]\n if (!tag) continue\n\n switch (tag[0]) {\n case 'p': {\n references.push({\n text: ref[0],\n profile: {pubkey: tag[1], relays: tag[2] ? [tag[2]] : []}\n })\n break\n }\n case 'e': {\n references.push({\n text: ref[0],\n event: {id: tag[1], relays: tag[2] ? [tag[2]] : []}\n })\n break\n }\n case 'a': {\n try {\n let [kind, pubkey, identifier] = ref[1].split(':')\n references.push({\n text: ref[0],\n address: {\n identifier,\n pubkey,\n kind: parseInt(kind, 10),\n relays: tag[2] ? [tag[2]] : []\n }\n })\n } catch (err) {\n /***/\n }\n break\n }\n }\n }\n }\n\n return references\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 if (!domain.includes('.')) 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 {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", "var _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function validateGithub(\n pubkey: string,\n username: string,\n proof: string\n): Promise<boolean> {\n try {\n let res = await (\n await _fetch(`https://gist.github.com/${username}/${proof}/raw`)\n ).text()\n return (\n res ===\n `Verifying that I control the following Nostr public key: ${pubkey}`\n )\n } catch (_) {\n return false\n }\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'\nexport * from './references'\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 nip39 from './nip39'\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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",
|
|
3
|
+
"sources": ["../../keys.ts", "../../event.ts", "../../utils.ts", "../../filter.ts", "../../fakejson.ts", "../../relay.ts", "../../pool.ts", "../../nip19.ts", "../../references.ts", "../../nip04.ts", "../../nip05.ts", "../../nip06.ts", "../../nip10.ts", "../../nip26.ts", "../../nip39.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.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 search?: string\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 = {\n connect: () => void | Promise<void>\n disconnect: () => void | Promise<void>\n error: () => void | Promise<void>\n notice: (msg: string) => void | Promise<void>\n}\ntype SubEvent = {\n event: (event: Event) => void | Promise<void>\n eose: () => void | Promise<void>\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 off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n event: T,\n listener: U\n ) => void\n on: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n event: T,\n listener: U\n ) => 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: <T extends keyof SubEvent, U extends SubEvent[T]>(\n event: T,\n listener: U\n ) => void\n off: <T extends keyof SubEvent, U extends SubEvent[T]>(\n event: T,\n listener: U\n ) => 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: {[TK in keyof RelayEvent]: RelayEvent[TK][]} = {\n connect: [],\n disconnect: [],\n error: [],\n notice: []\n }\n var subListeners: {\n [subid: string]: {[TK in keyof SubEvent]: SubEvent[TK][]}\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 var connectionPromise: Promise<void> | undefined\n async function connectRelay(): Promise<void> {\n if (connectionPromise) return connectionPromise\n connectionPromise = new Promise((resolve, reject) => {\n try {\n ws = new WebSocket(url)\n } catch (err) {\n reject(err)\n }\n\n ws.onopen = () => {\n listeners.connect.forEach(cb => cb())\n resolve()\n }\n ws.onerror = () => {\n connectionPromise = undefined\n listeners.error.forEach(cb => cb())\n reject()\n }\n ws.onclose = async () => {\n connectionPromise = undefined\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 return connectionPromise\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: <T extends keyof SubEvent, U extends SubEvent[T]>(\n type: T,\n cb: U\n ): void => {\n subListeners[subid] = subListeners[subid] || {\n event: [],\n eose: []\n }\n subListeners[subid][type].push(cb)\n },\n off: <T extends keyof SubEvent, U extends SubEvent[T]>(\n type: T,\n cb: U\n ): 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: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n type: T,\n cb: U\n ): void => {\n listeners[type].push(cb)\n if (type === 'connect' && ws?.readyState === 1) {\n // i would love to know why we need this\n ;(cb as () => void)()\n }\n },\n off: <T extends keyof RelayEvent, U extends RelayEvent[T]>(\n type: T,\n cb: U\n ): 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 if (ws.readyState === WebSocket.OPEN) {\n ws?.close()\n }\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\n if (!this._conn[nm]) {\n this._conn[nm] = relayInit(nm, {\n getTimeout: this.getTimeout * 0.9,\n listTimeout: this.getTimeout * 0.9\n })\n }\n\n const relay = this._conn[nm]\n await relay.connect()\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 if (opts?.alreadyHaveEvent?.(id, url)) {\n return true\n }\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 if (type === 'event') {\n eventListeners.add(cb)\n } else if (type === 'eose') {\n eoseListeners.add(cb as () => void | Promise<void>)\n }\n },\n off(type, cb) {\n if (type === 'event') {\n eventListeners.delete(cb)\n } else if (type === 'eose')\n eoseListeners.delete(cb as () => void | Promise<void>)\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 const pubPromises: Promise<Pub>[] = relays.map(async relay => {\n let r\n try {\n r = await this.ensureRelay(relay)\n return r.publish(event)\n } catch (_) {\n return {on() {}, off() {}}\n }\n })\n\n const callbackMap = new Map()\n\n return {\n on(type, cb) {\n relays.forEach(async (relay, i) => {\n let pub = await pubPromises[i]\n let callback = () => cb(relay)\n callbackMap.set(cb, callback)\n pub.on(type, callback)\n })\n },\n\n off(type, cb) {\n relays.forEach(async (_, i) => {\n let callback = callbackMap.get(cb)\n if (callback) {\n let pub = await pubPromises[i]\n pub.off(type, callback)\n }\n })\n }\n }\n }\n\n seenOn(id: string): string[] {\n return Array.from(this._seenOn[id]?.values?.() || [])\n }\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 author?: 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 if (tlv[2] && tlv[2][0].length !== 32)\n throw new Error('TLV 2 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 author: tlv[2]?.[0]\n ? secp256k1.utils.bytesToHex(tlv[2][0])\n : undefined\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 2: event.author ? [secp256k1.utils.hexToBytes(event.author)] : []\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 {Event} from './event'\nimport {decode, AddressPointer, ProfilePointer, EventPointer} from './nip19'\n\ntype Reference = {\n text: string\n profile?: ProfilePointer\n event?: EventPointer\n address?: AddressPointer\n}\n\nconst mentionRegex =\n /\\bnostr:((note|npub|naddr|nevent|nprofile)1\\w+)\\b|#\\[(\\d+)\\]/g\n\nexport function parseReferences(evt: Event): Reference[] {\n let references: Reference[] = []\n for (let ref of evt.content.matchAll(mentionRegex)) {\n if (ref[2]) {\n // it's a NIP-27 mention\n try {\n let {type, data} = decode(ref[1])\n switch (type) {\n case 'npub': {\n references.push({\n text: ref[0],\n profile: {pubkey: data as string, relays: []}\n })\n break\n }\n case 'nprofile': {\n references.push({\n text: ref[0],\n profile: data as ProfilePointer\n })\n break\n }\n case 'note': {\n references.push({\n text: ref[0],\n event: {id: data as string, relays: []}\n })\n break\n }\n case 'nevent': {\n references.push({\n text: ref[0],\n event: data as EventPointer\n })\n break\n }\n case 'naddr': {\n references.push({\n text: ref[0],\n address: data as AddressPointer\n })\n break\n }\n }\n } catch (err) {\n /***/\n }\n } else if (ref[3]) {\n // it's a NIP-10 mention\n let idx = parseInt(ref[3], 10)\n let tag = evt.tags[idx]\n if (!tag) continue\n\n switch (tag[0]) {\n case 'p': {\n references.push({\n text: ref[0],\n profile: {pubkey: tag[1], relays: tag[2] ? [tag[2]] : []}\n })\n break\n }\n case 'e': {\n references.push({\n text: ref[0],\n event: {id: tag[1], relays: tag[2] ? [tag[2]] : []}\n })\n break\n }\n case 'a': {\n try {\n let [kind, pubkey, identifier] = ref[1].split(':')\n references.push({\n text: ref[0],\n address: {\n identifier,\n pubkey,\n kind: parseInt(kind, 10),\n relays: tag[2] ? [tag[2]] : []\n }\n })\n } catch (err) {\n /***/\n }\n break\n }\n }\n }\n }\n\n return references\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 if (!domain.includes('.')) 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 type {Event} from './event'\nimport type {EventPointer, ProfilePointer} from './nip19'\n\nexport type NIP10Result = {\n /**\n * Pointer to the root of the thread.\n */\n root: EventPointer | undefined\n\n /**\n * Pointer to a \"parent\" event that parsed event replies to (responded to).\n */\n reply: EventPointer | undefined\n\n /**\n * Pointers to events which may or may not be in the reply chain.\n */\n mentions: EventPointer[]\n\n /**\n * List of pubkeys that are involved in the thread in no particular order.\n */\n profiles: ProfilePointer[]\n}\n\nexport function parse(event: Pick<Event, 'tags'>): NIP10Result {\n const result: NIP10Result = {\n reply: undefined,\n root: undefined,\n mentions: [],\n profiles: []\n }\n\n const eTags: string[][] = []\n\n for (const tag of event.tags) {\n if (tag[0] === 'e' && tag[1]) {\n eTags.push(tag)\n }\n\n if (tag[0] === 'p' && tag[1]) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : []\n })\n }\n }\n\n for (let eTagIndex = 0; eTagIndex < eTags.length; eTagIndex++) {\n const eTag = eTags[eTagIndex]\n\n const [_, eTagEventId, eTagRelayUrl, eTagMarker] = eTag as [\n string,\n string,\n undefined | string,\n undefined | string\n ]\n\n const eventPointer: EventPointer = {\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : []\n }\n\n const isFirstETag = eTagIndex === 0\n const isLastETag = eTagIndex === eTags.length - 1\n\n if (eTagMarker === 'root') {\n result.root = eventPointer\n continue\n }\n\n if (eTagMarker === 'reply') {\n result.reply = eventPointer\n continue\n }\n\n if (eTagMarker === 'mention') {\n result.mentions.push(eventPointer)\n continue\n }\n\n if (isFirstETag) {\n result.root = eventPointer\n continue\n }\n\n if (isLastETag) {\n result.reply = eventPointer\n continue\n }\n\n result.mentions.push(eventPointer)\n }\n\n return result\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", "var _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function validateGithub(\n pubkey: string,\n username: string,\n proof: string\n): Promise<boolean> {\n try {\n let res = await (\n await _fetch(`https://gist.github.com/${username}/${proof}/raw`)\n ).text()\n return (\n res ===\n `Verifying that I control the following Nostr public key: ${pubkey}`\n )\n } catch (_) {\n return false\n }\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'\nexport * from './references'\n\nexport * as nip04 from './nip04'\nexport * as nip05 from './nip05'\nexport * as nip06 from './nip06'\nexport * as nip10 from './nip10'\nexport * as nip19 from './nip19'\nexport * as nip26 from './nip26'\nexport * as nip39 from './nip39'\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", "_fetch", "useFetchImplementation", "bech32", "_fetch", "useFetchImplementation", "bech32", "secp256k1", "sha256"]
|
|
7
7
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from './references';
|
|
|
7
7
|
export * as nip04 from './nip04';
|
|
8
8
|
export * as nip05 from './nip05';
|
|
9
9
|
export * as nip06 from './nip06';
|
|
10
|
+
export * as nip10 from './nip10';
|
|
10
11
|
export * as nip19 from './nip19';
|
|
11
12
|
export * as nip26 from './nip26';
|
|
12
13
|
export * as nip39 from './nip39';
|
package/lib/nip10.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Event } from './event';
|
|
2
|
+
import type { EventPointer, ProfilePointer } from './nip19';
|
|
3
|
+
export type NIP10Result = {
|
|
4
|
+
/**
|
|
5
|
+
* Pointer to the root of the thread.
|
|
6
|
+
*/
|
|
7
|
+
root: EventPointer | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* Pointer to a "parent" event that parsed event replies to (responded to).
|
|
10
|
+
*/
|
|
11
|
+
reply: EventPointer | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Pointers to events which may or may not be in the reply chain.
|
|
14
|
+
*/
|
|
15
|
+
mentions: EventPointer[];
|
|
16
|
+
/**
|
|
17
|
+
* List of pubkeys that are involved in the thread in no particular order.
|
|
18
|
+
*/
|
|
19
|
+
profiles: ProfilePointer[];
|
|
20
|
+
};
|
|
21
|
+
export declare function parse(event: Pick<Event, 'tags'>): NIP10Result;
|