@atproto/api 0.0.8 → 0.1.0
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/README.md +44 -6
- package/dist/agent.d.ts +22 -0
- package/dist/client/index.d.ts +60 -61
- package/dist/client/lexicons.d.ts +136 -22
- package/dist/client/types/app/bsky/actor/getSuggestions.d.ts +0 -7
- package/dist/client/types/com/atproto/admin/blob.d.ts +37 -0
- package/dist/client/types/com/atproto/admin/moderationAction.d.ts +13 -2
- package/dist/client/types/com/atproto/admin/record.d.ts +5 -2
- package/dist/client/types/com/atproto/admin/repo.d.ts +2 -2
- package/dist/client/types/com/atproto/admin/takeModerationAction.d.ts +5 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +425 -196
- package/dist/index.js.map +4 -4
- package/dist/types.d.ts +33 -0
- package/package.json +1 -1
- package/src/agent.ts +305 -0
- package/src/client/index.ts +62 -63
- package/src/client/lexicons.ts +169 -36
- package/src/client/types/app/bsky/actor/getSuggestions.ts +0 -18
- package/src/client/types/com/atproto/admin/blob.ts +84 -0
- package/src/client/types/com/atproto/admin/moderationAction.ts +29 -10
- package/src/client/types/com/atproto/admin/record.ts +5 -2
- package/src/client/types/com/atproto/admin/repo.ts +2 -2
- package/src/client/types/com/atproto/admin/takeModerationAction.ts +8 -0
- package/src/index.ts +3 -3
- package/src/types.ts +71 -0
- package/tests/_util.ts +26 -0
- package/tests/agent.test.ts +391 -0
- package/tests/errors.test.ts +4 -8
- package/tsconfig.build.tsbuildinfo +1 -1
- package/src/session.ts +0 -194
- package/tests/session.test.ts +0 -239
package/tests/session.test.ts
DELETED
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CloseFn,
|
|
3
|
-
runTestServer,
|
|
4
|
-
TestServerInfo,
|
|
5
|
-
} from '@atproto/pds/tests/_util'
|
|
6
|
-
import { sessionClient, Session, SessionServiceClient } from '..'
|
|
7
|
-
|
|
8
|
-
describe('session', () => {
|
|
9
|
-
let server: TestServerInfo
|
|
10
|
-
let client: SessionServiceClient
|
|
11
|
-
let close: CloseFn
|
|
12
|
-
|
|
13
|
-
beforeAll(async () => {
|
|
14
|
-
server = await runTestServer({
|
|
15
|
-
dbPostgresSchema: 'session',
|
|
16
|
-
})
|
|
17
|
-
client = sessionClient.service(server.url)
|
|
18
|
-
close = server.close
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
afterAll(async () => {
|
|
22
|
-
await close()
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('manages a new session on account creation.', async () => {
|
|
26
|
-
const sessions: (Session | undefined)[] = []
|
|
27
|
-
client.sessionManager.on('session', (session) => sessions.push(session))
|
|
28
|
-
|
|
29
|
-
const { data: account } = await client.com.atproto.account.create({
|
|
30
|
-
handle: 'alice.test',
|
|
31
|
-
email: 'alice@test.com',
|
|
32
|
-
password: 'password',
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
36
|
-
expect(sessions).toEqual([
|
|
37
|
-
{ accessJwt: account.accessJwt, refreshJwt: account.refreshJwt },
|
|
38
|
-
])
|
|
39
|
-
|
|
40
|
-
const { data: sessionInfo } = await client.com.atproto.session.get({})
|
|
41
|
-
expect(sessionInfo).toEqual({
|
|
42
|
-
did: account.did,
|
|
43
|
-
handle: account.handle,
|
|
44
|
-
})
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
it('ends a new session on session deletion.', async () => {
|
|
48
|
-
const sessions: (Session | undefined)[] = []
|
|
49
|
-
client.sessionManager.on('session', (session) => sessions.push(session))
|
|
50
|
-
|
|
51
|
-
await client.com.atproto.session.delete()
|
|
52
|
-
|
|
53
|
-
expect(sessions).toEqual([undefined])
|
|
54
|
-
expect(client.sessionManager.active()).toEqual(false)
|
|
55
|
-
|
|
56
|
-
const getSessionAfterDeletion = client.com.atproto.session.get({})
|
|
57
|
-
await expect(getSessionAfterDeletion).rejects.toThrow(
|
|
58
|
-
'Authentication Required',
|
|
59
|
-
)
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it('manages a new session on session creation.', async () => {
|
|
63
|
-
const sessions: (Session | undefined)[] = []
|
|
64
|
-
client.sessionManager.on('session', (session) => sessions.push(session))
|
|
65
|
-
|
|
66
|
-
const { data: session } = await client.com.atproto.session.create({
|
|
67
|
-
handle: 'alice.test',
|
|
68
|
-
password: 'password',
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
expect(sessions).toEqual([
|
|
72
|
-
{ accessJwt: session.accessJwt, refreshJwt: session.refreshJwt },
|
|
73
|
-
])
|
|
74
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
75
|
-
|
|
76
|
-
const { data: sessionInfo } = await client.com.atproto.session.get({})
|
|
77
|
-
expect(sessionInfo).toEqual({
|
|
78
|
-
did: session.did,
|
|
79
|
-
handle: session.handle,
|
|
80
|
-
})
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('refreshes existing session.', async () => {
|
|
84
|
-
const sessions: (Session | undefined)[] = []
|
|
85
|
-
client.sessionManager.on('session', (session) => sessions.push(session))
|
|
86
|
-
|
|
87
|
-
const { data: session } = await client.com.atproto.session.create({
|
|
88
|
-
handle: 'alice.test',
|
|
89
|
-
password: 'password',
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
const { data: sessionRefresh } = await client.com.atproto.session.refresh()
|
|
93
|
-
|
|
94
|
-
expect(sessions).toEqual([
|
|
95
|
-
{ accessJwt: session.accessJwt, refreshJwt: session.refreshJwt },
|
|
96
|
-
{
|
|
97
|
-
accessJwt: sessionRefresh.accessJwt,
|
|
98
|
-
refreshJwt: sessionRefresh.refreshJwt,
|
|
99
|
-
},
|
|
100
|
-
])
|
|
101
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
102
|
-
|
|
103
|
-
const { data: sessionInfo } = await client.com.atproto.session.get({})
|
|
104
|
-
expect(sessionInfo).toEqual({
|
|
105
|
-
did: sessionRefresh.did,
|
|
106
|
-
handle: sessionRefresh.handle,
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
// Uses escape hatch: authorization set, so sessions are not managed by this call
|
|
110
|
-
const refreshStaleSession = client.com.atproto.session.refresh(undefined, {
|
|
111
|
-
headers: { authorization: `Bearer ${session.refreshJwt}` },
|
|
112
|
-
})
|
|
113
|
-
await expect(refreshStaleSession).rejects.toThrow('Token has been revoked')
|
|
114
|
-
|
|
115
|
-
expect(sessions.length).toEqual(2)
|
|
116
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('dedupes concurrent refreshes.', async () => {
|
|
120
|
-
const sessions: (Session | undefined)[] = []
|
|
121
|
-
client.sessionManager.on('session', (session) => sessions.push(session))
|
|
122
|
-
|
|
123
|
-
const { data: session } = await client.com.atproto.session.create({
|
|
124
|
-
handle: 'alice.test',
|
|
125
|
-
password: 'password',
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
const [{ data: sessionRefresh }] = await Promise.all(
|
|
129
|
-
[...Array(10)].map(() => client.com.atproto.session.refresh()),
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
expect(sessions).toEqual([
|
|
133
|
-
{ accessJwt: session.accessJwt, refreshJwt: session.refreshJwt },
|
|
134
|
-
{
|
|
135
|
-
accessJwt: sessionRefresh.accessJwt,
|
|
136
|
-
refreshJwt: sessionRefresh.refreshJwt,
|
|
137
|
-
},
|
|
138
|
-
])
|
|
139
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
140
|
-
|
|
141
|
-
const { data: sessionInfo } = await client.com.atproto.session.get({})
|
|
142
|
-
expect(sessionInfo).toEqual({
|
|
143
|
-
did: sessionRefresh.did,
|
|
144
|
-
handle: sessionRefresh.handle,
|
|
145
|
-
})
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
it('manually sets and unsets existing session.', async () => {
|
|
149
|
-
const sessions: (Session | undefined)[] = []
|
|
150
|
-
client.sessionManager.on('session', (session) => sessions.push(session))
|
|
151
|
-
|
|
152
|
-
const { data: session } = await client.com.atproto.session.create({
|
|
153
|
-
handle: 'alice.test',
|
|
154
|
-
password: 'password',
|
|
155
|
-
})
|
|
156
|
-
const sessionCreds = {
|
|
157
|
-
accessJwt: session.accessJwt,
|
|
158
|
-
refreshJwt: session.refreshJwt,
|
|
159
|
-
}
|
|
160
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
161
|
-
|
|
162
|
-
client.sessionManager.unset()
|
|
163
|
-
expect(client.sessionManager.active()).toEqual(false)
|
|
164
|
-
|
|
165
|
-
const getSessionAfterUnset = client.com.atproto.session.get({})
|
|
166
|
-
await expect(getSessionAfterUnset).rejects.toThrow(
|
|
167
|
-
'Authentication Required',
|
|
168
|
-
)
|
|
169
|
-
|
|
170
|
-
client.sessionManager.set(sessionCreds)
|
|
171
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
172
|
-
|
|
173
|
-
const { data: sessionInfo } = await client.com.atproto.session.get({})
|
|
174
|
-
expect(sessionInfo).toEqual({
|
|
175
|
-
did: session.did,
|
|
176
|
-
handle: session.handle,
|
|
177
|
-
})
|
|
178
|
-
|
|
179
|
-
expect(sessions).toEqual([sessionCreds, undefined, sessionCreds])
|
|
180
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
it('refreshes and retries request when access token is expired.', async () => {
|
|
184
|
-
const sessions: (Session | undefined)[] = []
|
|
185
|
-
client.sessionManager.on('session', (session) => sessions.push(session))
|
|
186
|
-
const auth = server.ctx.auth
|
|
187
|
-
|
|
188
|
-
const { data: sessionInfo } = await client.com.atproto.session.get({})
|
|
189
|
-
const accessExpired = await auth.createAccessToken(sessionInfo.did, -1)
|
|
190
|
-
|
|
191
|
-
expect(sessions.length).toEqual(0)
|
|
192
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
193
|
-
|
|
194
|
-
client.sessionManager.set({
|
|
195
|
-
refreshJwt: 'not-used-since-session-is-active',
|
|
196
|
-
...client.sessionManager.get(),
|
|
197
|
-
accessJwt: accessExpired.jwt,
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
expect(sessions.length).toEqual(1)
|
|
201
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
202
|
-
|
|
203
|
-
const { data: updatedSessionInfo } = await client.com.atproto.session.get(
|
|
204
|
-
{},
|
|
205
|
-
)
|
|
206
|
-
expect(updatedSessionInfo).toEqual(sessionInfo)
|
|
207
|
-
|
|
208
|
-
expect(sessions.length).toEqual(2) // New session was created during session.get()
|
|
209
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
210
|
-
})
|
|
211
|
-
|
|
212
|
-
it('unsets session when refresh token becomes expired.', async () => {
|
|
213
|
-
const sessions: (Session | undefined)[] = []
|
|
214
|
-
client.sessionManager.on('session', (session) => sessions.push(session))
|
|
215
|
-
const auth = server.ctx.auth
|
|
216
|
-
|
|
217
|
-
const { data: sessionInfo } = await client.com.atproto.session.get({})
|
|
218
|
-
const accessExpired = await auth.createAccessToken(sessionInfo.did, -1)
|
|
219
|
-
const refreshExpired = await auth.createRefreshToken(sessionInfo.did, -1)
|
|
220
|
-
|
|
221
|
-
expect(sessions.length).toEqual(0)
|
|
222
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
223
|
-
|
|
224
|
-
client.sessionManager.set({
|
|
225
|
-
accessJwt: accessExpired.jwt,
|
|
226
|
-
refreshJwt: refreshExpired.jwt,
|
|
227
|
-
})
|
|
228
|
-
|
|
229
|
-
expect(sessions.length).toEqual(1)
|
|
230
|
-
expect(client.sessionManager.active()).toEqual(true)
|
|
231
|
-
|
|
232
|
-
const getSessionAfterExpired = client.com.atproto.session.get({})
|
|
233
|
-
await expect(getSessionAfterExpired).rejects.toThrow('Token has expired')
|
|
234
|
-
|
|
235
|
-
expect(sessions.length).toEqual(2)
|
|
236
|
-
expect(sessions[1]).toEqual(undefined)
|
|
237
|
-
expect(client.sessionManager.active()).toEqual(false)
|
|
238
|
-
})
|
|
239
|
-
})
|