@randajan/koa-io-session 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/index.js", "../../src/attachSession.js", "../../src/tools.js", "../../src/SessionStore.js", "../../src/socketSession.js"],
4
- "sourcesContent": ["import { attachSession } from \"./attachSession.js\";\nimport { SessionStore } from \"./SessionStore.js\";\nimport { generateUid } from \"./tools.js\";\n\n\nexport default attachSession;\n\nexport {\n attachSession,\n generateUid,\n SessionStore\n}\n", "// attachSession.js \u2013 verze s auto-persist proxy\nimport { ServerResponse } from \"http\";\nimport session from \"koa-session\";\nimport { solid } from \"@randajan/props\";\nimport { generateUid } from \"./tools.js\";\nimport { SessionStore, wrapStore } from \"./SessionStore.js\";\nimport { applySessionHandler, clearTouchQueue } from \"./socketSession.js\";\n\n\nconst validateStore = (store) => {\n const missing = [];\n if (typeof store?.get !== \"function\") { missing.push(\"get()\"); }\n if (typeof store?.set !== \"function\") { missing.push(\"set()\"); }\n if (typeof store?.destroy !== \"function\") { missing.push(\"destroy()\"); }\n if (typeof store?.touch !== \"function\") { missing.push(\"touch()\"); }\n if (typeof store?.on!== \"function\") { missing.push(\"on()\"); }\n\n if (missing.length) {\n throw new TypeError(`attachSession options.store is missing required API: ${missing.join(\", \")}`);\n }\n};\n\n\nexport const attachSession = (app, io, opt = {}) => {\n opt.signed = \"signed\" in opt ? !!opt.signed : true;\n\n if (!app.keys) { app.keys = Array(6).fill().map(() => generateUid(12)); }\n if (!opt.key) { opt.key = generateUid(12); }\n if (!opt.maxAge) { opt.maxAge = 86_400_000; }\n\n const { key, signed, externalKey } = opt;\n const store = opt.store || new SessionStore(opt.maxAge);\n validateStore(store);\n opt.store = wrapStore(store);\n\n const getSID = externalKey ? ctx=>externalKey.get(ctx) : ctx=>ctx.cookies.get(key, { signed });\n\n const koaSession = session(opt, app);\n app.use(koaSession);\n\n // pro HTTP jen sessionId, nic v\u00EDc nepot\u0159ebujeme\n app.use(async (ctx, next) => {\n solid(ctx, \"sessionId\", getSID(ctx));\n await next();\n });\n\n /* ------------------ WebSocket ------------------------------------- */\n io.use(async (socket, next) => {\n const req = socket.request;\n const res = req.res ?? socket.response ?? new ServerResponse(req);\n const ctx = app.createContext(req, res);\n\n await koaSession(ctx, async () => {}); //aktivuje session\n \n solid(socket, \"sessionId\", getSID(ctx));\n solid(socket, \"withSession\", async (handler)=>{\n return applySessionHandler(socket, handler, opt);\n }, false);\n\n await next();\n });\n\n io.on(\"connection\", socket=>{\n const sid = socket.sessionId;\n if (sid) { socket.join(`sessionId:${sid}`); }\n });\n\n store.on(\"destroy\", (_store, sid)=>{\n if (!sid) { return; }\n clearTouchQueue(sid);\n const room = io.in(`sessionId:${sid}`);\n room.emit(\"session:destroy\");\n setTimeout(_=>room.disconnectSockets(true), 200);\n });\n\n return store;\n};\n", "import crypto from \"crypto\";\r\n\r\nexport const generateUid = (len = 16) => crypto.randomBytes(len).toString(\"base64url\").slice(0, len);\r\n\r\nexport const isObject = (value) => !!value && typeof value === \"object\";", "import { solid } from \"@randajan/props\";\r\nimport { EventEmitter } from \"events\";\r\n\r\n\r\n\r\nexport const wrapStore = (store)=>{\r\n return {\r\n get:store.get.bind(store),\r\n set:store.set.bind(store),\r\n destroy:store.destroy.bind(store),\r\n touch:store.touch.bind(store)\r\n }\r\n}\r\n\r\nconst formatState = (session, maxAge, prevTTL, defaultTTL)=>{\r\n const ttl = maxAge ?? prevTTL ?? defaultTTL;\r\n const expiresAt = Date.now() + ttl;\r\n return { session, expiresAt, ttl };\r\n}\r\n\r\nexport class SessionStore extends Map {\r\n\r\n constructor(defaultTTL=86_400_000, eventEmitterOpt={}) {\r\n super();\r\n solid(this, \"defaultTTL\", defaultTTL);\r\n solid(this, \"event\", new EventEmitter(eventEmitterOpt));\r\n }\r\n\r\n on(eventName, callback) {\r\n return this.event.on(eventName, callback);\r\n }\r\n\r\n get(sid) {\r\n const d = super.get(sid);\r\n if (!d) { return; }\r\n if (Date.now() < d.expiresAt) { return d.session; }\r\n this.delete(sid);\r\n }\r\n\r\n touch(sid, maxAge) {\r\n const { defaultTTL } = this;\r\n const d = super.get(sid);\r\n if (!d) { return false; }\r\n super.set(sid, formatState(d.session, maxAge, d.ttl, defaultTTL));\r\n this.event.emit(\"touch\", this, sid);\r\n return true;\r\n }\r\n\r\n set(sid, session, maxAge) {\r\n const { defaultTTL } = this;\r\n const d = super.get(sid);\r\n if (session == null) { return !d || this.destroy(sid); }\r\n super.set(sid, formatState(session, maxAge, d?.ttl, defaultTTL));\r\n this.event.emit(\"set\", this, sid, !d);\r\n return true;\r\n }\r\n\r\n delete(sid) {\r\n return this.destroy(sid);\r\n }\r\n\r\n destroy(sid) {\r\n if (this.has(sid)) {\r\n super.delete(sid);\r\n this.event.emit(\"destroy\", this, sid);\r\n }\r\n return true;\r\n }\r\n\r\n cleanup() {\r\n const now = Date.now();\r\n let cleared = 0;\r\n\r\n for (const [sid, d] of this.entries()) {\r\n if (now < d.expiresAt) { continue; }\r\n if (this.destroy(sid)) { cleared++; }\r\n }\r\n\r\n if (cleared) { this.event.emit(\"cleanup\", this, cleared); }\r\n\r\n return cleared;\r\n }\r\n\r\n autoCleanup(interval) {\r\n const { defaultTTL } = this;\r\n if (!interval) { interval = defaultTTL/10; }\r\n\r\n const tid = setInterval(() => {\r\n this.cleanup();\r\n }, interval);\r\n return _ => clearInterval(tid);\r\n }\r\n}\r\n", "import { solids } from \"@randajan/props\";\nimport { createQueue } from \"@randajan/queue\";\nimport { isObject } from \"./tools\";\n\n\nconst sidLocks = new Map();\nconst touchQueues = new Map();\n\nconst createSessionCtx = (sessionId, session, socket) =>solids({ session }, { sessionId, socket });\n\nconst createSessionHash = (session) => {\n try { return JSON.stringify(session ?? null); }\n catch { return null; }\n};\n\nconst isSessionHashChanged = (originalHash, session) => {\n const nextHash = createSessionHash(session);\n if (originalHash == null || nextHash == null) { return true; }\n return originalHash !== nextHash;\n};\n\nconst withLock = async (task, socket, ...args) => {\n const sid = socket.sessionId;\n const previous = sidLocks.get(sid);\n let releaseCurrent;\n const current = new Promise((resolve) => { releaseCurrent = resolve; });\n sidLocks.set(sid, current);\n\n if (previous) { await previous; }\n\n try {\n return await task(socket, ...args);\n } finally {\n releaseCurrent();\n if (sidLocks.get(sid) === current) { sidLocks.delete(sid); }\n }\n};\n\nconst getTouchQueue = (sid, store) => {\n const existing = touchQueues.get(sid);\n if (existing) { return existing; }\n\n const queue = createQueue(async (touchMaxAge) => {\n try { await store.touch(sid, touchMaxAge); } catch {}\n if (!queue.isPending) { touchQueues.delete(sid); }\n }, { pass: \"last\", softMs:1_000, hardMs:5_000 });\n\n touchQueues.set(sid, queue);\n return queue;\n};\n\nconst scheduleTouch = (sid, store, maxAge) => {\n if (typeof store?.touch !== \"function\") { return; }\n const queue = getTouchQueue(sid, store);\n queue(maxAge);\n};\n\nexport const clearTouchQueue = (sid) => {\n const queue = touchQueues.get(sid);\n if (!queue) { return false; }\n queue.flush();\n touchQueues.delete(sid);\n return true;\n};\n\nconst runSessionHandler = async (socket, handler, opt={}) => {\n const sid = socket.sessionId;\n const { store, maxAge } = opt;\n const current = await store.get(sid);\n\n if (!isObject(current)) { throw new Error(\"Session not found\"); }\n const session = current;\n const sessionCtx = createSessionCtx(sid, session, socket);\n\n const originalHash = createSessionHash(sessionCtx.session);\n const result = await handler(sessionCtx, socket);\n\n if (sessionCtx.session == null) {\n clearTouchQueue(sid);\n await store.destroy(sid);\n return result;\n }\n\n if (!isObject(sessionCtx.session)) {\n throw new TypeError(\"sessionCtx.session must be an object or null\");\n }\n\n if (isSessionHashChanged(originalHash, sessionCtx.session)) {\n clearTouchQueue(sid);\n await store.set(sid, sessionCtx.session, maxAge);\n } else {\n scheduleTouch(sid, store, maxAge);\n }\n\n return result;\n};\n\nexport const applySessionHandler = async (socket, handler, opt={}) => {\n\n if (typeof handler !== \"function\") {\n throw new TypeError(\"socket.withSession(handler) requires a function\");\n }\n if (!socket.sessionId) {\n throw new Error(\"Missing session id\");\n }\n\n return withLock(runSessionHandler, socket, handler, opt);\n};\n"],
5
- "mappings": "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",
6
- "names": ["import_props", "crypto", "session", "import_props", "session", "session"]
3
+ "sources": ["../../src/index.js", "../../src/class/SessionBridge.js", "../../src/tools.js", "../../src/httpSession.js", "../../src/wrappers.js", "../../src/socketSession.js", "../../src/class/SessionStore.js", "../../src/const.js", "../../src/formatOptions.js", "../../src/class/Bridge.js"],
4
+ "sourcesContent": ["import { SessionBridge } from \"./class/SessionBridge.js\";\r\nimport { SessionStore } from \"./class/SessionStore.js\";\r\nimport { generateUid } from \"./tools.js\";\r\n\r\n\r\nconst bridgeSession = (app, io, opt = {}) => new SessionBridge(app, io, opt);\r\n\r\nexport default bridgeSession;\r\n\r\nexport {\r\n bridgeSession,\r\n generateUid,\r\n SessionStore,\r\n SessionBridge\r\n}\r\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\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 o = formatOptions(opt);\r\n const { store } = o.koaOpt;\r\n\r\n const brg = new Bridge({\r\n onSet:pair=>this.emit(\"sessionStart\", pair),\r\n onDelete:pair=>this.emit(\"sessionEnd\", pair)\r\n });\r\n\r\n const cc = createClientCookie(o.clientOpt);\r\n const [koaSession, sc] = createKoaSession(o.koaOpt, app, (ctx, sid)=>{\r\n const cid = cc.get(ctx);\r\n brg.set(cid, sid);\r\n });\r\n\r\n const regenerateSid = async (ctx, cid, reqSid)=>{\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 store.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 let cid = cc.get(ctx);\r\n const sid = sc.get(ctx);\r\n\r\n if (!cid) { cc.set(ctx, cid = generateUid(24)); }\r\n else if (o.clientAlwaysRoll) { cc.set(ctx, cid); }\r\n \r\n await regenerateSid(ctx, cid, sid);\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 const cid = cc.get(ctx);\r\n const sid = sc.get(ctx);\r\n\r\n await regenerateSid(ctx, cid, sid);\r\n\r\n solid(socket, \"clientId\", cid);\r\n virtual(socket, \"sessionId\", _=>brg.getByCid(cid));\r\n solid(socket, \"withSession\", async (handler)=>{\r\n return applySessionHandler(socket, handler, store);\r\n }, false);\r\n\r\n await next();\r\n });\r\n\r\n store.on(\"destroy\", (_store, sid)=>{\r\n if (!sid) { return; }\r\n brg.deleteBySid(sid);\r\n });\r\n \r\n\r\n solid(this, \"store\", store);\r\n }\r\n\r\n\r\n}\r\n\r\n", "import crypto from \"crypto\";\r\n\r\nexport const generateUid = (len = 16) => crypto.randomBytes(len).toString(\"base64url\").slice(0, len);\r\n\r\nexport const is = (type, any)=>typeof any === type;\r\n\r\nexport const valid = (type, any, req=false, msg=\"argument\")=>{\r\n if (any == null) {\r\n if (!req) { return; }\r\n throw new Error(`${msg} require typeof '${type}'`);\r\n }\r\n if (is(type, any)) { return any; }\r\n throw new Error(`${msg} is not typeof '${type}'`);\r\n}\r\n\r\nexport const validRange = (min, max, any, req=false, msg=\"argument\")=>{\r\n const num = valid(\"number\", any, req, msg);\r\n if (num == null) { return; }\r\n if (num < min) { throw new Error(`${msg} must be greater than ${min}`); }\r\n if (num > max) { throw new Error(`${msg} must be less than ${max}`); }\r\n return num;\r\n}\r\n\r\nexport const validInterval = (any, req=false, msg=\"argument\")=>{\r\n return validRange(10, 2_147_483_647, any, req, msg);\r\n}\r\n\r\nexport const validObject = (any, req=false, msg=\"argument\")=>{\r\n const obj = valid(\"object\", any, req, msg);\r\n if (obj == null) { return; }\r\n if (!Array.isArray(obj)) { return obj; }\r\n throw new Error(`${msg} must be object, not array`);\r\n}\r\n\r\n\r\nexport const validStore = (store) => {\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 if (!is(\"function\", store?.on)) { missing.push(\"on()\"); }\n\r\n if (missing.length) {\r\n throw new TypeError(`store is missing required API: ${missing.join(\", \")}`);\r\n }\r\n \r\n return store;\r\n};\n", "import session from \"koa-session\";\r\nimport { wrapExternalKey, wrapStore } from \"./wrappers.js\";\r\n\r\nexport const createKoaSession = (opt, app, onSet)=>{\r\n const store = wrapStore(opt.store);\r\n const externalKey = wrapExternalKey(opt, onSet);\r\n const koaSession = session({...opt, 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 { validObject } from \"./tools.js\";\r\n\r\n\r\nconst sidLocks = new Map();\r\n\r\nconst createSessionCtx = (sessionId, session, socket) =>solids({ session }, { sessionId, socket });\r\n\r\nconst createSessionHash = (session) => {\r\n try { return JSON.stringify(session ?? null); }\r\n catch { return null; }\r\n};\r\n\r\nconst isSessionHashChanged = (originalHash, session) => {\r\n const nextHash = createSessionHash(session);\r\n if (originalHash == null || nextHash == null) { return true; }\r\n return originalHash !== nextHash;\r\n};\r\n\r\nconst withLock = async (task, socket, ...args) => {\r\n const sid = socket.sessionId;\r\n const previous = sidLocks.get(sid);\r\n let releaseCurrent;\r\n const current = new Promise((resolve) => { releaseCurrent = resolve; });\r\n sidLocks.set(sid, current);\r\n\r\n if (previous) { await previous; }\r\n\r\n try {\r\n return await task(socket, ...args);\r\n } finally {\r\n releaseCurrent();\r\n if (sidLocks.get(sid) === current) { sidLocks.delete(sid); }\r\n }\r\n};\r\n\r\nconst runSessionHandler = async (socket, handler, store) => {\r\n const sid = socket.sessionId;\r\n\r\n const current = await store.get(sid);\r\n\r\n if (!current) { throw new Error(\"Session not found\"); }\r\n\r\n const session = current;\r\n const sessionCtx = createSessionCtx(sid, session, socket);\r\n\r\n const originalHash = createSessionHash(sessionCtx.session);\r\n const result = await handler(sessionCtx, socket);\r\n\r\n if (sessionCtx.session == null) {\r\n await store.destroy(sid);\r\n return result;\r\n }\r\n\r\n sessionCtx.session = validObject(sessionCtx.session, false, \"session\");\r\n\r\n if (isSessionHashChanged(originalHash, sessionCtx.session)) {\r\n await store.set(sid, sessionCtx.session);\r\n }\r\n\r\n return result;\r\n};\r\n\r\nexport const applySessionHandler = async (socket, handler, store) => {\r\n\r\n if (typeof handler !== \"function\") {\r\n throw new TypeError(\"socket.withSession(handler) requires a function\");\r\n }\r\n if (!socket.sessionId) {\r\n throw new Error(\"Missing session id\");\r\n }\r\n\r\n return withLock(runSessionHandler, socket, handler, store);\r\n};\r\n", "import { solid } from \"@randajan/props\";\r\nimport { EventEmitter } from \"events\";\r\nimport { valid, validInterval, validRange } from \"../tools.js\";\r\nimport { ms } from \"../const.js\";\r\n\r\n\r\nconst formatState = (session, maxAge, prevTTL, maxAgeDefault)=>{\r\n const ttl = maxAge ?? prevTTL ?? maxAgeDefault;\r\n const expiresAt = Date.now() + ttl;\r\n return { session, expiresAt, ttl };\r\n}\r\n\r\nexport class SessionStore extends Map {\r\n\r\n constructor(opt={}) {\r\n super();\r\n\r\n const maxAge = validRange(ms.s(), ms.y(), opt.maxAge, false, \"maxAge\") ?? ms.M();\r\n const autoCleanup = valid(\"boolean\", opt.autoCleanup, false, \"autoCleanup\") ?? true;\r\n const autoCleanupMs = validInterval(opt.autoCleanupMs, false, \"autoCleanupMs\") ?? Math.max(ms.s(), Math.min(ms.h(), maxAge/10));\r\n \r\n solid(this, \"maxAge\", maxAge);\r\n solid(this, \"event\", new EventEmitter());\r\n\r\n if (!autoCleanup) { return; }\r\n\r\n setInterval(_=>this.cleanup(), autoCleanupMs);\r\n }\r\n\r\n on(eventName, callback) {\r\n return this.event.on(eventName, callback);\r\n }\r\n\r\n get(sid) {\r\n const d = super.get(sid);\r\n if (!d) { return; }\r\n if (Date.now() < d.expiresAt) { return d.session; }\r\n this.delete(sid);\r\n }\r\n\r\n set(sid, session, maxAge) {\r\n const d = super.get(sid);\r\n if (session == null) { return !d || this.destroy(sid); }\r\n super.set(sid, formatState(session, maxAge, d?.ttl, this.maxAge));\r\n this.event.emit(\"set\", this, sid, !d);\r\n return true;\r\n }\r\n\r\n delete(sid) {\r\n return this.destroy(sid);\r\n }\r\n\r\n destroy(sid) {\r\n if (this.has(sid)) {\r\n super.delete(sid);\r\n this.event.emit(\"destroy\", this, sid);\r\n }\r\n return true;\r\n }\r\n\r\n cleanup() {\r\n const now = Date.now();\r\n let cleared = 0;\r\n\r\n for (const [sid, d] of this.entries()) {\r\n if (now < d.expiresAt) { continue; }\r\n if (this.destroy(sid)) { cleared++; }\r\n }\r\n\r\n if (cleared) { this.event.emit(\"cleanup\", this, cleared); }\r\n\r\n return cleared;\r\n }\r\n\r\n}\r\n", "export 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([\n \"store\",\n \"autoCleanup\",\n \"autoCleanupMs\",\n \"clientKey\",\n \"clientMaxAge\",\n \"clientAlwaysRoll\"\n]);\n", "import { SessionStore } from \"./class/SessionStore.js\";\r\nimport { _customOptKeys, ms } from \"./const.js\";\r\nimport { generateUid, valid, validRange, validInterval, validObject, validStore } 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.maxAge = validRange(ms.s(), ms.y(), koaOpt.maxAge, false, \"maxAge\") ?? ms.M();\r\n koaOpt.signed = valid(\"boolean\", koaOpt.signed, false, \"signed\") ?? true;\r\n koaOpt.store = validStore(rawOpt.store || new SessionStore(rawOpt));\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) {\n if (!cid || !sid) { return false; }\n\n const byCid = this.deleteByCid(cid, sid);\n const bySid = this.deleteBySid(sid, cid);\n if (!byCid && !bySid) { return false; }\n\n this.c2s.set(cid, sid);\n this.s2c.set(sid, cid);\n\n this.onSet({clientId:cid, sessionId:sid});\n return true;\n }\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({clientId:cid, sessionId: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({clientId:cid, sessionId:sid});\r\n return true;\r\n }\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["import_events", "import_props", "crypto", "session", "session", "import_props", "session", "import_props"]
7
7
  }