feat(permissions): extend role and overwrite span metadata for Phase 510

role.update emits previousPermissionMask and permissionMaskDelta;
permission.overwrite tracks replacedExisting and bit changes; post-upsert
permission.eval logs effective sendMessages; delete span adds hadAllow/hadDeny.
This commit is contained in:
Raven Scott
2026-05-24 09:14:47 -04:00
parent 46731af299
commit 93f487e828
2 changed files with 49 additions and 3 deletions
+2
View File
@@ -75,6 +75,8 @@ Expose a single `EventEmitter` API the UI drives over IPC (`apps/pearcord/index.
**v0.8.471 (Phase 508):** `presence.set`/`presence.custom`/`presence.activity` spans extended (`previousStatus`, `statusChanged`, `customTextLength`, `spanKind`, `activityName`, `hasAssets`). Split presence guild-loading compositor + clipboard presence meta. Bundle: `npm run test:phase508-presence`.
**v0.8.473 (Phase 510):** `role.update` adds `previousPermissionMask`/`permissionMaskDelta`; `permission.overwrite` adds `replacedExisting`/`allowChanged`/`denyChanged`; `permission.eval` after overwrite upsert; `permission.overwrite.delete` adds `hadAllow`/`hadDeny`. UI `syncPermissionsPanelsDuringGuildLoading`. Bundle: `npm run test:phase510-permissions`.
**v0.8.472 (Phase 509):** `discovery.list` adds `queryLen`/`sort`/`minMembers`; `discovery.publish` adds `beforeListed`/`changed`; `discovery.mesh` adds `hadCachedStats`. UI split discovery guild-loading compositor + clipboard discovery meta. Bundle: `npm run test:phase509-discovery`.
**v0.8.460 (Phase 497):** `presence.set`/`presence.custom`/`presence.activity` spans (`peerCount`, `activityType`, `guildGossip`). UI presence compositor + tightened **presence-errors** filter. Bundle: `npm run test:phase497-presence`. See [PRESENCE.md](../../docs/PRESENCE.md).
+47 -3
View File
@@ -5195,15 +5195,23 @@ class PearcordPlatform extends EventEmitter {
throw new Error('no permission to manage roles')
}
await this._initGuildRoles(this.guild.guild.id)
const prevRow = (await this.guildRoles.listRoles(this.guild.guild.id)).find(
(r) => r.id === roleId
)
const previousPermissionMask = Number(prevRow?.permissions) || 0
const row = await this.guildRoles.updateRole(this.guild.guild.id, roleId, patch)
this.guild.gossipRoleUpsert(row)
this.emit('guild-role', row)
const permissionMask = Number(row?.permissions ?? patch.permissions) || 0
span.end({
roleId: row?.id || roleId,
guildId,
name: String(row?.name || patch.name || '').slice(0, 32),
hasColor: patch.color !== undefined,
permissionMask: Number(row?.permissions ?? patch.permissions) || 0,
permissionMask,
previousPermissionMask,
permissionMaskChanged: patch.permissions !== undefined,
permissionMaskDelta: permissionMask ^ previousPermissionMask,
renamed: patch.name !== undefined,
permissionsChanged: patch.permissions !== undefined,
hoistChanged: patch.hoist !== undefined
@@ -5484,6 +5492,12 @@ class PearcordPlatform extends EventEmitter {
})
if (!ch) throw new Error('channel not found')
await this._initChannelPermissions(this.guild.guild.id)
const prevOw = await this.channelPermissions.getOverwrite(
this.guild.guild.id,
chId,
payload.targetType,
payload.targetId
)
const allow =
payload.allow !== undefined
? Number(payload.allow) || 0
@@ -5506,6 +5520,8 @@ class PearcordPlatform extends EventEmitter {
await this._audit('channel.overwrite', { guildId: this.guild.guild.id, targetId: chId })
this.emit('channel-overwrite', row)
await this._fanoutAppEvent(APP_EVENTS.CHANNEL_PERMISSION_UPDATE, { overwrite: row })
const previousAllowBits = Number(prevOw?.allow) || 0
const previousDenyBits = Number(prevOw?.deny) || 0
span.end({
channelId: chId,
guildId,
@@ -5514,8 +5530,34 @@ class PearcordPlatform extends EventEmitter {
allowBits: allow,
denyBits: deny,
allowNonZero: allow > 0,
denyNonZero: deny > 0
denyNonZero: deny > 0,
replacedExisting: !!prevOw,
previousAllowBits,
previousDenyBits,
allowChanged: previousAllowBits !== allow,
denyChanged: previousDenyBits !== deny
})
const evalSpan = this.log.time('permission.eval', {
channelId: chId,
guildId,
context: 'overwrite.upsert'
})
try {
const granted = await this._hasPerm(PERMISSION.SEND_MESSAGES, chId)
evalSpan.end({
channelId: chId,
guildId,
granted,
perm: 'sendMessages'
})
} catch (evalErr) {
this.log.error('permission.eval error', {
channelId: chId,
guildId,
error: evalErr?.message || String(evalErr)
})
evalSpan.fail(evalErr)
}
return row
} catch (err) {
this.log.error('permission.overwrite error', {
@@ -5568,7 +5610,9 @@ class PearcordPlatform extends EventEmitter {
guildId,
targetType,
targetId,
deleted: !!prev
deleted: !!prev,
hadAllow: !!(Number(prev?.allow) || 0),
hadDeny: !!(Number(prev?.deny) || 0)
})
return prev
} catch (err) {