{"_id":"@ashnazg/dumbfile","_rev":"8-11238ac1562cfad33461d01394278044","name":"@ashnazg/dumbfile","dist-tags":{"latest":"1.1.5"},"versions":{"1.0.0":{"name":"@ashnazg/dumbfile","version":"1.0.0","description":"a barebones localfile-backed storage for stubbing out without redis or RDMS","main":"json.js","repository":{"type":"git","url":"q:/git/me/projects.git"},"repository_path":"ashnazg-npm/dumbfile","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"q":"^1.5.1"},"_id":"@ashnazg/dumbfile@1.0.0","dist":{"shasum":"821638c1b46169c914b40b787cb878a418008365","integrity":"sha512-mNwN10YDvnJxp65n2NlP+5TGxaoUecxnOtt22HyMWsDsquQ44Torrw9feR0NbxqIde2srQzrQ20uYLa1nEin2Q==","tarball":"https://registry.npmjs.org/@ashnazg/dumbfile/-/dumbfile-1.0.0.tgz","fileCount":6,"unpackedSize":4789,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJep7UTCRA9TVsSAnZWagAAOaEP/37IiFIeqnocb/W+ASzU\nV5mUh4VnV3kBEc8mxAH/ElCDzb9Kb+FBYCKqGeCC4/0KbWtWmd78inCUiH/W\nB9CgTfjB4oAqBDaW+KnVe8AHPW/uDfsR3KSBh6lzMlWm/EMUBcM+QIvp4L3c\nimR7Xid/qqf3S/bLw7HGneZPrm1s7TtB9rRS6Y5ZAeFHkaJgkCoZNp8vIHB3\n5eK8ikkNbdb+kiItBBEkkfJC55gZouXGpY0fblQjU42KQWX19cmN8ucPB2xG\nMgbyZkqkOS1BeVgUh0x3OHie1POasv/Ehy9gJGeMarK59l3+Ikb7hheOWP77\naBZ0gHDUKuKG/zZHoF5uiwyF4Q+lAQSSdqqvd0H6efcYn3ID0ycIDqcbetLT\nWYGQf5ywKaQdDFPTCDtYVBP2NiSb/T0dwrA+Bc7ZDXflI/q+NijBi9SCXQS7\n7ljUaR8eNvaeproKydhWFRRIkftF0H726lMWAfqTUHmjZyUAzyTqkiGqy8m0\nKmFt/E8URYujxg3w6Nb2aw62tcFbQKvaeCpj9DhMMqEPj1LA/y6iRePirNRA\nbGgoLlPfjc4HVmjmJwt4Fq2GQGAJPI4nBcp3ngmyNddo8mucIvkqC44+jlUA\n4f6ecQm8WSIJ+J2EszZYjVK8zivVUcJURObCxw4LVp+UhrVlEZxwrV00wIrl\nrfJ+\r\n=LagE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGzixXudxGECVhpfZLwQlXlzhEcdCMRds0u0+KRpELxIAiBfUhLo95AESdR92OKv+HAdJyyr3CZpDw6Q+v/OU3Z6Zg=="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dumbfile_1.0.0_1588049171069_0.5766547518694614"},"_hasShrinkwrap":false},"1.1.0":{"name":"@ashnazg/dumbfile","version":"1.1.0","description":"a barebones localfile-backed storage for stubbing out without redis or RDMS","main":"json.js","repository":{"type":"git","url":"q:/git/me/projects.git"},"repository_path":"ashnazg-npm/dumbfile","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"q":"^1.5.1"},"_id":"@ashnazg/dumbfile@1.1.0","dist":{"shasum":"2560108d234f6d0856a0c5e7e6c5f484ccabd381","integrity":"sha512-E6b1qz5hJsDuK95kfF82Qy8bYu6N9x1K+BvBH+5q+LP3ba4PNUR+nVxUs4rfkwede9wxp5AOskSZ69d/FnpGhw==","tarball":"https://registry.npmjs.org/@ashnazg/dumbfile/-/dumbfile-1.1.0.tgz","fileCount":6,"unpackedSize":7494,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0bq+CRA9TVsSAnZWagAAT/MP/3rdAHnUxOcdUPXjsH/M\ne1N+c9Wl1CnCBEcH33Dg5uD0cH5aXFoppZjXICH/lJfabnHhDBzbHIochA7V\nRJzYzxRIl0+ZqLpF0MJopOyKRmzjJdGfAXQf3p9WqlPfIS1diByCIP+1bOSQ\nEH302oOQGXljzQ23W7FN64VwRwxBkbDLr8O6FJzLVJE+Hch9NRi5ASFX0b4O\nLg46MZ0fY/K+3XQQznAjQ/gkjGFU9yr42yA9Yzy5KBz+xnXDko5Diqwgj0NN\nGltIoA92wggZCwd1hrLU7p7Zcn1dPjBw7ydeV4XNbuLoUWXz1OSj6DNZPYxg\nktGj+lvueCVc5kWNZnbv6VF48qnQ+ZhkqQ7HutV5hdcFWQjROMnGGEjwMydb\nile5Ybx613na56sj0Nltd+wFLyHmcUG+grK7TG/a2/nlVkkGf2hljy1q+bWU\nulZW4T1yRSRCXttFPqJ7iiiishiC8DB3Qdt9cPFVOBOlcsqN6XFdG4wynW9A\nD1CYcItWkVCeQ9/G7W+ZU6JbW6Qc47pO0nrnIKaq54BHqBcEXLgcLnUpwqC6\n835ptg9btMoj8hi+CKb+1wjpwrv8H0wnA7ozKT75kZl3XgT8348iOirN2W7E\npITspj+VfR//131x2pvqFY6DMvi/n/tB3tCw5tqB010yxqhSFs5oAkShyL/y\nel3J\r\n=JAL0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICJnxIwBATFVCCtuSghGFgNYwgq3d7wQmqlDQ3A+0FIdAiEAl0LwpNN+xFD2NKnfUkoPPBaO+GkCXtRH4Z7/bT2y7tk="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dumbfile_1.1.0_1590803133561_0.6333946186300561"},"_hasShrinkwrap":false},"1.1.1":{"name":"@ashnazg/dumbfile","version":"1.1.1","description":"a barebones localfile-backed storage for stubbing out without redis or RDMS","main":"json.js","repository":{"type":"git","url":"q:/git/me/projects.git"},"repository_path":"ashnazg-npm/dumbfile","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"q":"^1.5.1"},"_id":"@ashnazg/dumbfile@1.1.1","dist":{"shasum":"b9a6901b0b93b1a0991f9d7bdb4a3337add9c532","integrity":"sha512-UTO8riIHrcajB/4m8jMcDipwt3LBQyUO0YAxkf1Z+jO54LhINto9dG7AUdNpoPwN9AhI0s/+e6XUF1vq5wpvJg==","tarball":"https://registry.npmjs.org/@ashnazg/dumbfile/-/dumbfile-1.1.1.tgz","fileCount":6,"unpackedSize":8823,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhMa+yCRA9TVsSAnZWagAA2MUP/2Wy907akWeCdpCv0EI0\nmc0JwQjNvLdwGkfsaqmgYM6sm+dJ0CBjCZXc85KMOHReK4E3WriIzEoVaets\nPzPmh2HxXF88I0jpRid4t0a5eEqwjjOGv3+juXDwmfUv7HaU5KxQ/rlzIn2Y\ngiTPuL3Z0n3CHPkq1x7mn9d3/IT61hwffrvrqzLv5UynDSPtNfyvANnTIxdM\n9DyD0fuq5bAdWxesPTDV9ODp6Qi3tkEK4eO3+OqDFm2CFeZ6pZyWlwOxxK7i\nFF9Ppcc6xwmiZUt4aqqY+kxjcwV0Lk7nW9oIw7wHcOblJmqU2mBTiDfninJw\nm4Kr304rBWzo/6p9O7qIwlmgmq1Ep0wXXJFThJ5qIEuNWcRjB78e7cWq+r+M\nM01cY25rO2kCWwAjS02puzPq5kN/xcU70F/zaMtzaaSwldsaL+5/AOnCI6mv\nHzxymyfx7UdaclSiJyYjBXMVeCzeDm5ewL86B76ktD+3IZPUlhONkQlbc2Ur\n134JHcx2ixCUqTbc1hqsY06/m5aalHJwo6AHpilW4avAsph8EFwfJ8RBoRUa\nnIF4So0QLA0Ys6FNNjOHa8u3k+ffIRVXzPlb/IfOKD7pIXyuCAmdItS0vTHD\nJ7EsVxwW0Ox/bLdaGBwnVJKOCmYdCm6f8U3gVgQwyyMLSegjxnFhGXF4s+C8\nkBiU\r\n=GazG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDrOfUyUw6mEVfm6shpUVrkHjRCkDcT6GQ2894GIpmR3AiA1cNTaEJoXE/0Isem2XQLdV0Dgdn3aokC6YjkHcSkDXw=="}]},"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dumbfile_1.1.1_1630646194251_0.41838624167750726"},"_hasShrinkwrap":false},"1.1.2":{"name":"@ashnazg/dumbfile","version":"1.1.2","description":"a barebones localfile-backed storage for stubbing out without redis or RDMS","main":"json.js","repository":{"type":"git","url":"q:/git/me/projects.git"},"repository_path":"ashnazg-npm/dumbfile","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"q":"^1.5.1"},"_id":"@ashnazg/dumbfile@1.1.2","dist":{"shasum":"1409f5073dc6b62e66454e359fe57a3b66683068","integrity":"sha512-I662abnHF5p6F6pEDtHVVWhhPpQcO6rlhzYxXvFDneCwRQhPs90C0wxnV0T6PPPNXPp0bCsXxyjINlPoNNJR2A==","tarball":"https://registry.npmjs.org/@ashnazg/dumbfile/-/dumbfile-1.1.2.tgz","fileCount":6,"unpackedSize":9141,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBsm0Uhi+7XrRfYUFWwwSndPPaUMi0VKqFv0dlWekkSiAiBdUFRe0Tj85+KsIeA1SorUuBZtLDtO5bw0sTum4U3PPQ=="}]},"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dumbfile_1.1.2_1632706913076_0.31198643138559445"},"_hasShrinkwrap":false},"1.1.3":{"name":"@ashnazg/dumbfile","version":"1.1.3","description":"a barebones localfile-backed storage for stubbing out without redis or RDMS","main":"json.js","repository":{"type":"git","url":"q:/git/me/projects.git"},"repository_path":"ashnazg-npm/dumbfile","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"q":"^1.5.1"},"_id":"@ashnazg/dumbfile@1.1.3","dist":{"shasum":"20a74757e3c9135c131b98ce443e05d55bf83735","integrity":"sha512-xD82oa6CtjCQOaSQnKv+B6kmVMRlEgvAHojr/KOXHpFeDdqwZqmf9i8AElE+m8/1mMl560+6e3qEFTF2MilcNQ==","tarball":"https://registry.npmjs.org/@ashnazg/dumbfile/-/dumbfile-1.1.3.tgz","fileCount":6,"unpackedSize":9950,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAfIpXMY/QfRJU0XfOtUNjDrCEhJvI9gi7pRs9o9XoZiAiBr2aC73sanrHkLzE0QZPAdkP4ADCrqIgqgtnTAuYCq+Q=="}]},"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dumbfile_1.1.3_1632711770696_0.8072055821159416"},"_hasShrinkwrap":false},"1.1.4":{"name":"@ashnazg/dumbfile","version":"1.1.4","description":"a barebones localfile-backed storage for stubbing out without redis or RDMS","main":"json.js","repository":{"type":"git","url":"q:/git/me/projects.git"},"repository_path":"ashnazg-npm/dumbfile","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"q":"^1.5.1"},"_id":"@ashnazg/dumbfile@1.1.4","dist":{"shasum":"addc4a296129dbb66430330396dfc9c77f2fc7a4","integrity":"sha512-WfEY59HkBHpN6DDErHwpTkfvOUEwb9CmafnfM7F7B+xdGUTDJ+4nqKOxteMvRayKBsQWf9OZK4NbFQzcTR1Pbw==","tarball":"https://registry.npmjs.org/@ashnazg/dumbfile/-/dumbfile-1.1.4.tgz","fileCount":6,"unpackedSize":9951,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh119fCRA9TVsSAnZWagAAJ04P/jbrJPJJ/lLq/Vqd5pVI\nBG8oSeUTgpd7IZVgyMcKQg4Y/tbMgTGOFWgvYnRC9AveFa/4a4tKPHj+FJk9\ndbcudSqNujeI6hxczUKyTgt9L2icSm3z8dSeDyqkggpWmPqPpyrOh/1EZ8V1\nUW3AqX5rxZ52zAa/leX74kyB9UP1GOn9K5gQIiybsDAqtehsb4Ji4NiunwwK\nD/x2pa/nso2+6fiv8mSP0H11c/Le+Tq6MTqal/zLuOtcPTzrzheONRseRNPb\naGj47emXyT/KWuX91l6wegIUgTMpAQulFTAAo5nYgp/Sxqc9Fab0e61ZbLUE\nm//xJjCluNeI7wCFT0DU7T6DWVJh1hWuna5lj70S/cQ+06SL955eTiOL/LoA\ni3uF4JDSrKXdhGwssOtNIWrq/MQFWZcYmfgXpPrSr6cA6xxEUXr30QKD8fJ9\nhVGXqYk6d52j1B0Vfybvki0AGQyQLYj7Ln/8SNNFVKA8u/atjI6r4iAyaATs\nnN4oRJ7Hkh4Y0OIwmlei4WkGmKV66qO3QQeOYZmgEj4QIbm5jtkNntHo+TBx\n6WbbNU86z1oRkb0/+gBfXllTg5R7uL309i0rsjCHfjZ+idGlchBozSDkJ8ou\npBX56ky8wj/LyJXd6HYV4LvIOko4Z1DHkxZa/IKMUn0419W8LLR7ed976evz\nJrpO\r\n=AhMG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGzG5L+KlW/uQfjMlCFB/41TiZdvdcJhZNA1dbSMKnC4AiAtXFs+XxuIw9NrOkJ+soZvlpjgFBsk+o4KDvV5Rt1OFQ=="}]},"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dumbfile_1.1.4_1632712357821_0.6275892883094574"},"_hasShrinkwrap":false},"1.1.5":{"name":"@ashnazg/dumbfile","version":"1.1.5","description":"a barebones localfile-backed storage for stubbing out without redis or RDMS","main":"json.js","repository":{"type":"git","url":"q:/git/me/projects.git"},"repository_path":"ashnazg-npm/dumbfile","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"q":"^1.5.1"},"_id":"@ashnazg/dumbfile@1.1.5","dist":{"shasum":"b4aa5bb2d5224db670d1bcea598dd30986669255","integrity":"sha512-7nGSxdW8JpxFE6qtw4rhTHxCYrvED0dzh0zkU3a6FTMhLxPO41Fc7yZPvPrpC9d7PnoHfGBu56fABJJx5DQG5w==","tarball":"https://registry.npmjs.org/@ashnazg/dumbfile/-/dumbfile-1.1.5.tgz","fileCount":6,"unpackedSize":11204,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDfRgrqAzgtRI3tEgJqtk5vKJVipnmYY+EeKOwHEKWLqQIhAPZ2MNzab+0YWW6/+tCXHKetbxpmt7rUC1XaE2S/cxDt"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjqjGdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr0PRAAh0+bzBMRQqCPa/ISgt6VEb6DHfGP3pqHI0glziYg5sWR/oza\r\nxeyIPG6si9ogQ5zZOGObew3ZtayV+gC0EcIATfb+H6VrbmbXvTX7zqJRBf7N\r\nzhLIwFiiR0VqK+LXdSZlvuCmKUwoY2KTSOqbORumJznFxQBf2OXHKhVNf/hQ\r\nwy3/LWR5Luvs1+aosdz0tROtWzyA0siIyrBAF42sbI5qncF49EJprQxqSBhv\r\nUtBJHqPsJOceYdClhuMzv5hj2c/FRfDUjP2D1y0anvl7AXqx1aN1CEDcIGDD\r\ntyplzXHnoGEhnH4llhKYqKbnX2hVv+cSE+ue8IFUF1ukS6trhNiHZg/jUCPw\r\nrNsKTwTWSHaxnVRKeg/EAiG2qJ5MUrvwz4pK0Dh6NPdp259yyKnJosIMc1+8\r\nuD/IgtDI5cSBhQG2Fb0dI3Mk/FNwTYFIXhPsW8Wq90EjNWCHEL94+qUxUWtM\r\n1J29pxOXo54F1zoeb0rLSfbVyl0qgrn1Qc0ejqn4H84cOc4FHTnL5NWJKs5D\r\n+SzIMbUwtKW7FbaX29Fy3p5mlfh5vALRrlZAxgI5BTCmDz8VEUn13lIUERQ8\r\nts/TtOO1n4VF37ceDF3V+ZLKbPuxcSTjoZSoSc9kQ+VQ1W4ju4+9S4zlyS1Y\r\nXwPVQi5bPMZQbz2CVckEd5DNsakF8oKloBg=\r\n=sXYy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dumbfile_1.1.5_1672098204952_0.7514851489461523"},"_hasShrinkwrap":false}},"time":{"created":"2020-04-28T04:46:10.923Z","1.0.0":"2020-04-28T04:46:11.169Z","modified":"2022-12-26T23:43:25.200Z","1.1.0":"2020-05-30T01:45:33.666Z","1.1.1":"2021-09-03T05:16:34.381Z","1.1.2":"2021-09-27T01:41:53.228Z","1.1.3":"2021-09-27T03:02:50.837Z","1.1.4":"2021-09-27T03:12:37.957Z","1.1.5":"2022-12-26T23:43:25.098Z"},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"description":"a barebones localfile-backed storage for stubbing out without redis or RDMS","repository":{"type":"git","url":"q:/git/me/projects.git"},"author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","readme":"---\ntitle: \"@ashnazg/dumbfile\"\nsidebar_label: dumbfile\n---\na barebones localfile-backed storage for stubbing out without redis or RDMS\n\n## read/write JSON\n**N.B.** Don't put any cycles in your .db; this is just using JSON.stringify, so cycles will make it unsavable.\n```\nconst jsonLoad = require('@ashnazg/dumbfile').load; // ~/projects/ashnazg-npm/dumbfile/json.js\n\nvar handle = await jsonLoad('./store.json');\nconsole.log(handle.db); // contents of file are now ready on .db\n\nhandle.db.property = 'foo'; // mutate .db, it's just a plain old JS object.\nawait handle.save(); // saved back to disk, in a human-friendly format. Using tabs.\n\n// admin edited config file while app was running?\nawait handle.reload(); // .db has been wiped and replaced with file's contents again.\n```\n\n### Example: persisting session tokens through a server reboot\n```\nvar seven_days = 1000*60*60*24*7;\n\nvar session_db_ready = dumb.load('../tokens.json').then(sys => { // N.B. if you've got src/ watched with something like nodemon, make sure the state file isn't in the watch list.\n\t// create schemas if missing\n\tsys.db = Object.assign({\n\t\ttokens: {},\n\t}, sys.db);\n\tsys.setSessionExpiration = function(user, lifespan = seven_days) {\n\t\tvar token = genToken(user, lifespan);\n\t\tvar expires_on = Date.now() + lifespan;\n\t\tthis.db.tokens[user] = this.db.tokens[user] || {}; // this could be the first token creation for this user\n\t\tthis.db.tokens[user][token] = expires_on;\n\t\tthis.save(); // firing and forgetting the 'save completed' promise; I don't need confirmation that this hit disk for just sessions.\n\t\tconsole.log(\"new db\", this.db);\n\t\treturn token;\n\t};\n\tsys.isValidSession = function(user, token) {\n\t\tvar my_tokens = this.db.tokens[user];\n\t\tif (!my_tokens) return false;\n\t\tvar expiration_date = my_tokens[token];\n\t\tif (expiration_date === undefined) return false;\n\t\tif (expiration_date > Date.now()) return getUid(user);\n\t\tdelete my_tokens[token];\n\t\treturn false;\n\t};\n\treturn sys;\n}\n\n// caller should provide exactly one of pass or token\nasync function checkAuth(user, pass, token) {\n\tif (pass) {\n\t\tvar uid = checkPass(user, pass);\n\t\tif (uid) {\n\t\t\tvar sys = await session_db_ready;\n\t\t\tvar token = sys.setSessionExpiration(user);\n\t\t\treturn {uid, token};\n\t\t}\n\t} else if (token) {\n\t\tvar sys = await session_db_ready;\n\t\tuid = sys.isValidSession(user, token);\n\t\tif (uid) {\n\t\t\treturn {uid, token};\n\t\t}\n\t\tthrow {message: 'token expired'};\n\t}\n\tthrow {message: 'no acceptable credential provided'};\n}\n```\n\n## Not using JSON?\nThere's a no-format-assumptions underlying layer you can use. It _does_ speak only utf8, as I only use raw Buffers when I have to.\n```\nvar loadFile = require('./utf8.js').createDumbFile;\n\nvar handle = loadFile('./store.raw');\nvar data = await handle.load();\nawait handle.save('new data');\n```\n\nIt also has a synchronous save function:\n```\nhandle.saveSync('new data');\n```\n\n## handling not-yet-existing files\nBoth of the handle creation functions have two more params: a default value that's returned when the file doesn't exist, and a chmod mode used during save()'s file creation.\n```\nvar handle = loadFile(filename, 'default config lines', 0o660); // default chmod os owner r/w only; 660 says group also has r/w perms.\nvar handle = jsonLoad(filename, {default: 'setting'}, 0o660);\n```\n\n## Release 1.1.4\nTurned off some dbg logging I didn't mean to commit\n## Release 1.1.3\njson file management no longer depends on `{this.db}` for anything -- this allows me to pass a _subtree_ to a submodule, along with the save func, and now each submodule can share\ndumb state file without knowing they're not the root.\n\n## Release 1.1.2\nNow treats empty files the same way it treats non-existent files: init the state to the specified defaults.\n\n## Release 1.1.1\n1.1.0 has a bug where multiple parallel calls to async save can result in the OS seeing overlapping writes during one \"open for truncate and write\" file handle.\n\nSo now, a horde of async save()s results in all but the first save leaving a note for the first save job to handle it, and then waiting for it to finally give the \"latest version\nhas been persisted.\"\n","readmeFilename":"README.md"}