Skip to content

Commit d9a8e0f

Browse files
authored
Merge pull request #29 from escendit/28-expose-store-hasher-and-generator-in-middleware-pipeline
Expose store, hasher, and generator in middleware pipeline
2 parents 7ffa098 + 21960fa commit d9a8e0f

File tree

3 files changed

+50
-7
lines changed

3 files changed

+50
-7
lines changed

README.md

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,49 @@ Access the session in your endpoints or load functions via `event.locals`:
5353

5454
```ts
5555
// src/routes/+page.server.ts
56-
import type { Actions, PageServerLoad } from './$types';
56+
import type { PageServerLoad } from './$types';
5757

5858
export const load: PageServerLoad = async ({ locals }) => {
59-
// locals.sessionId: string
60-
// locals.session: { identity: unknown | null; created: string | null }
59+
// Available on locals:
60+
// - locals.store: ISessionStore
61+
// - locals.hasher: ISessionHasher
62+
// - locals.generator: ISessionGenerator
63+
// - locals.sessionId: string (present once a session exists)
64+
// - locals.session: { identity: unknown | null; created: string | null }
6165
return {
6266
sessionId: locals.sessionId,
6367
session: locals.session
6468
};
6569
};
6670
```
6771

72+
Locals interface (for reference):
73+
74+
```ts
75+
// src/app.d.ts
76+
import type { ISessionGenerator, ISessionHasher, ISessionStore } from '@escendit/sveltekit-session';
77+
78+
declare global {
79+
namespace App {
80+
interface Locals {
81+
store: ISessionStore;
82+
hasher: ISessionHasher;
83+
generator: ISessionGenerator;
84+
sessionId: string;
85+
session: any;
86+
}
87+
}
88+
}
89+
export {};
90+
```
91+
6892
## How it works
6993

7094
- On each request the middleware checks for the configured session cookie.
7195
- If a valid session exists in the store, it populates:
7296
- `event.locals.sessionId`
7397
- `event.locals.session = { identity: any | null, created: string | null }`
98+
- Always available: `event.locals.store`, `event.locals.hasher`, `event.locals.generator` (from middleware config)
7499
- If there is no valid session yet:
75100
- It generates a new random ID, stores minimal fields (`identity=null`, `created=timestamp`) and sets an expiry on the store entry.
76101
- It sets a secure cookie and `Cache-Control: no-store` header.

src/app.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
// See https://svelte.dev/docs/kit/types#app.d.ts
22
// for information about these interfaces
3+
import type { ISessionGenerator, ISessionHasher, ISessionStore } from '$lib';
4+
35
declare global {
46
namespace App {
57
// interface Error {}
68
interface Locals {
9+
store: ISessionStore;
10+
hasher: ISessionHasher;
11+
generator: ISessionGenerator;
712
sessionId: string;
813
session: any;
914
}

src/lib/session.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Defaults } from '$lib/config.js';
44
import type { ISessionStore } from '$lib/ISessionStore.js';
55
import type { ISessionHasher } from '$lib/ISessionHasher.js';
66
import type { ISessionGenerator } from '$lib/ISessionGenerator.js';
7+
import { sequence } from '@sveltejs/kit/hooks';
78

89
/**
910
* Session middleware.
@@ -26,9 +27,21 @@ const SessionMiddleware = (sessionConfig?: SessionConfig) => {
2627
const handleSessionMiddleware: Handle = async (request) => {
2728
return handleSessionMiddlewareInternal(request, configuredSessionConfig);
2829
};
29-
return handleSessionMiddleware;
30+
31+
const prepareSessionMiddleware: Handle = async (request) => {
32+
return handlePrepareSessionMiddleware(request, configuredSessionConfig);
33+
}
34+
return sequence(prepareSessionMiddleware, handleSessionMiddleware);
3035
};
3136

37+
const handlePrepareSessionMiddleware: InternalMiddlewareHandle = async (
38+
{ event, resolve },
39+
options) => {
40+
event.locals.store = options.sessionStore;
41+
event.locals.hasher = options.sessionHasher;
42+
event.locals.generator = options.sessionGenerator;
43+
return resolve(event);
44+
};
3245
/**
3346
* Handle session middleware.
3447
* @param event
@@ -39,9 +52,9 @@ const handleSessionMiddlewareInternal: InternalMiddlewareHandle = async (
3952
{ event, resolve },
4053
options
4154
) => {
42-
const store: ISessionStore = options.sessionStore;
43-
const hasher: ISessionHasher = options.sessionHasher;
44-
const generator: ISessionGenerator = options.sessionGenerator;
55+
const store: ISessionStore = event.locals.store;
56+
const hasher: ISessionHasher = event.locals.hasher;
57+
const generator: ISessionGenerator = event.locals.generator;
4558

4659
// Skip favicon requests
4760
if (event.url.pathname === '/favicon.ico') {

0 commit comments

Comments
 (0)