@leaguebrain/provenance 0.0.0-stage → 0.14.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/dist/index.js ADDED
@@ -0,0 +1,551 @@
1
+ // src/helpers/cookies.ts
2
+ var chunkIndex = (cookieName, sessionCookieName) => {
3
+ const prefix = `${sessionCookieName}-`;
4
+ if (!cookieName.startsWith(prefix)) {
5
+ return null;
6
+ }
7
+ const suffix = cookieName.slice(prefix.length);
8
+ if (!/^\d+$/.test(suffix)) {
9
+ return null;
10
+ }
11
+ return parseInt(suffix);
12
+ };
13
+ var isSessionChunkCookie = (cookieName, sessionCookieName) => chunkIndex(cookieName, sessionCookieName) !== null;
14
+ var chunkSessionCookies = (session) => {
15
+ const maxCookieSize = 3500;
16
+ const fullCookie = JSON.stringify(session);
17
+ const chunksCount = Math.ceil(fullCookie.length / maxCookieSize);
18
+ const chunks = [...Array(chunksCount).keys()].map(
19
+ (i) => fullCookie.substring(i * maxCookieSize, (i + 1) * maxCookieSize)
20
+ );
21
+ return chunks;
22
+ };
23
+ var dechunkSessionCookies = (cookies, options) => {
24
+ const sessionChunkCookies = cookies.flatMap((cookie) => {
25
+ const index = chunkIndex(cookie.name, options.sessionCookieName);
26
+ return index !== null ? [{ value: cookie.value, index }] : [];
27
+ });
28
+ if (sessionChunkCookies.length > 0) {
29
+ const sorted = sessionChunkCookies.sort((a, b) => a.index - b.index);
30
+ const fullCookie = sorted.reduce((prev, current) => prev + current.value, "");
31
+ return fullCookie;
32
+ } else {
33
+ return null;
34
+ }
35
+ };
36
+
37
+ // src/helpers/encoding.ts
38
+ var bytesToBinary = (bytes) => {
39
+ let binary = "";
40
+ for (let i = 0; i < bytes.length; i++) {
41
+ binary += String.fromCharCode(bytes[i]);
42
+ }
43
+ return binary;
44
+ };
45
+ var binaryToBytes = (binary) => {
46
+ const bytes = new Uint8Array(binary.length);
47
+ for (let i = 0; i < binary.length; i++) {
48
+ bytes[i] = binary.charCodeAt(i);
49
+ }
50
+ return bytes;
51
+ };
52
+ var encodeBase64 = (bytes) => btoa(bytesToBinary(bytes));
53
+ var decodeBase64 = (data) => binaryToBytes(atob(data));
54
+ var encodeBase64urlNoPadding = (bytes) => encodeBase64(bytes).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/, "");
55
+ var b64Encode = (data) => {
56
+ const encoder = new TextEncoder();
57
+ return encodeBase64(encoder.encode(data));
58
+ };
59
+ var b64Decode = (data) => {
60
+ const decoder = new TextDecoder();
61
+ return decoder.decode(decodeBase64(data), {});
62
+ };
63
+
64
+ // src/helpers/logs.ts
65
+ var logStarter = (...rest) => console.log("\x1B[36m%s\x1B[0m", "provenance:", ...rest);
66
+
67
+ // src/helpers/referrer.ts
68
+ var sanitizeReferrer = (referrer) => {
69
+ if (!referrer) {
70
+ return null;
71
+ }
72
+ if (!referrer.startsWith("/") || referrer.startsWith("//") || referrer.startsWith("/\\")) {
73
+ return null;
74
+ }
75
+ return referrer;
76
+ };
77
+
78
+ // src/resolvers/locals.ts
79
+ var localsResolver = () => async (context, resolve, logging) => {
80
+ if (logging) logStarter("locals");
81
+ let session;
82
+ try {
83
+ session = context.session.getCookie();
84
+ } catch (e) {
85
+ console.error("provenance:", e);
86
+ context.session.deleteCookie();
87
+ session = null;
88
+ }
89
+ context.locals.session = session;
90
+ return await resolve();
91
+ };
92
+
93
+ // src/resolvers/login.ts
94
+ var loginResolver = () => async (context, resolve, logging) => {
95
+ if (context.routes.login.is) {
96
+ const session = context.locals.session;
97
+ const referrer = sanitizeReferrer(context.oauth.referrer);
98
+ if (session === null) {
99
+ if (logging) logStarter("login");
100
+ await context.oauth.redirectLogin(referrer);
101
+ } else {
102
+ return referrer ? context.routes.redirect(referrer) : context.routes.home.redirect();
103
+ }
104
+ }
105
+ return await resolve();
106
+ };
107
+
108
+ // src/resolvers/logout.ts
109
+ var logoutResolver = () => async (context, resolve, logging) => {
110
+ if (context.routes.logout.is) {
111
+ const session = context.locals.session;
112
+ const referrer = sanitizeReferrer(context.oauth.referrer);
113
+ if (session !== null) {
114
+ if (logging) logStarter("logout");
115
+ context.session.deleteCookie();
116
+ context.locals.session = null;
117
+ }
118
+ return referrer ? context.routes.redirect(referrer) : context.routes.home.redirect();
119
+ }
120
+ return await resolve();
121
+ };
122
+
123
+ // src/resolvers/redirect-uri.ts
124
+ var redirectUriResolver = () => async (context, resolve, logging) => {
125
+ if (context.routes.redirectUri.is) {
126
+ if (logging) logStarter("redirectUri");
127
+ let referrer = void 0;
128
+ try {
129
+ const expectedState = context.checks.state.use();
130
+ const codeVerifier = context.checks.pkce.use();
131
+ const { code, state } = context.oauth.processAuthResponse(expectedState);
132
+ referrer = sanitizeReferrer(state.referrer) ?? void 0;
133
+ const tokens = await context.oauth.requestToken(codeVerifier, code);
134
+ const session = context.session.create(tokens);
135
+ context.session.deleteCookie();
136
+ context.session.setCookie(session);
137
+ } catch (e) {
138
+ console.error("provenance:", e);
139
+ }
140
+ if (referrer) {
141
+ context.routes.redirect(referrer);
142
+ } else {
143
+ context.routes.home.redirect();
144
+ }
145
+ }
146
+ return await resolve();
147
+ };
148
+
149
+ // src/resolvers/refresh.ts
150
+ var refreshResolver = (options) => {
151
+ return async (context, resolve, logging) => {
152
+ const session = context.locals.session;
153
+ if (session !== null && Date.now() >= session.accessExpiresAt - options.eagerRefresh) {
154
+ if (logging) logStarter("refresh");
155
+ const destroySession = () => {
156
+ context.session.deleteCookie();
157
+ context.locals.session = null;
158
+ };
159
+ if (session.refreshExpiresAt === void 0 || Date.now() < session.refreshExpiresAt) {
160
+ try {
161
+ const newTokens = await context.oauth.refresh(session.refreshToken);
162
+ const newSession = context.session.create(newTokens);
163
+ destroySession();
164
+ context.session.setCookie(newSession);
165
+ context.locals.session = newSession;
166
+ } catch (e) {
167
+ console.error("provenance:", e);
168
+ destroySession();
169
+ }
170
+ } else {
171
+ destroySession();
172
+ }
173
+ }
174
+ return await resolve();
175
+ };
176
+ };
177
+
178
+ // src/resolvers/signup.ts
179
+ var signupResolver = () => async (context, resolve, logging) => {
180
+ if (context.routes.signup.is) {
181
+ const session = context.locals.session;
182
+ const referrer = sanitizeReferrer(context.oauth.referrer);
183
+ if (session === null) {
184
+ if (logging) logStarter("signup");
185
+ await context.oauth.redirectSignup(referrer);
186
+ } else {
187
+ return referrer ? context.routes.redirect(referrer) : context.routes.home.redirect();
188
+ }
189
+ }
190
+ return await resolve();
191
+ };
192
+
193
+ // src/tokens.ts
194
+ var TokenRequestResult = class {
195
+ body;
196
+ constructor(body) {
197
+ this.body = body;
198
+ }
199
+ string(field) {
200
+ const value = this.body[field];
201
+ return typeof value === "string" ? value : void 0;
202
+ }
203
+ requireString(field) {
204
+ const value = this.string(field);
205
+ if (value === void 0) {
206
+ throw new Error(`Missing or invalid '${field}' field`);
207
+ }
208
+ return value;
209
+ }
210
+ hasErrorCode() {
211
+ return this.string("error") !== void 0;
212
+ }
213
+ errorCode() {
214
+ return this.requireString("error");
215
+ }
216
+ hasErrorDescription() {
217
+ return this.string("error_description") !== void 0;
218
+ }
219
+ errorDescription() {
220
+ return this.requireString("error_description");
221
+ }
222
+ hasErrorURI() {
223
+ return this.string("error_uri") !== void 0;
224
+ }
225
+ errorURI() {
226
+ return this.requireString("error_uri");
227
+ }
228
+ hasState() {
229
+ return this.string("state") !== void 0;
230
+ }
231
+ state() {
232
+ return this.requireString("state");
233
+ }
234
+ tokenType() {
235
+ return this.requireString("token_type");
236
+ }
237
+ accessToken() {
238
+ return this.requireString("access_token");
239
+ }
240
+ accessTokenExpiresInSeconds() {
241
+ const value = this.body.expires_in;
242
+ if (typeof value !== "number") {
243
+ throw new Error(`Missing or invalid 'expires_in' field`);
244
+ }
245
+ return value;
246
+ }
247
+ accessTokenExpiresAt() {
248
+ return new Date(Date.now() + this.accessTokenExpiresInSeconds() * 1e3);
249
+ }
250
+ hasRefreshToken() {
251
+ return this.string("refresh_token") !== void 0;
252
+ }
253
+ refreshToken() {
254
+ return this.requireString("refresh_token");
255
+ }
256
+ hasScopes() {
257
+ return this.string("scope") !== void 0;
258
+ }
259
+ scopes() {
260
+ return this.requireString("scope").split(" ");
261
+ }
262
+ };
263
+
264
+ // src/modules/checks.ts
265
+ var STATE_MAX_AGE = 60 * 5;
266
+ var STATE_COOKIE_NAME = "state";
267
+ var PKCE_MAX_AGE = 60 * 5;
268
+ var PKCE_COOKIE_NAME = "pkce-code-verifier";
269
+ var generateRandomValue = () => {
270
+ const randomValues = new Uint8Array(32);
271
+ crypto.getRandomValues(randomValues);
272
+ return encodeBase64urlNoPadding(randomValues);
273
+ };
274
+ var generateCodeVerifier = () => generateRandomValue();
275
+ var generateState = () => generateRandomValue();
276
+ var createS256CodeChallenge = async (codeVerifier) => {
277
+ const codeChallengeBytes = await crypto.subtle.digest(
278
+ "SHA-256",
279
+ new TextEncoder().encode(codeVerifier)
280
+ );
281
+ return encodeBase64urlNoPadding(new Uint8Array(codeChallengeBytes));
282
+ };
283
+ var c = () => {
284
+ return {
285
+ state: {
286
+ create(data) {
287
+ const value = b64Encode(JSON.stringify({ ...data, random: generateState() }));
288
+ const cookie = {
289
+ name: STATE_COOKIE_NAME,
290
+ value,
291
+ options: {
292
+ path: "/",
293
+ maxAge: STATE_MAX_AGE
294
+ }
295
+ };
296
+ return { state: value, cookie };
297
+ },
298
+ use(cookies) {
299
+ const state = cookies.get(STATE_COOKIE_NAME);
300
+ cookies.delete(STATE_COOKIE_NAME, { path: "/" });
301
+ if (state !== void 0) {
302
+ return state;
303
+ } else {
304
+ throw new Error("State not found in cookies");
305
+ }
306
+ },
307
+ decode(state) {
308
+ const { random: _random, ...data } = JSON.parse(b64Decode(state));
309
+ return data;
310
+ }
311
+ },
312
+ pkce: {
313
+ async create() {
314
+ const codeVerifier = generateCodeVerifier();
315
+ const codeChallenge = await createS256CodeChallenge(codeVerifier);
316
+ const cookie = {
317
+ name: PKCE_COOKIE_NAME,
318
+ value: codeVerifier,
319
+ options: {
320
+ path: "/",
321
+ maxAge: PKCE_MAX_AGE
322
+ }
323
+ };
324
+ return { codeChallenge, cookie };
325
+ },
326
+ use(cookies) {
327
+ const codeVerifier = cookies.get(PKCE_COOKIE_NAME);
328
+ cookies.delete(PKCE_COOKIE_NAME, { path: "/" });
329
+ if (codeVerifier !== void 0) {
330
+ return codeVerifier;
331
+ } else {
332
+ throw new Error("code_verifier not found in cookies");
333
+ }
334
+ }
335
+ }
336
+ };
337
+ };
338
+
339
+ // src/modules/oauth.ts
340
+ async function processTokensResponse(tokensResponse) {
341
+ const data = await tokensResponse.json();
342
+ if (typeof data !== "object" || data === null) {
343
+ throw new Error("Unexpected response");
344
+ }
345
+ const result = new TokenRequestResult(data);
346
+ if (result.hasErrorCode()) {
347
+ const error = result.errorCode();
348
+ const errorDescription = result.errorDescription();
349
+ throw new Error(`${error}: ${errorDescription}`);
350
+ }
351
+ return result;
352
+ }
353
+ var o = (modules, provider, options) => {
354
+ return {
355
+ /**
356
+ * create a redirect to the auth server for the user to login
357
+ * @param redirectUriOrigin origin for redirect uri.. typically the origin of the website that is logging in
358
+ * @param referrer the path that initiated the login
359
+ * @param setCookie a callback that will be used to set oauth check values in cookies to be consumed by the redirect uri handler
360
+ * @returns the generated auth server url
361
+ */
362
+ async login(redirectUriOrigin, referrer, setCookie) {
363
+ const stateCheck = modules.checks.state.create(referrer ? { referrer } : {});
364
+ const pkceCheck = await modules.checks.pkce.create();
365
+ const redirectUri = new URL(options.redirectUriPathname, redirectUriOrigin);
366
+ const url = provider.endpoints.createLoginUrl(redirectUri.toString(), {
367
+ state: stateCheck.state,
368
+ codeChallenge: pkceCheck.codeChallenge
369
+ });
370
+ setCookie(stateCheck.cookie.name, stateCheck.cookie.value, stateCheck.cookie.options);
371
+ setCookie(pkceCheck.cookie.name, pkceCheck.cookie.value, pkceCheck.cookie.options);
372
+ return url.toString();
373
+ },
374
+ /**
375
+ * create a redirect to the auth server for the user to login
376
+ * @param redirectUriOrigin origin for redirect uri.. typically the origin of the website that is logging in
377
+ * @param referrer the path that initiated the login
378
+ * @param setCookie a callback that will be used to set oauth check values in cookies to be consumed by the redirect uri handler
379
+ * @returns the generated auth server url
380
+ */
381
+ async signup(redirectUriOrigin, referrer, setCookie) {
382
+ const stateCheck = modules.checks.state.create(referrer ? { referrer } : {});
383
+ const pkceCheck = await modules.checks.pkce.create();
384
+ const redirectUri = new URL(options.redirectUriPathname, redirectUriOrigin);
385
+ const url = provider.endpoints.createSignupUrl(redirectUri.toString(), {
386
+ state: stateCheck.state,
387
+ codeChallenge: pkceCheck.codeChallenge
388
+ });
389
+ setCookie(stateCheck.cookie.name, stateCheck.cookie.value, stateCheck.cookie.options);
390
+ setCookie(pkceCheck.cookie.name, pkceCheck.cookie.value, pkceCheck.cookie.options);
391
+ return url.toString();
392
+ },
393
+ /**
394
+ * post to the oauth logout endpoint to destroy the oauth session (not the session stored in the cookies)
395
+ * @param fetch
396
+ */
397
+ async logout(fetch, session) {
398
+ const { url, body } = provider.endpoints.createLogoutUrl(session);
399
+ await fetch(url, body);
400
+ },
401
+ /**
402
+ * post to the oauth token endpoint to request a new set of tokens
403
+ * @param fetchRefreshedTokens
404
+ * @param refreshToken refreshToken as stored in session
405
+ * @returns fresh tokens
406
+ */
407
+ async refresh(fetchRefreshedTokens, refreshToken) {
408
+ const url = provider.endpoints.createTokenUrl();
409
+ const response = await fetchRefreshedTokens(url, {
410
+ client_id: provider.authServer.clientId,
411
+ client_secret: provider.authServer.clientSecret,
412
+ grant_type: "refresh_token",
413
+ refresh_token: refreshToken
414
+ });
415
+ return processTokensResponse(response);
416
+ },
417
+ /**
418
+ * process the redirect from the oauth auth endpoint with a one time authorization code in url params
419
+ * @param url the url (with params such as code) that the auth server redirects to after user logs in (get from the request event on redirectUri)
420
+ * @param expectedState state stored in a cookie by this client at the start of the auth flow
421
+ * @returns one time authorization code to be used with the token endpoint
422
+ */
423
+ processAuthResponse(url, expectedState) {
424
+ const code = url.searchParams.get("code");
425
+ const state = url.searchParams.get("state");
426
+ if (!code) {
427
+ throw new Error(`auth response code not found in search params`);
428
+ }
429
+ if (!state) {
430
+ throw new Error(`auth response state not found in search params`);
431
+ }
432
+ if (state !== expectedState) {
433
+ throw new Error(`auth response state did not match stored expected state`);
434
+ }
435
+ return {
436
+ code,
437
+ state: modules.checks.state.decode(state)
438
+ };
439
+ },
440
+ /**
441
+ * request a set of tokens from the oauth token endpoint using a one time authorization code
442
+ * @param fetchRequestToken callback that contains the fetch call
443
+ * @returns brand new tokens
444
+ */
445
+ async requestToken(fetchRequestToken) {
446
+ const url = provider.endpoints.createTokenUrl();
447
+ const authorizationCodeGrantResponse = await fetchRequestToken(url, {
448
+ clientId: provider.authServer.clientId,
449
+ clientSecret: provider.authServer.clientSecret,
450
+ redirectUri: options.redirectUriPathname
451
+ });
452
+ return processTokensResponse(authorizationCodeGrantResponse);
453
+ }
454
+ };
455
+ };
456
+
457
+ // src/modules/routes.ts
458
+ var r = (options) => {
459
+ return {
460
+ redirectUri: {
461
+ pathname: options.redirectUriPathname
462
+ },
463
+ login: {
464
+ pathname: options.loginPathname
465
+ },
466
+ signup: {
467
+ pathname: options.signupPathname
468
+ },
469
+ logout: {
470
+ pathname: options.logoutPathname
471
+ },
472
+ refresh: {
473
+ pathname: options.refreshPathname
474
+ },
475
+ home: {
476
+ pathname: options.homePathname
477
+ }
478
+ };
479
+ };
480
+
481
+ // src/modules/session.ts
482
+ var s = (provider, options) => {
483
+ return {
484
+ /**
485
+ * create a session object from a set of tokens
486
+ * @param tokens
487
+ * @returns session to be stored in cookies
488
+ */
489
+ create(tokens) {
490
+ const session = provider.session.transformTokens(tokens);
491
+ return provider.session.fixSession(session);
492
+ },
493
+ /**
494
+ * set the session object in cookies, splitting into chunks if too large
495
+ * @param cookies cookies from request event
496
+ * @param sessionCookieName
497
+ * @param session the session object to be set in cookies
498
+ */
499
+ setCookie(set, session) {
500
+ const validatedSession = provider.session.validateSession(session);
501
+ const chunks = chunkSessionCookies(validatedSession);
502
+ const maxAge = provider.session.sessionCookieAge(validatedSession);
503
+ chunks.forEach((chunk, i) => {
504
+ set(`${options.sessionCookieName}-${i}`, chunk, maxAge);
505
+ });
506
+ },
507
+ /**
508
+ * get the session object from cookies
509
+ * @param getAll call back for retrieving cookies
510
+ * @returns the session object stored in cookies or null if there is no session stored
511
+ */
512
+ getCookie(getAll) {
513
+ const session = dechunkSessionCookies(getAll(), {
514
+ sessionCookieName: options.sessionCookieName
515
+ });
516
+ if (session) {
517
+ const validatedSession = provider.session.validateSession(JSON.parse(session));
518
+ return validatedSession;
519
+ } else {
520
+ return null;
521
+ }
522
+ },
523
+ /**
524
+ * expire the session object in cookies
525
+ * @param cookies cookies from request event
526
+ * @param sessionCookieName
527
+ */
528
+ deleteCookie(getAll, _delete) {
529
+ const sessionChunkCookies = getAll().filter(
530
+ (cookie) => isSessionChunkCookie(cookie.name, options.sessionCookieName)
531
+ );
532
+ sessionChunkCookies.forEach((cookie) => {
533
+ _delete(cookie.name);
534
+ });
535
+ }
536
+ };
537
+ };
538
+ export {
539
+ TokenRequestResult,
540
+ c,
541
+ localsResolver,
542
+ loginResolver,
543
+ logoutResolver,
544
+ o,
545
+ r,
546
+ redirectUriResolver,
547
+ refreshResolver,
548
+ s,
549
+ signupResolver
550
+ };
551
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/cookies.ts","../src/helpers/encoding.ts","../src/helpers/logs.ts","../src/helpers/referrer.ts","../src/resolvers/locals.ts","../src/resolvers/login.ts","../src/resolvers/logout.ts","../src/resolvers/redirect-uri.ts","../src/resolvers/refresh.ts","../src/resolvers/signup.ts","../src/tokens.ts","../src/modules/checks.ts","../src/modules/oauth.ts","../src/modules/routes.ts","../src/modules/session.ts"],"sourcesContent":["const chunkIndex = (cookieName: string, sessionCookieName: string): number | null => {\n\tconst prefix = `${sessionCookieName}-`;\n\tif (!cookieName.startsWith(prefix)) {\n\t\treturn null;\n\t}\n\n\tconst suffix = cookieName.slice(prefix.length);\n\tif (!/^\\d+$/.test(suffix)) {\n\t\treturn null;\n\t}\n\n\treturn parseInt(suffix);\n};\n\nexport const isSessionChunkCookie = (cookieName: string, sessionCookieName: string): boolean =>\n\tchunkIndex(cookieName, sessionCookieName) !== null;\n\nexport const chunkSessionCookies = (session: any) => {\n\tconst maxCookieSize = 3500;\n\tconst fullCookie = JSON.stringify(session);\n\n\tconst chunksCount = Math.ceil(fullCookie.length / maxCookieSize);\n\tconst chunks = [...Array(chunksCount).keys()].map((i) =>\n\t\tfullCookie.substring(i * maxCookieSize, (i + 1) * maxCookieSize)\n\t);\n\n\treturn chunks;\n};\n\nexport const dechunkSessionCookies = (\n\tcookies: { name: string; value: string }[],\n\toptions: { sessionCookieName: string }\n) => {\n\tconst sessionChunkCookies = cookies.flatMap((cookie) => {\n\t\tconst index = chunkIndex(cookie.name, options.sessionCookieName);\n\t\treturn index !== null ? [{ value: cookie.value, index }] : [];\n\t});\n\n\tif (sessionChunkCookies.length > 0) {\n\t\tconst sorted = sessionChunkCookies.sort((a, b) => a.index - b.index);\n\n\t\tconst fullCookie = sorted.reduce((prev, current) => prev + current.value, '');\n\n\t\treturn fullCookie;\n\t} else {\n\t\treturn null;\n\t}\n};\n","const bytesToBinary = (bytes: Uint8Array) => {\n\tlet binary = '';\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tbinary += String.fromCharCode(bytes[i]);\n\t}\n\treturn binary;\n};\n\nconst binaryToBytes = (binary: string) => {\n\tconst bytes = new Uint8Array(binary.length);\n\tfor (let i = 0; i < binary.length; i++) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\treturn bytes;\n};\n\nexport const encodeBase64 = (bytes: Uint8Array) => btoa(bytesToBinary(bytes));\n\nexport const decodeBase64 = (data: string) => binaryToBytes(atob(data));\n\nexport const encodeBase64urlNoPadding = (bytes: Uint8Array) =>\n\tencodeBase64(bytes).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');\n\nexport const decodeBase64urlIgnorePadding = (data: string) => {\n\tconst base64 = data.replaceAll('-', '+').replaceAll('_', '/').replace(/=+$/, '');\n\treturn decodeBase64(base64.padEnd(Math.ceil(base64.length / 4) * 4, '='));\n};\n\nexport const b64Encode = (data: string) => {\n\tconst encoder = new TextEncoder();\n\n\treturn encodeBase64(encoder.encode(data));\n};\n\nexport const b64Decode = (data: string) => {\n\tconst decoder = new TextDecoder();\n\n\treturn decoder.decode(decodeBase64(data), {});\n};\n","export const logStarter = (...rest: string[]) =>\n\tconsole.log('\\x1b[36m%s\\x1b[0m', 'provenance:', ...rest);\n","/**\n * only allow same-origin relative paths as redirect targets, guarding against\n * open redirects like `/login?referrer=https://evil.com` (or protocol-relative\n * `//evil.com` and backslash `/\\evil.com` variants)\n * @param referrer untrusted referrer (from url search params or oauth state)\n * @returns the referrer if it is a safe relative path, otherwise null\n */\nexport const sanitizeReferrer = (referrer: string | null | undefined): string | null => {\n\tif (!referrer) {\n\t\treturn null;\n\t}\n\n\tif (!referrer.startsWith('/') || referrer.startsWith('//') || referrer.startsWith('/\\\\')) {\n\t\treturn null;\n\t}\n\n\treturn referrer;\n};\n","import { logStarter } from '../helpers';\nimport type { Resolver } from './types';\n\nexport const localsResolver =\n\t<Session>(): Resolver<Session> =>\n\tasync (context, resolve, logging) => {\n\t\tif (logging) logStarter('locals');\n\n\t\tlet session: Session | null;\n\t\ttry {\n\t\t\tsession = context.session.getCookie();\n\t\t} catch (e) {\n\t\t\t// possibly need to redirect to an auth error page\n\t\t\tconsole.error('provenance:', e);\n\n\t\t\tcontext.session.deleteCookie();\n\t\t\tsession = null;\n\t\t}\n\n\t\tcontext.locals.session = session;\n\t\treturn await resolve();\n\t};\n","import { logStarter, sanitizeReferrer } from '../helpers';\nimport type { Resolver } from './types';\n\nexport const loginResolver =\n\t<Session>(): Resolver<Session> =>\n\tasync (context, resolve, logging) => {\n\t\tif (context.routes.login.is) {\n\t\t\tconst session = context.locals.session;\n\t\t\tconst referrer = sanitizeReferrer(context.oauth.referrer);\n\n\t\t\tif (session === null) {\n\t\t\t\tif (logging) logStarter('login');\n\n\t\t\t\tawait context.oauth.redirectLogin(referrer);\n\t\t\t} else {\n\t\t\t\treturn referrer ? context.routes.redirect(referrer) : context.routes.home.redirect();\n\t\t\t}\n\t\t}\n\t\treturn await resolve();\n\t};\n","import { logStarter, sanitizeReferrer } from '../helpers';\nimport { Resolver } from './types';\n\nexport const logoutResolver =\n\t<Session>(): Resolver<Session> =>\n\tasync (context, resolve, logging) => {\n\t\tif (context.routes.logout.is) {\n\t\t\tconst session = context.locals.session;\n\t\t\tconst referrer = sanitizeReferrer(context.oauth.referrer);\n\n\t\t\tif (session !== null) {\n\t\t\t\tif (logging) logStarter('logout');\n\n\t\t\t\tcontext.session.deleteCookie();\n\t\t\t\tcontext.locals.session = null;\n\t\t\t}\n\n\t\t\treturn referrer ? context.routes.redirect(referrer) : context.routes.home.redirect();\n\t\t}\n\t\treturn await resolve();\n\t};\n","import { logStarter, sanitizeReferrer } from '../helpers';\nimport { Resolver } from './types';\n\nexport const redirectUriResolver =\n\t<Session>(): Resolver<Session> =>\n\tasync (context, resolve, logging) => {\n\t\tif (context.routes.redirectUri.is) {\n\t\t\tif (logging) logStarter('redirectUri');\n\n\t\t\tlet referrer: string | undefined = undefined;\n\t\t\ttry {\n\t\t\t\t// state stored at beginning of authorization flow (right before login redirects to auth server)\n\t\t\t\tconst expectedState = context.checks.state.use();\n\n\t\t\t\t// nonce and code verifier stored at beginning of authorization flow (right before login redirects to auth server)\n\t\t\t\tconst codeVerifier = context.checks.pkce.use();\n\n\t\t\t\t// matching state allows this route to ensure the redirect from auth server originated from this application\n\t\t\t\t// the code returned (in url params) to this redirect uri will be used to get a token set from the oauth2 token endpoint\n\t\t\t\tconst { code, state } = context.oauth.processAuthResponse(expectedState);\n\n\t\t\t\t// set referrer, if available, for redirect\n\t\t\t\treferrer = sanitizeReferrer(state.referrer) ?? undefined;\n\n\t\t\t\t// make a request for tokens using the code and the matching code verifier\n\t\t\t\t// code verifier is required by the auth server to ensure the code matches the originator of the auth request\n\t\t\t\t// nonce allows this application to ensure that the tokens returned came from the same auth server that the code grant request was initiated with, similar to state\n\t\t\t\tconst tokens = await context.oauth.requestToken(codeVerifier, code);\n\n\t\t\t\t// turn the returned tokens into the session (including user, access token, refresh token)\n\t\t\t\tconst session = context.session.create(tokens);\n\t\t\t\tcontext.session.deleteCookie();\n\t\t\t\tcontext.session.setCookie(session);\n\t\t\t} catch (e) {\n\t\t\t\t// possibly need to redirect to an auth error page\n\t\t\t\tconsole.error('provenance:', e);\n\t\t\t}\n\n\t\t\tif (referrer) {\n\t\t\t\t// redirect to the actual route that the user was trying to access\n\t\t\t\tcontext.routes.redirect(referrer);\n\t\t\t} else {\n\t\t\t\t// if any of these checks throw an error (login took longer than the cookies were available), we should try the whole process again\n\t\t\t\t// also if somehow no referrer was set in the state\n\t\t\t\tcontext.routes.home.redirect();\n\t\t\t}\n\t\t}\n\t\treturn await resolve();\n\t};\n","import { logStarter } from '../helpers';\nimport { Resolver } from './types';\n\nexport const refreshResolver = <\n\tSession extends {\n\t\trefreshToken: string;\n\t\taccessExpiresAt: number;\n\t\trefreshExpiresAt?: number;\n\t}\n>(options: {\n\t/** in ms */\n\teagerRefresh: number;\n}): Resolver<Session> => {\n\treturn async (context, resolve, logging) => {\n\t\tconst session = context.locals.session;\n\n\t\t// attempt refresh if there is a session and the access token expires within the \"eagerRefresh\" threshold\n\t\tif (session !== null && Date.now() >= session.accessExpiresAt - options.eagerRefresh) {\n\t\t\tif (logging) logStarter('refresh');\n\n\t\t\tconst destroySession = () => {\n\t\t\t\tcontext.session.deleteCookie();\n\t\t\t\tcontext.locals.session = null;\n\t\t\t};\n\n\t\t\t// don't bother trying to refresh if your session has an expired refresh token\n\t\t\t// in practice, this should be true as the session cookie should expire at the same time as the refresh token\n\t\t\tif (session.refreshExpiresAt === undefined || Date.now() < session.refreshExpiresAt) {\n\t\t\t\ttry {\n\t\t\t\t\t// the access token has expired, so refresh with the refresh token\n\t\t\t\t\tconst newTokens = await context.oauth.refresh(session.refreshToken);\n\t\t\t\t\tconst newSession = context.session.create(newTokens);\n\n\t\t\t\t\tdestroySession();\n\t\t\t\t\tcontext.session.setCookie(newSession);\n\t\t\t\t\tcontext.locals.session = newSession;\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// destroy the session if an error occurs (likely in the oauth refresh flow)\n\t\t\t\t\tconsole.error('provenance:', e);\n\t\t\t\t\tdestroySession();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdestroySession();\n\t\t\t}\n\t\t}\n\t\treturn await resolve();\n\t};\n};\n","import { logStarter, sanitizeReferrer } from '../helpers';\nimport type { Resolver } from './types';\n\nexport const signupResolver =\n\t<Session>(): Resolver<Session> =>\n\tasync (context, resolve, logging) => {\n\t\tif (context.routes.signup.is) {\n\t\t\tconst session = context.locals.session;\n\t\t\tconst referrer = sanitizeReferrer(context.oauth.referrer);\n\n\t\t\tif (session === null) {\n\t\t\t\tif (logging) logStarter('signup');\n\n\t\t\t\tawait context.oauth.redirectSignup(referrer);\n\t\t\t} else {\n\t\t\t\treturn referrer ? context.routes.redirect(referrer) : context.routes.home.redirect();\n\t\t\t}\n\t\t}\n\t\treturn await resolve();\n\t};\n","/**\n * wraps the JSON body of an OAuth 2.0 token endpoint response (RFC 6749 section 5)\n */\nexport class TokenRequestResult {\n\tbody: object;\n\n\tconstructor(body: object) {\n\t\tthis.body = body;\n\t}\n\n\tprivate string(field: string): string | undefined {\n\t\tconst value = (this.body as Record<string, unknown>)[field];\n\t\treturn typeof value === 'string' ? value : undefined;\n\t}\n\n\tprivate requireString(field: string): string {\n\t\tconst value = this.string(field);\n\t\tif (value === undefined) {\n\t\t\tthrow new Error(`Missing or invalid '${field}' field`);\n\t\t}\n\t\treturn value;\n\t}\n\n\thasErrorCode(): boolean {\n\t\treturn this.string('error') !== undefined;\n\t}\n\n\terrorCode(): string {\n\t\treturn this.requireString('error');\n\t}\n\n\thasErrorDescription(): boolean {\n\t\treturn this.string('error_description') !== undefined;\n\t}\n\n\terrorDescription(): string {\n\t\treturn this.requireString('error_description');\n\t}\n\n\thasErrorURI(): boolean {\n\t\treturn this.string('error_uri') !== undefined;\n\t}\n\n\terrorURI(): string {\n\t\treturn this.requireString('error_uri');\n\t}\n\n\thasState(): boolean {\n\t\treturn this.string('state') !== undefined;\n\t}\n\n\tstate(): string {\n\t\treturn this.requireString('state');\n\t}\n\n\ttokenType(): string {\n\t\treturn this.requireString('token_type');\n\t}\n\n\taccessToken(): string {\n\t\treturn this.requireString('access_token');\n\t}\n\n\taccessTokenExpiresInSeconds(): number {\n\t\tconst value = (this.body as Record<string, unknown>).expires_in;\n\t\tif (typeof value !== 'number') {\n\t\t\tthrow new Error(`Missing or invalid 'expires_in' field`);\n\t\t}\n\t\treturn value;\n\t}\n\n\taccessTokenExpiresAt(): Date {\n\t\treturn new Date(Date.now() + this.accessTokenExpiresInSeconds() * 1000);\n\t}\n\n\thasRefreshToken(): boolean {\n\t\treturn this.string('refresh_token') !== undefined;\n\t}\n\n\trefreshToken(): string {\n\t\treturn this.requireString('refresh_token');\n\t}\n\n\thasScopes(): boolean {\n\t\treturn this.string('scope') !== undefined;\n\t}\n\n\tscopes(): string[] {\n\t\treturn this.requireString('scope').split(' ');\n\t}\n}\n","import type { Cookie, Cookies } from '../types';\nimport { b64Decode, b64Encode, encodeBase64urlNoPadding } from '../helpers';\n\nconst STATE_MAX_AGE = 60 * 5;\nconst STATE_COOKIE_NAME = 'state';\n\nconst PKCE_MAX_AGE = 60 * 5;\nconst PKCE_COOKIE_NAME = 'pkce-code-verifier';\n\nconst generateRandomValue = (): string => {\n\tconst randomValues = new Uint8Array(32);\n\tcrypto.getRandomValues(randomValues);\n\treturn encodeBase64urlNoPadding(randomValues);\n};\n\nconst generateCodeVerifier = (): string => generateRandomValue();\nconst generateState = (): string => generateRandomValue();\n\nconst createS256CodeChallenge = async (codeVerifier: string): Promise<string> => {\n\tconst codeChallengeBytes = await crypto.subtle.digest(\n\t\t'SHA-256',\n\t\tnew TextEncoder().encode(codeVerifier)\n\t);\n\treturn encodeBase64urlNoPadding(new Uint8Array(codeChallengeBytes));\n};\n\nexport const c = <State extends Record<string, any>>() => {\n\treturn {\n\t\tstate: {\n\t\t\tcreate(data: State): { state: string; cookie: Cookie } {\n\t\t\t\tconst value = b64Encode(JSON.stringify({ ...data, random: generateState() }));\n\n\t\t\t\tconst cookie = {\n\t\t\t\t\tname: STATE_COOKIE_NAME,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tpath: '/',\n\t\t\t\t\t\tmaxAge: STATE_MAX_AGE\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn { state: value, cookie };\n\t\t\t},\n\t\t\tuse(cookies: Cookies): string {\n\t\t\t\tconst state = cookies.get(STATE_COOKIE_NAME);\n\t\t\t\tcookies.delete(STATE_COOKIE_NAME, { path: '/' });\n\n\t\t\t\tif (state !== undefined) {\n\t\t\t\t\treturn state;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('State not found in cookies');\n\t\t\t\t}\n\t\t\t},\n\t\t\tdecode(state: string): State {\n\t\t\t\tconst { random: _random, ...data } = JSON.parse(b64Decode(state));\n\t\t\t\treturn data;\n\t\t\t}\n\t\t},\n\t\tpkce: {\n\t\t\tasync create(): Promise<{ codeChallenge: string; cookie: Cookie }> {\n\t\t\t\tconst codeVerifier = generateCodeVerifier();\n\t\t\t\tconst codeChallenge = await createS256CodeChallenge(codeVerifier);\n\n\t\t\t\tconst cookie = {\n\t\t\t\t\tname: PKCE_COOKIE_NAME,\n\t\t\t\t\tvalue: codeVerifier,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tpath: '/',\n\t\t\t\t\t\tmaxAge: PKCE_MAX_AGE\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn { codeChallenge, cookie };\n\t\t\t},\n\t\t\tuse(cookies: Cookies): string {\n\t\t\t\tconst codeVerifier = cookies.get(PKCE_COOKIE_NAME);\n\t\t\t\tcookies.delete(PKCE_COOKIE_NAME, { path: '/' });\n\n\t\t\t\tif (codeVerifier !== undefined) {\n\t\t\t\t\treturn codeVerifier;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('code_verifier not found in cookies');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n};\n\nexport type ChecksModule<State extends Record<string, any>> = ReturnType<typeof c<State>>;\n","import { TokenRequestResult } from '../tokens';\n\nimport type { SerializeOptions } from 'cookie';\n\nimport type { Provider } from '../providers/types';\nimport type { ChecksModule } from './checks';\n\nasync function processTokensResponse(tokensResponse: Response) {\n\tconst data = await tokensResponse.json();\n\tif (typeof data !== 'object' || data === null) {\n\t\tthrow new Error('Unexpected response');\n\t}\n\tconst result = new TokenRequestResult(data);\n\tif (result.hasErrorCode()) {\n\t\tconst error = result.errorCode();\n\t\tconst errorDescription = result.errorDescription();\n\t\tthrow new Error(`${error}: ${errorDescription}`);\n\t}\n\n\treturn result;\n}\n\nexport const o = <Session>(\n\tmodules: { checks: ChecksModule<{ referrer?: string }> },\n\tprovider: Provider<Session>,\n\toptions: { redirectUriPathname: string }\n) => {\n\treturn {\n\t\t/**\n\t\t * create a redirect to the auth server for the user to login\n\t\t * @param redirectUriOrigin origin for redirect uri.. typically the origin of the website that is logging in\n\t\t * @param referrer the path that initiated the login\n\t\t * @param setCookie a callback that will be used to set oauth check values in cookies to be consumed by the redirect uri handler\n\t\t * @returns the generated auth server url\n\t\t */\n\t\tasync login(\n\t\t\tredirectUriOrigin: string,\n\t\t\treferrer: string | null,\n\t\t\tsetCookie: (name: string, value: string, opts: SerializeOptions & { path: string }) => void\n\t\t) {\n\t\t\tconst stateCheck = modules.checks.state.create(referrer ? { referrer } : {});\n\t\t\tconst pkceCheck = await modules.checks.pkce.create();\n\n\t\t\tconst redirectUri = new URL(options.redirectUriPathname, redirectUriOrigin);\n\n\t\t\tconst url = provider.endpoints.createLoginUrl(redirectUri.toString(), {\n\t\t\t\tstate: stateCheck.state,\n\t\t\t\tcodeChallenge: pkceCheck.codeChallenge\n\t\t\t});\n\n\t\t\tsetCookie(stateCheck.cookie.name, stateCheck.cookie.value, stateCheck.cookie.options);\n\t\t\tsetCookie(pkceCheck.cookie.name, pkceCheck.cookie.value, pkceCheck.cookie.options);\n\n\t\t\treturn url.toString();\n\t\t},\n\t\t/**\n\t\t * create a redirect to the auth server for the user to login\n\t\t * @param redirectUriOrigin origin for redirect uri.. typically the origin of the website that is logging in\n\t\t * @param referrer the path that initiated the login\n\t\t * @param setCookie a callback that will be used to set oauth check values in cookies to be consumed by the redirect uri handler\n\t\t * @returns the generated auth server url\n\t\t */\n\t\tasync signup(\n\t\t\tredirectUriOrigin: string,\n\t\t\treferrer: string | null,\n\t\t\tsetCookie: (name: string, value: string, opts: SerializeOptions & { path: string }) => void\n\t\t) {\n\t\t\tconst stateCheck = modules.checks.state.create(referrer ? { referrer } : {});\n\t\t\tconst pkceCheck = await modules.checks.pkce.create();\n\n\t\t\tconst redirectUri = new URL(options.redirectUriPathname, redirectUriOrigin);\n\n\t\t\tconst url = provider.endpoints.createSignupUrl(redirectUri.toString(), {\n\t\t\t\tstate: stateCheck.state,\n\t\t\t\tcodeChallenge: pkceCheck.codeChallenge\n\t\t\t});\n\n\t\t\tsetCookie(stateCheck.cookie.name, stateCheck.cookie.value, stateCheck.cookie.options);\n\t\t\tsetCookie(pkceCheck.cookie.name, pkceCheck.cookie.value, pkceCheck.cookie.options);\n\n\t\t\treturn url.toString();\n\t\t},\n\t\t/**\n\t\t * post to the oauth logout endpoint to destroy the oauth session (not the session stored in the cookies)\n\t\t * @param fetch\n\t\t */\n\t\tasync logout(fetch: (url: URL, body?: URLSearchParams) => Promise<Response>, session: Session) {\n\t\t\tconst { url, body } = provider.endpoints.createLogoutUrl(session);\n\n\t\t\tawait fetch(url, body);\n\t\t},\n\t\t/**\n\t\t * post to the oauth token endpoint to request a new set of tokens\n\t\t * @param fetchRefreshedTokens\n\t\t * @param refreshToken refreshToken as stored in session\n\t\t * @returns fresh tokens\n\t\t */\n\t\tasync refresh(\n\t\t\tfetchRefreshedTokens: (\n\t\t\t\turl: URL,\n\t\t\t\tbody: {\n\t\t\t\t\tclient_id: string;\n\t\t\t\t\tclient_secret: string;\n\t\t\t\t\tgrant_type: 'refresh_token';\n\t\t\t\t\trefresh_token: string;\n\t\t\t\t}\n\t\t\t) => Promise<Response>,\n\t\t\trefreshToken: string\n\t\t) {\n\t\t\tconst url = provider.endpoints.createTokenUrl();\n\n\t\t\tconst response = await fetchRefreshedTokens(url, {\n\t\t\t\tclient_id: provider.authServer.clientId,\n\t\t\t\tclient_secret: provider.authServer.clientSecret,\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\trefresh_token: refreshToken\n\t\t\t});\n\n\t\t\treturn processTokensResponse(response);\n\t\t},\n\t\t/**\n\t\t * process the redirect from the oauth auth endpoint with a one time authorization code in url params\n\t\t * @param url the url (with params such as code) that the auth server redirects to after user logs in (get from the request event on redirectUri)\n\t\t * @param expectedState state stored in a cookie by this client at the start of the auth flow\n\t\t * @returns one time authorization code to be used with the token endpoint\n\t\t */\n\t\tprocessAuthResponse(url: URL, expectedState: string) {\n\t\t\t// ensure that the url params on the keycloak redirect-to-redirect_uri step of the flow are valid\n\t\t\tconst code = url.searchParams.get('code');\n\t\t\tconst state = url.searchParams.get('state');\n\n\t\t\tif (!code) {\n\t\t\t\tthrow new Error(`auth response code not found in search params`);\n\t\t\t}\n\n\t\t\tif (!state) {\n\t\t\t\tthrow new Error(`auth response state not found in search params`);\n\t\t\t}\n\n\t\t\tif (state !== expectedState) {\n\t\t\t\tthrow new Error(`auth response state did not match stored expected state`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcode,\n\t\t\t\tstate: modules.checks.state.decode(state)\n\t\t\t};\n\t\t},\n\t\t/**\n\t\t * request a set of tokens from the oauth token endpoint using a one time authorization code\n\t\t * @param fetchRequestToken callback that contains the fetch call\n\t\t * @returns brand new tokens\n\t\t */\n\t\tasync requestToken(\n\t\t\tfetchRequestToken: (\n\t\t\t\turl: URL,\n\t\t\t\tparams: {\n\t\t\t\t\tclientId: string;\n\t\t\t\t\tclientSecret: string;\n\t\t\t\t\tredirectUri: string;\n\t\t\t\t}\n\t\t\t) => Promise<Response>\n\t\t) {\n\t\t\tconst url = provider.endpoints.createTokenUrl();\n\n\t\t\tconst authorizationCodeGrantResponse = await fetchRequestToken(url, {\n\t\t\t\tclientId: provider.authServer.clientId,\n\t\t\t\tclientSecret: provider.authServer.clientSecret,\n\t\t\t\tredirectUri: options.redirectUriPathname\n\t\t\t});\n\n\t\t\treturn processTokensResponse(authorizationCodeGrantResponse);\n\t\t}\n\t};\n};\n\nexport type OAuthModule = ReturnType<typeof o>;\n","export const r = (options: {\n\tredirectUriPathname: string;\n\tloginPathname: string;\n\tsignupPathname: string;\n\tlogoutPathname: string;\n\trefreshPathname: string;\n\thomePathname: string;\n}) => {\n\treturn {\n\t\tredirectUri: {\n\t\t\tpathname: options.redirectUriPathname\n\t\t},\n\t\tlogin: {\n\t\t\tpathname: options.loginPathname\n\t\t},\n\t\tsignup: {\n\t\t\tpathname: options.signupPathname\n\t\t},\n\t\tlogout: {\n\t\t\tpathname: options.logoutPathname\n\t\t},\n\t\trefresh: {\n\t\t\tpathname: options.refreshPathname\n\t\t},\n\t\thome: {\n\t\t\tpathname: options.homePathname\n\t\t}\n\t};\n};\n\nexport type RoutesModule = ReturnType<typeof r>;\n","import type { TokenRequestResult } from '../tokens';\n\nimport type { Provider } from '../providers/types';\nimport {\n\tchunkSessionCookies,\n\tdechunkSessionCookies,\n\tisSessionChunkCookie\n} from '../helpers/cookies';\n\nexport const s = <Session>(provider: Provider<Session>, options: { sessionCookieName: string }) => {\n\treturn {\n\t\t/**\n\t\t * create a session object from a set of tokens\n\t\t * @param tokens\n\t\t * @returns session to be stored in cookies\n\t\t */\n\t\tcreate(tokens: TokenRequestResult): Session {\n\t\t\tconst session = provider.session.transformTokens(tokens);\n\n\t\t\treturn provider.session.fixSession(session);\n\t\t},\n\n\t\t/**\n\t\t * set the session object in cookies, splitting into chunks if too large\n\t\t * @param cookies cookies from request event\n\t\t * @param sessionCookieName\n\t\t * @param session the session object to be set in cookies\n\t\t */\n\t\tsetCookie(set: (name: string, value: string, maxAge: number) => void, session: Session) {\n\t\t\tconst validatedSession = provider.session.validateSession(session);\n\n\t\t\tconst chunks = chunkSessionCookies(validatedSession);\n\n\t\t\tconst maxAge = provider.session.sessionCookieAge(validatedSession);\n\n\t\t\tchunks.forEach((chunk, i) => {\n\t\t\t\tset(`${options.sessionCookieName}-${i}`, chunk, maxAge);\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * get the session object from cookies\n\t\t * @param getAll call back for retrieving cookies\n\t\t * @returns the session object stored in cookies or null if there is no session stored\n\t\t */\n\t\tgetCookie(getAll: () => { name: string; value: string }[]): Session | null {\n\t\t\tconst session = dechunkSessionCookies(getAll(), {\n\t\t\t\tsessionCookieName: options.sessionCookieName\n\t\t\t});\n\t\t\tif (session) {\n\t\t\t\tconst validatedSession = provider.session.validateSession(JSON.parse(session));\n\t\t\t\treturn validatedSession;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * expire the session object in cookies\n\t\t * @param cookies cookies from request event\n\t\t * @param sessionCookieName\n\t\t */\n\t\tdeleteCookie(getAll: () => { name: string; value: string }[], _delete: (name: string) => void) {\n\t\t\tconst sessionChunkCookies = getAll().filter((cookie) =>\n\t\t\t\tisSessionChunkCookie(cookie.name, options.sessionCookieName)\n\t\t\t);\n\n\t\t\tsessionChunkCookies.forEach((cookie) => {\n\t\t\t\t_delete(cookie.name);\n\t\t\t});\n\t\t}\n\t};\n};\n\nexport type SessionModule<Session> = ReturnType<typeof s<Session>>;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ import { C as Context } from '../context-C2cW461e.js';
2
+
3
+ declare const deleteSessionCookies: <RequestEvent, ProviderSession, AppSession>(createContext: (event: RequestEvent) => Context<ProviderSession, AppSession>) => (event: RequestEvent) => Promise<void>;
4
+
5
+ declare const protectRoute: <RequestEvent, ProviderSession, AppSession>(createContext: (event: RequestEvent) => Context<ProviderSession, AppSession>) => (event: RequestEvent) => Promise<AppSession & ({} | undefined)>;
6
+
7
+ declare const refresh: <RequestEvent, ProviderSession, AppSession extends {
8
+ refreshToken: string;
9
+ }>(createContext: (event: RequestEvent) => Context<ProviderSession, AppSession>) => (event: RequestEvent) => Promise<void>;
10
+
11
+ declare const login: <RequestEvent, ProviderSession, AppSession>(createContext: (event: RequestEvent) => Context<ProviderSession, AppSession>) => (event: RequestEvent) => Promise<void>;
12
+
13
+ declare const signup: <RequestEvent, ProviderSession, AppSession>(createContext: (event: RequestEvent) => Context<ProviderSession, AppSession>) => (event: RequestEvent) => Promise<void>;
14
+
15
+ declare const logout: <RequestEvent, ProviderSession, AppSession>(createContext: (event: RequestEvent) => Context<ProviderSession, AppSession>) => (event: RequestEvent) => Promise<void>;
16
+
17
+ type Initiative<ProviderSession, AppSession> = <Return>(context: Context<ProviderSession, AppSession>) => Promise<Return>;
18
+
19
+ export { type Initiative, deleteSessionCookies, login, logout, protectRoute, refresh, signup };