@c9up/ream 0.1.28 → 0.1.30
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 +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/services/app.d.ts.map +1 -1
- package/dist/services/app.js +9 -0
- package/dist/services/app.js.map +1 -1
- package/dist/services/console.d.ts.map +1 -1
- package/dist/services/console.js +9 -0
- package/dist/services/console.js.map +1 -1
- package/dist/services/server.d.ts.map +1 -1
- package/dist/services/server.js +9 -0
- package/dist/services/server.js.map +1 -1
- package/dist/session/Session.d.ts +14 -0
- package/dist/session/Session.d.ts.map +1 -1
- package/dist/session/Session.js.map +1 -1
- package/dist/session/SessionMiddleware.d.ts.map +1 -1
- package/dist/session/SessionMiddleware.js +9 -0
- package/dist/session/SessionMiddleware.js.map +1 -1
- package/dist/session/drivers/RedisDriver.d.ts +38 -0
- package/dist/session/drivers/RedisDriver.d.ts.map +1 -0
- package/dist/session/drivers/RedisDriver.js +80 -0
- package/dist/session/drivers/RedisDriver.js.map +1 -0
- package/dist/session/quasar.d.ts +18 -0
- package/dist/session/quasar.d.ts.map +1 -0
- package/dist/session/quasar.js +62 -0
- package/dist/session/quasar.js.map +1 -0
- package/events.win32-x64-msvc.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +6 -2
- package/scheduler.win32-x64-msvc.node +0 -0
- package/src/index.ts +6 -0
- package/src/services/app.ts +9 -0
- package/src/services/console.ts +9 -0
- package/src/services/server.ts +9 -0
- package/src/session/Session.ts +15 -0
- package/src/session/SessionMiddleware.ts +8 -0
- package/src/session/drivers/RedisDriver.ts +106 -0
- package/src/session/quasar.ts +78 -0
package/README.md
CHANGED
|
@@ -93,7 +93,7 @@ nothing about ream, and ream owns no test execution. `tests/bootstrap.ts`
|
|
|
93
93
|
Driving it yourself (a `bin/test.ts`, a console command) is the same call:
|
|
94
94
|
|
|
95
95
|
```ts
|
|
96
|
-
import { runTestsFromRcFile } from '@c9up/ream/
|
|
96
|
+
import { runTestsFromRcFile } from '@c9up/helix-plugin-ream/runner'
|
|
97
97
|
|
|
98
98
|
process.exitCode = await runTestsFromRcFile('./reamrc.ts', {
|
|
99
99
|
suites: process.argv.slice(2),
|
package/dist/index.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export { Response } from './http/Response.js';
|
|
|
22
22
|
export { type GetterFn, Macroable, type MacroFn } from './utils/Macroable.js';
|
|
23
23
|
export { CookieDriver as SessionCookieDriver } from './session/drivers/CookieDriver.js';
|
|
24
24
|
export { MemoryDriver as SessionMemoryDriver } from './session/drivers/MemoryDriver.js';
|
|
25
|
+
export type { RedisSessionOptions, SessionRedisClient, SessionRedisClientSource, } from './session/drivers/RedisDriver.js';
|
|
26
|
+
export { RedisDriver as SessionRedisDriver } from './session/drivers/RedisDriver.js';
|
|
25
27
|
export type { SessionConfig, SessionDriver } from './session/Session.js';
|
|
26
28
|
export { Session } from './session/Session.js';
|
|
27
29
|
export { default as SessionMiddleware } from './session/SessionMiddleware.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -22,6 +22,7 @@ export { Macroable } from './utils/Macroable.js';
|
|
|
22
22
|
// ─── Session ────────────────────────────────────────────────
|
|
23
23
|
export { CookieDriver as SessionCookieDriver } from './session/drivers/CookieDriver.js';
|
|
24
24
|
export { MemoryDriver as SessionMemoryDriver } from './session/drivers/MemoryDriver.js';
|
|
25
|
+
export { RedisDriver as SessionRedisDriver } from './session/drivers/RedisDriver.js';
|
|
25
26
|
export { Session } from './session/Session.js';
|
|
26
27
|
export { default as SessionMiddleware } from './session/SessionMiddleware.js';
|
|
27
28
|
export { default as BodyParserMiddleware } from './bodyparser/BodyParserMiddleware.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,kBAAkB,CAAA;AAEzB,+DAA+D;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EACL,WAAW,GAMZ,MAAM,iBAAiB,CAAA;AAExB,+DAA+D;AAE/D,OAAO,EACL,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,SAAS,EAGT,gBAAgB,EAChB,yBAAyB,EACzB,gBAAgB,GAEjB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAiB,SAAS,EAAgB,MAAM,sBAAsB,CAAA;AAE7E,+DAA+D;AAE/D,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvF,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/services/app.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAIpD,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAE/C;AAED,QAAA,MAAM,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/services/app.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAIpD,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAE/C;AAED,QAAA,MAAM,GAAG,EAAE,WAsBT,CAAA;AAEF,eAAe,GAAG,CAAA"}
|
package/dist/services/app.js
CHANGED
|
@@ -22,6 +22,15 @@ export function clearApp(app) {
|
|
|
22
22
|
}
|
|
23
23
|
const app = new Proxy({}, {
|
|
24
24
|
get(_target, prop) {
|
|
25
|
+
// A module loader inspects what it imports before anyone uses it: it reads
|
|
26
|
+
// `then` to decide whether the namespace is thenable, and various symbols
|
|
27
|
+
// for interop and formatting. Throwing on those turns a plain
|
|
28
|
+
// `import { setX } from '.../services/x'` into a crash at import time, far
|
|
29
|
+
// from any real use. They are not members of what this stands in for, so
|
|
30
|
+
// answer undefined and let a genuine access be the one that reports.
|
|
31
|
+
if (typeof prop === 'symbol' || prop === 'then') {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
25
34
|
if (!instance) {
|
|
26
35
|
throw new Error('Application accessed before initialization. ' +
|
|
27
36
|
'Ensure this code runs during or after the boot phase.');
|
package/dist/services/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/services/app.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,IAAI,QAAiC,CAAA;AAErC,0DAA0D;AAC1D,MAAM,UAAU,MAAM,CAAC,GAAgB;IACrC,QAAQ,GAAG,GAAG,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAgB;IACvC,IAAI,QAAQ,KAAK,GAAG;QAAE,QAAQ,GAAG,SAAS,CAAA;AAC5C,CAAC;AAED,MAAM,GAAG,GAAgB,IAAI,KAAK,CAAC,EAAiB,EAAE;IACpD,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,8CAA8C;gBAC5C,uDAAuD,CAC1D,CAAA;QACH,CAAC;QACD,gEAAgE;QAChE,wDAAwD;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QACnD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnE,CAAC;CACF,CAAC,CAAA;AAEF,eAAe,GAAG,CAAA"}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/services/app.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,IAAI,QAAiC,CAAA;AAErC,0DAA0D;AAC1D,MAAM,UAAU,MAAM,CAAC,GAAgB;IACrC,QAAQ,GAAG,GAAG,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAgB;IACvC,IAAI,QAAQ,KAAK,GAAG;QAAE,QAAQ,GAAG,SAAS,CAAA;AAC5C,CAAC;AAED,MAAM,GAAG,GAAgB,IAAI,KAAK,CAAC,EAAiB,EAAE;IACpD,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,2EAA2E;QAC3E,0EAA0E;QAC1E,8DAA8D;QAC9D,2EAA2E;QAC3E,yEAAyE;QACzE,qEAAqE;QACrE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAChD,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,8CAA8C;gBAC5C,uDAAuD,CAC1D,CAAA;QACH,CAAC;QACD,gEAAgE;QAChE,wDAAwD;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QACnD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnE,CAAC;CACF,CAAC,CAAA;AAEF,eAAe,GAAG,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/services/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAIpD,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAEtD;AAED,QAAA,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/services/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAIpD,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAEtD;AAED,QAAA,MAAM,UAAU,EAAE,OAoBhB,CAAA;AAEF,eAAe,UAAU,CAAA"}
|
package/dist/services/console.js
CHANGED
|
@@ -23,6 +23,15 @@ export function clearConsole(consoleApp) {
|
|
|
23
23
|
}
|
|
24
24
|
const consoleApp = new Proxy({}, {
|
|
25
25
|
get(_target, prop) {
|
|
26
|
+
// A module loader inspects what it imports before anyone uses it: it reads
|
|
27
|
+
// `then` to decide whether the namespace is thenable, and various symbols
|
|
28
|
+
// for interop and formatting. Throwing on those turns a plain
|
|
29
|
+
// `import { setX } from '.../services/x'` into a crash at import time, far
|
|
30
|
+
// from any real use. They are not members of what this stands in for, so
|
|
31
|
+
// answer undefined and let a genuine access be the one that reports.
|
|
32
|
+
if (typeof prop === 'symbol' || prop === 'then') {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
26
35
|
if (!instance) {
|
|
27
36
|
throw new Error('Console accessed before initialization. ' +
|
|
28
37
|
'Ensure this code runs during or after the boot phase.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/services/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,IAAI,QAA6B,CAAA;AAEjC,iEAAiE;AACjE,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,QAAQ,GAAG,UAAU,CAAA;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,UAAmB;IAC9C,IAAI,QAAQ,KAAK,UAAU;QAAE,QAAQ,GAAG,SAAS,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,GAAY,IAAI,KAAK,CAAC,EAAa,EAAE;IACnD,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,0CAA0C;gBACxC,uDAAuD,CAC1D,CAAA;QACH,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QACnD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnE,CAAC;CACF,CAAC,CAAA;AAEF,eAAe,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/services/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,IAAI,QAA6B,CAAA;AAEjC,iEAAiE;AACjE,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,QAAQ,GAAG,UAAU,CAAA;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,UAAmB;IAC9C,IAAI,QAAQ,KAAK,UAAU;QAAE,QAAQ,GAAG,SAAS,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,GAAY,IAAI,KAAK,CAAC,EAAa,EAAE;IACnD,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,2EAA2E;QAC3E,0EAA0E;QAC1E,8DAA8D;QAC9D,2EAA2E;QAC3E,yEAAyE;QACzE,qEAAqE;QACrE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAChD,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,0CAA0C;gBACxC,uDAAuD,CAC1D,CAAA;QACH,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QACnD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnE,CAAC;CACF,CAAC,CAAA;AAEF,eAAe,UAAU,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/services/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAIjD,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,kDAAkD;AAClD,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAED,QAAA,MAAM,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/services/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAIjD,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,kDAAkD;AAClD,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAED,QAAA,MAAM,MAAM,EAAE,MAuBZ,CAAA;AAEF,eAAe,MAAM,CAAA"}
|
package/dist/services/server.js
CHANGED
|
@@ -25,6 +25,15 @@ export function getServer() {
|
|
|
25
25
|
}
|
|
26
26
|
const server = new Proxy({}, {
|
|
27
27
|
get(_target, prop) {
|
|
28
|
+
// A module loader inspects what it imports before anyone uses it: it reads
|
|
29
|
+
// `then` to decide whether the namespace is thenable, and various symbols
|
|
30
|
+
// for interop and formatting. Throwing on those turns a plain
|
|
31
|
+
// `import { setX } from '.../services/x'` into a crash at import time, far
|
|
32
|
+
// from any real use. They are not members of what this stands in for, so
|
|
33
|
+
// answer undefined and let a genuine access be the one that reports.
|
|
34
|
+
if (typeof prop === 'symbol' || prop === 'then') {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
28
37
|
if (!instance) {
|
|
29
38
|
throw new Error('Server accessed before initialization. ' +
|
|
30
39
|
'Ensure your kernel files are loaded as preloads in reamrc.ts.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/services/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,IAAI,QAA4B,CAAA;AAEhC,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,QAAQ,GAAG,MAAM,CAAA;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,QAAQ,KAAK,MAAM;QAAE,QAAQ,GAAG,SAAS,CAAA;AAC/C,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,MAAM,GAAW,IAAI,KAAK,CAAC,EAAY,EAAE;IAC7C,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,yCAAyC;gBACvC,+DAA+D,CAClE,CAAA;QACH,CAAC;QACD,mEAAmE;QACnE,iEAAiE;QACjE,gEAAgE;QAChE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QACnD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnE,CAAC;CACF,CAAC,CAAA;AAEF,eAAe,MAAM,CAAA"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/services/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,IAAI,QAA4B,CAAA;AAEhC,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,QAAQ,GAAG,MAAM,CAAA;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,QAAQ,KAAK,MAAM;QAAE,QAAQ,GAAG,SAAS,CAAA;AAC/C,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,MAAM,GAAW,IAAI,KAAK,CAAC,EAAY,EAAE;IAC7C,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,2EAA2E;QAC3E,0EAA0E;QAC1E,8DAA8D;QAC9D,2EAA2E;QAC3E,yEAAyE;QACzE,qEAAqE;QACrE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAChD,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,yCAAyC;gBACvC,+DAA+D,CAClE,CAAA;QACH,CAAC;QACD,mEAAmE;QACnE,iEAAiE;QACjE,gEAAgE;QAChE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QACnD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACnE,CAAC;CACF,CAAC,CAAA;AAEF,eAAe,MAAM,CAAA"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Backed by pluggable drivers (cookie, memory, redis).
|
|
11
11
|
*/
|
|
12
|
+
import type { SessionRedisClientSource } from './drivers/RedisDriver.js';
|
|
12
13
|
export interface SessionDriver {
|
|
13
14
|
read(sessionId: string): Promise<Record<string, unknown>>;
|
|
14
15
|
write(sessionId: string, data: Record<string, unknown>, ttl: number): Promise<void>;
|
|
@@ -28,6 +29,19 @@ export interface SessionConfig {
|
|
|
28
29
|
* behaviour. Express-session and AdonisJS expose the same toggle.
|
|
29
30
|
*/
|
|
30
31
|
rolling?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* `redis` driver only — the quasar connection to store sessions on. Left
|
|
34
|
+
* unset, the default connection is used.
|
|
35
|
+
*/
|
|
36
|
+
connection?: string;
|
|
37
|
+
/**
|
|
38
|
+
* `redis` driver only — a client to use instead of resolving one through
|
|
39
|
+
* quasar. Anything carrying get/set/del/expire satisfies it, so an app can
|
|
40
|
+
* share the client it already has.
|
|
41
|
+
*/
|
|
42
|
+
client?: SessionRedisClientSource;
|
|
43
|
+
/** `redis` driver only — key prefix. Defaults to `ream:session:`. */
|
|
44
|
+
prefix?: string;
|
|
31
45
|
}
|
|
32
46
|
export declare class Session {
|
|
33
47
|
#private;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../../src/session/Session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACzD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrD;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../../src/session/Session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAExE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACzD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrD;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,wBAAwB,CAAA;IACjC,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAmBD,qBAAa,OAAO;;gBAeN,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAajE,qDAAqD;IACrD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;;;;;;;;;OAWG;IACH,UAAU,IAAI,IAAI;IAMlB,8EAA8E;IAC9E,cAAc,IAAI,OAAO;IAIzB,4GAA4G;IAC5G,iBAAiB,IAAI,MAAM;IAI3B,2BAA2B;IAC3B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC;IASlD,2BAA2B;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAKtC,6BAA6B;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,4BAA4B;IAC5B,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI9B,oBAAoB;IACpB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKzB,4BAA4B;IAC5B,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC;IAMnD,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IAKb,iCAAiC;IACjC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,IAAI;IAKxC,iCAAiC;IACjC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,IAAI;IAMxC,2DAA2D;IAC3D,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAKxC,+BAA+B;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAO9C,gCAAgC;IAChC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAO/D,sCAAsC;IACtC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAQjE,qDAAqD;IACrD,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIxC,8DAA8D;IAC9D,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC;IAWlD,mEAAmE;IACnE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQjC,OAAO,IAAI,OAAO;CAGnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Session.js","sourceRoot":"","sources":["../../src/session/Session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"Session.js","sourceRoot":"","sources":["../../src/session/Session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionMiddleware.d.ts","sourceRoot":"","sources":["../../src/session/SessionMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"SessionMiddleware.d.ts","sourceRoot":"","sources":["../../src/session/SessionMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAKzD,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAA;AAWhE,MAAM,CAAC,OAAO,OAAO,iBAAiB;;gBAKxB,MAAM,CAAC,EAAE,aAAa,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IA8BlD,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;CAyGzD"}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
import { randomBytes } from 'node:crypto';
|
|
8
8
|
import { CookieDriver } from './drivers/CookieDriver.js';
|
|
9
9
|
import { MemoryDriver } from './drivers/MemoryDriver.js';
|
|
10
|
+
import { RedisDriver } from './drivers/RedisDriver.js';
|
|
11
|
+
import { quasarConnection } from './quasar.js';
|
|
10
12
|
import { Session } from './Session.js';
|
|
11
13
|
export default class SessionMiddleware {
|
|
12
14
|
#driver;
|
|
@@ -30,6 +32,13 @@ export default class SessionMiddleware {
|
|
|
30
32
|
else if (this.#config.driver === 'memory') {
|
|
31
33
|
this.#driver = new MemoryDriver();
|
|
32
34
|
}
|
|
35
|
+
else if (this.#config.driver === 'redis') {
|
|
36
|
+
// Either the app hands a client in, or it names a quasar connection —
|
|
37
|
+
// the same choice echo, bay and warden offer. Nothing is dialled here:
|
|
38
|
+
// the driver resolves on the first request that reads a session.
|
|
39
|
+
const source = config?.client ?? quasarConnection(config?.connection);
|
|
40
|
+
this.#driver = new RedisDriver(source, { prefix: config?.prefix });
|
|
41
|
+
}
|
|
33
42
|
else {
|
|
34
43
|
throw new Error(`Unknown session driver: ${this.#config.driver}`);
|
|
35
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionMiddleware.js","sourceRoot":"","sources":["../../src/session/SessionMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"SessionMiddleware.js","sourceRoot":"","sources":["../../src/session/SessionMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side sessions on Redis — what `Session.ts` has documented as a
|
|
3
|
+
* pluggable driver from the start, and what `SessionMiddleware` points at when
|
|
4
|
+
* a cookie session outgrows its 4KB.
|
|
5
|
+
*
|
|
6
|
+
* The client is structural, so ream depends on no Redis package: hand it an
|
|
7
|
+
* ioredis/node-redis client, or a `@c9up/quasar` connection, or anything that
|
|
8
|
+
* carries these four commands.
|
|
9
|
+
*/
|
|
10
|
+
import type { SessionDriver } from '../Session.js';
|
|
11
|
+
/** The commands a session needs. Compatible with ioredis and node-redis. */
|
|
12
|
+
export interface SessionRedisClient {
|
|
13
|
+
get(key: string): Promise<string | null>;
|
|
14
|
+
set(key: string, value: string, ...args: unknown[]): Promise<unknown>;
|
|
15
|
+
del(key: string | string[]): Promise<number>;
|
|
16
|
+
expire(key: string, seconds: number): Promise<number>;
|
|
17
|
+
}
|
|
18
|
+
/** Where the client comes from — resolved once, on the first request that needs it. */
|
|
19
|
+
export type SessionRedisClientSource = SessionRedisClient | (() => SessionRedisClient | Promise<SessionRedisClient>);
|
|
20
|
+
export interface RedisSessionOptions {
|
|
21
|
+
/** Key prefix. Namespacing matters: a session store usually shares a database. */
|
|
22
|
+
prefix?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class RedisDriver implements SessionDriver {
|
|
25
|
+
#private;
|
|
26
|
+
constructor(source: SessionRedisClientSource, options?: RedisSessionOptions);
|
|
27
|
+
/**
|
|
28
|
+
* Unreadable payloads are treated as an absent session rather than thrown.
|
|
29
|
+
* A corrupt value would otherwise 500 every request carrying that cookie,
|
|
30
|
+
* with no way for the visitor to recover — a new session is the safe answer.
|
|
31
|
+
*/
|
|
32
|
+
read(sessionId: string): Promise<Record<string, unknown>>;
|
|
33
|
+
write(sessionId: string, data: Record<string, unknown>, ttl: number): Promise<void>;
|
|
34
|
+
destroy(sessionId: string): Promise<void>;
|
|
35
|
+
/** Slide the expiry — a session must not die while its owner is active. */
|
|
36
|
+
touch(sessionId: string, ttl: number): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=RedisDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisDriver.d.ts","sourceRoot":"","sources":["../../../src/session/drivers/RedisDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACtD;AAED,uFAAuF;AACvF,MAAM,MAAM,wBAAwB,GAChC,kBAAkB,GAClB,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAA;AAE5D,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,WAAY,YAAW,aAAa;;gBAMnC,MAAM,EAAE,wBAAwB,EAAE,OAAO,GAAE,mBAAwB;IA8B/E;;;;OAIG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAazD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,2EAA2E;IACrE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI3D"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side sessions on Redis — what `Session.ts` has documented as a
|
|
3
|
+
* pluggable driver from the start, and what `SessionMiddleware` points at when
|
|
4
|
+
* a cookie session outgrows its 4KB.
|
|
5
|
+
*
|
|
6
|
+
* The client is structural, so ream depends on no Redis package: hand it an
|
|
7
|
+
* ioredis/node-redis client, or a `@c9up/quasar` connection, or anything that
|
|
8
|
+
* carries these four commands.
|
|
9
|
+
*/
|
|
10
|
+
export class RedisDriver {
|
|
11
|
+
#source;
|
|
12
|
+
#resolved;
|
|
13
|
+
#pending;
|
|
14
|
+
#prefix;
|
|
15
|
+
constructor(source, options = {}) {
|
|
16
|
+
this.#source = source;
|
|
17
|
+
this.#prefix = options.prefix ?? 'ream:session:';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The client, resolved once. Requests racing on a cold start must not each
|
|
21
|
+
* open their own connection, so the in-flight promise is shared.
|
|
22
|
+
*/
|
|
23
|
+
async #client() {
|
|
24
|
+
if (this.#resolved)
|
|
25
|
+
return this.#resolved;
|
|
26
|
+
if (typeof this.#source !== 'function') {
|
|
27
|
+
this.#resolved = this.#source;
|
|
28
|
+
return this.#resolved;
|
|
29
|
+
}
|
|
30
|
+
if (!this.#pending) {
|
|
31
|
+
const resolver = this.#source;
|
|
32
|
+
this.#pending = Promise.resolve(resolver()).then((client) => {
|
|
33
|
+
this.#resolved = client;
|
|
34
|
+
this.#pending = undefined;
|
|
35
|
+
return client;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return this.#pending;
|
|
39
|
+
}
|
|
40
|
+
#key(sessionId) {
|
|
41
|
+
return `${this.#prefix}${sessionId}`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Unreadable payloads are treated as an absent session rather than thrown.
|
|
45
|
+
* A corrupt value would otherwise 500 every request carrying that cookie,
|
|
46
|
+
* with no way for the visitor to recover — a new session is the safe answer.
|
|
47
|
+
*/
|
|
48
|
+
async read(sessionId) {
|
|
49
|
+
const client = await this.#client();
|
|
50
|
+
const raw = await client.get(this.#key(sessionId));
|
|
51
|
+
if (raw === null)
|
|
52
|
+
return {};
|
|
53
|
+
try {
|
|
54
|
+
const parsed = JSON.parse(raw);
|
|
55
|
+
return isPlainRecord(parsed) ? parsed : {};
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async write(sessionId, data, ttl) {
|
|
62
|
+
const client = await this.#client();
|
|
63
|
+
// EX in one command: a SET followed by an EXPIRE leaves the key immortal
|
|
64
|
+
// if the process dies between the two.
|
|
65
|
+
await client.set(this.#key(sessionId), JSON.stringify(data), 'EX', ttl);
|
|
66
|
+
}
|
|
67
|
+
async destroy(sessionId) {
|
|
68
|
+
const client = await this.#client();
|
|
69
|
+
await client.del(this.#key(sessionId));
|
|
70
|
+
}
|
|
71
|
+
/** Slide the expiry — a session must not die while its owner is active. */
|
|
72
|
+
async touch(sessionId, ttl) {
|
|
73
|
+
const client = await this.#client();
|
|
74
|
+
await client.expire(this.#key(sessionId), ttl);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function isPlainRecord(value) {
|
|
78
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=RedisDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisDriver.js","sourceRoot":"","sources":["../../../src/session/drivers/RedisDriver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolving a Redis connection by name, from `@c9up/quasar`.
|
|
3
|
+
*
|
|
4
|
+
* Ream does not depend on quasar: it is an optional peer, and this module
|
|
5
|
+
* never imports it statically. The specifier is built at runtime so the
|
|
6
|
+
* TypeScript build stays free of it too — a hard type import would make ream
|
|
7
|
+
* unbuildable for anyone using cookie or memory sessions.
|
|
8
|
+
*
|
|
9
|
+
* The shape is checked before use rather than asserted, the same way ream
|
|
10
|
+
* duck-types what it does not own.
|
|
11
|
+
*/
|
|
12
|
+
import type { SessionRedisClient } from './drivers/RedisDriver.js';
|
|
13
|
+
/**
|
|
14
|
+
* A resolver for `session.driver = 'redis'` — quasar is loaded on the
|
|
15
|
+
* first request that reads a session, not at config time.
|
|
16
|
+
*/
|
|
17
|
+
export declare function quasarConnection(name?: string): () => Promise<SessionRedisClient>;
|
|
18
|
+
//# sourceMappingURL=quasar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quasar.d.ts","sourceRoot":"","sources":["../../src/session/quasar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAkClE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,CA2BjF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolving a Redis connection by name, from `@c9up/quasar`.
|
|
3
|
+
*
|
|
4
|
+
* Ream does not depend on quasar: it is an optional peer, and this module
|
|
5
|
+
* never imports it statically. The specifier is built at runtime so the
|
|
6
|
+
* TypeScript build stays free of it too — a hard type import would make ream
|
|
7
|
+
* unbuildable for anyone using cookie or memory sessions.
|
|
8
|
+
*
|
|
9
|
+
* The shape is checked before use rather than asserted, the same way ream
|
|
10
|
+
* duck-types what it does not own.
|
|
11
|
+
*/
|
|
12
|
+
function isConnectionSource(value) {
|
|
13
|
+
return (typeof value === 'object' &&
|
|
14
|
+
value !== null &&
|
|
15
|
+
typeof Reflect.get(value, 'connection') === 'function');
|
|
16
|
+
}
|
|
17
|
+
function isSessionRedisClient(value) {
|
|
18
|
+
if (typeof value !== 'object' || value === null)
|
|
19
|
+
return false;
|
|
20
|
+
// The commands this driver actually issues. A connection missing one of
|
|
21
|
+
// them would fail on the first request carrying a session, far from the cause.
|
|
22
|
+
const required = [
|
|
23
|
+
'get',
|
|
24
|
+
'set',
|
|
25
|
+
'del',
|
|
26
|
+
'exists',
|
|
27
|
+
'keys',
|
|
28
|
+
'sadd',
|
|
29
|
+
'srem',
|
|
30
|
+
'smembers',
|
|
31
|
+
'expire',
|
|
32
|
+
'ttl',
|
|
33
|
+
];
|
|
34
|
+
return required.every((name) => typeof Reflect.get(value, name) === 'function');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A resolver for `session.driver = 'redis'` — quasar is loaded on the
|
|
38
|
+
* first request that reads a session, not at config time.
|
|
39
|
+
*/
|
|
40
|
+
export function quasarConnection(name) {
|
|
41
|
+
return async () => {
|
|
42
|
+
const specifier = '@c9up/quasar/services/main';
|
|
43
|
+
let loaded;
|
|
44
|
+
try {
|
|
45
|
+
loaded = await import(/* @vite-ignore */ specifier);
|
|
46
|
+
}
|
|
47
|
+
catch (cause) {
|
|
48
|
+
throw new Error(`Ream: the '${name ?? 'default'}' session store asks for a quasar connection, but @c9up/quasar is not installed.\n` +
|
|
49
|
+
' pnpm add @c9up/quasar', { cause });
|
|
50
|
+
}
|
|
51
|
+
const manager = isConnectionSource(loaded) ? loaded : Reflect.get(Object(loaded), 'default');
|
|
52
|
+
if (!isConnectionSource(manager)) {
|
|
53
|
+
throw new Error('Ream: @c9up/quasar/services/main did not expose a connection() manager');
|
|
54
|
+
}
|
|
55
|
+
const connection = manager.connection(name);
|
|
56
|
+
if (!isSessionRedisClient(connection)) {
|
|
57
|
+
throw new Error(`Ream: quasar connection '${name ?? 'default'}' does not carry the commands a session needs`);
|
|
58
|
+
}
|
|
59
|
+
return connection;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=quasar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quasar.js","sourceRoot":"","sources":["../../src/session/quasar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,UAAU,CACvD,CAAA;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC7D,wEAAwE;IACxE,+EAA+E;IAC/E,MAAM,QAAQ,GAAG;QACf,KAAK;QACL,KAAK;QACL,KAAK;QACL,QAAQ;QACR,MAAM;QACN,MAAM;QACN,MAAM;QACN,UAAU;QACV,QAAQ;QACR,KAAK;KACN,CAAA;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,UAAU,CAAC,CAAA;AACjF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,SAAS,GAAG,4BAA4B,CAAA;QAC9C,IAAI,MAAe,CAAA;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,cAAc,IAAI,IAAI,SAAS,oFAAoF;gBACjH,yBAAyB,EAC3B,EAAE,KAAK,EAAE,CACV,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;QAC5F,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;QAC3F,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,4BAA4B,IAAI,IAAI,SAAS,+CAA+C,CAC7F,CAAA;QACH,CAAC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC,CAAA;AACH,CAAC"}
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c9up/ream",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.30",
|
|
4
4
|
"description": "Ream — Rust-powered Node.js application framework",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -145,11 +145,15 @@
|
|
|
145
145
|
"reflect-metadata": "^0.2"
|
|
146
146
|
},
|
|
147
147
|
"peerDependencies": {
|
|
148
|
-
"@c9up/comet": "^0.1.0"
|
|
148
|
+
"@c9up/comet": "^0.1.0",
|
|
149
|
+
"@c9up/quasar": "^0.1.0"
|
|
149
150
|
},
|
|
150
151
|
"peerDependenciesMeta": {
|
|
151
152
|
"@c9up/comet": {
|
|
152
153
|
"optional": true
|
|
154
|
+
},
|
|
155
|
+
"@c9up/quasar": {
|
|
156
|
+
"optional": true
|
|
153
157
|
}
|
|
154
158
|
},
|
|
155
159
|
"devDependencies": {
|
|
Binary file
|
package/src/index.ts
CHANGED
|
@@ -54,6 +54,12 @@ export { type GetterFn, Macroable, type MacroFn } from './utils/Macroable.js'
|
|
|
54
54
|
|
|
55
55
|
export { CookieDriver as SessionCookieDriver } from './session/drivers/CookieDriver.js'
|
|
56
56
|
export { MemoryDriver as SessionMemoryDriver } from './session/drivers/MemoryDriver.js'
|
|
57
|
+
export type {
|
|
58
|
+
RedisSessionOptions,
|
|
59
|
+
SessionRedisClient,
|
|
60
|
+
SessionRedisClientSource,
|
|
61
|
+
} from './session/drivers/RedisDriver.js'
|
|
62
|
+
export { RedisDriver as SessionRedisDriver } from './session/drivers/RedisDriver.js'
|
|
57
63
|
export type { SessionConfig, SessionDriver } from './session/Session.js'
|
|
58
64
|
export { Session } from './session/Session.js'
|
|
59
65
|
export { default as SessionMiddleware } from './session/SessionMiddleware.js'
|
package/src/services/app.ts
CHANGED
|
@@ -27,6 +27,15 @@ export function clearApp(app: Application): void {
|
|
|
27
27
|
|
|
28
28
|
const app: Application = new Proxy({} as Application, {
|
|
29
29
|
get(_target, prop) {
|
|
30
|
+
// A module loader inspects what it imports before anyone uses it: it reads
|
|
31
|
+
// `then` to decide whether the namespace is thenable, and various symbols
|
|
32
|
+
// for interop and formatting. Throwing on those turns a plain
|
|
33
|
+
// `import { setX } from '.../services/x'` into a crash at import time, far
|
|
34
|
+
// from any real use. They are not members of what this stands in for, so
|
|
35
|
+
// answer undefined and let a genuine access be the one that reports.
|
|
36
|
+
if (typeof prop === 'symbol' || prop === 'then') {
|
|
37
|
+
return undefined
|
|
38
|
+
}
|
|
30
39
|
if (!instance) {
|
|
31
40
|
throw new Error(
|
|
32
41
|
'Application accessed before initialization. ' +
|
package/src/services/console.ts
CHANGED
|
@@ -28,6 +28,15 @@ export function clearConsole(consoleApp: Console): void {
|
|
|
28
28
|
|
|
29
29
|
const consoleApp: Console = new Proxy({} as Console, {
|
|
30
30
|
get(_target, prop) {
|
|
31
|
+
// A module loader inspects what it imports before anyone uses it: it reads
|
|
32
|
+
// `then` to decide whether the namespace is thenable, and various symbols
|
|
33
|
+
// for interop and formatting. Throwing on those turns a plain
|
|
34
|
+
// `import { setX } from '.../services/x'` into a crash at import time, far
|
|
35
|
+
// from any real use. They are not members of what this stands in for, so
|
|
36
|
+
// answer undefined and let a genuine access be the one that reports.
|
|
37
|
+
if (typeof prop === 'symbol' || prop === 'then') {
|
|
38
|
+
return undefined
|
|
39
|
+
}
|
|
31
40
|
if (!instance) {
|
|
32
41
|
throw new Error(
|
|
33
42
|
'Console accessed before initialization. ' +
|
package/src/services/server.ts
CHANGED
|
@@ -31,6 +31,15 @@ export function getServer(): Server | undefined {
|
|
|
31
31
|
|
|
32
32
|
const server: Server = new Proxy({} as Server, {
|
|
33
33
|
get(_target, prop) {
|
|
34
|
+
// A module loader inspects what it imports before anyone uses it: it reads
|
|
35
|
+
// `then` to decide whether the namespace is thenable, and various symbols
|
|
36
|
+
// for interop and formatting. Throwing on those turns a plain
|
|
37
|
+
// `import { setX } from '.../services/x'` into a crash at import time, far
|
|
38
|
+
// from any real use. They are not members of what this stands in for, so
|
|
39
|
+
// answer undefined and let a genuine access be the one that reports.
|
|
40
|
+
if (typeof prop === 'symbol' || prop === 'then') {
|
|
41
|
+
return undefined
|
|
42
|
+
}
|
|
34
43
|
if (!instance) {
|
|
35
44
|
throw new Error(
|
|
36
45
|
'Server accessed before initialization. ' +
|
package/src/session/Session.ts
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* Backed by pluggable drivers (cookie, memory, redis).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import type { SessionRedisClientSource } from './drivers/RedisDriver.js'
|
|
14
|
+
|
|
13
15
|
export interface SessionDriver {
|
|
14
16
|
read(sessionId: string): Promise<Record<string, unknown>>
|
|
15
17
|
write(sessionId: string, data: Record<string, unknown>, ttl: number): Promise<void>
|
|
@@ -30,6 +32,19 @@ export interface SessionConfig {
|
|
|
30
32
|
* behaviour. Express-session and AdonisJS expose the same toggle.
|
|
31
33
|
*/
|
|
32
34
|
rolling?: boolean
|
|
35
|
+
/**
|
|
36
|
+
* `redis` driver only — the quasar connection to store sessions on. Left
|
|
37
|
+
* unset, the default connection is used.
|
|
38
|
+
*/
|
|
39
|
+
connection?: string
|
|
40
|
+
/**
|
|
41
|
+
* `redis` driver only — a client to use instead of resolving one through
|
|
42
|
+
* quasar. Anything carrying get/set/del/expire satisfies it, so an app can
|
|
43
|
+
* share the client it already has.
|
|
44
|
+
*/
|
|
45
|
+
client?: SessionRedisClientSource
|
|
46
|
+
/** `redis` driver only — key prefix. Defaults to `ream:session:`. */
|
|
47
|
+
prefix?: string
|
|
33
48
|
}
|
|
34
49
|
|
|
35
50
|
/**
|
|
@@ -9,6 +9,8 @@ import { randomBytes } from 'node:crypto'
|
|
|
9
9
|
import type { HttpContext } from '../http/HttpContext.js'
|
|
10
10
|
import { CookieDriver } from './drivers/CookieDriver.js'
|
|
11
11
|
import { MemoryDriver } from './drivers/MemoryDriver.js'
|
|
12
|
+
import { RedisDriver } from './drivers/RedisDriver.js'
|
|
13
|
+
import { quasarConnection } from './quasar.js'
|
|
12
14
|
import type { SessionConfig, SessionDriver } from './Session.js'
|
|
13
15
|
import { Session } from './Session.js'
|
|
14
16
|
|
|
@@ -44,6 +46,12 @@ export default class SessionMiddleware {
|
|
|
44
46
|
this.#driver = this.#cookieDriver
|
|
45
47
|
} else if (this.#config.driver === 'memory') {
|
|
46
48
|
this.#driver = new MemoryDriver()
|
|
49
|
+
} else if (this.#config.driver === 'redis') {
|
|
50
|
+
// Either the app hands a client in, or it names a quasar connection —
|
|
51
|
+
// the same choice echo, bay and warden offer. Nothing is dialled here:
|
|
52
|
+
// the driver resolves on the first request that reads a session.
|
|
53
|
+
const source = config?.client ?? quasarConnection(config?.connection)
|
|
54
|
+
this.#driver = new RedisDriver(source, { prefix: config?.prefix })
|
|
47
55
|
} else {
|
|
48
56
|
throw new Error(`Unknown session driver: ${this.#config.driver}`)
|
|
49
57
|
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side sessions on Redis — what `Session.ts` has documented as a
|
|
3
|
+
* pluggable driver from the start, and what `SessionMiddleware` points at when
|
|
4
|
+
* a cookie session outgrows its 4KB.
|
|
5
|
+
*
|
|
6
|
+
* The client is structural, so ream depends on no Redis package: hand it an
|
|
7
|
+
* ioredis/node-redis client, or a `@c9up/quasar` connection, or anything that
|
|
8
|
+
* carries these four commands.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { SessionDriver } from '../Session.js'
|
|
12
|
+
|
|
13
|
+
/** The commands a session needs. Compatible with ioredis and node-redis. */
|
|
14
|
+
export interface SessionRedisClient {
|
|
15
|
+
get(key: string): Promise<string | null>
|
|
16
|
+
set(key: string, value: string, ...args: unknown[]): Promise<unknown>
|
|
17
|
+
del(key: string | string[]): Promise<number>
|
|
18
|
+
expire(key: string, seconds: number): Promise<number>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Where the client comes from — resolved once, on the first request that needs it. */
|
|
22
|
+
export type SessionRedisClientSource =
|
|
23
|
+
| SessionRedisClient
|
|
24
|
+
| (() => SessionRedisClient | Promise<SessionRedisClient>)
|
|
25
|
+
|
|
26
|
+
export interface RedisSessionOptions {
|
|
27
|
+
/** Key prefix. Namespacing matters: a session store usually shares a database. */
|
|
28
|
+
prefix?: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class RedisDriver implements SessionDriver {
|
|
32
|
+
readonly #source: SessionRedisClientSource
|
|
33
|
+
#resolved: SessionRedisClient | undefined
|
|
34
|
+
#pending: Promise<SessionRedisClient> | undefined
|
|
35
|
+
readonly #prefix: string
|
|
36
|
+
|
|
37
|
+
constructor(source: SessionRedisClientSource, options: RedisSessionOptions = {}) {
|
|
38
|
+
this.#source = source
|
|
39
|
+
this.#prefix = options.prefix ?? 'ream:session:'
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The client, resolved once. Requests racing on a cold start must not each
|
|
44
|
+
* open their own connection, so the in-flight promise is shared.
|
|
45
|
+
*/
|
|
46
|
+
async #client(): Promise<SessionRedisClient> {
|
|
47
|
+
if (this.#resolved) return this.#resolved
|
|
48
|
+
if (typeof this.#source !== 'function') {
|
|
49
|
+
this.#resolved = this.#source
|
|
50
|
+
return this.#resolved
|
|
51
|
+
}
|
|
52
|
+
if (!this.#pending) {
|
|
53
|
+
const resolver = this.#source
|
|
54
|
+
this.#pending = Promise.resolve(resolver()).then((client) => {
|
|
55
|
+
this.#resolved = client
|
|
56
|
+
this.#pending = undefined
|
|
57
|
+
return client
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
return this.#pending
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
#key(sessionId: string): string {
|
|
64
|
+
return `${this.#prefix}${sessionId}`
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Unreadable payloads are treated as an absent session rather than thrown.
|
|
69
|
+
* A corrupt value would otherwise 500 every request carrying that cookie,
|
|
70
|
+
* with no way for the visitor to recover — a new session is the safe answer.
|
|
71
|
+
*/
|
|
72
|
+
async read(sessionId: string): Promise<Record<string, unknown>> {
|
|
73
|
+
const client = await this.#client()
|
|
74
|
+
const raw = await client.get(this.#key(sessionId))
|
|
75
|
+
if (raw === null) return {}
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
const parsed: unknown = JSON.parse(raw)
|
|
79
|
+
return isPlainRecord(parsed) ? parsed : {}
|
|
80
|
+
} catch {
|
|
81
|
+
return {}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async write(sessionId: string, data: Record<string, unknown>, ttl: number): Promise<void> {
|
|
86
|
+
const client = await this.#client()
|
|
87
|
+
// EX in one command: a SET followed by an EXPIRE leaves the key immortal
|
|
88
|
+
// if the process dies between the two.
|
|
89
|
+
await client.set(this.#key(sessionId), JSON.stringify(data), 'EX', ttl)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async destroy(sessionId: string): Promise<void> {
|
|
93
|
+
const client = await this.#client()
|
|
94
|
+
await client.del(this.#key(sessionId))
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Slide the expiry — a session must not die while its owner is active. */
|
|
98
|
+
async touch(sessionId: string, ttl: number): Promise<void> {
|
|
99
|
+
const client = await this.#client()
|
|
100
|
+
await client.expire(this.#key(sessionId), ttl)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
105
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
106
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolving a Redis connection by name, from `@c9up/quasar`.
|
|
3
|
+
*
|
|
4
|
+
* Ream does not depend on quasar: it is an optional peer, and this module
|
|
5
|
+
* never imports it statically. The specifier is built at runtime so the
|
|
6
|
+
* TypeScript build stays free of it too — a hard type import would make ream
|
|
7
|
+
* unbuildable for anyone using cookie or memory sessions.
|
|
8
|
+
*
|
|
9
|
+
* The shape is checked before use rather than asserted, the same way ream
|
|
10
|
+
* duck-types what it does not own.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { SessionRedisClient } from './drivers/RedisDriver.js'
|
|
14
|
+
|
|
15
|
+
/** The slice of quasar's manager this needs: a connection, by name. */
|
|
16
|
+
interface ConnectionSource {
|
|
17
|
+
connection(name?: string): unknown
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function isConnectionSource(value: unknown): value is ConnectionSource {
|
|
21
|
+
return (
|
|
22
|
+
typeof value === 'object' &&
|
|
23
|
+
value !== null &&
|
|
24
|
+
typeof Reflect.get(value, 'connection') === 'function'
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function isSessionRedisClient(value: unknown): value is SessionRedisClient {
|
|
29
|
+
if (typeof value !== 'object' || value === null) return false
|
|
30
|
+
// The commands this driver actually issues. A connection missing one of
|
|
31
|
+
// them would fail on the first request carrying a session, far from the cause.
|
|
32
|
+
const required = [
|
|
33
|
+
'get',
|
|
34
|
+
'set',
|
|
35
|
+
'del',
|
|
36
|
+
'exists',
|
|
37
|
+
'keys',
|
|
38
|
+
'sadd',
|
|
39
|
+
'srem',
|
|
40
|
+
'smembers',
|
|
41
|
+
'expire',
|
|
42
|
+
'ttl',
|
|
43
|
+
]
|
|
44
|
+
return required.every((name) => typeof Reflect.get(value, name) === 'function')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* A resolver for `session.driver = 'redis'` — quasar is loaded on the
|
|
49
|
+
* first request that reads a session, not at config time.
|
|
50
|
+
*/
|
|
51
|
+
export function quasarConnection(name?: string): () => Promise<SessionRedisClient> {
|
|
52
|
+
return async () => {
|
|
53
|
+
const specifier = '@c9up/quasar/services/main'
|
|
54
|
+
let loaded: unknown
|
|
55
|
+
try {
|
|
56
|
+
loaded = await import(/* @vite-ignore */ specifier)
|
|
57
|
+
} catch (cause) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`Ream: the '${name ?? 'default'}' session store asks for a quasar connection, but @c9up/quasar is not installed.\n` +
|
|
60
|
+
' pnpm add @c9up/quasar',
|
|
61
|
+
{ cause },
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const manager = isConnectionSource(loaded) ? loaded : Reflect.get(Object(loaded), 'default')
|
|
66
|
+
if (!isConnectionSource(manager)) {
|
|
67
|
+
throw new Error('Ream: @c9up/quasar/services/main did not expose a connection() manager')
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const connection = manager.connection(name)
|
|
71
|
+
if (!isSessionRedisClient(connection)) {
|
|
72
|
+
throw new Error(
|
|
73
|
+
`Ream: quasar connection '${name ?? 'default'}' does not carry the commands a session needs`,
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
return connection
|
|
77
|
+
}
|
|
78
|
+
}
|