Merge pull request #1009 from PR0M3TH3AN/codex/require-relay-hint-in-buildrepostevent

Ensure repost events include relay hints and correct kinds
This commit is contained in:
thePR0M3TH3AN authored and GitHub committed 2025-10-30 09:33:08 -04:00
commit 5fde1bb80c
3 files changed
+59 -10

No files matched your search

+9
View File
@@ -626,6 +626,7 @@ export async function repostEvent({
: client?.relays,
);
const relays = relaysOverride.length ? relaysOverride : Array.from(RELAY_URLS);
const chosenPublishRelay = relays.length ? relays[0] : "";
let actorPubkey =
typeof options.actorPubkey === "string" && options.actorPubkey.trim()
@@ -671,15 +672,23 @@ export async function repostEvent({
? options.additionalTags.filter((tag) => Array.isArray(tag) && tag.length >= 2)
: [];
const repostKind =
Number.isFinite(targetKind) && targetKind !== 1
? 16
: 6;
const repostEventPayload = buildRepostEvent({
pubkey: actorPubkey,
created_at: createdAt,
eventId: normalizedId,
eventRelay,
publishRelay: chosenPublishRelay,
address,
addressRelay,
authorPubkey,
additionalTags,
repostKind,
targetKind,
});
try {
+29 -8
View File
@@ -651,22 +651,25 @@ export function buildRepostEvent({
created_at,
eventId = "",
eventRelay = "",
publishRelay = "",
address = "",
addressRelay = "",
authorPubkey = "",
additionalTags = [],
repostKind,
targetKind,
}) {
const schema = getNostrEventSchema(NOTE_TYPES.REPOST);
const tags = [];
const normalizedEventId = typeof eventId === "string" ? eventId.trim() : "";
const normalizedEventRelay = typeof eventRelay === "string" ? eventRelay.trim() : "";
if (normalizedEventId) {
if (normalizedEventRelay) {
tags.push(["e", normalizedEventId, normalizedEventRelay]);
} else {
tags.push(["e", normalizedEventId]);
}
const normalizedEventRelay =
typeof eventRelay === "string" ? eventRelay.trim() : "";
const normalizedPublishRelay =
typeof publishRelay === "string" ? publishRelay.trim() : "";
const resolvedEventRelay = normalizedEventRelay || normalizedPublishRelay;
if (normalizedEventId && resolvedEventRelay) {
tags.push(["e", normalizedEventId, resolvedEventRelay]);
}
const normalizedAddress = typeof address === "string" ? address.trim() : "";
@@ -695,8 +698,26 @@ export function buildRepostEvent({
});
}
const normalizedRepostKind =
Number.isFinite(repostKind) && repostKind !== null
? Math.floor(repostKind)
: null;
const normalizedTargetKind =
Number.isFinite(targetKind) && targetKind !== null
? Math.floor(targetKind)
: null;
const resolvedKind = (() => {
if (normalizedRepostKind) {
return normalizedRepostKind;
}
if (normalizedTargetKind !== null) {
return normalizedTargetKind === 1 ? schema?.kind ?? 6 : 16;
}
return schema?.kind ?? 6;
})();
return {
kind: schema?.kind ?? 6,
kind: resolvedKind,
pubkey,
created_at,
tags,
+21 -2
View File
@@ -84,9 +84,11 @@ function createPublishClient({ actorPubkey = "", sessionPubkey = "", failPublish
created_at: createdAt,
eventId: "event123",
eventRelay: "wss://origin",
publishRelay: "wss://relay.example",
address: "30078:deadbeef:identifier",
addressRelay: "wss://address",
authorPubkey: "deadbeef",
targetKind: 1,
});
assert.equal(event.kind, 6);
@@ -98,6 +100,22 @@ function createPublishClient({ actorPubkey = "", sessionPubkey = "", failPublish
assert.deepEqual(event.tags[2], ["p", "deadbeef"]);
})();
(function testBuildRepostEventFallsBackToPublishRelay() {
const createdAt = 1_700_000_001;
const event = buildRepostEvent({
pubkey: "actorpubkey",
created_at: createdAt,
eventId: "event456",
publishRelay: "wss://relay.example",
authorPubkey: "cafebabe",
targetKind: 30078,
});
assert.equal(event.kind, 16);
assert.deepEqual(event.tags[0], ["e", "event456", "wss://relay.example"]);
assert.deepEqual(event.tags[1], ["p", "cafebabe"]);
})();
await (async function testRepostEventUsesSessionActorAndDerivesAddress() {
const eventId = "test-event";
const authorPubkey = "f".repeat(64);
@@ -117,7 +135,7 @@ await (async function testRepostEventUsesSessionActorAndDerivesAddress() {
client,
eventId,
options: {
pointer: ["e", eventId, "wss://origin"],
pointer: ["e", eventId],
authorPubkey,
},
resolveActiveSigner: () => null,
@@ -129,9 +147,10 @@ await (async function testRepostEventUsesSessionActorAndDerivesAddress() {
assert.equal(result.ok, true);
assert.equal(result.sessionActor, true);
assert.equal(result.signerPubkey, sessionPubkey);
assert.equal(result.event?.kind, 16);
const tags = result.event?.tags || [];
assert.ok(Array.isArray(tags), "Repost event should include tags");
assert.deepEqual(tags[0], ["e", eventId, "wss://origin"]);
assert.deepEqual(tags[0], ["e", eventId, "wss://relay.example"]);
assert.equal(
tags.some((tag) => Array.isArray(tag) && tag[0] === "a" && tag[1].startsWith("30078:")),
true,