@propelauth/nextjs 0.0.60

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.
@@ -0,0 +1,622 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var __async = (__this, __arguments, generator) => {
30
+ return new Promise((resolve, reject) => {
31
+ var fulfilled = (value) => {
32
+ try {
33
+ step(generator.next(value));
34
+ } catch (e) {
35
+ reject(e);
36
+ }
37
+ };
38
+ var rejected = (value) => {
39
+ try {
40
+ step(generator.throw(value));
41
+ } catch (e) {
42
+ reject(e);
43
+ }
44
+ };
45
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
46
+ step((generator = generator.apply(__this, __arguments)).next());
47
+ });
48
+ };
49
+
50
+ // src/server/index.ts
51
+ var server_exports = {};
52
+ __export(server_exports, {
53
+ ConfigurationException: () => ConfigurationException,
54
+ UnauthorizedException: () => UnauthorizedException,
55
+ initializeAuth: () => initializeAuth
56
+ });
57
+ module.exports = __toCommonJS(server_exports);
58
+
59
+ // src/server/exceptions.ts
60
+ var UnauthorizedException = class extends Error {
61
+ constructor(message) {
62
+ super(message);
63
+ this.message = message;
64
+ this.status = 401;
65
+ }
66
+ };
67
+ var ConfigurationException = class extends Error {
68
+ constructor(message) {
69
+ super(message);
70
+ this.message = message;
71
+ this.status = 500;
72
+ }
73
+ };
74
+
75
+ // src/server/server-actions.ts
76
+ var jose = __toESM(require("jose"));
77
+ var import_headers = require("next/headers");
78
+ var import_navigation = require("next/navigation");
79
+
80
+ // src/user.ts
81
+ var User = class {
82
+ constructor(userId, email, orgIdToOrgMemberInfo, firstName, lastName, username, legacyUserId, impersonatorUserId) {
83
+ this.userId = userId;
84
+ this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo;
85
+ this.email = email;
86
+ this.firstName = firstName;
87
+ this.lastName = lastName;
88
+ this.username = username;
89
+ this.legacyUserId = legacyUserId;
90
+ this.impersonatorUserId = impersonatorUserId;
91
+ }
92
+ getOrg(orgId) {
93
+ if (!this.orgIdToOrgMemberInfo) {
94
+ return void 0;
95
+ }
96
+ return this.orgIdToOrgMemberInfo[orgId];
97
+ }
98
+ getOrgByName(orgName) {
99
+ if (!this.orgIdToOrgMemberInfo) {
100
+ return void 0;
101
+ }
102
+ const urlSafeOrgName = orgName.toLowerCase().replace(/ /g, "-");
103
+ for (const orgId in this.orgIdToOrgMemberInfo) {
104
+ const orgMemberInfo = this.orgIdToOrgMemberInfo[orgId];
105
+ if (orgMemberInfo.urlSafeOrgName === urlSafeOrgName) {
106
+ return orgMemberInfo;
107
+ }
108
+ }
109
+ return void 0;
110
+ }
111
+ getOrgs() {
112
+ if (!this.orgIdToOrgMemberInfo) {
113
+ return [];
114
+ }
115
+ return Object.values(this.orgIdToOrgMemberInfo);
116
+ }
117
+ isImpersonating() {
118
+ return !!this.impersonatorUserId;
119
+ }
120
+ static fromJSON(json) {
121
+ const obj = JSON.parse(json);
122
+ const orgIdToOrgMemberInfo = {};
123
+ for (const orgId in obj.orgIdToOrgMemberInfo) {
124
+ orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(
125
+ JSON.stringify(obj.orgIdToOrgMemberInfo[orgId])
126
+ );
127
+ }
128
+ return new User(
129
+ obj.userId,
130
+ obj.email,
131
+ orgIdToOrgMemberInfo,
132
+ obj.firstName,
133
+ obj.lastName,
134
+ obj.username,
135
+ obj.legacyUserId,
136
+ obj.impersonatorUserId
137
+ );
138
+ }
139
+ };
140
+ var OrgMemberInfo = class {
141
+ constructor(orgId, orgName, orgMetadata, urlSafeOrgName, userAssignedRole, userInheritedRolesPlusCurrentRole, userPermissions) {
142
+ this.orgId = orgId;
143
+ this.orgName = orgName;
144
+ this.orgMetadata = orgMetadata;
145
+ this.urlSafeOrgName = urlSafeOrgName;
146
+ this.userAssignedRole = userAssignedRole;
147
+ this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole;
148
+ this.userPermissions = userPermissions;
149
+ }
150
+ // validation methods
151
+ isRole(role) {
152
+ return this.userAssignedRole === role;
153
+ }
154
+ isAtLeastRole(role) {
155
+ return this.userInheritedRolesPlusCurrentRole.includes(role);
156
+ }
157
+ hasPermission(permission) {
158
+ return this.userPermissions.includes(permission);
159
+ }
160
+ hasAllPermissions(permissions) {
161
+ return permissions.every((permission) => this.hasPermission(permission));
162
+ }
163
+ static fromJSON(json) {
164
+ const obj = JSON.parse(json);
165
+ return new OrgMemberInfo(
166
+ obj.orgId,
167
+ obj.orgName,
168
+ obj.orgMetadata,
169
+ obj.urlSafeOrgName,
170
+ obj.userAssignedRole,
171
+ obj.userInheritedRolesPlusCurrentRole,
172
+ obj.userPermissions
173
+ );
174
+ }
175
+ // getters for the private fields
176
+ get assignedRole() {
177
+ return this.userAssignedRole;
178
+ }
179
+ get inheritedRolesPlusCurrentRole() {
180
+ return this.userInheritedRolesPlusCurrentRole;
181
+ }
182
+ get permissions() {
183
+ return this.userPermissions;
184
+ }
185
+ };
186
+ function toUser(snake_case) {
187
+ return new User(
188
+ snake_case.user_id,
189
+ snake_case.email,
190
+ toOrgIdToOrgMemberInfo(snake_case.org_id_to_org_member_info),
191
+ snake_case.first_name,
192
+ snake_case.last_name,
193
+ snake_case.username,
194
+ snake_case.legacy_user_id,
195
+ snake_case.impersonatorUserId
196
+ );
197
+ }
198
+ function toOrgIdToOrgMemberInfo(snake_case) {
199
+ if (snake_case === void 0) {
200
+ return void 0;
201
+ }
202
+ const camelCase = {};
203
+ for (const key of Object.keys(snake_case)) {
204
+ const snakeCaseValue = snake_case[key];
205
+ if (snakeCaseValue) {
206
+ camelCase[key] = new OrgMemberInfo(
207
+ snakeCaseValue.org_id,
208
+ snakeCaseValue.org_name,
209
+ snakeCaseValue.org_metadata,
210
+ snakeCaseValue.url_safe_org_name,
211
+ snakeCaseValue.user_role,
212
+ snakeCaseValue.inherited_user_roles_plus_current_role,
213
+ snakeCaseValue.user_permissions
214
+ );
215
+ }
216
+ }
217
+ return camelCase;
218
+ }
219
+
220
+ // src/server/server-actions.ts
221
+ var import_server = require("next/server");
222
+ var LOGIN_PATH = "/api/auth/login";
223
+ var CALLBACK_PATH = "/api/auth/callback";
224
+ var USERINFO_PATH = "/api/auth/userinfo";
225
+ var LOGOUT_PATH = "/api/auth/logout";
226
+ var ACCESS_TOKEN_COOKIE_NAME = "__pa_at";
227
+ var REFRESH_TOKEN_COOKIE_NAME = "__pa_rt";
228
+ var STATE_COOKIE_NAME = "__pa_state";
229
+ var CUSTOM_HEADER_FOR_ACCESS_TOKEN = "x-propelauth-access-token";
230
+ var COOKIE_OPTIONS = {
231
+ httpOnly: true,
232
+ sameSite: "lax",
233
+ secure: true,
234
+ path: "/"
235
+ };
236
+ function getServerActions({
237
+ authUrlOrigin,
238
+ postLoginPathFn,
239
+ verifierKey,
240
+ integrationApiKey,
241
+ redirectUri
242
+ }) {
243
+ const publicKeyPromise = jose.importSPKI(verifierKey, "RS256");
244
+ function getUserOrRedirect() {
245
+ return __async(this, null, function* () {
246
+ const user = yield getUser();
247
+ if (user) {
248
+ return user;
249
+ } else {
250
+ (0, import_navigation.redirect)(LOGIN_PATH);
251
+ throw new Error("Redirecting to login");
252
+ }
253
+ });
254
+ }
255
+ function getUser() {
256
+ return __async(this, null, function* () {
257
+ var _a;
258
+ const accessToken = (0, import_headers.headers)().get(CUSTOM_HEADER_FOR_ACCESS_TOKEN) || ((_a = (0, import_headers.cookies)().get(ACCESS_TOKEN_COOKIE_NAME)) == null ? void 0 : _a.value);
259
+ if (accessToken) {
260
+ const user = yield validateAccessTokenOrUndefined(accessToken);
261
+ if (user) {
262
+ return user;
263
+ }
264
+ }
265
+ return void 0;
266
+ });
267
+ }
268
+ function authMiddleware(req) {
269
+ return __async(this, null, function* () {
270
+ var _a, _b;
271
+ if (req.headers.has(CUSTOM_HEADER_FOR_ACCESS_TOKEN)) {
272
+ throw new Error(`${CUSTOM_HEADER_FOR_ACCESS_TOKEN} is set which is for internal use only`);
273
+ } else if (req.nextUrl.pathname === CALLBACK_PATH || req.nextUrl.pathname === LOGOUT_PATH) {
274
+ return import_server.NextResponse.next();
275
+ }
276
+ const accessToken = (_a = req.cookies.get(ACCESS_TOKEN_COOKIE_NAME)) == null ? void 0 : _a.value;
277
+ const refreshToken = (_b = req.cookies.get(REFRESH_TOKEN_COOKIE_NAME)) == null ? void 0 : _b.value;
278
+ if (req.nextUrl.pathname === USERINFO_PATH && refreshToken) {
279
+ const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken);
280
+ if (response.error === "unexpected") {
281
+ throw new Error("Unexpected error while refreshing access token");
282
+ } else if (response.error === "unauthorized") {
283
+ const headers2 = new Headers();
284
+ headers2.append("Set-Cookie", `${ACCESS_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`);
285
+ headers2.append("Set-Cookie", `${REFRESH_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`);
286
+ return new Response("Unauthorized", { status: 401, headers: headers2 });
287
+ } else {
288
+ const headers2 = new Headers(req.headers);
289
+ headers2.append(CUSTOM_HEADER_FOR_ACCESS_TOKEN, response.accessToken);
290
+ const nextResponse = import_server.NextResponse.next({
291
+ request: {
292
+ headers: headers2
293
+ }
294
+ });
295
+ nextResponse.cookies.set(ACCESS_TOKEN_COOKIE_NAME, response.accessToken, COOKIE_OPTIONS);
296
+ nextResponse.cookies.set(REFRESH_TOKEN_COOKIE_NAME, response.refreshToken, COOKIE_OPTIONS);
297
+ return nextResponse;
298
+ }
299
+ }
300
+ if (accessToken) {
301
+ const user = yield validateAccessTokenOrUndefined(accessToken);
302
+ if (user) {
303
+ return import_server.NextResponse.next();
304
+ }
305
+ }
306
+ if (refreshToken) {
307
+ const response = yield refreshTokenWithAccessAndRefreshToken(refreshToken);
308
+ if (response.error === "unexpected") {
309
+ throw new Error("Unexpected error while refreshing access token");
310
+ } else if (response.error === "unauthorized") {
311
+ const response2 = import_server.NextResponse.next();
312
+ response2.cookies.delete(ACCESS_TOKEN_COOKIE_NAME);
313
+ response2.cookies.delete(REFRESH_TOKEN_COOKIE_NAME);
314
+ return response2;
315
+ } else {
316
+ const headers2 = new Headers(req.headers);
317
+ headers2.append(CUSTOM_HEADER_FOR_ACCESS_TOKEN, response.accessToken);
318
+ const nextResponse = import_server.NextResponse.next({
319
+ request: {
320
+ headers: headers2
321
+ }
322
+ });
323
+ nextResponse.cookies.set(ACCESS_TOKEN_COOKIE_NAME, response.accessToken, COOKIE_OPTIONS);
324
+ nextResponse.cookies.set(REFRESH_TOKEN_COOKIE_NAME, response.refreshToken, COOKIE_OPTIONS);
325
+ return nextResponse;
326
+ }
327
+ }
328
+ return import_server.NextResponse.next();
329
+ });
330
+ }
331
+ function getRouteHandler(req, { params }) {
332
+ if (params.slug === "login") {
333
+ return loginGetHandler();
334
+ } else if (params.slug === "signup") {
335
+ return signupGetHandler();
336
+ } else if (params.slug === "callback") {
337
+ return callbackGetHandler(req);
338
+ } else if (params.slug === "userinfo") {
339
+ return userinfoGetHandler(req);
340
+ } else {
341
+ return new Response("", { status: 404 });
342
+ }
343
+ }
344
+ function postRouteHandler(req, { params }) {
345
+ if (params.slug === "logout") {
346
+ return logoutPostHandler(req);
347
+ } else {
348
+ return new Response("", { status: 404 });
349
+ }
350
+ }
351
+ function loginGetHandler() {
352
+ const state = randomState();
353
+ const authorize_url = authUrlOrigin + "/propelauth/ssr/authorize?redirect_uri=" + redirectUri + "&state=" + state;
354
+ return new Response(null, {
355
+ status: 302,
356
+ headers: {
357
+ Location: authorize_url,
358
+ "Set-Cookie": `${STATE_COOKIE_NAME}=${state}; Path=/; HttpOnly; Secure; SameSite=Lax`
359
+ }
360
+ });
361
+ }
362
+ function signupGetHandler() {
363
+ const state = randomState();
364
+ const authorize_url = authUrlOrigin + "/propelauth/ssr/authorize?redirect_uri=" + redirectUri + "&state=" + state + "&signup=true";
365
+ return new Response(null, {
366
+ status: 302,
367
+ headers: {
368
+ Location: authorize_url,
369
+ "Set-Cookie": `${STATE_COOKIE_NAME}=${state}; Path=/; HttpOnly; Secure; SameSite=Lax`
370
+ }
371
+ });
372
+ }
373
+ function callbackGetHandler(req) {
374
+ return __async(this, null, function* () {
375
+ var _a;
376
+ const oauthState = (_a = req.cookies.get(STATE_COOKIE_NAME)) == null ? void 0 : _a.value;
377
+ if (!oauthState || oauthState.length !== 64) {
378
+ console.log("No oauth state found");
379
+ return new Response(null, { status: 302, headers: { Location: LOGIN_PATH } });
380
+ }
381
+ const queryParams = req.nextUrl.searchParams;
382
+ const state = queryParams.get("state");
383
+ const code = queryParams.get("code");
384
+ if (state !== oauthState) {
385
+ console.log("Mismatch between states, redirecting to login");
386
+ return new Response(null, { status: 302, headers: { Location: LOGIN_PATH } });
387
+ }
388
+ const oauth_token_body = {
389
+ redirect_uri: redirectUri,
390
+ code
391
+ };
392
+ const url = `${authUrlOrigin}/propelauth/ssr/token`;
393
+ const response = yield fetch(url, {
394
+ method: "POST",
395
+ body: JSON.stringify(oauth_token_body),
396
+ headers: {
397
+ "Content-Type": "application/json",
398
+ Authorization: "Bearer " + integrationApiKey
399
+ }
400
+ });
401
+ if (response.ok) {
402
+ const data = yield response.json();
403
+ const accessToken = data.access_token;
404
+ const user = yield validateAccessToken(accessToken);
405
+ const path = postLoginPathFn(user);
406
+ if (!path) {
407
+ console.log("postLoginPathFn returned undefined");
408
+ return new Response("Unexpected error", { status: 500 });
409
+ }
410
+ const headers2 = new Headers();
411
+ headers2.append("Location", path);
412
+ headers2.append("Set-Cookie", `${ACCESS_TOKEN_COOKIE_NAME}=${accessToken}; Path=/; HttpOnly; Secure; SameSite=Lax`);
413
+ headers2.append("Set-Cookie", `${REFRESH_TOKEN_COOKIE_NAME}=${data.refresh_token}; Path=/; HttpOnly; Secure; SameSite=Lax`);
414
+ return new Response(null, {
415
+ status: 302,
416
+ headers: headers2
417
+ });
418
+ } else if (response.status === 401) {
419
+ return new Response("Unexpected error", { status: 500 });
420
+ } else {
421
+ return new Response("Unexpected error", { status: 500 });
422
+ }
423
+ });
424
+ }
425
+ function userinfoGetHandler(req) {
426
+ return __async(this, null, function* () {
427
+ var _a;
428
+ const accessToken = req.headers.get(CUSTOM_HEADER_FOR_ACCESS_TOKEN) || ((_a = req.cookies.get(ACCESS_TOKEN_COOKIE_NAME)) == null ? void 0 : _a.value);
429
+ if (accessToken) {
430
+ const path = `${authUrlOrigin}/propelauth/oauth/userinfo`;
431
+ const response = yield fetch(path, {
432
+ headers: {
433
+ "Content-Type": "application/json",
434
+ "Authorization": "Bearer " + accessToken
435
+ }
436
+ });
437
+ if (response.ok) {
438
+ const data = yield response.json();
439
+ const user = new User(
440
+ data.user_id,
441
+ data.email,
442
+ toOrgIdToOrgMemberInfo(data.org_id_to_org_info),
443
+ data.first_name,
444
+ data.last_name,
445
+ data.username,
446
+ data.legacy_user_id,
447
+ data.impersonator_user_id
448
+ );
449
+ return new Response(JSON.stringify(user), {
450
+ status: 200,
451
+ headers: {
452
+ "Content-Type": "application/json"
453
+ }
454
+ });
455
+ } else if (response.status === 401) {
456
+ return new Response(null, { status: 401 });
457
+ } else {
458
+ return new Response(null, { status: 500 });
459
+ }
460
+ }
461
+ return new Response(null, { status: 401 });
462
+ });
463
+ }
464
+ function refreshTokenWithAccessAndRefreshToken(refreshToken) {
465
+ return __async(this, null, function* () {
466
+ const body = {
467
+ refresh_token: refreshToken
468
+ };
469
+ const url = `${authUrlOrigin}/api/backend/v1/refresh_token`;
470
+ const response = yield fetch(url, {
471
+ method: "POST",
472
+ body: JSON.stringify(body),
473
+ headers: {
474
+ "Content-Type": "application/json",
475
+ Authorization: "Bearer " + integrationApiKey
476
+ }
477
+ });
478
+ if (response.ok) {
479
+ const data = yield response.json();
480
+ const newRefreshToken = data.refresh_token;
481
+ const {
482
+ access_token: accessToken,
483
+ expires_at_seconds: expiresAtSeconds
484
+ } = data.access_token;
485
+ return {
486
+ refreshToken: newRefreshToken,
487
+ accessToken,
488
+ error: "none"
489
+ };
490
+ } else if (response.status === 400) {
491
+ return { error: "unauthorized" };
492
+ } else {
493
+ return { error: "unexpected" };
494
+ }
495
+ });
496
+ }
497
+ function logoutPostHandler(req) {
498
+ return __async(this, null, function* () {
499
+ var _a;
500
+ const refresh_token = (_a = req.cookies.get(REFRESH_TOKEN_COOKIE_NAME)) == null ? void 0 : _a.value;
501
+ if (!refresh_token) {
502
+ const headers3 = new Headers();
503
+ headers3.append("Set-Cookie", `${ACCESS_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`);
504
+ headers3.append("Set-Cookie", `${REFRESH_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`);
505
+ return new Response(null, { status: 200, headers: headers3 });
506
+ }
507
+ const logoutBody = { refresh_token };
508
+ const url = `${authUrlOrigin}/api/backend/v1/logout`;
509
+ const response = yield fetch(url, {
510
+ method: "POST",
511
+ body: JSON.stringify(logoutBody),
512
+ headers: {
513
+ "Content-Type": "application/json",
514
+ Authorization: "Bearer " + integrationApiKey
515
+ }
516
+ });
517
+ if (!response.ok) {
518
+ console.log(
519
+ "Unable to logout, clearing cookies and continuing anyway",
520
+ response.status,
521
+ response.statusText
522
+ );
523
+ }
524
+ const headers2 = new Headers();
525
+ headers2.append("Set-Cookie", `${ACCESS_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`);
526
+ headers2.append("Set-Cookie", `${REFRESH_TOKEN_COOKIE_NAME}=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0`);
527
+ return new Response(null, { status: 200, headers: headers2 });
528
+ });
529
+ }
530
+ function validateAccessTokenOrUndefined(accessToken) {
531
+ return __async(this, null, function* () {
532
+ try {
533
+ return yield validateAccessToken(accessToken);
534
+ } catch (err) {
535
+ if (err instanceof ConfigurationException) {
536
+ throw err;
537
+ } else if (err instanceof UnauthorizedException) {
538
+ return void 0;
539
+ } else {
540
+ console.log("Error validating access token", err);
541
+ return void 0;
542
+ }
543
+ }
544
+ });
545
+ }
546
+ function validateAccessToken(accessToken) {
547
+ return __async(this, null, function* () {
548
+ let publicKey;
549
+ try {
550
+ publicKey = yield publicKeyPromise;
551
+ } catch (err) {
552
+ console.error("Verifier key is invalid. Make sure it's specified correctly, including the newlines.", err);
553
+ throw new ConfigurationException("Invalid verifier key");
554
+ }
555
+ if (!accessToken) {
556
+ throw new UnauthorizedException("No access token provided");
557
+ }
558
+ let accessTokenWithoutBearer = accessToken;
559
+ if (accessToken.toLowerCase().startsWith("bearer ")) {
560
+ accessTokenWithoutBearer = accessToken.substring("bearer ".length);
561
+ }
562
+ try {
563
+ const { payload } = yield jose.jwtVerify(accessTokenWithoutBearer, publicKey, {
564
+ issuer: authUrlOrigin,
565
+ algorithms: ["RS256"]
566
+ });
567
+ return toUser(payload);
568
+ } catch (e) {
569
+ if (e instanceof Error) {
570
+ throw new UnauthorizedException(e.message);
571
+ } else {
572
+ throw new UnauthorizedException("Unable to decode jwt");
573
+ }
574
+ }
575
+ });
576
+ }
577
+ return {
578
+ getUser,
579
+ getUserOrRedirect,
580
+ validateAccessToken,
581
+ validateAccessTokenOrUndefined,
582
+ getRouteHandler,
583
+ postRouteHandler,
584
+ authMiddleware
585
+ };
586
+ }
587
+ function randomState() {
588
+ const randomBytes = crypto.getRandomValues(new Uint8Array(32));
589
+ return Array.from(randomBytes).map((b) => b.toString(16).padStart(2, "0")).join("");
590
+ }
591
+
592
+ // src/server/validators.ts
593
+ function validateAuthUrl(authUrl) {
594
+ try {
595
+ return new URL(authUrl);
596
+ } catch (e) {
597
+ console.error("Invalid authUrl", e);
598
+ throw new Error("Unable to initialize auth client");
599
+ }
600
+ }
601
+
602
+ // src/server/auth.ts
603
+ function initializeAuth(opts) {
604
+ const authUrl = validateAuthUrl(opts.authUrl).origin;
605
+ const postLoginPathFn = opts.postLoginRedirectPathFn || function() {
606
+ return "/";
607
+ };
608
+ return getServerActions({
609
+ authUrlOrigin: authUrl,
610
+ verifierKey: opts.verifierKey,
611
+ redirectUri: opts.redirectUri,
612
+ integrationApiKey: opts.integrationApiKey,
613
+ postLoginPathFn
614
+ });
615
+ }
616
+ // Annotate the CommonJS export names for ESM import in node:
617
+ 0 && (module.exports = {
618
+ ConfigurationException,
619
+ UnauthorizedException,
620
+ initializeAuth
621
+ });
622
+ //# sourceMappingURL=index.js.map