@atproto/dev-env 0.0.0-spaces-alpha-20260818163953
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.
- package/CHANGELOG.md +3424 -0
- package/LICENSE.txt +7 -0
- package/README.md +39 -0
- package/bin.js +7 -0
- package/dist/bin-multi-pds.d.ts +2 -0
- package/dist/bin-multi-pds.d.ts.map +1 -0
- package/dist/bin-multi-pds.js +130 -0
- package/dist/bin-multi-pds.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +56 -0
- package/dist/bin.js.map +1 -0
- package/dist/bsky.d.ts +27 -0
- package/dist/bsky.d.ts.map +1 -0
- package/dist/bsky.js +165 -0
- package/dist/bsky.js.map +1 -0
- package/dist/bsync.d.ts +22 -0
- package/dist/bsync.d.ts.map +1 -0
- package/dist/bsync.js +54 -0
- package/dist/bsync.js.map +1 -0
- package/dist/const.d.ts +4 -0
- package/dist/const.d.ts.map +1 -0
- package/dist/const.js +4 -0
- package/dist/const.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +10 -0
- package/dist/env.js.map +1 -0
- package/dist/feed-gen.d.ts +15 -0
- package/dist/feed-gen.d.ts.map +1 -0
- package/dist/feed-gen.js +73 -0
- package/dist/feed-gen.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect.d.ts +22 -0
- package/dist/introspect.d.ts.map +1 -0
- package/dist/introspect.js +65 -0
- package/dist/introspect.js.map +1 -0
- package/dist/mock/data.d.ts +3 -0
- package/dist/mock/data.d.ts.map +1 -0
- package/dist/mock/data.js +46 -0
- package/dist/mock/data.js.map +1 -0
- package/dist/mock/img/blur-hash-avatar-b64.d.ts +3 -0
- package/dist/mock/img/blur-hash-avatar-b64.d.ts.map +1 -0
- package/dist/mock/img/blur-hash-avatar-b64.js +2 -0
- package/dist/mock/img/blur-hash-avatar-b64.js.map +1 -0
- package/dist/mock/img/labeled-img-b64.d.ts +3 -0
- package/dist/mock/img/labeled-img-b64.d.ts.map +1 -0
- package/dist/mock/img/labeled-img-b64.js +2 -0
- package/dist/mock/img/labeled-img-b64.js.map +1 -0
- package/dist/mock/index.d.ts +3 -0
- package/dist/mock/index.d.ts.map +1 -0
- package/dist/mock/index.js +574 -0
- package/dist/mock/index.js.map +1 -0
- package/dist/moderator-client.d.ts +58 -0
- package/dist/moderator-client.d.ts.map +1 -0
- package/dist/moderator-client.js +110 -0
- package/dist/moderator-client.js.map +1 -0
- package/dist/network-no-appview.d.ts +21 -0
- package/dist/network-no-appview.d.ts.map +1 -0
- package/dist/network-no-appview.js +74 -0
- package/dist/network-no-appview.js.map +1 -0
- package/dist/network.d.ts +32 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +190 -0
- package/dist/network.js.map +1 -0
- package/dist/ozone.d.ts +31 -0
- package/dist/ozone.d.ts.map +1 -0
- package/dist/ozone.js +254 -0
- package/dist/ozone.js.map +1 -0
- package/dist/pds.d.ts +23 -0
- package/dist/pds.d.ts.map +1 -0
- package/dist/pds.js +97 -0
- package/dist/pds.js.map +1 -0
- package/dist/plc.d.ts +14 -0
- package/dist/plc.d.ts.map +1 -0
- package/dist/plc.js +28 -0
- package/dist/plc.js.map +1 -0
- package/dist/seed/author-feed.d.ts +4 -0
- package/dist/seed/author-feed.d.ts.map +1 -0
- package/dist/seed/author-feed.js +50 -0
- package/dist/seed/author-feed.js.map +1 -0
- package/dist/seed/basic.d.ts +16 -0
- package/dist/seed/basic.d.ts.map +1 -0
- package/dist/seed/basic.js +113 -0
- package/dist/seed/basic.js.map +1 -0
- package/dist/seed/client.d.ts +151 -0
- package/dist/seed/client.d.ts.map +1 -0
- package/dist/seed/client.js +365 -0
- package/dist/seed/client.js.map +1 -0
- package/dist/seed/follows.d.ts +4 -0
- package/dist/seed/follows.d.ts.map +1 -0
- package/dist/seed/follows.js +55 -0
- package/dist/seed/follows.js.map +1 -0
- package/dist/seed/index.d.ts +11 -0
- package/dist/seed/index.d.ts.map +1 -0
- package/dist/seed/index.js +11 -0
- package/dist/seed/index.js.map +1 -0
- package/dist/seed/likes.d.ts +4 -0
- package/dist/seed/likes.d.ts.map +1 -0
- package/dist/seed/likes.js +37 -0
- package/dist/seed/likes.js.map +1 -0
- package/dist/seed/quotes.d.ts +4 -0
- package/dist/seed/quotes.d.ts.map +1 -0
- package/dist/seed/quotes.js +21 -0
- package/dist/seed/quotes.js.map +1 -0
- package/dist/seed/reposts.d.ts +4 -0
- package/dist/seed/reposts.d.ts.map +1 -0
- package/dist/seed/reposts.js +17 -0
- package/dist/seed/reposts.js.map +1 -0
- package/dist/seed/thread-v2.d.ts +227 -0
- package/dist/seed/thread-v2.d.ts.map +1 -0
- package/dist/seed/thread-v2.js +755 -0
- package/dist/seed/thread-v2.js.map +1 -0
- package/dist/seed/users-bulk.d.ts +3 -0
- package/dist/seed/users-bulk.d.ts.map +1 -0
- package/dist/seed/users-bulk.js +224 -0
- package/dist/seed/users-bulk.js.map +1 -0
- package/dist/seed/users.d.ts +3 -0
- package/dist/seed/users.d.ts.map +1 -0
- package/dist/seed/users.js +45 -0
- package/dist/seed/users.js.map +1 -0
- package/dist/seed/verifications.d.ts +5 -0
- package/dist/seed/verifications.d.ts.map +1 -0
- package/dist/seed/verifications.js +164 -0
- package/dist/seed/verifications.js.map +1 -0
- package/dist/service-profile-lexicon.d.ts +11 -0
- package/dist/service-profile-lexicon.d.ts.map +1 -0
- package/dist/service-profile-lexicon.js +115 -0
- package/dist/service-profile-lexicon.js.map +1 -0
- package/dist/service-profile-ozone.d.ts +18 -0
- package/dist/service-profile-ozone.d.ts.map +1 -0
- package/dist/service-profile-ozone.js +333 -0
- package/dist/service-profile-ozone.js.map +1 -0
- package/dist/service-profile.d.ts +24 -0
- package/dist/service-profile.d.ts.map +1 -0
- package/dist/service-profile.js +61 -0
- package/dist/service-profile.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +14 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +86 -0
- package/dist/util.js.map +1 -0
- package/package.json +69 -0
- package/src/bin-multi-pds.ts +166 -0
- package/src/bin.ts +64 -0
- package/src/bsky.ts +198 -0
- package/src/bsync.ts +66 -0
- package/src/const.ts +3 -0
- package/src/env.ts +9 -0
- package/src/feed-gen.ts +96 -0
- package/src/index.ts +17 -0
- package/src/introspect.ts +91 -0
- package/src/mock/data.ts +46 -0
- package/src/mock/img/blur-hash-avatar-b64.ts +1 -0
- package/src/mock/img/labeled-img-b64.ts +1 -0
- package/src/mock/index.ts +702 -0
- package/src/moderator-client.ts +267 -0
- package/src/network-no-appview.ts +89 -0
- package/src/network.ts +243 -0
- package/src/ozone.ts +287 -0
- package/src/pds.ts +118 -0
- package/src/plc.ts +33 -0
- package/src/seed/author-feed.ts +98 -0
- package/src/seed/basic.ts +189 -0
- package/src/seed/client.ts +676 -0
- package/src/seed/follows.ts +57 -0
- package/src/seed/index.ts +11 -0
- package/src/seed/likes.ts +43 -0
- package/src/seed/quotes.ts +53 -0
- package/src/seed/reposts.ts +18 -0
- package/src/seed/thread-v2.ts +925 -0
- package/src/seed/users-bulk.ts +229 -0
- package/src/seed/users.ts +64 -0
- package/src/seed/verifications.ts +254 -0
- package/src/service-profile-lexicon.ts +127 -0
- package/src/service-profile-ozone.ts +375 -0
- package/src/service-profile.ts +95 -0
- package/src/types.ts +68 -0
- package/src/util.ts +118 -0
- package/tsconfig.build.json +25 -0
- package/tsconfig.json +4 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { Secp256k1Keypair } from '@atproto/crypto';
|
|
2
|
+
import { ServiceProfile, } from './service-profile.js';
|
|
3
|
+
export class OzoneServiceProfile extends ServiceProfile {
|
|
4
|
+
static async create(pds, ozoneUrl, userDetails = {
|
|
5
|
+
email: 'mod-authority@test.com',
|
|
6
|
+
handle: 'mod-authority.test',
|
|
7
|
+
password: 'hunter2',
|
|
8
|
+
}) {
|
|
9
|
+
const agent = pds.getAgent();
|
|
10
|
+
await agent.createAccount(userDetails);
|
|
11
|
+
const key = await Secp256k1Keypair.create({ exportable: true });
|
|
12
|
+
return new OzoneServiceProfile(pds, agent, userDetails, ozoneUrl, key);
|
|
13
|
+
}
|
|
14
|
+
constructor(pds, agent, userDetails, ozoneUrl, key) {
|
|
15
|
+
super(pds, agent, userDetails);
|
|
16
|
+
this.ozoneUrl = ozoneUrl;
|
|
17
|
+
this.key = key;
|
|
18
|
+
}
|
|
19
|
+
async createAppPasswordForVerification() {
|
|
20
|
+
const { data } = await this.agent.com.atproto.server.createAppPassword({
|
|
21
|
+
name: 'ozone-verifier',
|
|
22
|
+
});
|
|
23
|
+
return data.password;
|
|
24
|
+
}
|
|
25
|
+
async migrateTo(pds, options = {}) {
|
|
26
|
+
await super.migrateTo(pds, {
|
|
27
|
+
...options,
|
|
28
|
+
services: {
|
|
29
|
+
...options.services,
|
|
30
|
+
atproto_labeler: {
|
|
31
|
+
type: 'AtprotoLabeler',
|
|
32
|
+
endpoint: this.ozoneUrl,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
verificationMethods: {
|
|
36
|
+
...options.verificationMethods,
|
|
37
|
+
atproto_label: this.key.did(),
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async createRecords() {
|
|
42
|
+
await this.agent.app.bsky.actor.profile.create({ repo: this.did }, {
|
|
43
|
+
displayName: 'Dev-env Moderation',
|
|
44
|
+
description: `The pretend version of mod.bsky.app`,
|
|
45
|
+
});
|
|
46
|
+
await this.agent.app.bsky.labeler.service.create({ repo: this.did, rkey: 'self' }, {
|
|
47
|
+
policies: {
|
|
48
|
+
labelValues: [
|
|
49
|
+
'!hide',
|
|
50
|
+
'!warn',
|
|
51
|
+
'porn',
|
|
52
|
+
'sexual',
|
|
53
|
+
'nudity',
|
|
54
|
+
'sexual-figurative',
|
|
55
|
+
'graphic-media',
|
|
56
|
+
'self-harm',
|
|
57
|
+
'sensitive',
|
|
58
|
+
'extremist',
|
|
59
|
+
'intolerant',
|
|
60
|
+
'threat',
|
|
61
|
+
'rude',
|
|
62
|
+
'illicit',
|
|
63
|
+
'security',
|
|
64
|
+
'unsafe-link',
|
|
65
|
+
'impersonation',
|
|
66
|
+
'misinformation',
|
|
67
|
+
'scam',
|
|
68
|
+
'engagement-farming',
|
|
69
|
+
'spam',
|
|
70
|
+
'rumor',
|
|
71
|
+
'misleading',
|
|
72
|
+
'inauthentic',
|
|
73
|
+
],
|
|
74
|
+
labelValueDefinitions: [
|
|
75
|
+
{
|
|
76
|
+
identifier: 'spam',
|
|
77
|
+
blurs: 'content',
|
|
78
|
+
severity: 'inform',
|
|
79
|
+
defaultSetting: 'hide',
|
|
80
|
+
adultOnly: false,
|
|
81
|
+
locales: [
|
|
82
|
+
{
|
|
83
|
+
lang: 'en',
|
|
84
|
+
name: 'Spam',
|
|
85
|
+
description: 'Unwanted, repeated, or unrelated actions that bother users.',
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
identifier: 'impersonation',
|
|
91
|
+
blurs: 'none',
|
|
92
|
+
severity: 'inform',
|
|
93
|
+
defaultSetting: 'hide',
|
|
94
|
+
adultOnly: false,
|
|
95
|
+
locales: [
|
|
96
|
+
{
|
|
97
|
+
lang: 'en',
|
|
98
|
+
name: 'Impersonation',
|
|
99
|
+
description: 'Pretending to be someone else without permission.',
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
identifier: 'scam',
|
|
105
|
+
blurs: 'content',
|
|
106
|
+
severity: 'alert',
|
|
107
|
+
defaultSetting: 'hide',
|
|
108
|
+
adultOnly: false,
|
|
109
|
+
locales: [
|
|
110
|
+
{
|
|
111
|
+
lang: 'en',
|
|
112
|
+
name: 'Scam',
|
|
113
|
+
description: 'Scams, phishing & fraud.',
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
identifier: 'intolerant',
|
|
119
|
+
blurs: 'content',
|
|
120
|
+
severity: 'alert',
|
|
121
|
+
defaultSetting: 'warn',
|
|
122
|
+
adultOnly: false,
|
|
123
|
+
locales: [
|
|
124
|
+
{
|
|
125
|
+
lang: 'en',
|
|
126
|
+
name: 'Intolerance',
|
|
127
|
+
description: 'Discrimination against protected groups.',
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
identifier: 'self-harm',
|
|
133
|
+
blurs: 'content',
|
|
134
|
+
severity: 'alert',
|
|
135
|
+
defaultSetting: 'warn',
|
|
136
|
+
adultOnly: false,
|
|
137
|
+
locales: [
|
|
138
|
+
{
|
|
139
|
+
lang: 'en',
|
|
140
|
+
name: 'Self-Harm',
|
|
141
|
+
description: 'Promotes self-harm, including graphic images, glorifying discussions, or triggering stories.',
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
identifier: 'security',
|
|
147
|
+
blurs: 'content',
|
|
148
|
+
severity: 'alert',
|
|
149
|
+
defaultSetting: 'hide',
|
|
150
|
+
adultOnly: false,
|
|
151
|
+
locales: [
|
|
152
|
+
{
|
|
153
|
+
lang: 'en',
|
|
154
|
+
name: 'Security Concerns',
|
|
155
|
+
description: 'May be unsafe and could harm your device, steal your info, or get your account hacked.',
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
identifier: 'misleading',
|
|
161
|
+
blurs: 'content',
|
|
162
|
+
severity: 'alert',
|
|
163
|
+
defaultSetting: 'warn',
|
|
164
|
+
adultOnly: false,
|
|
165
|
+
locales: [
|
|
166
|
+
{
|
|
167
|
+
lang: 'en',
|
|
168
|
+
name: 'Misleading',
|
|
169
|
+
description: 'Altered images/videos, deceptive links, or false statements.',
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
identifier: 'threat',
|
|
175
|
+
blurs: 'content',
|
|
176
|
+
severity: 'inform',
|
|
177
|
+
defaultSetting: 'hide',
|
|
178
|
+
adultOnly: false,
|
|
179
|
+
locales: [
|
|
180
|
+
{
|
|
181
|
+
lang: 'en',
|
|
182
|
+
name: 'Threats',
|
|
183
|
+
description: 'Promotes violence or harm towards others, including threats, incitement, or advocacy of harm.',
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
identifier: 'unsafe-link',
|
|
189
|
+
blurs: 'content',
|
|
190
|
+
severity: 'alert',
|
|
191
|
+
defaultSetting: 'hide',
|
|
192
|
+
adultOnly: false,
|
|
193
|
+
locales: [
|
|
194
|
+
{
|
|
195
|
+
lang: 'en',
|
|
196
|
+
name: 'Unsafe link',
|
|
197
|
+
description: 'Links to harmful sites with malware, phishing, or violating content that risk security and privacy.',
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
identifier: 'illicit',
|
|
203
|
+
blurs: 'content',
|
|
204
|
+
severity: 'alert',
|
|
205
|
+
defaultSetting: 'hide',
|
|
206
|
+
adultOnly: false,
|
|
207
|
+
locales: [
|
|
208
|
+
{
|
|
209
|
+
lang: 'en',
|
|
210
|
+
name: 'Illicit',
|
|
211
|
+
description: 'Promoting or selling potentially illicit goods, services, or activities.',
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
identifier: 'misinformation',
|
|
217
|
+
blurs: 'content',
|
|
218
|
+
severity: 'inform',
|
|
219
|
+
defaultSetting: 'warn',
|
|
220
|
+
adultOnly: false,
|
|
221
|
+
locales: [
|
|
222
|
+
{
|
|
223
|
+
lang: 'en',
|
|
224
|
+
name: 'Misinformation',
|
|
225
|
+
description: 'Spreading false or misleading info, including unverified claims and harmful conspiracy theories.',
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
identifier: 'rumor',
|
|
231
|
+
blurs: 'content',
|
|
232
|
+
severity: 'inform',
|
|
233
|
+
defaultSetting: 'warn',
|
|
234
|
+
adultOnly: false,
|
|
235
|
+
locales: [
|
|
236
|
+
{
|
|
237
|
+
lang: 'en',
|
|
238
|
+
name: 'Rumor',
|
|
239
|
+
description: 'Approach with caution, as these claims lack evidence from credible sources.',
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
identifier: 'rude',
|
|
245
|
+
blurs: 'content',
|
|
246
|
+
severity: 'inform',
|
|
247
|
+
defaultSetting: 'hide',
|
|
248
|
+
adultOnly: false,
|
|
249
|
+
locales: [
|
|
250
|
+
{
|
|
251
|
+
lang: 'en',
|
|
252
|
+
name: 'Rude',
|
|
253
|
+
description: 'Rude or impolite, including crude language and disrespectful comments, without constructive purpose.',
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
identifier: 'extremist',
|
|
259
|
+
blurs: 'content',
|
|
260
|
+
severity: 'alert',
|
|
261
|
+
defaultSetting: 'hide',
|
|
262
|
+
adultOnly: false,
|
|
263
|
+
locales: [
|
|
264
|
+
{
|
|
265
|
+
lang: 'en',
|
|
266
|
+
name: 'Extremist',
|
|
267
|
+
description: 'Radical views advocating violence, hate, or discrimination against individuals or groups.',
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
identifier: 'sensitive',
|
|
273
|
+
blurs: 'content',
|
|
274
|
+
severity: 'alert',
|
|
275
|
+
defaultSetting: 'warn',
|
|
276
|
+
adultOnly: false,
|
|
277
|
+
locales: [
|
|
278
|
+
{
|
|
279
|
+
lang: 'en',
|
|
280
|
+
name: 'Sensitive',
|
|
281
|
+
description: 'May be upsetting, covering topics like substance abuse or mental health issues, cautioning sensitive viewers.',
|
|
282
|
+
},
|
|
283
|
+
],
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
identifier: 'engagement-farming',
|
|
287
|
+
blurs: 'content',
|
|
288
|
+
severity: 'alert',
|
|
289
|
+
defaultSetting: 'hide',
|
|
290
|
+
adultOnly: false,
|
|
291
|
+
locales: [
|
|
292
|
+
{
|
|
293
|
+
lang: 'en',
|
|
294
|
+
name: 'Engagement Farming',
|
|
295
|
+
description: 'Insincere content or bulk actions aimed at gaining followers, including frequent follows, posts, and likes.',
|
|
296
|
+
},
|
|
297
|
+
],
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
identifier: 'inauthentic',
|
|
301
|
+
blurs: 'content',
|
|
302
|
+
severity: 'alert',
|
|
303
|
+
defaultSetting: 'hide',
|
|
304
|
+
adultOnly: false,
|
|
305
|
+
locales: [
|
|
306
|
+
{
|
|
307
|
+
lang: 'en',
|
|
308
|
+
name: 'Inauthentic Account',
|
|
309
|
+
description: 'Bot or a person pretending to be someone else.',
|
|
310
|
+
},
|
|
311
|
+
],
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
identifier: 'sexual-figurative',
|
|
315
|
+
blurs: 'media',
|
|
316
|
+
severity: 'none',
|
|
317
|
+
defaultSetting: 'show',
|
|
318
|
+
adultOnly: true,
|
|
319
|
+
locales: [
|
|
320
|
+
{
|
|
321
|
+
lang: 'en',
|
|
322
|
+
name: 'Sexually Suggestive (Cartoon)',
|
|
323
|
+
description: 'Art with explicit or suggestive sexual themes, including provocative imagery or partial nudity.',
|
|
324
|
+
},
|
|
325
|
+
],
|
|
326
|
+
},
|
|
327
|
+
],
|
|
328
|
+
},
|
|
329
|
+
createdAt: new Date().toISOString(),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=service-profile-ozone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-profile-ozone.js","sourceRoot":"","sources":["../src/service-profile-ozone.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AtpAgent } from '@atproto/api'\nimport { Secp256k1Keypair } from '@atproto/crypto'\nimport type { TestPds } from './pds.js'\nimport {\n type ServiceMigrationOptions,\n ServiceProfile,\n type ServiceUserDetails,\n} from './service-profile.js'\n\nexport class OzoneServiceProfile extends ServiceProfile {\n static async create(\n pds: TestPds,\n ozoneUrl: string,\n userDetails = {\n email: 'mod-authority@test.com',\n handle: 'mod-authority.test',\n password: 'hunter2',\n },\n ) {\n const agent = pds.getAgent()\n await agent.createAccount(userDetails)\n\n const key = await Secp256k1Keypair.create({ exportable: true })\n\n return new OzoneServiceProfile(pds, agent, userDetails, ozoneUrl, key)\n }\n\n protected constructor(\n pds: TestPds,\n agent: AtpAgent,\n userDetails: ServiceUserDetails,\n readonly ozoneUrl: string,\n readonly key: Secp256k1Keypair,\n ) {\n super(pds, agent, userDetails)\n }\n\n async createAppPasswordForVerification() {\n const { data } = await this.agent.com.atproto.server.createAppPassword({\n name: 'ozone-verifier',\n })\n return data.password\n }\n\n async migrateTo(pds: TestPds, options: ServiceMigrationOptions = {}) {\n await super.migrateTo(pds, {\n ...options,\n services: {\n ...options.services,\n atproto_labeler: {\n type: 'AtprotoLabeler',\n endpoint: this.ozoneUrl,\n },\n },\n verificationMethods: {\n ...options.verificationMethods,\n atproto_label: this.key.did(),\n },\n })\n }\n\n async createRecords() {\n await this.agent.app.bsky.actor.profile.create(\n { repo: this.did },\n {\n displayName: 'Dev-env Moderation',\n description: `The pretend version of mod.bsky.app`,\n },\n )\n\n await this.agent.app.bsky.labeler.service.create(\n { repo: this.did, rkey: 'self' },\n {\n policies: {\n labelValues: [\n '!hide',\n '!warn',\n 'porn',\n 'sexual',\n 'nudity',\n 'sexual-figurative',\n 'graphic-media',\n 'self-harm',\n 'sensitive',\n 'extremist',\n 'intolerant',\n 'threat',\n 'rude',\n 'illicit',\n 'security',\n 'unsafe-link',\n 'impersonation',\n 'misinformation',\n 'scam',\n 'engagement-farming',\n 'spam',\n 'rumor',\n 'misleading',\n 'inauthentic',\n ],\n labelValueDefinitions: [\n {\n identifier: 'spam',\n blurs: 'content',\n severity: 'inform',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Spam',\n description:\n 'Unwanted, repeated, or unrelated actions that bother users.',\n },\n ],\n },\n {\n identifier: 'impersonation',\n blurs: 'none',\n severity: 'inform',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Impersonation',\n description:\n 'Pretending to be someone else without permission.',\n },\n ],\n },\n {\n identifier: 'scam',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Scam',\n description: 'Scams, phishing & fraud.',\n },\n ],\n },\n {\n identifier: 'intolerant',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'warn',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Intolerance',\n description: 'Discrimination against protected groups.',\n },\n ],\n },\n {\n identifier: 'self-harm',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'warn',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Self-Harm',\n description:\n 'Promotes self-harm, including graphic images, glorifying discussions, or triggering stories.',\n },\n ],\n },\n {\n identifier: 'security',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Security Concerns',\n description:\n 'May be unsafe and could harm your device, steal your info, or get your account hacked.',\n },\n ],\n },\n {\n identifier: 'misleading',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'warn',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Misleading',\n description:\n 'Altered images/videos, deceptive links, or false statements.',\n },\n ],\n },\n {\n identifier: 'threat',\n blurs: 'content',\n severity: 'inform',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Threats',\n description:\n 'Promotes violence or harm towards others, including threats, incitement, or advocacy of harm.',\n },\n ],\n },\n {\n identifier: 'unsafe-link',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Unsafe link',\n description:\n 'Links to harmful sites with malware, phishing, or violating content that risk security and privacy.',\n },\n ],\n },\n {\n identifier: 'illicit',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Illicit',\n description:\n 'Promoting or selling potentially illicit goods, services, or activities.',\n },\n ],\n },\n {\n identifier: 'misinformation',\n blurs: 'content',\n severity: 'inform',\n defaultSetting: 'warn',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Misinformation',\n description:\n 'Spreading false or misleading info, including unverified claims and harmful conspiracy theories.',\n },\n ],\n },\n {\n identifier: 'rumor',\n blurs: 'content',\n severity: 'inform',\n defaultSetting: 'warn',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Rumor',\n description:\n 'Approach with caution, as these claims lack evidence from credible sources.',\n },\n ],\n },\n {\n identifier: 'rude',\n blurs: 'content',\n severity: 'inform',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Rude',\n description:\n 'Rude or impolite, including crude language and disrespectful comments, without constructive purpose.',\n },\n ],\n },\n {\n identifier: 'extremist',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Extremist',\n description:\n 'Radical views advocating violence, hate, or discrimination against individuals or groups.',\n },\n ],\n },\n {\n identifier: 'sensitive',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'warn',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Sensitive',\n description:\n 'May be upsetting, covering topics like substance abuse or mental health issues, cautioning sensitive viewers.',\n },\n ],\n },\n {\n identifier: 'engagement-farming',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Engagement Farming',\n description:\n 'Insincere content or bulk actions aimed at gaining followers, including frequent follows, posts, and likes.',\n },\n ],\n },\n {\n identifier: 'inauthentic',\n blurs: 'content',\n severity: 'alert',\n defaultSetting: 'hide',\n adultOnly: false,\n locales: [\n {\n lang: 'en',\n name: 'Inauthentic Account',\n description: 'Bot or a person pretending to be someone else.',\n },\n ],\n },\n {\n identifier: 'sexual-figurative',\n blurs: 'media',\n severity: 'none',\n defaultSetting: 'show',\n adultOnly: true,\n locales: [\n {\n lang: 'en',\n name: 'Sexually Suggestive (Cartoon)',\n description:\n 'Art with explicit or suggestive sexual themes, including provocative imagery or partial nudity.',\n },\n ],\n },\n ],\n },\n createdAt: new Date().toISOString(),\n },\n )\n }\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AtpAgent } from '@atproto/api';
|
|
2
|
+
import type { DidString } from '@atproto/lex';
|
|
3
|
+
import type { TestPds } from './pds.js';
|
|
4
|
+
export type ServiceUserDetails = {
|
|
5
|
+
email: string;
|
|
6
|
+
handle: string;
|
|
7
|
+
password: string;
|
|
8
|
+
};
|
|
9
|
+
export type ServiceMigrationOptions = {
|
|
10
|
+
services?: Record<string, unknown>;
|
|
11
|
+
verificationMethods?: Record<string, unknown>;
|
|
12
|
+
};
|
|
13
|
+
export declare class ServiceProfile {
|
|
14
|
+
protected pds: TestPds;
|
|
15
|
+
/** @note assumes the session is already authenticated */
|
|
16
|
+
protected agent: AtpAgent;
|
|
17
|
+
protected userDetails: ServiceUserDetails;
|
|
18
|
+
protected constructor(pds: TestPds,
|
|
19
|
+
/** @note assumes the session is already authenticated */
|
|
20
|
+
agent: AtpAgent, userDetails: ServiceUserDetails);
|
|
21
|
+
get did(): DidString;
|
|
22
|
+
migrateTo(newPds: TestPds, options?: ServiceMigrationOptions): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=service-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-profile.d.ts","sourceRoot":"","sources":["../src/service-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAEvC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9C,CAAA;AAED,qBAAa,cAAc;IAEvB,SAAS,CAAC,GAAG,EAAE,OAAO;IACtB,yDAAyD;IACzD,SAAS,CAAC,KAAK,EAAE,QAAQ;IACzB,SAAS,CAAC,WAAW,EAAE,kBAAkB;IAJ3C,SAAS,aACG,GAAG,EAAE,OAAO;IACtB,yDAAyD;IAC/C,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,kBAAkB,EACvC;IAEJ,IAAI,GAAG,IAAI,SAAS,CAEnB;IAEK,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,GAAE,uBAA4B,iBAkErE;CACF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class ServiceProfile {
|
|
2
|
+
constructor(pds,
|
|
3
|
+
/** @note assumes the session is already authenticated */
|
|
4
|
+
agent, userDetails) {
|
|
5
|
+
this.pds = pds;
|
|
6
|
+
this.agent = agent;
|
|
7
|
+
this.userDetails = userDetails;
|
|
8
|
+
}
|
|
9
|
+
get did() {
|
|
10
|
+
return this.agent.assertDid;
|
|
11
|
+
}
|
|
12
|
+
async migrateTo(newPds, options = {}) {
|
|
13
|
+
const newAgent = newPds.getAgent();
|
|
14
|
+
const newPdsDesc = await newAgent.com.atproto.server.describeServer();
|
|
15
|
+
const serviceAuth = await this.agent.com.atproto.server.getServiceAuth({
|
|
16
|
+
aud: newPdsDesc.data.did,
|
|
17
|
+
lxm: 'com.atproto.server.createAccount',
|
|
18
|
+
});
|
|
19
|
+
const inviteCode = newPds.ctx.cfg.invites.required
|
|
20
|
+
? await newAgent.com.atproto.server
|
|
21
|
+
.createInviteCode({ useCount: 1 }, {
|
|
22
|
+
encoding: 'application/json',
|
|
23
|
+
headers: newPds.adminAuthHeaders(),
|
|
24
|
+
})
|
|
25
|
+
.then((res) => res.data.code)
|
|
26
|
+
: undefined;
|
|
27
|
+
await newAgent.createAccount({
|
|
28
|
+
...this.userDetails,
|
|
29
|
+
inviteCode,
|
|
30
|
+
did: this.did,
|
|
31
|
+
}, {
|
|
32
|
+
encoding: 'application/json',
|
|
33
|
+
headers: { authorization: `Bearer ${serviceAuth.data.token}` },
|
|
34
|
+
});
|
|
35
|
+
// The session manager will use the "didDoc" in the result of
|
|
36
|
+
// "createAccount" in order to setup the pdsUrl. However, since are in the
|
|
37
|
+
// process of migrating, that didDoc references the old PDS. In order to
|
|
38
|
+
// avoid calling the old PDS, let's clear the pdsUrl, which will result in
|
|
39
|
+
// the (new) serviceUrl being used.
|
|
40
|
+
newAgent.sessionManager.pdsUrl = undefined;
|
|
41
|
+
const newDidCredentialsRes = await newAgent.com.atproto.identity.getRecommendedDidCredentials();
|
|
42
|
+
await this.agent.com.atproto.identity.requestPlcOperationSignature();
|
|
43
|
+
const { token } = await this.pds.ctx.accountManager.db.db
|
|
44
|
+
.selectFrom('email_token')
|
|
45
|
+
.select('token')
|
|
46
|
+
.where('did', '=', this.did)
|
|
47
|
+
.where('purpose', '=', 'plc_operation')
|
|
48
|
+
.executeTakeFirstOrThrow();
|
|
49
|
+
const op = { ...newDidCredentialsRes.data, token };
|
|
50
|
+
Object.assign((op.services ??= {}), options.services);
|
|
51
|
+
Object.assign((op.verificationMethods ??= {}), options.verificationMethods);
|
|
52
|
+
const signedPlcOperation = await this.agent.com.atproto.identity.signPlcOperation(op);
|
|
53
|
+
await newAgent.com.atproto.identity.submitPlcOperation({
|
|
54
|
+
operation: signedPlcOperation.data.operation,
|
|
55
|
+
});
|
|
56
|
+
await newAgent.com.atproto.server.activateAccount();
|
|
57
|
+
this.pds = newPds;
|
|
58
|
+
this.agent = newAgent;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=service-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-profile.js","sourceRoot":"","sources":["../src/service-profile.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AtpAgent } from '@atproto/api'\nimport type { DidString } from '@atproto/lex'\nimport type { TestPds } from './pds.js'\n\nexport type ServiceUserDetails = {\n email: string\n handle: string\n password: string\n}\n\nexport type ServiceMigrationOptions = {\n services?: Record<string, unknown>\n verificationMethods?: Record<string, unknown>\n}\n\nexport class ServiceProfile {\n protected constructor(\n protected pds: TestPds,\n /** @note assumes the session is already authenticated */\n protected agent: AtpAgent,\n protected userDetails: ServiceUserDetails,\n ) {}\n\n get did(): DidString {\n return this.agent.assertDid\n }\n\n async migrateTo(newPds: TestPds, options: ServiceMigrationOptions = {}) {\n const newAgent = newPds.getAgent()\n\n const newPdsDesc = await newAgent.com.atproto.server.describeServer()\n const serviceAuth = await this.agent.com.atproto.server.getServiceAuth({\n aud: newPdsDesc.data.did,\n lxm: 'com.atproto.server.createAccount',\n })\n\n const inviteCode = newPds.ctx.cfg.invites.required\n ? await newAgent.com.atproto.server\n .createInviteCode(\n { useCount: 1 },\n {\n encoding: 'application/json',\n headers: newPds.adminAuthHeaders(),\n },\n )\n .then((res) => res.data.code)\n : undefined\n\n await newAgent.createAccount(\n {\n ...this.userDetails,\n inviteCode,\n did: this.did,\n },\n {\n encoding: 'application/json',\n headers: { authorization: `Bearer ${serviceAuth.data.token}` },\n },\n )\n\n // The session manager will use the \"didDoc\" in the result of\n // \"createAccount\" in order to setup the pdsUrl. However, since are in the\n // process of migrating, that didDoc references the old PDS. In order to\n // avoid calling the old PDS, let's clear the pdsUrl, which will result in\n // the (new) serviceUrl being used.\n newAgent.sessionManager.pdsUrl = undefined\n\n const newDidCredentialsRes =\n await newAgent.com.atproto.identity.getRecommendedDidCredentials()\n\n await this.agent.com.atproto.identity.requestPlcOperationSignature()\n const { token } = await this.pds.ctx.accountManager.db.db\n .selectFrom('email_token')\n .select('token')\n .where('did', '=', this.did)\n .where('purpose', '=', 'plc_operation')\n .executeTakeFirstOrThrow()\n\n const op = { ...newDidCredentialsRes.data, token }\n Object.assign((op.services ??= {}), options.services)\n Object.assign((op.verificationMethods ??= {}), options.verificationMethods)\n\n const signedPlcOperation =\n await this.agent.com.atproto.identity.signPlcOperation(op)\n\n await newAgent.com.atproto.identity.submitPlcOperation({\n operation: signedPlcOperation.data.operation,\n })\n\n await newAgent.com.atproto.server.activateAccount()\n\n this.pds = newPds\n this.agent = newAgent\n }\n}\n"]}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type * as bsky from '@atproto/bsky';
|
|
2
|
+
import type * as bsync from '@atproto/bsync';
|
|
3
|
+
import type { ExportableKeypair, Keypair } from '@atproto/crypto';
|
|
4
|
+
import type * as ozone from '@atproto/ozone';
|
|
5
|
+
import type * as pds from '@atproto/pds';
|
|
6
|
+
export type IntrospectConfig = {
|
|
7
|
+
port?: number;
|
|
8
|
+
};
|
|
9
|
+
export type PlcConfig = {
|
|
10
|
+
port?: number;
|
|
11
|
+
version?: string;
|
|
12
|
+
};
|
|
13
|
+
export type PdsConfig = Partial<pds.ServerEnvironment> & {
|
|
14
|
+
didPlcUrl: string;
|
|
15
|
+
migration?: string;
|
|
16
|
+
};
|
|
17
|
+
export type BskyConfig = Partial<bsky.ServerConfig> & {
|
|
18
|
+
bsyncUrl: string;
|
|
19
|
+
plcUrl: string;
|
|
20
|
+
repoProvider: string;
|
|
21
|
+
dbPostgresUrl: string;
|
|
22
|
+
dbPostgresSchema: string;
|
|
23
|
+
redisHost: string;
|
|
24
|
+
pdsPort: number;
|
|
25
|
+
migration?: string;
|
|
26
|
+
privateKey?: string;
|
|
27
|
+
};
|
|
28
|
+
export type BsyncConfig = Partial<bsync.ServerEnvironment> & {
|
|
29
|
+
dbUrl: string;
|
|
30
|
+
};
|
|
31
|
+
export type OzoneConfig = Partial<ozone.OzoneEnvironment> & {
|
|
32
|
+
plcUrl: string;
|
|
33
|
+
appviewUrl: string;
|
|
34
|
+
appviewDid: string;
|
|
35
|
+
dbPostgresUrl: string;
|
|
36
|
+
migration?: string;
|
|
37
|
+
signingKey?: ExportableKeypair;
|
|
38
|
+
imgInvalidator?: ozone.ImageInvalidator;
|
|
39
|
+
};
|
|
40
|
+
export type TestServerParams = {
|
|
41
|
+
dbPostgresUrl: string;
|
|
42
|
+
dbPostgresSchema: string;
|
|
43
|
+
pds: Partial<PdsConfig>;
|
|
44
|
+
plc: Partial<PlcConfig>;
|
|
45
|
+
bsky: Partial<BskyConfig>;
|
|
46
|
+
ozone: Partial<OzoneConfig>;
|
|
47
|
+
introspect: Partial<IntrospectConfig>;
|
|
48
|
+
extraPdses: number;
|
|
49
|
+
/**
|
|
50
|
+
* Create a lexicon-authority account and point every PDS at it, so lexicon
|
|
51
|
+
* documents (permission sets, `space` declarations) resolve. Opt-in: it costs
|
|
52
|
+
* an account creation plus a record write per document, which most tests don't
|
|
53
|
+
* need. `TestNetwork` always does this.
|
|
54
|
+
*/
|
|
55
|
+
lexiconAuthority: boolean;
|
|
56
|
+
};
|
|
57
|
+
export type DidAndKey = {
|
|
58
|
+
did: string;
|
|
59
|
+
key: Keypair;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,eAAe,CAAA;AAC1C,OAAO,KAAK,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,KAAK,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAA;AAExC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG;IACvD,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG;IAC3D,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG;IAC1D,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,cAAc,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACvB,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACvB,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;IACzB,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC3B,UAAU,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,gBAAgB,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,OAAO,CAAA;CACb,CAAA"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as bsky from '@atproto/bsky'\nimport type * as bsync from '@atproto/bsync'\nimport type { ExportableKeypair, Keypair } from '@atproto/crypto'\nimport type * as ozone from '@atproto/ozone'\nimport type * as pds from '@atproto/pds'\n\nexport type IntrospectConfig = {\n port?: number\n}\n\nexport type PlcConfig = {\n port?: number\n version?: string\n}\n\nexport type PdsConfig = Partial<pds.ServerEnvironment> & {\n didPlcUrl: string\n migration?: string\n}\n\nexport type BskyConfig = Partial<bsky.ServerConfig> & {\n bsyncUrl: string\n plcUrl: string\n repoProvider: string\n dbPostgresUrl: string\n dbPostgresSchema: string\n redisHost: string\n pdsPort: number\n migration?: string\n privateKey?: string\n}\n\nexport type BsyncConfig = Partial<bsync.ServerEnvironment> & {\n dbUrl: string\n}\n\nexport type OzoneConfig = Partial<ozone.OzoneEnvironment> & {\n plcUrl: string\n appviewUrl: string\n appviewDid: string\n dbPostgresUrl: string\n migration?: string\n signingKey?: ExportableKeypair\n imgInvalidator?: ozone.ImageInvalidator\n}\n\nexport type TestServerParams = {\n dbPostgresUrl: string\n dbPostgresSchema: string\n pds: Partial<PdsConfig>\n plc: Partial<PlcConfig>\n bsky: Partial<BskyConfig>\n ozone: Partial<OzoneConfig>\n introspect: Partial<IntrospectConfig>\n extraPdses: number\n /**\n * Create a lexicon-authority account and point every PDS at it, so lexicon\n * documents (permission sets, `space` declarations) resolve. Opt-in: it costs\n * an account creation plus a record write per document, which most tests don't\n * need. `TestNetwork` always does this.\n */\n lexiconAuthority: boolean\n}\n\nexport type DidAndKey = {\n did: string\n key: Keypair\n}\n"]}
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IdResolver } from '@atproto/identity';
|
|
2
|
+
import type { TestBsky } from './bsky.js';
|
|
3
|
+
import type { TestPds } from './pds.js';
|
|
4
|
+
import type { DidAndKey } from './types.js';
|
|
5
|
+
export declare const mockNetworkUtilities: (pds: TestPds | TestPds[], bsky?: TestBsky) => void;
|
|
6
|
+
export declare const mockResolvers: (idResolver: IdResolver, pds: TestPds | TestPds[], handleResolveUrl?: string) => void;
|
|
7
|
+
export declare const mockMailer: (pds: TestPds) => void;
|
|
8
|
+
export declare const uniqueLockId: () => number;
|
|
9
|
+
export declare const createDidAndKey: (opts: {
|
|
10
|
+
plcUrl: string;
|
|
11
|
+
handle: string;
|
|
12
|
+
pds: string;
|
|
13
|
+
}) => Promise<DidAndKey>;
|
|
14
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,eAAO,MAAM,oBAAoB,QAC1B,OAAO,GAAG,OAAO,EAAE,SACjB,QAAQ,SAUhB,CAAA;AAED,eAAO,MAAM,aAAa,eACZ,UAAU,OACjB,OAAO,GAAG,OAAO,EAAE,qBAGL,MAAM,SAkD1B,CAAA;AAED,eAAO,MAAM,UAAU,QAAS,OAAO,SAQtC,CAAA;AAGD,eAAO,MAAM,YAAY,cAOxB,CAAA;AAED,eAAO,MAAM,eAAe,SAAgB;IAC1C,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;CACZ,KAAG,OAAO,CAAC,SAAS,CAcpB,CAAA"}
|