@atproto/ozone 0.1.106 → 0.1.108

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 (215) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/api/index.d.ts.map +1 -1
  3. package/dist/api/index.js +6 -0
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/proxied.d.ts.map +1 -1
  6. package/dist/api/proxied.js +29 -16
  7. package/dist/api/proxied.js.map +1 -1
  8. package/dist/api/server/getConfig.d.ts.map +1 -1
  9. package/dist/api/server/getConfig.js +1 -0
  10. package/dist/api/server/getConfig.js.map +1 -1
  11. package/dist/api/setting/removeOptions.d.ts.map +1 -1
  12. package/dist/api/setting/removeOptions.js +1 -0
  13. package/dist/api/setting/removeOptions.js.map +1 -1
  14. package/dist/api/setting/upsertOption.js +7 -0
  15. package/dist/api/setting/upsertOption.js.map +1 -1
  16. package/dist/api/util.d.ts +1 -1
  17. package/dist/api/util.d.ts.map +1 -1
  18. package/dist/api/util.js +6 -1
  19. package/dist/api/util.js.map +1 -1
  20. package/dist/api/verification/grantVerifications.d.ts +4 -0
  21. package/dist/api/verification/grantVerifications.d.ts.map +1 -0
  22. package/dist/api/verification/grantVerifications.js +52 -0
  23. package/dist/api/verification/grantVerifications.js.map +1 -0
  24. package/dist/api/verification/listVerifications.d.ts +4 -0
  25. package/dist/api/verification/listVerifications.d.ts.map +1 -0
  26. package/dist/api/verification/listVerifications.js +32 -0
  27. package/dist/api/verification/listVerifications.js.map +1 -0
  28. package/dist/api/verification/revokeVerifications.d.ts +4 -0
  29. package/dist/api/verification/revokeVerifications.d.ts.map +1 -0
  30. package/dist/api/verification/revokeVerifications.js +36 -0
  31. package/dist/api/verification/revokeVerifications.js.map +1 -0
  32. package/dist/auth-verifier.d.ts +4 -1
  33. package/dist/auth-verifier.d.ts.map +1 -1
  34. package/dist/auth-verifier.js +4 -3
  35. package/dist/auth-verifier.js.map +1 -1
  36. package/dist/background.d.ts +3 -1
  37. package/dist/background.d.ts.map +1 -1
  38. package/dist/background.js +3 -2
  39. package/dist/background.js.map +1 -1
  40. package/dist/config/config.d.ts +9 -0
  41. package/dist/config/config.d.ts.map +1 -1
  42. package/dist/config/config.js +10 -0
  43. package/dist/config/config.js.map +1 -1
  44. package/dist/config/env.d.ts +5 -0
  45. package/dist/config/env.d.ts.map +1 -1
  46. package/dist/config/env.js +5 -0
  47. package/dist/config/env.js.map +1 -1
  48. package/dist/context.d.ts +6 -0
  49. package/dist/context.d.ts.map +1 -1
  50. package/dist/context.js +12 -0
  51. package/dist/context.js.map +1 -1
  52. package/dist/daemon/context.d.ts +3 -0
  53. package/dist/daemon/context.d.ts.map +1 -1
  54. package/dist/daemon/context.js +11 -0
  55. package/dist/daemon/context.js.map +1 -1
  56. package/dist/daemon/verification-listener.d.ts +29 -0
  57. package/dist/daemon/verification-listener.d.ts.map +1 -0
  58. package/dist/daemon/verification-listener.js +171 -0
  59. package/dist/daemon/verification-listener.js.map +1 -0
  60. package/dist/db/migrations/20250415T201720309Z-verification.d.ts +4 -0
  61. package/dist/db/migrations/20250415T201720309Z-verification.d.ts.map +1 -0
  62. package/dist/db/migrations/20250415T201720309Z-verification.js +35 -0
  63. package/dist/db/migrations/20250415T201720309Z-verification.js.map +1 -0
  64. package/dist/db/migrations/20250417T201720309Z-firehose-cursor.d.ts +4 -0
  65. package/dist/db/migrations/20250417T201720309Z-firehose-cursor.d.ts.map +1 -0
  66. package/dist/db/migrations/20250417T201720309Z-firehose-cursor.js +17 -0
  67. package/dist/db/migrations/20250417T201720309Z-firehose-cursor.js.map +1 -0
  68. package/dist/db/migrations/index.d.ts +2 -0
  69. package/dist/db/migrations/index.d.ts.map +1 -1
  70. package/dist/db/migrations/index.js +3 -1
  71. package/dist/db/migrations/index.js.map +1 -1
  72. package/dist/db/pagination.d.ts +15 -0
  73. package/dist/db/pagination.d.ts.map +1 -1
  74. package/dist/db/pagination.js +23 -1
  75. package/dist/db/pagination.js.map +1 -1
  76. package/dist/db/schema/firehose_cursor.d.ts +11 -0
  77. package/dist/db/schema/firehose_cursor.d.ts.map +1 -0
  78. package/dist/db/schema/firehose_cursor.js +5 -0
  79. package/dist/db/schema/firehose_cursor.js.map +1 -0
  80. package/dist/db/schema/index.d.ts +3 -1
  81. package/dist/db/schema/index.d.ts.map +1 -1
  82. package/dist/db/schema/member.d.ts +1 -1
  83. package/dist/db/schema/member.d.ts.map +1 -1
  84. package/dist/db/schema/verification.d.ts +19 -0
  85. package/dist/db/schema/verification.d.ts.map +1 -0
  86. package/dist/db/schema/verification.js +5 -0
  87. package/dist/db/schema/verification.js.map +1 -0
  88. package/dist/jetstream/service.d.ts +64 -0
  89. package/dist/jetstream/service.d.ts.map +1 -0
  90. package/dist/jetstream/service.js +65 -0
  91. package/dist/jetstream/service.js.map +1 -0
  92. package/dist/lexicon/index.d.ts +19 -0
  93. package/dist/lexicon/index.d.ts.map +1 -1
  94. package/dist/lexicon/index.js +56 -1
  95. package/dist/lexicon/index.js.map +1 -1
  96. package/dist/lexicon/lexicons.d.ts +976 -80
  97. package/dist/lexicon/lexicons.d.ts.map +1 -1
  98. package/dist/lexicon/lexicons.js +485 -1
  99. package/dist/lexicon/lexicons.js.map +1 -1
  100. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts +1 -1
  101. package/dist/lexicon/types/chat/bsky/actor/defs.d.ts.map +1 -1
  102. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.d.ts +81 -0
  103. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.d.ts.map +1 -0
  104. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.js +61 -0
  105. package/dist/lexicon/types/tools/ozone/hosting/getAccountHistory.js.map +1 -0
  106. package/dist/lexicon/types/tools/ozone/server/getConfig.d.ts +3 -1
  107. package/dist/lexicon/types/tools/ozone/server/getConfig.d.ts.map +1 -1
  108. package/dist/lexicon/types/tools/ozone/server/getConfig.js.map +1 -1
  109. package/dist/lexicon/types/tools/ozone/setting/defs.d.ts +1 -1
  110. package/dist/lexicon/types/tools/ozone/setting/defs.d.ts.map +1 -1
  111. package/dist/lexicon/types/tools/ozone/setting/defs.js.map +1 -1
  112. package/dist/lexicon/types/tools/ozone/setting/upsertOption.d.ts +1 -1
  113. package/dist/lexicon/types/tools/ozone/setting/upsertOption.d.ts.map +1 -1
  114. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts +1 -1
  115. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts.map +1 -1
  116. package/dist/lexicon/types/tools/ozone/team/defs.d.ts +3 -1
  117. package/dist/lexicon/types/tools/ozone/team/defs.d.ts.map +1 -1
  118. package/dist/lexicon/types/tools/ozone/team/defs.js +3 -1
  119. package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -1
  120. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts +1 -1
  121. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts.map +1 -1
  122. package/dist/lexicon/types/tools/ozone/verification/defs.d.ts +43 -0
  123. package/dist/lexicon/types/tools/ozone/verification/defs.d.ts.map +1 -0
  124. package/dist/lexicon/types/tools/ozone/verification/defs.js +16 -0
  125. package/dist/lexicon/types/tools/ozone/verification/defs.js.map +1 -0
  126. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.d.ts +66 -0
  127. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.d.ts.map +1 -0
  128. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.js +25 -0
  129. package/dist/lexicon/types/tools/ozone/verification/grantVerifications.js.map +1 -0
  130. package/dist/lexicon/types/tools/ozone/verification/listVerifications.d.ts +52 -0
  131. package/dist/lexicon/types/tools/ozone/verification/listVerifications.d.ts.map +1 -0
  132. package/dist/lexicon/types/tools/ozone/verification/listVerifications.js +7 -0
  133. package/dist/lexicon/types/tools/ozone/verification/listVerifications.js.map +1 -0
  134. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.d.ts +56 -0
  135. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.d.ts.map +1 -0
  136. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.js +16 -0
  137. package/dist/lexicon/types/tools/ozone/verification/revokeVerifications.js.map +1 -0
  138. package/dist/logger.d.ts +1 -0
  139. package/dist/logger.d.ts.map +1 -1
  140. package/dist/logger.js +2 -1
  141. package/dist/logger.js.map +1 -1
  142. package/dist/mod-service/index.d.ts.map +1 -1
  143. package/dist/mod-service/index.js +58 -21
  144. package/dist/mod-service/index.js.map +1 -1
  145. package/dist/mod-service/status.d.ts +6 -0
  146. package/dist/mod-service/status.d.ts.map +1 -1
  147. package/dist/team/index.d.ts +1 -0
  148. package/dist/team/index.d.ts.map +1 -1
  149. package/dist/team/index.js +3 -0
  150. package/dist/team/index.js.map +1 -1
  151. package/dist/verification/issuer.d.ts +37 -0
  152. package/dist/verification/issuer.d.ts.map +1 -0
  153. package/dist/verification/issuer.js +119 -0
  154. package/dist/verification/issuer.js.map +1 -0
  155. package/dist/verification/service.d.ts +47 -0
  156. package/dist/verification/service.d.ts.map +1 -0
  157. package/dist/verification/service.js +141 -0
  158. package/dist/verification/service.js.map +1 -0
  159. package/dist/verification/util.d.ts +6 -0
  160. package/dist/verification/util.d.ts.map +1 -0
  161. package/dist/verification/util.js +32 -0
  162. package/dist/verification/util.js.map +1 -0
  163. package/package.json +5 -4
  164. package/src/api/index.ts +6 -0
  165. package/src/api/proxied.ts +39 -24
  166. package/src/api/server/getConfig.ts +1 -0
  167. package/src/api/setting/removeOptions.ts +1 -0
  168. package/src/api/setting/upsertOption.ts +7 -0
  169. package/src/api/util.ts +7 -1
  170. package/src/api/verification/grantVerifications.ts +74 -0
  171. package/src/api/verification/listVerifications.ts +44 -0
  172. package/src/api/verification/revokeVerifications.ts +43 -0
  173. package/src/auth-verifier.ts +8 -4
  174. package/src/background.ts +7 -2
  175. package/src/config/config.ts +21 -0
  176. package/src/config/env.ts +10 -0
  177. package/src/context.ts +22 -0
  178. package/src/daemon/context.ts +19 -0
  179. package/src/daemon/verification-listener.ts +164 -0
  180. package/src/db/migrations/20250415T201720309Z-verification.ts +34 -0
  181. package/src/db/migrations/20250417T201720309Z-firehose-cursor.ts +16 -0
  182. package/src/db/migrations/index.ts +2 -0
  183. package/src/db/pagination.ts +31 -0
  184. package/src/db/schema/firehose_cursor.ts +13 -0
  185. package/src/db/schema/index.ts +5 -1
  186. package/src/db/schema/member.ts +1 -0
  187. package/src/db/schema/verification.ts +21 -0
  188. package/src/jetstream/service.ts +110 -0
  189. package/src/lexicon/index.ts +69 -0
  190. package/src/lexicon/lexicons.ts +505 -1
  191. package/src/lexicon/types/chat/bsky/actor/defs.ts +1 -1
  192. package/src/lexicon/types/tools/ozone/hosting/getAccountHistory.ts +161 -0
  193. package/src/lexicon/types/tools/ozone/server/getConfig.ts +3 -0
  194. package/src/lexicon/types/tools/ozone/setting/defs.ts +1 -0
  195. package/src/lexicon/types/tools/ozone/setting/upsertOption.ts +1 -0
  196. package/src/lexicon/types/tools/ozone/team/addMember.ts +1 -0
  197. package/src/lexicon/types/tools/ozone/team/defs.ts +3 -0
  198. package/src/lexicon/types/tools/ozone/team/updateMember.ts +1 -0
  199. package/src/lexicon/types/tools/ozone/verification/defs.ts +59 -0
  200. package/src/lexicon/types/tools/ozone/verification/grantVerifications.ts +100 -0
  201. package/src/lexicon/types/tools/ozone/verification/listVerifications.ts +70 -0
  202. package/src/lexicon/types/tools/ozone/verification/revokeVerifications.ts +81 -0
  203. package/src/logger.ts +2 -0
  204. package/src/mod-service/index.ts +83 -30
  205. package/src/team/index.ts +4 -0
  206. package/src/verification/issuer.ts +135 -0
  207. package/src/verification/service.ts +208 -0
  208. package/src/verification/util.ts +50 -0
  209. package/tests/__snapshots__/verification-listener.test.ts.snap +146 -0
  210. package/tests/__snapshots__/verification.test.ts.snap +288 -0
  211. package/tests/get-reporter-stats.test.ts +24 -9
  212. package/tests/verification-listener.test.ts +102 -0
  213. package/tests/verification.test.ts +136 -0
  214. package/tsconfig.build.tsbuildinfo +1 -1
  215. package/tsconfig.tests.tsbuildinfo +1 -1
@@ -0,0 +1,146 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`verification-listener indexes new and revoked verifications 1`] = `
4
+ Array [
5
+ Object {
6
+ "$type": "tools.ozone.verification.defs#verificationView",
7
+ "createdAt": "1970-01-01T00:00:00.000Z",
8
+ "displayName": "Alice",
9
+ "handle": "alice.test",
10
+ "issuer": "user(0)",
11
+ "issuerProfile": Object {
12
+ "$type": "app.bsky.actor.defs#profileViewDetailed",
13
+ "associated": Object {
14
+ "feedgens": 0,
15
+ "labeler": false,
16
+ "lists": 0,
17
+ "starterPacks": 0,
18
+ },
19
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(3)/cids(0)@jpeg",
20
+ "createdAt": "1970-01-01T00:00:00.000Z",
21
+ "description": "hi im bob label_me",
22
+ "did": "user(0)",
23
+ "displayName": "bobby",
24
+ "followersCount": 2,
25
+ "followsCount": 2,
26
+ "handle": "bob.test",
27
+ "indexedAt": "1970-01-01T00:00:00.000Z",
28
+ "labels": Array [],
29
+ "postsCount": 3,
30
+ "viewer": Object {
31
+ "blockedBy": false,
32
+ "muted": false,
33
+ },
34
+ },
35
+ "issuerRepo": Object {
36
+ "$type": "tools.ozone.moderation.defs#repoViewDetail",
37
+ "did": "user(0)",
38
+ "email": "bob@test.com",
39
+ "handle": "bob.test",
40
+ "indexedAt": "1970-01-01T00:00:00.000Z",
41
+ "invites": Array [],
42
+ "invitesDisabled": false,
43
+ "labels": Array [],
44
+ "moderation": Object {},
45
+ "relatedRecords": Array [
46
+ Object {
47
+ "$type": "app.bsky.actor.profile",
48
+ "avatar": Object {
49
+ "$type": "blob",
50
+ "mimeType": "image/jpeg",
51
+ "ref": Object {
52
+ "$link": "cids(0)",
53
+ },
54
+ "size": 3976,
55
+ },
56
+ "createdAt": "1970-01-01T00:00:00.000Z",
57
+ "description": "hi im bob label_me",
58
+ "displayName": "bobby",
59
+ },
60
+ ],
61
+ },
62
+ "revokedAt": "1970-01-01T00:00:00.000Z",
63
+ "revokedBy": "user(0)",
64
+ "subject": "user(1)",
65
+ "subjectProfile": Object {
66
+ "$type": "app.bsky.actor.defs#profileViewDetailed",
67
+ "associated": Object {
68
+ "feedgens": 0,
69
+ "labeler": false,
70
+ "lists": 0,
71
+ "starterPacks": 0,
72
+ },
73
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(2)/cids(0)@jpeg",
74
+ "createdAt": "1970-01-01T00:00:00.000Z",
75
+ "description": "its me!",
76
+ "did": "user(1)",
77
+ "displayName": "ali",
78
+ "followersCount": 2,
79
+ "followsCount": 3,
80
+ "handle": "alice.test",
81
+ "indexedAt": "1970-01-01T00:00:00.000Z",
82
+ "labels": Array [
83
+ Object {
84
+ "cid": "cids(1)",
85
+ "cts": "1970-01-01T00:00:00.000Z",
86
+ "src": "user(1)",
87
+ "uri": "record(1)",
88
+ "val": "self-label-a",
89
+ },
90
+ Object {
91
+ "cid": "cids(1)",
92
+ "cts": "1970-01-01T00:00:00.000Z",
93
+ "src": "user(1)",
94
+ "uri": "record(1)",
95
+ "val": "self-label-b",
96
+ },
97
+ ],
98
+ "postsCount": 4,
99
+ "viewer": Object {
100
+ "blockedBy": false,
101
+ "muted": false,
102
+ },
103
+ },
104
+ "subjectRepo": Object {
105
+ "$type": "tools.ozone.moderation.defs#repoViewDetail",
106
+ "did": "user(1)",
107
+ "email": "alice@test.com",
108
+ "handle": "alice.test",
109
+ "indexedAt": "1970-01-01T00:00:00.000Z",
110
+ "invites": Array [],
111
+ "invitesDisabled": false,
112
+ "labels": Array [],
113
+ "moderation": Object {},
114
+ "relatedRecords": Array [
115
+ Object {
116
+ "$type": "app.bsky.actor.profile",
117
+ "avatar": Object {
118
+ "$type": "blob",
119
+ "mimeType": "image/jpeg",
120
+ "ref": Object {
121
+ "$link": "cids(0)",
122
+ },
123
+ "size": 3976,
124
+ },
125
+ "createdAt": "1970-01-01T00:00:00.000Z",
126
+ "description": "its me!",
127
+ "displayName": "ali",
128
+ "labels": Object {
129
+ "$type": "com.atproto.label.defs#selfLabels",
130
+ "values": Array [
131
+ Object {
132
+ "val": "self-label-a",
133
+ },
134
+ Object {
135
+ "val": "self-label-b",
136
+ },
137
+ ],
138
+ },
139
+ },
140
+ ],
141
+ },
142
+ "updatedAt": "1970-01-01T00:00:00.000Z",
143
+ "uri": "record(0)",
144
+ },
145
+ ]
146
+ `;
@@ -0,0 +1,288 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`verification list returns paginated list of verifications 1`] = `
4
+ Object {
5
+ "$type": "tools.ozone.verification.defs#verificationView",
6
+ "createdAt": "1970-01-01T00:00:00.000Z",
7
+ "displayName": "bobby",
8
+ "handle": "bob.test",
9
+ "issuer": "user(0)",
10
+ "issuerProfile": Object {
11
+ "$type": "app.bsky.actor.defs#profileViewDetailed",
12
+ "associated": Object {
13
+ "feedgens": 0,
14
+ "labeler": false,
15
+ "lists": 0,
16
+ "starterPacks": 0,
17
+ },
18
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(3)/cids(0)@jpeg",
19
+ "createdAt": "1970-01-01T00:00:00.000Z",
20
+ "description": "its me!",
21
+ "did": "user(0)",
22
+ "displayName": "ali",
23
+ "followersCount": 2,
24
+ "followsCount": 3,
25
+ "handle": "alice.test",
26
+ "indexedAt": "1970-01-01T00:00:00.000Z",
27
+ "labels": Array [
28
+ Object {
29
+ "cid": "cids(1)",
30
+ "cts": "1970-01-01T00:00:00.000Z",
31
+ "src": "user(0)",
32
+ "uri": "record(1)",
33
+ "val": "self-label-a",
34
+ },
35
+ Object {
36
+ "cid": "cids(1)",
37
+ "cts": "1970-01-01T00:00:00.000Z",
38
+ "src": "user(0)",
39
+ "uri": "record(1)",
40
+ "val": "self-label-b",
41
+ },
42
+ ],
43
+ "postsCount": 4,
44
+ "verification": Object {
45
+ "trustedVerifierStatus": "valid",
46
+ "verifications": Array [],
47
+ "verifiedStatus": "none",
48
+ },
49
+ "viewer": Object {
50
+ "blockedBy": false,
51
+ "muted": false,
52
+ },
53
+ },
54
+ "issuerRepo": Object {
55
+ "$type": "tools.ozone.moderation.defs#repoViewDetail",
56
+ "did": "user(0)",
57
+ "email": "alice@test.com",
58
+ "handle": "alice.test",
59
+ "indexedAt": "1970-01-01T00:00:00.000Z",
60
+ "invites": Array [],
61
+ "invitesDisabled": false,
62
+ "labels": Array [],
63
+ "moderation": Object {},
64
+ "relatedRecords": Array [
65
+ Object {
66
+ "$type": "app.bsky.actor.profile",
67
+ "avatar": Object {
68
+ "$type": "blob",
69
+ "mimeType": "image/jpeg",
70
+ "ref": Object {
71
+ "$link": "cids(0)",
72
+ },
73
+ "size": 3976,
74
+ },
75
+ "createdAt": "1970-01-01T00:00:00.000Z",
76
+ "description": "its me!",
77
+ "displayName": "ali",
78
+ "labels": Object {
79
+ "$type": "com.atproto.label.defs#selfLabels",
80
+ "values": Array [
81
+ Object {
82
+ "val": "self-label-a",
83
+ },
84
+ Object {
85
+ "val": "self-label-b",
86
+ },
87
+ ],
88
+ },
89
+ },
90
+ ],
91
+ },
92
+ "subject": "user(1)",
93
+ "subjectProfile": Object {
94
+ "$type": "app.bsky.actor.defs#profileViewDetailed",
95
+ "associated": Object {
96
+ "feedgens": 0,
97
+ "labeler": false,
98
+ "lists": 0,
99
+ "starterPacks": 0,
100
+ },
101
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(2)/cids(0)@jpeg",
102
+ "createdAt": "1970-01-01T00:00:00.000Z",
103
+ "description": "hi im bob label_me",
104
+ "did": "user(1)",
105
+ "displayName": "bobby",
106
+ "followersCount": 2,
107
+ "followsCount": 2,
108
+ "handle": "bob.test",
109
+ "indexedAt": "1970-01-01T00:00:00.000Z",
110
+ "labels": Array [],
111
+ "postsCount": 3,
112
+ "verification": Object {
113
+ "trustedVerifierStatus": "none",
114
+ "verifications": Array [
115
+ Object {
116
+ "createdAt": "1970-01-01T00:00:00.000Z",
117
+ "isValid": true,
118
+ "issuer": "user(0)",
119
+ "uri": "record(0)",
120
+ },
121
+ ],
122
+ "verifiedStatus": "valid",
123
+ },
124
+ "viewer": Object {
125
+ "blockedBy": false,
126
+ "muted": false,
127
+ },
128
+ },
129
+ "subjectRepo": Object {
130
+ "$type": "tools.ozone.moderation.defs#repoViewDetail",
131
+ "did": "user(1)",
132
+ "email": "bob@test.com",
133
+ "handle": "bob.test",
134
+ "indexedAt": "1970-01-01T00:00:00.000Z",
135
+ "invites": Array [],
136
+ "invitesDisabled": false,
137
+ "labels": Array [],
138
+ "moderation": Object {},
139
+ "relatedRecords": Array [
140
+ Object {
141
+ "$type": "app.bsky.actor.profile",
142
+ "avatar": Object {
143
+ "$type": "blob",
144
+ "mimeType": "image/jpeg",
145
+ "ref": Object {
146
+ "$link": "cids(0)",
147
+ },
148
+ "size": 3976,
149
+ },
150
+ "createdAt": "1970-01-01T00:00:00.000Z",
151
+ "description": "hi im bob label_me",
152
+ "displayName": "bobby",
153
+ },
154
+ ],
155
+ },
156
+ "updatedAt": "1970-01-01T00:00:00.000Z",
157
+ "uri": "record(0)",
158
+ }
159
+ `;
160
+
161
+ exports[`verification list returns paginated list of verifications 2`] = `
162
+ Object {
163
+ "$type": "tools.ozone.verification.defs#verificationView",
164
+ "createdAt": "1970-01-01T00:00:00.000Z",
165
+ "displayName": "",
166
+ "handle": "carol.test",
167
+ "issuer": "user(0)",
168
+ "issuerProfile": Object {
169
+ "$type": "app.bsky.actor.defs#profileViewDetailed",
170
+ "associated": Object {
171
+ "feedgens": 0,
172
+ "labeler": false,
173
+ "lists": 0,
174
+ "starterPacks": 0,
175
+ },
176
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(2)/cids(0)@jpeg",
177
+ "createdAt": "1970-01-01T00:00:00.000Z",
178
+ "description": "its me!",
179
+ "did": "user(0)",
180
+ "displayName": "ali",
181
+ "followersCount": 2,
182
+ "followsCount": 3,
183
+ "handle": "alice.test",
184
+ "indexedAt": "1970-01-01T00:00:00.000Z",
185
+ "labels": Array [
186
+ Object {
187
+ "cid": "cids(1)",
188
+ "cts": "1970-01-01T00:00:00.000Z",
189
+ "src": "user(0)",
190
+ "uri": "record(1)",
191
+ "val": "self-label-a",
192
+ },
193
+ Object {
194
+ "cid": "cids(1)",
195
+ "cts": "1970-01-01T00:00:00.000Z",
196
+ "src": "user(0)",
197
+ "uri": "record(1)",
198
+ "val": "self-label-b",
199
+ },
200
+ ],
201
+ "postsCount": 4,
202
+ "verification": Object {
203
+ "trustedVerifierStatus": "valid",
204
+ "verifications": Array [],
205
+ "verifiedStatus": "none",
206
+ },
207
+ "viewer": Object {
208
+ "blockedBy": false,
209
+ "muted": false,
210
+ },
211
+ },
212
+ "issuerRepo": Object {
213
+ "$type": "tools.ozone.moderation.defs#repoViewDetail",
214
+ "did": "user(0)",
215
+ "email": "alice@test.com",
216
+ "handle": "alice.test",
217
+ "indexedAt": "1970-01-01T00:00:00.000Z",
218
+ "invites": Array [],
219
+ "invitesDisabled": false,
220
+ "labels": Array [],
221
+ "moderation": Object {},
222
+ "relatedRecords": Array [
223
+ Object {
224
+ "$type": "app.bsky.actor.profile",
225
+ "avatar": Object {
226
+ "$type": "blob",
227
+ "mimeType": "image/jpeg",
228
+ "ref": Object {
229
+ "$link": "cids(0)",
230
+ },
231
+ "size": 3976,
232
+ },
233
+ "createdAt": "1970-01-01T00:00:00.000Z",
234
+ "description": "its me!",
235
+ "displayName": "ali",
236
+ "labels": Object {
237
+ "$type": "com.atproto.label.defs#selfLabels",
238
+ "values": Array [
239
+ Object {
240
+ "val": "self-label-a",
241
+ },
242
+ Object {
243
+ "val": "self-label-b",
244
+ },
245
+ ],
246
+ },
247
+ },
248
+ ],
249
+ },
250
+ "revokeReason": "Testing",
251
+ "revokedAt": "1970-01-01T00:00:00.000Z",
252
+ "revokedBy": "user(0)",
253
+ "subject": "user(1)",
254
+ "subjectProfile": Object {
255
+ "$type": "app.bsky.actor.defs#profileViewDetailed",
256
+ "associated": Object {
257
+ "feedgens": 0,
258
+ "labeler": false,
259
+ "lists": 0,
260
+ "starterPacks": 0,
261
+ },
262
+ "did": "user(1)",
263
+ "followersCount": 2,
264
+ "followsCount": 1,
265
+ "handle": "carol.test",
266
+ "labels": Array [],
267
+ "postsCount": 2,
268
+ "viewer": Object {
269
+ "blockedBy": false,
270
+ "muted": false,
271
+ },
272
+ },
273
+ "subjectRepo": Object {
274
+ "$type": "tools.ozone.moderation.defs#repoViewDetail",
275
+ "did": "user(1)",
276
+ "email": "carol@test.com",
277
+ "handle": "carol.test",
278
+ "indexedAt": "1970-01-01T00:00:00.000Z",
279
+ "invites": Array [],
280
+ "invitesDisabled": false,
281
+ "labels": Array [],
282
+ "moderation": Object {},
283
+ "relatedRecords": Array [],
284
+ },
285
+ "updatedAt": "1970-01-01T00:00:00.000Z",
286
+ "uri": "record(0)",
287
+ }
288
+ `;
@@ -39,7 +39,12 @@ describe('reporter-stats', () => {
39
39
  }
40
40
 
41
41
  it('updates reporter stats based on actions', async () => {
42
- const bobsPostSubject = {
42
+ const bobsPostSubject1 = {
43
+ $type: 'com.atproto.repo.strongRef',
44
+ uri: sc.posts[sc.dids.bob][0].ref.uriStr,
45
+ cid: sc.posts[sc.dids.bob][0].ref.cidStr,
46
+ }
47
+ const bobsPostSubject2 = {
43
48
  $type: 'com.atproto.repo.strongRef',
44
49
  uri: sc.posts[sc.dids.bob][1].ref.uriStr,
45
50
  cid: sc.posts[sc.dids.bob][1].ref.cidStr,
@@ -54,13 +59,19 @@ describe('reporter-stats', () => {
54
59
  reportedBy: sc.dids.alice,
55
60
  reasonType: ComAtprotoModerationDefs.REASONMISLEADING,
56
61
  reason: 'misleading',
57
- subject: bobsPostSubject,
62
+ subject: bobsPostSubject1,
63
+ }),
64
+ sc.createReport({
65
+ reportedBy: sc.dids.alice,
66
+ reasonType: ComAtprotoModerationDefs.REASONOTHER,
67
+ reason: 'test',
68
+ subject: bobsPostSubject1,
58
69
  }),
59
70
  sc.createReport({
60
71
  reportedBy: sc.dids.alice,
61
72
  reasonType: ComAtprotoModerationDefs.REASONOTHER,
62
73
  reason: 'test',
63
- subject: bobsPostSubject,
74
+ subject: bobsPostSubject2,
64
75
  }),
65
76
  sc.createReport({
66
77
  reportedBy: sc.dids.alice,
@@ -75,9 +86,9 @@ describe('reporter-stats', () => {
75
86
  expect(statsAfterReport).toMatchObject({
76
87
  did: sc.dids.alice,
77
88
  accountReportCount: 1,
78
- recordReportCount: 2,
89
+ recordReportCount: 3,
79
90
  reportedAccountCount: 1,
80
- reportedRecordCount: 1,
91
+ reportedRecordCount: 2,
81
92
  takendownAccountCount: 0,
82
93
  takendownRecordCount: 0,
83
94
  labeledAccountCount: 0,
@@ -86,7 +97,11 @@ describe('reporter-stats', () => {
86
97
 
87
98
  await Promise.all([
88
99
  modClient.performTakedown({
89
- subject: bobsPostSubject,
100
+ subject: bobsPostSubject1,
101
+ policies: ['trolling'],
102
+ }),
103
+ modClient.performTakedown({
104
+ subject: bobsPostSubject2,
90
105
  policies: ['trolling'],
91
106
  }),
92
107
  modClient.emitEvent({
@@ -105,11 +120,11 @@ describe('reporter-stats', () => {
105
120
  expect(statsAfterAction).toMatchObject({
106
121
  did: sc.dids.alice,
107
122
  accountReportCount: 1,
108
- recordReportCount: 2,
123
+ recordReportCount: 3,
109
124
  reportedAccountCount: 1,
110
- reportedRecordCount: 1,
125
+ reportedRecordCount: 2,
111
126
  takendownAccountCount: 0,
112
- takendownRecordCount: 1,
127
+ takendownRecordCount: 2,
113
128
  labeledAccountCount: 1,
114
129
  labeledRecordCount: 0,
115
130
  })
@@ -0,0 +1,102 @@
1
+ import { Sender, WebSocketServer } from 'ws'
2
+ import { AppBskyGraphVerification, AtpAgent } from '@atproto/api'
3
+ import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env'
4
+ import { forSnapshot } from './_util'
5
+
6
+ describe('verification-listener', () => {
7
+ let network: TestNetwork
8
+ let sc: SeedClient
9
+ let adminAgent: AtpAgent
10
+ let jetstream: WebSocketServer
11
+ let relay: Sender
12
+
13
+ beforeAll(async () => {
14
+ const jetstreamPort = 2511
15
+ jetstream = new WebSocketServer({
16
+ port: jetstreamPort,
17
+ })
18
+ jetstream.on('connection', (ws) => {
19
+ relay = ws
20
+ })
21
+ network = await TestNetwork.create({
22
+ dbPostgresSchema: 'ozone_verification_listener_test',
23
+ ozone: {
24
+ verifierUrl: 'http://localhost:2583',
25
+ verifierDid: 'did:example:verifier',
26
+ verifierPassword: 'test',
27
+ jetstreamUrl: `ws://localhost:${jetstreamPort}`,
28
+ },
29
+ })
30
+ sc = network.getSeedClient()
31
+ await basicSeed(sc)
32
+
33
+ adminAgent = network.pds.getClient()
34
+ await adminAgent.login({
35
+ identifier: sc.accounts[sc.dids.alice].handle,
36
+ password: sc.accounts[sc.dids.alice].password,
37
+ })
38
+ await network.ozone.addAdminDid(sc.dids.alice)
39
+
40
+ await network.processAll()
41
+ })
42
+
43
+ afterAll(async () => {
44
+ await jetstream.close()
45
+ await network.close()
46
+ })
47
+
48
+ it('indexes new and revoked verifications', async () => {
49
+ const { verificationListener } = network.ozone.daemon.ctx
50
+ const createEvent = {
51
+ kind: 'commit',
52
+ did: sc.dids.bob,
53
+ time_us: 123456789,
54
+ commit: {
55
+ rev: 'xyz',
56
+ operation: 'create',
57
+ collection: 'app.bsky.graph.verification',
58
+ rkey: 'abcdefg',
59
+ cid: 'xyz',
60
+ record: {
61
+ $type: 'app.bsky.graph.verification',
62
+ subject: sc.dids.alice,
63
+ handle: sc.accounts[sc.dids.alice].handle,
64
+ displayName: 'Alice',
65
+ createdAt: new Date().toISOString(),
66
+ } satisfies AppBskyGraphVerification.Record,
67
+ },
68
+ }
69
+ const deleteEvent = {
70
+ kind: 'commit',
71
+ did: sc.dids.bob,
72
+ time_us: 123456799,
73
+ commit: {
74
+ rev: 'yza',
75
+ operation: 'delete',
76
+ collection: 'app.bsky.graph.verification',
77
+ rkey: 'abcdefg',
78
+ },
79
+ }
80
+ relay.send(JSON.stringify(createEvent))
81
+ relay.send(JSON.stringify(deleteEvent))
82
+ const verificationService = network.ozone.ctx.verificationService(
83
+ network.ozone.ctx.db,
84
+ )
85
+ // Wait for the listener to process the events
86
+ let hasCursorUpdated = false
87
+ let attempt = 0
88
+ do {
89
+ const cursor = await verificationService.getFirehoseCursor()
90
+ hasCursorUpdated = cursor === 123456799
91
+ attempt++
92
+ } while (!hasCursorUpdated && attempt < 20)
93
+ // Give the processor enough time to handle the events
94
+ const {
95
+ data: { verifications },
96
+ } = await adminAgent.tools.ozone.verification.listVerifications({})
97
+ const cursor = await verificationListener?.getCursor()
98
+
99
+ expect(forSnapshot(verifications)).toMatchSnapshot()
100
+ expect(cursor).toEqual(123456799)
101
+ })
102
+ })