@adonisjs/session 7.0.0-13 → 7.0.0-14
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-2X5L327N.js +28 -0
- package/build/chunk-2X5L327N.js.map +1 -0
- package/build/chunk-4TGV4EVQ.js +85 -0
- package/build/chunk-4TGV4EVQ.js.map +1 -0
- package/build/chunk-C6BYE7BG.js +390 -0
- package/build/chunk-C6BYE7BG.js.map +1 -0
- package/build/chunk-KM6IRYLY.js +151 -0
- package/build/chunk-KM6IRYLY.js.map +1 -0
- package/build/chunk-QH2GQQKL.js +134 -0
- package/build/chunk-QH2GQQKL.js.map +1 -0
- package/build/chunk-WBAYBMJJ.js +15 -0
- package/build/chunk-WBAYBMJJ.js.map +1 -0
- package/build/{stubs/config.stub → config.stub} +3 -1
- package/build/cookie-H7KRZB4T.js +56 -0
- package/build/cookie-H7KRZB4T.js.map +1 -0
- package/build/factories/main.js +50 -9
- package/build/factories/main.js.map +1 -0
- package/build/file-YO7C2QWO.js +112 -0
- package/build/file-YO7C2QWO.js.map +1 -0
- package/build/index.js +18 -12
- package/build/index.js.map +1 -0
- package/build/providers/session_provider.js +51 -59
- package/build/providers/session_provider.js.map +1 -0
- package/build/redis-KDWIBKUQ.js +58 -0
- package/build/redis-KDWIBKUQ.js.map +1 -0
- package/build/src/client.js +9 -85
- package/build/src/client.js.map +1 -0
- package/build/src/plugins/edge.js +71 -91
- package/build/src/plugins/edge.js.map +1 -0
- package/build/src/plugins/japa/api_client.js +99 -140
- package/build/src/plugins/japa/api_client.js.map +1 -0
- package/build/src/plugins/japa/browser_client.js +82 -109
- package/build/src/plugins/japa/browser_client.js.map +1 -0
- package/build/src/session_middleware.js +10 -58
- package/build/src/session_middleware.js.map +1 -0
- package/package.json +58 -41
- package/build/configure.js +0 -45
- package/build/factories/session_middleware_factory.js +0 -48
- package/build/src/debug.js +0 -10
- package/build/src/define_config.js +0 -105
- package/build/src/errors.js +0 -17
- package/build/src/session.js +0 -387
- package/build/src/stores/cookie.js +0 -60
- package/build/src/stores/file.js +0 -133
- package/build/src/stores/memory.js +0 -33
- package/build/src/stores/redis.js +0 -66
- package/build/src/types.js +0 -9
- package/build/src/values_store.js +0 -159
- package/build/stubs/main.js +0 -10
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// src/values_store.ts
|
|
2
|
+
import lodash from "@poppinss/utils/lodash";
|
|
3
|
+
import { RuntimeException } from "@poppinss/utils";
|
|
4
|
+
var ReadOnlyValuesStore = class {
|
|
5
|
+
/**
|
|
6
|
+
* Underlying store values
|
|
7
|
+
*/
|
|
8
|
+
values;
|
|
9
|
+
/**
|
|
10
|
+
* Find if store is empty or not
|
|
11
|
+
*/
|
|
12
|
+
get isEmpty() {
|
|
13
|
+
return !this.values || Object.keys(this.values).length === 0;
|
|
14
|
+
}
|
|
15
|
+
constructor(values) {
|
|
16
|
+
this.values = values || {};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get value for a given key
|
|
20
|
+
*/
|
|
21
|
+
get(key, defaultValue) {
|
|
22
|
+
const value = lodash.get(this.values, key);
|
|
23
|
+
if (defaultValue !== void 0 && (value === null || value === void 0)) {
|
|
24
|
+
return defaultValue;
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A boolean to know if value exists. Extra guards to check
|
|
30
|
+
* arrays for it's length as well.
|
|
31
|
+
*/
|
|
32
|
+
has(key, checkForArraysLength = true) {
|
|
33
|
+
const value = this.get(key);
|
|
34
|
+
if (!Array.isArray(value)) {
|
|
35
|
+
return !!value;
|
|
36
|
+
}
|
|
37
|
+
return checkForArraysLength ? value.length > 0 : !!value;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get all values
|
|
41
|
+
*/
|
|
42
|
+
all() {
|
|
43
|
+
return this.values;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Returns object representation of values
|
|
47
|
+
*/
|
|
48
|
+
toObject() {
|
|
49
|
+
return this.all();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Returns the store values
|
|
53
|
+
*/
|
|
54
|
+
toJSON() {
|
|
55
|
+
return this.all();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Returns string representation of the store
|
|
59
|
+
*/
|
|
60
|
+
toString() {
|
|
61
|
+
return JSON.stringify(this.all());
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
var ValuesStore = class extends ReadOnlyValuesStore {
|
|
65
|
+
/**
|
|
66
|
+
* A boolean to know if store has been
|
|
67
|
+
* modified
|
|
68
|
+
*/
|
|
69
|
+
#modified = false;
|
|
70
|
+
constructor(values) {
|
|
71
|
+
super(values);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Find if the store has been modified.
|
|
75
|
+
*/
|
|
76
|
+
get hasBeenModified() {
|
|
77
|
+
return this.#modified;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Set key/value pair
|
|
81
|
+
*/
|
|
82
|
+
set(key, value) {
|
|
83
|
+
this.#modified = true;
|
|
84
|
+
lodash.set(this.values, key, value);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Remove key
|
|
88
|
+
*/
|
|
89
|
+
unset(key) {
|
|
90
|
+
this.#modified = true;
|
|
91
|
+
lodash.unset(this.values, key);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Pull value from the store. It is same as calling
|
|
95
|
+
* store.get and then store.unset
|
|
96
|
+
*/
|
|
97
|
+
pull(key, defaultValue) {
|
|
98
|
+
return ((value) => {
|
|
99
|
+
this.unset(key);
|
|
100
|
+
return value;
|
|
101
|
+
})(this.get(key, defaultValue));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Increment number. The method raises an error when
|
|
105
|
+
* nderlying value is not a number
|
|
106
|
+
*/
|
|
107
|
+
increment(key, steps = 1) {
|
|
108
|
+
const value = this.get(key, 0);
|
|
109
|
+
if (typeof value !== "number") {
|
|
110
|
+
throw new RuntimeException(`Cannot increment "${key}". Existing value is not a number`);
|
|
111
|
+
}
|
|
112
|
+
this.set(key, value + steps);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Increment number. The method raises an error when
|
|
116
|
+
* nderlying value is not a number
|
|
117
|
+
*/
|
|
118
|
+
decrement(key, steps = 1) {
|
|
119
|
+
const value = this.get(key, 0);
|
|
120
|
+
if (typeof value !== "number") {
|
|
121
|
+
throw new RuntimeException(`Cannot decrement "${key}". Existing value is not a number`);
|
|
122
|
+
}
|
|
123
|
+
this.set(key, value - steps);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Overwrite existing store data with new values.
|
|
127
|
+
*/
|
|
128
|
+
update(values) {
|
|
129
|
+
this.#modified = true;
|
|
130
|
+
this.values = values;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Update to merge values
|
|
134
|
+
*/
|
|
135
|
+
merge(values) {
|
|
136
|
+
this.#modified = true;
|
|
137
|
+
lodash.merge(this.values, values);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Reset store by clearing it's values.
|
|
141
|
+
*/
|
|
142
|
+
clear() {
|
|
143
|
+
this.update({});
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export {
|
|
148
|
+
ReadOnlyValuesStore,
|
|
149
|
+
ValuesStore
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=chunk-KM6IRYLY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/values_store.ts"],"sourcesContent":["/*\n * @adonisjs/redis\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 lodash from '@poppinss/utils/lodash'\nimport { RuntimeException } from '@poppinss/utils'\nimport type { AllowedSessionValues, SessionData } from './types.js'\n\n/**\n * Readonly session store\n */\nexport class ReadOnlyValuesStore {\n /**\n * Underlying store values\n */\n protected values: SessionData\n\n /**\n * Find if store is empty or not\n */\n get isEmpty() {\n return !this.values || Object.keys(this.values).length === 0\n }\n\n constructor(values: SessionData | null) {\n this.values = values || {}\n }\n\n /**\n * Get value for a given key\n */\n get(key: string, defaultValue?: any): any {\n const value = lodash.get(this.values, key)\n if (defaultValue !== undefined && (value === null || value === undefined)) {\n return defaultValue\n }\n\n return value\n }\n\n /**\n * A boolean to know if value exists. Extra guards to check\n * arrays for it's length as well.\n */\n has(key: string, checkForArraysLength: boolean = true): boolean {\n const value = this.get(key)\n if (!Array.isArray(value)) {\n return !!value\n }\n\n return checkForArraysLength ? value.length > 0 : !!value\n }\n\n /**\n * Get all values\n */\n all(): any {\n return this.values\n }\n\n /**\n * Returns object representation of values\n */\n toObject() {\n return this.all()\n }\n\n /**\n * Returns the store values\n */\n toJSON(): any {\n return this.all()\n }\n\n /**\n * Returns string representation of the store\n */\n toString() {\n return JSON.stringify(this.all())\n }\n}\n\n/**\n * Session store encapsulates the session data and offers a\n * declarative API to mutate it.\n */\nexport class ValuesStore extends ReadOnlyValuesStore {\n /**\n * A boolean to know if store has been\n * modified\n */\n #modified: boolean = false\n\n constructor(values: SessionData | null) {\n super(values)\n }\n\n /**\n * Find if the store has been modified.\n */\n get hasBeenModified(): boolean {\n return this.#modified\n }\n\n /**\n * Set key/value pair\n */\n set(key: string, value: AllowedSessionValues): void {\n this.#modified = true\n lodash.set(this.values, key, value)\n }\n\n /**\n * Remove key\n */\n unset(key: string): void {\n this.#modified = true\n lodash.unset(this.values, key)\n }\n\n /**\n * Pull value from the store. It is same as calling\n * store.get and then store.unset\n */\n pull(key: string, defaultValue?: any): any {\n return ((value): any => {\n this.unset(key)\n return value\n })(this.get(key, defaultValue))\n }\n\n /**\n * Increment number. The method raises an error when\n * nderlying value is not a number\n */\n increment(key: string, steps: number = 1): void {\n const value = this.get(key, 0)\n if (typeof value !== 'number') {\n throw new RuntimeException(`Cannot increment \"${key}\". Existing value is not a number`)\n }\n\n this.set(key, value + steps)\n }\n\n /**\n * Increment number. The method raises an error when\n * nderlying value is not a number\n */\n decrement(key: string, steps: number = 1): void {\n const value = this.get(key, 0)\n if (typeof value !== 'number') {\n throw new RuntimeException(`Cannot decrement \"${key}\". Existing value is not a number`)\n }\n\n this.set(key, value - steps)\n }\n\n /**\n * Overwrite existing store data with new values.\n */\n update(values: { [key: string]: any }): void {\n this.#modified = true\n this.values = values\n }\n\n /**\n * Update to merge values\n */\n merge(values: { [key: string]: any }): any {\n this.#modified = true\n lodash.merge(this.values, values)\n }\n\n /**\n * Reset store by clearing it's values.\n */\n clear(): void {\n this.update({})\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import {
|
|
2
|
+
debug_default
|
|
3
|
+
} from "./chunk-WBAYBMJJ.js";
|
|
4
|
+
|
|
5
|
+
// configure.ts
|
|
6
|
+
async function configure(command) {
|
|
7
|
+
await command.publishStub("config.stub");
|
|
8
|
+
const codemods = await command.createCodemods();
|
|
9
|
+
await codemods.defineEnvVariables({ SESSION_DRIVER: "cookie" });
|
|
10
|
+
await codemods.defineEnvValidations({
|
|
11
|
+
variables: {
|
|
12
|
+
SESSION_DRIVER: `Env.schema.enum(['cookie', 'memory'] as const)`
|
|
13
|
+
},
|
|
14
|
+
leadingComment: "Variables for configuring session package"
|
|
15
|
+
});
|
|
16
|
+
await codemods.registerMiddleware("router", [
|
|
17
|
+
{
|
|
18
|
+
path: "@adonisjs/session/session_middleware"
|
|
19
|
+
}
|
|
20
|
+
]);
|
|
21
|
+
await codemods.updateRcFile((rcFile) => {
|
|
22
|
+
rcFile.addProvider("@adonisjs/session/session_provider");
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// stubs/main.ts
|
|
27
|
+
import { getDirname } from "@poppinss/utils";
|
|
28
|
+
var stubsRoot = getDirname(import.meta.url);
|
|
29
|
+
|
|
30
|
+
// src/define_config.ts
|
|
31
|
+
import string from "@poppinss/utils/string";
|
|
32
|
+
import { configProvider } from "@adonisjs/core";
|
|
33
|
+
import { InvalidArgumentsException } from "@poppinss/utils";
|
|
34
|
+
|
|
35
|
+
// src/stores/memory.ts
|
|
36
|
+
var MemoryStore = class _MemoryStore {
|
|
37
|
+
static sessions = /* @__PURE__ */ new Map();
|
|
38
|
+
/**
|
|
39
|
+
* Read session id value from the memory
|
|
40
|
+
*/
|
|
41
|
+
read(sessionId) {
|
|
42
|
+
return _MemoryStore.sessions.get(sessionId) || null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Save in memory value for a given session id
|
|
46
|
+
*/
|
|
47
|
+
write(sessionId, values) {
|
|
48
|
+
_MemoryStore.sessions.set(sessionId, values);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Cleanup for a single session
|
|
52
|
+
*/
|
|
53
|
+
destroy(sessionId) {
|
|
54
|
+
_MemoryStore.sessions.delete(sessionId);
|
|
55
|
+
}
|
|
56
|
+
touch() {
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// src/define_config.ts
|
|
61
|
+
function defineConfig(config) {
|
|
62
|
+
debug_default("processing session config %O", config);
|
|
63
|
+
if (!config.store) {
|
|
64
|
+
throw new InvalidArgumentsException('Missing "store" property inside the session config');
|
|
65
|
+
}
|
|
66
|
+
const { stores: stores2, cookie, ...rest } = {
|
|
67
|
+
enabled: true,
|
|
68
|
+
age: "2h",
|
|
69
|
+
cookieName: "adonis_session",
|
|
70
|
+
clearWithBrowser: false,
|
|
71
|
+
...config
|
|
72
|
+
};
|
|
73
|
+
const cookieOptions = { ...cookie };
|
|
74
|
+
if (!rest.clearWithBrowser) {
|
|
75
|
+
cookieOptions.maxAge = string.seconds.parse(rest.age);
|
|
76
|
+
debug_default('computing maxAge "%s" for session id cookie', cookieOptions.maxAge);
|
|
77
|
+
}
|
|
78
|
+
return configProvider.create(async (app) => {
|
|
79
|
+
const storesNames = Object.keys(config.stores);
|
|
80
|
+
const storesList = {
|
|
81
|
+
memory: () => new MemoryStore()
|
|
82
|
+
};
|
|
83
|
+
for (let storeName of storesNames) {
|
|
84
|
+
const store = config.stores[storeName];
|
|
85
|
+
if (typeof store === "function") {
|
|
86
|
+
storesList[storeName] = store;
|
|
87
|
+
} else {
|
|
88
|
+
storesList[storeName] = await store.resolver(app);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const transformedConfig = {
|
|
92
|
+
...rest,
|
|
93
|
+
cookie: cookieOptions,
|
|
94
|
+
stores: storesList
|
|
95
|
+
};
|
|
96
|
+
debug_default("transformed session config %O", transformedConfig);
|
|
97
|
+
return transformedConfig;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
var stores = {
|
|
101
|
+
file: (config) => {
|
|
102
|
+
return configProvider.create(async () => {
|
|
103
|
+
const { FileStore } = await import("./file-YO7C2QWO.js");
|
|
104
|
+
return (_, sessionConfig) => {
|
|
105
|
+
return new FileStore(config, sessionConfig.age);
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
redis: (config) => {
|
|
110
|
+
return configProvider.create(async (app) => {
|
|
111
|
+
const { RedisStore } = await import("./redis-KDWIBKUQ.js");
|
|
112
|
+
const redis = await app.container.make("redis");
|
|
113
|
+
return (_, sessionConfig) => {
|
|
114
|
+
return new RedisStore(redis.connection(config.connection), sessionConfig.age);
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
cookie: () => {
|
|
119
|
+
return configProvider.create(async () => {
|
|
120
|
+
const { CookieStore } = await import("./cookie-H7KRZB4T.js");
|
|
121
|
+
return (ctx, sessionConfig) => {
|
|
122
|
+
return new CookieStore(sessionConfig.cookie, ctx);
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export {
|
|
129
|
+
configure,
|
|
130
|
+
stubsRoot,
|
|
131
|
+
defineConfig,
|
|
132
|
+
stores
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=chunk-QH2GQQKL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../configure.ts","../stubs/main.ts","../src/define_config.ts","../src/stores/memory.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 type Configure from '@adonisjs/core/commands/configure'\n\n/**\n * Configures the package\n */\nexport async function configure(command: Configure) {\n /**\n * Publish config file\n */\n await command.publishStub('config.stub')\n\n const codemods = await command.createCodemods()\n\n /**\n * Define environment variables\n */\n await codemods.defineEnvVariables({ SESSION_DRIVER: 'cookie' })\n\n /**\n * Define environment variables validations\n */\n await codemods.defineEnvValidations({\n variables: {\n SESSION_DRIVER: `Env.schema.enum(['cookie', 'memory'] as const)`,\n },\n leadingComment: 'Variables for configuring session package',\n })\n\n /**\n * Register middleware\n */\n await codemods.registerMiddleware('router', [\n {\n path: '@adonisjs/session/session_middleware',\n },\n ])\n\n /**\n * Register provider\n */\n await codemods.updateRcFile((rcFile) => {\n rcFile.addProvider('@adonisjs/session/session_provider')\n })\n}\n","/*\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 { getDirname } from '@poppinss/utils'\n\nexport const stubsRoot = getDirname(import.meta.url)\n","/*\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\n/// <reference types=\"@adonisjs/redis/redis_provider\" />\n\nimport string from '@poppinss/utils/string'\nimport { configProvider } from '@adonisjs/core'\nimport type { ConfigProvider } from '@adonisjs/core/types'\nimport { InvalidArgumentsException } from '@poppinss/utils'\nimport type { CookieOptions } from '@adonisjs/core/types/http'\n\nimport debug from './debug.js'\nimport { MemoryStore } from './stores/memory.js'\nimport type {\n SessionConfig,\n FileStoreConfig,\n RedisStoreConfig,\n SessionStoreFactory,\n} from './types.js'\n\n/**\n * Resolved config with stores\n */\ntype ResolvedConfig<KnownStores extends Record<string, SessionStoreFactory>> = SessionConfig & {\n store: keyof KnownStores\n stores: KnownStores\n cookie: Partial<CookieOptions>\n}\n\n/**\n * Helper to normalize session config\n */\nexport function defineConfig<\n KnownStores extends Record<string, SessionStoreFactory | ConfigProvider<SessionStoreFactory>>,\n>(\n config: Partial<SessionConfig> & {\n store: keyof KnownStores | 'memory'\n stores: KnownStores\n }\n): ConfigProvider<\n ResolvedConfig<{\n [K in keyof KnownStores]: SessionStoreFactory\n }>\n> {\n debug('processing session config %O', config)\n\n /**\n * Make sure a store is defined\n */\n if (!config.store) {\n throw new InvalidArgumentsException('Missing \"store\" property inside the session config')\n }\n\n /**\n * Destructuring config with the default values. We pull out\n * stores and cookie values, since we have to transform\n * them in the output value.\n */\n const { stores, cookie, ...rest } = {\n enabled: true,\n age: '2h',\n cookieName: 'adonis_session',\n clearWithBrowser: false,\n ...config,\n }\n\n const cookieOptions: Partial<CookieOptions> = { ...cookie }\n\n /**\n * Define maxAge property when session id cookie is\n * not a session cookie.\n */\n if (!rest.clearWithBrowser) {\n cookieOptions.maxAge = string.seconds.parse(rest.age)\n debug('computing maxAge \"%s\" for session id cookie', cookieOptions.maxAge)\n }\n\n return configProvider.create(async (app) => {\n const storesNames = Object.keys(config.stores)\n\n /**\n * List of stores with memory store always configured\n */\n const storesList = {\n memory: () => new MemoryStore(),\n } as Record<string, SessionStoreFactory>\n\n /**\n * Looping for stores and resolving them\n */\n for (let storeName of storesNames) {\n const store = config.stores[storeName]\n if (typeof store === 'function') {\n storesList[storeName] = store\n } else {\n storesList[storeName] = await store.resolver(app)\n }\n }\n\n const transformedConfig = {\n ...rest,\n cookie: cookieOptions,\n stores: storesList as { [K in keyof KnownStores]: SessionStoreFactory },\n }\n\n debug('transformed session config %O', transformedConfig)\n return transformedConfig\n })\n}\n\n/**\n * Inbuilt stores to store the session data.\n */\nexport const stores: {\n file: (config: FileStoreConfig) => ConfigProvider<SessionStoreFactory>\n redis: (config: RedisStoreConfig) => ConfigProvider<SessionStoreFactory>\n cookie: () => ConfigProvider<SessionStoreFactory>\n} = {\n file: (config) => {\n return configProvider.create(async () => {\n const { FileStore } = await import('./stores/file.js')\n return (_, sessionConfig: SessionConfig) => {\n return new FileStore(config, sessionConfig.age)\n }\n })\n },\n redis: (config) => {\n return configProvider.create(async (app) => {\n const { RedisStore } = await import('./stores/redis.js')\n const redis = await app.container.make('redis')\n\n return (_, sessionConfig: SessionConfig) => {\n return new RedisStore(redis.connection(config.connection), sessionConfig.age)\n }\n })\n },\n cookie: () => {\n return configProvider.create(async () => {\n const { CookieStore } = await import('./stores/cookie.js')\n return (ctx, sessionConfig: SessionConfig) => {\n return new CookieStore(sessionConfig.cookie, ctx)\n }\n })\n },\n}\n","/**\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 type { SessionData, SessionStoreContract } from '../types.js'\n\n/**\n * Memory store is meant to be used for writing tests.\n */\nexport class MemoryStore implements SessionStoreContract {\n static sessions: Map<string, SessionData> = new Map()\n\n /**\n * Read session id value from the memory\n */\n read(sessionId: string): SessionData | null {\n return MemoryStore.sessions.get(sessionId) || null\n }\n\n /**\n * Save in memory value for a given session id\n */\n write(sessionId: string, values: SessionData): void {\n MemoryStore.sessions.set(sessionId, values)\n }\n\n /**\n * Cleanup for a single session\n */\n destroy(sessionId: string): void {\n MemoryStore.sessions.delete(sessionId)\n }\n\n touch(): void {}\n}\n"],"mappings":"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","names":["stores"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// src/debug.ts
|
|
8
|
+
import { debuglog } from "node:util";
|
|
9
|
+
var debug_default = debuglog("adonisjs:session");
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
__export,
|
|
13
|
+
debug_default
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=chunk-WBAYBMJJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/debug.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 { debuglog } from 'node:util'\n\nexport default debuglog('adonisjs:session')\n"],"mappings":";;;;;;;AASA,SAAS,gBAAgB;AAEzB,IAAO,gBAAQ,SAAS,kBAAkB;","names":[]}
|
|
@@ -5,7 +5,7 @@ import env from '#start/env'
|
|
|
5
5
|
import app from '@adonisjs/core/services/app'
|
|
6
6
|
import { defineConfig, stores } from '@adonisjs/session'
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
const sessionConfig = defineConfig({
|
|
9
9
|
enabled: true,
|
|
10
10
|
cookieName: 'adonis-session',
|
|
11
11
|
|
|
@@ -47,3 +47,5 @@ export default defineConfig({
|
|
|
47
47
|
cookie: stores.cookie(),
|
|
48
48
|
}
|
|
49
49
|
})
|
|
50
|
+
|
|
51
|
+
export default sessionConfig
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import {
|
|
2
|
+
debug_default
|
|
3
|
+
} from "./chunk-WBAYBMJJ.js";
|
|
4
|
+
|
|
5
|
+
// src/stores/cookie.ts
|
|
6
|
+
var CookieStore = class {
|
|
7
|
+
#ctx;
|
|
8
|
+
#config;
|
|
9
|
+
constructor(config, ctx) {
|
|
10
|
+
this.#config = config;
|
|
11
|
+
this.#ctx = ctx;
|
|
12
|
+
debug_default("initiating cookie store %O", this.#config);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read session value from the cookie
|
|
16
|
+
*/
|
|
17
|
+
read(sessionId) {
|
|
18
|
+
debug_default("cookie store: reading session data %s", sessionId);
|
|
19
|
+
const cookieValue = this.#ctx.request.encryptedCookie(sessionId);
|
|
20
|
+
if (typeof cookieValue !== "object") {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return cookieValue;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Write session values to the cookie
|
|
27
|
+
*/
|
|
28
|
+
write(sessionId, values) {
|
|
29
|
+
debug_default("cookie store: writing session data %s: %O", sessionId, values);
|
|
30
|
+
this.#ctx.response.encryptedCookie(sessionId, values, this.#config);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Removes the session cookie
|
|
34
|
+
*/
|
|
35
|
+
destroy(sessionId) {
|
|
36
|
+
debug_default("cookie store: destroying session data %s", sessionId);
|
|
37
|
+
if (this.#ctx.request.cookiesList()[sessionId]) {
|
|
38
|
+
this.#ctx.response.clearCookie(sessionId);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Updates the cookie with existing cookie values
|
|
43
|
+
*/
|
|
44
|
+
touch(sessionId) {
|
|
45
|
+
const value = this.read(sessionId);
|
|
46
|
+
debug_default("cookie store: touching session data %s", sessionId);
|
|
47
|
+
if (!value) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.write(sessionId, value);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
export {
|
|
54
|
+
CookieStore
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=cookie-H7KRZB4T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stores/cookie.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 type { HttpContext } from '@adonisjs/core/http'\nimport type { CookieOptions } from '@adonisjs/core/types/http'\n\nimport debug from '../debug.js'\nimport type { SessionData, SessionStoreContract } from '../types.js'\n\n/**\n * Cookie store stores the session data inside an encrypted\n * cookie.\n */\nexport class CookieStore implements SessionStoreContract {\n #ctx: HttpContext\n #config: Partial<CookieOptions>\n\n constructor(config: Partial<CookieOptions>, ctx: HttpContext) {\n this.#config = config\n this.#ctx = ctx\n debug('initiating cookie store %O', this.#config)\n }\n\n /**\n * Read session value from the cookie\n */\n read(sessionId: string): SessionData | null {\n debug('cookie store: reading session data %s', sessionId)\n\n const cookieValue = this.#ctx.request.encryptedCookie(sessionId)\n if (typeof cookieValue !== 'object') {\n return null\n }\n\n return cookieValue\n }\n\n /**\n * Write session values to the cookie\n */\n write(sessionId: string, values: SessionData): void {\n debug('cookie store: writing session data %s: %O', sessionId, values)\n this.#ctx.response.encryptedCookie(sessionId, values, this.#config)\n }\n\n /**\n * Removes the session cookie\n */\n destroy(sessionId: string): void {\n debug('cookie store: destroying session data %s', sessionId)\n if (this.#ctx.request.cookiesList()[sessionId]) {\n this.#ctx.response.clearCookie(sessionId)\n }\n }\n\n /**\n * Updates the cookie with existing cookie values\n */\n touch(sessionId: string): void {\n const value = this.read(sessionId)\n debug('cookie store: touching session data %s', sessionId)\n if (!value) {\n return\n }\n\n this.write(sessionId, value)\n }\n}\n"],"mappings":";;;;;AAmBO,IAAM,cAAN,MAAkD;AAAA,EACvD;AAAA,EACA;AAAA,EAEA,YAAY,QAAgC,KAAkB;AAC5D,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,kBAAM,8BAA8B,KAAK,OAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,WAAuC;AAC1C,kBAAM,yCAAyC,SAAS;AAExD,UAAM,cAAc,KAAK,KAAK,QAAQ,gBAAgB,SAAS;AAC/D,QAAI,OAAO,gBAAgB,UAAU;AACnC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAmB,QAA2B;AAClD,kBAAM,6CAA6C,WAAW,MAAM;AACpE,SAAK,KAAK,SAAS,gBAAgB,WAAW,QAAQ,KAAK,OAAO;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,WAAyB;AAC/B,kBAAM,4CAA4C,SAAS;AAC3D,QAAI,KAAK,KAAK,QAAQ,YAAY,EAAE,SAAS,GAAG;AAC9C,WAAK,KAAK,SAAS,YAAY,SAAS;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAyB;AAC7B,UAAM,QAAQ,KAAK,KAAK,SAAS;AACjC,kBAAM,0CAA0C,SAAS;AACzD,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,SAAK,MAAM,WAAW,KAAK;AAAA,EAC7B;AACF;","names":[]}
|
package/build/factories/main.js
CHANGED
|
@@ -1,9 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import {
|
|
2
|
+
defineConfig
|
|
3
|
+
} from "../chunk-QH2GQQKL.js";
|
|
4
|
+
import {
|
|
5
|
+
SessionMiddleware
|
|
6
|
+
} from "../chunk-C6BYE7BG.js";
|
|
7
|
+
import "../chunk-2X5L327N.js";
|
|
8
|
+
import "../chunk-KM6IRYLY.js";
|
|
9
|
+
import "../chunk-WBAYBMJJ.js";
|
|
10
|
+
|
|
11
|
+
// factories/session_middleware_factory.ts
|
|
12
|
+
import { Emitter } from "@adonisjs/core/events";
|
|
13
|
+
import { AppFactory } from "@adonisjs/core/factories/app";
|
|
14
|
+
var SessionMiddlewareFactory = class {
|
|
15
|
+
#config = {
|
|
16
|
+
store: "memory",
|
|
17
|
+
stores: {}
|
|
18
|
+
};
|
|
19
|
+
#emitter;
|
|
20
|
+
#getApp() {
|
|
21
|
+
return new AppFactory().create(new URL("./", import.meta.url), () => {
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
#getEmitter() {
|
|
25
|
+
return this.#emitter || new Emitter(this.#getApp());
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Merge custom options
|
|
29
|
+
*/
|
|
30
|
+
merge(options) {
|
|
31
|
+
if (options.config) {
|
|
32
|
+
this.#config = options.config;
|
|
33
|
+
}
|
|
34
|
+
if (options.emitter) {
|
|
35
|
+
this.#emitter = options.emitter;
|
|
36
|
+
}
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Creates an instance of the session middleware
|
|
41
|
+
*/
|
|
42
|
+
async create() {
|
|
43
|
+
const config = await defineConfig(this.#config).resolver(this.#getApp());
|
|
44
|
+
return new SessionMiddleware(config, this.#getEmitter());
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
export {
|
|
48
|
+
SessionMiddlewareFactory
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../factories/session_middleware_factory.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 { Emitter } from '@adonisjs/core/events'\nimport { AppFactory } from '@adonisjs/core/factories/app'\nimport type { ApplicationService, EventsList } from '@adonisjs/core/types'\n\nimport { defineConfig } from '../index.js'\nimport SessionMiddleware from '../src/session_middleware.js'\nimport type { SessionConfig, SessionStoreFactory } from '../src/types.js'\n\n/**\n * Exposes the API to create an instance of the session middleware\n * without additional plumbing\n */\nexport class SessionMiddlewareFactory {\n #config: Partial<SessionConfig> & {\n store: string\n stores: Record<string, SessionStoreFactory>\n } = {\n store: 'memory',\n stores: {},\n }\n\n #emitter?: Emitter<EventsList>\n\n #getApp() {\n return new AppFactory().create(new URL('./', import.meta.url), () => {}) as ApplicationService\n }\n\n #getEmitter() {\n return this.#emitter || new Emitter<EventsList>(this.#getApp())\n }\n\n /**\n * Merge custom options\n */\n merge(options: {\n config?: Partial<SessionConfig> & {\n store: string\n stores: Record<string, SessionStoreFactory>\n }\n emitter?: Emitter<EventsList>\n }) {\n if (options.config) {\n this.#config = options.config\n }\n\n if (options.emitter) {\n this.#emitter = options.emitter\n }\n\n return this\n }\n\n /**\n * Creates an instance of the session middleware\n */\n async create() {\n const config = await defineConfig(this.#config).resolver(this.#getApp())\n return new SessionMiddleware(config, this.#getEmitter())\n }\n}\n"],"mappings":";;;;;;;;;;;AASA,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAWpB,IAAM,2BAAN,MAA+B;AAAA,EACpC,UAGI;AAAA,IACF,OAAO;AAAA,IACP,QAAQ,CAAC;AAAA,EACX;AAAA,EAEA;AAAA,EAEA,UAAU;AACR,WAAO,IAAI,WAAW,EAAE,OAAO,IAAI,IAAI,MAAM,YAAY,GAAG,GAAG,MAAM;AAAA,IAAC,CAAC;AAAA,EACzE;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK,YAAY,IAAI,QAAoB,KAAK,QAAQ,CAAC;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAMH;AACD,QAAI,QAAQ,QAAQ;AAClB,WAAK,UAAU,QAAQ;AAAA,IACzB;AAEA,QAAI,QAAQ,SAAS;AACnB,WAAK,WAAW,QAAQ;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS;AACb,UAAM,SAAS,MAAM,aAAa,KAAK,OAAO,EAAE,SAAS,KAAK,QAAQ,CAAC;AACvE,WAAO,IAAI,kBAAkB,QAAQ,KAAK,YAAY,CAAC;AAAA,EACzD;AACF;","names":[]}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import {
|
|
2
|
+
debug_default
|
|
3
|
+
} from "./chunk-WBAYBMJJ.js";
|
|
4
|
+
|
|
5
|
+
// src/stores/file.ts
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
7
|
+
import string from "@poppinss/utils/string";
|
|
8
|
+
import { MessageBuilder } from "@adonisjs/core/helpers";
|
|
9
|
+
import { access, mkdir, readFile, rm, writeFile, utimes, stat } from "node:fs/promises";
|
|
10
|
+
var FileStore = class {
|
|
11
|
+
#config;
|
|
12
|
+
#age;
|
|
13
|
+
constructor(config, age) {
|
|
14
|
+
this.#config = config;
|
|
15
|
+
this.#age = age;
|
|
16
|
+
debug_default("initiating file store %O", this.#config);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Returns an absolute path to the session id file
|
|
20
|
+
*/
|
|
21
|
+
#getFilePath(sessionId) {
|
|
22
|
+
return join(this.#config.location, `${sessionId}.txt`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if a file exists at a given path or not
|
|
26
|
+
*/
|
|
27
|
+
async #pathExists(path) {
|
|
28
|
+
try {
|
|
29
|
+
await access(path);
|
|
30
|
+
return true;
|
|
31
|
+
} catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns stats for a file and ignoring missing
|
|
37
|
+
* files.
|
|
38
|
+
*/
|
|
39
|
+
async #stats(path) {
|
|
40
|
+
try {
|
|
41
|
+
const stats = await stat(path);
|
|
42
|
+
return stats;
|
|
43
|
+
} catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Output file with contents to the given path
|
|
49
|
+
*/
|
|
50
|
+
async #outputFile(path, contents) {
|
|
51
|
+
const pathDirname = dirname(path);
|
|
52
|
+
const dirExists = await this.#pathExists(pathDirname);
|
|
53
|
+
if (!dirExists) {
|
|
54
|
+
await mkdir(pathDirname, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
await writeFile(path, contents, "utf-8");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Reads the session data from the disk.
|
|
60
|
+
*/
|
|
61
|
+
async read(sessionId) {
|
|
62
|
+
const filePath = this.#getFilePath(sessionId);
|
|
63
|
+
debug_default("file store: reading session data %", sessionId);
|
|
64
|
+
const stats = await this.#stats(filePath);
|
|
65
|
+
if (!stats) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const sessionWillExpireAt = stats.mtimeMs + string.milliseconds.parse(this.#age);
|
|
69
|
+
if (Date.now() > sessionWillExpireAt) {
|
|
70
|
+
debug_default("file store: expired session data %s", sessionId);
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
let contents = await readFile(filePath, "utf-8");
|
|
74
|
+
contents = contents.trim();
|
|
75
|
+
if (!contents) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
return new MessageBuilder().verify(contents, sessionId);
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Writes the session data to the disk as a string
|
|
86
|
+
*/
|
|
87
|
+
async write(sessionId, values) {
|
|
88
|
+
debug_default("file store: writing session data %s: %O", sessionId, values);
|
|
89
|
+
const filePath = this.#getFilePath(sessionId);
|
|
90
|
+
const message = new MessageBuilder().build(values, void 0, sessionId);
|
|
91
|
+
await this.#outputFile(filePath, message);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Removes the session file from the disk
|
|
95
|
+
*/
|
|
96
|
+
async destroy(sessionId) {
|
|
97
|
+
debug_default("file store: destroying session data %s", sessionId);
|
|
98
|
+
await rm(this.#getFilePath(sessionId), { force: true });
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Updates the session expiry by rewriting it to the
|
|
102
|
+
* persistence store
|
|
103
|
+
*/
|
|
104
|
+
async touch(sessionId) {
|
|
105
|
+
debug_default("file store: touching session data %s", sessionId);
|
|
106
|
+
await utimes(this.#getFilePath(sessionId), /* @__PURE__ */ new Date(), /* @__PURE__ */ new Date());
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
export {
|
|
110
|
+
FileStore
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=file-YO7C2QWO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stores/file.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 type { Stats } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport string from '@poppinss/utils/string'\nimport { MessageBuilder } from '@adonisjs/core/helpers'\nimport { access, mkdir, readFile, rm, writeFile, utimes, stat } from 'node:fs/promises'\n\nimport debug from '../debug.js'\nimport type { FileStoreConfig, SessionData, SessionStoreContract } from '../types.js'\n\n/**\n * File store writes the session data on the file system as. Each session\n * id gets its own file.\n */\nexport class FileStore implements SessionStoreContract {\n #config: FileStoreConfig\n #age: string | number\n\n constructor(config: FileStoreConfig, age: string | number) {\n this.#config = config\n this.#age = age\n debug('initiating file store %O', this.#config)\n }\n\n /**\n * Returns an absolute path to the session id file\n */\n #getFilePath(sessionId: string): string {\n return join(this.#config.location, `${sessionId}.txt`)\n }\n\n /**\n * Check if a file exists at a given path or not\n */\n async #pathExists(path: string) {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Returns stats for a file and ignoring missing\n * files.\n */\n async #stats(path: string): Promise<Stats | null> {\n try {\n const stats = await stat(path)\n return stats\n } catch {\n return null\n }\n }\n\n /**\n * Output file with contents to the given path\n */\n async #outputFile(path: string, contents: string) {\n const pathDirname = dirname(path)\n\n const dirExists = await this.#pathExists(pathDirname)\n if (!dirExists) {\n await mkdir(pathDirname, { recursive: true })\n }\n\n await writeFile(path, contents, 'utf-8')\n }\n\n /**\n * Reads the session data from the disk.\n */\n async read(sessionId: string): Promise<SessionData | null> {\n const filePath = this.#getFilePath(sessionId)\n debug('file store: reading session data %', sessionId)\n\n /**\n * Return null when no session id file exists in first\n * place\n */\n const stats = await this.#stats(filePath)\n if (!stats) {\n return null\n }\n\n /**\n * Check if the file has been expired and return null (if expired)\n */\n const sessionWillExpireAt = stats.mtimeMs + string.milliseconds.parse(this.#age)\n if (Date.now() > sessionWillExpireAt) {\n debug('file store: expired session data %s', sessionId)\n return null\n }\n\n /**\n * Reading the file contents if the file exists\n */\n let contents = await readFile(filePath, 'utf-8')\n contents = contents.trim()\n if (!contents) {\n return null\n }\n\n /**\n * Verify contents with the session id and return them as an object. The verify\n * method can fail when the contents is not JSON>\n */\n try {\n return new MessageBuilder().verify<SessionData>(contents, sessionId)\n } catch {\n return null\n }\n }\n\n /**\n * Writes the session data to the disk as a string\n */\n async write(sessionId: string, values: SessionData): Promise<void> {\n debug('file store: writing session data %s: %O', sessionId, values)\n\n const filePath = this.#getFilePath(sessionId)\n const message = new MessageBuilder().build(values, undefined, sessionId)\n\n await this.#outputFile(filePath, message)\n }\n\n /**\n * Removes the session file from the disk\n */\n async destroy(sessionId: string): Promise<void> {\n debug('file store: destroying session data %s', sessionId)\n await rm(this.#getFilePath(sessionId), { force: true })\n }\n\n /**\n * Updates the session expiry by rewriting it to the\n * persistence store\n */\n async touch(sessionId: string): Promise<void> {\n debug('file store: touching session data %s', sessionId)\n await utimes(this.#getFilePath(sessionId), new Date(), new Date())\n }\n}\n"],"mappings":";;;;;AAUA,SAAS,SAAS,YAAY;AAC9B,OAAO,YAAY;AACnB,SAAS,sBAAsB;AAC/B,SAAS,QAAQ,OAAO,UAAU,IAAI,WAAW,QAAQ,YAAY;AAS9D,IAAM,YAAN,MAAgD;AAAA,EACrD;AAAA,EACA;AAAA,EAEA,YAAY,QAAyB,KAAsB;AACzD,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,kBAAM,4BAA4B,KAAK,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAA2B;AACtC,WAAO,KAAK,KAAK,QAAQ,UAAU,GAAG,SAAS,MAAM;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAc;AAC9B,QAAI;AACF,YAAM,OAAO,IAAI;AACjB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,MAAqC;AAChD,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,IAAI;AAC7B,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAc,UAAkB;AAChD,UAAM,cAAc,QAAQ,IAAI;AAEhC,UAAM,YAAY,MAAM,KAAK,YAAY,WAAW;AACpD,QAAI,CAAC,WAAW;AACd,YAAM,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,IAC9C;AAEA,UAAM,UAAU,MAAM,UAAU,OAAO;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,WAAgD;AACzD,UAAM,WAAW,KAAK,aAAa,SAAS;AAC5C,kBAAM,sCAAsC,SAAS;AAMrD,UAAM,QAAQ,MAAM,KAAK,OAAO,QAAQ;AACxC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAKA,UAAM,sBAAsB,MAAM,UAAU,OAAO,aAAa,MAAM,KAAK,IAAI;AAC/E,QAAI,KAAK,IAAI,IAAI,qBAAqB;AACpC,oBAAM,uCAAuC,SAAS;AACtD,aAAO;AAAA,IACT;AAKA,QAAI,WAAW,MAAM,SAAS,UAAU,OAAO;AAC/C,eAAW,SAAS,KAAK;AACzB,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAMA,QAAI;AACF,aAAO,IAAI,eAAe,EAAE,OAAoB,UAAU,SAAS;AAAA,IACrE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,WAAmB,QAAoC;AACjE,kBAAM,2CAA2C,WAAW,MAAM;AAElE,UAAM,WAAW,KAAK,aAAa,SAAS;AAC5C,UAAM,UAAU,IAAI,eAAe,EAAE,MAAM,QAAQ,QAAW,SAAS;AAEvE,UAAM,KAAK,YAAY,UAAU,OAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,WAAkC;AAC9C,kBAAM,0CAA0C,SAAS;AACzD,UAAM,GAAG,KAAK,aAAa,SAAS,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,WAAkC;AAC5C,kBAAM,wCAAwC,SAAS;AACvD,UAAM,OAAO,KAAK,aAAa,SAAS,GAAG,oBAAI,KAAK,GAAG,oBAAI,KAAK,CAAC;AAAA,EACnE;AACF;","names":[]}
|
package/build/index.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export {
|
|
12
|
-
|
|
1
|
+
import {
|
|
2
|
+
configure,
|
|
3
|
+
defineConfig,
|
|
4
|
+
stores,
|
|
5
|
+
stubsRoot
|
|
6
|
+
} from "./chunk-QH2GQQKL.js";
|
|
7
|
+
import {
|
|
8
|
+
errors_exports
|
|
9
|
+
} from "./chunk-2X5L327N.js";
|
|
10
|
+
import "./chunk-WBAYBMJJ.js";
|
|
11
|
+
export {
|
|
12
|
+
configure,
|
|
13
|
+
defineConfig,
|
|
14
|
+
errors_exports as errors,
|
|
15
|
+
stores,
|
|
16
|
+
stubsRoot
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|