@randajan/koa-io-session 2.1.0 → 2.2.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.
package/README.md CHANGED
@@ -13,7 +13,7 @@ You get:
13
13
  - standard `ctx.session` in HTTP handlers
14
14
  - `ctx.clientId` and `socket.clientId` for early client tracking
15
15
  - `ctx.sessionId` and `socket.sessionId` resolved by bridge mapping
16
- - `socket.withSession(handler)` for safe session read/write from WS handlers
16
+ - `socket.withSession(handler, onMissing?)` for strict or optional WS session handling
17
17
  - bridge-level events `sessionStart` and `sessionEnd`
18
18
 
19
19
  ## Install
@@ -120,9 +120,9 @@ Events:
120
120
 
121
121
  Runtime additions:
122
122
  - HTTP context: `ctx.clientId`, `ctx.sessionId`
123
- - Socket: `socket.clientId`, `socket.sessionId`, `socket.withSession(handler)`
123
+ - Socket: `socket.clientId`, `socket.sessionId`, `socket.withSession(handler, onMissing?)`
124
124
 
125
- ### `socket.withSession(handler)`
125
+ ### `socket.withSession(handler, onMissing?)`
126
126
 
127
127
  `handler` receives one object:
128
128
  - `sessionCtx.sessionId`
@@ -130,12 +130,24 @@ Runtime additions:
130
130
  - `sessionCtx.socket`
131
131
 
132
132
  Rules:
133
- - throws if `socket.sessionId` is missing
134
- - throws `"Session not found"` if store does not have the session
133
+ - default behavior (`onMissing` not provided): throws `Error("Session missing")`
134
+ - missing session means `socket.sessionId` is missing
135
+ - missing session means store does not have session for current sid
135
136
  - if `sessionCtx.session = null`, session is destroyed
136
137
  - if session changed, store `set` is called
137
138
  - calls for same `sessionId` are serialized
138
139
 
140
+ `onMissing` behavior:
141
+ - if `onMissing` is an `Error`, it is thrown
142
+ - if `onMissing` is a function, its return value is used
143
+ - otherwise, `onMissing` value is returned as-is
144
+
145
+ Examples:
146
+ - strict (default): `await socket.withSession(handler)`
147
+ - silent undefined on missing: `await socket.withSession(handler, undefined)`
148
+ - custom fallback value: `await socket.withSession(handler, { ok: false })`
149
+ - custom fallback callback: `await socket.withSession(handler, () => ({ ok: false }))`
150
+
139
151
  ## Options
140
152
 
141
153
  `opt` is mostly forwarded to `koa-session`, except internal bridge keys:
@@ -185,11 +185,20 @@ var withLock = async (task, socket, ...args) => {
185
185
  }
186
186
  }
187
187
  };
188
- var runSessionHandler = async (socket, handler, store) => {
188
+ var applyOnMissing = (onMissing) => {
189
+ if (onMissing instanceof Error) {
190
+ throw onMissing;
191
+ }
192
+ if (is("function", onMissing)) {
193
+ return onMissing();
194
+ }
195
+ return onMissing;
196
+ };
197
+ var runSessionHandler = async (socket, handler, store, onMissing) => {
189
198
  const sid = socket.sessionId;
190
199
  const current = await store.get(sid);
191
200
  if (!current) {
192
- throw new Error("Session not found");
201
+ return applyOnMissing(onMissing);
193
202
  }
194
203
  const session2 = current;
195
204
  const sessionCtx = createSessionCtx(sid, session2, socket);
@@ -205,14 +214,14 @@ var runSessionHandler = async (socket, handler, store) => {
205
214
  }
206
215
  return result;
207
216
  };
208
- var applySessionHandler = async (socket, handler, store) => {
217
+ var applySessionHandler = async (socket, handler, store, onMissing) => {
209
218
  if (typeof handler !== "function") {
210
219
  throw new TypeError("socket.withSession(handler) requires a function");
211
220
  }
212
221
  if (!socket.sessionId) {
213
- throw new Error("Missing session id");
222
+ return applyOnMissing(onMissing);
214
223
  }
215
- return withLock(runSessionHandler, socket, handler, store);
224
+ return withLock(runSessionHandler, socket, handler, store, onMissing);
216
225
  };
217
226
 
218
227
  // src/class/SessionStore.js
@@ -458,8 +467,9 @@ var SessionBridge = class extends import_events2.EventEmitter {
458
467
  await regenerateSid(ctx, cid, sid);
459
468
  (0, import_props4.solid)(socket, "clientId", cid);
460
469
  (0, import_props4.virtual)(socket, "sessionId", (_) => brg.getByCid(cid));
461
- (0, import_props4.solid)(socket, "withSession", async (handler) => {
462
- return applySessionHandler(socket, handler, store);
470
+ (0, import_props4.solid)(socket, "withSession", async function(handler, onMissing) {
471
+ const onm = arguments.length > 1 ? onMissing : new Error("Session missing");
472
+ return applySessionHandler(socket, handler, store, onm);
463
473
  }, false);
464
474
  await next();
465
475
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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 (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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",
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
6
  "names": ["import_events", "import_props", "crypto", "session", "session", "import_props", "session", "import_props"]
7
7
  }
@@ -146,11 +146,20 @@ var withLock = async (task, socket, ...args) => {
146
146
  }
147
147
  }
148
148
  };
149
- var runSessionHandler = async (socket, handler, store) => {
149
+ var applyOnMissing = (onMissing) => {
150
+ if (onMissing instanceof Error) {
151
+ throw onMissing;
152
+ }
153
+ if (is("function", onMissing)) {
154
+ return onMissing();
155
+ }
156
+ return onMissing;
157
+ };
158
+ var runSessionHandler = async (socket, handler, store, onMissing) => {
150
159
  const sid = socket.sessionId;
151
160
  const current = await store.get(sid);
152
161
  if (!current) {
153
- throw new Error("Session not found");
162
+ return applyOnMissing(onMissing);
154
163
  }
155
164
  const session2 = current;
156
165
  const sessionCtx = createSessionCtx(sid, session2, socket);
@@ -166,14 +175,14 @@ var runSessionHandler = async (socket, handler, store) => {
166
175
  }
167
176
  return result;
168
177
  };
169
- var applySessionHandler = async (socket, handler, store) => {
178
+ var applySessionHandler = async (socket, handler, store, onMissing) => {
170
179
  if (typeof handler !== "function") {
171
180
  throw new TypeError("socket.withSession(handler) requires a function");
172
181
  }
173
182
  if (!socket.sessionId) {
174
- throw new Error("Missing session id");
183
+ return applyOnMissing(onMissing);
175
184
  }
176
- return withLock(runSessionHandler, socket, handler, store);
185
+ return withLock(runSessionHandler, socket, handler, store, onMissing);
177
186
  };
178
187
 
179
188
  // src/class/SessionStore.js
@@ -419,8 +428,9 @@ var SessionBridge = class extends EventEmitter2 {
419
428
  await regenerateSid(ctx, cid, sid);
420
429
  solid2(socket, "clientId", cid);
421
430
  virtual(socket, "sessionId", (_) => brg.getByCid(cid));
422
- solid2(socket, "withSession", async (handler) => {
423
- return applySessionHandler(socket, handler, store);
431
+ solid2(socket, "withSession", async function(handler, onMissing) {
432
+ const onm = arguments.length > 1 ? onMissing : new Error("Session missing");
433
+ return applySessionHandler(socket, handler, store, onm);
424
434
  }, false);
425
435
  await next();
426
436
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../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", "../../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\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", "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"],
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 } 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", "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"],
5
+ "mappings": "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",
6
6
  "names": ["EventEmitter", "solid", "session", "session", "solids", "EventEmitter", "solid"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@randajan/koa-io-session",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
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",