Skip to content

Commit c571138

Browse files
committed
add sample
1 parent 185dab3 commit c571138

7 files changed

Lines changed: 105 additions & 9 deletions

File tree

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ import {
2626

2727
## Quick Start
2828

29+
Sample app notes:
30+
- `sample/session.ts` uses `MemorySessionStore`
31+
- `sample/session_cookie.ts` shows the cookie store pattern
32+
- `sample/session_kv.ts` shows the Deno KV store pattern
33+
2934
### 1. Create a session middleware
3035

3136
```ts

deno.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
"tasks": {
66
"dev": "deno test -E --watch",
77
"sample": "deno run -EN --watch sample/main.ts",
8+
"sample:memory": "deno run -EN --watch sample/main.ts memory",
9+
"sample:cookie": "deno run -EN --watch sample/main.ts cookie",
10+
"sample:kv": "deno run -EN --watch sample/main.ts kv",
811
"test": "deno test -E",
912
"test:doc": "deno test --doc -E"
1013
},

sample/main.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { App, createDefine, staticFiles } from "@fresh/core";
2-
import { sessionMiddleware } from "./session.ts";
2+
import { memorySessionMiddleware } from "./session_memory.ts";
3+
import { cookieSessionMiddleware } from "./session_cookie.ts";
4+
import { kvSessionMiddleware } from "./session_kv.ts";
35
import { registerSessionDemoRoutes } from "./session_demo.tsx";
46
import type { SessionState } from "../src/session.ts";
57

@@ -21,8 +23,29 @@ app.all("/.well-known/*", () => {
2123
});
2224
});
2325

26+
let storeType = "memory";
27+
2428
// Add session middleware
25-
app.use(sessionMiddleware);
29+
switch(Deno.args[0]){
30+
case("cookie"): {
31+
app.use(cookieSessionMiddleware);
32+
storeType = "cookie";
33+
break;
34+
}
35+
case("memory"): {
36+
app.use(memorySessionMiddleware);
37+
storeType = "memory";
38+
break;
39+
}
40+
case("kv"): {
41+
app.use(kvSessionMiddleware);
42+
storeType = "kv";
43+
break;
44+
}
45+
default: {
46+
app.use(memorySessionMiddleware);
47+
}
48+
}
2649

2750
const exampleLoggerMiddleware = define.middleware((ctx) => {
2851
console.log(`${ctx.req.method} ${ctx.req.url}`);
@@ -31,7 +54,7 @@ const exampleLoggerMiddleware = define.middleware((ctx) => {
3154
app.use(exampleLoggerMiddleware);
3255

3356
// Register session demo routes
34-
registerSessionDemoRoutes(app);
57+
registerSessionDemoRoutes(app, storeType);
3558

3659
// When no route matches, redirect to top page
3760
app.use((ctx) => {

sample/session_cookie.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { CookieSessionStore, session } from "../../fresh-session/mod.ts";
2+
import type { State } from "./main.ts";
3+
4+
// CookieSessionStore (session data stored in encrypted cookie; ~4KB limit)
5+
const cookieSessionStore = new CookieSessionStore();
6+
7+
/**
8+
* Session middleware (cookie store)
9+
* Stores session data in the cookie itself
10+
*/
11+
export const cookieSessionMiddleware = session<State>(
12+
cookieSessionStore,
13+
"your-secret-key-at-least-32-characters-long", // In production, get from environment variable
14+
{
15+
cookieName: "session",
16+
cookieOptions: {
17+
httpOnly: true,
18+
secure: false,
19+
sameSite: "Lax",
20+
path: "/",
21+
maxAge: 60 * 60 * 24,
22+
},
23+
},
24+
);

sample/session_demo.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { State } from "./main.ts";
44
/**
55
* Register session demo page routes
66
*/
7-
export function registerSessionDemoRoutes(app: App<State>) {
7+
export function registerSessionDemoRoutes(app: App<State>, storeType: string) {
88
// GET / - Display demo page
99
app.get("/", (ctx) => {
1010
// Get visit count from session
@@ -94,6 +94,23 @@ export function registerSessionDemoRoutes(app: App<State>) {
9494
{sessionId}
9595
</td>
9696
</tr>
97+
<tr>
98+
<td
99+
style={{ padding: "0.5rem", borderBottom: "1px solid #ccc" }}
100+
>
101+
Store Type:
102+
</td>
103+
<td
104+
style={{
105+
padding: "0.5rem",
106+
borderBottom: "1px solid #ccc",
107+
fontWeight: "bold",
108+
textTransform: "capitalize",
109+
}}
110+
>
111+
{storeType}
112+
</td>
113+
</tr>
97114
<tr>
98115
<td
99116
style={{ padding: "0.5rem", borderBottom: "1px solid #ccc" }}

sample/session_kv.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { KvSessionStore, session } from "@octo8080x/fresh-session";
2+
import type { State } from "./main.ts";
3+
4+
// KvSessionStore (persistent storage via Deno KV)
5+
const kvSessionStore = new KvSessionStore();
6+
7+
/**
8+
* Session middleware (KV store)
9+
* Stores session data in Deno KV
10+
*/
11+
export const kvSessionMiddleware = session<State>(
12+
kvSessionStore,
13+
"your-secret-key-at-least-32-characters-long", // In production, get from environment variable
14+
{
15+
cookieName: "session",
16+
cookieOptions: {
17+
httpOnly: true,
18+
secure: false,
19+
sameSite: "Lax",
20+
path: "/",
21+
maxAge: 60 * 60 * 24,
22+
},
23+
},
24+
);
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import { MemorySessionStore, session } from "../../fresh-session/mod.ts";
1+
import { MemorySessionStore, session } from "@octo8080x/fresh-session";
22
import type { State } from "./main.ts";
33

4-
// Session store instance (persists while server is running)
5-
const sessionStore = new MemorySessionStore();
4+
// MemorySessionStore (data lives in memory while server is running)
5+
const memorySessionStore = new MemorySessionStore();
66

77
/**
88
* Session middleware
99
* Manages sessions using MemorySessionStore
1010
*/
11-
export const sessionMiddleware = session<State>(
12-
sessionStore,
11+
export const memorySessionMiddleware = session<State>(
12+
memorySessionStore,
1313
"your-secret-key-at-least-32-characters-long", // In production, get from environment variable
1414
{
1515
cookieName: "session",

0 commit comments

Comments
 (0)