hono-sessions 0.3.6 → 0.4.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 +2 -1
- package/esm/deps.d.ts +0 -1
- package/esm/deps.js +0 -1
- package/esm/src/Crypto.d.ts +14 -0
- package/esm/src/Crypto.js +14 -0
- package/esm/src/Middleware.d.ts +1 -0
- package/esm/src/Middleware.js +3 -3
- package/esm/src/Session.d.ts +6 -0
- package/esm/src/Session.js +3 -0
- package/esm/src/store/CookieStore.d.ts +3 -0
- package/esm/src/store/CookieStore.js +3 -0
- package/esm/src/store/MemoryStore.d.ts +3 -0
- package/esm/src/store/MemoryStore.js +3 -0
- package/esm/src/store/Store.d.ts +3 -0
- package/package.json +2 -3
- package/script/deps.d.ts +0 -1
- package/script/deps.js +1 -3
- package/script/src/Crypto.d.ts +14 -0
- package/script/src/Crypto.js +14 -0
- package/script/src/Middleware.d.ts +1 -0
- package/script/src/Middleware.js +7 -7
- package/script/src/Session.d.ts +6 -0
- package/script/src/Session.js +3 -0
- package/script/src/store/CookieStore.d.ts +3 -0
- package/script/src/store/CookieStore.js +3 -0
- package/script/src/store/MemoryStore.d.ts +3 -0
- package/script/src/store/MemoryStore.js +3 -0
- package/script/src/store/Store.d.ts +3 -0
package/README.md
CHANGED
|
@@ -7,6 +7,7 @@ Hono Sessions is currently tested on these runtimes:
|
|
|
7
7
|
|
|
8
8
|
- Deno
|
|
9
9
|
- Cloudflare Workers
|
|
10
|
+
- Cloudflare Pages
|
|
10
11
|
- Bun
|
|
11
12
|
- Node (v20+)
|
|
12
13
|
|
|
@@ -156,7 +157,7 @@ export default {
|
|
|
156
157
|
}
|
|
157
158
|
```
|
|
158
159
|
|
|
159
|
-
### Cloudflare Workers
|
|
160
|
+
### Cloudflare Workers / Pages
|
|
160
161
|
|
|
161
162
|
```ts
|
|
162
163
|
import { Hono } from 'hono'
|
package/esm/deps.d.ts
CHANGED
package/esm/deps.js
CHANGED
package/esm/src/Crypto.d.ts
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encrypt a string or object value
|
|
3
|
+
*
|
|
4
|
+
* @param password Random string at least 32 characters long
|
|
5
|
+
* @param payload String or object to encrypt
|
|
6
|
+
* @returns A promise of the encrypted string
|
|
7
|
+
*/
|
|
1
8
|
export declare function encrypt(password: string, payload: object | string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Decrypt an encrypted payload
|
|
11
|
+
*
|
|
12
|
+
* @param password Random string at least 32 characters long
|
|
13
|
+
* @param encrypted Encrypted string
|
|
14
|
+
* @returns Promise of the unencrypted value (string or object in most cases)
|
|
15
|
+
*/
|
|
2
16
|
export declare function decrypt(password: string, encrypted: string): Promise<unknown>;
|
package/esm/src/Crypto.js
CHANGED
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
import { Iron } from '../deps.js';
|
|
2
|
+
/**
|
|
3
|
+
* Encrypt a string or object value
|
|
4
|
+
*
|
|
5
|
+
* @param password Random string at least 32 characters long
|
|
6
|
+
* @param payload String or object to encrypt
|
|
7
|
+
* @returns A promise of the encrypted string
|
|
8
|
+
*/
|
|
2
9
|
export async function encrypt(password, payload) {
|
|
3
10
|
return await Iron.seal(globalThis.crypto, payload, password, Iron.defaults);
|
|
4
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Decrypt an encrypted payload
|
|
14
|
+
*
|
|
15
|
+
* @param password Random string at least 32 characters long
|
|
16
|
+
* @param encrypted Encrypted string
|
|
17
|
+
* @returns Promise of the unencrypted value (string or object in most cases)
|
|
18
|
+
*/
|
|
5
19
|
export async function decrypt(password, encrypted) {
|
|
6
20
|
return await Iron.unseal(globalThis.crypto, encrypted, { default: password }, Iron.defaults);
|
|
7
21
|
}
|
package/esm/src/Middleware.d.ts
CHANGED
|
@@ -9,5 +9,6 @@ interface SessionOptions {
|
|
|
9
9
|
cookieOptions?: CookieOptions;
|
|
10
10
|
sessionCookieName?: string;
|
|
11
11
|
}
|
|
12
|
+
/** Function that returns a Hono-compatible session middleware */
|
|
12
13
|
export declare function sessionMiddleware(options: SessionOptions): MiddlewareHandler<any, any, {}>;
|
|
13
14
|
export {};
|
package/esm/src/Middleware.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { nanoid } from '../deps.js';
|
|
2
1
|
import { getCookie, setCookie, createMiddleware } from '../deps.js';
|
|
3
2
|
import CookieStore from './store/CookieStore.js';
|
|
4
3
|
import { Session, encrypt, decrypt } from '../mod.js';
|
|
4
|
+
/** Function that returns a Hono-compatible session middleware */
|
|
5
5
|
export function sessionMiddleware(options) {
|
|
6
6
|
const store = options.store;
|
|
7
7
|
const encryptionKey = options.encryptionKey;
|
|
@@ -67,7 +67,7 @@ export function sessionMiddleware(options) {
|
|
|
67
67
|
await store.createSession(c, defaultData);
|
|
68
68
|
}
|
|
69
69
|
else {
|
|
70
|
-
sid =
|
|
70
|
+
sid = globalThis.crypto.randomUUID();
|
|
71
71
|
await store.createSession(sid, defaultData);
|
|
72
72
|
}
|
|
73
73
|
session.setCache(defaultData);
|
|
@@ -96,7 +96,7 @@ export function sessionMiddleware(options) {
|
|
|
96
96
|
shouldRotateSessionKey;
|
|
97
97
|
if (shouldRecreateSessionForNonCookieStore) {
|
|
98
98
|
await store.deleteSession(sid);
|
|
99
|
-
sid =
|
|
99
|
+
sid = globalThis.crypto.randomUUID();
|
|
100
100
|
await store.createSession(sid, session.getCache());
|
|
101
101
|
setCookie(c, sessionCookieName, encryptionKey ? await encrypt(encryptionKey, sid) : sid, cookieOptions);
|
|
102
102
|
}
|
package/esm/src/Session.d.ts
CHANGED
|
@@ -2,12 +2,18 @@ interface SessionDataEntry {
|
|
|
2
2
|
value: unknown;
|
|
3
3
|
flash: boolean;
|
|
4
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* Interface for specifying the necessary data for a session entry
|
|
7
|
+
*/
|
|
5
8
|
export interface SessionData {
|
|
6
9
|
_data: Record<string, SessionDataEntry>;
|
|
7
10
|
_expire: string | null;
|
|
8
11
|
_delete: boolean;
|
|
9
12
|
_accessed: string | null;
|
|
10
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Session class with methods for interacting with the session
|
|
16
|
+
*/
|
|
11
17
|
export declare class Session {
|
|
12
18
|
private cache;
|
|
13
19
|
constructor();
|
package/esm/src/Session.js
CHANGED
package/esm/src/store/Store.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { SessionData } from "../../mod.js";
|
|
2
|
+
/**
|
|
3
|
+
* Interface for required methods in session storage drivers
|
|
4
|
+
*/
|
|
2
5
|
export default interface Store {
|
|
3
6
|
getSessionById(sessionId?: string): SessionData | null | undefined | Promise<SessionData | null | undefined>;
|
|
4
7
|
createSession(sessionId: string, initialData: SessionData): Promise<void> | void;
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"module": "./esm/mod.js",
|
|
3
3
|
"main": "./script/mod.js",
|
|
4
4
|
"name": "hono-sessions",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.4.0",
|
|
6
6
|
"description": "Cookie-based sessions for Hono web framework",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"repository": {
|
|
@@ -28,7 +28,6 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"hono": "3.12.8",
|
|
31
|
-
"iron-webcrypto": "0.10.1"
|
|
32
|
-
"nanoid": "4.0.0"
|
|
31
|
+
"iron-webcrypto": "0.10.1"
|
|
33
32
|
}
|
|
34
33
|
}
|
package/script/deps.d.ts
CHANGED
package/script/deps.js
CHANGED
|
@@ -23,9 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.Iron = exports.setCookie = exports.getCookie = exports.createMiddleware =
|
|
27
|
-
var async_1 = require("nanoid/async");
|
|
28
|
-
Object.defineProperty(exports, "nanoid", { enumerable: true, get: function () { return async_1.nanoid; } });
|
|
26
|
+
exports.Iron = exports.setCookie = exports.getCookie = exports.createMiddleware = void 0;
|
|
29
27
|
var factory_1 = require("hono/factory");
|
|
30
28
|
Object.defineProperty(exports, "createMiddleware", { enumerable: true, get: function () { return factory_1.createMiddleware; } });
|
|
31
29
|
var cookie_1 = require("hono/cookie");
|
package/script/src/Crypto.d.ts
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encrypt a string or object value
|
|
3
|
+
*
|
|
4
|
+
* @param password Random string at least 32 characters long
|
|
5
|
+
* @param payload String or object to encrypt
|
|
6
|
+
* @returns A promise of the encrypted string
|
|
7
|
+
*/
|
|
1
8
|
export declare function encrypt(password: string, payload: object | string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Decrypt an encrypted payload
|
|
11
|
+
*
|
|
12
|
+
* @param password Random string at least 32 characters long
|
|
13
|
+
* @param encrypted Encrypted string
|
|
14
|
+
* @returns Promise of the unencrypted value (string or object in most cases)
|
|
15
|
+
*/
|
|
2
16
|
export declare function decrypt(password: string, encrypted: string): Promise<unknown>;
|
package/script/src/Crypto.js
CHANGED
|
@@ -2,10 +2,24 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.decrypt = exports.encrypt = void 0;
|
|
4
4
|
const deps_js_1 = require("../deps.js");
|
|
5
|
+
/**
|
|
6
|
+
* Encrypt a string or object value
|
|
7
|
+
*
|
|
8
|
+
* @param password Random string at least 32 characters long
|
|
9
|
+
* @param payload String or object to encrypt
|
|
10
|
+
* @returns A promise of the encrypted string
|
|
11
|
+
*/
|
|
5
12
|
async function encrypt(password, payload) {
|
|
6
13
|
return await deps_js_1.Iron.seal(globalThis.crypto, payload, password, deps_js_1.Iron.defaults);
|
|
7
14
|
}
|
|
8
15
|
exports.encrypt = encrypt;
|
|
16
|
+
/**
|
|
17
|
+
* Decrypt an encrypted payload
|
|
18
|
+
*
|
|
19
|
+
* @param password Random string at least 32 characters long
|
|
20
|
+
* @param encrypted Encrypted string
|
|
21
|
+
* @returns Promise of the unencrypted value (string or object in most cases)
|
|
22
|
+
*/
|
|
9
23
|
async function decrypt(password, encrypted) {
|
|
10
24
|
return await deps_js_1.Iron.unseal(globalThis.crypto, encrypted, { default: password }, deps_js_1.Iron.defaults);
|
|
11
25
|
}
|
|
@@ -9,5 +9,6 @@ interface SessionOptions {
|
|
|
9
9
|
cookieOptions?: CookieOptions;
|
|
10
10
|
sessionCookieName?: string;
|
|
11
11
|
}
|
|
12
|
+
/** Function that returns a Hono-compatible session middleware */
|
|
12
13
|
export declare function sessionMiddleware(options: SessionOptions): MiddlewareHandler<any, any, {}>;
|
|
13
14
|
export {};
|
package/script/src/Middleware.js
CHANGED
|
@@ -5,9 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.sessionMiddleware = void 0;
|
|
7
7
|
const deps_js_1 = require("../deps.js");
|
|
8
|
-
const deps_js_2 = require("../deps.js");
|
|
9
8
|
const CookieStore_js_1 = __importDefault(require("./store/CookieStore.js"));
|
|
10
9
|
const mod_js_1 = require("../mod.js");
|
|
10
|
+
/** Function that returns a Hono-compatible session middleware */
|
|
11
11
|
function sessionMiddleware(options) {
|
|
12
12
|
const store = options.store;
|
|
13
13
|
const encryptionKey = options.encryptionKey;
|
|
@@ -26,12 +26,12 @@ function sessionMiddleware(options) {
|
|
|
26
26
|
store.cookieOptions = cookieOptions;
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
-
const middleware = (0,
|
|
29
|
+
const middleware = (0, deps_js_1.createMiddleware)(async (c, next) => {
|
|
30
30
|
const session = new mod_js_1.Session;
|
|
31
31
|
let sid = '';
|
|
32
32
|
let session_data;
|
|
33
33
|
let createNewSession = false;
|
|
34
|
-
const sessionCookie = (0,
|
|
34
|
+
const sessionCookie = (0, deps_js_1.getCookie)(c, sessionCookieName);
|
|
35
35
|
if (sessionCookie) { // If there is a session cookie present...
|
|
36
36
|
if (store instanceof CookieStore_js_1.default) {
|
|
37
37
|
session_data = await store.getSession(c);
|
|
@@ -73,13 +73,13 @@ function sessionMiddleware(options) {
|
|
|
73
73
|
await store.createSession(c, defaultData);
|
|
74
74
|
}
|
|
75
75
|
else {
|
|
76
|
-
sid =
|
|
76
|
+
sid = globalThis.crypto.randomUUID();
|
|
77
77
|
await store.createSession(sid, defaultData);
|
|
78
78
|
}
|
|
79
79
|
session.setCache(defaultData);
|
|
80
80
|
}
|
|
81
81
|
if (!(store instanceof CookieStore_js_1.default)) {
|
|
82
|
-
(0,
|
|
82
|
+
(0, deps_js_1.setCookie)(c, sessionCookieName, encryptionKey ? await (0, mod_js_1.encrypt)(encryptionKey, sid) : sid, cookieOptions);
|
|
83
83
|
}
|
|
84
84
|
session.updateAccess();
|
|
85
85
|
c.set('session', session);
|
|
@@ -102,9 +102,9 @@ function sessionMiddleware(options) {
|
|
|
102
102
|
shouldRotateSessionKey;
|
|
103
103
|
if (shouldRecreateSessionForNonCookieStore) {
|
|
104
104
|
await store.deleteSession(sid);
|
|
105
|
-
sid =
|
|
105
|
+
sid = globalThis.crypto.randomUUID();
|
|
106
106
|
await store.createSession(sid, session.getCache());
|
|
107
|
-
(0,
|
|
107
|
+
(0, deps_js_1.setCookie)(c, sessionCookieName, encryptionKey ? await (0, mod_js_1.encrypt)(encryptionKey, sid) : sid, cookieOptions);
|
|
108
108
|
}
|
|
109
109
|
/*
|
|
110
110
|
* We skip session data persistence if it was just deleted.
|
package/script/src/Session.d.ts
CHANGED
|
@@ -2,12 +2,18 @@ interface SessionDataEntry {
|
|
|
2
2
|
value: unknown;
|
|
3
3
|
flash: boolean;
|
|
4
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* Interface for specifying the necessary data for a session entry
|
|
7
|
+
*/
|
|
5
8
|
export interface SessionData {
|
|
6
9
|
_data: Record<string, SessionDataEntry>;
|
|
7
10
|
_expire: string | null;
|
|
8
11
|
_delete: boolean;
|
|
9
12
|
_accessed: string | null;
|
|
10
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Session class with methods for interacting with the session
|
|
16
|
+
*/
|
|
11
17
|
export declare class Session {
|
|
12
18
|
private cache;
|
|
13
19
|
constructor();
|
package/script/src/Session.js
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const deps_js_1 = require("../../deps.js");
|
|
4
4
|
const mod_js_1 = require("../../mod.js");
|
|
5
|
+
/**
|
|
6
|
+
* Cookie storage driver class
|
|
7
|
+
*/
|
|
5
8
|
class CookieStore {
|
|
6
9
|
constructor(options) {
|
|
7
10
|
Object.defineProperty(this, "encryptionKey", {
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { SessionData } from "../../mod.js";
|
|
2
|
+
/**
|
|
3
|
+
* Interface for required methods in session storage drivers
|
|
4
|
+
*/
|
|
2
5
|
export default interface Store {
|
|
3
6
|
getSessionById(sessionId?: string): SessionData | null | undefined | Promise<SessionData | null | undefined>;
|
|
4
7
|
createSession(sessionId: string, initialData: SessionData): Promise<void> | void;
|