Ignore:
Timestamp:
08/21/2026 04:57:20 PM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
b0ccd0d
Parents:
4e5fe29
Message:

Een verwijderde track kondigt zichzelf aan, net als een post

Een post stuurt bij verwijderen een Delete(Tombstone) naar zijn volgers; een
track deed dat niet. De rij ging weg, het Audio-object gaf 404, en elke server
die hem had geindexeerd bleef ernaar wijzen. Op de hub stond het er vandaag als
een kaartje met een dode link, en het viel alleen op doordat robo het zag.

Sinds shaer-0nh is een track een eersterangs Audio-object met een eigen id, dus
hij hoort ook een eigen afmelding te krijgen.

  • deliverObjectDelete(site, objectId) is de gedeelde romp; deliverDelete en het nieuwe deliverTrackDelete leunen er allebei op. Het object-id komt van de aanroeper, want bij verwijderen is de rij vaak al weg.
  • trackUri() staat nu op EEN plek in music/index.js. Het formaat werd eerder alleen door de bouwkant gekend, en een tweede plek die het opnieuw in elkaar zet is precies hoe je een Delete stuurt die de ontvanger niet herkent.
  • Beide verwijderroutes in admin-audio melden af: de losse verwijdering en de opruiming van wezen. Een wees is voor ONS een track zonder bestand, maar de buitenwereld heeft een gewoon Audio-object opgeslagen.

Twee tests door de echte route. Een testhaak op deliver() bestaat niet, dus de
proef kijkt in ap_delivery: de volger krijgt een inbox op een dichte poort, de
directe poging faalt, en de activiteit hoort in de wachtrij te belanden. Die
tabel was in het echte geval leeg, dus dat is precies het bewijs. Controleproef
gedraaid: zonder de aankondiging valt de test om.

Co-Authored-By: Claude Opus 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r4e5fe29 r8ed36de  
    3737import { TRACK_KOLOMMEN,
    3838  playlistOpenTracks, siteOpenTracks, openTrack, trackHostPosts,
    39   buildTrackAudio, buildTrackCollection, buildTrackCreate,
     39  buildTrackAudio, buildTrackCollection, buildTrackCreate, trackUri,
    4040  buildPlaylistCollection, listPlaylistsAP, playlistLinkTags,
    4141  buildPostTrackCollection, uitgavePost,
     
    31073107
    31083108// Tell followers a post is gone (Delete + Tombstone) so it's removed from their feeds.
    3109 export async function deliverDelete(site, post) {
     3109/**
     3110 * Delete(Tombstone) voor een van onze EIGEN objecten, naar alle volgers.
     3111 *
     3112 * De romp staat apart omdat een post niet het enige is dat wij de draad op
     3113 * sturen. Een track is een eersterangs Audio-object met een eigen id
     3114 * (shaer-0nh), en die werd bij verwijderen nergens aangekondigd: de rij ging
     3115 * weg, het object ging 404 en elke server die hem had geindexeerd hield hem
     3116 * voor altijd. Op de hub kwam dat op 21-8 aan het licht als een track die naar
     3117 * een dode URL wees.
     3118 *
     3119 * Het object-id komt van de aanroeper. Dat moet ook wel: bij verwijderen is de
     3120 * rij vaak al weg, dus er valt niets meer op te zoeken.
     3121 */
     3122export async function deliverObjectDelete(site, objectId) {
    31103123  const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
    3111   if (!base || !site || !site.slug || !post || !post.id) return;
     3124  if (!base || !site || !site.slug || !objectId) return;
    31123125  const followers = fStmts().list.all(site.slug);
    31133126  if (!followers.length) return;
     
    31153128  const keys = getOrCreateKeys(site.slug);
    31163129  const me = actorId(base, site.slug);
    3117   const nid = noteId(base, post.id);
    31183130  const del = {
    31193131    '@context': AP_CONTEXT,
    3120     id: `${nid}#delete-${Date.now()}-${rid()}`,
     3132    id: `${objectId}#delete-${Date.now()}-${rid()}`,
    31213133    type: 'Delete',
    31223134    actor: me,
    31233135    to: [PUBLIC],
    3124     object: { id: nid, type: 'Tombstone' },
     3136    object: { id: objectId, type: 'Tombstone' },
    31253137  };
    31263138  for (const inbox of inboxes) deliverWithRetry(site.slug, inbox, del, `${me}#main-key`, keys.private_pem);
     3139}
     3140
     3141export async function deliverDelete(site, post) {
     3142  const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
     3143  if (!base || !post || !post.id) return;
     3144  return deliverObjectDelete(site, noteId(base, post.id));
     3145}
     3146
     3147/**
     3148 * Zelfde voor een track. Roep dit aan VOOR het verwijderen van de rij, net als
     3149 * bij een post: daarna is `id` er nog wel maar de context niet meer.
     3150 */
     3151export async function deliverTrackDelete(site, trackId) {
     3152  const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
     3153  if (!base || !site || !site.slug || !trackId) return;
     3154  return deliverObjectDelete(site, trackUri(base, site, trackId));
    31273155}
    31283156
     
    69666994  buildPostTrackCollection, uitgavePost,
    69676995  buildLibrary, libraryId,
    6968   followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins,
     6996  followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverObjectDelete, deliverTrackDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins,
    69696997  feedCursor, feedChangesSince, waitForFeedChange,
    69706998  getInteractions, getInteractionById, setInteractionBoosted, setInteractionLiked, buildReplyNote, getOutboxNote, getSentNotes, deliverReply, resolveRemoteNote, noteAudience, mayReadNote,
Note: See TracChangeset for help on using the changeset viewer.