next-client-cookies
Version:
SSR and client support for Next.js v13 cookies (app directory)
1 lines • 2.62 kB
Source Map (JSON)
{"version":3,"sources":["../src/secure.ts"],"sourcesContent":["export interface CookieRecord {\n name: string;\n value: string;\n}\n\ndeclare let global: {\n __COOKIES_STORAGE__?: SecureCookiesMap;\n};\n\ntype SecureCookiesMap = Map<\n SecureValueRef,\n { value: CookieRecord[]; time: number }\n>;\n\nconst storage: SecureCookiesMap | null =\n typeof global === 'object'\n ? (global.__COOKIES_STORAGE__ = global.__COOKIES_STORAGE__ || new Map())\n : null;\n\nexport type SecureValueRef = number;\n\nexport const storeSecureCookies = (secureValue: CookieRecord[]) => {\n let value;\n do {\n value = Math.random();\n } while (storage?.has(value));\n\n if (storage) {\n storage.set(value, { value: secureValue, time: Date.now() });\n setCleanupTimeout();\n }\n\n return value;\n};\n\nexport const useSecureCookies = (\n value: SecureValueRef,\n): CookieRecord[] | undefined => storage?.get(value)?.value;\n\n//\n// storage cleanup\n//\n\nlet timeout: NodeJS.Timeout | null = null;\n\nconst CLEANUP_TTL_MS = 5e3; // 5 seconds\n\nconst setCleanupTimeout = () => {\n if (timeout) {\n return;\n }\n\n timeout = setTimeout(cleanup, CLEANUP_TTL_MS * 2);\n};\n\nconst cleanup = () => {\n clearTimeout(timeout!);\n timeout = null;\n\n if (!storage) return;\n\n const now = Date.now();\n\n for (const [key, { time }] of storage.entries()) {\n if (now - time > CLEANUP_TTL_MS) {\n storage.delete(key);\n }\n }\n\n if (storage.size) {\n setCleanupTimeout();\n }\n};\n"],"mappings":";;AAcA,MAAMA,UACJ,OAAOC,WAAW,WACbA,OAAOC,sBAAsBD,OAAOC,uBAAuB,oBAAIC,IAAAA,IAChE;AAIC,MAAMC,qBAAqB,wBAACC,gBAAAA;AACjC,MAAIC;AACJ,KAAG;AACDA,YAAQC,KAAKC,OAAM;EACrB,SAASR,SAASS,IAAIH,KAAAA;AAEtB,MAAIN,SAAS;AACXA,YAAQU,IAAIJ,OAAO;MAAEA,OAAOD;MAAaM,MAAMC,KAAKC,IAAG;IAAG,CAAA;AAC1DC,sBAAAA;EACF;AAEA,SAAOR;AACT,GAZkC;AAc3B,MAAMS,mBAAmB,wBAC9BT,UAC+BN,SAASgB,IAAIV,KAAAA,GAAQA,OAFtB;AAQhC,IAAIW,UAAiC;AAErC,MAAMC,iBAAiB;AAEvB,MAAMJ,oBAAoB,6BAAA;AACxB,MAAIG,SAAS;AACX;EACF;AAEAA,YAAUE,WAAWC,SAASF,iBAAiB,CAAA;AACjD,GAN0B;AAQ1B,MAAME,UAAU,6BAAA;AACdC,eAAaJ,OAAAA;AACbA,YAAU;AAEV,MAAI,CAACjB;AAAS;AAEd,QAAMa,MAAMD,KAAKC,IAAG;AAEpB,aAAW,CAACS,KAAK,EAAEX,KAAI,CAAE,KAAKX,QAAQuB,QAAO,GAAI;AAC/C,QAAIV,MAAMF,OAAOO,gBAAgB;AAC/BlB,cAAQwB,OAAOF,GAAAA;IACjB;EACF;AAEA,MAAItB,QAAQyB,MAAM;AAChBX,sBAAAA;EACF;AACF,GAjBgB;","names":["storage","global","__COOKIES_STORAGE__","Map","storeSecureCookies","secureValue","value","Math","random","has","set","time","Date","now","setCleanupTimeout","useSecureCookies","get","timeout","CLEANUP_TTL_MS","setTimeout","cleanup","clearTimeout","key","entries","delete","size"]}