295 lines
15 KiB
JavaScript
295 lines
15 KiB
JavaScript
"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
};
|
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
};
|
|
var _EventPublisher_instances, _EventPublisher_system, _EventPublisher_pubKey, _EventPublisher_privateKey, _EventPublisher_hasNip07_get, _EventPublisher_eb, _EventPublisher_sign;
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.EventPublisher = void 0;
|
|
const secp = __importStar(require("@noble/curves/secp256k1"));
|
|
const utils = __importStar(require("@noble/curves/abstract/utils"));
|
|
const _1 = require(".");
|
|
const Util_1 = require("./Util");
|
|
const EventBuilder_1 = require("./EventBuilder");
|
|
const EventExt_1 = require("./EventExt");
|
|
const WorkQueue_1 = require("./WorkQueue");
|
|
const Nip7Queue = [];
|
|
(0, WorkQueue_1.processWorkQueue)(Nip7Queue);
|
|
class EventPublisher {
|
|
constructor(system, pubKey, privKey) {
|
|
_EventPublisher_instances.add(this);
|
|
_EventPublisher_system.set(this, void 0);
|
|
_EventPublisher_pubKey.set(this, void 0);
|
|
_EventPublisher_privateKey.set(this, void 0);
|
|
__classPrivateFieldSet(this, _EventPublisher_system, system, "f");
|
|
if (privKey) {
|
|
__classPrivateFieldSet(this, _EventPublisher_privateKey, privKey, "f");
|
|
__classPrivateFieldSet(this, _EventPublisher_pubKey, utils.bytesToHex(secp.schnorr.getPublicKey(privKey)), "f");
|
|
}
|
|
else {
|
|
__classPrivateFieldSet(this, _EventPublisher_pubKey, pubKey, "f");
|
|
}
|
|
}
|
|
async nip4Encrypt(content, key) {
|
|
if (__classPrivateFieldGet(this, _EventPublisher_instances, "a", _EventPublisher_hasNip07_get) && !__classPrivateFieldGet(this, _EventPublisher_privateKey, "f")) {
|
|
const nip7PubKey = await (0, WorkQueue_1.barrierQueue)(Nip7Queue, () => (0, Util_1.unwrap)(window.nostr).getPublicKey());
|
|
if (nip7PubKey !== __classPrivateFieldGet(this, _EventPublisher_pubKey, "f")) {
|
|
throw new Error("Can't encrypt content, NIP-07 pubkey does not match");
|
|
}
|
|
return await (0, WorkQueue_1.barrierQueue)(Nip7Queue, () => (0, Util_1.unwrap)(window.nostr?.nip04?.encrypt).call(window.nostr?.nip04, key, content));
|
|
}
|
|
else if (__classPrivateFieldGet(this, _EventPublisher_privateKey, "f")) {
|
|
return await EventExt_1.EventExt.encryptData(content, key, __classPrivateFieldGet(this, _EventPublisher_privateKey, "f"));
|
|
}
|
|
else {
|
|
throw new Error("Can't encrypt content, no private keys available");
|
|
}
|
|
}
|
|
async nip4Decrypt(content, otherKey) {
|
|
if (__classPrivateFieldGet(this, _EventPublisher_instances, "a", _EventPublisher_hasNip07_get) && !__classPrivateFieldGet(this, _EventPublisher_privateKey, "f") && window.nostr?.nip04?.decrypt) {
|
|
return await (0, WorkQueue_1.barrierQueue)(Nip7Queue, () => (0, Util_1.unwrap)(window.nostr?.nip04?.decrypt).call(window.nostr?.nip04, otherKey, content));
|
|
}
|
|
else if (__classPrivateFieldGet(this, _EventPublisher_privateKey, "f")) {
|
|
return await EventExt_1.EventExt.decryptDm(content, __classPrivateFieldGet(this, _EventPublisher_privateKey, "f"), otherKey);
|
|
}
|
|
else {
|
|
throw new Error("Can't decrypt content, no private keys available");
|
|
}
|
|
}
|
|
async nip42Auth(challenge, relay) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.Auth);
|
|
eb.tag(["relay", relay]);
|
|
eb.tag(["challenge", challenge]);
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
broadcast(ev) {
|
|
console.debug(ev);
|
|
__classPrivateFieldGet(this, _EventPublisher_system, "f").BroadcastEvent(ev);
|
|
}
|
|
/**
|
|
* Write event to all given relays.
|
|
*/
|
|
broadcastAll(ev, relays) {
|
|
for (const k of relays) {
|
|
__classPrivateFieldGet(this, _EventPublisher_system, "f").WriteOnceToRelay(k, ev);
|
|
}
|
|
}
|
|
async muted(keys, priv) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.PubkeyLists);
|
|
eb.tag(["d", _1.Lists.Muted]);
|
|
keys.forEach(p => {
|
|
eb.tag(["p", p]);
|
|
});
|
|
if (priv.length > 0) {
|
|
const ps = priv.map(p => ["p", p]);
|
|
const plaintext = JSON.stringify(ps);
|
|
eb.content(await this.nip4Encrypt(plaintext, __classPrivateFieldGet(this, _EventPublisher_pubKey, "f")));
|
|
}
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
async noteList(notes, list) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.NoteLists);
|
|
eb.tag(["d", list]);
|
|
notes.forEach(n => {
|
|
eb.tag(["e", n]);
|
|
});
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
async tags(tags) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.TagLists);
|
|
eb.tag(["d", _1.Lists.Followed]);
|
|
tags.forEach(t => {
|
|
eb.tag(["t", t]);
|
|
});
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
async metadata(obj) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.SetMetadata);
|
|
eb.content(JSON.stringify(obj));
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
/**
|
|
* Create a basic text note
|
|
*/
|
|
async note(msg, fnExtra) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.TextNote);
|
|
eb.content(msg);
|
|
eb.processContent();
|
|
fnExtra?.(eb);
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
/**
|
|
* Create a zap request event for a given target event/profile
|
|
* @param amount Millisats amout!
|
|
* @param author Author pubkey to tag in the zap
|
|
* @param note Note Id to tag in the zap
|
|
* @param msg Custom message to be included in the zap
|
|
*/
|
|
async zap(amount, author, relays, note, msg, fnExtra) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.ZapRequest);
|
|
eb.content(msg ?? "");
|
|
if (note) {
|
|
eb.tag(["e", note]);
|
|
}
|
|
eb.tag(["p", author]);
|
|
eb.tag(["relays", ...relays.map(a => a.trim())]);
|
|
eb.tag(["amount", amount.toString()]);
|
|
eb.processContent();
|
|
fnExtra?.(eb);
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
/**
|
|
* Reply to a note
|
|
*/
|
|
async reply(replyTo, msg, fnExtra) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.TextNote);
|
|
eb.content(msg);
|
|
const thread = EventExt_1.EventExt.extractThread(replyTo);
|
|
if (thread) {
|
|
if (thread.root || thread.replyTo) {
|
|
eb.tag(["e", thread.root?.Event ?? thread.replyTo?.Event ?? "", "", "root"]);
|
|
}
|
|
eb.tag(["e", replyTo.id, replyTo.relays?.[0] ?? "", "reply"]);
|
|
eb.tag(["p", replyTo.pubkey]);
|
|
for (const pk of thread.pubKeys) {
|
|
if (pk === __classPrivateFieldGet(this, _EventPublisher_pubKey, "f")) {
|
|
continue;
|
|
}
|
|
eb.tag(["p", pk]);
|
|
}
|
|
}
|
|
else {
|
|
eb.tag(["e", replyTo.id, "", "reply"]);
|
|
// dont tag self in replies
|
|
if (replyTo.pubkey !== __classPrivateFieldGet(this, _EventPublisher_pubKey, "f")) {
|
|
eb.tag(["p", replyTo.pubkey]);
|
|
}
|
|
}
|
|
eb.processContent();
|
|
fnExtra?.(eb);
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
async react(evRef, content = "+") {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.Reaction);
|
|
eb.content(content);
|
|
eb.tag(["e", evRef.id]);
|
|
eb.tag(["p", evRef.pubkey]);
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
async relayList(relays) {
|
|
if (!Array.isArray(relays)) {
|
|
relays = Object.entries(relays).map(([k, v]) => ({
|
|
url: k,
|
|
settings: v,
|
|
}));
|
|
}
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.Relays);
|
|
for (const rx of relays) {
|
|
const rTag = ["r", rx.url];
|
|
if (rx.settings.read && !rx.settings.write) {
|
|
rTag.push("read");
|
|
}
|
|
if (rx.settings.write && !rx.settings.read) {
|
|
rTag.push("write");
|
|
}
|
|
eb.tag(rTag);
|
|
}
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
async contactList(follows, relays) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.ContactList);
|
|
eb.content(JSON.stringify(relays));
|
|
const temp = new Set(follows.filter(a => a.length === 64).map(a => a.toLowerCase()));
|
|
temp.forEach(a => eb.tag(["p", a]));
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
/**
|
|
* Delete an event (NIP-09)
|
|
*/
|
|
async delete(id) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.Deletion);
|
|
eb.tag(["e", id]);
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
/**
|
|
* Repost a note (NIP-18)
|
|
*/
|
|
async repost(note) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.Repost);
|
|
eb.tag(["e", note.id, ""]);
|
|
eb.tag(["p", note.pubkey]);
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
async decryptDm(note) {
|
|
if (note.pubkey !== __classPrivateFieldGet(this, _EventPublisher_pubKey, "f") && !note.tags.some(a => a[1] === __classPrivateFieldGet(this, _EventPublisher_pubKey, "f"))) {
|
|
throw new Error("Can't decrypt, DM does not belong to this user");
|
|
}
|
|
const otherPubKey = note.pubkey === __classPrivateFieldGet(this, _EventPublisher_pubKey, "f") ? (0, Util_1.unwrap)(note.tags.find(a => a[0] === "p")?.[1]) : note.pubkey;
|
|
return await this.nip4Decrypt(note.content, otherPubKey);
|
|
}
|
|
async sendDm(content, to) {
|
|
const eb = __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_eb).call(this, _1.EventKind.DirectMessage);
|
|
eb.content(await this.nip4Encrypt(content, to));
|
|
eb.tag(["p", to]);
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
async generic(fnHook) {
|
|
const eb = new EventBuilder_1.EventBuilder();
|
|
eb.pubKey(__classPrivateFieldGet(this, _EventPublisher_pubKey, "f"));
|
|
fnHook(eb);
|
|
return await __classPrivateFieldGet(this, _EventPublisher_instances, "m", _EventPublisher_sign).call(this, eb);
|
|
}
|
|
}
|
|
exports.EventPublisher = EventPublisher;
|
|
_EventPublisher_system = new WeakMap(), _EventPublisher_pubKey = new WeakMap(), _EventPublisher_privateKey = new WeakMap(), _EventPublisher_instances = new WeakSet(), _EventPublisher_hasNip07_get = function _EventPublisher_hasNip07_get() {
|
|
return "nostr" in window;
|
|
}, _EventPublisher_eb = function _EventPublisher_eb(k) {
|
|
const eb = new EventBuilder_1.EventBuilder();
|
|
return eb.pubKey(__classPrivateFieldGet(this, _EventPublisher_pubKey, "f")).kind(k);
|
|
}, _EventPublisher_sign = async function _EventPublisher_sign(eb) {
|
|
if (__classPrivateFieldGet(this, _EventPublisher_instances, "a", _EventPublisher_hasNip07_get) && !__classPrivateFieldGet(this, _EventPublisher_privateKey, "f")) {
|
|
const nip7PubKey = await (0, WorkQueue_1.barrierQueue)(Nip7Queue, () => (0, Util_1.unwrap)(window.nostr).getPublicKey());
|
|
if (nip7PubKey !== __classPrivateFieldGet(this, _EventPublisher_pubKey, "f")) {
|
|
throw new Error("Can't sign event, NIP-07 pubkey does not match");
|
|
}
|
|
const ev = eb.build();
|
|
return await (0, WorkQueue_1.barrierQueue)(Nip7Queue, () => (0, Util_1.unwrap)(window.nostr).signEvent(ev));
|
|
}
|
|
else if (__classPrivateFieldGet(this, _EventPublisher_privateKey, "f")) {
|
|
return await eb.buildAndSign(__classPrivateFieldGet(this, _EventPublisher_privateKey, "f"));
|
|
}
|
|
else {
|
|
throw new Error("Can't sign event, no private keys available");
|
|
}
|
|
};
|
|
//# sourceMappingURL=EventPublisher.js.map
|