@randajan/koa-io-session 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -3
- package/dist/cjs/index.cjs +40 -6
- package/dist/cjs/index.cjs.map +2 -2
- package/dist/cjs/stores/FileStore.cjs.map +2 -2
- package/dist/esm/{chunk-27XQ42ES.js → chunk-NKL2ZYZW.js} +13 -1
- package/dist/esm/chunk-NKL2ZYZW.js.map +7 -0
- package/dist/esm/index.mjs +31 -7
- package/dist/esm/index.mjs.map +2 -2
- package/dist/esm/stores/FileStore.mjs +1 -1
- package/package.json +1 -1
- package/dist/esm/chunk-27XQ42ES.js.map +0 -7
package/README.md
CHANGED
|
@@ -179,21 +179,29 @@ Rules:
|
|
|
179
179
|
|
|
180
180
|
`opt` is mostly forwarded to `koa-session`, with bridge-specific keys:
|
|
181
181
|
|
|
182
|
+
- `appKeys` (optional array used to initialize `app.keys`)
|
|
183
|
+
- `allowRndAppKeys` (default `false`; suppress runtime warning when keys are generated)
|
|
182
184
|
- `store` (backend store implementation)
|
|
183
185
|
- `maxAge` (session TTL used by StoreGateway and koa cookie)
|
|
184
186
|
- `autoCleanup` (default `false`)
|
|
185
187
|
- `autoCleanupMs` (used only when `autoCleanup === true`)
|
|
186
|
-
- `clientKey` (default
|
|
188
|
+
- `clientKey` (default `"cid"`)
|
|
187
189
|
- `clientMaxAge` (default `1 year`)
|
|
188
190
|
- `clientAlwaysRoll` (default `true`)
|
|
189
191
|
|
|
190
192
|
Default behavior:
|
|
191
|
-
- `key`:
|
|
193
|
+
- `key`: `"sid"` when missing
|
|
192
194
|
- `signed`: `true`
|
|
193
195
|
- `store`: `new LiveStore()`
|
|
194
|
-
- `app.keys`:
|
|
196
|
+
- `app.keys`: if missing, bridge generates 2 runtime keys (length 32) and logs warning
|
|
195
197
|
- `autoCleanupMs`: when omitted and `autoCleanup` is enabled, interval is computed as `maxAge / 4`, clamped to `<1 minute, 1 day>`
|
|
196
198
|
|
|
199
|
+
`app.keys` resolution:
|
|
200
|
+
- if `app.keys` already exists and `appKeys` is not provided: existing `app.keys` is used
|
|
201
|
+
- if `app.keys` already exists and `appKeys` is provided: throws error
|
|
202
|
+
- if `app.keys` is missing and `appKeys` is provided: `app.keys = appKeys`
|
|
203
|
+
- if both are missing: bridge generates runtime keys; warning is shown unless `allowRndAppKeys === true`
|
|
204
|
+
|
|
197
205
|
## Store Contract
|
|
198
206
|
|
|
199
207
|
Backend `store` must implement:
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -58,6 +58,7 @@ var ms = {
|
|
|
58
58
|
y: (v = 1) => ms.d(v * 365)
|
|
59
59
|
};
|
|
60
60
|
var _customOptKeys = /* @__PURE__ */ new Set([
|
|
61
|
+
"appKeys",
|
|
61
62
|
"store",
|
|
62
63
|
"autoCleanup",
|
|
63
64
|
"autoCleanupMs",
|
|
@@ -97,6 +98,16 @@ var validRange = (any, min, max, req = false, msg = "argument") => {
|
|
|
97
98
|
var validInterval = (any, req = false, msg = "argument") => {
|
|
98
99
|
return validRange(any, 10, 2147483647, req, msg);
|
|
99
100
|
};
|
|
101
|
+
var validArray = (any, req = false, msg = "argument") => {
|
|
102
|
+
const obj = valid("object", any, req, msg);
|
|
103
|
+
if (obj == null) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (Array.isArray(obj)) {
|
|
107
|
+
return obj;
|
|
108
|
+
}
|
|
109
|
+
throw new TypeError(_err(`Invalid '${msg}'. Expected plain array, received plain object.`));
|
|
110
|
+
};
|
|
100
111
|
var validObject = (any, req = false, msg = "argument") => {
|
|
101
112
|
const obj = valid("object", any, req, msg);
|
|
102
113
|
if (obj == null) {
|
|
@@ -152,6 +163,27 @@ var wrapExternalKey = (opt, onSet) => {
|
|
|
152
163
|
};
|
|
153
164
|
|
|
154
165
|
// src/httpSession.js
|
|
166
|
+
var ensureAppKeys = (app, keys, allowRnd = false) => {
|
|
167
|
+
if (app.keys) {
|
|
168
|
+
if (!keys) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
throw new Error(`${_errPrefix} Cannot set 'appKeys' because app.keys is already defined.`);
|
|
172
|
+
}
|
|
173
|
+
if (keys) {
|
|
174
|
+
app.keys = keys;
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
app.keys = keys = Array(2).fill().map(() => generateUid(32));
|
|
178
|
+
if (!allowRnd) {
|
|
179
|
+
console.warn([
|
|
180
|
+
`${_errPrefix} app.keys were generated at runtime.`,
|
|
181
|
+
`${_errPrefix} Resolve this by adding one of these options to bridge constructor:`,
|
|
182
|
+
`${_errPrefix} 1) "appKeys": ${JSON.stringify(app.keys)}`,
|
|
183
|
+
`${_errPrefix} 2) "allowRndAppKeys": true`
|
|
184
|
+
].join("\n"));
|
|
185
|
+
}
|
|
186
|
+
};
|
|
155
187
|
var createKoaSession = (app, gw, opt, onSet) => {
|
|
156
188
|
const maxAge = gw.maxAge;
|
|
157
189
|
const store = wrapStore(gw);
|
|
@@ -245,18 +277,22 @@ var pickKoaOpt = (rawOpt) => {
|
|
|
245
277
|
}
|
|
246
278
|
koaOpt[key] = rawOpt[key];
|
|
247
279
|
}
|
|
248
|
-
koaOpt.key = valid("string", koaOpt.key, false, "key") ??
|
|
280
|
+
koaOpt.key = valid("string", koaOpt.key, false, "key") ?? "sid";
|
|
249
281
|
koaOpt.signed = valid("boolean", koaOpt.signed, false, "signed") ?? true;
|
|
250
282
|
return koaOpt;
|
|
251
283
|
};
|
|
252
284
|
var formatOptions = (opt = {}) => {
|
|
253
285
|
opt = validObject(opt, true, "options");
|
|
286
|
+
const appKeys = validArray(opt.appKeys, false, "appKeys");
|
|
287
|
+
const allowRndAppKeys = valid("boolean", opt.allowRndAppKeys, false, "allowRnddAppKeys") ?? false;
|
|
254
288
|
const koaOpt = pickKoaOpt(opt);
|
|
255
|
-
const clientKey = valid("string", opt.clientKey) ??
|
|
289
|
+
const clientKey = valid("string", opt.clientKey) ?? "cid";
|
|
256
290
|
const clientMaxAge = validInterval(opt.clientMaxAge, false, "clientMaxAge") ?? ms.y();
|
|
257
291
|
const clientAlwaysRoll = valid("boolean", opt.clientAlwaysRoll, false, "clientAlwaysRoll") ?? true;
|
|
258
292
|
const clientOpt = { ...koaOpt, key: clientKey, maxAge: clientMaxAge };
|
|
259
293
|
return {
|
|
294
|
+
appKeys,
|
|
295
|
+
allowRndAppKeys,
|
|
260
296
|
koaOpt,
|
|
261
297
|
clientOpt,
|
|
262
298
|
clientAlwaysRoll
|
|
@@ -508,11 +544,9 @@ var StoreGateway = class _StoreGateway {
|
|
|
508
544
|
var SessionBridge = class extends import_events.EventEmitter {
|
|
509
545
|
constructor(app, io, opt = {}) {
|
|
510
546
|
super();
|
|
511
|
-
|
|
512
|
-
app.keys = Array(6).fill().map(() => generateUid(12));
|
|
513
|
-
}
|
|
514
|
-
const { koaOpt, clientOpt, clientAlwaysRoll } = formatOptions(opt);
|
|
547
|
+
const { appKeys, allowRndAppKeys, koaOpt, clientOpt, clientAlwaysRoll } = formatOptions(opt);
|
|
515
548
|
const _p = {};
|
|
549
|
+
ensureAppKeys(app, appKeys, allowRndAppKeys);
|
|
516
550
|
const tmp = new TempMap(5e3);
|
|
517
551
|
const brg = _p.brg = new Bridge({
|
|
518
552
|
onSet: (clientId, sessionId) => {
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.js", "../../src/class/SessionBridge.js", "../../src/tools.js", "../../src/const.js", "../../src/httpSession.js", "../../src/wrappers.js", "../../src/socketSession.js", "../../src/formatOptions.js", "../../src/class/Bridge.js", "../../src/class/TempMap.js", "../../src/class/StoreGateway.js", "../../src/stores/LiveStore.js"],
|
|
4
|
-
"sourcesContent": ["import { SessionBridge } from \"./class/SessionBridge.js\";\nimport { ms } from \"./const.js\";\nimport { LiveStore } from \"./stores/LiveStore.js\";\nimport { generateUid } from \"./tools.js\";\n\n\nconst bridgeSession = (app, io, opt = {}) => new SessionBridge(app, io, opt);\n\nexport default bridgeSession;\n\nexport {\n ms,\n bridgeSession,\n generateUid,\n LiveStore,\n SessionBridge\n}\n", "import { EventEmitter } from \"events\";\r\nimport { ServerResponse } from \"http\";\r\nimport { solid, virtual } from \"@randajan/props\";\r\n\r\nimport { generateUid } from \"../tools.js\";\r\nimport { createKoaSession, createClientCookie } from \"../httpSession.js\";\r\nimport { applySessionHandler } from \"../socketSession.js\";\r\n\r\nimport { formatOptions } from \"../formatOptions.js\";\r\nimport { Bridge } from \"./Bridge.js\";\r\nimport { _errPrefix, _privs } from \"../const.js\";\r\nimport { TempMap } from \"./TempMap.js\";\r\nimport { StoreGateway } from \"./StoreGateway.js\";\r\n\r\n\r\nexport class SessionBridge extends EventEmitter {\r\n\r\n constructor(app, io, opt = {}) {\r\n super();\r\n\r\n if (!app.keys) { app.keys = Array(6).fill().map(() => generateUid(12)); }\r\n\r\n const { koaOpt, clientOpt, clientAlwaysRoll } = formatOptions(opt);\r\n const _p = {};\r\n\r\n const tmp = new TempMap(5000);\r\n const brg = _p.brg = new Bridge({\r\n onSet:(clientId, sessionId)=>{\r\n const isNew = !!tmp.get(sessionId, true);\r\n this.emit(\"sessionSet\", { clientId, sessionId, isNew, isInit:true });\r\n },\r\n onDelete:(clientId, sessionId)=>this.emit(\"sessionDestroy\", { clientId, sessionId })\r\n });\r\n\r\n _p.notifySet = (sid, isNew)=>{\r\n if (!sid) { return; }\r\n const cid = brg.getBySid(sid);\r\n if (!cid) { tmp.set(sid, isNew, false); return; }\r\n this.emit(\"sessionSet\", { clientId:cid, sessionId:sid, isNew:!!isNew, isInit:false });\r\n }\r\n _p.notifyDestroy = (sid)=>{ if (sid) { brg.deleteBySid(sid); } }\r\n _p.notifyCleanup = (cleared)=>{ this.emit(\"cleanup\", cleared); }\r\n\r\n const gw = _p.gw = new StoreGateway(opt, _p);\r\n\r\n const cc = createClientCookie(clientOpt);\r\n const [koaSession, sc] = createKoaSession(app, gw, koaOpt, (ctx, sid)=>{\r\n const cid = cc.get(ctx);\r\n brg.set(cid, sid);\r\n });\r\n\r\n const reviveCid = ctx=>{\r\n let cid = cc.get(ctx);\r\n if (!cid) { cc.set(ctx, cid = generateUid(24)); }\r\n else if (clientAlwaysRoll) { cc.set(ctx, cid); }\r\n return cid;\r\n }\r\n\r\n const reviveSid = async (ctx, cid)=>{\r\n const reqSid = sc.get(ctx);\r\n if (cid == null || reqSid == null) { return; } //empty cid or sid\r\n\r\n const brgSid = brg.getByCid(cid);\r\n if (brgSid == reqSid) { return; } //correct sid for this client\r\n else if (brgSid) { sc.set(ctx, brgSid); return; } //this client have different sid\r\n\r\n if (brg.getBySid(reqSid)) { return; } //sid is occupied by different client\r\n if (!await gw.get(reqSid)) { return; } //there is no sesssion with that sid\r\n brg.set(cid, reqSid); //attach session to this client\r\n }\r\n \r\n app.use(koaSession);\r\n\r\n // pro HTTP jen sessionId, nic v\u00EDc nepot\u0159ebujeme\r\n app.use(async (ctx, next) => {\r\n const cid = reviveCid(ctx);\r\n await reviveSid(ctx, cid);\r\n \r\n solid(ctx, \"clientId\", cid);\r\n virtual(ctx, \"sessionId\", _=>brg.getByCid(cid));\r\n await next();\r\n });\r\n\r\n /* ------------------ WebSocket ------------------------------------- */\r\n io.use(async (socket, next) => {\r\n const req = socket.request;\r\n const res = req.res ?? socket.response ?? new ServerResponse(req);\r\n const ctx = app.createContext(req, res);\r\n\r\n await koaSession(ctx, async () => {});\r\n \r\n const cid = reviveCid(ctx);\r\n await reviveSid(ctx, cid);\r\n\r\n solid(socket, \"clientId\", cid);\r\n virtual(socket, \"sessionId\", _=>brg.getByCid(cid));\r\n solid(socket, \"withSession\", async function (handler, onMissing) {\r\n const onm = arguments.length > 1 ? onMissing : new Error(`${_errPrefix} Session is missing for this socket.`);\r\n return applySessionHandler(socket, handler, gw, onm);\r\n }, false);\r\n\r\n await next();\r\n });\r\n\r\n _privs.set(this, _p);\r\n }\r\n\r\n async getById(sessionId) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.get(sessionId); }\r\n }\r\n\r\n async destroyById(sessionId) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.destroy(sessionId); }\r\n return false;\r\n }\r\n\r\n async setById(sessionId, session, maxAge) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.set(sessionId, session, maxAge); } \r\n throw new Error(`${_errPrefix} Creating session via setById() is prohibited. sessionId='${sessionId}'.`);\r\n }\r\n \r\n\r\n async getByClientId(clientId) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.get(sid); }\r\n }\r\n\r\n async destroyByClientId(clientId) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.destroy(sid); }\r\n return false;\r\n }\r\n \r\n async setByClientId(clientId, session, maxAge) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.set(sid, session, maxAge); }\r\n throw new Error(`${_errPrefix} Creating session via setByClientId() is prohibited. clientId='${clientId}'.`);\r\n }\r\n\r\n getSessionId(clientId) { return _privs.get(this).brg.getByCid(clientId); }\r\n getClientId(sessionId) { return _privs.get(this).brg.getBySid(sessionId); }\r\n\r\n async cleanup() { return _privs.get(this).gw.cleanup(); }\r\n startAutoCleanup(interval) { return _privs.get(this).gw.startAutoCleanup(interval); }\r\n stopAutoCleanup() { return _privs.get(this).gw.stopAutoCleanup(); }\r\n\r\n notifyStoreSet(sessionId, isNew) { return _privs.get(this).notifySet(sessionId, isNew); }\r\n notifyStoreDestroy(sessionId) { return _privs.get(this).notifyDestroy(sessionId); }\r\n notifyStoreCleanup(clearedCount) { return _privs.get(this).notifyCleanup(clearedCount); }\r\n}\r\n\r\n", "import crypto from \"crypto\";\nimport { _errPrefix } from \"./const.js\";\n\nexport const generateUid = (len = 16) => crypto.randomBytes(len).toString(\"base64url\").slice(0, len);\n\nexport const is = (type, any)=>typeof any === type;\nconst _typeOf = (any) => any === null ? \"null\" : Array.isArray(any) ? \"array\" : typeof any;\nconst _err = (msg) => `${_errPrefix} ${msg}`;\n\nexport const valid = (type, any, req=false, msg=\"argument\")=>{\n if (any == null) {\n if (!req) { return; }\n throw new TypeError(_err(`Missing required '${msg}'. Expected type '${type}'.`));\n }\n if (is(type, any)) { return any; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected type '${type}', received '${_typeOf(any)}'.`));\n}\n\nexport const validRange = (any, min, max, req=false, msg=\"argument\")=>{\n const num = valid(\"number\", any, req, msg);\n if (num == null) { return; }\n if (num < min || num > max) {\n throw new RangeError(_err(`Invalid '${msg}'. Expected value in range <${min}, ${max}>, received '${num}'.`));\n }\n return num;\n}\n\nexport const validInterval = (any, req=false, msg=\"argument\")=>{\n return validRange(any, 10, 2_147_483_647, req, msg);\n}\n\nexport const validObject = (any, req=false, msg=\"argument\")=>{\n const obj = valid(\"object\", any, req, msg);\n if (obj == null) { return; }\n if (!Array.isArray(obj)) { return obj; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected plain object, received 'array'.`));\n}\n\n\nexport const validStore = (store, req=false) => {\n store = validObject(store, req, \"store\");\n if (!store) { return; }\n\n const missing = [];\n if (!is(\"function\", store.get)) { missing.push(\"get()\"); }\n if (!is(\"function\", store.set)) { missing.push(\"set()\"); }\n if (!is(\"function\", store.destroy)) { missing.push(\"destroy()\"); }\n\n if (missing.length) {\n throw new TypeError(_err(`Invalid 'store'. Missing required API: ${missing.join(\", \")}.`));\n }\n\n valid(\"function\", store.list, false, \"store.list()\");\n \n return store;\n};\n", "export const _errPrefix = \"[koa-io-session]\";\r\n\r\nexport const ms = {\r\n s:(v=1)=>v*1000,\r\n m:(v=1)=>ms.s(v*60),\r\n h:(v=1)=>ms.m(v*60),\r\n d:(v=1)=>ms.h(v*24),\r\n w:(v=1)=>ms.d(v*7),\r\n M:(v=1)=>ms.d(v*30),\r\n y:(v=1)=>ms.d(v*365)\r\n}\r\n\r\nexport const _customOptKeys = new Set([\r\n \"store\",\r\n \"autoCleanup\",\r\n \"autoCleanupMs\",\r\n \"clientKey\",\r\n \"clientMaxAge\",\r\n \"clientAlwaysRoll\"\r\n]);\r\n\r\nexport const _privs = new WeakMap();", "import session from \"koa-session\";\r\nimport { wrapExternalKey, wrapStore } from \"./wrappers.js\";\r\n\r\nexport const createKoaSession = (app, gw, opt, onSet)=>{\r\n const maxAge = gw.maxAge;\r\n const store = wrapStore(gw);\r\n const externalKey = wrapExternalKey(opt, onSet);\r\n const koaSession = session({...opt, maxAge, store, externalKey}, app);\r\n return [koaSession, externalKey];\r\n}\r\n\r\nexport const createClientCookie = opt => {\r\n const { key, maxAge, signed, path, secure, sameSite, httpOnly } = opt;\r\n return wrapExternalKey({\r\n key,\r\n signed,\r\n maxAge,\r\n path: path ?? \"/\",\r\n secure,\r\n sameSite,\r\n httpOnly: httpOnly ?? true,\r\n overwrite: true\r\n });\r\n}", "\r\n\r\nexport const wrapStore = (store)=>{\n return {\n get:store.get.bind(store),\n set:store.set.bind(store),\n destroy:store.destroy.bind(store)\n }\n}\n\r\nexport const wrapExternalKey = (opt, onSet) => {\r\n const { externalKey: base, key, signed } = opt;\r\n\r\n const get = base?.get\r\n ? (ctx) => base.get(ctx)\r\n : (ctx) => ctx.cookies.get(key, { signed });\r\n\r\n const setRaw = base?.set\r\n ? (ctx, sid) => base.set(ctx, sid)\r\n : (ctx, sid) => ctx.cookies.set(key, sid, opt);\r\n\r\n const set = typeof onSet != \"function\"\r\n ? setRaw\r\n : (ctx, sid) => {\r\n setRaw(ctx, sid); // re\u00E1ln\u00FD z\u00E1pis SID\r\n onSet(ctx, sid); // tv\u016Fj hook\r\n };\r\n\r\n return { get, set };\r\n};\r\n", "import { solids } from \"@randajan/props\";\r\nimport { is, valid } from \"./tools.js\";\r\nimport { _errPrefix } from \"./const.js\";\r\n\r\nconst sidLocks = new Map();\r\n\r\nconst applyOnMissing = (onMissing)=>{\r\n if (onMissing instanceof Error) { throw onMissing; }\r\n if (is(\"function\", onMissing)) { return onMissing(); }\r\n return onMissing;\r\n}\r\n\r\nconst runSessionHandler = async (sid, socket, handler, gw, onMissing) => {\r\n const session = await gw.get(sid);\r\n if (!session) { return applyOnMissing(onMissing); }\r\n\r\n const sessionCtx = solids({ session }, { sessionId:sid, socket });\r\n const result = await handler(sessionCtx, socket);\r\n\r\n if (sid === socket.sessionId) { await gw.set(sid, sessionCtx.session); }\r\n\r\n return result;\r\n};\r\n\r\nconst createLock = (sid)=>{\r\n let _release;\r\n const previous = sidLocks.get(sid);\r\n const current = new Promise((resolve) => { _release = resolve; });\r\n sidLocks.set(sid, current);\r\n const release = ()=>{\r\n _release();\r\n if (sidLocks.get(sid) === current) { sidLocks.delete(sid); }\r\n }\r\n return [ previous, release ];\r\n}\r\n\r\nexport const applySessionHandler = async (socket, handler, gw, onMissing) => {\r\n\r\n valid(\"function\", handler, true, \"handler\");\r\n\r\n for (let i=0; i<5; i++) {\r\n const sid = socket.sessionId;\r\n if (!sid) { return applyOnMissing(onMissing); }\r\n\r\n const [ previous, release ] = createLock(sid);\r\n\r\n if (previous) { await previous; }\r\n if (previous && sid !== socket.sessionId) { release(); continue; } \r\n\r\n try { return await runSessionHandler(sid, socket, handler, gw, onMissing); }\r\n finally { release(); }\r\n }\r\n\r\n throw new Error(`${_errPrefix} socket.sessionId changed during withSession execution.`);\r\n\r\n};\r\n", "import { _customOptKeys, ms } from \"./const.js\";\r\nimport { generateUid, valid, validInterval, validObject } from \"./tools.js\";\r\n\r\nconst pickKoaOpt = (rawOpt) => {\r\n const koaOpt = {}\r\n for (const key in rawOpt) {\r\n if (_customOptKeys.has(key)) { continue; }\r\n koaOpt[key] = rawOpt[key];\r\n }\r\n\r\n koaOpt.key = valid(\"string\", koaOpt.key, false, \"key\") ?? generateUid(12);\r\n koaOpt.signed = valid(\"boolean\", koaOpt.signed, false, \"signed\") ?? true;\r\n\r\n return koaOpt;\r\n};\r\n\r\n/**\r\n * Validate and normalize attachSession options.\r\n * Returns split options for internal parts and koa-session pass-through options.\r\n */\r\nexport const formatOptions = (opt = {}) => {\r\n opt = validObject(opt, true, \"options\");\r\n\r\n const koaOpt = pickKoaOpt(opt);\r\n \r\n const clientKey = valid(\"string\", opt.clientKey) ?? `${koaOpt.key}.cid`;\r\n const clientMaxAge = validInterval(opt.clientMaxAge, false, \"clientMaxAge\") ?? ms.y();\r\n const clientAlwaysRoll = valid(\"boolean\", opt.clientAlwaysRoll, false, \"clientAlwaysRoll\") ?? true;\r\n\r\n const clientOpt = { ...koaOpt, key:clientKey, maxAge:clientMaxAge }\r\n\r\n return {\r\n koaOpt,\r\n clientOpt,\r\n clientAlwaysRoll,\r\n };\r\n};\r\n\r\n", "import { solids } from \"@randajan/props\";\r\n\r\nexport class Bridge {\r\n constructor(opt={}) {\r\n const { onSet, onDelete } = opt;\r\n\r\n solids(this, {\r\n onSet,\r\n onDelete,\r\n s2c:new Map(),\r\n c2s:new Map()\r\n });\r\n\r\n }\r\n\r\n set(cid, sid) {\r\n if (!cid || !sid) { return false; }\r\n\r\n const byCid = this.deleteByCid(cid, sid);\r\n const bySid = this.deleteBySid(sid, cid);\r\n if (!byCid && !bySid) { return false; }\r\n\r\n this.c2s.set(cid, sid);\r\n this.s2c.set(sid, cid);\r\n\r\n this.onSet(cid, sid);\r\n return true;\r\n }\r\n \r\n getByCid(cid) { return this.c2s.get(cid); }\r\n getBySid(sid) { return this.s2c.get(sid); }\r\n\r\n deleteBySid(sid, skipIf) {\r\n const cid = this.getBySid(sid);\r\n if (!cid) { return true; }\r\n if (skipIf && cid == skipIf) { return false; }\r\n this.s2c.delete(sid);\r\n this.c2s.delete(cid);\r\n this.onDelete(cid, sid);\r\n return true;\r\n }\r\n\r\n deleteByCid(cid, skipIf) {\r\n const sid = this.getByCid(cid);\r\n if (!sid) { return true; }\r\n if (skipIf && sid == skipIf) { return false; }\r\n this.c2s.delete(cid);\r\n this.s2c.delete(sid);\r\n this.onDelete(cid, sid);\r\n return true;\r\n }\r\n}\r\n", "import { validInterval } from \"../tools.js\";\r\nimport { _privs } from \"../const.js\";\r\n\r\n\r\nexport class TempMap extends Map {\r\n\r\n constructor(ttl) {\r\n super();\r\n\r\n const _p = {\r\n ttl:validInterval(ttl, true, \"ttl\"),\r\n ts: new Map()\r\n }\r\n\r\n _privs.set(this, _p);\r\n }\r\n\r\n set(key, value, overwrite=true) {\r\n const { ts, ttl } = _privs.get(this);\r\n if (!overwrite && this.has(key)) { return false; }\r\n this.delete(key);\r\n super.set(key, value);\r\n const t = setTimeout(_=>{ this.delete(key); }, ttl);\r\n ts.set(key, t);\r\n return true;\r\n }\r\n \r\n\r\n get(key, andDelete=false) {\r\n const v = super.get(key);\r\n if (andDelete) { this.delete(key); }\r\n return v;\r\n }\r\n\r\n delete(key) {\r\n if (!super.delete(key)) { return false; }\r\n const { ts } = _privs.get(this);\r\n const t = ts.get(key);\r\n clearTimeout(t);\r\n ts.delete(key);\r\n return true;\r\n }\r\n\r\n}", "import { solid } from \"@randajan/props\";\r\nimport { is, valid, validInterval, validObject, validRange, validStore } from \"../tools.js\";\r\nimport { _errPrefix, _privs, ms } from \"../const.js\";\r\nimport { LiveStore } from \"../stores/LiveStore.js\";\r\n\r\nconst formatState = (session, maxAge, maxAgeDefault)=>{\r\n const ttl = maxAge ?? maxAgeDefault;\r\n const expiresAt = Date.now() + ttl;\r\n return { session, expiresAt, ttl };\r\n}\r\n\r\nconst requireList = (store) => {\r\n if (!store.list) { throw new TypeError(`${_errPrefix} store.list() is required`); }\r\n};\r\n\r\nexport class StoreGateway {\r\n\r\n static is(any) { return any instanceof StoreGateway; }\r\n\r\n constructor(opt={}, emit={}) {\r\n const maxAge = validRange(opt.maxAge, ms.m(), ms.y(), false, \"maxAge\") ?? ms.M();\r\n const autoCleanup = valid(\"boolean\", opt.autoCleanup, false, \"autoCleanup\") ?? false;\r\n\r\n solid(this, \"emit\", emit);\r\n solid(this, \"maxAge\", maxAge);\r\n solid(this, \"store\", validStore(opt.store, false) ?? new LiveStore());\r\n\r\n if (autoCleanup) { this.startAutoCleanup(validInterval(opt.autoCleanupMs, false, \"autoCleanupMs\")); }\r\n }\r\n\r\n async list() {\r\n const { store } = this\r\n requireList(store);\r\n return store.list();\r\n }\r\n\r\n async get(sid) {\r\n const { store } = this\r\n const c = await store.get(sid);\r\n if (!c) { return; }\r\n \r\n if (Date.now() >= c.expiresAt) {\r\n await this.destroy(sid); return;\r\n }\r\n\r\n try { return JSON.parse(c.session); }\r\n catch {\r\n await this.destroy(sid); // rozbit\u00FD z\u00E1znam pry\u010D\r\n throw new Error(`${_errPrefix} Invalid session JSON for sid='${sid}'.`);\r\n };\r\n\r\n }\r\n\r\n async set(sid, session, maxAge) {\r\n const { store } = this\r\n const ses = validObject(session, false, \"session\");\r\n if (ses == null) { return this.destroy(sid); }\r\n\r\n const to = JSON.stringify(ses);\r\n const from = await store.get(sid, false);\r\n if (to === from?.session) { return true; }\r\n\r\n const isOk = await store.set(sid, formatState(to, maxAge, this.maxAge));\r\n if (isOk === false) { return false; }\r\n this.emit.notifySet(sid, !from);\r\n return true;\r\n }\r\n\r\n async destroy(sid) {\r\n const { store } = this\r\n const isOk = await store.destroy(sid);\r\n if (isOk === false) { return false; }\r\n this.emit.notifyDestroy(sid);\r\n return true;\r\n }\r\n\r\n async cleanup() {\r\n const { store } = this\r\n requireList(store);\r\n\r\n const list = await store.list();\r\n const now = Date.now();\r\n let cleared = 0;\r\n\r\n await Promise.all([...list].map(async sid=>{\r\n const d = await store.get(sid);\r\n if (!d) { return; }\r\n if (now < d.expiresAt) { return; }\r\n if (await this.destroy(sid)) { cleared++; }\r\n }));\r\n\r\n if (is(\"function\", store.optimize)) { await store.optimize(cleared); }\r\n\r\n this.emit.notifyCleanup(cleared);\r\n return cleared;\r\n }\r\n\r\n startAutoCleanup(interval) {\r\n const { store, maxAge, _intId } = this;\r\n requireList(store);\r\n const int = validRange(interval, ms.m(), ms.d(), false, \"interval\") ?? Math.max(ms.m(), Math.min(ms.d(), maxAge/4));\r\n clearInterval(_intId);\r\n this._intId = setInterval(_=>this.cleanup().catch(()=>{}), int);\r\n return true;\r\n }\r\n\r\n stopAutoCleanup() {\r\n const { _intId } = this;\r\n if (!_intId) { return false; }\r\n clearInterval(_intId);\r\n delete this._intId;\r\n return true;\r\n }\r\n\r\n}\r\n", "\r\nexport class LiveStore extends Map {\r\n\r\n get(sid) {\r\n return super.get(sid);\r\n }\r\n\r\n set(sid, state) {\r\n super.set(sid, state);\r\n return true;\r\n }\r\n\r\n destroy(sid) {\r\n return super.delete(sid);\r\n }\r\n\r\n list() {\r\n return this.keys();\r\n }\r\n\r\n \r\n}"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { SessionBridge } from \"./class/SessionBridge.js\";\nimport { ms } from \"./const.js\";\nimport { LiveStore } from \"./stores/LiveStore.js\";\nimport { generateUid } from \"./tools.js\";\n\n\nconst bridgeSession = (app, io, opt = {}) => new SessionBridge(app, io, opt);\n\nexport default bridgeSession;\n\nexport {\n ms,\n bridgeSession,\n generateUid,\n LiveStore,\n SessionBridge\n}\n", "import { EventEmitter } from \"events\";\r\nimport { ServerResponse } from \"http\";\r\nimport { solid, virtual } from \"@randajan/props\";\r\n\r\nimport { generateUid } from \"../tools.js\";\r\nimport { createKoaSession, createClientCookie, ensureAppKeys } from \"../httpSession.js\";\r\nimport { applySessionHandler } from \"../socketSession.js\";\r\n\r\nimport { formatOptions } from \"../formatOptions.js\";\r\nimport { Bridge } from \"./Bridge.js\";\r\nimport { _errPrefix, _privs } from \"../const.js\";\r\nimport { TempMap } from \"./TempMap.js\";\r\nimport { StoreGateway } from \"./StoreGateway.js\";\r\n\r\n\r\nexport class SessionBridge extends EventEmitter {\r\n\r\n constructor(app, io, opt = {}) {\r\n super();\r\n\r\n const { appKeys, allowRndAppKeys, koaOpt, clientOpt, clientAlwaysRoll } = formatOptions(opt);\r\n const _p = {};\r\n\r\n ensureAppKeys(app, appKeys, allowRndAppKeys);\r\n\r\n const tmp = new TempMap(5000);\r\n const brg = _p.brg = new Bridge({\r\n onSet:(clientId, sessionId)=>{\r\n const isNew = !!tmp.get(sessionId, true);\r\n this.emit(\"sessionSet\", { clientId, sessionId, isNew, isInit:true });\r\n },\r\n onDelete:(clientId, sessionId)=>this.emit(\"sessionDestroy\", { clientId, sessionId })\r\n });\r\n\r\n _p.notifySet = (sid, isNew)=>{\r\n if (!sid) { return; }\r\n const cid = brg.getBySid(sid);\r\n if (!cid) { tmp.set(sid, isNew, false); return; }\r\n this.emit(\"sessionSet\", { clientId:cid, sessionId:sid, isNew:!!isNew, isInit:false });\r\n }\r\n _p.notifyDestroy = (sid)=>{ if (sid) { brg.deleteBySid(sid); } }\r\n _p.notifyCleanup = (cleared)=>{ this.emit(\"cleanup\", cleared); }\r\n\r\n const gw = _p.gw = new StoreGateway(opt, _p);\r\n\r\n const cc = createClientCookie(clientOpt);\r\n const [koaSession, sc] = createKoaSession(app, gw, koaOpt, (ctx, sid)=>{\r\n const cid = cc.get(ctx);\r\n brg.set(cid, sid);\r\n });\r\n\r\n const reviveCid = ctx=>{\r\n let cid = cc.get(ctx);\r\n if (!cid) { cc.set(ctx, cid = generateUid(24)); }\r\n else if (clientAlwaysRoll) { cc.set(ctx, cid); }\r\n return cid;\r\n }\r\n\r\n const reviveSid = async (ctx, cid)=>{\r\n const reqSid = sc.get(ctx);\r\n if (cid == null || reqSid == null) { return; } //empty cid or sid\r\n\r\n const brgSid = brg.getByCid(cid);\r\n if (brgSid == reqSid) { return; } //correct sid for this client\r\n else if (brgSid) { sc.set(ctx, brgSid); return; } //this client have different sid\r\n\r\n if (brg.getBySid(reqSid)) { return; } //sid is occupied by different client\r\n if (!await gw.get(reqSid)) { return; } //there is no sesssion with that sid\r\n brg.set(cid, reqSid); //attach session to this client\r\n }\r\n \r\n app.use(koaSession);\r\n\r\n // pro HTTP jen sessionId, nic v\u00EDc nepot\u0159ebujeme\r\n app.use(async (ctx, next) => {\r\n const cid = reviveCid(ctx);\r\n await reviveSid(ctx, cid);\r\n \r\n solid(ctx, \"clientId\", cid);\r\n virtual(ctx, \"sessionId\", _=>brg.getByCid(cid));\r\n await next();\r\n });\r\n\r\n /* ------------------ WebSocket ------------------------------------- */\r\n io.use(async (socket, next) => {\r\n const req = socket.request;\r\n const res = req.res ?? socket.response ?? new ServerResponse(req);\r\n const ctx = app.createContext(req, res);\r\n\r\n await koaSession(ctx, async () => {});\r\n \r\n const cid = reviveCid(ctx);\r\n await reviveSid(ctx, cid);\r\n\r\n solid(socket, \"clientId\", cid);\r\n virtual(socket, \"sessionId\", _=>brg.getByCid(cid));\r\n solid(socket, \"withSession\", async function (handler, onMissing) {\r\n const onm = arguments.length > 1 ? onMissing : new Error(`${_errPrefix} Session is missing for this socket.`);\r\n return applySessionHandler(socket, handler, gw, onm);\r\n }, false);\r\n\r\n await next();\r\n });\r\n\r\n _privs.set(this, _p);\r\n }\r\n\r\n async getById(sessionId) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.get(sessionId); }\r\n }\r\n\r\n async destroyById(sessionId) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.destroy(sessionId); }\r\n return false;\r\n }\r\n\r\n async setById(sessionId, session, maxAge) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.set(sessionId, session, maxAge); } \r\n throw new Error(`${_errPrefix} Creating session via setById() is prohibited. sessionId='${sessionId}'.`);\r\n }\r\n \r\n\r\n async getByClientId(clientId) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.get(sid); }\r\n }\r\n\r\n async destroyByClientId(clientId) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.destroy(sid); }\r\n return false;\r\n }\r\n \r\n async setByClientId(clientId, session, maxAge) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.set(sid, session, maxAge); }\r\n throw new Error(`${_errPrefix} Creating session via setByClientId() is prohibited. clientId='${clientId}'.`);\r\n }\r\n\r\n getSessionId(clientId) { return _privs.get(this).brg.getByCid(clientId); }\r\n getClientId(sessionId) { return _privs.get(this).brg.getBySid(sessionId); }\r\n\r\n async cleanup() { return _privs.get(this).gw.cleanup(); }\r\n startAutoCleanup(interval) { return _privs.get(this).gw.startAutoCleanup(interval); }\r\n stopAutoCleanup() { return _privs.get(this).gw.stopAutoCleanup(); }\r\n\r\n notifyStoreSet(sessionId, isNew) { return _privs.get(this).notifySet(sessionId, isNew); }\r\n notifyStoreDestroy(sessionId) { return _privs.get(this).notifyDestroy(sessionId); }\r\n notifyStoreCleanup(clearedCount) { return _privs.get(this).notifyCleanup(clearedCount); }\r\n}\r\n\r\n", "import crypto from \"crypto\";\nimport { _errPrefix } from \"./const.js\";\n\nexport const generateUid = (len = 16) => crypto.randomBytes(len).toString(\"base64url\").slice(0, len);\n\nexport const is = (type, any)=>typeof any === type;\nconst _typeOf = (any) => any === null ? \"null\" : Array.isArray(any) ? \"array\" : typeof any;\nconst _err = (msg) => `${_errPrefix} ${msg}`;\n\nexport const valid = (type, any, req=false, msg=\"argument\")=>{\n if (any == null) {\n if (!req) { return; }\n throw new TypeError(_err(`Missing required '${msg}'. Expected type '${type}'.`));\n }\n if (is(type, any)) { return any; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected type '${type}', received '${_typeOf(any)}'.`));\n}\n\nexport const validRange = (any, min, max, req=false, msg=\"argument\")=>{\n const num = valid(\"number\", any, req, msg);\n if (num == null) { return; }\n if (num < min || num > max) {\n throw new RangeError(_err(`Invalid '${msg}'. Expected value in range <${min}, ${max}>, received '${num}'.`));\n }\n return num;\n}\n\nexport const validInterval = (any, req=false, msg=\"argument\")=>{\n return validRange(any, 10, 2_147_483_647, req, msg);\n}\n\nexport const validArray = (any, req=false, msg=\"argument\")=>{\n const obj = valid(\"object\", any, req, msg);\n if (obj == null) { return; }\n if (Array.isArray(obj)) { return obj; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected plain array, received plain object.`));\n}\n\nexport const validObject = (any, req=false, msg=\"argument\")=>{\n const obj = valid(\"object\", any, req, msg);\n if (obj == null) { return; }\n if (!Array.isArray(obj)) { return obj; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected plain object, received 'array'.`));\n}\n\n\nexport const validStore = (store, req=false) => {\n store = validObject(store, req, \"store\");\n if (!store) { return; }\n\n const missing = [];\n if (!is(\"function\", store.get)) { missing.push(\"get()\"); }\n if (!is(\"function\", store.set)) { missing.push(\"set()\"); }\n if (!is(\"function\", store.destroy)) { missing.push(\"destroy()\"); }\n\n if (missing.length) {\n throw new TypeError(_err(`Invalid 'store'. Missing required API: ${missing.join(\", \")}.`));\n }\n\n valid(\"function\", store.list, false, \"store.list()\");\n \n return store;\n};\n", "export const _errPrefix = \"[koa-io-session]\";\r\n\r\nexport const ms = {\r\n s:(v=1)=>v*1000,\r\n m:(v=1)=>ms.s(v*60),\r\n h:(v=1)=>ms.m(v*60),\r\n d:(v=1)=>ms.h(v*24),\r\n w:(v=1)=>ms.d(v*7),\r\n M:(v=1)=>ms.d(v*30),\r\n y:(v=1)=>ms.d(v*365)\r\n}\r\n\r\nexport const _customOptKeys = new Set([\r\n \"appKeys\",\r\n \"store\",\r\n \"autoCleanup\",\r\n \"autoCleanupMs\",\r\n \"clientKey\",\r\n \"clientMaxAge\",\r\n \"clientAlwaysRoll\"\r\n]);\r\n\r\nexport const _privs = new WeakMap();", "import session from \"koa-session\";\r\nimport { wrapExternalKey, wrapStore } from \"./wrappers.js\";\r\nimport { _errPrefix } from \"./const.js\";\r\nimport { generateUid } from \"./tools.js\";\r\n\r\nexport const ensureAppKeys = (app, keys, allowRnd=false)=>{\r\n \r\n if (app.keys) {\r\n if (!keys) { return; }\r\n throw new Error(`${_errPrefix} Cannot set 'appKeys' because app.keys is already defined.`);\r\n }\r\n\r\n if (keys) {\r\n app.keys = keys;\r\n return;\r\n }\r\n\r\n app.keys = keys = Array(2).fill().map(() => generateUid(32));\r\n\r\n if (!allowRnd) {\r\n console.warn([\r\n `${_errPrefix} app.keys were generated at runtime.`,\r\n `${_errPrefix} Resolve this by adding one of these options to bridge constructor:`,\r\n `${_errPrefix} 1) \"appKeys\": ${JSON.stringify(app.keys)}`,\r\n `${_errPrefix} 2) \"allowRndAppKeys\": true`\r\n ].join(\"\\n\"));\r\n }\r\n}\r\n\r\nexport const createKoaSession = (app, gw, opt, onSet)=>{\r\n const maxAge = gw.maxAge;\r\n const store = wrapStore(gw);\r\n const externalKey = wrapExternalKey(opt, onSet);\r\n const koaSession = session({...opt, maxAge, store, externalKey}, app);\r\n return [koaSession, externalKey];\r\n}\r\n\r\nexport const createClientCookie = opt => {\r\n const { key, maxAge, signed, path, secure, sameSite, httpOnly } = opt;\r\n return wrapExternalKey({\r\n key,\r\n signed,\r\n maxAge,\r\n path: path ?? \"/\",\r\n secure,\r\n sameSite,\r\n httpOnly: httpOnly ?? true,\r\n overwrite: true\r\n });\r\n}\r\n", "\r\n\r\nexport const wrapStore = (store)=>{\n return {\n get:store.get.bind(store),\n set:store.set.bind(store),\n destroy:store.destroy.bind(store)\n }\n}\n\r\nexport const wrapExternalKey = (opt, onSet) => {\r\n const { externalKey: base, key, signed } = opt;\r\n\r\n const get = base?.get\r\n ? (ctx) => base.get(ctx)\r\n : (ctx) => ctx.cookies.get(key, { signed });\r\n\r\n const setRaw = base?.set\r\n ? (ctx, sid) => base.set(ctx, sid)\r\n : (ctx, sid) => ctx.cookies.set(key, sid, opt);\r\n\r\n const set = typeof onSet != \"function\"\r\n ? setRaw\r\n : (ctx, sid) => {\r\n setRaw(ctx, sid); // re\u00E1ln\u00FD z\u00E1pis SID\r\n onSet(ctx, sid); // tv\u016Fj hook\r\n };\r\n\r\n return { get, set };\r\n};\r\n", "import { solids } from \"@randajan/props\";\r\nimport { is, valid } from \"./tools.js\";\r\nimport { _errPrefix } from \"./const.js\";\r\n\r\nconst sidLocks = new Map();\r\n\r\nconst applyOnMissing = (onMissing)=>{\r\n if (onMissing instanceof Error) { throw onMissing; }\r\n if (is(\"function\", onMissing)) { return onMissing(); }\r\n return onMissing;\r\n}\r\n\r\nconst runSessionHandler = async (sid, socket, handler, gw, onMissing) => {\r\n const session = await gw.get(sid);\r\n if (!session) { return applyOnMissing(onMissing); }\r\n\r\n const sessionCtx = solids({ session }, { sessionId:sid, socket });\r\n const result = await handler(sessionCtx, socket);\r\n\r\n if (sid === socket.sessionId) { await gw.set(sid, sessionCtx.session); }\r\n\r\n return result;\r\n};\r\n\r\nconst createLock = (sid)=>{\r\n let _release;\r\n const previous = sidLocks.get(sid);\r\n const current = new Promise((resolve) => { _release = resolve; });\r\n sidLocks.set(sid, current);\r\n const release = ()=>{\r\n _release();\r\n if (sidLocks.get(sid) === current) { sidLocks.delete(sid); }\r\n }\r\n return [ previous, release ];\r\n}\r\n\r\nexport const applySessionHandler = async (socket, handler, gw, onMissing) => {\r\n\r\n valid(\"function\", handler, true, \"handler\");\r\n\r\n for (let i=0; i<5; i++) {\r\n const sid = socket.sessionId;\r\n if (!sid) { return applyOnMissing(onMissing); }\r\n\r\n const [ previous, release ] = createLock(sid);\r\n\r\n if (previous) { await previous; }\r\n if (previous && sid !== socket.sessionId) { release(); continue; } \r\n\r\n try { return await runSessionHandler(sid, socket, handler, gw, onMissing); }\r\n finally { release(); }\r\n }\r\n\r\n throw new Error(`${_errPrefix} socket.sessionId changed during withSession execution.`);\r\n\r\n};\r\n", "import { _customOptKeys, ms } from \"./const.js\";\r\nimport { generateUid, valid, validArray, validInterval, validObject } from \"./tools.js\";\r\n\r\nconst pickKoaOpt = (rawOpt) => {\r\n const koaOpt = {}\r\n for (const key in rawOpt) {\r\n if (_customOptKeys.has(key)) { continue; }\r\n koaOpt[key] = rawOpt[key];\r\n }\r\n\r\n koaOpt.key = valid(\"string\", koaOpt.key, false, \"key\") ?? \"sid\";\r\n koaOpt.signed = valid(\"boolean\", koaOpt.signed, false, \"signed\") ?? true;\r\n\r\n return koaOpt;\r\n};\r\n\r\n/**\r\n * Validate and normalize attachSession options.\r\n * Returns split options for internal parts and koa-session pass-through options.\r\n */\r\nexport const formatOptions = (opt = {}) => {\r\n opt = validObject(opt, true, \"options\");\r\n\r\n const appKeys = validArray(opt.appKeys, false, \"appKeys\");\r\n const allowRndAppKeys = valid(\"boolean\", opt.allowRndAppKeys, false, \"allowRnddAppKeys\") ?? false;\r\n\r\n const koaOpt = pickKoaOpt(opt);\r\n \r\n const clientKey = valid(\"string\", opt.clientKey) ?? \"cid\";\r\n const clientMaxAge = validInterval(opt.clientMaxAge, false, \"clientMaxAge\") ?? ms.y();\r\n const clientAlwaysRoll = valid(\"boolean\", opt.clientAlwaysRoll, false, \"clientAlwaysRoll\") ?? true;\r\n\r\n const clientOpt = { ...koaOpt, key:clientKey, maxAge:clientMaxAge }\r\n\r\n return {\r\n appKeys,\r\n allowRndAppKeys,\r\n koaOpt,\r\n clientOpt,\r\n clientAlwaysRoll,\r\n };\r\n};\r\n", "import { solids } from \"@randajan/props\";\r\n\r\nexport class Bridge {\r\n constructor(opt={}) {\r\n const { onSet, onDelete } = opt;\r\n\r\n solids(this, {\r\n onSet,\r\n onDelete,\r\n s2c:new Map(),\r\n c2s:new Map()\r\n });\r\n\r\n }\r\n\r\n set(cid, sid) {\r\n if (!cid || !sid) { return false; }\r\n\r\n const byCid = this.deleteByCid(cid, sid);\r\n const bySid = this.deleteBySid(sid, cid);\r\n if (!byCid && !bySid) { return false; }\r\n\r\n this.c2s.set(cid, sid);\r\n this.s2c.set(sid, cid);\r\n\r\n this.onSet(cid, sid);\r\n return true;\r\n }\r\n \r\n getByCid(cid) { return this.c2s.get(cid); }\r\n getBySid(sid) { return this.s2c.get(sid); }\r\n\r\n deleteBySid(sid, skipIf) {\r\n const cid = this.getBySid(sid);\r\n if (!cid) { return true; }\r\n if (skipIf && cid == skipIf) { return false; }\r\n this.s2c.delete(sid);\r\n this.c2s.delete(cid);\r\n this.onDelete(cid, sid);\r\n return true;\r\n }\r\n\r\n deleteByCid(cid, skipIf) {\r\n const sid = this.getByCid(cid);\r\n if (!sid) { return true; }\r\n if (skipIf && sid == skipIf) { return false; }\r\n this.c2s.delete(cid);\r\n this.s2c.delete(sid);\r\n this.onDelete(cid, sid);\r\n return true;\r\n }\r\n}\r\n", "import { validInterval } from \"../tools.js\";\r\nimport { _privs } from \"../const.js\";\r\n\r\n\r\nexport class TempMap extends Map {\r\n\r\n constructor(ttl) {\r\n super();\r\n\r\n const _p = {\r\n ttl:validInterval(ttl, true, \"ttl\"),\r\n ts: new Map()\r\n }\r\n\r\n _privs.set(this, _p);\r\n }\r\n\r\n set(key, value, overwrite=true) {\r\n const { ts, ttl } = _privs.get(this);\r\n if (!overwrite && this.has(key)) { return false; }\r\n this.delete(key);\r\n super.set(key, value);\r\n const t = setTimeout(_=>{ this.delete(key); }, ttl);\r\n ts.set(key, t);\r\n return true;\r\n }\r\n \r\n\r\n get(key, andDelete=false) {\r\n const v = super.get(key);\r\n if (andDelete) { this.delete(key); }\r\n return v;\r\n }\r\n\r\n delete(key) {\r\n if (!super.delete(key)) { return false; }\r\n const { ts } = _privs.get(this);\r\n const t = ts.get(key);\r\n clearTimeout(t);\r\n ts.delete(key);\r\n return true;\r\n }\r\n\r\n}", "import { solid } from \"@randajan/props\";\r\nimport { is, valid, validInterval, validObject, validRange, validStore } from \"../tools.js\";\r\nimport { _errPrefix, _privs, ms } from \"../const.js\";\r\nimport { LiveStore } from \"../stores/LiveStore.js\";\r\n\r\nconst formatState = (session, maxAge, maxAgeDefault)=>{\r\n const ttl = maxAge ?? maxAgeDefault;\r\n const expiresAt = Date.now() + ttl;\r\n return { session, expiresAt, ttl };\r\n}\r\n\r\nconst requireList = (store) => {\r\n if (!store.list) { throw new TypeError(`${_errPrefix} store.list() is required`); }\r\n};\r\n\r\nexport class StoreGateway {\r\n\r\n static is(any) { return any instanceof StoreGateway; }\r\n\r\n constructor(opt={}, emit={}) {\r\n const maxAge = validRange(opt.maxAge, ms.m(), ms.y(), false, \"maxAge\") ?? ms.M();\r\n const autoCleanup = valid(\"boolean\", opt.autoCleanup, false, \"autoCleanup\") ?? false;\r\n\r\n solid(this, \"emit\", emit);\r\n solid(this, \"maxAge\", maxAge);\r\n solid(this, \"store\", validStore(opt.store, false) ?? new LiveStore());\r\n\r\n if (autoCleanup) { this.startAutoCleanup(validInterval(opt.autoCleanupMs, false, \"autoCleanupMs\")); }\r\n }\r\n\r\n async list() {\r\n const { store } = this\r\n requireList(store);\r\n return store.list();\r\n }\r\n\r\n async get(sid) {\r\n const { store } = this\r\n const c = await store.get(sid);\r\n if (!c) { return; }\r\n \r\n if (Date.now() >= c.expiresAt) {\r\n await this.destroy(sid); return;\r\n }\r\n\r\n try { return JSON.parse(c.session); }\r\n catch {\r\n await this.destroy(sid); // rozbit\u00FD z\u00E1znam pry\u010D\r\n throw new Error(`${_errPrefix} Invalid session JSON for sid='${sid}'.`);\r\n };\r\n\r\n }\r\n\r\n async set(sid, session, maxAge) {\r\n const { store } = this\r\n const ses = validObject(session, false, \"session\");\r\n if (ses == null) { return this.destroy(sid); }\r\n\r\n const to = JSON.stringify(ses);\r\n const from = await store.get(sid, false);\r\n if (to === from?.session) { return true; }\r\n\r\n const isOk = await store.set(sid, formatState(to, maxAge, this.maxAge));\r\n if (isOk === false) { return false; }\r\n this.emit.notifySet(sid, !from);\r\n return true;\r\n }\r\n\r\n async destroy(sid) {\r\n const { store } = this\r\n const isOk = await store.destroy(sid);\r\n if (isOk === false) { return false; }\r\n this.emit.notifyDestroy(sid);\r\n return true;\r\n }\r\n\r\n async cleanup() {\r\n const { store } = this\r\n requireList(store);\r\n\r\n const list = await store.list();\r\n const now = Date.now();\r\n let cleared = 0;\r\n\r\n await Promise.all([...list].map(async sid=>{\r\n const d = await store.get(sid);\r\n if (!d) { return; }\r\n if (now < d.expiresAt) { return; }\r\n if (await this.destroy(sid)) { cleared++; }\r\n }));\r\n\r\n if (is(\"function\", store.optimize)) { await store.optimize(cleared); }\r\n\r\n this.emit.notifyCleanup(cleared);\r\n return cleared;\r\n }\r\n\r\n startAutoCleanup(interval) {\r\n const { store, maxAge, _intId } = this;\r\n requireList(store);\r\n const int = validRange(interval, ms.m(), ms.d(), false, \"interval\") ?? Math.max(ms.m(), Math.min(ms.d(), maxAge/4));\r\n clearInterval(_intId);\r\n this._intId = setInterval(_=>this.cleanup().catch(()=>{}), int);\r\n return true;\r\n }\r\n\r\n stopAutoCleanup() {\r\n const { _intId } = this;\r\n if (!_intId) { return false; }\r\n clearInterval(_intId);\r\n delete this._intId;\r\n return true;\r\n }\r\n\r\n}\r\n", "\r\nexport class LiveStore extends Map {\r\n\r\n get(sid) {\r\n return super.get(sid);\r\n }\r\n\r\n set(sid, state) {\r\n super.set(sid, state);\r\n return true;\r\n }\r\n\r\n destroy(sid) {\r\n return super.delete(sid);\r\n }\r\n\r\n list() {\r\n return this.keys();\r\n }\r\n\r\n \r\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_props", "crypto", "session", "session", "import_props", "import_props", "session", "session"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/stores/FileStore.js", "../../../src/tools.js", "../../../src/const.js"],
|
|
4
|
-
"sourcesContent": ["import createFileDB from \"@randajan/file-db\";\nimport { valid } from \"../tools.js\";\nimport { _privs } from \"../const.js\";\n\n\nconst ensureReady = async (self) => {\n const _p = _privs.get(self);\n if (_p.ready) { return _p.ready; }\n\n _p.ready = (async () => {\n await _p.file.verify();\n _p.cache = await _p.file.index();\n })();\n\n return _p.ready;\n};\n\nexport class FileStore {\n\n constructor(opt = {}) {\n const fileName = valid(\"string\", opt.fileName, false, \"fileName\") || \"sessions\";\n const fdb = opt.fdb ?? createFileDB(opt.fdbOpt ?? {});\n const file = fdb.get(fileName, false) ?? fdb.link(fileName);\n\n const _p = {\n fdb,\n file,\n cache:{},\n ready:null\n };\n\n _privs.set(this, _p);\n }\n\n async get(sid) {\n await ensureReady(this);\n const { cache } = _privs.get(this);\n return cache[sid];\n }\n\n async set(sid, state) {\n await ensureReady(this);\n const _p = _privs.get(this);\n _p.cache[sid] = state;\n await _p.file.write(sid, state);\n return true;\n }\n\n async destroy(sid) {\n await ensureReady(this);\n const _p = _privs.get(this);\n if (!Object.prototype.hasOwnProperty.call(_p.cache, sid)) { return false; }\n delete _p.cache[sid];\n await _p.file.write(sid);\n return true;\n }\n\n async list() {\n await ensureReady(this);\n return Object.keys(_privs.get(this).cache);\n }\n\n async optimize() {\n const _p = _privs.get(this);\n await _p.file.optimize();\n }\n}\n", "import crypto from \"crypto\";\nimport { _errPrefix } from \"./const.js\";\n\nexport const generateUid = (len = 16) => crypto.randomBytes(len).toString(\"base64url\").slice(0, len);\n\nexport const is = (type, any)=>typeof any === type;\nconst _typeOf = (any) => any === null ? \"null\" : Array.isArray(any) ? \"array\" : typeof any;\nconst _err = (msg) => `${_errPrefix} ${msg}`;\n\nexport const valid = (type, any, req=false, msg=\"argument\")=>{\n if (any == null) {\n if (!req) { return; }\n throw new TypeError(_err(`Missing required '${msg}'. Expected type '${type}'.`));\n }\n if (is(type, any)) { return any; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected type '${type}', received '${_typeOf(any)}'.`));\n}\n\nexport const validRange = (any, min, max, req=false, msg=\"argument\")=>{\n const num = valid(\"number\", any, req, msg);\n if (num == null) { return; }\n if (num < min || num > max) {\n throw new RangeError(_err(`Invalid '${msg}'. Expected value in range <${min}, ${max}>, received '${num}'.`));\n }\n return num;\n}\n\nexport const validInterval = (any, req=false, msg=\"argument\")=>{\n return validRange(any, 10, 2_147_483_647, req, msg);\n}\n\nexport const validObject = (any, req=false, msg=\"argument\")=>{\n const obj = valid(\"object\", any, req, msg);\n if (obj == null) { return; }\n if (!Array.isArray(obj)) { return obj; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected plain object, received 'array'.`));\n}\n\n\nexport const validStore = (store, req=false) => {\n store = validObject(store, req, \"store\");\n if (!store) { return; }\n\n const missing = [];\n if (!is(\"function\", store.get)) { missing.push(\"get()\"); }\n if (!is(\"function\", store.set)) { missing.push(\"set()\"); }\n if (!is(\"function\", store.destroy)) { missing.push(\"destroy()\"); }\n\n if (missing.length) {\n throw new TypeError(_err(`Invalid 'store'. Missing required API: ${missing.join(\", \")}.`));\n }\n\n valid(\"function\", store.list, false, \"store.list()\");\n \n return store;\n};\n", "export const _errPrefix = \"[koa-io-session]\";\r\n\r\nexport const ms = {\r\n s:(v=1)=>v*1000,\r\n m:(v=1)=>ms.s(v*60),\r\n h:(v=1)=>ms.m(v*60),\r\n d:(v=1)=>ms.h(v*24),\r\n w:(v=1)=>ms.d(v*7),\r\n M:(v=1)=>ms.d(v*30),\r\n y:(v=1)=>ms.d(v*365)\r\n}\r\n\r\nexport const _customOptKeys = new Set([\r\n \"store\",\r\n \"autoCleanup\",\r\n \"autoCleanupMs\",\r\n \"clientKey\",\r\n \"clientMaxAge\",\r\n \"clientAlwaysRoll\"\r\n]);\r\n\r\nexport const _privs = new WeakMap();"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAyB;;;ACAzB,oBAAmB;;;ACAZ,IAAM,aAAa;
|
|
4
|
+
"sourcesContent": ["import createFileDB from \"@randajan/file-db\";\nimport { valid } from \"../tools.js\";\nimport { _privs } from \"../const.js\";\n\n\nconst ensureReady = async (self) => {\n const _p = _privs.get(self);\n if (_p.ready) { return _p.ready; }\n\n _p.ready = (async () => {\n await _p.file.verify();\n _p.cache = await _p.file.index();\n })();\n\n return _p.ready;\n};\n\nexport class FileStore {\n\n constructor(opt = {}) {\n const fileName = valid(\"string\", opt.fileName, false, \"fileName\") || \"sessions\";\n const fdb = opt.fdb ?? createFileDB(opt.fdbOpt ?? {});\n const file = fdb.get(fileName, false) ?? fdb.link(fileName);\n\n const _p = {\n fdb,\n file,\n cache:{},\n ready:null\n };\n\n _privs.set(this, _p);\n }\n\n async get(sid) {\n await ensureReady(this);\n const { cache } = _privs.get(this);\n return cache[sid];\n }\n\n async set(sid, state) {\n await ensureReady(this);\n const _p = _privs.get(this);\n _p.cache[sid] = state;\n await _p.file.write(sid, state);\n return true;\n }\n\n async destroy(sid) {\n await ensureReady(this);\n const _p = _privs.get(this);\n if (!Object.prototype.hasOwnProperty.call(_p.cache, sid)) { return false; }\n delete _p.cache[sid];\n await _p.file.write(sid);\n return true;\n }\n\n async list() {\n await ensureReady(this);\n return Object.keys(_privs.get(this).cache);\n }\n\n async optimize() {\n const _p = _privs.get(this);\n await _p.file.optimize();\n }\n}\n", "import crypto from \"crypto\";\nimport { _errPrefix } from \"./const.js\";\n\nexport const generateUid = (len = 16) => crypto.randomBytes(len).toString(\"base64url\").slice(0, len);\n\nexport const is = (type, any)=>typeof any === type;\nconst _typeOf = (any) => any === null ? \"null\" : Array.isArray(any) ? \"array\" : typeof any;\nconst _err = (msg) => `${_errPrefix} ${msg}`;\n\nexport const valid = (type, any, req=false, msg=\"argument\")=>{\n if (any == null) {\n if (!req) { return; }\n throw new TypeError(_err(`Missing required '${msg}'. Expected type '${type}'.`));\n }\n if (is(type, any)) { return any; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected type '${type}', received '${_typeOf(any)}'.`));\n}\n\nexport const validRange = (any, min, max, req=false, msg=\"argument\")=>{\n const num = valid(\"number\", any, req, msg);\n if (num == null) { return; }\n if (num < min || num > max) {\n throw new RangeError(_err(`Invalid '${msg}'. Expected value in range <${min}, ${max}>, received '${num}'.`));\n }\n return num;\n}\n\nexport const validInterval = (any, req=false, msg=\"argument\")=>{\n return validRange(any, 10, 2_147_483_647, req, msg);\n}\n\nexport const validArray = (any, req=false, msg=\"argument\")=>{\n const obj = valid(\"object\", any, req, msg);\n if (obj == null) { return; }\n if (Array.isArray(obj)) { return obj; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected plain array, received plain object.`));\n}\n\nexport const validObject = (any, req=false, msg=\"argument\")=>{\n const obj = valid(\"object\", any, req, msg);\n if (obj == null) { return; }\n if (!Array.isArray(obj)) { return obj; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected plain object, received 'array'.`));\n}\n\n\nexport const validStore = (store, req=false) => {\n store = validObject(store, req, \"store\");\n if (!store) { return; }\n\n const missing = [];\n if (!is(\"function\", store.get)) { missing.push(\"get()\"); }\n if (!is(\"function\", store.set)) { missing.push(\"set()\"); }\n if (!is(\"function\", store.destroy)) { missing.push(\"destroy()\"); }\n\n if (missing.length) {\n throw new TypeError(_err(`Invalid 'store'. Missing required API: ${missing.join(\", \")}.`));\n }\n\n valid(\"function\", store.list, false, \"store.list()\");\n \n return store;\n};\n", "export const _errPrefix = \"[koa-io-session]\";\r\n\r\nexport const ms = {\r\n s:(v=1)=>v*1000,\r\n m:(v=1)=>ms.s(v*60),\r\n h:(v=1)=>ms.m(v*60),\r\n d:(v=1)=>ms.h(v*24),\r\n w:(v=1)=>ms.d(v*7),\r\n M:(v=1)=>ms.d(v*30),\r\n y:(v=1)=>ms.d(v*365)\r\n}\r\n\r\nexport const _customOptKeys = new Set([\r\n \"appKeys\",\r\n \"store\",\r\n \"autoCleanup\",\r\n \"autoCleanupMs\",\r\n \"clientKey\",\r\n \"clientMaxAge\",\r\n \"clientAlwaysRoll\"\r\n]);\r\n\r\nexport const _privs = new WeakMap();"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAyB;;;ACAzB,oBAAmB;;;ACAZ,IAAM,aAAa;AAsBnB,IAAM,SAAS,oBAAI,QAAQ;;;ADjB3B,IAAM,KAAK,CAAC,MAAM,QAAM,OAAO,QAAQ;AAC9C,IAAM,UAAU,CAAC,QAAQ,QAAQ,OAAO,SAAS,MAAM,QAAQ,GAAG,IAAI,UAAU,OAAO;AACvF,IAAM,OAAO,CAAC,QAAQ,GAAG,UAAU,IAAI,GAAG;AAEnC,IAAM,QAAQ,CAAC,MAAM,KAAK,MAAI,OAAO,MAAI,eAAa;AACzD,MAAI,OAAO,MAAM;AACb,QAAI,CAAC,KAAK;AAAE;AAAA,IAAQ;AACpB,UAAM,IAAI,UAAU,KAAK,qBAAqB,GAAG,qBAAqB,IAAI,IAAI,CAAC;AAAA,EACnF;AACA,MAAI,GAAG,MAAM,GAAG,GAAG;AAAE,WAAO;AAAA,EAAK;AACjC,QAAM,IAAI,UAAU,KAAK,YAAY,GAAG,qBAAqB,IAAI,gBAAgB,QAAQ,GAAG,CAAC,IAAI,CAAC;AACtG;;;ADXA,IAAM,cAAc,OAAO,SAAS;AAChC,QAAM,KAAK,OAAO,IAAI,IAAI;AAC1B,MAAI,GAAG,OAAO;AAAE,WAAO,GAAG;AAAA,EAAO;AAEjC,KAAG,SAAS,YAAY;AACpB,UAAM,GAAG,KAAK,OAAO;AACrB,OAAG,QAAQ,MAAM,GAAG,KAAK,MAAM;AAAA,EACnC,GAAG;AAEH,SAAO,GAAG;AACd;AAEO,IAAM,YAAN,MAAgB;AAAA,EAEnB,YAAY,MAAM,CAAC,GAAG;AAClB,UAAM,WAAW,MAAM,UAAU,IAAI,UAAU,OAAO,UAAU,KAAK;AACrE,UAAM,MAAM,IAAI,WAAO,eAAAA,SAAa,IAAI,UAAU,CAAC,CAAC;AACpD,UAAM,OAAO,IAAI,IAAI,UAAU,KAAK,KAAK,IAAI,KAAK,QAAQ;AAE1D,UAAM,KAAK;AAAA,MACP;AAAA,MACA;AAAA,MACA,OAAM,CAAC;AAAA,MACP,OAAM;AAAA,IACV;AAEA,WAAO,IAAI,MAAM,EAAE;AAAA,EACvB;AAAA,EAEA,MAAM,IAAI,KAAK;AACX,UAAM,YAAY,IAAI;AACtB,UAAM,EAAE,MAAM,IAAI,OAAO,IAAI,IAAI;AACjC,WAAO,MAAM,GAAG;AAAA,EACpB;AAAA,EAEA,MAAM,IAAI,KAAK,OAAO;AAClB,UAAM,YAAY,IAAI;AACtB,UAAM,KAAK,OAAO,IAAI,IAAI;AAC1B,OAAG,MAAM,GAAG,IAAI;AAChB,UAAM,GAAG,KAAK,MAAM,KAAK,KAAK;AAC9B,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,QAAQ,KAAK;AACf,UAAM,YAAY,IAAI;AACtB,UAAM,KAAK,OAAO,IAAI,IAAI;AAC1B,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,OAAO,GAAG,GAAG;AAAE,aAAO;AAAA,IAAO;AAC1E,WAAO,GAAG,MAAM,GAAG;AACnB,UAAM,GAAG,KAAK,MAAM,GAAG;AACvB,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,OAAO;AACT,UAAM,YAAY,IAAI;AACtB,WAAO,OAAO,KAAK,OAAO,IAAI,IAAI,EAAE,KAAK;AAAA,EAC7C;AAAA,EAEA,MAAM,WAAW;AACb,UAAM,KAAK,OAAO,IAAI,IAAI;AAC1B,UAAM,GAAG,KAAK,SAAS;AAAA,EAC3B;AACJ;",
|
|
6
6
|
"names": ["createFileDB"]
|
|
7
7
|
}
|
|
@@ -10,6 +10,7 @@ var ms = {
|
|
|
10
10
|
y: (v = 1) => ms.d(v * 365)
|
|
11
11
|
};
|
|
12
12
|
var _customOptKeys = /* @__PURE__ */ new Set([
|
|
13
|
+
"appKeys",
|
|
13
14
|
"store",
|
|
14
15
|
"autoCleanup",
|
|
15
16
|
"autoCleanupMs",
|
|
@@ -50,6 +51,16 @@ var validRange = (any, min, max, req = false, msg = "argument") => {
|
|
|
50
51
|
var validInterval = (any, req = false, msg = "argument") => {
|
|
51
52
|
return validRange(any, 10, 2147483647, req, msg);
|
|
52
53
|
};
|
|
54
|
+
var validArray = (any, req = false, msg = "argument") => {
|
|
55
|
+
const obj = valid("object", any, req, msg);
|
|
56
|
+
if (obj == null) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (Array.isArray(obj)) {
|
|
60
|
+
return obj;
|
|
61
|
+
}
|
|
62
|
+
throw new TypeError(_err(`Invalid '${msg}'. Expected plain array, received plain object.`));
|
|
63
|
+
};
|
|
53
64
|
var validObject = (any, req = false, msg = "argument") => {
|
|
54
65
|
const obj = valid("object", any, req, msg);
|
|
55
66
|
if (obj == null) {
|
|
@@ -92,7 +103,8 @@ export {
|
|
|
92
103
|
valid,
|
|
93
104
|
validRange,
|
|
94
105
|
validInterval,
|
|
106
|
+
validArray,
|
|
95
107
|
validObject,
|
|
96
108
|
validStore
|
|
97
109
|
};
|
|
98
|
-
//# sourceMappingURL=chunk-
|
|
110
|
+
//# sourceMappingURL=chunk-NKL2ZYZW.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/const.js", "../../src/tools.js"],
|
|
4
|
+
"sourcesContent": ["export const _errPrefix = \"[koa-io-session]\";\r\n\r\nexport const ms = {\r\n s:(v=1)=>v*1000,\r\n m:(v=1)=>ms.s(v*60),\r\n h:(v=1)=>ms.m(v*60),\r\n d:(v=1)=>ms.h(v*24),\r\n w:(v=1)=>ms.d(v*7),\r\n M:(v=1)=>ms.d(v*30),\r\n y:(v=1)=>ms.d(v*365)\r\n}\r\n\r\nexport const _customOptKeys = new Set([\r\n \"appKeys\",\r\n \"store\",\r\n \"autoCleanup\",\r\n \"autoCleanupMs\",\r\n \"clientKey\",\r\n \"clientMaxAge\",\r\n \"clientAlwaysRoll\"\r\n]);\r\n\r\nexport const _privs = new WeakMap();", "import crypto from \"crypto\";\nimport { _errPrefix } from \"./const.js\";\n\nexport const generateUid = (len = 16) => crypto.randomBytes(len).toString(\"base64url\").slice(0, len);\n\nexport const is = (type, any)=>typeof any === type;\nconst _typeOf = (any) => any === null ? \"null\" : Array.isArray(any) ? \"array\" : typeof any;\nconst _err = (msg) => `${_errPrefix} ${msg}`;\n\nexport const valid = (type, any, req=false, msg=\"argument\")=>{\n if (any == null) {\n if (!req) { return; }\n throw new TypeError(_err(`Missing required '${msg}'. Expected type '${type}'.`));\n }\n if (is(type, any)) { return any; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected type '${type}', received '${_typeOf(any)}'.`));\n}\n\nexport const validRange = (any, min, max, req=false, msg=\"argument\")=>{\n const num = valid(\"number\", any, req, msg);\n if (num == null) { return; }\n if (num < min || num > max) {\n throw new RangeError(_err(`Invalid '${msg}'. Expected value in range <${min}, ${max}>, received '${num}'.`));\n }\n return num;\n}\n\nexport const validInterval = (any, req=false, msg=\"argument\")=>{\n return validRange(any, 10, 2_147_483_647, req, msg);\n}\n\nexport const validArray = (any, req=false, msg=\"argument\")=>{\n const obj = valid(\"object\", any, req, msg);\n if (obj == null) { return; }\n if (Array.isArray(obj)) { return obj; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected plain array, received plain object.`));\n}\n\nexport const validObject = (any, req=false, msg=\"argument\")=>{\n const obj = valid(\"object\", any, req, msg);\n if (obj == null) { return; }\n if (!Array.isArray(obj)) { return obj; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected plain object, received 'array'.`));\n}\n\n\nexport const validStore = (store, req=false) => {\n store = validObject(store, req, \"store\");\n if (!store) { return; }\n\n const missing = [];\n if (!is(\"function\", store.get)) { missing.push(\"get()\"); }\n if (!is(\"function\", store.set)) { missing.push(\"set()\"); }\n if (!is(\"function\", store.destroy)) { missing.push(\"destroy()\"); }\n\n if (missing.length) {\n throw new TypeError(_err(`Invalid 'store'. Missing required API: ${missing.join(\", \")}.`));\n }\n\n valid(\"function\", store.list, false, \"store.list()\");\n \n return store;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -6,11 +6,12 @@ import {
|
|
|
6
6
|
is,
|
|
7
7
|
ms,
|
|
8
8
|
valid,
|
|
9
|
+
validArray,
|
|
9
10
|
validInterval,
|
|
10
11
|
validObject,
|
|
11
12
|
validRange,
|
|
12
13
|
validStore
|
|
13
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-NKL2ZYZW.js";
|
|
14
15
|
|
|
15
16
|
// src/class/SessionBridge.js
|
|
16
17
|
import { EventEmitter } from "events";
|
|
@@ -40,6 +41,27 @@ var wrapExternalKey = (opt, onSet) => {
|
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
// src/httpSession.js
|
|
44
|
+
var ensureAppKeys = (app, keys, allowRnd = false) => {
|
|
45
|
+
if (app.keys) {
|
|
46
|
+
if (!keys) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
throw new Error(`${_errPrefix} Cannot set 'appKeys' because app.keys is already defined.`);
|
|
50
|
+
}
|
|
51
|
+
if (keys) {
|
|
52
|
+
app.keys = keys;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
app.keys = keys = Array(2).fill().map(() => generateUid(32));
|
|
56
|
+
if (!allowRnd) {
|
|
57
|
+
console.warn([
|
|
58
|
+
`${_errPrefix} app.keys were generated at runtime.`,
|
|
59
|
+
`${_errPrefix} Resolve this by adding one of these options to bridge constructor:`,
|
|
60
|
+
`${_errPrefix} 1) "appKeys": ${JSON.stringify(app.keys)}`,
|
|
61
|
+
`${_errPrefix} 2) "allowRndAppKeys": true`
|
|
62
|
+
].join("\n"));
|
|
63
|
+
}
|
|
64
|
+
};
|
|
43
65
|
var createKoaSession = (app, gw, opt, onSet) => {
|
|
44
66
|
const maxAge = gw.maxAge;
|
|
45
67
|
const store = wrapStore(gw);
|
|
@@ -133,18 +155,22 @@ var pickKoaOpt = (rawOpt) => {
|
|
|
133
155
|
}
|
|
134
156
|
koaOpt[key] = rawOpt[key];
|
|
135
157
|
}
|
|
136
|
-
koaOpt.key = valid("string", koaOpt.key, false, "key") ??
|
|
158
|
+
koaOpt.key = valid("string", koaOpt.key, false, "key") ?? "sid";
|
|
137
159
|
koaOpt.signed = valid("boolean", koaOpt.signed, false, "signed") ?? true;
|
|
138
160
|
return koaOpt;
|
|
139
161
|
};
|
|
140
162
|
var formatOptions = (opt = {}) => {
|
|
141
163
|
opt = validObject(opt, true, "options");
|
|
164
|
+
const appKeys = validArray(opt.appKeys, false, "appKeys");
|
|
165
|
+
const allowRndAppKeys = valid("boolean", opt.allowRndAppKeys, false, "allowRnddAppKeys") ?? false;
|
|
142
166
|
const koaOpt = pickKoaOpt(opt);
|
|
143
|
-
const clientKey = valid("string", opt.clientKey) ??
|
|
167
|
+
const clientKey = valid("string", opt.clientKey) ?? "cid";
|
|
144
168
|
const clientMaxAge = validInterval(opt.clientMaxAge, false, "clientMaxAge") ?? ms.y();
|
|
145
169
|
const clientAlwaysRoll = valid("boolean", opt.clientAlwaysRoll, false, "clientAlwaysRoll") ?? true;
|
|
146
170
|
const clientOpt = { ...koaOpt, key: clientKey, maxAge: clientMaxAge };
|
|
147
171
|
return {
|
|
172
|
+
appKeys,
|
|
173
|
+
allowRndAppKeys,
|
|
148
174
|
koaOpt,
|
|
149
175
|
clientOpt,
|
|
150
176
|
clientAlwaysRoll
|
|
@@ -396,11 +422,9 @@ var StoreGateway = class _StoreGateway {
|
|
|
396
422
|
var SessionBridge = class extends EventEmitter {
|
|
397
423
|
constructor(app, io, opt = {}) {
|
|
398
424
|
super();
|
|
399
|
-
|
|
400
|
-
app.keys = Array(6).fill().map(() => generateUid(12));
|
|
401
|
-
}
|
|
402
|
-
const { koaOpt, clientOpt, clientAlwaysRoll } = formatOptions(opt);
|
|
425
|
+
const { appKeys, allowRndAppKeys, koaOpt, clientOpt, clientAlwaysRoll } = formatOptions(opt);
|
|
403
426
|
const _p = {};
|
|
427
|
+
ensureAppKeys(app, appKeys, allowRndAppKeys);
|
|
404
428
|
const tmp = new TempMap(5e3);
|
|
405
429
|
const brg = _p.brg = new Bridge({
|
|
406
430
|
onSet: (clientId, sessionId) => {
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/class/SessionBridge.js", "../../src/httpSession.js", "../../src/wrappers.js", "../../src/socketSession.js", "../../src/formatOptions.js", "../../src/class/Bridge.js", "../../src/class/TempMap.js", "../../src/class/StoreGateway.js", "../../src/stores/LiveStore.js", "../../src/index.js"],
|
|
4
|
-
"sourcesContent": ["import { EventEmitter } from \"events\";\r\nimport { ServerResponse } from \"http\";\r\nimport { solid, virtual } from \"@randajan/props\";\r\n\r\nimport { generateUid } from \"../tools.js\";\r\nimport { createKoaSession, createClientCookie } from \"../httpSession.js\";\r\nimport { applySessionHandler } from \"../socketSession.js\";\r\n\r\nimport { formatOptions } from \"../formatOptions.js\";\r\nimport { Bridge } from \"./Bridge.js\";\r\nimport { _errPrefix, _privs } from \"../const.js\";\r\nimport { TempMap } from \"./TempMap.js\";\r\nimport { StoreGateway } from \"./StoreGateway.js\";\r\n\r\n\r\nexport class SessionBridge extends EventEmitter {\r\n\r\n constructor(app, io, opt = {}) {\r\n super();\r\n\r\n if (!app.keys) { app.keys = Array(6).fill().map(() => generateUid(12)); }\r\n\r\n const { koaOpt, clientOpt, clientAlwaysRoll } = formatOptions(opt);\r\n const _p = {};\r\n\r\n const tmp = new TempMap(5000);\r\n const brg = _p.brg = new Bridge({\r\n onSet:(clientId, sessionId)=>{\r\n const isNew = !!tmp.get(sessionId, true);\r\n this.emit(\"sessionSet\", { clientId, sessionId, isNew, isInit:true });\r\n },\r\n onDelete:(clientId, sessionId)=>this.emit(\"sessionDestroy\", { clientId, sessionId })\r\n });\r\n\r\n _p.notifySet = (sid, isNew)=>{\r\n if (!sid) { return; }\r\n const cid = brg.getBySid(sid);\r\n if (!cid) { tmp.set(sid, isNew, false); return; }\r\n this.emit(\"sessionSet\", { clientId:cid, sessionId:sid, isNew:!!isNew, isInit:false });\r\n }\r\n _p.notifyDestroy = (sid)=>{ if (sid) { brg.deleteBySid(sid); } }\r\n _p.notifyCleanup = (cleared)=>{ this.emit(\"cleanup\", cleared); }\r\n\r\n const gw = _p.gw = new StoreGateway(opt, _p);\r\n\r\n const cc = createClientCookie(clientOpt);\r\n const [koaSession, sc] = createKoaSession(app, gw, koaOpt, (ctx, sid)=>{\r\n const cid = cc.get(ctx);\r\n brg.set(cid, sid);\r\n });\r\n\r\n const reviveCid = ctx=>{\r\n let cid = cc.get(ctx);\r\n if (!cid) { cc.set(ctx, cid = generateUid(24)); }\r\n else if (clientAlwaysRoll) { cc.set(ctx, cid); }\r\n return cid;\r\n }\r\n\r\n const reviveSid = async (ctx, cid)=>{\r\n const reqSid = sc.get(ctx);\r\n if (cid == null || reqSid == null) { return; } //empty cid or sid\r\n\r\n const brgSid = brg.getByCid(cid);\r\n if (brgSid == reqSid) { return; } //correct sid for this client\r\n else if (brgSid) { sc.set(ctx, brgSid); return; } //this client have different sid\r\n\r\n if (brg.getBySid(reqSid)) { return; } //sid is occupied by different client\r\n if (!await gw.get(reqSid)) { return; } //there is no sesssion with that sid\r\n brg.set(cid, reqSid); //attach session to this client\r\n }\r\n \r\n app.use(koaSession);\r\n\r\n // pro HTTP jen sessionId, nic v\u00EDc nepot\u0159ebujeme\r\n app.use(async (ctx, next) => {\r\n const cid = reviveCid(ctx);\r\n await reviveSid(ctx, cid);\r\n \r\n solid(ctx, \"clientId\", cid);\r\n virtual(ctx, \"sessionId\", _=>brg.getByCid(cid));\r\n await next();\r\n });\r\n\r\n /* ------------------ WebSocket ------------------------------------- */\r\n io.use(async (socket, next) => {\r\n const req = socket.request;\r\n const res = req.res ?? socket.response ?? new ServerResponse(req);\r\n const ctx = app.createContext(req, res);\r\n\r\n await koaSession(ctx, async () => {});\r\n \r\n const cid = reviveCid(ctx);\r\n await reviveSid(ctx, cid);\r\n\r\n solid(socket, \"clientId\", cid);\r\n virtual(socket, \"sessionId\", _=>brg.getByCid(cid));\r\n solid(socket, \"withSession\", async function (handler, onMissing) {\r\n const onm = arguments.length > 1 ? onMissing : new Error(`${_errPrefix} Session is missing for this socket.`);\r\n return applySessionHandler(socket, handler, gw, onm);\r\n }, false);\r\n\r\n await next();\r\n });\r\n\r\n _privs.set(this, _p);\r\n }\r\n\r\n async getById(sessionId) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.get(sessionId); }\r\n }\r\n\r\n async destroyById(sessionId) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.destroy(sessionId); }\r\n return false;\r\n }\r\n\r\n async setById(sessionId, session, maxAge) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.set(sessionId, session, maxAge); } \r\n throw new Error(`${_errPrefix} Creating session via setById() is prohibited. sessionId='${sessionId}'.`);\r\n }\r\n \r\n\r\n async getByClientId(clientId) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.get(sid); }\r\n }\r\n\r\n async destroyByClientId(clientId) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.destroy(sid); }\r\n return false;\r\n }\r\n \r\n async setByClientId(clientId, session, maxAge) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.set(sid, session, maxAge); }\r\n throw new Error(`${_errPrefix} Creating session via setByClientId() is prohibited. clientId='${clientId}'.`);\r\n }\r\n\r\n getSessionId(clientId) { return _privs.get(this).brg.getByCid(clientId); }\r\n getClientId(sessionId) { return _privs.get(this).brg.getBySid(sessionId); }\r\n\r\n async cleanup() { return _privs.get(this).gw.cleanup(); }\r\n startAutoCleanup(interval) { return _privs.get(this).gw.startAutoCleanup(interval); }\r\n stopAutoCleanup() { return _privs.get(this).gw.stopAutoCleanup(); }\r\n\r\n notifyStoreSet(sessionId, isNew) { return _privs.get(this).notifySet(sessionId, isNew); }\r\n notifyStoreDestroy(sessionId) { return _privs.get(this).notifyDestroy(sessionId); }\r\n notifyStoreCleanup(clearedCount) { return _privs.get(this).notifyCleanup(clearedCount); }\r\n}\r\n\r\n", "import session from \"koa-session\";\r\nimport { wrapExternalKey, wrapStore } from \"./wrappers.js\";\r\n\r\nexport const createKoaSession = (app, gw, opt, onSet)=>{\r\n const maxAge = gw.maxAge;\r\n const store = wrapStore(gw);\r\n const externalKey = wrapExternalKey(opt, onSet);\r\n const koaSession = session({...opt, maxAge, store, externalKey}, app);\r\n return [koaSession, externalKey];\r\n}\r\n\r\nexport const createClientCookie = opt => {\r\n const { key, maxAge, signed, path, secure, sameSite, httpOnly } = opt;\r\n return wrapExternalKey({\r\n key,\r\n signed,\r\n maxAge,\r\n path: path ?? \"/\",\r\n secure,\r\n sameSite,\r\n httpOnly: httpOnly ?? true,\r\n overwrite: true\r\n });\r\n}", "\r\n\r\nexport const wrapStore = (store)=>{\n return {\n get:store.get.bind(store),\n set:store.set.bind(store),\n destroy:store.destroy.bind(store)\n }\n}\n\r\nexport const wrapExternalKey = (opt, onSet) => {\r\n const { externalKey: base, key, signed } = opt;\r\n\r\n const get = base?.get\r\n ? (ctx) => base.get(ctx)\r\n : (ctx) => ctx.cookies.get(key, { signed });\r\n\r\n const setRaw = base?.set\r\n ? (ctx, sid) => base.set(ctx, sid)\r\n : (ctx, sid) => ctx.cookies.set(key, sid, opt);\r\n\r\n const set = typeof onSet != \"function\"\r\n ? setRaw\r\n : (ctx, sid) => {\r\n setRaw(ctx, sid); // re\u00E1ln\u00FD z\u00E1pis SID\r\n onSet(ctx, sid); // tv\u016Fj hook\r\n };\r\n\r\n return { get, set };\r\n};\r\n", "import { solids } from \"@randajan/props\";\r\nimport { is, valid } from \"./tools.js\";\r\nimport { _errPrefix } from \"./const.js\";\r\n\r\nconst sidLocks = new Map();\r\n\r\nconst applyOnMissing = (onMissing)=>{\r\n if (onMissing instanceof Error) { throw onMissing; }\r\n if (is(\"function\", onMissing)) { return onMissing(); }\r\n return onMissing;\r\n}\r\n\r\nconst runSessionHandler = async (sid, socket, handler, gw, onMissing) => {\r\n const session = await gw.get(sid);\r\n if (!session) { return applyOnMissing(onMissing); }\r\n\r\n const sessionCtx = solids({ session }, { sessionId:sid, socket });\r\n const result = await handler(sessionCtx, socket);\r\n\r\n if (sid === socket.sessionId) { await gw.set(sid, sessionCtx.session); }\r\n\r\n return result;\r\n};\r\n\r\nconst createLock = (sid)=>{\r\n let _release;\r\n const previous = sidLocks.get(sid);\r\n const current = new Promise((resolve) => { _release = resolve; });\r\n sidLocks.set(sid, current);\r\n const release = ()=>{\r\n _release();\r\n if (sidLocks.get(sid) === current) { sidLocks.delete(sid); }\r\n }\r\n return [ previous, release ];\r\n}\r\n\r\nexport const applySessionHandler = async (socket, handler, gw, onMissing) => {\r\n\r\n valid(\"function\", handler, true, \"handler\");\r\n\r\n for (let i=0; i<5; i++) {\r\n const sid = socket.sessionId;\r\n if (!sid) { return applyOnMissing(onMissing); }\r\n\r\n const [ previous, release ] = createLock(sid);\r\n\r\n if (previous) { await previous; }\r\n if (previous && sid !== socket.sessionId) { release(); continue; } \r\n\r\n try { return await runSessionHandler(sid, socket, handler, gw, onMissing); }\r\n finally { release(); }\r\n }\r\n\r\n throw new Error(`${_errPrefix} socket.sessionId changed during withSession execution.`);\r\n\r\n};\r\n", "import { _customOptKeys, ms } from \"./const.js\";\r\nimport { generateUid, valid, validInterval, validObject } from \"./tools.js\";\r\n\r\nconst pickKoaOpt = (rawOpt) => {\r\n const koaOpt = {}\r\n for (const key in rawOpt) {\r\n if (_customOptKeys.has(key)) { continue; }\r\n koaOpt[key] = rawOpt[key];\r\n }\r\n\r\n koaOpt.key = valid(\"string\", koaOpt.key, false, \"key\") ?? generateUid(12);\r\n koaOpt.signed = valid(\"boolean\", koaOpt.signed, false, \"signed\") ?? true;\r\n\r\n return koaOpt;\r\n};\r\n\r\n/**\r\n * Validate and normalize attachSession options.\r\n * Returns split options for internal parts and koa-session pass-through options.\r\n */\r\nexport const formatOptions = (opt = {}) => {\r\n opt = validObject(opt, true, \"options\");\r\n\r\n const koaOpt = pickKoaOpt(opt);\r\n \r\n const clientKey = valid(\"string\", opt.clientKey) ?? `${koaOpt.key}.cid`;\r\n const clientMaxAge = validInterval(opt.clientMaxAge, false, \"clientMaxAge\") ?? ms.y();\r\n const clientAlwaysRoll = valid(\"boolean\", opt.clientAlwaysRoll, false, \"clientAlwaysRoll\") ?? true;\r\n\r\n const clientOpt = { ...koaOpt, key:clientKey, maxAge:clientMaxAge }\r\n\r\n return {\r\n koaOpt,\r\n clientOpt,\r\n clientAlwaysRoll,\r\n };\r\n};\r\n\r\n", "import { solids } from \"@randajan/props\";\r\n\r\nexport class Bridge {\r\n constructor(opt={}) {\r\n const { onSet, onDelete } = opt;\r\n\r\n solids(this, {\r\n onSet,\r\n onDelete,\r\n s2c:new Map(),\r\n c2s:new Map()\r\n });\r\n\r\n }\r\n\r\n set(cid, sid) {\r\n if (!cid || !sid) { return false; }\r\n\r\n const byCid = this.deleteByCid(cid, sid);\r\n const bySid = this.deleteBySid(sid, cid);\r\n if (!byCid && !bySid) { return false; }\r\n\r\n this.c2s.set(cid, sid);\r\n this.s2c.set(sid, cid);\r\n\r\n this.onSet(cid, sid);\r\n return true;\r\n }\r\n \r\n getByCid(cid) { return this.c2s.get(cid); }\r\n getBySid(sid) { return this.s2c.get(sid); }\r\n\r\n deleteBySid(sid, skipIf) {\r\n const cid = this.getBySid(sid);\r\n if (!cid) { return true; }\r\n if (skipIf && cid == skipIf) { return false; }\r\n this.s2c.delete(sid);\r\n this.c2s.delete(cid);\r\n this.onDelete(cid, sid);\r\n return true;\r\n }\r\n\r\n deleteByCid(cid, skipIf) {\r\n const sid = this.getByCid(cid);\r\n if (!sid) { return true; }\r\n if (skipIf && sid == skipIf) { return false; }\r\n this.c2s.delete(cid);\r\n this.s2c.delete(sid);\r\n this.onDelete(cid, sid);\r\n return true;\r\n }\r\n}\r\n", "import { validInterval } from \"../tools.js\";\r\nimport { _privs } from \"../const.js\";\r\n\r\n\r\nexport class TempMap extends Map {\r\n\r\n constructor(ttl) {\r\n super();\r\n\r\n const _p = {\r\n ttl:validInterval(ttl, true, \"ttl\"),\r\n ts: new Map()\r\n }\r\n\r\n _privs.set(this, _p);\r\n }\r\n\r\n set(key, value, overwrite=true) {\r\n const { ts, ttl } = _privs.get(this);\r\n if (!overwrite && this.has(key)) { return false; }\r\n this.delete(key);\r\n super.set(key, value);\r\n const t = setTimeout(_=>{ this.delete(key); }, ttl);\r\n ts.set(key, t);\r\n return true;\r\n }\r\n \r\n\r\n get(key, andDelete=false) {\r\n const v = super.get(key);\r\n if (andDelete) { this.delete(key); }\r\n return v;\r\n }\r\n\r\n delete(key) {\r\n if (!super.delete(key)) { return false; }\r\n const { ts } = _privs.get(this);\r\n const t = ts.get(key);\r\n clearTimeout(t);\r\n ts.delete(key);\r\n return true;\r\n }\r\n\r\n}", "import { solid } from \"@randajan/props\";\r\nimport { is, valid, validInterval, validObject, validRange, validStore } from \"../tools.js\";\r\nimport { _errPrefix, _privs, ms } from \"../const.js\";\r\nimport { LiveStore } from \"../stores/LiveStore.js\";\r\n\r\nconst formatState = (session, maxAge, maxAgeDefault)=>{\r\n const ttl = maxAge ?? maxAgeDefault;\r\n const expiresAt = Date.now() + ttl;\r\n return { session, expiresAt, ttl };\r\n}\r\n\r\nconst requireList = (store) => {\r\n if (!store.list) { throw new TypeError(`${_errPrefix} store.list() is required`); }\r\n};\r\n\r\nexport class StoreGateway {\r\n\r\n static is(any) { return any instanceof StoreGateway; }\r\n\r\n constructor(opt={}, emit={}) {\r\n const maxAge = validRange(opt.maxAge, ms.m(), ms.y(), false, \"maxAge\") ?? ms.M();\r\n const autoCleanup = valid(\"boolean\", opt.autoCleanup, false, \"autoCleanup\") ?? false;\r\n\r\n solid(this, \"emit\", emit);\r\n solid(this, \"maxAge\", maxAge);\r\n solid(this, \"store\", validStore(opt.store, false) ?? new LiveStore());\r\n\r\n if (autoCleanup) { this.startAutoCleanup(validInterval(opt.autoCleanupMs, false, \"autoCleanupMs\")); }\r\n }\r\n\r\n async list() {\r\n const { store } = this\r\n requireList(store);\r\n return store.list();\r\n }\r\n\r\n async get(sid) {\r\n const { store } = this\r\n const c = await store.get(sid);\r\n if (!c) { return; }\r\n \r\n if (Date.now() >= c.expiresAt) {\r\n await this.destroy(sid); return;\r\n }\r\n\r\n try { return JSON.parse(c.session); }\r\n catch {\r\n await this.destroy(sid); // rozbit\u00FD z\u00E1znam pry\u010D\r\n throw new Error(`${_errPrefix} Invalid session JSON for sid='${sid}'.`);\r\n };\r\n\r\n }\r\n\r\n async set(sid, session, maxAge) {\r\n const { store } = this\r\n const ses = validObject(session, false, \"session\");\r\n if (ses == null) { return this.destroy(sid); }\r\n\r\n const to = JSON.stringify(ses);\r\n const from = await store.get(sid, false);\r\n if (to === from?.session) { return true; }\r\n\r\n const isOk = await store.set(sid, formatState(to, maxAge, this.maxAge));\r\n if (isOk === false) { return false; }\r\n this.emit.notifySet(sid, !from);\r\n return true;\r\n }\r\n\r\n async destroy(sid) {\r\n const { store } = this\r\n const isOk = await store.destroy(sid);\r\n if (isOk === false) { return false; }\r\n this.emit.notifyDestroy(sid);\r\n return true;\r\n }\r\n\r\n async cleanup() {\r\n const { store } = this\r\n requireList(store);\r\n\r\n const list = await store.list();\r\n const now = Date.now();\r\n let cleared = 0;\r\n\r\n await Promise.all([...list].map(async sid=>{\r\n const d = await store.get(sid);\r\n if (!d) { return; }\r\n if (now < d.expiresAt) { return; }\r\n if (await this.destroy(sid)) { cleared++; }\r\n }));\r\n\r\n if (is(\"function\", store.optimize)) { await store.optimize(cleared); }\r\n\r\n this.emit.notifyCleanup(cleared);\r\n return cleared;\r\n }\r\n\r\n startAutoCleanup(interval) {\r\n const { store, maxAge, _intId } = this;\r\n requireList(store);\r\n const int = validRange(interval, ms.m(), ms.d(), false, \"interval\") ?? Math.max(ms.m(), Math.min(ms.d(), maxAge/4));\r\n clearInterval(_intId);\r\n this._intId = setInterval(_=>this.cleanup().catch(()=>{}), int);\r\n return true;\r\n }\r\n\r\n stopAutoCleanup() {\r\n const { _intId } = this;\r\n if (!_intId) { return false; }\r\n clearInterval(_intId);\r\n delete this._intId;\r\n return true;\r\n }\r\n\r\n}\r\n", "\r\nexport class LiveStore extends Map {\r\n\r\n get(sid) {\r\n return super.get(sid);\r\n }\r\n\r\n set(sid, state) {\r\n super.set(sid, state);\r\n return true;\r\n }\r\n\r\n destroy(sid) {\r\n return super.delete(sid);\r\n }\r\n\r\n list() {\r\n return this.keys();\r\n }\r\n\r\n \r\n}", "import { SessionBridge } from \"./class/SessionBridge.js\";\nimport { ms } from \"./const.js\";\nimport { LiveStore } from \"./stores/LiveStore.js\";\nimport { generateUid } from \"./tools.js\";\n\n\nconst bridgeSession = (app, io, opt = {}) => new SessionBridge(app, io, opt);\n\nexport default bridgeSession;\n\nexport {\n ms,\n bridgeSession,\n generateUid,\n LiveStore,\n SessionBridge\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { EventEmitter } from \"events\";\r\nimport { ServerResponse } from \"http\";\r\nimport { solid, virtual } from \"@randajan/props\";\r\n\r\nimport { generateUid } from \"../tools.js\";\r\nimport { createKoaSession, createClientCookie, ensureAppKeys } from \"../httpSession.js\";\r\nimport { applySessionHandler } from \"../socketSession.js\";\r\n\r\nimport { formatOptions } from \"../formatOptions.js\";\r\nimport { Bridge } from \"./Bridge.js\";\r\nimport { _errPrefix, _privs } from \"../const.js\";\r\nimport { TempMap } from \"./TempMap.js\";\r\nimport { StoreGateway } from \"./StoreGateway.js\";\r\n\r\n\r\nexport class SessionBridge extends EventEmitter {\r\n\r\n constructor(app, io, opt = {}) {\r\n super();\r\n\r\n const { appKeys, allowRndAppKeys, koaOpt, clientOpt, clientAlwaysRoll } = formatOptions(opt);\r\n const _p = {};\r\n\r\n ensureAppKeys(app, appKeys, allowRndAppKeys);\r\n\r\n const tmp = new TempMap(5000);\r\n const brg = _p.brg = new Bridge({\r\n onSet:(clientId, sessionId)=>{\r\n const isNew = !!tmp.get(sessionId, true);\r\n this.emit(\"sessionSet\", { clientId, sessionId, isNew, isInit:true });\r\n },\r\n onDelete:(clientId, sessionId)=>this.emit(\"sessionDestroy\", { clientId, sessionId })\r\n });\r\n\r\n _p.notifySet = (sid, isNew)=>{\r\n if (!sid) { return; }\r\n const cid = brg.getBySid(sid);\r\n if (!cid) { tmp.set(sid, isNew, false); return; }\r\n this.emit(\"sessionSet\", { clientId:cid, sessionId:sid, isNew:!!isNew, isInit:false });\r\n }\r\n _p.notifyDestroy = (sid)=>{ if (sid) { brg.deleteBySid(sid); } }\r\n _p.notifyCleanup = (cleared)=>{ this.emit(\"cleanup\", cleared); }\r\n\r\n const gw = _p.gw = new StoreGateway(opt, _p);\r\n\r\n const cc = createClientCookie(clientOpt);\r\n const [koaSession, sc] = createKoaSession(app, gw, koaOpt, (ctx, sid)=>{\r\n const cid = cc.get(ctx);\r\n brg.set(cid, sid);\r\n });\r\n\r\n const reviveCid = ctx=>{\r\n let cid = cc.get(ctx);\r\n if (!cid) { cc.set(ctx, cid = generateUid(24)); }\r\n else if (clientAlwaysRoll) { cc.set(ctx, cid); }\r\n return cid;\r\n }\r\n\r\n const reviveSid = async (ctx, cid)=>{\r\n const reqSid = sc.get(ctx);\r\n if (cid == null || reqSid == null) { return; } //empty cid or sid\r\n\r\n const brgSid = brg.getByCid(cid);\r\n if (brgSid == reqSid) { return; } //correct sid for this client\r\n else if (brgSid) { sc.set(ctx, brgSid); return; } //this client have different sid\r\n\r\n if (brg.getBySid(reqSid)) { return; } //sid is occupied by different client\r\n if (!await gw.get(reqSid)) { return; } //there is no sesssion with that sid\r\n brg.set(cid, reqSid); //attach session to this client\r\n }\r\n \r\n app.use(koaSession);\r\n\r\n // pro HTTP jen sessionId, nic v\u00EDc nepot\u0159ebujeme\r\n app.use(async (ctx, next) => {\r\n const cid = reviveCid(ctx);\r\n await reviveSid(ctx, cid);\r\n \r\n solid(ctx, \"clientId\", cid);\r\n virtual(ctx, \"sessionId\", _=>brg.getByCid(cid));\r\n await next();\r\n });\r\n\r\n /* ------------------ WebSocket ------------------------------------- */\r\n io.use(async (socket, next) => {\r\n const req = socket.request;\r\n const res = req.res ?? socket.response ?? new ServerResponse(req);\r\n const ctx = app.createContext(req, res);\r\n\r\n await koaSession(ctx, async () => {});\r\n \r\n const cid = reviveCid(ctx);\r\n await reviveSid(ctx, cid);\r\n\r\n solid(socket, \"clientId\", cid);\r\n virtual(socket, \"sessionId\", _=>brg.getByCid(cid));\r\n solid(socket, \"withSession\", async function (handler, onMissing) {\r\n const onm = arguments.length > 1 ? onMissing : new Error(`${_errPrefix} Session is missing for this socket.`);\r\n return applySessionHandler(socket, handler, gw, onm);\r\n }, false);\r\n\r\n await next();\r\n });\r\n\r\n _privs.set(this, _p);\r\n }\r\n\r\n async getById(sessionId) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.get(sessionId); }\r\n }\r\n\r\n async destroyById(sessionId) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.destroy(sessionId); }\r\n return false;\r\n }\r\n\r\n async setById(sessionId, session, maxAge) {\r\n const { gw, brg } = _privs.get(this);\r\n const cid = brg.getBySid(sessionId);\r\n if (cid) { return gw.set(sessionId, session, maxAge); } \r\n throw new Error(`${_errPrefix} Creating session via setById() is prohibited. sessionId='${sessionId}'.`);\r\n }\r\n \r\n\r\n async getByClientId(clientId) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.get(sid); }\r\n }\r\n\r\n async destroyByClientId(clientId) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.destroy(sid); }\r\n return false;\r\n }\r\n \r\n async setByClientId(clientId, session, maxAge) {\r\n const { gw, brg } = _privs.get(this);\r\n const sid = brg.getByCid(clientId);\r\n if (sid) { return gw.set(sid, session, maxAge); }\r\n throw new Error(`${_errPrefix} Creating session via setByClientId() is prohibited. clientId='${clientId}'.`);\r\n }\r\n\r\n getSessionId(clientId) { return _privs.get(this).brg.getByCid(clientId); }\r\n getClientId(sessionId) { return _privs.get(this).brg.getBySid(sessionId); }\r\n\r\n async cleanup() { return _privs.get(this).gw.cleanup(); }\r\n startAutoCleanup(interval) { return _privs.get(this).gw.startAutoCleanup(interval); }\r\n stopAutoCleanup() { return _privs.get(this).gw.stopAutoCleanup(); }\r\n\r\n notifyStoreSet(sessionId, isNew) { return _privs.get(this).notifySet(sessionId, isNew); }\r\n notifyStoreDestroy(sessionId) { return _privs.get(this).notifyDestroy(sessionId); }\r\n notifyStoreCleanup(clearedCount) { return _privs.get(this).notifyCleanup(clearedCount); }\r\n}\r\n\r\n", "import session from \"koa-session\";\r\nimport { wrapExternalKey, wrapStore } from \"./wrappers.js\";\r\nimport { _errPrefix } from \"./const.js\";\r\nimport { generateUid } from \"./tools.js\";\r\n\r\nexport const ensureAppKeys = (app, keys, allowRnd=false)=>{\r\n \r\n if (app.keys) {\r\n if (!keys) { return; }\r\n throw new Error(`${_errPrefix} Cannot set 'appKeys' because app.keys is already defined.`);\r\n }\r\n\r\n if (keys) {\r\n app.keys = keys;\r\n return;\r\n }\r\n\r\n app.keys = keys = Array(2).fill().map(() => generateUid(32));\r\n\r\n if (!allowRnd) {\r\n console.warn([\r\n `${_errPrefix} app.keys were generated at runtime.`,\r\n `${_errPrefix} Resolve this by adding one of these options to bridge constructor:`,\r\n `${_errPrefix} 1) \"appKeys\": ${JSON.stringify(app.keys)}`,\r\n `${_errPrefix} 2) \"allowRndAppKeys\": true`\r\n ].join(\"\\n\"));\r\n }\r\n}\r\n\r\nexport const createKoaSession = (app, gw, opt, onSet)=>{\r\n const maxAge = gw.maxAge;\r\n const store = wrapStore(gw);\r\n const externalKey = wrapExternalKey(opt, onSet);\r\n const koaSession = session({...opt, maxAge, store, externalKey}, app);\r\n return [koaSession, externalKey];\r\n}\r\n\r\nexport const createClientCookie = opt => {\r\n const { key, maxAge, signed, path, secure, sameSite, httpOnly } = opt;\r\n return wrapExternalKey({\r\n key,\r\n signed,\r\n maxAge,\r\n path: path ?? \"/\",\r\n secure,\r\n sameSite,\r\n httpOnly: httpOnly ?? true,\r\n overwrite: true\r\n });\r\n}\r\n", "\r\n\r\nexport const wrapStore = (store)=>{\n return {\n get:store.get.bind(store),\n set:store.set.bind(store),\n destroy:store.destroy.bind(store)\n }\n}\n\r\nexport const wrapExternalKey = (opt, onSet) => {\r\n const { externalKey: base, key, signed } = opt;\r\n\r\n const get = base?.get\r\n ? (ctx) => base.get(ctx)\r\n : (ctx) => ctx.cookies.get(key, { signed });\r\n\r\n const setRaw = base?.set\r\n ? (ctx, sid) => base.set(ctx, sid)\r\n : (ctx, sid) => ctx.cookies.set(key, sid, opt);\r\n\r\n const set = typeof onSet != \"function\"\r\n ? setRaw\r\n : (ctx, sid) => {\r\n setRaw(ctx, sid); // re\u00E1ln\u00FD z\u00E1pis SID\r\n onSet(ctx, sid); // tv\u016Fj hook\r\n };\r\n\r\n return { get, set };\r\n};\r\n", "import { solids } from \"@randajan/props\";\r\nimport { is, valid } from \"./tools.js\";\r\nimport { _errPrefix } from \"./const.js\";\r\n\r\nconst sidLocks = new Map();\r\n\r\nconst applyOnMissing = (onMissing)=>{\r\n if (onMissing instanceof Error) { throw onMissing; }\r\n if (is(\"function\", onMissing)) { return onMissing(); }\r\n return onMissing;\r\n}\r\n\r\nconst runSessionHandler = async (sid, socket, handler, gw, onMissing) => {\r\n const session = await gw.get(sid);\r\n if (!session) { return applyOnMissing(onMissing); }\r\n\r\n const sessionCtx = solids({ session }, { sessionId:sid, socket });\r\n const result = await handler(sessionCtx, socket);\r\n\r\n if (sid === socket.sessionId) { await gw.set(sid, sessionCtx.session); }\r\n\r\n return result;\r\n};\r\n\r\nconst createLock = (sid)=>{\r\n let _release;\r\n const previous = sidLocks.get(sid);\r\n const current = new Promise((resolve) => { _release = resolve; });\r\n sidLocks.set(sid, current);\r\n const release = ()=>{\r\n _release();\r\n if (sidLocks.get(sid) === current) { sidLocks.delete(sid); }\r\n }\r\n return [ previous, release ];\r\n}\r\n\r\nexport const applySessionHandler = async (socket, handler, gw, onMissing) => {\r\n\r\n valid(\"function\", handler, true, \"handler\");\r\n\r\n for (let i=0; i<5; i++) {\r\n const sid = socket.sessionId;\r\n if (!sid) { return applyOnMissing(onMissing); }\r\n\r\n const [ previous, release ] = createLock(sid);\r\n\r\n if (previous) { await previous; }\r\n if (previous && sid !== socket.sessionId) { release(); continue; } \r\n\r\n try { return await runSessionHandler(sid, socket, handler, gw, onMissing); }\r\n finally { release(); }\r\n }\r\n\r\n throw new Error(`${_errPrefix} socket.sessionId changed during withSession execution.`);\r\n\r\n};\r\n", "import { _customOptKeys, ms } from \"./const.js\";\r\nimport { generateUid, valid, validArray, validInterval, validObject } from \"./tools.js\";\r\n\r\nconst pickKoaOpt = (rawOpt) => {\r\n const koaOpt = {}\r\n for (const key in rawOpt) {\r\n if (_customOptKeys.has(key)) { continue; }\r\n koaOpt[key] = rawOpt[key];\r\n }\r\n\r\n koaOpt.key = valid(\"string\", koaOpt.key, false, \"key\") ?? \"sid\";\r\n koaOpt.signed = valid(\"boolean\", koaOpt.signed, false, \"signed\") ?? true;\r\n\r\n return koaOpt;\r\n};\r\n\r\n/**\r\n * Validate and normalize attachSession options.\r\n * Returns split options for internal parts and koa-session pass-through options.\r\n */\r\nexport const formatOptions = (opt = {}) => {\r\n opt = validObject(opt, true, \"options\");\r\n\r\n const appKeys = validArray(opt.appKeys, false, \"appKeys\");\r\n const allowRndAppKeys = valid(\"boolean\", opt.allowRndAppKeys, false, \"allowRnddAppKeys\") ?? false;\r\n\r\n const koaOpt = pickKoaOpt(opt);\r\n \r\n const clientKey = valid(\"string\", opt.clientKey) ?? \"cid\";\r\n const clientMaxAge = validInterval(opt.clientMaxAge, false, \"clientMaxAge\") ?? ms.y();\r\n const clientAlwaysRoll = valid(\"boolean\", opt.clientAlwaysRoll, false, \"clientAlwaysRoll\") ?? true;\r\n\r\n const clientOpt = { ...koaOpt, key:clientKey, maxAge:clientMaxAge }\r\n\r\n return {\r\n appKeys,\r\n allowRndAppKeys,\r\n koaOpt,\r\n clientOpt,\r\n clientAlwaysRoll,\r\n };\r\n};\r\n", "import { solids } from \"@randajan/props\";\r\n\r\nexport class Bridge {\r\n constructor(opt={}) {\r\n const { onSet, onDelete } = opt;\r\n\r\n solids(this, {\r\n onSet,\r\n onDelete,\r\n s2c:new Map(),\r\n c2s:new Map()\r\n });\r\n\r\n }\r\n\r\n set(cid, sid) {\r\n if (!cid || !sid) { return false; }\r\n\r\n const byCid = this.deleteByCid(cid, sid);\r\n const bySid = this.deleteBySid(sid, cid);\r\n if (!byCid && !bySid) { return false; }\r\n\r\n this.c2s.set(cid, sid);\r\n this.s2c.set(sid, cid);\r\n\r\n this.onSet(cid, sid);\r\n return true;\r\n }\r\n \r\n getByCid(cid) { return this.c2s.get(cid); }\r\n getBySid(sid) { return this.s2c.get(sid); }\r\n\r\n deleteBySid(sid, skipIf) {\r\n const cid = this.getBySid(sid);\r\n if (!cid) { return true; }\r\n if (skipIf && cid == skipIf) { return false; }\r\n this.s2c.delete(sid);\r\n this.c2s.delete(cid);\r\n this.onDelete(cid, sid);\r\n return true;\r\n }\r\n\r\n deleteByCid(cid, skipIf) {\r\n const sid = this.getByCid(cid);\r\n if (!sid) { return true; }\r\n if (skipIf && sid == skipIf) { return false; }\r\n this.c2s.delete(cid);\r\n this.s2c.delete(sid);\r\n this.onDelete(cid, sid);\r\n return true;\r\n }\r\n}\r\n", "import { validInterval } from \"../tools.js\";\r\nimport { _privs } from \"../const.js\";\r\n\r\n\r\nexport class TempMap extends Map {\r\n\r\n constructor(ttl) {\r\n super();\r\n\r\n const _p = {\r\n ttl:validInterval(ttl, true, \"ttl\"),\r\n ts: new Map()\r\n }\r\n\r\n _privs.set(this, _p);\r\n }\r\n\r\n set(key, value, overwrite=true) {\r\n const { ts, ttl } = _privs.get(this);\r\n if (!overwrite && this.has(key)) { return false; }\r\n this.delete(key);\r\n super.set(key, value);\r\n const t = setTimeout(_=>{ this.delete(key); }, ttl);\r\n ts.set(key, t);\r\n return true;\r\n }\r\n \r\n\r\n get(key, andDelete=false) {\r\n const v = super.get(key);\r\n if (andDelete) { this.delete(key); }\r\n return v;\r\n }\r\n\r\n delete(key) {\r\n if (!super.delete(key)) { return false; }\r\n const { ts } = _privs.get(this);\r\n const t = ts.get(key);\r\n clearTimeout(t);\r\n ts.delete(key);\r\n return true;\r\n }\r\n\r\n}", "import { solid } from \"@randajan/props\";\r\nimport { is, valid, validInterval, validObject, validRange, validStore } from \"../tools.js\";\r\nimport { _errPrefix, _privs, ms } from \"../const.js\";\r\nimport { LiveStore } from \"../stores/LiveStore.js\";\r\n\r\nconst formatState = (session, maxAge, maxAgeDefault)=>{\r\n const ttl = maxAge ?? maxAgeDefault;\r\n const expiresAt = Date.now() + ttl;\r\n return { session, expiresAt, ttl };\r\n}\r\n\r\nconst requireList = (store) => {\r\n if (!store.list) { throw new TypeError(`${_errPrefix} store.list() is required`); }\r\n};\r\n\r\nexport class StoreGateway {\r\n\r\n static is(any) { return any instanceof StoreGateway; }\r\n\r\n constructor(opt={}, emit={}) {\r\n const maxAge = validRange(opt.maxAge, ms.m(), ms.y(), false, \"maxAge\") ?? ms.M();\r\n const autoCleanup = valid(\"boolean\", opt.autoCleanup, false, \"autoCleanup\") ?? false;\r\n\r\n solid(this, \"emit\", emit);\r\n solid(this, \"maxAge\", maxAge);\r\n solid(this, \"store\", validStore(opt.store, false) ?? new LiveStore());\r\n\r\n if (autoCleanup) { this.startAutoCleanup(validInterval(opt.autoCleanupMs, false, \"autoCleanupMs\")); }\r\n }\r\n\r\n async list() {\r\n const { store } = this\r\n requireList(store);\r\n return store.list();\r\n }\r\n\r\n async get(sid) {\r\n const { store } = this\r\n const c = await store.get(sid);\r\n if (!c) { return; }\r\n \r\n if (Date.now() >= c.expiresAt) {\r\n await this.destroy(sid); return;\r\n }\r\n\r\n try { return JSON.parse(c.session); }\r\n catch {\r\n await this.destroy(sid); // rozbit\u00FD z\u00E1znam pry\u010D\r\n throw new Error(`${_errPrefix} Invalid session JSON for sid='${sid}'.`);\r\n };\r\n\r\n }\r\n\r\n async set(sid, session, maxAge) {\r\n const { store } = this\r\n const ses = validObject(session, false, \"session\");\r\n if (ses == null) { return this.destroy(sid); }\r\n\r\n const to = JSON.stringify(ses);\r\n const from = await store.get(sid, false);\r\n if (to === from?.session) { return true; }\r\n\r\n const isOk = await store.set(sid, formatState(to, maxAge, this.maxAge));\r\n if (isOk === false) { return false; }\r\n this.emit.notifySet(sid, !from);\r\n return true;\r\n }\r\n\r\n async destroy(sid) {\r\n const { store } = this\r\n const isOk = await store.destroy(sid);\r\n if (isOk === false) { return false; }\r\n this.emit.notifyDestroy(sid);\r\n return true;\r\n }\r\n\r\n async cleanup() {\r\n const { store } = this\r\n requireList(store);\r\n\r\n const list = await store.list();\r\n const now = Date.now();\r\n let cleared = 0;\r\n\r\n await Promise.all([...list].map(async sid=>{\r\n const d = await store.get(sid);\r\n if (!d) { return; }\r\n if (now < d.expiresAt) { return; }\r\n if (await this.destroy(sid)) { cleared++; }\r\n }));\r\n\r\n if (is(\"function\", store.optimize)) { await store.optimize(cleared); }\r\n\r\n this.emit.notifyCleanup(cleared);\r\n return cleared;\r\n }\r\n\r\n startAutoCleanup(interval) {\r\n const { store, maxAge, _intId } = this;\r\n requireList(store);\r\n const int = validRange(interval, ms.m(), ms.d(), false, \"interval\") ?? Math.max(ms.m(), Math.min(ms.d(), maxAge/4));\r\n clearInterval(_intId);\r\n this._intId = setInterval(_=>this.cleanup().catch(()=>{}), int);\r\n return true;\r\n }\r\n\r\n stopAutoCleanup() {\r\n const { _intId } = this;\r\n if (!_intId) { return false; }\r\n clearInterval(_intId);\r\n delete this._intId;\r\n return true;\r\n }\r\n\r\n}\r\n", "\r\nexport class LiveStore extends Map {\r\n\r\n get(sid) {\r\n return super.get(sid);\r\n }\r\n\r\n set(sid, state) {\r\n super.set(sid, state);\r\n return true;\r\n }\r\n\r\n destroy(sid) {\r\n return super.delete(sid);\r\n }\r\n\r\n list() {\r\n return this.keys();\r\n }\r\n\r\n \r\n}", "import { SessionBridge } from \"./class/SessionBridge.js\";\nimport { ms } from \"./const.js\";\nimport { LiveStore } from \"./stores/LiveStore.js\";\nimport { generateUid } from \"./tools.js\";\n\n\nconst bridgeSession = (app, io, opt = {}) => new SessionBridge(app, io, opt);\n\nexport default bridgeSession;\n\nexport {\n ms,\n bridgeSession,\n generateUid,\n LiveStore,\n SessionBridge\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["solid", "session", "solids", "session", "solid", "session"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@randajan/koa-io-session",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "Simple bridge between koa-session and socket.io. Shares a unified session across HTTP and WebSocket using a common session store.",
|
|
5
5
|
"repository": "randajan/koa-io-session",
|
|
6
6
|
"type": "module",
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/const.js", "../../src/tools.js"],
|
|
4
|
-
"sourcesContent": ["export const _errPrefix = \"[koa-io-session]\";\r\n\r\nexport const ms = {\r\n s:(v=1)=>v*1000,\r\n m:(v=1)=>ms.s(v*60),\r\n h:(v=1)=>ms.m(v*60),\r\n d:(v=1)=>ms.h(v*24),\r\n w:(v=1)=>ms.d(v*7),\r\n M:(v=1)=>ms.d(v*30),\r\n y:(v=1)=>ms.d(v*365)\r\n}\r\n\r\nexport const _customOptKeys = new Set([\r\n \"store\",\r\n \"autoCleanup\",\r\n \"autoCleanupMs\",\r\n \"clientKey\",\r\n \"clientMaxAge\",\r\n \"clientAlwaysRoll\"\r\n]);\r\n\r\nexport const _privs = new WeakMap();", "import crypto from \"crypto\";\nimport { _errPrefix } from \"./const.js\";\n\nexport const generateUid = (len = 16) => crypto.randomBytes(len).toString(\"base64url\").slice(0, len);\n\nexport const is = (type, any)=>typeof any === type;\nconst _typeOf = (any) => any === null ? \"null\" : Array.isArray(any) ? \"array\" : typeof any;\nconst _err = (msg) => `${_errPrefix} ${msg}`;\n\nexport const valid = (type, any, req=false, msg=\"argument\")=>{\n if (any == null) {\n if (!req) { return; }\n throw new TypeError(_err(`Missing required '${msg}'. Expected type '${type}'.`));\n }\n if (is(type, any)) { return any; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected type '${type}', received '${_typeOf(any)}'.`));\n}\n\nexport const validRange = (any, min, max, req=false, msg=\"argument\")=>{\n const num = valid(\"number\", any, req, msg);\n if (num == null) { return; }\n if (num < min || num > max) {\n throw new RangeError(_err(`Invalid '${msg}'. Expected value in range <${min}, ${max}>, received '${num}'.`));\n }\n return num;\n}\n\nexport const validInterval = (any, req=false, msg=\"argument\")=>{\n return validRange(any, 10, 2_147_483_647, req, msg);\n}\n\nexport const validObject = (any, req=false, msg=\"argument\")=>{\n const obj = valid(\"object\", any, req, msg);\n if (obj == null) { return; }\n if (!Array.isArray(obj)) { return obj; }\n throw new TypeError(_err(`Invalid '${msg}'. Expected plain object, received 'array'.`));\n}\n\n\nexport const validStore = (store, req=false) => {\n store = validObject(store, req, \"store\");\n if (!store) { return; }\n\n const missing = [];\n if (!is(\"function\", store.get)) { missing.push(\"get()\"); }\n if (!is(\"function\", store.set)) { missing.push(\"set()\"); }\n if (!is(\"function\", store.destroy)) { missing.push(\"destroy()\"); }\n\n if (missing.length) {\n throw new TypeError(_err(`Invalid 'store'. Missing required API: ${missing.join(\", \")}.`));\n }\n\n valid(\"function\", store.list, false, \"store.list()\");\n \n return store;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|