@randajan/koa-io-session 2.2.0 → 3.0.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/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 function (handler, onMissing) {\r\n const onm = arguments.length > 1 ? onMissing : new Error(\"Session missing\");\r\n return applySessionHandler(socket, handler, store, onm);\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 { is, 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 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 (socket, handler, store, onMissing) => {\r\n const sid = socket.sessionId;\r\n\r\n const current = await store.get(sid);\r\n\r\n if (!current) { return applyOnMissing(onMissing); }\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, onMissing) => {\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) { return applyOnMissing(onMissing); }\r\n\r\n return withLock(runSessionHandler, socket, handler, store, onMissing);\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([\r\n \"store\",\r\n \"autoCleanup\",\r\n \"autoCleanupMs\",\r\n \"clientKey\",\r\n \"clientMaxAge\",\r\n \"clientAlwaysRoll\"\r\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"]
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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",
6
+ "names": ["import_props", "crypto", "session", "session", "import_props", "import_props", "session", "session"]
7
7
  }
@@ -0,0 +1,117 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/stores/FileStore.js
30
+ var FileStore_exports = {};
31
+ __export(FileStore_exports, {
32
+ FileStore: () => FileStore
33
+ });
34
+ module.exports = __toCommonJS(FileStore_exports);
35
+ var import_file_db = __toESM(require("@randajan/file-db"), 1);
36
+
37
+ // src/tools.js
38
+ var import_crypto = __toESM(require("crypto"), 1);
39
+
40
+ // src/const.js
41
+ var _errPrefix = "[koa-io-session]";
42
+ var _privs = /* @__PURE__ */ new WeakMap();
43
+
44
+ // src/tools.js
45
+ var is = (type, any) => typeof any === type;
46
+ var _typeOf = (any) => any === null ? "null" : Array.isArray(any) ? "array" : typeof any;
47
+ var _err = (msg) => `${_errPrefix} ${msg}`;
48
+ var valid = (type, any, req = false, msg = "argument") => {
49
+ if (any == null) {
50
+ if (!req) {
51
+ return;
52
+ }
53
+ throw new TypeError(_err(`Missing required '${msg}'. Expected type '${type}'.`));
54
+ }
55
+ if (is(type, any)) {
56
+ return any;
57
+ }
58
+ throw new TypeError(_err(`Invalid '${msg}'. Expected type '${type}', received '${_typeOf(any)}'.`));
59
+ };
60
+
61
+ // src/stores/FileStore.js
62
+ var ensureReady = async (self) => {
63
+ const _p = _privs.get(self);
64
+ if (_p.ready) {
65
+ return _p.ready;
66
+ }
67
+ _p.ready = (async () => {
68
+ await _p.file.verify();
69
+ _p.cache = await _p.file.index();
70
+ })();
71
+ return _p.ready;
72
+ };
73
+ var FileStore = class {
74
+ constructor(opt = {}) {
75
+ const fileName = valid("string", opt.fileName, false, "fileName") || "sessions";
76
+ const fdb = opt.fdb ?? (0, import_file_db.default)(opt.fdbOpt ?? {});
77
+ const file = fdb.get(fileName, false) ?? fdb.link(fileName);
78
+ const _p = {
79
+ fdb,
80
+ file,
81
+ cache: {},
82
+ ready: null
83
+ };
84
+ _privs.set(this, _p);
85
+ }
86
+ async get(sid) {
87
+ await ensureReady(this);
88
+ const { cache } = _privs.get(this);
89
+ return cache[sid];
90
+ }
91
+ async set(sid, state) {
92
+ await ensureReady(this);
93
+ const _p = _privs.get(this);
94
+ _p.cache[sid] = state;
95
+ await _p.file.write(sid, state);
96
+ return true;
97
+ }
98
+ async destroy(sid) {
99
+ await ensureReady(this);
100
+ const _p = _privs.get(this);
101
+ if (!Object.prototype.hasOwnProperty.call(_p.cache, sid)) {
102
+ return false;
103
+ }
104
+ delete _p.cache[sid];
105
+ await _p.file.write(sid);
106
+ return true;
107
+ }
108
+ async list() {
109
+ await ensureReady(this);
110
+ return Object.keys(_privs.get(this).cache);
111
+ }
112
+ async optimize() {
113
+ const _p = _privs.get(this);
114
+ await _p.file.optimize();
115
+ }
116
+ };
117
+ //# sourceMappingURL=FileStore.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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;AAqBnB,IAAM,SAAS,oBAAI,QAAQ;;;ADhB3B,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
+ "names": ["createFileDB"]
7
+ }
@@ -0,0 +1,98 @@
1
+ // src/const.js
2
+ var _errPrefix = "[koa-io-session]";
3
+ var ms = {
4
+ s: (v = 1) => v * 1e3,
5
+ m: (v = 1) => ms.s(v * 60),
6
+ h: (v = 1) => ms.m(v * 60),
7
+ d: (v = 1) => ms.h(v * 24),
8
+ w: (v = 1) => ms.d(v * 7),
9
+ M: (v = 1) => ms.d(v * 30),
10
+ y: (v = 1) => ms.d(v * 365)
11
+ };
12
+ var _customOptKeys = /* @__PURE__ */ new Set([
13
+ "store",
14
+ "autoCleanup",
15
+ "autoCleanupMs",
16
+ "clientKey",
17
+ "clientMaxAge",
18
+ "clientAlwaysRoll"
19
+ ]);
20
+ var _privs = /* @__PURE__ */ new WeakMap();
21
+
22
+ // src/tools.js
23
+ import crypto from "crypto";
24
+ var generateUid = (len = 16) => crypto.randomBytes(len).toString("base64url").slice(0, len);
25
+ var is = (type, any) => typeof any === type;
26
+ var _typeOf = (any) => any === null ? "null" : Array.isArray(any) ? "array" : typeof any;
27
+ var _err = (msg) => `${_errPrefix} ${msg}`;
28
+ var valid = (type, any, req = false, msg = "argument") => {
29
+ if (any == null) {
30
+ if (!req) {
31
+ return;
32
+ }
33
+ throw new TypeError(_err(`Missing required '${msg}'. Expected type '${type}'.`));
34
+ }
35
+ if (is(type, any)) {
36
+ return any;
37
+ }
38
+ throw new TypeError(_err(`Invalid '${msg}'. Expected type '${type}', received '${_typeOf(any)}'.`));
39
+ };
40
+ var validRange = (any, min, max, req = false, msg = "argument") => {
41
+ const num = valid("number", any, req, msg);
42
+ if (num == null) {
43
+ return;
44
+ }
45
+ if (num < min || num > max) {
46
+ throw new RangeError(_err(`Invalid '${msg}'. Expected value in range <${min}, ${max}>, received '${num}'.`));
47
+ }
48
+ return num;
49
+ };
50
+ var validInterval = (any, req = false, msg = "argument") => {
51
+ return validRange(any, 10, 2147483647, req, msg);
52
+ };
53
+ var validObject = (any, req = false, msg = "argument") => {
54
+ const obj = valid("object", any, req, msg);
55
+ if (obj == null) {
56
+ return;
57
+ }
58
+ if (!Array.isArray(obj)) {
59
+ return obj;
60
+ }
61
+ throw new TypeError(_err(`Invalid '${msg}'. Expected plain object, received 'array'.`));
62
+ };
63
+ var validStore = (store, req = false) => {
64
+ store = validObject(store, req, "store");
65
+ if (!store) {
66
+ return;
67
+ }
68
+ const missing = [];
69
+ if (!is("function", store.get)) {
70
+ missing.push("get()");
71
+ }
72
+ if (!is("function", store.set)) {
73
+ missing.push("set()");
74
+ }
75
+ if (!is("function", store.destroy)) {
76
+ missing.push("destroy()");
77
+ }
78
+ if (missing.length) {
79
+ throw new TypeError(_err(`Invalid 'store'. Missing required API: ${missing.join(", ")}.`));
80
+ }
81
+ valid("function", store.list, false, "store.list()");
82
+ return store;
83
+ };
84
+
85
+ export {
86
+ _errPrefix,
87
+ ms,
88
+ _customOptKeys,
89
+ _privs,
90
+ generateUid,
91
+ is,
92
+ valid,
93
+ validRange,
94
+ validInterval,
95
+ validObject,
96
+ validStore
97
+ };
98
+ //# sourceMappingURL=chunk-27XQ42ES.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 \"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
+ }