@atproto/bsky 0.0.200 → 0.0.202

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 (87) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/api/app/bsky/ageassurance/begin.d.ts.map +1 -1
  3. package/dist/api/app/bsky/ageassurance/begin.js +15 -9
  4. package/dist/api/app/bsky/ageassurance/begin.js.map +1 -1
  5. package/dist/api/app/bsky/contact/sendNotification.d.ts +4 -0
  6. package/dist/api/app/bsky/contact/sendNotification.d.ts.map +1 -0
  7. package/dist/api/app/bsky/contact/sendNotification.js +30 -0
  8. package/dist/api/app/bsky/contact/sendNotification.js.map +1 -0
  9. package/dist/api/index.d.ts +1 -0
  10. package/dist/api/index.d.ts.map +1 -1
  11. package/dist/api/index.js +2 -1
  12. package/dist/api/index.js.map +1 -1
  13. package/dist/api/sitemap.d.ts +4 -0
  14. package/dist/api/sitemap.d.ts.map +1 -0
  15. package/dist/api/sitemap.js +67 -0
  16. package/dist/api/sitemap.js.map +1 -0
  17. package/dist/data-plane/server/routes/index.d.ts.map +1 -1
  18. package/dist/data-plane/server/routes/index.js +2 -0
  19. package/dist/data-plane/server/routes/index.js.map +1 -1
  20. package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
  21. package/dist/data-plane/server/routes/profile.js +10 -8
  22. package/dist/data-plane/server/routes/profile.js.map +1 -1
  23. package/dist/data-plane/server/routes/sitemap.d.ts +5 -0
  24. package/dist/data-plane/server/routes/sitemap.d.ts.map +1 -0
  25. package/dist/data-plane/server/routes/sitemap.js +38 -0
  26. package/dist/data-plane/server/routes/sitemap.js.map +1 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +3 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/lexicon/index.d.ts +2 -0
  31. package/dist/lexicon/index.d.ts.map +1 -1
  32. package/dist/lexicon/index.js +4 -0
  33. package/dist/lexicon/index.js.map +1 -1
  34. package/dist/lexicon/lexicons.d.ts +146 -4
  35. package/dist/lexicon/lexicons.d.ts.map +1 -1
  36. package/dist/lexicon/lexicons.js +74 -0
  37. package/dist/lexicon/lexicons.js.map +1 -1
  38. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +13 -1
  39. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  40. package/dist/lexicon/types/app/bsky/actor/defs.js +9 -0
  41. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  42. package/dist/lexicon/types/app/bsky/contact/defs.d.ts +10 -0
  43. package/dist/lexicon/types/app/bsky/contact/defs.d.ts.map +1 -1
  44. package/dist/lexicon/types/app/bsky/contact/defs.js +9 -0
  45. package/dist/lexicon/types/app/bsky/contact/defs.js.map +1 -1
  46. package/dist/lexicon/types/app/bsky/contact/sendNotification.d.ts +26 -0
  47. package/dist/lexicon/types/app/bsky/contact/sendNotification.d.ts.map +1 -0
  48. package/dist/lexicon/types/app/bsky/contact/sendNotification.js +7 -0
  49. package/dist/lexicon/types/app/bsky/contact/sendNotification.js.map +1 -0
  50. package/dist/lexicon/types/app/bsky/notification/listNotifications.d.ts +1 -1
  51. package/dist/lexicon/types/app/bsky/notification/listNotifications.d.ts.map +1 -1
  52. package/dist/lexicon/types/app/bsky/notification/listNotifications.js.map +1 -1
  53. package/dist/proto/bsky_connect.d.ts +21 -1
  54. package/dist/proto/bsky_connect.d.ts.map +1 -1
  55. package/dist/proto/bsky_connect.js +20 -0
  56. package/dist/proto/bsky_connect.js.map +1 -1
  57. package/dist/proto/bsky_pb.d.ts +97 -0
  58. package/dist/proto/bsky_pb.d.ts.map +1 -1
  59. package/dist/proto/bsky_pb.js +256 -5
  60. package/dist/proto/bsky_pb.js.map +1 -1
  61. package/dist/stash.d.ts +2 -1
  62. package/dist/stash.d.ts.map +1 -1
  63. package/dist/stash.js +2 -1
  64. package/dist/stash.js.map +1 -1
  65. package/package.json +9 -9
  66. package/proto/bsky.proto +31 -0
  67. package/src/api/app/bsky/ageassurance/begin.ts +21 -14
  68. package/src/api/app/bsky/contact/sendNotification.ts +32 -0
  69. package/src/api/index.ts +2 -0
  70. package/src/api/sitemap.ts +76 -0
  71. package/src/data-plane/server/routes/index.ts +2 -0
  72. package/src/data-plane/server/routes/profile.ts +8 -6
  73. package/src/data-plane/server/routes/sitemap.ts +43 -0
  74. package/src/index.ts +6 -1
  75. package/src/lexicon/index.ts +13 -0
  76. package/src/lexicon/lexicons.ts +80 -0
  77. package/src/lexicon/types/app/bsky/actor/defs.ts +22 -0
  78. package/src/lexicon/types/app/bsky/contact/defs.ts +19 -0
  79. package/src/lexicon/types/app/bsky/contact/sendNotification.ts +44 -0
  80. package/src/lexicon/types/app/bsky/notification/listNotifications.ts +1 -0
  81. package/src/proto/bsky_connect.ts +21 -1
  82. package/src/proto/bsky_pb.ts +188 -0
  83. package/src/stash.ts +5 -2
  84. package/tests/sitemap.test.ts +75 -0
  85. package/tests/views/age-assurance-v2.test.ts +59 -1
  86. package/tsconfig.build.tsbuildinfo +1 -1
  87. package/tsconfig.tests.tsbuildinfo +1 -1
@@ -0,0 +1,44 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import { type ValidationResult, BlobRef } from '@atproto/lexicon'
5
+ import { CID } from 'multiformats/cid'
6
+ import { validate as _validate } from '../../../../lexicons'
7
+ import {
8
+ type $Typed,
9
+ is$typed as _is$typed,
10
+ type OmitKey,
11
+ } from '../../../../util'
12
+
13
+ const is$typed = _is$typed,
14
+ validate = _validate
15
+ const id = 'app.bsky.contact.sendNotification'
16
+
17
+ export type QueryParams = {}
18
+
19
+ export interface InputSchema {
20
+ /** The DID of who this notification comes from. */
21
+ from: string
22
+ /** The DID of who this notification should go to. */
23
+ to: string
24
+ }
25
+
26
+ export interface OutputSchema {}
27
+
28
+ export interface HandlerInput {
29
+ encoding: 'application/json'
30
+ body: InputSchema
31
+ }
32
+
33
+ export interface HandlerSuccess {
34
+ encoding: 'application/json'
35
+ body: OutputSchema
36
+ headers?: { [key: string]: string }
37
+ }
38
+
39
+ export interface HandlerError {
40
+ status: number
41
+ message?: string
42
+ }
43
+
44
+ export type HandlerOutput = HandlerError | HandlerSuccess
@@ -67,6 +67,7 @@ export interface Notification {
67
67
  | 'like-via-repost'
68
68
  | 'repost-via-repost'
69
69
  | 'subscribed-post'
70
+ | 'contact-match'
70
71
  | (string & {})
71
72
  reasonSubject?: string
72
73
  record: { [_ in string]: unknown }
@@ -3,7 +3,7 @@
3
3
  /* eslint-disable */
4
4
  // @ts-nocheck
5
5
 
6
- import { ClearActorMutelistSubscriptionsRequest, ClearActorMutelistSubscriptionsResponse, ClearActorMutesRequest, ClearActorMutesResponse, ClearThreadMutesRequest, ClearThreadMutesResponse, CreateActorMutelistSubscriptionRequest, CreateActorMutelistSubscriptionResponse, CreateActorMuteRequest, CreateActorMuteResponse, CreateThreadMuteRequest, CreateThreadMuteResponse, DeleteActorMutelistSubscriptionRequest, DeleteActorMutelistSubscriptionResponse, DeleteActorMuteRequest, DeleteActorMuteResponse, DeleteThreadMuteRequest, DeleteThreadMuteResponse, GetActivitySubscriptionDidsRequest, GetActivitySubscriptionDidsResponse, GetActivitySubscriptionsByActorAndSubjectsRequest, GetActivitySubscriptionsByActorAndSubjectsResponse, GetActorBookmarksRequest, GetActorBookmarksResponse, GetActorChatDeclarationRecordsRequest, GetActorChatDeclarationRecordsResponse, GetActorFeedsRequest, GetActorFeedsResponse, GetActorFollowsActorsRequest, GetActorFollowsActorsResponse, GetActorLikesRequest, GetActorLikesResponse, GetActorListsRequest, GetActorListsResponse, GetActorMutesActorRequest, GetActorMutesActorResponse, GetActorMutesActorViaListRequest, GetActorMutesActorViaListResponse, GetActorRepostsRequest, GetActorRepostsResponse, GetActorsRequest, GetActorsResponse, GetActorStarterPacksRequest, GetActorStarterPacksResponse, GetActorTakedownRequest, GetActorTakedownResponse, GetAllLabelersRequest, GetAllLabelersResponse, GetAuthorFeedRequest, GetAuthorFeedResponse, GetBidirectionalBlockRequest, GetBidirectionalBlockResponse, GetBidirectionalBlockViaListRequest, GetBidirectionalBlockViaListResponse, GetBlobTakedownRequest, GetBlobTakedownResponse, GetBlockExistenceRequest, GetBlockExistenceResponse, GetBlocklistSubscriptionRequest, GetBlocklistSubscriptionResponse, GetBlocklistSubscriptionsRequest, GetBlocklistSubscriptionsResponse, GetBlockRecordsRequest, GetBlockRecordsResponse, GetBlocksRequest, GetBlocksResponse, GetBookmarksByActorAndSubjectsRequest, GetBookmarksByActorAndSubjectsResponse, GetCountsForUsersRequest, GetCountsForUsersResponse, GetDidsByHandlesRequest, GetDidsByHandlesResponse, GetFeedGeneratorRecordsRequest, GetFeedGeneratorRecordsResponse, GetFeedGeneratorStatusRequest, GetFeedGeneratorStatusResponse, GetFollowersRequest, GetFollowersResponse, GetFollowRecordsRequest, GetFollowRecordsResponse, GetFollowsFollowingRequest, GetFollowsFollowingResponse, GetFollowsRequest, GetFollowsResponse, GetFollowSuggestionsRequest, GetFollowSuggestionsResponse, GetIdentityByDidRequest, GetIdentityByDidResponse, GetIdentityByHandleRequest, GetIdentityByHandleResponse, GetInteractionCountsRequest, GetInteractionCountsResponse, GetLabelerRecordsRequest, GetLabelerRecordsResponse, GetLabelsRequest, GetLabelsResponse, GetLatestRevRequest, GetLatestRevResponse, GetLikeRecordsRequest, GetLikeRecordsResponse, GetLikesByActorAndSubjectsRequest, GetLikesByActorAndSubjectsResponse, GetLikesBySubjectRequest, GetLikesBySubjectResponse, GetLikesBySubjectSortedRequest, GetLikesBySubjectSortedResponse, GetListBlockRecordsRequest, GetListBlockRecordsResponse, GetListCountRequest, GetListCountResponse, GetListCountsRequest, GetListCountsResponse, GetListFeedRequest, GetListFeedResponse, GetListItemRecordsRequest, GetListItemRecordsResponse, GetListMembershipRequest, GetListMembershipResponse, GetListMembersRequest, GetListMembersResponse, GetListRecordsRequest, GetListRecordsResponse, GetMutelistSubscriptionRequest, GetMutelistSubscriptionResponse, GetMutelistSubscriptionsRequest, GetMutelistSubscriptionsResponse, GetMutesRequest, GetMutesResponse, GetNewUserCountForRangeRequest, GetNewUserCountForRangeResponse, GetNotificationDeclarationRecordsRequest, GetNotificationDeclarationRecordsResponse, GetNotificationPreferencesRequest, GetNotificationPreferencesResponse, GetNotificationSeenRequest, GetNotificationSeenResponse, GetNotificationsRequest, GetNotificationsResponse, GetPostgateRecordsRequest, GetPostgateRecordsResponse, GetPostRecordsRequest, GetPostRecordsResponse, GetProfileRecordsRequest, GetProfileRecordsResponse, GetQuotesBySubjectSortedRequest, GetQuotesBySubjectSortedResponse, GetRecordTakedownRequest, GetRecordTakedownResponse, GetRelationshipsRequest, GetRelationshipsResponse, GetRepostRecordsRequest, GetRepostRecordsResponse, GetRepostsByActorAndSubjectsRequest, GetRepostsByActorAndSubjectsResponse, GetRepostsBySubjectRequest, GetRepostsBySubjectResponse, GetStarterPackCountsRequest, GetStarterPackCountsResponse, GetStarterPackRecordsRequest, GetStarterPackRecordsResponse, GetStatusRecordsRequest, GetStatusRecordsResponse, GetSuggestedEntitiesRequest, GetSuggestedEntitiesResponse, GetSuggestedFeedsRequest, GetSuggestedFeedsResponse, GetThreadGateRecordsRequest, GetThreadGateRecordsResponse, GetThreadMutesOnSubjectsRequest, GetThreadMutesOnSubjectsResponse, GetThreadRequest, GetThreadResponse, GetTimelineRequest, GetTimelineResponse, GetUnreadNotificationCountRequest, GetUnreadNotificationCountResponse, GetVerificationRecordsRequest, GetVerificationRecordsResponse, GetVerificationsIssuedRequest, GetVerificationsIssuedResponse, GetVerificationsReceivedRequest, GetVerificationsReceivedResponse, PingRequest, PingResponse, SearchActorsRequest, SearchActorsResponse, SearchFeedGeneratorsRequest, SearchFeedGeneratorsResponse, SearchPostsRequest, SearchPostsResponse, SearchStarterPacksRequest, SearchStarterPacksResponse, TakedownActorRequest, TakedownActorResponse, TakedownBlobRequest, TakedownBlobResponse, TakedownRecordRequest, TakedownRecordResponse, UntakedownActorRequest, UntakedownActorResponse, UntakedownBlobRequest, UntakedownBlobResponse, UntakedownRecordRequest, UntakedownRecordResponse, UpdateActorUpstreamStatusRequest, UpdateActorUpstreamStatusResponse, UpdateNotificationSeenRequest, UpdateNotificationSeenResponse } from "./bsky_pb";
6
+ import { ClearActorMutelistSubscriptionsRequest, ClearActorMutelistSubscriptionsResponse, ClearActorMutesRequest, ClearActorMutesResponse, ClearThreadMutesRequest, ClearThreadMutesResponse, CreateActorMutelistSubscriptionRequest, CreateActorMutelistSubscriptionResponse, CreateActorMuteRequest, CreateActorMuteResponse, CreateThreadMuteRequest, CreateThreadMuteResponse, DeleteActorMutelistSubscriptionRequest, DeleteActorMutelistSubscriptionResponse, DeleteActorMuteRequest, DeleteActorMuteResponse, DeleteThreadMuteRequest, DeleteThreadMuteResponse, GetActivitySubscriptionDidsRequest, GetActivitySubscriptionDidsResponse, GetActivitySubscriptionsByActorAndSubjectsRequest, GetActivitySubscriptionsByActorAndSubjectsResponse, GetActorBookmarksRequest, GetActorBookmarksResponse, GetActorChatDeclarationRecordsRequest, GetActorChatDeclarationRecordsResponse, GetActorFeedsRequest, GetActorFeedsResponse, GetActorFollowsActorsRequest, GetActorFollowsActorsResponse, GetActorLikesRequest, GetActorLikesResponse, GetActorListsRequest, GetActorListsResponse, GetActorMutesActorRequest, GetActorMutesActorResponse, GetActorMutesActorViaListRequest, GetActorMutesActorViaListResponse, GetActorRepostsRequest, GetActorRepostsResponse, GetActorsRequest, GetActorsResponse, GetActorStarterPacksRequest, GetActorStarterPacksResponse, GetActorTakedownRequest, GetActorTakedownResponse, GetAllLabelersRequest, GetAllLabelersResponse, GetAuthorFeedRequest, GetAuthorFeedResponse, GetBidirectionalBlockRequest, GetBidirectionalBlockResponse, GetBidirectionalBlockViaListRequest, GetBidirectionalBlockViaListResponse, GetBlobTakedownRequest, GetBlobTakedownResponse, GetBlockExistenceRequest, GetBlockExistenceResponse, GetBlocklistSubscriptionRequest, GetBlocklistSubscriptionResponse, GetBlocklistSubscriptionsRequest, GetBlocklistSubscriptionsResponse, GetBlockRecordsRequest, GetBlockRecordsResponse, GetBlocksRequest, GetBlocksResponse, GetBookmarksByActorAndSubjectsRequest, GetBookmarksByActorAndSubjectsResponse, GetCountsForUsersRequest, GetCountsForUsersResponse, GetDidsByHandlesRequest, GetDidsByHandlesResponse, GetFeedGeneratorRecordsRequest, GetFeedGeneratorRecordsResponse, GetFeedGeneratorStatusRequest, GetFeedGeneratorStatusResponse, GetFollowersRequest, GetFollowersResponse, GetFollowRecordsRequest, GetFollowRecordsResponse, GetFollowsFollowingRequest, GetFollowsFollowingResponse, GetFollowsRequest, GetFollowsResponse, GetFollowSuggestionsRequest, GetFollowSuggestionsResponse, GetIdentityByDidRequest, GetIdentityByDidResponse, GetIdentityByHandleRequest, GetIdentityByHandleResponse, GetInteractionCountsRequest, GetInteractionCountsResponse, GetLabelerRecordsRequest, GetLabelerRecordsResponse, GetLabelsRequest, GetLabelsResponse, GetLatestRevRequest, GetLatestRevResponse, GetLikeRecordsRequest, GetLikeRecordsResponse, GetLikesByActorAndSubjectsRequest, GetLikesByActorAndSubjectsResponse, GetLikesBySubjectRequest, GetLikesBySubjectResponse, GetLikesBySubjectSortedRequest, GetLikesBySubjectSortedResponse, GetListBlockRecordsRequest, GetListBlockRecordsResponse, GetListCountRequest, GetListCountResponse, GetListCountsRequest, GetListCountsResponse, GetListFeedRequest, GetListFeedResponse, GetListItemRecordsRequest, GetListItemRecordsResponse, GetListMembershipRequest, GetListMembershipResponse, GetListMembersRequest, GetListMembersResponse, GetListRecordsRequest, GetListRecordsResponse, GetMutelistSubscriptionRequest, GetMutelistSubscriptionResponse, GetMutelistSubscriptionsRequest, GetMutelistSubscriptionsResponse, GetMutesRequest, GetMutesResponse, GetNewUserCountForRangeRequest, GetNewUserCountForRangeResponse, GetNotificationDeclarationRecordsRequest, GetNotificationDeclarationRecordsResponse, GetNotificationPreferencesRequest, GetNotificationPreferencesResponse, GetNotificationSeenRequest, GetNotificationSeenResponse, GetNotificationsRequest, GetNotificationsResponse, GetPostgateRecordsRequest, GetPostgateRecordsResponse, GetPostRecordsRequest, GetPostRecordsResponse, GetProfileRecordsRequest, GetProfileRecordsResponse, GetQuotesBySubjectSortedRequest, GetQuotesBySubjectSortedResponse, GetRecordTakedownRequest, GetRecordTakedownResponse, GetRelationshipsRequest, GetRelationshipsResponse, GetRepostRecordsRequest, GetRepostRecordsResponse, GetRepostsByActorAndSubjectsRequest, GetRepostsByActorAndSubjectsResponse, GetRepostsBySubjectRequest, GetRepostsBySubjectResponse, GetSitemapIndexRequest, GetSitemapIndexResponse, GetSitemapPageRequest, GetSitemapPageResponse, GetStarterPackCountsRequest, GetStarterPackCountsResponse, GetStarterPackRecordsRequest, GetStarterPackRecordsResponse, GetStatusRecordsRequest, GetStatusRecordsResponse, GetSuggestedEntitiesRequest, GetSuggestedEntitiesResponse, GetSuggestedFeedsRequest, GetSuggestedFeedsResponse, GetThreadGateRecordsRequest, GetThreadGateRecordsResponse, GetThreadMutesOnSubjectsRequest, GetThreadMutesOnSubjectsResponse, GetThreadRequest, GetThreadResponse, GetTimelineRequest, GetTimelineResponse, GetUnreadNotificationCountRequest, GetUnreadNotificationCountResponse, GetVerificationRecordsRequest, GetVerificationRecordsResponse, GetVerificationsIssuedRequest, GetVerificationsIssuedResponse, GetVerificationsReceivedRequest, GetVerificationsReceivedResponse, PingRequest, PingResponse, SearchActorsRequest, SearchActorsResponse, SearchFeedGeneratorsRequest, SearchFeedGeneratorsResponse, SearchPostsRequest, SearchPostsResponse, SearchStarterPacksRequest, SearchStarterPacksResponse, TakedownActorRequest, TakedownActorResponse, TakedownBlobRequest, TakedownBlobResponse, TakedownRecordRequest, TakedownRecordResponse, UntakedownActorRequest, UntakedownActorResponse, UntakedownBlobRequest, UntakedownBlobResponse, UntakedownRecordRequest, UntakedownRecordResponse, UpdateActorUpstreamStatusRequest, UpdateActorUpstreamStatusResponse, UpdateNotificationSeenRequest, UpdateNotificationSeenResponse } from "./bsky_pb";
7
7
  import { MethodKind } from "@bufbuild/protobuf";
8
8
 
9
9
  /**
@@ -858,6 +858,26 @@ export const Service = {
858
858
  O: GetFollowsFollowingResponse,
859
859
  kind: MethodKind.Unary,
860
860
  },
861
+ /**
862
+ * Sitemaps
863
+ *
864
+ * @generated from rpc bsky.Service.GetSitemapIndex
865
+ */
866
+ getSitemapIndex: {
867
+ name: "GetSitemapIndex",
868
+ I: GetSitemapIndexRequest,
869
+ O: GetSitemapIndexResponse,
870
+ kind: MethodKind.Unary,
871
+ },
872
+ /**
873
+ * @generated from rpc bsky.Service.GetSitemapPage
874
+ */
875
+ getSitemapPage: {
876
+ name: "GetSitemapPage",
877
+ I: GetSitemapPageRequest,
878
+ O: GetSitemapPageResponse,
879
+ kind: MethodKind.Unary,
880
+ },
861
881
  /**
862
882
  * Ping
863
883
  *
@@ -96,6 +96,26 @@ proto3.util.setEnumType(FeedType, "bsky.FeedType", [
96
96
  { no: 4, name: "FEED_TYPE_POSTS_WITH_VIDEO" },
97
97
  ]);
98
98
 
99
+ /**
100
+ * @generated from enum bsky.SitemapPageType
101
+ */
102
+ export enum SitemapPageType {
103
+ /**
104
+ * @generated from enum value: SITEMAP_PAGE_TYPE_UNSPECIFIED = 0;
105
+ */
106
+ UNSPECIFIED = 0,
107
+
108
+ /**
109
+ * @generated from enum value: SITEMAP_PAGE_TYPE_USER = 1;
110
+ */
111
+ USER = 1,
112
+ }
113
+ // Retrieve enum metadata with: proto3.getEnumType(SitemapPageType)
114
+ proto3.util.setEnumType(SitemapPageType, "bsky.SitemapPageType", [
115
+ { no: 0, name: "SITEMAP_PAGE_TYPE_UNSPECIFIED" },
116
+ { no: 1, name: "SITEMAP_PAGE_TYPE_USER" },
117
+ ]);
118
+
99
119
  /**
100
120
  * @generated from message bsky.Record
101
121
  */
@@ -9391,6 +9411,174 @@ export class GetFollowsFollowingResponse extends Message<GetFollowsFollowingResp
9391
9411
  }
9392
9412
  }
9393
9413
 
9414
+ /**
9415
+ * @generated from message bsky.GetSitemapIndexRequest
9416
+ */
9417
+ export class GetSitemapIndexRequest extends Message<GetSitemapIndexRequest> {
9418
+ /**
9419
+ * @generated from field: bsky.SitemapPageType type = 1;
9420
+ */
9421
+ type = SitemapPageType.UNSPECIFIED;
9422
+
9423
+ constructor(data?: PartialMessage<GetSitemapIndexRequest>) {
9424
+ super();
9425
+ proto3.util.initPartial(data, this);
9426
+ }
9427
+
9428
+ static readonly runtime: typeof proto3 = proto3;
9429
+ static readonly typeName = "bsky.GetSitemapIndexRequest";
9430
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
9431
+ { no: 1, name: "type", kind: "enum", T: proto3.getEnumType(SitemapPageType) },
9432
+ ]);
9433
+
9434
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetSitemapIndexRequest {
9435
+ return new GetSitemapIndexRequest().fromBinary(bytes, options);
9436
+ }
9437
+
9438
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetSitemapIndexRequest {
9439
+ return new GetSitemapIndexRequest().fromJson(jsonValue, options);
9440
+ }
9441
+
9442
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetSitemapIndexRequest {
9443
+ return new GetSitemapIndexRequest().fromJsonString(jsonString, options);
9444
+ }
9445
+
9446
+ static equals(a: GetSitemapIndexRequest | PlainMessage<GetSitemapIndexRequest> | undefined, b: GetSitemapIndexRequest | PlainMessage<GetSitemapIndexRequest> | undefined): boolean {
9447
+ return proto3.util.equals(GetSitemapIndexRequest, a, b);
9448
+ }
9449
+ }
9450
+
9451
+ /**
9452
+ * @generated from message bsky.GetSitemapIndexResponse
9453
+ */
9454
+ export class GetSitemapIndexResponse extends Message<GetSitemapIndexResponse> {
9455
+ /**
9456
+ * GZIP compressed XML sitemap
9457
+ *
9458
+ * @generated from field: bytes sitemap = 1;
9459
+ */
9460
+ sitemap = new Uint8Array(0);
9461
+
9462
+ constructor(data?: PartialMessage<GetSitemapIndexResponse>) {
9463
+ super();
9464
+ proto3.util.initPartial(data, this);
9465
+ }
9466
+
9467
+ static readonly runtime: typeof proto3 = proto3;
9468
+ static readonly typeName = "bsky.GetSitemapIndexResponse";
9469
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
9470
+ { no: 1, name: "sitemap", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
9471
+ ]);
9472
+
9473
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetSitemapIndexResponse {
9474
+ return new GetSitemapIndexResponse().fromBinary(bytes, options);
9475
+ }
9476
+
9477
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetSitemapIndexResponse {
9478
+ return new GetSitemapIndexResponse().fromJson(jsonValue, options);
9479
+ }
9480
+
9481
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetSitemapIndexResponse {
9482
+ return new GetSitemapIndexResponse().fromJsonString(jsonString, options);
9483
+ }
9484
+
9485
+ static equals(a: GetSitemapIndexResponse | PlainMessage<GetSitemapIndexResponse> | undefined, b: GetSitemapIndexResponse | PlainMessage<GetSitemapIndexResponse> | undefined): boolean {
9486
+ return proto3.util.equals(GetSitemapIndexResponse, a, b);
9487
+ }
9488
+ }
9489
+
9490
+ /**
9491
+ * Sitemap HTTP paths are typically of the form `/type/yyyy-mm-dd/N.xml.gz`, i.e. `/users/2025-01-01/1.xml.gz`
9492
+ *
9493
+ * @generated from message bsky.GetSitemapPageRequest
9494
+ */
9495
+ export class GetSitemapPageRequest extends Message<GetSitemapPageRequest> {
9496
+ /**
9497
+ * @generated from field: bsky.SitemapPageType type = 1;
9498
+ */
9499
+ type = SitemapPageType.UNSPECIFIED;
9500
+
9501
+ /**
9502
+ * @generated from field: google.protobuf.Timestamp date = 2;
9503
+ */
9504
+ date?: Timestamp;
9505
+
9506
+ /**
9507
+ * One-indexed
9508
+ *
9509
+ * @generated from field: int32 bucket = 3;
9510
+ */
9511
+ bucket = 0;
9512
+
9513
+ constructor(data?: PartialMessage<GetSitemapPageRequest>) {
9514
+ super();
9515
+ proto3.util.initPartial(data, this);
9516
+ }
9517
+
9518
+ static readonly runtime: typeof proto3 = proto3;
9519
+ static readonly typeName = "bsky.GetSitemapPageRequest";
9520
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
9521
+ { no: 1, name: "type", kind: "enum", T: proto3.getEnumType(SitemapPageType) },
9522
+ { no: 2, name: "date", kind: "message", T: Timestamp },
9523
+ { no: 3, name: "bucket", kind: "scalar", T: 5 /* ScalarType.INT32 */ },
9524
+ ]);
9525
+
9526
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetSitemapPageRequest {
9527
+ return new GetSitemapPageRequest().fromBinary(bytes, options);
9528
+ }
9529
+
9530
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetSitemapPageRequest {
9531
+ return new GetSitemapPageRequest().fromJson(jsonValue, options);
9532
+ }
9533
+
9534
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetSitemapPageRequest {
9535
+ return new GetSitemapPageRequest().fromJsonString(jsonString, options);
9536
+ }
9537
+
9538
+ static equals(a: GetSitemapPageRequest | PlainMessage<GetSitemapPageRequest> | undefined, b: GetSitemapPageRequest | PlainMessage<GetSitemapPageRequest> | undefined): boolean {
9539
+ return proto3.util.equals(GetSitemapPageRequest, a, b);
9540
+ }
9541
+ }
9542
+
9543
+ /**
9544
+ * @generated from message bsky.GetSitemapPageResponse
9545
+ */
9546
+ export class GetSitemapPageResponse extends Message<GetSitemapPageResponse> {
9547
+ /**
9548
+ * GZIP compressed XML sitemap
9549
+ *
9550
+ * @generated from field: bytes sitemap = 1;
9551
+ */
9552
+ sitemap = new Uint8Array(0);
9553
+
9554
+ constructor(data?: PartialMessage<GetSitemapPageResponse>) {
9555
+ super();
9556
+ proto3.util.initPartial(data, this);
9557
+ }
9558
+
9559
+ static readonly runtime: typeof proto3 = proto3;
9560
+ static readonly typeName = "bsky.GetSitemapPageResponse";
9561
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
9562
+ { no: 1, name: "sitemap", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
9563
+ ]);
9564
+
9565
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetSitemapPageResponse {
9566
+ return new GetSitemapPageResponse().fromBinary(bytes, options);
9567
+ }
9568
+
9569
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetSitemapPageResponse {
9570
+ return new GetSitemapPageResponse().fromJson(jsonValue, options);
9571
+ }
9572
+
9573
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetSitemapPageResponse {
9574
+ return new GetSitemapPageResponse().fromJsonString(jsonString, options);
9575
+ }
9576
+
9577
+ static equals(a: GetSitemapPageResponse | PlainMessage<GetSitemapPageResponse> | undefined, b: GetSitemapPageResponse | PlainMessage<GetSitemapPageResponse> | undefined): boolean {
9578
+ return proto3.util.equals(GetSitemapPageResponse, a, b);
9579
+ }
9580
+ }
9581
+
9394
9582
  /**
9395
9583
  * Ping
9396
9584
  *
package/src/stash.ts CHANGED
@@ -5,6 +5,7 @@ import { BsyncClient } from './bsync'
5
5
  import { lexicons } from './lexicon/lexicons'
6
6
  import { Event as AgeAssuranceEventV2 } from './lexicon/types/app/bsky/ageassurance/defs'
7
7
  import { Bookmark } from './lexicon/types/app/bsky/bookmark/defs'
8
+ import { Notification } from './lexicon/types/app/bsky/contact/defs'
8
9
  import {
9
10
  Preferences,
10
11
  SubjectActivitySubscription,
@@ -15,16 +16,18 @@ import { Method } from './proto/bsync_pb'
15
16
  type PickNSID<T extends { $type?: string }> = Exclude<T['$type'], undefined>
16
17
 
17
18
  export const Namespaces = {
19
+ AppBskyAgeassuranceDefsEvent:
20
+ 'app.bsky.ageassurance.defs#event' satisfies PickNSID<AgeAssuranceEventV2>,
18
21
  AppBskyBookmarkDefsBookmark:
19
22
  'app.bsky.bookmark.defs#bookmark' satisfies PickNSID<Bookmark>,
23
+ AppBskyContactDefsNotification:
24
+ 'app.bsky.contact.defs#notification' satisfies PickNSID<Notification>,
20
25
  AppBskyNotificationDefsPreferences:
21
26
  'app.bsky.notification.defs#preferences' satisfies PickNSID<Preferences>,
22
27
  AppBskyNotificationDefsSubjectActivitySubscription:
23
28
  'app.bsky.notification.defs#subjectActivitySubscription' satisfies PickNSID<SubjectActivitySubscription>,
24
29
  AppBskyUnspeccedDefsAgeAssuranceEvent:
25
30
  'app.bsky.unspecced.defs#ageAssuranceEvent' satisfies PickNSID<AgeAssuranceEvent>,
26
- AppBskyAgeassuranceDefsEvent:
27
- 'app.bsky.ageassurance.defs#event' satisfies PickNSID<AgeAssuranceEventV2>,
28
31
  }
29
32
 
30
33
  export type Namespace = (typeof Namespaces)[keyof typeof Namespaces]
@@ -0,0 +1,75 @@
1
+ import { TestNetwork } from '@atproto/dev-env'
2
+
3
+ describe('sitemap', () => {
4
+ let network: TestNetwork
5
+
6
+ beforeAll(async () => {
7
+ network = await TestNetwork.create({
8
+ dbPostgresSchema: 'bsky_sitemap',
9
+ })
10
+ })
11
+
12
+ afterAll(async () => {
13
+ await network.close()
14
+ })
15
+
16
+ it('returns sitemap index', async () => {
17
+ const response = await fetch(
18
+ `${network.bsky.url}/external/sitemap/users.xml.gz`,
19
+ )
20
+ expect(response.status).toEqual(200)
21
+ expect(response.headers.get('content-type')).toEqual('application/gzip')
22
+ expect(response.headers.get('content-encoding')).toEqual('gzip')
23
+
24
+ // fetch automatically decompresses gzip when Content-Encoding is set
25
+ const xml = await response.text()
26
+
27
+ expect(xml).toContain('<?xml version="1.0" encoding="UTF-8"?>')
28
+ expect(xml).toContain('<sitemapindex')
29
+ expect(xml).toContain('</sitemapindex>')
30
+ })
31
+
32
+ it('returns sitemap page', async () => {
33
+ const response = await fetch(
34
+ `${network.bsky.url}/external/sitemap/users/2025-01-01/1.xml.gz`,
35
+ )
36
+ expect(response.status).toEqual(200)
37
+ expect(response.headers.get('content-type')).toEqual('application/gzip')
38
+ expect(response.headers.get('content-encoding')).toEqual('gzip')
39
+
40
+ // fetch automatically decompresses gzip when Content-Encoding is set
41
+ const xml = await response.text()
42
+
43
+ expect(xml).toContain('<?xml version="1.0" encoding="UTF-8"?>')
44
+ expect(xml).toContain('<urlset')
45
+ expect(xml).toContain('</urlset>')
46
+ })
47
+
48
+ it('returns 400 for invalid date format', async () => {
49
+ const response = await fetch(
50
+ `${network.bsky.url}/external/sitemap/users/invalid-date/1.xml.gz`,
51
+ )
52
+ expect(response.status).toEqual(400)
53
+ })
54
+
55
+ it('returns 400 for invalid bucket number', async () => {
56
+ const response = await fetch(
57
+ `${network.bsky.url}/external/sitemap/users/2025-01-01/0.xml.gz`,
58
+ )
59
+ expect(response.status).toEqual(400)
60
+ })
61
+
62
+ it('returns 400 for non-numeric bucket', async () => {
63
+ const response = await fetch(
64
+ `${network.bsky.url}/external/sitemap/users/2025-01-01/abc.xml.gz`,
65
+ )
66
+ expect(response.status).toEqual(400)
67
+ })
68
+
69
+ it('returns 404 for non-existent sitemap page', async () => {
70
+ const response = await fetch(
71
+ `${network.bsky.url}/external/sitemap/users/2024-01-01/1.xml.gz`,
72
+ )
73
+ expect(response.status).toEqual(404)
74
+ })
75
+ })
@@ -519,7 +519,39 @@ describe('age assurance v2 views', () => {
519
519
  })
520
520
 
521
521
  describe('misc', () => {
522
- it('cannot re-init from terminal state', async () => {
522
+ /*
523
+ * This is a silly test, but it did help me uncover a local data-plane
524
+ * implementation bug. Let's leave it here for additional safety.
525
+ */
526
+ it('expects access to be safe', async () => {
527
+ await kws.redirectV2({
528
+ externalPayload: serializeKWSExternalPayloadV2({
529
+ version: KWSExternalPayloadVersion.V2,
530
+ actorDid: actor.did,
531
+ attemptId: crypto.randomUUID(),
532
+ countryCode: 'AA',
533
+ }),
534
+ status: serializeKWSAgeVerifiedStatus({
535
+ verified: true,
536
+ verifiedMinimumAge: 16,
537
+ }),
538
+ })
539
+ await network.processAll()
540
+ const { state } = await getState({
541
+ countryCode: 'AA',
542
+ })
543
+ expect(state.status).toEqual('assured')
544
+ expect(state.access).toEqual('safe')
545
+ })
546
+
547
+ /**
548
+ * We only block re-init if the user is in a `blocked` state, which is not
549
+ * testable using the local dataplane at the moment. The test below
550
+ * reflects v1 handling.
551
+ *
552
+ * Skipping for now, but this handling is implemented in v2.
553
+ */
554
+ it.skip('cannot re-init from terminal state', async () => {
523
555
  await kws.redirectV2({
524
556
  externalPayload: serializeKWSExternalPayloadV2({
525
557
  version: KWSExternalPayloadVersion.V2,
@@ -539,6 +571,32 @@ describe('age assurance v2 views', () => {
539
571
  await expect(call).rejects.toHaveProperty('error', 'InvalidInitiation')
540
572
  })
541
573
 
574
+ it('re-init from terminal state retains existing status', async () => {
575
+ await kws.redirectV2({
576
+ externalPayload: serializeKWSExternalPayloadV2({
577
+ version: KWSExternalPayloadVersion.V2,
578
+ actorDid: actor.did,
579
+ attemptId: crypto.randomUUID(),
580
+ countryCode: 'AA',
581
+ }),
582
+ status: serializeKWSAgeVerifiedStatus({
583
+ verified: true,
584
+ verifiedMinimumAge: 16,
585
+ }),
586
+ })
587
+ await network.processAll()
588
+ const { state } = await getState({
589
+ countryCode: 'AA',
590
+ })
591
+ expect(state.status).toEqual('assured')
592
+ expect(state.access).toEqual('safe')
593
+ const res = await beginAgeAssurance({
594
+ countryCode: 'AA',
595
+ })
596
+ expect(res.status).toEqual('assured')
597
+ expect(res.access).toEqual('safe')
598
+ })
599
+
542
600
  /*
543
601
  * This tests local dataplane behavior, but the actual prod implementation
544
602
  * lives in the dataplane repo, obviously.