@atproto/bsky 0.0.39 → 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/hydration/hydrator.d.ts +12 -2
  3. package/dist/hydration/label.d.ts +7 -3
  4. package/dist/hydration/util.d.ts +5 -2
  5. package/dist/index.js +187 -103
  6. package/dist/index.js.map +2 -2
  7. package/package.json +5 -5
  8. package/src/api/app/bsky/actor/getProfile.ts +10 -6
  9. package/src/api/app/bsky/actor/getProfiles.ts +2 -2
  10. package/src/api/app/bsky/actor/getSuggestions.ts +2 -2
  11. package/src/api/app/bsky/actor/searchActors.ts +7 -3
  12. package/src/api/app/bsky/actor/searchActorsTypeahead.ts +2 -2
  13. package/src/api/app/bsky/feed/getActorFeeds.ts +2 -2
  14. package/src/api/app/bsky/feed/getActorLikes.ts +2 -2
  15. package/src/api/app/bsky/feed/getAuthorFeed.ts +6 -2
  16. package/src/api/app/bsky/feed/getFeed.ts +2 -2
  17. package/src/api/app/bsky/feed/getFeedGenerator.ts +3 -6
  18. package/src/api/app/bsky/feed/getFeedGenerators.ts +2 -2
  19. package/src/api/app/bsky/feed/getLikes.ts +2 -2
  20. package/src/api/app/bsky/feed/getListFeed.ts +2 -2
  21. package/src/api/app/bsky/feed/getPostThread.ts +2 -2
  22. package/src/api/app/bsky/feed/getPosts.ts +2 -2
  23. package/src/api/app/bsky/feed/getRepostedBy.ts +2 -2
  24. package/src/api/app/bsky/feed/getSuggestedFeeds.ts +3 -5
  25. package/src/api/app/bsky/feed/getTimeline.ts +6 -3
  26. package/src/api/app/bsky/feed/searchPosts.ts +2 -2
  27. package/src/api/app/bsky/graph/getBlocks.ts +6 -3
  28. package/src/api/app/bsky/graph/getFollowers.ts +6 -2
  29. package/src/api/app/bsky/graph/getFollows.ts +6 -2
  30. package/src/api/app/bsky/graph/getList.ts +2 -2
  31. package/src/api/app/bsky/graph/getListBlocks.ts +6 -3
  32. package/src/api/app/bsky/graph/getListMutes.ts +6 -3
  33. package/src/api/app/bsky/graph/getLists.ts +2 -2
  34. package/src/api/app/bsky/graph/getMutes.ts +6 -3
  35. package/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts +3 -3
  36. package/src/api/app/bsky/labeler/getServices.ts +3 -3
  37. package/src/api/app/bsky/notification/listNotifications.ts +6 -3
  38. package/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts +2 -2
  39. package/src/data-plane/server/routes/labels.ts +24 -8
  40. package/src/hydration/hydrator.ts +55 -10
  41. package/src/hydration/label.ts +33 -7
  42. package/src/hydration/util.ts +6 -2
  43. package/src/index.ts +1 -1
  44. package/src/views/index.ts +7 -7
  45. package/tests/label-hydration.test.ts +31 -0
  46. package/tests/views/labeler-service.test.ts +2 -7
  47. package/tests/views/takedown-labels.test.ts +52 -0
package/dist/index.js CHANGED
@@ -159894,13 +159894,13 @@ function getTimeline_default(server, ctx) {
159894
159894
  handler: async ({ params: params2, auth, req }) => {
159895
159895
  const viewer = auth.credentials.iss;
159896
159896
  const labelers = ctx.reqLabelers(req);
159897
- const hydrateCtx = { labelers, viewer };
159898
- const result = await getTimeline({ ...params2, hydrateCtx }, ctx);
159897
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
159898
+ const result = await getTimeline({ ...params2, hydrateCtx: hydrateCtx.copy({ viewer }) }, ctx);
159899
159899
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
159900
159900
  return {
159901
159901
  encoding: "application/json",
159902
159902
  body: result,
159903
- headers: resHeaders({ labelers, repoRev })
159903
+ headers: resHeaders({ labelers: hydrateCtx.labelers, repoRev })
159904
159904
  };
159905
159905
  }
159906
159906
  });
@@ -161067,12 +161067,12 @@ function getActorFeeds_default(server, ctx) {
161067
161067
  handler: async ({ auth, params: params2, req }) => {
161068
161068
  const viewer = auth.credentials.iss;
161069
161069
  const labelers = ctx.reqLabelers(req);
161070
- const hydrateCtx = { labelers, viewer };
161070
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
161071
161071
  const result = await getActorFeeds({ ...params2, hydrateCtx }, ctx);
161072
161072
  return {
161073
161073
  encoding: "application/json",
161074
161074
  body: result,
161075
- headers: resHeaders({ labelers })
161075
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
161076
161076
  };
161077
161077
  }
161078
161078
  });
@@ -161122,10 +161122,8 @@ function getSuggestedFeeds_default(server, ctx) {
161122
161122
  cursor: params2.cursor
161123
161123
  });
161124
161124
  const uris = suggestedRes.uris;
161125
- const hydration29 = await ctx.hydrator.hydrateFeedGens(uris, {
161126
- labelers,
161127
- viewer
161128
- });
161125
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
161126
+ const hydration29 = await ctx.hydrator.hydrateFeedGens(uris, hydrateCtx);
161129
161127
  const feedViews = mapDefined(uris, (uri2) => ctx.views.feedGenerator(uri2, hydration29));
161130
161128
  return {
161131
161129
  encoding: "application/json",
@@ -161133,7 +161131,7 @@ function getSuggestedFeeds_default(server, ctx) {
161133
161131
  feeds: feedViews,
161134
161132
  cursor: parseString(suggestedRes.cursor)
161135
161133
  },
161136
- headers: resHeaders({ labelers })
161134
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
161137
161135
  };
161138
161136
  }
161139
161137
  });
@@ -161407,13 +161405,43 @@ var GraphHydrator = class {
161407
161405
  };
161408
161406
 
161409
161407
  // src/hydration/label.ts
161408
+ var Labels = class extends HydrationMap {
161409
+ static key(label) {
161410
+ return `${label.src}::${label.val}`;
161411
+ }
161412
+ merge(map) {
161413
+ map.forEach((theirs, key) => {
161414
+ if (!theirs)
161415
+ return;
161416
+ const mine = this.get(key);
161417
+ if (mine) {
161418
+ mine.isTakendown = mine.isTakendown || theirs.isTakendown;
161419
+ mine.labels = mine.labels.merge(theirs.labels);
161420
+ } else {
161421
+ this.set(key, theirs);
161422
+ }
161423
+ });
161424
+ return this;
161425
+ }
161426
+ getBySubject(sub) {
161427
+ const it = this.get(sub)?.labels.values();
161428
+ if (!it)
161429
+ return [];
161430
+ const labels = [];
161431
+ for (const label of it) {
161432
+ if (label)
161433
+ labels.push(label);
161434
+ }
161435
+ return labels;
161436
+ }
161437
+ };
161410
161438
  var LabelHydrator = class {
161411
161439
  constructor(dataplane) {
161412
161440
  this.dataplane = dataplane;
161413
161441
  }
161414
161442
  async getLabelsForSubjects(subjects, labelers) {
161415
161443
  if (!subjects.length || !labelers.dids.length)
161416
- return new HydrationMap();
161444
+ return new Labels();
161417
161445
  const res = await this.dataplane.getLabels({
161418
161446
  subjects,
161419
161447
  issuers: labelers.dids
@@ -161427,16 +161455,16 @@ var LabelHydrator = class {
161427
161455
  if (!entry) {
161428
161456
  entry = {
161429
161457
  isTakendown: false,
161430
- labels: []
161458
+ labels: new HydrationMap()
161431
161459
  };
161432
161460
  acc.set(label.uri, entry);
161433
161461
  }
161434
- entry.labels.push(label);
161462
+ entry.labels.set(Labels.key(label), label);
161435
161463
  if (TAKEDOWN_LABELS.includes(label.val) && !label.neg && labelers.redact.has(label.src)) {
161436
161464
  entry.isTakendown = true;
161437
161465
  }
161438
161466
  return acc;
161439
- }, new HydrationMap());
161467
+ }, new Labels());
161440
161468
  }
161441
161469
  async getLabelers(dids, includeTakedowns = false) {
161442
161470
  const res = await this.dataplane.getLabelerRecords({
@@ -161588,13 +161616,25 @@ var FeedHydrator = class {
161588
161616
  };
161589
161617
 
161590
161618
  // src/hydration/hydrator.ts
161619
+ var HydrateCtx = class {
161620
+ constructor(vals) {
161621
+ this.vals = vals;
161622
+ this.labelers = this.vals.labelers;
161623
+ this.viewer = this.vals.viewer;
161624
+ this.includeTakedowns = this.vals.includeTakedowns;
161625
+ }
161626
+ copy(vals) {
161627
+ return new HydrateCtx({ ...this.vals, ...vals });
161628
+ }
161629
+ };
161591
161630
  var Hydrator = class {
161592
- constructor(dataplane) {
161631
+ constructor(dataplane, serviceLabelers = []) {
161593
161632
  this.dataplane = dataplane;
161594
161633
  this.actor = new ActorHydrator(dataplane);
161595
161634
  this.feed = new FeedHydrator(dataplane);
161596
161635
  this.graph = new GraphHydrator(dataplane);
161597
161636
  this.label = new LabelHydrator(dataplane);
161637
+ this.serviceLabelers = new Set(serviceLabelers);
161598
161638
  }
161599
161639
  async hydrateProfileViewers(dids, ctx) {
161600
161640
  const viewer = ctx.viewer;
@@ -161877,11 +161917,12 @@ var Hydrator = class {
161877
161917
  }
161878
161918
  async hydrateLabelers(dids, ctx) {
161879
161919
  const [labelers, labelerAggs, labelerViewers, profileState] = await Promise.all([
161880
- this.label.getLabelers(dids),
161920
+ this.label.getLabelers(dids, ctx.includeTakedowns),
161881
161921
  this.label.getLabelerAggregates(dids),
161882
161922
  ctx.viewer ? this.label.getLabelerViewerStates(dids, ctx.viewer) : void 0,
161883
- this.hydrateProfiles(dids.map(didFromUri), ctx)
161923
+ this.hydrateProfiles(dids, ctx)
161884
161924
  ]);
161925
+ actionTakedownLabels(dids, labelers, profileState.labels ?? new Labels());
161885
161926
  return mergeStates(profileState, {
161886
161927
  labelers,
161887
161928
  labelerAggs,
@@ -161909,7 +161950,10 @@ var Hydrator = class {
161909
161950
  } else if (collection === ids.AppBskyFeedGenerator) {
161910
161951
  return (await this.feed.getFeedGens([uri2], includeTakedowns)).get(uri2) ?? void 0;
161911
161952
  } else if (collection === ids.AppBskyLabelerService) {
161912
- return (await this.label.getLabelers([uri2], includeTakedowns)).get(uri2) ?? void 0;
161953
+ if (parsed.rkey !== "self")
161954
+ return;
161955
+ const did2 = parsed.hostname;
161956
+ return (await this.label.getLabelers([did2], includeTakedowns)).get(did2) ?? void 0;
161913
161957
  } else if (collection === ids.AppBskyActorProfile) {
161914
161958
  const did2 = parsed.hostname;
161915
161959
  const actor = (await this.actor.getActors([did2], includeTakedowns)).get(did2);
@@ -161923,6 +161967,21 @@ var Hydrator = class {
161923
161967
  };
161924
161968
  }
161925
161969
  }
161970
+ async createContext(vals) {
161971
+ const labelers = vals.labelers.dids;
161972
+ const nonServiceLabelers = labelers.filter((did2) => !this.serviceLabelers.has(did2));
161973
+ const labelerActors = await this.actor.getActors(nonServiceLabelers, vals.includeTakedowns);
161974
+ const availableDids = labelers.filter((did2) => this.serviceLabelers.has(did2) || !!labelerActors.get(did2));
161975
+ const availableLabelers = {
161976
+ dids: availableDids,
161977
+ redact: vals.labelers.redact
161978
+ };
161979
+ return new HydrateCtx({
161980
+ labelers: availableLabelers,
161981
+ viewer: vals.viewer,
161982
+ includeTakedowns: vals.includeTakedowns
161983
+ });
161984
+ }
161926
161985
  };
161927
161986
  var listUrisFromProfileViewer = (item) => {
161928
161987
  const listUris = [];
@@ -167122,7 +167181,11 @@ function getAuthorFeed_default(server, ctx) {
167122
167181
  handler: async ({ params: params2, auth, req }) => {
167123
167182
  const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
167124
167183
  const labelers = ctx.reqLabelers(req);
167125
- const hydrateCtx = { labelers, viewer, includeTakedowns };
167184
+ const hydrateCtx = await ctx.hydrator.createContext({
167185
+ labelers,
167186
+ viewer,
167187
+ includeTakedowns
167188
+ });
167126
167189
  const result = await getAuthorFeed({ ...params2, hydrateCtx }, ctx);
167127
167190
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
167128
167191
  return {
@@ -167130,7 +167193,7 @@ function getAuthorFeed_default(server, ctx) {
167130
167193
  body: result,
167131
167194
  headers: resHeaders({
167132
167195
  repoRev,
167133
- labelers
167196
+ labelers: hydrateCtx.labelers
167134
167197
  })
167135
167198
  };
167136
167199
  }
@@ -175686,16 +175749,25 @@ var labels_default = (db) => ({
175686
175749
  async getLabels(req) {
175687
175750
  const { subjects, issuers } = req;
175688
175751
  if (subjects.length === 0 || issuers.length === 0) {
175689
- return { records: [] };
175752
+ return { labels: [] };
175690
175753
  }
175691
175754
  const res = await db.db.selectFrom("label").where("uri", "in", subjects).where("src", "in", issuers).selectAll().execute();
175692
- const labels = res.map((l) => {
175693
- const formatted = noUndefinedVals({
175694
- ...l,
175695
- cid: l.cid === "" ? void 0 : l.cid,
175696
- neg: l.neg === true ? true : void 0
175755
+ const labelsBySubject = /* @__PURE__ */ new Map();
175756
+ res.forEach((l) => {
175757
+ const labels2 = labelsBySubject.get(l.uri) ?? [];
175758
+ labels2.push(l);
175759
+ labelsBySubject.set(l.uri, labels2);
175760
+ });
175761
+ const labels = subjects.flatMap((sub) => {
175762
+ const labelsForSub = labelsBySubject.get(sub) ?? [];
175763
+ return labelsForSub.map((l) => {
175764
+ const formatted = noUndefinedVals({
175765
+ ...l,
175766
+ cid: l.cid === "" ? void 0 : l.cid,
175767
+ neg: l.neg === true ? true : void 0
175768
+ });
175769
+ return fromString2(JSON.stringify(formatted), "utf8");
175697
175770
  });
175698
- return fromString2(JSON.stringify(formatted), "utf8");
175699
175771
  });
175700
175772
  return { labels };
175701
175773
  }
@@ -180856,7 +180928,7 @@ function getFeed_default(server, ctx) {
180856
180928
  handler: async ({ params: params2, auth, req }) => {
180857
180929
  const viewer = auth.credentials.iss;
180858
180930
  const labelers = ctx.reqLabelers(req);
180859
- const hydrateCtx = { labelers, viewer };
180931
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
180860
180932
  const headers = noUndefinedVals({
180861
180933
  authorization: req.headers["authorization"],
180862
180934
  "accept-language": req.headers["accept-language"]
@@ -180872,7 +180944,7 @@ function getFeed_default(server, ctx) {
180872
180944
  body: result,
180873
180945
  headers: {
180874
180946
  ...feedResHeaders ?? {},
180875
- ...resHeaders({ labelers }),
180947
+ ...resHeaders({ labelers: hydrateCtx.labelers }),
180876
180948
  "server-timing": serverTimingHeader([timerSkele, timerHydr])
180877
180949
  }
180878
180950
  };
@@ -181001,10 +181073,8 @@ function getFeedGenerator_default(server, ctx) {
181001
181073
  const { feed } = params2;
181002
181074
  const viewer = auth.credentials.iss;
181003
181075
  const labelers = ctx.reqLabelers(req);
181004
- const hydration29 = await ctx.hydrator.hydrateFeedGens([feed], {
181005
- viewer,
181006
- labelers
181007
- });
181076
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181077
+ const hydration29 = await ctx.hydrator.hydrateFeedGens([feed], hydrateCtx);
181008
181078
  const feedInfo = hydration29.feedgens?.get(feed);
181009
181079
  if (!feedInfo) {
181010
181080
  throw new InvalidRequestError("could not find feed");
@@ -181038,7 +181108,7 @@ function getFeedGenerator_default(server, ctx) {
181038
181108
  isOnline: true,
181039
181109
  isValid: true
181040
181110
  },
181041
- headers: resHeaders({ labelers })
181111
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181042
181112
  };
181043
181113
  }
181044
181114
  });
@@ -181052,12 +181122,12 @@ function getFeedGenerators_default(server, ctx) {
181052
181122
  handler: async ({ params: params2, auth, req }) => {
181053
181123
  const viewer = auth.credentials.iss;
181054
181124
  const labelers = ctx.reqLabelers(req);
181055
- const hydrateCtx = { labelers, viewer };
181125
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181056
181126
  const view = await getFeedGenerators({ ...params2, hydrateCtx }, ctx);
181057
181127
  return {
181058
181128
  encoding: "application/json",
181059
181129
  body: view,
181060
- headers: resHeaders({ labelers })
181130
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181061
181131
  };
181062
181132
  }
181063
181133
  });
@@ -181087,12 +181157,12 @@ function getLikes_default(server, ctx) {
181087
181157
  handler: async ({ params: params2, auth, req }) => {
181088
181158
  const viewer = auth.credentials.iss;
181089
181159
  const labelers = ctx.reqLabelers(req);
181090
- const hydrateCtx = { labelers, viewer };
181160
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181091
181161
  const result = await getLikes({ ...params2, hydrateCtx }, ctx);
181092
181162
  return {
181093
181163
  encoding: "application/json",
181094
181164
  body: result,
181095
- headers: resHeaders({ labelers })
181165
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181096
181166
  };
181097
181167
  }
181098
181168
  });
@@ -181158,13 +181228,13 @@ function getListFeed_default(server, ctx) {
181158
181228
  handler: async ({ params: params2, auth, req }) => {
181159
181229
  const viewer = auth.credentials.iss;
181160
181230
  const labelers = ctx.reqLabelers(req);
181161
- const hydrateCtx = { labelers, viewer };
181231
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181162
181232
  const result = await getListFeed({ ...params2, hydrateCtx }, ctx);
181163
181233
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
181164
181234
  return {
181165
181235
  encoding: "application/json",
181166
181236
  body: result,
181167
- headers: resHeaders({ labelers, repoRev })
181237
+ headers: resHeaders({ labelers: hydrateCtx.labelers, repoRev })
181168
181238
  };
181169
181239
  }
181170
181240
  });
@@ -181218,7 +181288,7 @@ function getPostThread_default(server, ctx) {
181218
181288
  handler: async ({ params: params2, auth, req, res }) => {
181219
181289
  const { viewer } = ctx.authVerifier.parseCreds(auth);
181220
181290
  const labelers = ctx.reqLabelers(req);
181221
- const hydrateCtx = { labelers, viewer };
181291
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181222
181292
  let result;
181223
181293
  try {
181224
181294
  result = await getPostThread({ ...params2, hydrateCtx }, ctx);
@@ -181235,7 +181305,7 @@ function getPostThread_default(server, ctx) {
181235
181305
  body: result,
181236
181306
  headers: resHeaders({
181237
181307
  repoRev,
181238
- labelers
181308
+ labelers: hydrateCtx.labelers
181239
181309
  })
181240
181310
  };
181241
181311
  }
@@ -181288,12 +181358,12 @@ function getPosts_default(server, ctx) {
181288
181358
  handler: async ({ params: params2, auth, req }) => {
181289
181359
  const viewer = auth.credentials.iss;
181290
181360
  const labelers = ctx.reqLabelers(req);
181291
- const hydrateCtx = { labelers, viewer };
181361
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181292
181362
  const results = await getPosts({ ...params2, hydrateCtx }, ctx);
181293
181363
  return {
181294
181364
  encoding: "application/json",
181295
181365
  body: results,
181296
- headers: resHeaders({ labelers })
181366
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181297
181367
  };
181298
181368
  }
181299
181369
  });
@@ -181327,12 +181397,12 @@ function searchPosts_default(server, ctx) {
181327
181397
  handler: async ({ auth, params: params2, req }) => {
181328
181398
  const viewer = auth.credentials.iss;
181329
181399
  const labelers = ctx.reqLabelers(req);
181330
- const hydrateCtx = { labelers, viewer };
181400
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181331
181401
  const results = await searchPosts({ ...params2, hydrateCtx }, ctx);
181332
181402
  return {
181333
181403
  encoding: "application/json",
181334
181404
  body: results,
181335
- headers: resHeaders({ labelers })
181405
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181336
181406
  };
181337
181407
  }
181338
181408
  });
@@ -181390,7 +181460,7 @@ function getActorLikes_default(server, ctx) {
181390
181460
  handler: async ({ params: params2, auth, req }) => {
181391
181461
  const viewer = auth.credentials.iss;
181392
181462
  const labelers = ctx.reqLabelers(req);
181393
- const hydrateCtx = { labelers, viewer };
181463
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181394
181464
  const result = await getActorLikes({ ...params2, hydrateCtx }, ctx);
181395
181465
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
181396
181466
  return {
@@ -181398,7 +181468,7 @@ function getActorLikes_default(server, ctx) {
181398
181468
  body: result,
181399
181469
  headers: resHeaders({
181400
181470
  repoRev,
181401
- labelers
181471
+ labelers: hydrateCtx.labelers
181402
181472
  })
181403
181473
  };
181404
181474
  }
@@ -181455,7 +181525,11 @@ function getProfile_default(server, ctx) {
181455
181525
  handler: async ({ auth, params: params2, req }) => {
181456
181526
  const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
181457
181527
  const labelers = ctx.reqLabelers(req);
181458
- const hydrateCtx = { labelers, viewer, includeTakedowns };
181528
+ const hydrateCtx = await ctx.hydrator.createContext({
181529
+ labelers,
181530
+ viewer,
181531
+ includeTakedowns
181532
+ });
181459
181533
  const result = await getProfile({ ...params2, hydrateCtx }, ctx);
181460
181534
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
181461
181535
  return {
@@ -181463,7 +181537,7 @@ function getProfile_default(server, ctx) {
181463
181537
  body: result,
181464
181538
  headers: resHeaders({
181465
181539
  repoRev,
181466
- labelers
181540
+ labelers: hydrateCtx.labelers
181467
181541
  })
181468
181542
  };
181469
181543
  }
@@ -181479,10 +181553,7 @@ var skeleton12 = async (input) => {
181479
181553
  };
181480
181554
  var hydration12 = async (input) => {
181481
181555
  const { ctx, params: params2, skeleton: skeleton29 } = input;
181482
- return ctx.hydrator.hydrateProfilesDetailed([skeleton29.did], {
181483
- ...params2.hydrateCtx,
181484
- includeTakedowns: true
181485
- });
181556
+ return ctx.hydrator.hydrateProfilesDetailed([skeleton29.did], params2.hydrateCtx.copy({ includeTakedowns: true }));
181486
181557
  };
181487
181558
  var presentation12 = (input) => {
181488
181559
  const { ctx, params: params2, skeleton: skeleton29, hydration: hydration29 } = input;
@@ -181503,7 +181574,7 @@ function getProfiles_default(server, ctx) {
181503
181574
  handler: async ({ auth, params: params2, req }) => {
181504
181575
  const viewer = auth.credentials.iss;
181505
181576
  const labelers = ctx.reqLabelers(req);
181506
- const hydrateCtx = { viewer, labelers };
181577
+ const hydrateCtx = await ctx.hydrator.createContext({ viewer, labelers });
181507
181578
  const result = await getProfile({ ...params2, hydrateCtx }, ctx);
181508
181579
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
181509
181580
  return {
@@ -181511,7 +181582,7 @@ function getProfiles_default(server, ctx) {
181511
181582
  body: result,
181512
181583
  headers: resHeaders({
181513
181584
  repoRev,
181514
- labelers
181585
+ labelers: hydrateCtx.labelers
181515
181586
  })
181516
181587
  };
181517
181588
  }
@@ -181540,12 +181611,12 @@ function getRepostedBy_default(server, ctx) {
181540
181611
  handler: async ({ params: params2, auth, req }) => {
181541
181612
  const viewer = auth.credentials.iss;
181542
181613
  const labelers = ctx.reqLabelers(req);
181543
- const hydrateCtx = { labelers, viewer };
181614
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181544
181615
  const result = await getRepostedBy({ ...params2, hydrateCtx }, ctx);
181545
181616
  return {
181546
181617
  encoding: "application/json",
181547
181618
  body: result,
181548
- headers: resHeaders({ labelers })
181619
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181549
181620
  };
181550
181621
  }
181551
181622
  });
@@ -181603,12 +181674,12 @@ function getBlocks_default(server, ctx) {
181603
181674
  handler: async ({ params: params2, auth, req }) => {
181604
181675
  const viewer = auth.credentials.iss;
181605
181676
  const labelers = ctx.reqLabelers(req);
181606
- const hydrateCtx = { labelers, viewer };
181607
- const result = await getBlocks({ ...params2, hydrateCtx }, ctx);
181677
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181678
+ const result = await getBlocks({ ...params2, hydrateCtx: hydrateCtx.copy({ viewer }) }, ctx);
181608
181679
  return {
181609
181680
  encoding: "application/json",
181610
181681
  body: result,
181611
- headers: resHeaders({ labelers })
181682
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181612
181683
  };
181613
181684
  }
181614
181685
  });
@@ -181651,12 +181722,12 @@ function getListBlocks_default(server, ctx) {
181651
181722
  handler: async ({ params: params2, auth, req }) => {
181652
181723
  const viewer = auth.credentials.iss;
181653
181724
  const labelers = ctx.reqLabelers(req);
181654
- const hydrateCtx = { labelers, viewer };
181655
- const result = await getListBlocks({ ...params2, hydrateCtx }, ctx);
181725
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181726
+ const result = await getListBlocks({ ...params2, hydrateCtx: hydrateCtx.copy({ viewer }) }, ctx);
181656
181727
  return {
181657
181728
  encoding: "application/json",
181658
181729
  body: result,
181659
- headers: resHeaders({ labelers })
181730
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181660
181731
  };
181661
181732
  }
181662
181733
  });
@@ -181692,12 +181763,16 @@ function getFollowers_default(server, ctx) {
181692
181763
  handler: async ({ params: params2, auth, req }) => {
181693
181764
  const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
181694
181765
  const labelers = ctx.reqLabelers(req);
181695
- const hydrateCtx = { labelers, viewer, includeTakedowns };
181766
+ const hydrateCtx = await ctx.hydrator.createContext({
181767
+ labelers,
181768
+ viewer,
181769
+ includeTakedowns
181770
+ });
181696
181771
  const result = await getFollowers({ ...params2, hydrateCtx }, ctx);
181697
181772
  return {
181698
181773
  encoding: "application/json",
181699
181774
  body: result,
181700
- headers: resHeaders({ labelers })
181775
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181701
181776
  };
181702
181777
  }
181703
181778
  });
@@ -181772,12 +181847,16 @@ function getFollows_default(server, ctx) {
181772
181847
  handler: async ({ params: params2, auth, req }) => {
181773
181848
  const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
181774
181849
  const labelers = ctx.reqLabelers(req);
181775
- const hydrateCtx = { labelers, viewer, includeTakedowns };
181850
+ const hydrateCtx = await ctx.hydrator.createContext({
181851
+ labelers,
181852
+ viewer,
181853
+ includeTakedowns
181854
+ });
181776
181855
  const result = await getFollows({ ...params2, hydrateCtx }, ctx);
181777
181856
  return {
181778
181857
  encoding: "application/json",
181779
181858
  body: result,
181780
- headers: resHeaders({ labelers })
181859
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181781
181860
  };
181782
181861
  }
181783
181862
  });
@@ -181856,12 +181935,12 @@ function getList_default(server, ctx) {
181856
181935
  handler: async ({ params: params2, auth, req }) => {
181857
181936
  const viewer = auth.credentials.iss;
181858
181937
  const labelers = ctx.reqLabelers(req);
181859
- const hydrateCtx = { labelers, viewer };
181938
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181860
181939
  const result = await getList({ ...params2, hydrateCtx }, ctx);
181861
181940
  return {
181862
181941
  encoding: "application/json",
181863
181942
  body: result,
181864
- headers: resHeaders({ labelers })
181943
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181865
181944
  };
181866
181945
  }
181867
181946
  });
@@ -181915,12 +181994,12 @@ function getLists_default(server, ctx) {
181915
181994
  handler: async ({ params: params2, auth, req }) => {
181916
181995
  const viewer = auth.credentials.iss;
181917
181996
  const labelers = ctx.reqLabelers(req);
181918
- const hydrateCtx = { labelers, viewer };
181997
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181919
181998
  const result = await getLists({ ...params2, hydrateCtx }, ctx);
181920
181999
  return {
181921
182000
  encoding: "application/json",
181922
182001
  body: result,
181923
- headers: resHeaders({ labelers })
182002
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181924
182003
  };
181925
182004
  }
181926
182005
  });
@@ -181959,12 +182038,12 @@ function getListMutes_default(server, ctx) {
181959
182038
  handler: async ({ params: params2, auth, req }) => {
181960
182039
  const viewer = auth.credentials.iss;
181961
182040
  const labelers = ctx.reqLabelers(req);
181962
- const hydrateCtx = { labelers, viewer };
181963
- const result = await getListMutes({ ...params2, hydrateCtx }, ctx);
182041
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
182042
+ const result = await getListMutes({ ...params2, hydrateCtx: hydrateCtx.copy({ viewer }) }, ctx);
181964
182043
  return {
181965
182044
  encoding: "application/json",
181966
182045
  body: result,
181967
- headers: resHeaders({ labelers })
182046
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181968
182047
  };
181969
182048
  }
181970
182049
  });
@@ -182000,12 +182079,12 @@ function getMutes_default(server, ctx) {
182000
182079
  handler: async ({ params: params2, auth, req }) => {
182001
182080
  const viewer = auth.credentials.iss;
182002
182081
  const labelers = ctx.reqLabelers(req);
182003
- const hydrateCtx = { labelers, viewer };
182004
- const result = await getMutes({ ...params2, hydrateCtx }, ctx);
182082
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
182083
+ const result = await getMutes({ ...params2, hydrateCtx: hydrateCtx.copy({ viewer }) }, ctx);
182005
182084
  return {
182006
182085
  encoding: "application/json",
182007
182086
  body: result,
182008
- headers: resHeaders({ labelers })
182087
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182009
182088
  };
182010
182089
  }
182011
182090
  });
@@ -182156,12 +182235,12 @@ function getSuggestedFollowsByActor_default(server, ctx) {
182156
182235
  handler: async ({ auth, params: params2, req }) => {
182157
182236
  const viewer = auth.credentials.iss;
182158
182237
  const labelers = ctx.reqLabelers(req);
182159
- const hydrateCtx = { labelers, viewer };
182160
- const result = await getSuggestedFollowsByActor({ ...params2, hydrateCtx }, ctx);
182238
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
182239
+ const result = await getSuggestedFollowsByActor({ ...params2, hydrateCtx: hydrateCtx.copy({ viewer }) }, ctx);
182161
182240
  return {
182162
182241
  encoding: "application/json",
182163
182242
  body: result,
182164
- headers: resHeaders({ labelers })
182243
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182165
182244
  };
182166
182245
  }
182167
182246
  });
@@ -182206,10 +182285,11 @@ function getServices_default(server, ctx) {
182206
182285
  const { dids, detailed } = params2;
182207
182286
  const viewer = auth.credentials.iss;
182208
182287
  const labelers = ctx.reqLabelers(req);
182209
- const hydration29 = await ctx.hydrator.hydrateLabelers(dids, {
182288
+ const hydrateCtx = await ctx.hydrator.createContext({
182210
182289
  viewer,
182211
182290
  labelers
182212
182291
  });
182292
+ const hydration29 = await ctx.hydrator.hydrateLabelers(dids, hydrateCtx);
182213
182293
  const views = mapDefined(dids, (did2) => {
182214
182294
  if (detailed) {
182215
182295
  const view = ctx.views.labelerDetailed(did2, hydration29);
@@ -182234,7 +182314,7 @@ function getServices_default(server, ctx) {
182234
182314
  body: {
182235
182315
  views
182236
182316
  },
182237
- headers: resHeaders({ labelers })
182317
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182238
182318
  };
182239
182319
  }
182240
182320
  });
@@ -182246,14 +182326,18 @@ function searchActors_default(server, ctx) {
182246
182326
  server.app.bsky.actor.searchActors({
182247
182327
  auth: ctx.authVerifier.standardOptional,
182248
182328
  handler: async ({ auth, params: params2, req }) => {
182249
- const viewer = auth.credentials.iss;
182329
+ const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
182250
182330
  const labelers = ctx.reqLabelers(req);
182251
- const hydrateCtx = { viewer, labelers };
182331
+ const hydrateCtx = await ctx.hydrator.createContext({
182332
+ viewer,
182333
+ labelers,
182334
+ includeTakedowns
182335
+ });
182252
182336
  const results = await searchActors({ ...params2, hydrateCtx }, ctx);
182253
182337
  return {
182254
182338
  encoding: "application/json",
182255
182339
  body: results,
182256
- headers: resHeaders({ labelers })
182340
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182257
182341
  };
182258
182342
  }
182259
182343
  });
@@ -182308,12 +182392,12 @@ function searchActorsTypeahead_default(server, ctx) {
182308
182392
  handler: async ({ params: params2, auth, req }) => {
182309
182393
  const viewer = auth.credentials.iss;
182310
182394
  const labelers = ctx.reqLabelers(req);
182311
- const hydrateCtx = { labelers, viewer };
182395
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
182312
182396
  const results = await searchActorsTypeahead({ ...params2, hydrateCtx }, ctx);
182313
182397
  return {
182314
182398
  encoding: "application/json",
182315
182399
  body: results,
182316
- headers: resHeaders({ labelers })
182400
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182317
182401
  };
182318
182402
  }
182319
182403
  });
@@ -182366,12 +182450,12 @@ function getSuggestions_default(server, ctx) {
182366
182450
  handler: async ({ params: params2, auth, req }) => {
182367
182451
  const viewer = auth.credentials.iss;
182368
182452
  const labelers = ctx.reqLabelers(req);
182369
- const hydrateCtx = { viewer, labelers };
182453
+ const hydrateCtx = await ctx.hydrator.createContext({ viewer, labelers });
182370
182454
  const result = await getSuggestions({ ...params2, hydrateCtx }, ctx);
182371
182455
  return {
182372
182456
  encoding: "application/json",
182373
182457
  body: result,
182374
- headers: resHeaders({ labelers })
182458
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182375
182459
  };
182376
182460
  }
182377
182461
  });
@@ -182455,12 +182539,12 @@ function listNotifications_default(server, ctx) {
182455
182539
  handler: async ({ params: params2, auth, req }) => {
182456
182540
  const viewer = auth.credentials.iss;
182457
182541
  const labelers = ctx.reqLabelers(req);
182458
- const hydrateCtx = { labelers, viewer };
182459
- const result = await listNotifications({ ...params2, hydrateCtx }, ctx);
182542
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
182543
+ const result = await listNotifications({ ...params2, hydrateCtx: hydrateCtx.copy({ viewer }) }, ctx);
182460
182544
  return {
182461
182545
  encoding: "application/json",
182462
182546
  body: result,
182463
- headers: resHeaders({ labelers })
182547
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182464
182548
  };
182465
182549
  }
182466
182550
  });
@@ -182780,7 +182864,7 @@ function getPopularFeedGenerators_default(server, ctx) {
182780
182864
  handler: async ({ auth, params: params2, req }) => {
182781
182865
  const viewer = auth.credentials.iss;
182782
182866
  const labelers = ctx.reqLabelers(req);
182783
- const hydrateCtx = { viewer, labelers };
182867
+ const hydrateCtx = await ctx.hydrator.createContext({ viewer, labelers });
182784
182868
  if (clearlyBadCursor(params2.cursor)) {
182785
182869
  return {
182786
182870
  encoding: "application/json",
@@ -182813,7 +182897,7 @@ function getPopularFeedGenerators_default(server, ctx) {
182813
182897
  feeds: feedViews,
182814
182898
  cursor
182815
182899
  },
182816
- headers: resHeaders({ labelers })
182900
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182817
182901
  };
182818
182902
  }
182819
182903
  });
@@ -184339,8 +184423,8 @@ var Views = class {
184339
184423
  return;
184340
184424
  const profileUri = AtUri.make(did2, ids.AppBskyActorProfile, "self").toString();
184341
184425
  const labels = [
184342
- ...state.labels?.get(did2)?.labels ?? [],
184343
- ...state.labels?.get(profileUri)?.labels ?? [],
184426
+ ...state.labels?.getBySubject(did2) ?? [],
184427
+ ...state.labels?.getBySubject(profileUri) ?? [],
184344
184428
  ...this.selfLabels({
184345
184429
  uri: profileUri,
184346
184430
  cid: actor.profileCid?.toString(),
@@ -184409,7 +184493,7 @@ var Views = class {
184409
184493
  return void 0;
184410
184494
  }
184411
184495
  const listViewer = state.listViewers?.get(uri2);
184412
- const labels = state.labels?.get(uri2)?.labels ?? [];
184496
+ const labels = state.labels?.getBySubject(uri2) ?? [];
184413
184497
  const creator = new AtUri(uri2).hostname;
184414
184498
  return {
184415
184499
  uri: uri2,
@@ -184448,7 +184532,7 @@ var Views = class {
184448
184532
  const aggs = state.labelerAggs?.get(did2);
184449
184533
  const uri2 = AtUri.make(did2, ids.AppBskyLabelerService, "self").toString();
184450
184534
  const labels = [
184451
- ...state.labels?.get(uri2)?.labels ?? [],
184535
+ ...state.labels?.getBySubject(uri2) ?? [],
184452
184536
  ...this.selfLabels({
184453
184537
  uri: uri2,
184454
184538
  cid: labeler.cid.toString(),
@@ -184499,7 +184583,7 @@ var Views = class {
184499
184583
  return;
184500
184584
  const viewer = state.feedgenViewers?.get(uri2);
184501
184585
  const aggs = state.feedgenAggs?.get(uri2);
184502
- const labels = state.labels?.get(uri2)?.labels ?? [];
184586
+ const labels = state.labels?.getBySubject(uri2) ?? [];
184503
184587
  return {
184504
184588
  uri: uri2,
184505
184589
  cid: feedgen.cid,
@@ -184545,7 +184629,7 @@ var Views = class {
184545
184629
  const viewer = state.postViewers?.get(uri2);
184546
184630
  const gateUri = AtUri.make(authorDid, ids.AppBskyFeedThreadgate, parsedUri.rkey).toString();
184547
184631
  const labels = [
184548
- ...state.labels?.get(uri2)?.labels ?? [],
184632
+ ...state.labels?.getBySubject(uri2) ?? [],
184549
184633
  ...this.selfLabels({
184550
184634
  uri: uri2,
184551
184635
  cid: post.cid,
@@ -184908,7 +184992,7 @@ var Views = class {
184908
184992
  }
184909
184993
  if (!recordInfo)
184910
184994
  return;
184911
- const labels = state.labels?.get(notif.uri)?.labels ?? [];
184995
+ const labels = state.labels?.getBySubject(notif.uri) ?? [];
184912
184996
  const selfLabels = this.selfLabels({
184913
184997
  uri: notif.uri,
184914
184998
  cid: recordInfo.cid,
@@ -186085,7 +186169,7 @@ var BskyAppView = class {
186085
186169
  httpVersion: config2.dataplaneHttpVersion,
186086
186170
  rejectUnauthorized: !config2.dataplaneIgnoreBadTls
186087
186171
  });
186088
- const hydrator = new Hydrator(dataplane);
186172
+ const hydrator = new Hydrator(dataplane, config2.labelsFromIssuerDids);
186089
186173
  const views = new Views(imgUriBuilder);
186090
186174
  const bsyncClient = createBsyncClient({
186091
186175
  baseUrl: config2.bsyncUrl,