@adonisjs/session 7.7.0 → 7.7.1
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/build/{chunk-Q24L5XPC.js → chunk-OTCKCTXY.js} +2 -2
- package/build/{database-443FB7MM.js → database-Y33BTHTP.js} +7 -8
- package/build/database-Y33BTHTP.js.map +1 -0
- package/build/factories/main.js +1 -1
- package/build/index.js +1 -1
- package/build/src/debug.d.ts +1 -1
- package/build/src/stores/database.d.ts +2 -1
- package/package.json +32 -32
- package/build/database-443FB7MM.js.map +0 -1
- /package/build/{chunk-Q24L5XPC.js.map → chunk-OTCKCTXY.js.map} +0 -0
|
@@ -160,7 +160,7 @@ var stores = {
|
|
|
160
160
|
},
|
|
161
161
|
database: (config) => {
|
|
162
162
|
return configProvider.create(async (app) => {
|
|
163
|
-
const { DatabaseStore } = await import("./database-
|
|
163
|
+
const { DatabaseStore } = await import("./database-Y33BTHTP.js");
|
|
164
164
|
const db = await app.container.make("lucid.db");
|
|
165
165
|
const connectionName = config?.connectionName || db.primaryConnectionName;
|
|
166
166
|
if (!db.manager.has(connectionName)) {
|
|
@@ -183,4 +183,4 @@ export {
|
|
|
183
183
|
defineConfig,
|
|
184
184
|
stores
|
|
185
185
|
};
|
|
186
|
-
//# sourceMappingURL=chunk-
|
|
186
|
+
//# sourceMappingURL=chunk-OTCKCTXY.js.map
|
|
@@ -66,11 +66,7 @@ var DatabaseStore = class {
|
|
|
66
66
|
debug_default("database store: writing session data %s, %O", sessionId, values);
|
|
67
67
|
const message = new MessageBuilder().build(values, void 0, sessionId);
|
|
68
68
|
const expiresAt = new Date(Date.now() + this.#ttlSeconds * 1e3);
|
|
69
|
-
await this.#client.insertQuery().table(this.#tableName).insert({
|
|
70
|
-
id: sessionId,
|
|
71
|
-
data: message,
|
|
72
|
-
expires_at: expiresAt
|
|
73
|
-
}).knexQuery.onConflict("id").merge(["data", "expires_at"]);
|
|
69
|
+
await this.#client.insertQuery().table(this.#tableName).insert({ id: sessionId, data: message, expires_at: expiresAt }).knexQuery.onConflict("id").merge(["data", "expires_at"]);
|
|
74
70
|
await this.#collectGarbage();
|
|
75
71
|
}
|
|
76
72
|
/**
|
|
@@ -89,11 +85,14 @@ var DatabaseStore = class {
|
|
|
89
85
|
await this.#client.from(this.#tableName).where("id", sessionId).update({ expires_at: expiresAt });
|
|
90
86
|
}
|
|
91
87
|
/**
|
|
92
|
-
* Tag a session with a user ID
|
|
88
|
+
* Tag a session with a user ID.
|
|
89
|
+
* Uses UPSERT to handle both existing and new sessions.
|
|
93
90
|
*/
|
|
94
91
|
async tag(sessionId, userId) {
|
|
95
92
|
debug_default("database store: tagging session %s with user %s", sessionId, userId);
|
|
96
|
-
|
|
93
|
+
const data = new MessageBuilder().build({}, void 0, sessionId);
|
|
94
|
+
const expiresAt = new Date(Date.now() + this.#ttlSeconds * 1e3);
|
|
95
|
+
await this.#client.insertQuery().table(this.#tableName).insert({ id: sessionId, user_id: userId, data, expires_at: expiresAt }).knexQuery.onConflict("id").merge(["user_id"]);
|
|
97
96
|
}
|
|
98
97
|
/**
|
|
99
98
|
* Converts a database row to a TaggedSession object
|
|
@@ -115,4 +114,4 @@ var DatabaseStore = class {
|
|
|
115
114
|
export {
|
|
116
115
|
DatabaseStore
|
|
117
116
|
};
|
|
118
|
-
//# sourceMappingURL=database-
|
|
117
|
+
//# sourceMappingURL=database-Y33BTHTP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stores/database.ts"],"sourcesContent":["/**\n * @adonisjs/session\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport string from '@poppinss/utils/string'\nimport { MessageBuilder } from '@adonisjs/core/helpers'\nimport type { QueryClientContract } from '@adonisjs/lucid/types/database'\n\nimport debug from '../debug.js'\nimport type { SessionStoreWithTaggingContract, SessionData, TaggedSession } from '../types.js'\n\n/**\n * Database store to read/write session to SQL databases using Lucid\n */\nexport class DatabaseStore implements SessionStoreWithTaggingContract {\n #client: QueryClientContract\n #tableName: string\n #ttlSeconds: number\n #gcProbability: number\n\n constructor(\n client: QueryClientContract,\n age: string | number,\n options?: {\n /**\n * Defaults to \"sessions\"\n */\n tableName?: string\n\n /**\n * The probability (in percent) that garbage collection will be\n * triggered on any given request. For example, 2 means 2% chance.\n *\n * Set to 0 to disable garbage collection.\n *\n * Defaults to 2 (2% chance)\n */\n gcProbability?: number\n }\n ) {\n this.#client = client\n this.#tableName = options?.tableName ?? 'sessions'\n this.#ttlSeconds = string.seconds.parse(age)\n this.#gcProbability = options?.gcProbability ?? 2\n debug('initiating database store')\n }\n\n /**\n * Run garbage collection to delete expired sessions.\n * This is called based on gcProbability after writing session data.\n */\n async #collectGarbage(): Promise<void> {\n if (this.#gcProbability <= 0) {\n return\n }\n\n const random = Math.random() * 100\n if (random < this.#gcProbability) {\n debug('database store: running garbage collection')\n const expiredBefore = new Date(Date.now())\n await this.#client.from(this.#tableName).where('expires_at', '<=', expiredBefore).delete()\n }\n }\n\n /**\n * Parses and verifies session data using MessageBuilder\n */\n #parseSessionData(contents: string, sessionId: string): SessionData | null {\n try {\n return new MessageBuilder().verify<SessionData>(contents, sessionId)\n } catch {\n return null\n }\n }\n\n /**\n * Returns session data\n */\n async read(sessionId: string): Promise<SessionData | null> {\n debug('database store: reading session data %s', sessionId)\n\n const row = await this.#client.from(this.#tableName).where('id', sessionId).first()\n\n if (!row) {\n return null\n }\n\n /**\n * Check if the session has expired. If so, delete it and return null.\n */\n const expiresAt = new Date(row.expires_at).getTime()\n if (Date.now() > expiresAt) {\n await this.destroy(sessionId)\n return null\n }\n\n return this.#parseSessionData(row.data, sessionId)\n }\n\n /**\n * Write session values to the database\n */\n async write(sessionId: string, values: Object): Promise<void> {\n debug('database store: writing session data %s, %O', sessionId, values)\n\n const message = new MessageBuilder().build(values, undefined, sessionId)\n const expiresAt = new Date(Date.now() + this.#ttlSeconds * 1000)\n\n await this.#client\n .insertQuery()\n .table(this.#tableName)\n .insert({ id: sessionId, data: message, expires_at: expiresAt })\n .knexQuery.onConflict('id')\n .merge(['data', 'expires_at'])\n\n await this.#collectGarbage()\n }\n\n /**\n * Cleanup session by removing it\n */\n async destroy(sessionId: string): Promise<void> {\n debug('database store: destroying session data %s', sessionId)\n\n await this.#client.from(this.#tableName).where('id', sessionId).delete()\n }\n\n /**\n * Updates the session expiry\n */\n async touch(sessionId: string): Promise<void> {\n debug('database store: touching session data %s', sessionId)\n\n const expiresAt = new Date(Date.now() + this.#ttlSeconds * 1000)\n\n await this.#client\n .from(this.#tableName)\n .where('id', sessionId)\n .update({ expires_at: expiresAt })\n }\n\n /**\n * Tag a session with a user ID.\n * Uses UPSERT to handle both existing and new sessions.\n */\n async tag(sessionId: string, userId: string): Promise<void> {\n debug('database store: tagging session %s with user %s', sessionId, userId)\n\n const data = new MessageBuilder().build({}, undefined, sessionId)\n const expiresAt = new Date(Date.now() + this.#ttlSeconds * 1000)\n\n await this.#client\n .insertQuery()\n .table(this.#tableName)\n .insert({ id: sessionId, user_id: userId, data, expires_at: expiresAt })\n .knexQuery.onConflict('id')\n .merge(['user_id'])\n }\n\n /**\n * Converts a database row to a TaggedSession object\n */\n #rowToTaggedSession(row: { id: string; data: string }): TaggedSession | null {\n const data = this.#parseSessionData(row.data, row.id)\n if (!data) return null\n\n return { id: row.id, data }\n }\n\n /**\n * Get all sessions for a given user ID (tag)\n */\n async tagged(userId: string): Promise<TaggedSession[]> {\n debug('database store: getting sessions tagged with user %s', userId)\n\n const rows = await this.#client\n .from(this.#tableName)\n .select('id', 'data')\n .where('user_id', userId)\n .where('expires_at', '>', new Date())\n\n return rows.map((row) => this.#rowToTaggedSession(row)).filter((session) => session !== null)\n }\n}\n"],"mappings":"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","names":[]}
|
package/build/factories/main.js
CHANGED
package/build/index.js
CHANGED
package/build/src/debug.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: import("util").DebugLogger;
|
|
1
|
+
declare const _default: import("node:util").DebugLogger;
|
|
2
2
|
export default _default;
|
|
@@ -45,7 +45,8 @@ export declare class DatabaseStore implements SessionStoreWithTaggingContract {
|
|
|
45
45
|
*/
|
|
46
46
|
touch(sessionId: string): Promise<void>;
|
|
47
47
|
/**
|
|
48
|
-
* Tag a session with a user ID
|
|
48
|
+
* Tag a session with a user ID.
|
|
49
|
+
* Uses UPSERT to handle both existing and new sessions.
|
|
49
50
|
*/
|
|
50
51
|
tag(sessionId: string, userId: string): Promise<void>;
|
|
51
52
|
/**
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adonisjs/session",
|
|
3
3
|
"description": "Session provider for AdonisJS",
|
|
4
|
-
"version": "7.7.
|
|
4
|
+
"version": "7.7.1",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=18.16.0"
|
|
7
7
|
},
|
|
@@ -44,49 +44,49 @@
|
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@adonisjs/assembler": "^7.8.2",
|
|
47
|
-
"@adonisjs/core": "^6.
|
|
48
|
-
"@adonisjs/eslint-config": "^2.1.
|
|
49
|
-
"@adonisjs/i18n": "^2.2.
|
|
50
|
-
"@adonisjs/lucid": "^21.
|
|
51
|
-
"better-sqlite3": "^12.5.0",
|
|
52
|
-
"mysql2": "^3.15.3",
|
|
53
|
-
"pg": "^8.16.3",
|
|
47
|
+
"@adonisjs/core": "^6.19.1",
|
|
48
|
+
"@adonisjs/eslint-config": "^2.1.2",
|
|
49
|
+
"@adonisjs/i18n": "^2.2.3",
|
|
50
|
+
"@adonisjs/lucid": "^21.8.1",
|
|
54
51
|
"@adonisjs/prettier-config": "^1.4.5",
|
|
55
52
|
"@adonisjs/redis": "^9.2.0",
|
|
56
53
|
"@adonisjs/tsconfig": "^1.4.1",
|
|
57
|
-
"@aws-sdk/client-dynamodb": "^3.
|
|
58
|
-
"@aws-sdk/util-dynamodb": "^3.
|
|
59
|
-
"@japa/api-client": "^3.1.
|
|
60
|
-
"@japa/assert": "^4.0
|
|
61
|
-
"@japa/browser-client": "^2.
|
|
62
|
-
"@japa/file-system": "^
|
|
54
|
+
"@aws-sdk/client-dynamodb": "^3.956.0",
|
|
55
|
+
"@aws-sdk/util-dynamodb": "^3.956.0",
|
|
56
|
+
"@japa/api-client": "^3.1.1",
|
|
57
|
+
"@japa/assert": "^4.2.0",
|
|
58
|
+
"@japa/browser-client": "^2.2.0",
|
|
59
|
+
"@japa/file-system": "^3.0.0",
|
|
63
60
|
"@japa/plugin-adonisjs": "^4.0.0",
|
|
64
|
-
"@japa/runner": "^4.
|
|
65
|
-
"@japa/snapshot": "^2.0.
|
|
66
|
-
"@release-it/conventional-changelog": "^10.0.
|
|
61
|
+
"@japa/runner": "^4.4.0",
|
|
62
|
+
"@japa/snapshot": "^2.0.10",
|
|
63
|
+
"@release-it/conventional-changelog": "^10.0.4",
|
|
67
64
|
"@swc/core": "1.10.7",
|
|
68
|
-
"@types/node": "^
|
|
65
|
+
"@types/node": "^25.0.3",
|
|
69
66
|
"@types/set-cookie-parser": "^2.4.10",
|
|
70
67
|
"@types/supertest": "^6.0.3",
|
|
71
|
-
"@vinejs/vine": "^
|
|
68
|
+
"@vinejs/vine": "^4.2.0",
|
|
69
|
+
"better-sqlite3": "^12.5.0",
|
|
72
70
|
"c8": "^10.1.3",
|
|
73
71
|
"copyfiles": "^2.4.1",
|
|
74
|
-
"cross-env": "^
|
|
75
|
-
"edge.js": "^6.
|
|
76
|
-
"eslint": "^9.
|
|
72
|
+
"cross-env": "^10.1.0",
|
|
73
|
+
"edge.js": "^6.4.0",
|
|
74
|
+
"eslint": "^9.39.2",
|
|
77
75
|
"get-port": "^7.1.0",
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
76
|
+
"mysql2": "^3.16.0",
|
|
77
|
+
"pg": "^8.16.3",
|
|
78
|
+
"playwright": "^1.57.0",
|
|
79
|
+
"prettier": "^3.7.4",
|
|
80
|
+
"release-it": "^19.1.0",
|
|
81
|
+
"set-cookie-parser": "^2.7.2",
|
|
82
|
+
"supertest": "^7.1.4",
|
|
83
|
+
"ts-node-maintained": "^10.9.6",
|
|
84
|
+
"tsup": "^8.5.1",
|
|
85
|
+
"typescript": "^5.9.3"
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
|
-
"@poppinss/macroable": "^1.0
|
|
89
|
-
"@poppinss/utils": "^6.10.
|
|
88
|
+
"@poppinss/macroable": "^1.1.0",
|
|
89
|
+
"@poppinss/utils": "^6.10.1"
|
|
90
90
|
},
|
|
91
91
|
"peerDependencies": {
|
|
92
92
|
"@adonisjs/core": "^6.6.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stores/database.ts"],"sourcesContent":["/**\n * @adonisjs/session\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport string from '@poppinss/utils/string'\nimport { MessageBuilder } from '@adonisjs/core/helpers'\nimport type { QueryClientContract } from '@adonisjs/lucid/types/database'\n\nimport debug from '../debug.js'\nimport type { SessionStoreWithTaggingContract, SessionData, TaggedSession } from '../types.js'\n\n/**\n * Database store to read/write session to SQL databases using Lucid\n */\nexport class DatabaseStore implements SessionStoreWithTaggingContract {\n #client: QueryClientContract\n #tableName: string\n #ttlSeconds: number\n #gcProbability: number\n\n constructor(\n client: QueryClientContract,\n age: string | number,\n options?: {\n /**\n * Defaults to \"sessions\"\n */\n tableName?: string\n\n /**\n * The probability (in percent) that garbage collection will be\n * triggered on any given request. For example, 2 means 2% chance.\n *\n * Set to 0 to disable garbage collection.\n *\n * Defaults to 2 (2% chance)\n */\n gcProbability?: number\n }\n ) {\n this.#client = client\n this.#tableName = options?.tableName ?? 'sessions'\n this.#ttlSeconds = string.seconds.parse(age)\n this.#gcProbability = options?.gcProbability ?? 2\n debug('initiating database store')\n }\n\n /**\n * Run garbage collection to delete expired sessions.\n * This is called based on gcProbability after writing session data.\n */\n async #collectGarbage(): Promise<void> {\n if (this.#gcProbability <= 0) {\n return\n }\n\n const random = Math.random() * 100\n if (random < this.#gcProbability) {\n debug('database store: running garbage collection')\n const expiredBefore = new Date(Date.now())\n await this.#client.from(this.#tableName).where('expires_at', '<=', expiredBefore).delete()\n }\n }\n\n /**\n * Parses and verifies session data using MessageBuilder\n */\n #parseSessionData(contents: string, sessionId: string): SessionData | null {\n try {\n return new MessageBuilder().verify<SessionData>(contents, sessionId)\n } catch {\n return null\n }\n }\n\n /**\n * Returns session data\n */\n async read(sessionId: string): Promise<SessionData | null> {\n debug('database store: reading session data %s', sessionId)\n\n const row = await this.#client.from(this.#tableName).where('id', sessionId).first()\n\n if (!row) {\n return null\n }\n\n /**\n * Check if the session has expired. If so, delete it and return null.\n */\n const expiresAt = new Date(row.expires_at).getTime()\n if (Date.now() > expiresAt) {\n await this.destroy(sessionId)\n return null\n }\n\n return this.#parseSessionData(row.data, sessionId)\n }\n\n /**\n * Write session values to the database\n */\n async write(sessionId: string, values: Object): Promise<void> {\n debug('database store: writing session data %s, %O', sessionId, values)\n\n const message = new MessageBuilder().build(values, undefined, sessionId)\n const expiresAt = new Date(Date.now() + this.#ttlSeconds * 1000)\n\n await this.#client\n .insertQuery()\n .table(this.#tableName)\n .insert({\n id: sessionId,\n data: message,\n expires_at: expiresAt,\n })\n .knexQuery.onConflict('id')\n .merge(['data', 'expires_at'])\n\n await this.#collectGarbage()\n }\n\n /**\n * Cleanup session by removing it\n */\n async destroy(sessionId: string): Promise<void> {\n debug('database store: destroying session data %s', sessionId)\n\n await this.#client.from(this.#tableName).where('id', sessionId).delete()\n }\n\n /**\n * Updates the session expiry\n */\n async touch(sessionId: string): Promise<void> {\n debug('database store: touching session data %s', sessionId)\n\n const expiresAt = new Date(Date.now() + this.#ttlSeconds * 1000)\n\n await this.#client\n .from(this.#tableName)\n .where('id', sessionId)\n .update({ expires_at: expiresAt })\n }\n\n /**\n * Tag a session with a user ID\n */\n async tag(sessionId: string, userId: string): Promise<void> {\n debug('database store: tagging session %s with user %s', sessionId, userId)\n\n await this.#client.from(this.#tableName).where('id', sessionId).update({ user_id: userId })\n }\n\n /**\n * Converts a database row to a TaggedSession object\n */\n #rowToTaggedSession(row: { id: string; data: string }): TaggedSession | null {\n const data = this.#parseSessionData(row.data, row.id)\n if (!data) return null\n\n return { id: row.id, data }\n }\n\n /**\n * Get all sessions for a given user ID (tag)\n */\n async tagged(userId: string): Promise<TaggedSession[]> {\n debug('database store: getting sessions tagged with user %s', userId)\n\n const rows = await this.#client\n .from(this.#tableName)\n .select('id', 'data')\n .where('user_id', userId)\n .where('expires_at', '>', new Date())\n\n return rows.map((row) => this.#rowToTaggedSession(row)).filter((session) => session !== null)\n }\n}\n"],"mappings":"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","names":[]}
|
|
File without changes
|