@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.
@@ -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
- })