@atproto/bsky 0.0.38 → 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 (65) hide show
  1. package/CHANGELOG.md +14 -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 +216 -104
  6. package/dist/index.js.map +2 -2
  7. package/dist/lexicon/lexicons.d.ts +13 -0
  8. package/dist/lexicon/types/com/atproto/server/describeServer.d.ts +7 -0
  9. package/package.json +5 -5
  10. package/src/api/app/bsky/actor/getProfile.ts +10 -6
  11. package/src/api/app/bsky/actor/getProfiles.ts +2 -2
  12. package/src/api/app/bsky/actor/getSuggestions.ts +2 -2
  13. package/src/api/app/bsky/actor/searchActors.ts +7 -3
  14. package/src/api/app/bsky/actor/searchActorsTypeahead.ts +2 -2
  15. package/src/api/app/bsky/feed/getActorFeeds.ts +2 -2
  16. package/src/api/app/bsky/feed/getActorLikes.ts +2 -2
  17. package/src/api/app/bsky/feed/getAuthorFeed.ts +6 -2
  18. package/src/api/app/bsky/feed/getFeed.ts +2 -2
  19. package/src/api/app/bsky/feed/getFeedGenerator.ts +3 -6
  20. package/src/api/app/bsky/feed/getFeedGenerators.ts +2 -2
  21. package/src/api/app/bsky/feed/getLikes.ts +2 -2
  22. package/src/api/app/bsky/feed/getListFeed.ts +2 -2
  23. package/src/api/app/bsky/feed/getPostThread.ts +2 -2
  24. package/src/api/app/bsky/feed/getPosts.ts +2 -2
  25. package/src/api/app/bsky/feed/getRepostedBy.ts +2 -2
  26. package/src/api/app/bsky/feed/getSuggestedFeeds.ts +3 -5
  27. package/src/api/app/bsky/feed/getTimeline.ts +6 -3
  28. package/src/api/app/bsky/feed/searchPosts.ts +2 -2
  29. package/src/api/app/bsky/graph/getBlocks.ts +6 -3
  30. package/src/api/app/bsky/graph/getFollowers.ts +6 -2
  31. package/src/api/app/bsky/graph/getFollows.ts +6 -2
  32. package/src/api/app/bsky/graph/getList.ts +2 -2
  33. package/src/api/app/bsky/graph/getListBlocks.ts +6 -3
  34. package/src/api/app/bsky/graph/getListMutes.ts +6 -3
  35. package/src/api/app/bsky/graph/getLists.ts +2 -2
  36. package/src/api/app/bsky/graph/getMutes.ts +6 -3
  37. package/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts +3 -3
  38. package/src/api/app/bsky/labeler/getServices.ts +3 -3
  39. package/src/api/app/bsky/notification/listNotifications.ts +6 -3
  40. package/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts +2 -2
  41. package/src/data-plane/server/routes/labels.ts +26 -8
  42. package/src/hydration/hydrator.ts +55 -10
  43. package/src/hydration/label.ts +33 -7
  44. package/src/hydration/util.ts +6 -2
  45. package/src/index.ts +1 -1
  46. package/src/lexicon/lexicons.ts +13 -0
  47. package/src/lexicon/types/com/atproto/server/describeServer.ts +18 -0
  48. package/src/views/index.ts +8 -8
  49. package/tests/__snapshots__/feed-generation.test.ts.snap +0 -45
  50. package/tests/data-plane/__snapshots__/indexing.test.ts.snap +0 -8
  51. package/tests/label-hydration.test.ts +31 -0
  52. package/tests/views/__snapshots__/author-feed.test.ts.snap +0 -46
  53. package/tests/views/__snapshots__/block-lists.test.ts.snap +0 -17
  54. package/tests/views/__snapshots__/blocks.test.ts.snap +0 -9
  55. package/tests/views/__snapshots__/labeler-service.test.ts.snap +0 -4
  56. package/tests/views/__snapshots__/list-feed.test.ts.snap +0 -20
  57. package/tests/views/__snapshots__/mute-lists.test.ts.snap +0 -18
  58. package/tests/views/__snapshots__/mutes.test.ts.snap +0 -4
  59. package/tests/views/__snapshots__/notifications.test.ts.snap +0 -9
  60. package/tests/views/__snapshots__/posts.test.ts.snap +0 -7
  61. package/tests/views/__snapshots__/profile.test.ts.snap +0 -6
  62. package/tests/views/__snapshots__/thread.test.ts.snap +0 -38
  63. package/tests/views/__snapshots__/timeline.test.ts.snap +0 -145
  64. package/tests/views/labeler-service.test.ts +2 -7
  65. package/tests/views/takedown-labels.test.ts +52 -0
package/dist/index.js CHANGED
@@ -136419,6 +136419,11 @@ var schemaDict = {
136419
136419
  description: "URLs of service policy documents.",
136420
136420
  ref: "lex:com.atproto.server.describeServer#links"
136421
136421
  },
136422
+ contact: {
136423
+ type: "ref",
136424
+ description: "Contact information",
136425
+ ref: "lex:com.atproto.server.describeServer#contact"
136426
+ },
136422
136427
  did: {
136423
136428
  type: "string",
136424
136429
  format: "did"
@@ -136437,6 +136442,14 @@ var schemaDict = {
136437
136442
  type: "string"
136438
136443
  }
136439
136444
  }
136445
+ },
136446
+ contact: {
136447
+ type: "object",
136448
+ properties: {
136449
+ email: {
136450
+ type: "string"
136451
+ }
136452
+ }
136440
136453
  }
136441
136454
  }
136442
136455
  },
@@ -145373,6 +145386,7 @@ var _AtpAgent = class {
145373
145386
  inst.labelersHeader = this.labelersHeader;
145374
145387
  inst.proxyHeader = this.proxyHeader;
145375
145388
  inst.pdsUrl = this.pdsUrl;
145389
+ inst.api.xrpc.uri = this.pdsUrl || this.service;
145376
145390
  }
145377
145391
  withProxy(serviceType, did2) {
145378
145392
  const inst = this.clone();
@@ -150361,6 +150375,11 @@ var schemaDict2 = {
150361
150375
  description: "URLs of service policy documents.",
150362
150376
  ref: "lex:com.atproto.server.describeServer#links"
150363
150377
  },
150378
+ contact: {
150379
+ type: "ref",
150380
+ description: "Contact information",
150381
+ ref: "lex:com.atproto.server.describeServer#contact"
150382
+ },
150364
150383
  did: {
150365
150384
  type: "string",
150366
150385
  format: "did"
@@ -150379,6 +150398,14 @@ var schemaDict2 = {
150379
150398
  type: "string"
150380
150399
  }
150381
150400
  }
150401
+ },
150402
+ contact: {
150403
+ type: "object",
150404
+ properties: {
150405
+ email: {
150406
+ type: "string"
150407
+ }
150408
+ }
150382
150409
  }
150383
150410
  }
150384
150411
  },
@@ -159867,13 +159894,13 @@ function getTimeline_default(server, ctx) {
159867
159894
  handler: async ({ params: params2, auth, req }) => {
159868
159895
  const viewer = auth.credentials.iss;
159869
159896
  const labelers = ctx.reqLabelers(req);
159870
- const hydrateCtx = { labelers, viewer };
159871
- 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);
159872
159899
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
159873
159900
  return {
159874
159901
  encoding: "application/json",
159875
159902
  body: result,
159876
- headers: resHeaders({ labelers, repoRev })
159903
+ headers: resHeaders({ labelers: hydrateCtx.labelers, repoRev })
159877
159904
  };
159878
159905
  }
159879
159906
  });
@@ -161040,12 +161067,12 @@ function getActorFeeds_default(server, ctx) {
161040
161067
  handler: async ({ auth, params: params2, req }) => {
161041
161068
  const viewer = auth.credentials.iss;
161042
161069
  const labelers = ctx.reqLabelers(req);
161043
- const hydrateCtx = { labelers, viewer };
161070
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
161044
161071
  const result = await getActorFeeds({ ...params2, hydrateCtx }, ctx);
161045
161072
  return {
161046
161073
  encoding: "application/json",
161047
161074
  body: result,
161048
- headers: resHeaders({ labelers })
161075
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
161049
161076
  };
161050
161077
  }
161051
161078
  });
@@ -161095,10 +161122,8 @@ function getSuggestedFeeds_default(server, ctx) {
161095
161122
  cursor: params2.cursor
161096
161123
  });
161097
161124
  const uris = suggestedRes.uris;
161098
- const hydration29 = await ctx.hydrator.hydrateFeedGens(uris, {
161099
- labelers,
161100
- viewer
161101
- });
161125
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
161126
+ const hydration29 = await ctx.hydrator.hydrateFeedGens(uris, hydrateCtx);
161102
161127
  const feedViews = mapDefined(uris, (uri2) => ctx.views.feedGenerator(uri2, hydration29));
161103
161128
  return {
161104
161129
  encoding: "application/json",
@@ -161106,7 +161131,7 @@ function getSuggestedFeeds_default(server, ctx) {
161106
161131
  feeds: feedViews,
161107
161132
  cursor: parseString(suggestedRes.cursor)
161108
161133
  },
161109
- headers: resHeaders({ labelers })
161134
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
161110
161135
  };
161111
161136
  }
161112
161137
  });
@@ -161380,13 +161405,43 @@ var GraphHydrator = class {
161380
161405
  };
161381
161406
 
161382
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
+ };
161383
161438
  var LabelHydrator = class {
161384
161439
  constructor(dataplane) {
161385
161440
  this.dataplane = dataplane;
161386
161441
  }
161387
161442
  async getLabelsForSubjects(subjects, labelers) {
161388
161443
  if (!subjects.length || !labelers.dids.length)
161389
- return new HydrationMap();
161444
+ return new Labels();
161390
161445
  const res = await this.dataplane.getLabels({
161391
161446
  subjects,
161392
161447
  issuers: labelers.dids
@@ -161400,16 +161455,16 @@ var LabelHydrator = class {
161400
161455
  if (!entry) {
161401
161456
  entry = {
161402
161457
  isTakendown: false,
161403
- labels: []
161458
+ labels: new HydrationMap()
161404
161459
  };
161405
161460
  acc.set(label.uri, entry);
161406
161461
  }
161407
- entry.labels.push(label);
161462
+ entry.labels.set(Labels.key(label), label);
161408
161463
  if (TAKEDOWN_LABELS.includes(label.val) && !label.neg && labelers.redact.has(label.src)) {
161409
161464
  entry.isTakendown = true;
161410
161465
  }
161411
161466
  return acc;
161412
- }, new HydrationMap());
161467
+ }, new Labels());
161413
161468
  }
161414
161469
  async getLabelers(dids, includeTakedowns = false) {
161415
161470
  const res = await this.dataplane.getLabelerRecords({
@@ -161561,13 +161616,25 @@ var FeedHydrator = class {
161561
161616
  };
161562
161617
 
161563
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
+ };
161564
161630
  var Hydrator = class {
161565
- constructor(dataplane) {
161631
+ constructor(dataplane, serviceLabelers = []) {
161566
161632
  this.dataplane = dataplane;
161567
161633
  this.actor = new ActorHydrator(dataplane);
161568
161634
  this.feed = new FeedHydrator(dataplane);
161569
161635
  this.graph = new GraphHydrator(dataplane);
161570
161636
  this.label = new LabelHydrator(dataplane);
161637
+ this.serviceLabelers = new Set(serviceLabelers);
161571
161638
  }
161572
161639
  async hydrateProfileViewers(dids, ctx) {
161573
161640
  const viewer = ctx.viewer;
@@ -161850,11 +161917,12 @@ var Hydrator = class {
161850
161917
  }
161851
161918
  async hydrateLabelers(dids, ctx) {
161852
161919
  const [labelers, labelerAggs, labelerViewers, profileState] = await Promise.all([
161853
- this.label.getLabelers(dids),
161920
+ this.label.getLabelers(dids, ctx.includeTakedowns),
161854
161921
  this.label.getLabelerAggregates(dids),
161855
161922
  ctx.viewer ? this.label.getLabelerViewerStates(dids, ctx.viewer) : void 0,
161856
- this.hydrateProfiles(dids.map(didFromUri), ctx)
161923
+ this.hydrateProfiles(dids, ctx)
161857
161924
  ]);
161925
+ actionTakedownLabels(dids, labelers, profileState.labels ?? new Labels());
161858
161926
  return mergeStates(profileState, {
161859
161927
  labelers,
161860
161928
  labelerAggs,
@@ -161882,7 +161950,10 @@ var Hydrator = class {
161882
161950
  } else if (collection === ids.AppBskyFeedGenerator) {
161883
161951
  return (await this.feed.getFeedGens([uri2], includeTakedowns)).get(uri2) ?? void 0;
161884
161952
  } else if (collection === ids.AppBskyLabelerService) {
161885
- 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;
161886
161957
  } else if (collection === ids.AppBskyActorProfile) {
161887
161958
  const did2 = parsed.hostname;
161888
161959
  const actor = (await this.actor.getActors([did2], includeTakedowns)).get(did2);
@@ -161896,6 +161967,21 @@ var Hydrator = class {
161896
161967
  };
161897
161968
  }
161898
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
+ }
161899
161985
  };
161900
161986
  var listUrisFromProfileViewer = (item) => {
161901
161987
  const listUris = [];
@@ -167095,7 +167181,11 @@ function getAuthorFeed_default(server, ctx) {
167095
167181
  handler: async ({ params: params2, auth, req }) => {
167096
167182
  const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
167097
167183
  const labelers = ctx.reqLabelers(req);
167098
- const hydrateCtx = { labelers, viewer, includeTakedowns };
167184
+ const hydrateCtx = await ctx.hydrator.createContext({
167185
+ labelers,
167186
+ viewer,
167187
+ includeTakedowns
167188
+ });
167099
167189
  const result = await getAuthorFeed({ ...params2, hydrateCtx }, ctx);
167100
167190
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
167101
167191
  return {
@@ -167103,7 +167193,7 @@ function getAuthorFeed_default(server, ctx) {
167103
167193
  body: result,
167104
167194
  headers: resHeaders({
167105
167195
  repoRev,
167106
- labelers
167196
+ labelers: hydrateCtx.labelers
167107
167197
  })
167108
167198
  };
167109
167199
  }
@@ -175659,15 +175749,25 @@ var labels_default = (db) => ({
175659
175749
  async getLabels(req) {
175660
175750
  const { subjects, issuers } = req;
175661
175751
  if (subjects.length === 0 || issuers.length === 0) {
175662
- return { records: [] };
175752
+ return { labels: [] };
175663
175753
  }
175664
175754
  const res = await db.db.selectFrom("label").where("uri", "in", subjects).where("src", "in", issuers).selectAll().execute();
175665
- const labels = res.map((l) => {
175666
- const formatted = {
175667
- ...l,
175668
- cid: l.cid === "" ? void 0 : l.cid
175669
- };
175670
- return fromString2(JSON.stringify(formatted), "utf8");
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");
175770
+ });
175671
175771
  });
175672
175772
  return { labels };
175673
175773
  }
@@ -180828,7 +180928,7 @@ function getFeed_default(server, ctx) {
180828
180928
  handler: async ({ params: params2, auth, req }) => {
180829
180929
  const viewer = auth.credentials.iss;
180830
180930
  const labelers = ctx.reqLabelers(req);
180831
- const hydrateCtx = { labelers, viewer };
180931
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
180832
180932
  const headers = noUndefinedVals({
180833
180933
  authorization: req.headers["authorization"],
180834
180934
  "accept-language": req.headers["accept-language"]
@@ -180844,7 +180944,7 @@ function getFeed_default(server, ctx) {
180844
180944
  body: result,
180845
180945
  headers: {
180846
180946
  ...feedResHeaders ?? {},
180847
- ...resHeaders({ labelers }),
180947
+ ...resHeaders({ labelers: hydrateCtx.labelers }),
180848
180948
  "server-timing": serverTimingHeader([timerSkele, timerHydr])
180849
180949
  }
180850
180950
  };
@@ -180973,10 +181073,8 @@ function getFeedGenerator_default(server, ctx) {
180973
181073
  const { feed } = params2;
180974
181074
  const viewer = auth.credentials.iss;
180975
181075
  const labelers = ctx.reqLabelers(req);
180976
- const hydration29 = await ctx.hydrator.hydrateFeedGens([feed], {
180977
- viewer,
180978
- labelers
180979
- });
181076
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181077
+ const hydration29 = await ctx.hydrator.hydrateFeedGens([feed], hydrateCtx);
180980
181078
  const feedInfo = hydration29.feedgens?.get(feed);
180981
181079
  if (!feedInfo) {
180982
181080
  throw new InvalidRequestError("could not find feed");
@@ -181010,7 +181108,7 @@ function getFeedGenerator_default(server, ctx) {
181010
181108
  isOnline: true,
181011
181109
  isValid: true
181012
181110
  },
181013
- headers: resHeaders({ labelers })
181111
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181014
181112
  };
181015
181113
  }
181016
181114
  });
@@ -181024,12 +181122,12 @@ function getFeedGenerators_default(server, ctx) {
181024
181122
  handler: async ({ params: params2, auth, req }) => {
181025
181123
  const viewer = auth.credentials.iss;
181026
181124
  const labelers = ctx.reqLabelers(req);
181027
- const hydrateCtx = { labelers, viewer };
181125
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181028
181126
  const view = await getFeedGenerators({ ...params2, hydrateCtx }, ctx);
181029
181127
  return {
181030
181128
  encoding: "application/json",
181031
181129
  body: view,
181032
- headers: resHeaders({ labelers })
181130
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181033
181131
  };
181034
181132
  }
181035
181133
  });
@@ -181059,12 +181157,12 @@ function getLikes_default(server, ctx) {
181059
181157
  handler: async ({ params: params2, auth, req }) => {
181060
181158
  const viewer = auth.credentials.iss;
181061
181159
  const labelers = ctx.reqLabelers(req);
181062
- const hydrateCtx = { labelers, viewer };
181160
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181063
181161
  const result = await getLikes({ ...params2, hydrateCtx }, ctx);
181064
181162
  return {
181065
181163
  encoding: "application/json",
181066
181164
  body: result,
181067
- headers: resHeaders({ labelers })
181165
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181068
181166
  };
181069
181167
  }
181070
181168
  });
@@ -181130,13 +181228,13 @@ function getListFeed_default(server, ctx) {
181130
181228
  handler: async ({ params: params2, auth, req }) => {
181131
181229
  const viewer = auth.credentials.iss;
181132
181230
  const labelers = ctx.reqLabelers(req);
181133
- const hydrateCtx = { labelers, viewer };
181231
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181134
181232
  const result = await getListFeed({ ...params2, hydrateCtx }, ctx);
181135
181233
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
181136
181234
  return {
181137
181235
  encoding: "application/json",
181138
181236
  body: result,
181139
- headers: resHeaders({ labelers, repoRev })
181237
+ headers: resHeaders({ labelers: hydrateCtx.labelers, repoRev })
181140
181238
  };
181141
181239
  }
181142
181240
  });
@@ -181190,7 +181288,7 @@ function getPostThread_default(server, ctx) {
181190
181288
  handler: async ({ params: params2, auth, req, res }) => {
181191
181289
  const { viewer } = ctx.authVerifier.parseCreds(auth);
181192
181290
  const labelers = ctx.reqLabelers(req);
181193
- const hydrateCtx = { labelers, viewer };
181291
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181194
181292
  let result;
181195
181293
  try {
181196
181294
  result = await getPostThread({ ...params2, hydrateCtx }, ctx);
@@ -181207,7 +181305,7 @@ function getPostThread_default(server, ctx) {
181207
181305
  body: result,
181208
181306
  headers: resHeaders({
181209
181307
  repoRev,
181210
- labelers
181308
+ labelers: hydrateCtx.labelers
181211
181309
  })
181212
181310
  };
181213
181311
  }
@@ -181260,12 +181358,12 @@ function getPosts_default(server, ctx) {
181260
181358
  handler: async ({ params: params2, auth, req }) => {
181261
181359
  const viewer = auth.credentials.iss;
181262
181360
  const labelers = ctx.reqLabelers(req);
181263
- const hydrateCtx = { labelers, viewer };
181361
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181264
181362
  const results = await getPosts({ ...params2, hydrateCtx }, ctx);
181265
181363
  return {
181266
181364
  encoding: "application/json",
181267
181365
  body: results,
181268
- headers: resHeaders({ labelers })
181366
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181269
181367
  };
181270
181368
  }
181271
181369
  });
@@ -181299,12 +181397,12 @@ function searchPosts_default(server, ctx) {
181299
181397
  handler: async ({ auth, params: params2, req }) => {
181300
181398
  const viewer = auth.credentials.iss;
181301
181399
  const labelers = ctx.reqLabelers(req);
181302
- const hydrateCtx = { labelers, viewer };
181400
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181303
181401
  const results = await searchPosts({ ...params2, hydrateCtx }, ctx);
181304
181402
  return {
181305
181403
  encoding: "application/json",
181306
181404
  body: results,
181307
- headers: resHeaders({ labelers })
181405
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181308
181406
  };
181309
181407
  }
181310
181408
  });
@@ -181362,7 +181460,7 @@ function getActorLikes_default(server, ctx) {
181362
181460
  handler: async ({ params: params2, auth, req }) => {
181363
181461
  const viewer = auth.credentials.iss;
181364
181462
  const labelers = ctx.reqLabelers(req);
181365
- const hydrateCtx = { labelers, viewer };
181463
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181366
181464
  const result = await getActorLikes({ ...params2, hydrateCtx }, ctx);
181367
181465
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
181368
181466
  return {
@@ -181370,7 +181468,7 @@ function getActorLikes_default(server, ctx) {
181370
181468
  body: result,
181371
181469
  headers: resHeaders({
181372
181470
  repoRev,
181373
- labelers
181471
+ labelers: hydrateCtx.labelers
181374
181472
  })
181375
181473
  };
181376
181474
  }
@@ -181427,7 +181525,11 @@ function getProfile_default(server, ctx) {
181427
181525
  handler: async ({ auth, params: params2, req }) => {
181428
181526
  const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
181429
181527
  const labelers = ctx.reqLabelers(req);
181430
- const hydrateCtx = { labelers, viewer, includeTakedowns };
181528
+ const hydrateCtx = await ctx.hydrator.createContext({
181529
+ labelers,
181530
+ viewer,
181531
+ includeTakedowns
181532
+ });
181431
181533
  const result = await getProfile({ ...params2, hydrateCtx }, ctx);
181432
181534
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
181433
181535
  return {
@@ -181435,7 +181537,7 @@ function getProfile_default(server, ctx) {
181435
181537
  body: result,
181436
181538
  headers: resHeaders({
181437
181539
  repoRev,
181438
- labelers
181540
+ labelers: hydrateCtx.labelers
181439
181541
  })
181440
181542
  };
181441
181543
  }
@@ -181451,10 +181553,7 @@ var skeleton12 = async (input) => {
181451
181553
  };
181452
181554
  var hydration12 = async (input) => {
181453
181555
  const { ctx, params: params2, skeleton: skeleton29 } = input;
181454
- return ctx.hydrator.hydrateProfilesDetailed([skeleton29.did], {
181455
- ...params2.hydrateCtx,
181456
- includeTakedowns: true
181457
- });
181556
+ return ctx.hydrator.hydrateProfilesDetailed([skeleton29.did], params2.hydrateCtx.copy({ includeTakedowns: true }));
181458
181557
  };
181459
181558
  var presentation12 = (input) => {
181460
181559
  const { ctx, params: params2, skeleton: skeleton29, hydration: hydration29 } = input;
@@ -181475,7 +181574,7 @@ function getProfiles_default(server, ctx) {
181475
181574
  handler: async ({ auth, params: params2, req }) => {
181476
181575
  const viewer = auth.credentials.iss;
181477
181576
  const labelers = ctx.reqLabelers(req);
181478
- const hydrateCtx = { viewer, labelers };
181577
+ const hydrateCtx = await ctx.hydrator.createContext({ viewer, labelers });
181479
181578
  const result = await getProfile({ ...params2, hydrateCtx }, ctx);
181480
181579
  const repoRev = await ctx.hydrator.actor.getRepoRevSafe(viewer);
181481
181580
  return {
@@ -181483,7 +181582,7 @@ function getProfiles_default(server, ctx) {
181483
181582
  body: result,
181484
181583
  headers: resHeaders({
181485
181584
  repoRev,
181486
- labelers
181585
+ labelers: hydrateCtx.labelers
181487
181586
  })
181488
181587
  };
181489
181588
  }
@@ -181512,12 +181611,12 @@ function getRepostedBy_default(server, ctx) {
181512
181611
  handler: async ({ params: params2, auth, req }) => {
181513
181612
  const viewer = auth.credentials.iss;
181514
181613
  const labelers = ctx.reqLabelers(req);
181515
- const hydrateCtx = { labelers, viewer };
181614
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181516
181615
  const result = await getRepostedBy({ ...params2, hydrateCtx }, ctx);
181517
181616
  return {
181518
181617
  encoding: "application/json",
181519
181618
  body: result,
181520
- headers: resHeaders({ labelers })
181619
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181521
181620
  };
181522
181621
  }
181523
181622
  });
@@ -181575,12 +181674,12 @@ function getBlocks_default(server, ctx) {
181575
181674
  handler: async ({ params: params2, auth, req }) => {
181576
181675
  const viewer = auth.credentials.iss;
181577
181676
  const labelers = ctx.reqLabelers(req);
181578
- const hydrateCtx = { labelers, viewer };
181579
- 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);
181580
181679
  return {
181581
181680
  encoding: "application/json",
181582
181681
  body: result,
181583
- headers: resHeaders({ labelers })
181682
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181584
181683
  };
181585
181684
  }
181586
181685
  });
@@ -181623,12 +181722,12 @@ function getListBlocks_default(server, ctx) {
181623
181722
  handler: async ({ params: params2, auth, req }) => {
181624
181723
  const viewer = auth.credentials.iss;
181625
181724
  const labelers = ctx.reqLabelers(req);
181626
- const hydrateCtx = { labelers, viewer };
181627
- 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);
181628
181727
  return {
181629
181728
  encoding: "application/json",
181630
181729
  body: result,
181631
- headers: resHeaders({ labelers })
181730
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181632
181731
  };
181633
181732
  }
181634
181733
  });
@@ -181664,12 +181763,16 @@ function getFollowers_default(server, ctx) {
181664
181763
  handler: async ({ params: params2, auth, req }) => {
181665
181764
  const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
181666
181765
  const labelers = ctx.reqLabelers(req);
181667
- const hydrateCtx = { labelers, viewer, includeTakedowns };
181766
+ const hydrateCtx = await ctx.hydrator.createContext({
181767
+ labelers,
181768
+ viewer,
181769
+ includeTakedowns
181770
+ });
181668
181771
  const result = await getFollowers({ ...params2, hydrateCtx }, ctx);
181669
181772
  return {
181670
181773
  encoding: "application/json",
181671
181774
  body: result,
181672
- headers: resHeaders({ labelers })
181775
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181673
181776
  };
181674
181777
  }
181675
181778
  });
@@ -181744,12 +181847,16 @@ function getFollows_default(server, ctx) {
181744
181847
  handler: async ({ params: params2, auth, req }) => {
181745
181848
  const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
181746
181849
  const labelers = ctx.reqLabelers(req);
181747
- const hydrateCtx = { labelers, viewer, includeTakedowns };
181850
+ const hydrateCtx = await ctx.hydrator.createContext({
181851
+ labelers,
181852
+ viewer,
181853
+ includeTakedowns
181854
+ });
181748
181855
  const result = await getFollows({ ...params2, hydrateCtx }, ctx);
181749
181856
  return {
181750
181857
  encoding: "application/json",
181751
181858
  body: result,
181752
- headers: resHeaders({ labelers })
181859
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181753
181860
  };
181754
181861
  }
181755
181862
  });
@@ -181828,12 +181935,12 @@ function getList_default(server, ctx) {
181828
181935
  handler: async ({ params: params2, auth, req }) => {
181829
181936
  const viewer = auth.credentials.iss;
181830
181937
  const labelers = ctx.reqLabelers(req);
181831
- const hydrateCtx = { labelers, viewer };
181938
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181832
181939
  const result = await getList({ ...params2, hydrateCtx }, ctx);
181833
181940
  return {
181834
181941
  encoding: "application/json",
181835
181942
  body: result,
181836
- headers: resHeaders({ labelers })
181943
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181837
181944
  };
181838
181945
  }
181839
181946
  });
@@ -181887,12 +181994,12 @@ function getLists_default(server, ctx) {
181887
181994
  handler: async ({ params: params2, auth, req }) => {
181888
181995
  const viewer = auth.credentials.iss;
181889
181996
  const labelers = ctx.reqLabelers(req);
181890
- const hydrateCtx = { labelers, viewer };
181997
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
181891
181998
  const result = await getLists({ ...params2, hydrateCtx }, ctx);
181892
181999
  return {
181893
182000
  encoding: "application/json",
181894
182001
  body: result,
181895
- headers: resHeaders({ labelers })
182002
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181896
182003
  };
181897
182004
  }
181898
182005
  });
@@ -181931,12 +182038,12 @@ function getListMutes_default(server, ctx) {
181931
182038
  handler: async ({ params: params2, auth, req }) => {
181932
182039
  const viewer = auth.credentials.iss;
181933
182040
  const labelers = ctx.reqLabelers(req);
181934
- const hydrateCtx = { labelers, viewer };
181935
- 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);
181936
182043
  return {
181937
182044
  encoding: "application/json",
181938
182045
  body: result,
181939
- headers: resHeaders({ labelers })
182046
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181940
182047
  };
181941
182048
  }
181942
182049
  });
@@ -181972,12 +182079,12 @@ function getMutes_default(server, ctx) {
181972
182079
  handler: async ({ params: params2, auth, req }) => {
181973
182080
  const viewer = auth.credentials.iss;
181974
182081
  const labelers = ctx.reqLabelers(req);
181975
- const hydrateCtx = { labelers, viewer };
181976
- 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);
181977
182084
  return {
181978
182085
  encoding: "application/json",
181979
182086
  body: result,
181980
- headers: resHeaders({ labelers })
182087
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
181981
182088
  };
181982
182089
  }
181983
182090
  });
@@ -182128,12 +182235,12 @@ function getSuggestedFollowsByActor_default(server, ctx) {
182128
182235
  handler: async ({ auth, params: params2, req }) => {
182129
182236
  const viewer = auth.credentials.iss;
182130
182237
  const labelers = ctx.reqLabelers(req);
182131
- const hydrateCtx = { labelers, viewer };
182132
- 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);
182133
182240
  return {
182134
182241
  encoding: "application/json",
182135
182242
  body: result,
182136
- headers: resHeaders({ labelers })
182243
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182137
182244
  };
182138
182245
  }
182139
182246
  });
@@ -182178,10 +182285,11 @@ function getServices_default(server, ctx) {
182178
182285
  const { dids, detailed } = params2;
182179
182286
  const viewer = auth.credentials.iss;
182180
182287
  const labelers = ctx.reqLabelers(req);
182181
- const hydration29 = await ctx.hydrator.hydrateLabelers(dids, {
182288
+ const hydrateCtx = await ctx.hydrator.createContext({
182182
182289
  viewer,
182183
182290
  labelers
182184
182291
  });
182292
+ const hydration29 = await ctx.hydrator.hydrateLabelers(dids, hydrateCtx);
182185
182293
  const views = mapDefined(dids, (did2) => {
182186
182294
  if (detailed) {
182187
182295
  const view = ctx.views.labelerDetailed(did2, hydration29);
@@ -182206,7 +182314,7 @@ function getServices_default(server, ctx) {
182206
182314
  body: {
182207
182315
  views
182208
182316
  },
182209
- headers: resHeaders({ labelers })
182317
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182210
182318
  };
182211
182319
  }
182212
182320
  });
@@ -182218,14 +182326,18 @@ function searchActors_default(server, ctx) {
182218
182326
  server.app.bsky.actor.searchActors({
182219
182327
  auth: ctx.authVerifier.standardOptional,
182220
182328
  handler: async ({ auth, params: params2, req }) => {
182221
- const viewer = auth.credentials.iss;
182329
+ const { viewer, includeTakedowns } = ctx.authVerifier.parseCreds(auth);
182222
182330
  const labelers = ctx.reqLabelers(req);
182223
- const hydrateCtx = { viewer, labelers };
182331
+ const hydrateCtx = await ctx.hydrator.createContext({
182332
+ viewer,
182333
+ labelers,
182334
+ includeTakedowns
182335
+ });
182224
182336
  const results = await searchActors({ ...params2, hydrateCtx }, ctx);
182225
182337
  return {
182226
182338
  encoding: "application/json",
182227
182339
  body: results,
182228
- headers: resHeaders({ labelers })
182340
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182229
182341
  };
182230
182342
  }
182231
182343
  });
@@ -182280,12 +182392,12 @@ function searchActorsTypeahead_default(server, ctx) {
182280
182392
  handler: async ({ params: params2, auth, req }) => {
182281
182393
  const viewer = auth.credentials.iss;
182282
182394
  const labelers = ctx.reqLabelers(req);
182283
- const hydrateCtx = { labelers, viewer };
182395
+ const hydrateCtx = await ctx.hydrator.createContext({ labelers, viewer });
182284
182396
  const results = await searchActorsTypeahead({ ...params2, hydrateCtx }, ctx);
182285
182397
  return {
182286
182398
  encoding: "application/json",
182287
182399
  body: results,
182288
- headers: resHeaders({ labelers })
182400
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182289
182401
  };
182290
182402
  }
182291
182403
  });
@@ -182338,12 +182450,12 @@ function getSuggestions_default(server, ctx) {
182338
182450
  handler: async ({ params: params2, auth, req }) => {
182339
182451
  const viewer = auth.credentials.iss;
182340
182452
  const labelers = ctx.reqLabelers(req);
182341
- const hydrateCtx = { viewer, labelers };
182453
+ const hydrateCtx = await ctx.hydrator.createContext({ viewer, labelers });
182342
182454
  const result = await getSuggestions({ ...params2, hydrateCtx }, ctx);
182343
182455
  return {
182344
182456
  encoding: "application/json",
182345
182457
  body: result,
182346
- headers: resHeaders({ labelers })
182458
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182347
182459
  };
182348
182460
  }
182349
182461
  });
@@ -182427,12 +182539,12 @@ function listNotifications_default(server, ctx) {
182427
182539
  handler: async ({ params: params2, auth, req }) => {
182428
182540
  const viewer = auth.credentials.iss;
182429
182541
  const labelers = ctx.reqLabelers(req);
182430
- const hydrateCtx = { labelers, viewer };
182431
- 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);
182432
182544
  return {
182433
182545
  encoding: "application/json",
182434
182546
  body: result,
182435
- headers: resHeaders({ labelers })
182547
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182436
182548
  };
182437
182549
  }
182438
182550
  });
@@ -182752,7 +182864,7 @@ function getPopularFeedGenerators_default(server, ctx) {
182752
182864
  handler: async ({ auth, params: params2, req }) => {
182753
182865
  const viewer = auth.credentials.iss;
182754
182866
  const labelers = ctx.reqLabelers(req);
182755
- const hydrateCtx = { viewer, labelers };
182867
+ const hydrateCtx = await ctx.hydrator.createContext({ viewer, labelers });
182756
182868
  if (clearlyBadCursor(params2.cursor)) {
182757
182869
  return {
182758
182870
  encoding: "application/json",
@@ -182785,7 +182897,7 @@ function getPopularFeedGenerators_default(server, ctx) {
182785
182897
  feeds: feedViews,
182786
182898
  cursor
182787
182899
  },
182788
- headers: resHeaders({ labelers })
182900
+ headers: resHeaders({ labelers: hydrateCtx.labelers })
182789
182901
  };
182790
182902
  }
182791
182903
  });
@@ -184311,8 +184423,8 @@ var Views = class {
184311
184423
  return;
184312
184424
  const profileUri = AtUri.make(did2, ids.AppBskyActorProfile, "self").toString();
184313
184425
  const labels = [
184314
- ...state.labels?.get(did2)?.labels ?? [],
184315
- ...state.labels?.get(profileUri)?.labels ?? [],
184426
+ ...state.labels?.getBySubject(did2) ?? [],
184427
+ ...state.labels?.getBySubject(profileUri) ?? [],
184316
184428
  ...this.selfLabels({
184317
184429
  uri: profileUri,
184318
184430
  cid: actor.profileCid?.toString(),
@@ -184381,7 +184493,7 @@ var Views = class {
184381
184493
  return void 0;
184382
184494
  }
184383
184495
  const listViewer = state.listViewers?.get(uri2);
184384
- const labels = state.labels?.get(uri2)?.labels ?? [];
184496
+ const labels = state.labels?.getBySubject(uri2) ?? [];
184385
184497
  const creator = new AtUri(uri2).hostname;
184386
184498
  return {
184387
184499
  uri: uri2,
@@ -184406,7 +184518,7 @@ var Views = class {
184406
184518
  const src3 = new AtUri(uri2).host;
184407
184519
  const cts = typeof record.createdAt === "string" ? normalizeDatetimeAlways(record.createdAt) : new Date(0).toISOString();
184408
184520
  return record.labels.values.map(({ val }) => {
184409
- return { src: src3, uri: uri2, cid: cid2, val, cts, neg: false };
184521
+ return { src: src3, uri: uri2, cid: cid2, val, cts };
184410
184522
  });
184411
184523
  }
184412
184524
  labeler(did2, state) {
@@ -184420,7 +184532,7 @@ var Views = class {
184420
184532
  const aggs = state.labelerAggs?.get(did2);
184421
184533
  const uri2 = AtUri.make(did2, ids.AppBskyLabelerService, "self").toString();
184422
184534
  const labels = [
184423
- ...state.labels?.get(uri2)?.labels ?? [],
184535
+ ...state.labels?.getBySubject(uri2) ?? [],
184424
184536
  ...this.selfLabels({
184425
184537
  uri: uri2,
184426
184538
  cid: labeler.cid.toString(),
@@ -184471,7 +184583,7 @@ var Views = class {
184471
184583
  return;
184472
184584
  const viewer = state.feedgenViewers?.get(uri2);
184473
184585
  const aggs = state.feedgenAggs?.get(uri2);
184474
- const labels = state.labels?.get(uri2)?.labels ?? [];
184586
+ const labels = state.labels?.getBySubject(uri2) ?? [];
184475
184587
  return {
184476
184588
  uri: uri2,
184477
184589
  cid: feedgen.cid,
@@ -184517,7 +184629,7 @@ var Views = class {
184517
184629
  const viewer = state.postViewers?.get(uri2);
184518
184630
  const gateUri = AtUri.make(authorDid, ids.AppBskyFeedThreadgate, parsedUri.rkey).toString();
184519
184631
  const labels = [
184520
- ...state.labels?.get(uri2)?.labels ?? [],
184632
+ ...state.labels?.getBySubject(uri2) ?? [],
184521
184633
  ...this.selfLabels({
184522
184634
  uri: uri2,
184523
184635
  cid: post.cid,
@@ -184880,7 +184992,7 @@ var Views = class {
184880
184992
  }
184881
184993
  if (!recordInfo)
184882
184994
  return;
184883
- const labels = state.labels?.get(notif.uri)?.labels ?? [];
184995
+ const labels = state.labels?.getBySubject(notif.uri) ?? [];
184884
184996
  const selfLabels = this.selfLabels({
184885
184997
  uri: notif.uri,
184886
184998
  cid: recordInfo.cid,
@@ -186057,7 +186169,7 @@ var BskyAppView = class {
186057
186169
  httpVersion: config2.dataplaneHttpVersion,
186058
186170
  rejectUnauthorized: !config2.dataplaneIgnoreBadTls
186059
186171
  });
186060
- const hydrator = new Hydrator(dataplane);
186172
+ const hydrator = new Hydrator(dataplane, config2.labelsFromIssuerDids);
186061
186173
  const views = new Views(imgUriBuilder);
186062
186174
  const bsyncClient = createBsyncClient({
186063
186175
  baseUrl: config2.bsyncUrl,