feat(platform): reaction.gossip span and toggle metadata (Phase 501)

Track hadMeBefore, added, gossipSent on reaction.toggle; emit
reaction.gossip timing span when fanning out to guild mesh.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Raven Scott
2026-05-24 07:47:23 -04:00
co-authored by Cursor
parent 3a2f1019ac
commit 52bbc82c7d
2 changed files with 31 additions and 3 deletions
+2
View File
@@ -59,6 +59,8 @@ Expose a single `EventEmitter` API the UI drives over IPC (`apps/pearcord/index.
**v0.8.463 (Phase 500):** `message.send` `replyToId`; `message.edit` `deltaLength`; `message.delete` `hadReactions`/`reactionCount`. UI split messaging composer guild-loading compositor. Bundle: `npm run test:phase500-messaging`. See [MESSAGING.md](../../docs/MESSAGING.md).
**v0.8.464 (Phase 501):** `reaction.toggle` `added`/`hadMeBefore`/`gossipSent`; `reaction.gossip` span on mesh fanout. UI `syncReactionPanelsDuringGuildLoading`. Bundle: `npm run test:phase501-reactions`. See [REACTIONS.md](../../docs/REACTIONS.md).
**v0.8.446 (Phase 483):** `guild.search` `includeMesh`/`queryLen`; `pin.list` `pinCount`. UI search compositor split + hints. Bundle: `npm run test:phase483-search`. See [SEARCH.md](../../docs/SEARCH.md).
**v0.8.445 (Phase 482):** `message.send` `hasAttachment`/`hasSticker`; `message.edit` `contentChanged`; `message.delete` `wasOwn`. UI messaging compositor + hints. Bundle: `npm run test:phase482-messaging`. See [MESSAGING.md](../../docs/MESSAGING.md).
+29 -3
View File
@@ -11954,10 +11954,33 @@ class PearcordPlatform extends EventEmitter {
const user = this.identity.user
if (!user) throw new Error('register first')
if (this.mode === 'guild') await this._assertCanParticipate('reaction')
const result = await this.messages.toggleReaction(messageId, emoji, user.id)
if (this.mode !== 'dm' && this.guild) this.guild.gossipReaction(result)
this.emit('reaction', result)
const emojiKey = String(emoji || '').slice(0, 16)
let hadMeBefore = false
try {
const priorRows = await this.messages.listReactions()
hadMeBefore = priorRows.some(
(r) =>
r.messageId === messageId && r.emoji === emojiKey && r.userId === user.id
)
} catch (_) {}
const result = await this.messages.toggleReaction(messageId, emoji, user.id)
let gossipSent = false
if (this.mode !== 'dm' && this.guild) {
const gossipSpan = this.log.time('reaction.gossip', {
messageId,
guildId,
channelId,
emoji: emojiKey
})
this.guild.gossipReaction(result)
gossipSpan.end({
removed: result?.removed === true,
guildId,
channelId
})
gossipSent = true
}
this.emit('reaction', result)
const reactionRows = await this.messages.listReactions()
const reactionCount = reactionRows.filter(
(r) => r.messageId === messageId && r.emoji === emojiKey
@@ -11969,6 +11992,9 @@ class PearcordPlatform extends EventEmitter {
guildId,
channelId,
removed: result?.removed === true,
added: result?.removed !== true,
hadMeBefore,
gossipSent,
reactionCount
})
return result