@atlasauth/msw 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 +126 -0
- package/dist/handlers.d.ts +29 -0
- package/dist/handlers.js +600 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/serializers.d.ts +156 -0
- package/dist/serializers.js +162 -0
- package/dist/serializers.js.map +1 -0
- package/dist/state.d.ts +242 -0
- package/dist/state.js +266 -0
- package/dist/state.js.map +1 -0
- package/package.json +33 -0
package/dist/handlers.js
ADDED
|
@@ -0,0 +1,600 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.atlasHandlers = atlasHandlers;
|
|
4
|
+
/**
|
|
5
|
+
* MSW (v2) request handlers that stand in for Atlas's Frontend API (FAPI, the
|
|
6
|
+
* publishable-key browser surface) and Backend API (BAPI, the secret-key
|
|
7
|
+
* administrative surface). Each handler reads and mutates a {@link AtlasMock}
|
|
8
|
+
* store, so the mocked endpoints behave like a real instance across calls — a
|
|
9
|
+
* sign-in attempt advances, a minted session authenticates `me`, a created user
|
|
10
|
+
* appears in the next list.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { setupServer } from 'msw/node';
|
|
14
|
+
* import { atlasHandlers, createAtlasMock } from '@atlasauth/msw';
|
|
15
|
+
*
|
|
16
|
+
* const mock = createAtlasMock({ users: [{ email: 'ada@example.com', password: 'pw' }] });
|
|
17
|
+
* const server = setupServer(...atlasHandlers(mock));
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
const msw_1 = require("msw");
|
|
21
|
+
const serializers_1 = require("./serializers");
|
|
22
|
+
const ATTEMPT_TTL_MS = 10 * 60 * 1000;
|
|
23
|
+
/**
|
|
24
|
+
* Build the full set of FAPI + BAPI handlers for a mock store. Spread the result
|
|
25
|
+
* into `setupServer(...)` (Node) or `setupWorker(...)` (browser).
|
|
26
|
+
*/
|
|
27
|
+
function atlasHandlers(mock, options = {}) {
|
|
28
|
+
const fapi = (options.fapiBaseUrl ?? mock.fapiBaseUrl).replace(/\/+$/, '');
|
|
29
|
+
const bapi = (options.bapiBaseUrl ?? mock.bapiBaseUrl).replace(/\/+$/, '');
|
|
30
|
+
return [...fapiHandlers(mock, fapi), ...bapiHandlers(mock, bapi)];
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Auth guards — the publishable-key (FAPI) and secret-key (BAPI) gates.
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/** FAPI is identified by a publishable key (`x-publishable-key` header or `?publishable_key`). */
|
|
36
|
+
function requirePublishableKey(request) {
|
|
37
|
+
const header = request.headers.get('x-publishable-key');
|
|
38
|
+
const fromQuery = new URL(request.url).searchParams.get('publishable_key');
|
|
39
|
+
const key = header ?? fromQuery;
|
|
40
|
+
if (!key) {
|
|
41
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A publishable key is required.', 'publishable_key'), { status: 400 });
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/** BAPI requires a secret key: `Authorization: Bearer sk_…`, matching the instance's. */
|
|
46
|
+
function requireSecretKey(mock, request) {
|
|
47
|
+
const header = request.headers.get('authorization');
|
|
48
|
+
if (!header?.startsWith('Bearer ')) {
|
|
49
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('UNAUTHENTICATED', 'Missing Authorization: Bearer <secret key>.'), { status: 401 });
|
|
50
|
+
}
|
|
51
|
+
const presented = header.slice('Bearer '.length).trim();
|
|
52
|
+
if (!presented.startsWith('sk_') || presented !== mock.instance.secretKey) {
|
|
53
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('INVALID_KEY', 'The API key is invalid or has been revoked.'), { status: 401 });
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// FAPI — the publishable-key browser surface.
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
function fapiHandlers(mock, base) {
|
|
61
|
+
const now = () => Date.now();
|
|
62
|
+
const newAttempt = (kind, partial) => {
|
|
63
|
+
const id = mock.ids.next(kind === 'sign_in' ? 'signInAttempt' : 'signUpAttempt');
|
|
64
|
+
const attempt = {
|
|
65
|
+
id,
|
|
66
|
+
kind,
|
|
67
|
+
status: partial.status ?? 'needs_first_factor',
|
|
68
|
+
identifier: partial.identifier ?? null,
|
|
69
|
+
userId: partial.userId ?? null,
|
|
70
|
+
strategy: partial.strategy ?? null,
|
|
71
|
+
pendingCode: partial.pendingCode ?? null,
|
|
72
|
+
pollSecret: partial.pollSecret ?? null,
|
|
73
|
+
ticket: partial.ticket ?? null,
|
|
74
|
+
sessionId: partial.sessionId ?? null,
|
|
75
|
+
createdAt: now(),
|
|
76
|
+
expiresAt: now() + ATTEMPT_TTL_MS,
|
|
77
|
+
};
|
|
78
|
+
mock.attempts.push(attempt);
|
|
79
|
+
return attempt;
|
|
80
|
+
};
|
|
81
|
+
/** Complete an attempt: mint a session + a one-time ticket, mirror onto the attempt. */
|
|
82
|
+
const complete = (attempt) => {
|
|
83
|
+
if (!attempt.userId)
|
|
84
|
+
return;
|
|
85
|
+
const session = mock.createSession(attempt.userId);
|
|
86
|
+
attempt.status = 'complete';
|
|
87
|
+
attempt.sessionId = session.id;
|
|
88
|
+
attempt.ticket = `tkt_${attempt.id}`;
|
|
89
|
+
};
|
|
90
|
+
return [
|
|
91
|
+
// GET /v1/client/environment — enabled first factors + social providers.
|
|
92
|
+
msw_1.http.get(`${base}/v1/client/environment`, ({ request }) => {
|
|
93
|
+
const guard = requirePublishableKey(request);
|
|
94
|
+
if (guard)
|
|
95
|
+
return guard;
|
|
96
|
+
return msw_1.HttpResponse.json({
|
|
97
|
+
object: 'environment',
|
|
98
|
+
first_factors: mock.instance.firstFactors,
|
|
99
|
+
social_providers: mock.instance.socialProviders,
|
|
100
|
+
});
|
|
101
|
+
}),
|
|
102
|
+
// GET /v1/client — the session-boot the SDK calls on every page load.
|
|
103
|
+
msw_1.http.get(`${base}/v1/client`, ({ request }) => {
|
|
104
|
+
const guard = requirePublishableKey(request);
|
|
105
|
+
if (guard)
|
|
106
|
+
return guard;
|
|
107
|
+
const session = mock.activeSessionId ? mock.findSession(mock.activeSessionId) : undefined;
|
|
108
|
+
if (!session || session.status !== 'active') {
|
|
109
|
+
return msw_1.HttpResponse.json({
|
|
110
|
+
object: 'client',
|
|
111
|
+
session: null,
|
|
112
|
+
sessions: [],
|
|
113
|
+
last_active_session_id: null,
|
|
114
|
+
user: null,
|
|
115
|
+
organization_memberships: [],
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
const user = mock.findUser(session.userId);
|
|
119
|
+
if (!user) {
|
|
120
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
|
|
121
|
+
}
|
|
122
|
+
const memberships = mock.memberships.filter((m) => m.userId === user.id);
|
|
123
|
+
return msw_1.HttpResponse.json({
|
|
124
|
+
object: 'client',
|
|
125
|
+
session: {
|
|
126
|
+
object: 'session',
|
|
127
|
+
id: session.id,
|
|
128
|
+
status: session.status,
|
|
129
|
+
last_active_organization_id: session.activeOrganizationId,
|
|
130
|
+
expire_at: session.expiresAt,
|
|
131
|
+
abandon_at: session.idleExpiresAt,
|
|
132
|
+
},
|
|
133
|
+
sessions: [
|
|
134
|
+
{
|
|
135
|
+
object: 'session',
|
|
136
|
+
id: session.id,
|
|
137
|
+
status: session.status,
|
|
138
|
+
last_active_organization_id: session.activeOrganizationId,
|
|
139
|
+
expire_at: session.expiresAt,
|
|
140
|
+
abandon_at: session.idleExpiresAt,
|
|
141
|
+
user: (0, serializers_1.presentMeUser)(mock, user),
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
last_active_session_id: session.id,
|
|
145
|
+
jwt: session.jwt,
|
|
146
|
+
expires_in: Math.round((session.expiresAt - now()) / 1000),
|
|
147
|
+
user: (0, serializers_1.presentMeUser)(mock, user),
|
|
148
|
+
organization_memberships: memberships.map((m) => (0, serializers_1.presentMembership)(mock, m.organizationId, m.role)),
|
|
149
|
+
});
|
|
150
|
+
}),
|
|
151
|
+
// POST /v1/client/sign_ins — start an attempt from an identifier.
|
|
152
|
+
msw_1.http.post(`${base}/v1/client/sign_ins`, async ({ request }) => {
|
|
153
|
+
const guard = requirePublishableKey(request);
|
|
154
|
+
if (guard)
|
|
155
|
+
return guard;
|
|
156
|
+
const body = (await readJson(request));
|
|
157
|
+
const identifier = body.identifier?.trim().toLowerCase();
|
|
158
|
+
if (!identifier) {
|
|
159
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'An identifier is required.', 'identifier'), { status: 400 });
|
|
160
|
+
}
|
|
161
|
+
// An unknown identifier still produces a real attempt (no userId) that fails
|
|
162
|
+
// at the first factor — the response does not branch on account existence.
|
|
163
|
+
const user = mock.findUserByEmail(identifier);
|
|
164
|
+
const attempt = newAttempt('sign_in', {
|
|
165
|
+
status: 'needs_first_factor',
|
|
166
|
+
identifier,
|
|
167
|
+
userId: user?.id ?? null,
|
|
168
|
+
});
|
|
169
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentSignInAttempt)(mock, attempt), { status: 201 });
|
|
170
|
+
}),
|
|
171
|
+
// POST /v1/client/sign_ins/:id/prepare_first_factor — send a code / magic link.
|
|
172
|
+
msw_1.http.post(`${base}/v1/client/sign_ins/:id/prepare_first_factor`, async ({ request, params }) => {
|
|
173
|
+
const guard = requirePublishableKey(request);
|
|
174
|
+
if (guard)
|
|
175
|
+
return guard;
|
|
176
|
+
const attempt = mock.findAttempt(String(params.id));
|
|
177
|
+
if (!attempt || attempt.kind !== 'sign_in') {
|
|
178
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-in attempt.'), { status: 404 });
|
|
179
|
+
}
|
|
180
|
+
const body = (await readJson(request));
|
|
181
|
+
const strategy = body.strategy;
|
|
182
|
+
if (strategy !== 'email_code' && strategy !== 'email_link' && strategy !== 'phone_code') {
|
|
183
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'Supported strategies are email_code, email_link and phone_code.', 'strategy'), { status: 400 });
|
|
184
|
+
}
|
|
185
|
+
attempt.strategy = strategy;
|
|
186
|
+
attempt.pendingCode = mock.instance.testOtp;
|
|
187
|
+
attempt.pollSecret = `pol_${attempt.id}`;
|
|
188
|
+
return msw_1.HttpResponse.json({
|
|
189
|
+
object: 'sign_in_attempt',
|
|
190
|
+
id: attempt.id,
|
|
191
|
+
status: attempt.status,
|
|
192
|
+
strategy,
|
|
193
|
+
poll_secret: attempt.pollSecret,
|
|
194
|
+
});
|
|
195
|
+
}),
|
|
196
|
+
// POST /v1/client/sign_ins/:id/attempt_first_factor — present the factor.
|
|
197
|
+
msw_1.http.post(`${base}/v1/client/sign_ins/:id/attempt_first_factor`, async ({ request, params }) => {
|
|
198
|
+
const guard = requirePublishableKey(request);
|
|
199
|
+
if (guard)
|
|
200
|
+
return guard;
|
|
201
|
+
const attempt = mock.findAttempt(String(params.id));
|
|
202
|
+
if (!attempt || attempt.kind !== 'sign_in') {
|
|
203
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-in attempt.'), { status: 404 });
|
|
204
|
+
}
|
|
205
|
+
const body = (await readJson(request));
|
|
206
|
+
const strategy = body.strategy;
|
|
207
|
+
const user = attempt.userId ? mock.findUser(attempt.userId) : undefined;
|
|
208
|
+
if (strategy === 'email_code' || strategy === 'phone_code') {
|
|
209
|
+
if (!body.code) {
|
|
210
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A code is required.', 'code'), {
|
|
211
|
+
status: 400,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
if (!user || body.code !== (attempt.pendingCode ?? mock.instance.testOtp)) {
|
|
215
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VERIFICATION_FAILED', 'That code is incorrect or has expired.', 'code'), { status: 400 });
|
|
216
|
+
}
|
|
217
|
+
complete(attempt);
|
|
218
|
+
return msw_1.HttpResponse.json({ ...(0, serializers_1.presentSignInAttempt)(mock, attempt), ticket: attempt.ticket });
|
|
219
|
+
}
|
|
220
|
+
if (strategy !== 'password') {
|
|
221
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'Unsupported first-factor strategy.', 'strategy'), { status: 400 });
|
|
222
|
+
}
|
|
223
|
+
if (!body.password) {
|
|
224
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A password is required.', 'password'), { status: 400 });
|
|
225
|
+
}
|
|
226
|
+
// A wrong password — or an unknown identifier — fails identically (§13.2).
|
|
227
|
+
if (!user || user.password == null || user.password !== body.password) {
|
|
228
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VERIFICATION_FAILED', 'The credentials are incorrect.', 'password'), { status: 400 });
|
|
229
|
+
}
|
|
230
|
+
complete(attempt);
|
|
231
|
+
return msw_1.HttpResponse.json({ ...(0, serializers_1.presentSignInAttempt)(mock, attempt), ticket: attempt.ticket });
|
|
232
|
+
}),
|
|
233
|
+
// GET /v1/client/sign_ins/:id — poll an attempt (needs the poll secret).
|
|
234
|
+
msw_1.http.get(`${base}/v1/client/sign_ins/:id`, ({ request, params }) => {
|
|
235
|
+
const guard = requirePublishableKey(request);
|
|
236
|
+
if (guard)
|
|
237
|
+
return guard;
|
|
238
|
+
const secret = new URL(request.url).searchParams.get('poll_secret');
|
|
239
|
+
if (!secret) {
|
|
240
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A poll_secret is required.', 'poll_secret'), { status: 400 });
|
|
241
|
+
}
|
|
242
|
+
const attempt = mock.findAttempt(String(params.id));
|
|
243
|
+
// A wrong secret is answered exactly like an unknown attempt.
|
|
244
|
+
if (!attempt || attempt.kind !== 'sign_in' || attempt.pollSecret !== secret) {
|
|
245
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-in attempt.'), { status: 404 });
|
|
246
|
+
}
|
|
247
|
+
if (attempt.status !== 'complete') {
|
|
248
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentSignInAttempt)(mock, attempt));
|
|
249
|
+
}
|
|
250
|
+
return msw_1.HttpResponse.json({ ...(0, serializers_1.presentSignInAttempt)(mock, attempt), ticket: attempt.ticket });
|
|
251
|
+
}),
|
|
252
|
+
// POST /v1/client/sign_ups — start a sign-up.
|
|
253
|
+
msw_1.http.post(`${base}/v1/client/sign_ups`, async ({ request }) => {
|
|
254
|
+
const guard = requirePublishableKey(request);
|
|
255
|
+
if (guard)
|
|
256
|
+
return guard;
|
|
257
|
+
const body = (await readJson(request));
|
|
258
|
+
if (!body.email) {
|
|
259
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'An email address is required.', 'email'), { status: 400 });
|
|
260
|
+
}
|
|
261
|
+
if (!body.password) {
|
|
262
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A password is required.', 'password'), { status: 400 });
|
|
263
|
+
}
|
|
264
|
+
const email = body.email.trim().toLowerCase();
|
|
265
|
+
if (mock.findUserByEmail(email)) {
|
|
266
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('IDENTIFIER_EXISTS', 'That address is already in use.', 'email'), { status: 409 });
|
|
267
|
+
}
|
|
268
|
+
// Create the (unverified) user now; completion is gated on verification.
|
|
269
|
+
const user = mock.addUser({ email, emailVerified: false, password: body.password });
|
|
270
|
+
const attempt = newAttempt('sign_up', {
|
|
271
|
+
status: 'needs_email_verification',
|
|
272
|
+
identifier: email,
|
|
273
|
+
userId: user.id,
|
|
274
|
+
strategy: 'email_code',
|
|
275
|
+
pendingCode: mock.instance.testOtp,
|
|
276
|
+
});
|
|
277
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentSignUpAttempt)(attempt), { status: 201 });
|
|
278
|
+
}),
|
|
279
|
+
// POST /v1/client/sign_ups/:id/prepare_verification — (re)send the code.
|
|
280
|
+
msw_1.http.post(`${base}/v1/client/sign_ups/:id/prepare_verification`, async ({ request, params }) => {
|
|
281
|
+
const guard = requirePublishableKey(request);
|
|
282
|
+
if (guard)
|
|
283
|
+
return guard;
|
|
284
|
+
const attempt = mock.findAttempt(String(params.id));
|
|
285
|
+
if (!attempt || attempt.kind !== 'sign_up') {
|
|
286
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-up attempt.'), { status: 404 });
|
|
287
|
+
}
|
|
288
|
+
attempt.pendingCode = mock.instance.testOtp;
|
|
289
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentSignUpAttempt)(attempt));
|
|
290
|
+
}),
|
|
291
|
+
// POST /v1/client/sign_ups/:id/attempt_verification — present the code.
|
|
292
|
+
msw_1.http.post(`${base}/v1/client/sign_ups/:id/attempt_verification`, async ({ request, params }) => {
|
|
293
|
+
const guard = requirePublishableKey(request);
|
|
294
|
+
if (guard)
|
|
295
|
+
return guard;
|
|
296
|
+
const attempt = mock.findAttempt(String(params.id));
|
|
297
|
+
if (!attempt || attempt.kind !== 'sign_up') {
|
|
298
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown sign-up attempt.'), { status: 404 });
|
|
299
|
+
}
|
|
300
|
+
const body = (await readJson(request));
|
|
301
|
+
if (!body.code) {
|
|
302
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A verification code is required.', 'code'), { status: 400 });
|
|
303
|
+
}
|
|
304
|
+
if (body.code !== (attempt.pendingCode ?? mock.instance.testOtp)) {
|
|
305
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VERIFICATION_FAILED', 'That code is incorrect or has expired.', 'code'), { status: 400 });
|
|
306
|
+
}
|
|
307
|
+
// Verify the address, then complete + mint a session (same as sign-in).
|
|
308
|
+
const user = attempt.userId ? mock.findUser(attempt.userId) : undefined;
|
|
309
|
+
if (user) {
|
|
310
|
+
const primary = user.emails[0];
|
|
311
|
+
if (primary) {
|
|
312
|
+
primary.verified = true;
|
|
313
|
+
user.primaryEmailId = primary.id;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
complete(attempt);
|
|
317
|
+
return msw_1.HttpResponse.json({ ...(0, serializers_1.presentSignUpAttempt)(attempt), ticket: attempt.ticket });
|
|
318
|
+
}),
|
|
319
|
+
// POST /v1/client/tickets/exchange — swap a completed attempt's ticket for a session.
|
|
320
|
+
msw_1.http.post(`${base}/v1/client/tickets/exchange`, async ({ request }) => {
|
|
321
|
+
const guard = requirePublishableKey(request);
|
|
322
|
+
if (guard)
|
|
323
|
+
return guard;
|
|
324
|
+
const body = (await readJson(request));
|
|
325
|
+
if (!body.attempt_id) {
|
|
326
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'An attempt_id is required.', 'attempt_id'), { status: 400 });
|
|
327
|
+
}
|
|
328
|
+
if (!body.ticket) {
|
|
329
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A ticket is required.', 'ticket'), {
|
|
330
|
+
status: 400,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
const attempt = mock.findAttempt(body.attempt_id);
|
|
334
|
+
if (!attempt ||
|
|
335
|
+
attempt.status !== 'complete' ||
|
|
336
|
+
!attempt.userId ||
|
|
337
|
+
attempt.ticket !== body.ticket) {
|
|
338
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'That sign-in attempt is not complete.', 'attempt_id'), { status: 400 });
|
|
339
|
+
}
|
|
340
|
+
// One-time: burn the ticket so a replay fails.
|
|
341
|
+
attempt.ticket = null;
|
|
342
|
+
const session = attempt.sessionId ? mock.findSession(attempt.sessionId) : undefined;
|
|
343
|
+
if (!session) {
|
|
344
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown session.'), { status: 404 });
|
|
345
|
+
}
|
|
346
|
+
mock.activeSessionId = session.id;
|
|
347
|
+
return msw_1.HttpResponse.json({
|
|
348
|
+
object: 'session',
|
|
349
|
+
id: session.id,
|
|
350
|
+
jwt: session.jwt,
|
|
351
|
+
expires_in: Math.round((session.expiresAt - now()) / 1000),
|
|
352
|
+
});
|
|
353
|
+
}),
|
|
354
|
+
// GET /v1/client/me — the signed-in user (Bearer session jwt).
|
|
355
|
+
msw_1.http.get(`${base}/v1/client/me`, ({ request }) => {
|
|
356
|
+
const header = request.headers.get('authorization');
|
|
357
|
+
const jwt = header?.startsWith('Bearer ') ? header.slice('Bearer '.length).trim() : undefined;
|
|
358
|
+
const session = jwt
|
|
359
|
+
? mock.sessionForJwt(jwt)
|
|
360
|
+
: mock.activeSessionId
|
|
361
|
+
? mock.findSession(mock.activeSessionId)
|
|
362
|
+
: undefined;
|
|
363
|
+
if (!session || session.status !== 'active') {
|
|
364
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('UNAUTHENTICATED', 'Authentication required.'), {
|
|
365
|
+
status: 401,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
const user = mock.findUser(session.userId);
|
|
369
|
+
if (!user) {
|
|
370
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
|
|
371
|
+
}
|
|
372
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentMeUser)(mock, user));
|
|
373
|
+
}),
|
|
374
|
+
// GET /.well-known/jwks.json — the token-verification key set.
|
|
375
|
+
msw_1.http.get(`${base}/.well-known/jwks.json`, () => msw_1.HttpResponse.json(mock.instance.jwks, {
|
|
376
|
+
headers: { 'cache-control': 'public, max-age=3600, stale-if-error=86400' },
|
|
377
|
+
})),
|
|
378
|
+
];
|
|
379
|
+
}
|
|
380
|
+
// ---------------------------------------------------------------------------
|
|
381
|
+
// BAPI — the secret-key administrative surface.
|
|
382
|
+
// ---------------------------------------------------------------------------
|
|
383
|
+
function bapiHandlers(mock, base) {
|
|
384
|
+
/** Cursor pagination over an id-sorted (desc) list — the §9.1 envelope. */
|
|
385
|
+
const paginate = (rows, url) => {
|
|
386
|
+
const limit = Math.min(Number(url.searchParams.get('limit') ?? 20) || 20, 100);
|
|
387
|
+
const startingAfter = url.searchParams.get('starting_after');
|
|
388
|
+
const sorted = [...rows].sort((a, b) => (a.id < b.id ? 1 : a.id > b.id ? -1 : 0));
|
|
389
|
+
const filtered = startingAfter ? sorted.filter((r) => r.id < startingAfter) : sorted;
|
|
390
|
+
const hasMore = filtered.length > limit;
|
|
391
|
+
const page = hasMore ? filtered.slice(0, limit) : filtered;
|
|
392
|
+
const nextCursor = hasMore && page.length > 0 ? page[page.length - 1].id : null;
|
|
393
|
+
return { page, hasMore, nextCursor };
|
|
394
|
+
};
|
|
395
|
+
return [
|
|
396
|
+
// GET /v1/users — cursor-paginated list.
|
|
397
|
+
msw_1.http.get(`${base}/v1/users`, ({ request }) => {
|
|
398
|
+
const guard = requireSecretKey(mock, request);
|
|
399
|
+
if (guard)
|
|
400
|
+
return guard;
|
|
401
|
+
const live = mock.users.filter((u) => !u.deletedAt);
|
|
402
|
+
const { page, hasMore, nextCursor } = paginate(live, new URL(request.url));
|
|
403
|
+
return msw_1.HttpResponse.json((0, serializers_1.listEnvelope)(page.map(serializers_1.presentUser), hasMore, nextCursor));
|
|
404
|
+
}),
|
|
405
|
+
// POST /v1/users — create a user.
|
|
406
|
+
msw_1.http.post(`${base}/v1/users`, async ({ request }) => {
|
|
407
|
+
const guard = requireSecretKey(mock, request);
|
|
408
|
+
if (guard)
|
|
409
|
+
return guard;
|
|
410
|
+
const body = (await readJson(request));
|
|
411
|
+
const rawEmail = Array.isArray(body.email_address)
|
|
412
|
+
? body.email_address[0]
|
|
413
|
+
: body.email_address;
|
|
414
|
+
const email = rawEmail?.trim().toLowerCase();
|
|
415
|
+
if (!email?.includes('@')) {
|
|
416
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A valid email_address is required.', 'email_address'), { status: 400 });
|
|
417
|
+
}
|
|
418
|
+
const emailVerified = body.email_verified === true;
|
|
419
|
+
if (emailVerified && mock.findUserByEmail(email)) {
|
|
420
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('IDENTIFIER_EXISTS', 'That address is already in use.'), { status: 409 });
|
|
421
|
+
}
|
|
422
|
+
const user = mock.addUser({
|
|
423
|
+
email,
|
|
424
|
+
emailVerified,
|
|
425
|
+
password: typeof body.password === 'string' ? body.password : undefined,
|
|
426
|
+
firstName: typeof body.first_name === 'string' ? body.first_name : undefined,
|
|
427
|
+
lastName: typeof body.last_name === 'string' ? body.last_name : undefined,
|
|
428
|
+
externalId: typeof body.external_id === 'string' ? body.external_id : undefined,
|
|
429
|
+
publicMetadata: isRecord(body.public_metadata) ? body.public_metadata : undefined,
|
|
430
|
+
privateMetadata: isRecord(body.private_metadata) ? body.private_metadata : undefined,
|
|
431
|
+
unsafeMetadata: isRecord(body.unsafe_metadata) ? body.unsafe_metadata : undefined,
|
|
432
|
+
});
|
|
433
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentUser)(user), { status: 201 });
|
|
434
|
+
}),
|
|
435
|
+
// GET /v1/users/:id — one user (404 for unknown / soft-deleted).
|
|
436
|
+
msw_1.http.get(`${base}/v1/users/:id`, ({ request, params }) => {
|
|
437
|
+
const guard = requireSecretKey(mock, request);
|
|
438
|
+
if (guard)
|
|
439
|
+
return guard;
|
|
440
|
+
const includeDeleted = new URL(request.url).searchParams.get('include_deleted') === 'true';
|
|
441
|
+
const user = mock.findUser(String(params.id), includeDeleted);
|
|
442
|
+
if (!user) {
|
|
443
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
|
|
444
|
+
}
|
|
445
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentUser)(user));
|
|
446
|
+
}),
|
|
447
|
+
// PATCH /v1/users/:id — update profile / metadata.
|
|
448
|
+
msw_1.http.patch(`${base}/v1/users/:id`, async ({ request, params }) => {
|
|
449
|
+
const guard = requireSecretKey(mock, request);
|
|
450
|
+
if (guard)
|
|
451
|
+
return guard;
|
|
452
|
+
const user = mock.findUser(String(params.id));
|
|
453
|
+
if (!user) {
|
|
454
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
|
|
455
|
+
}
|
|
456
|
+
const body = (await readJson(request));
|
|
457
|
+
if ('first_name' in body)
|
|
458
|
+
user.firstName = body.first_name ?? null;
|
|
459
|
+
if ('last_name' in body)
|
|
460
|
+
user.lastName = body.last_name ?? null;
|
|
461
|
+
if (isRecord(body.public_metadata))
|
|
462
|
+
user.publicMetadata = body.public_metadata;
|
|
463
|
+
if (isRecord(body.private_metadata))
|
|
464
|
+
user.privateMetadata = body.private_metadata;
|
|
465
|
+
if ('external_id' in body) {
|
|
466
|
+
const v = body.external_id;
|
|
467
|
+
user.externalId = typeof v === 'string' && v.trim() ? v.trim() : null;
|
|
468
|
+
}
|
|
469
|
+
if (typeof body.password === 'string' && body.password.length > 0)
|
|
470
|
+
user.password = body.password;
|
|
471
|
+
user.updatedAt = Date.now();
|
|
472
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentUser)(user));
|
|
473
|
+
}),
|
|
474
|
+
// DELETE /v1/users/:id — soft delete.
|
|
475
|
+
msw_1.http.delete(`${base}/v1/users/:id`, ({ request, params }) => {
|
|
476
|
+
const guard = requireSecretKey(mock, request);
|
|
477
|
+
if (guard)
|
|
478
|
+
return guard;
|
|
479
|
+
const user = mock.findUser(String(params.id));
|
|
480
|
+
if (!user) {
|
|
481
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown user.'), { status: 404 });
|
|
482
|
+
}
|
|
483
|
+
user.deletedAt = Date.now();
|
|
484
|
+
return msw_1.HttpResponse.json({ object: 'user', id: user.id, deleted: true });
|
|
485
|
+
}),
|
|
486
|
+
// GET /v1/organizations — cursor-paginated list.
|
|
487
|
+
msw_1.http.get(`${base}/v1/organizations`, ({ request }) => {
|
|
488
|
+
const guard = requireSecretKey(mock, request);
|
|
489
|
+
if (guard)
|
|
490
|
+
return guard;
|
|
491
|
+
const { page, hasMore, nextCursor } = paginate(mock.organizations, new URL(request.url));
|
|
492
|
+
return msw_1.HttpResponse.json((0, serializers_1.listEnvelope)(page.map(serializers_1.presentOrganization), hasMore, nextCursor));
|
|
493
|
+
}),
|
|
494
|
+
// POST /v1/organizations — create.
|
|
495
|
+
msw_1.http.post(`${base}/v1/organizations`, async ({ request }) => {
|
|
496
|
+
const guard = requireSecretKey(mock, request);
|
|
497
|
+
if (guard)
|
|
498
|
+
return guard;
|
|
499
|
+
const body = (await readJson(request));
|
|
500
|
+
if (typeof body.name !== 'string' || !body.name.trim()) {
|
|
501
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A name is required.', 'name'), {
|
|
502
|
+
status: 400,
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
const org = mock.addOrganization({
|
|
506
|
+
name: body.name.trim(),
|
|
507
|
+
slug: typeof body.slug === 'string' ? body.slug : undefined,
|
|
508
|
+
createdBy: typeof body.created_by === 'string' ? body.created_by : undefined,
|
|
509
|
+
maxAllowedMemberships: typeof body.max_allowed_memberships === 'number'
|
|
510
|
+
? body.max_allowed_memberships
|
|
511
|
+
: undefined,
|
|
512
|
+
publicMetadata: isRecord(body.public_metadata) ? body.public_metadata : undefined,
|
|
513
|
+
});
|
|
514
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentOrganization)(org), { status: 201 });
|
|
515
|
+
}),
|
|
516
|
+
// GET /v1/organizations/:id — one organization.
|
|
517
|
+
msw_1.http.get(`${base}/v1/organizations/:id`, ({ request, params }) => {
|
|
518
|
+
const guard = requireSecretKey(mock, request);
|
|
519
|
+
if (guard)
|
|
520
|
+
return guard;
|
|
521
|
+
const org = mock.findOrganization(String(params.id));
|
|
522
|
+
if (!org) {
|
|
523
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown organization.'), { status: 404 });
|
|
524
|
+
}
|
|
525
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentOrganization)(org));
|
|
526
|
+
}),
|
|
527
|
+
// POST /v1/sessions — mint a session for a user (headless, in one call).
|
|
528
|
+
msw_1.http.post(`${base}/v1/sessions`, async ({ request }) => {
|
|
529
|
+
const guard = requireSecretKey(mock, request);
|
|
530
|
+
if (guard)
|
|
531
|
+
return guard;
|
|
532
|
+
const body = (await readJson(request));
|
|
533
|
+
if (!body.user_id) {
|
|
534
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'A user_id is required.', 'user_id'), {
|
|
535
|
+
status: 400,
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
const user = mock.findUser(body.user_id);
|
|
539
|
+
if (!user) {
|
|
540
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'Unknown user.', 'user_id'), {
|
|
541
|
+
status: 400,
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
if (user.banned) {
|
|
545
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('VALIDATION_FAILED', 'That user is banned.', 'user_id'), {
|
|
546
|
+
status: 400,
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
const actor = typeof body.actor?.sub === 'string' && body.actor.sub.trim() ? body.actor.sub.trim() : undefined;
|
|
550
|
+
const session = mock.createSession(user.id, { impersonatedBy: actor });
|
|
551
|
+
return msw_1.HttpResponse.json({
|
|
552
|
+
object: 'session',
|
|
553
|
+
id: session.id,
|
|
554
|
+
user_id: user.id,
|
|
555
|
+
jwt: session.jwt,
|
|
556
|
+
refresh_token: session.refreshToken,
|
|
557
|
+
expires_in: Math.round((session.expiresAt - Date.now()) / 1000),
|
|
558
|
+
...(actor ? { impersonated_by: actor } : {}),
|
|
559
|
+
}, { status: 201 });
|
|
560
|
+
}),
|
|
561
|
+
// GET /v1/sessions/:id — one session (operator view).
|
|
562
|
+
msw_1.http.get(`${base}/v1/sessions/:id`, ({ request, params }) => {
|
|
563
|
+
const guard = requireSecretKey(mock, request);
|
|
564
|
+
if (guard)
|
|
565
|
+
return guard;
|
|
566
|
+
const session = mock.findSession(String(params.id));
|
|
567
|
+
if (!session) {
|
|
568
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown session.'), { status: 404 });
|
|
569
|
+
}
|
|
570
|
+
return msw_1.HttpResponse.json((0, serializers_1.presentSession)(session));
|
|
571
|
+
}),
|
|
572
|
+
// POST /v1/sessions/:id/revoke — revoke a session.
|
|
573
|
+
msw_1.http.post(`${base}/v1/sessions/:id/revoke`, ({ request, params }) => {
|
|
574
|
+
const guard = requireSecretKey(mock, request);
|
|
575
|
+
if (guard)
|
|
576
|
+
return guard;
|
|
577
|
+
const session = mock.findSession(String(params.id));
|
|
578
|
+
if (!session) {
|
|
579
|
+
return msw_1.HttpResponse.json((0, serializers_1.errorBody)('NOT_FOUND', 'Unknown session.'), { status: 404 });
|
|
580
|
+
}
|
|
581
|
+
session.status = 'revoked';
|
|
582
|
+
if (mock.activeSessionId === session.id)
|
|
583
|
+
mock.activeSessionId = null;
|
|
584
|
+
return msw_1.HttpResponse.json({ object: 'session', id: session.id, status: 'revoked' });
|
|
585
|
+
}),
|
|
586
|
+
];
|
|
587
|
+
}
|
|
588
|
+
// ---------------------------------------------------------------------------
|
|
589
|
+
async function readJson(request) {
|
|
590
|
+
try {
|
|
591
|
+
return (await request.clone().json());
|
|
592
|
+
}
|
|
593
|
+
catch {
|
|
594
|
+
return {};
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
function isRecord(value) {
|
|
598
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
599
|
+
}
|
|
600
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|