{"_id":"@canvas-js/okra-browser","_rev":"4-411669d3623773afcc888287dca4d441","name":"@canvas-js/okra-browser","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@canvas-js/okra-browser","description":"Pure JS/IndexedDB okra implementation","version":"0.1.0","type":"module","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"dev":"tsc -w","build":"tsc","clean":"tsc --clean","test":"ava"},"author":{"name":"Joel Gustafson"},"license":"MIT","devDependencies":{"@types/debug":"^4.1.7","@types/react":"^18.0.28","@types/react-dom":"^18.0.11","ava":"^5.2.0","fake-indexeddb":"^4.0.1","react":"^18.2.0","react-dom":"^18.2.0","ts-loader":"^9.4.2","typescript":"^4.9.5","web-locks":"^0.0.8","webpack":"^5.75.0","webpack-cli":"^5.0.1","webpack-dev-server":"^4.11.1"},"dependencies":{"@noble/hashes":"^1.2.0","debug":"^4.3.4","idb":"^7.1.1"},"gitHead":"9911c7897d511e0a9c59fa46bc6d4274bd1e39a0","_id":"@canvas-js/okra-browser@0.1.0","_nodeVersion":"18.7.0","_npmVersion":"9.1.1","dist":{"integrity":"sha512-+M1nA8/qjot6sK6rQh6atZ1I7ZPRXl2TqptgZXkMdEJupODSBxu8poXjRWJRmgsetbat+wDmkalB6L1r4oG3ww==","shasum":"151d62e8d8b9b316c1f06d077ca7f9e36b4d1284","tarball":"https://registry.npmjs.org/@canvas-js/okra-browser/-/okra-browser-0.1.0.tgz","fileCount":12,"unpackedSize":28934,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMDkvNSlO2Upp6e8VGHGQn1fBaqwgmfReITAwQKaMEjAIhANCcnbTugE/02rg14TUUgMKk9Whx28YofRVefK6L07S6"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj8+MQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmomYQ//c6GasG5n9uwd6Gkg5X6ZOMUqKWQhiUAFtC7IR9fxhnyuot63\r\nGFwKz1AlYMZuKhk7kTdXJTwxrejPSfaMRGmK1KdAZ8LerpZyC3tbXBOzT29X\r\nm/jzJL+87MdM2PMVzRXEpwA3/5GIKsSUgGesMO7PYzZUQTzRdZLt1tRFcg3b\r\n0rTyqkSNpn4URR4JdxaiKVfru/3/igpCGS2/YHU2iVXGKh991uR5/U94dFb+\r\nf/mDVk81Tk63zAYtpvjM16qm0gChoGc1hil8LU4Zif7Uf/8QVYVCFIH/jBMx\r\n2YXN5MG6ASfwd3LoVvHpAIqwMC9/IViSjU6Fip053ja2fEux9bW4K4t/v6gk\r\nZnKyPZl37OlrsbGl/RI/4PSBwcsJK9Km5leJtJYfvs95dH++mhCcTcIJ2euR\r\njwlr2YArwP0tKAZF24RQepEkh1OiSA3+3WzFvcjhrXc3/I4//zPIC0egEvjE\r\ngqdI1v9qMAw+eLYIGugSYJ+lTnEs/w9eM6YptV6E1Z3F5DoDfI5Ivdw9qEqe\r\nmjLWJUosxaSpYeh2JrlKlMvc4Ysv2fS3fZNjZ7aO1cyqJr8uxPbzLfi1lK1i\r\n36ypuXdJrZI/GDB/UFkmTpWD2+wWg71655h6n1M2q2RaDx81sZmdOwGqwCfA\r\njwwbD/wdbgir7iRlK+PMVtTBBv1nmYHEZqI=\r\n=9uu5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"joelg","email":"joelg@mit.edu"},"directories":{},"maintainers":[{"name":"rjwebb","email":"bob.wbb@gmail.com"},{"name":"joelg","email":"joelg@mit.edu"},{"name":"raykyri","email":"raykyri@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/okra-browser_0.1.0_1676927760713_0.5690285372832071"},"_hasShrinkwrap":false},"0.1.1":{"name":"@canvas-js/okra-browser","description":"Pure JS/IndexedDB okra implementation","version":"0.1.1","type":"module","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"dev":"tsc -w","build":"tsc","test":"ava"},"author":{"name":"Joel Gustafson"},"license":"MIT","devDependencies":{"@types/debug":"^4.1.7","@types/react":"^18.0.28","@types/react-dom":"^18.0.11","ava":"^5.2.0","fake-indexeddb":"^4.0.1","react":"^18.2.0","react-dom":"^18.2.0","ts-loader":"^9.4.2","typescript":"^4.9.5","web-locks":"^0.0.8","webpack":"^5.75.0","webpack-cli":"^5.0.1","webpack-dev-server":"^4.11.1"},"dependencies":{"@noble/hashes":"^1.2.0","debug":"^4.3.4","idb":"^7.1.1"},"gitHead":"c56f9f4815a869eefdd96e3a8f5a239563851230","_id":"@canvas-js/okra-browser@0.1.1","_nodeVersion":"18.7.0","_npmVersion":"9.1.1","dist":{"integrity":"sha512-+yjT6fIbTe4saETmV7Jq5Cjh4fMkONT+c2IzoKC2ZVRfe5cyAL7pUcdJ8nbYhr6t73LUlke8iD203fGbAxdPZA==","shasum":"d172cf3446ef41d67f88d045a2cc19dfeb15603c","tarball":"https://registry.npmjs.org/@canvas-js/okra-browser/-/okra-browser-0.1.1.tgz","fileCount":12,"unpackedSize":29479,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDAb2tZEnUymr4D8fSDb6RoZXb666RUZ6ZQ1PNE5UYkiwIgOqcYowMz9+v13kBxhSxUBSpmPK5PN+ph14ljwrWbroc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkCKqEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpiSw/9GT0q8MeDjxvlvQPZuCLxrg1ISRk1KHRuwtOsgrzNubcFfOWW\r\nj5ZQ6RIiUYRryh/ReuQzwLPe2a3uGZj8uEa3qLujwHxjsbPmSivZfiJDc3OT\r\nftgiMD6SDukeoGe3xeBFNN1nf8IiZUF8xipJCuqwImu6BBq4SY9OReK7wbs2\r\nRkViYIv4jGwmBokO348yMt3mk/tsJCd9ZpdOm0LrXwRIRqP1G/ZJbe1pTQ1e\r\nEv/fhsARIs/RRT0mECE1DHfpfGcTLcS3FG6OmUxdeexox2oIzChIa4wy4/gO\r\n4Ji2zclN07JbhSS9uyrMjaNtSnxFZ0yUm2uAUtK+Kz8uLYxTc4M20sWL9X6/\r\n4m5aQp5Ll/6ONsdlzeHHO4mwS8uPH7bgyvNRVhy9NoNcA+xxsgkOKXh6mNfr\r\nPRGjb0GOuVMtN6l+MuxBYLPrZkYJJNJd3/TP61J46gls07+WrSxTtW5CLrlW\r\nqGQivas5sCJnR3T0SwH/7Hli6ruYOuurAuPpkEQbeXSb4/ii450BPtWUJV+f\r\nsk8S2opX4bwbpY21AFMx5zt2mayFgxaHVuP8fTfF/gNp4P30eUhyb2vL+h0r\r\nsTtnPH3/5wBw4307UPgfch1vDk6Zq3uorBhulQmtpmpHsyoilNZC00Dz0Y3+\r\n6w8tHX5V3LHLRlpnP3xJxZk277ntwlSJw/A=\r\n=Qsg4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"joelg","email":"joelg@mit.edu"},"directories":{},"maintainers":[{"name":"rjwebb","email":"bob.wbb@gmail.com"},{"name":"joelg","email":"joelg@mit.edu"},{"name":"raykyri","email":"raykyri@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/okra-browser_0.1.1_1678289540742_0.7717254388130681"},"_hasShrinkwrap":false},"0.1.2":{"name":"@canvas-js/okra-browser","description":"Pure JS/IndexedDB okra implementation","version":"0.1.2","type":"module","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"dev":"tsc -w","build":"tsc","test":"ava"},"author":{"name":"Joel Gustafson"},"license":"MIT","devDependencies":{"@types/debug":"^4.1.7","@types/react":"^18.0.28","@types/react-dom":"^18.0.11","ava":"^5.2.0","fake-indexeddb":"^4.0.1","react":"^18.2.0","react-dom":"^18.2.0","ts-loader":"^9.4.2","typescript":"^4.9.5","web-locks":"^0.0.8","webpack":"^5.75.0","webpack-cli":"^5.0.1","webpack-dev-server":"^4.11.1"},"dependencies":{"@noble/hashes":"^1.2.0","debug":"^4.3.4","idb":"^7.1.1"},"gitHead":"96864d1d56b19a22389e0f18762147fb5d884021","_id":"@canvas-js/okra-browser@0.1.2","_nodeVersion":"18.7.0","_npmVersion":"9.1.1","dist":{"integrity":"sha512-q1nicXtQEeybooYkm2rj8OdjftN5qAEtxliz2ofXaG+5StRc4tfF5SrOIYR6PbiDX9yRstJGcg3WNTeuNku7GA==","shasum":"7d0f8bb9e7bfd47a27127492d3d71452a657a4a4","tarball":"https://registry.npmjs.org/@canvas-js/okra-browser/-/okra-browser-0.1.2.tgz","fileCount":12,"unpackedSize":29482,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8Y6tRFAjwE9fIykJ5edFTPd+YpfSXBXedyclia9qH9AIga7DYDi/ZJb9NZiGe8+XqZ6wZTJ+taQYwAUgOMqQSF7U="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkCLahACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoPIg/+KFpDnjdUIk98sr6jNfvzhzJyQOVO0irmijV7JdlSp4sCgXDv\r\nPWQkeqiyHLuYJ5uGrhdpvtj9lkyxxD/zMONHUq9qQmdOSahCnpWbGxk3LRwK\r\nA9/Bz9siWrB+gtR6WdYoCDTL3eSPaCauEH82m8NVhuEFe8iciVS4AkOOj8Py\r\nlX4Nw/I+bULtSPYbo4bGlP/HsNT1RqiJXsoZN2IYAgW0utKAYveRAqS+2Gox\r\n/kxIAVAjTeCRs+K3Mz5TTIoDdUaN5/kWo9mAw/fkZ6KTf0HzgFX8+5xQFuw8\r\n6x+cuVN5BgN3aVwk5RyyZHdghF2xYkICg5FXxuh+w3/U3JGb2mr29HbyW3w6\r\nOHgWijUdLFy8fWgZUp4+nyl8TWNBe8yAK977PM1+PHU+Iky+wkaX9j2vFvik\r\nK7JtuIrcOCmBPc7wbLSr5j65V8W3BNDoJ6uJJXLJ3bHmhZUjlWfVHqPO7v16\r\nKdnQopC3GjOl2qpUOso0ujMFQpvf5n/ahITvYR9sjHj16faz4+duS5VVKEAb\r\np8z54n80JORmuLZItUUHewpfX2F1RplcZuh1rQub9bNiVURJmsn1NGJqM2Je\r\nQp1LS2Cv2tGPOcL6uZDP/CfS3s/j6gEjrF9EMONzOGkaBCXFNJRl56qzGz7g\r\nDdPMxKuF65zmqtU9tYligNX8kLvpoDd6Wbk=\r\n=yrCZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"joelg","email":"joelg@mit.edu"},"directories":{},"maintainers":[{"name":"rjwebb","email":"bob.wbb@gmail.com"},{"name":"joelg","email":"joelg@mit.edu"},{"name":"raykyri","email":"raykyri@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/okra-browser_0.1.2_1678292641742_0.3977537031466458"},"_hasShrinkwrap":false},"0.1.3":{"name":"@canvas-js/okra-browser","description":"Pure JS/IndexedDB okra implementation","version":"0.1.3","type":"module","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"dev":"tsc -w","build":"tsc","test":"ava"},"author":{"name":"Joel Gustafson"},"license":"MIT","devDependencies":{"@types/debug":"^4.1.7","@types/react":"^18.0.28","@types/react-dom":"^18.0.11","ava":"^5.2.0","fake-indexeddb":"^4.0.1","react":"^18.2.0","react-dom":"^18.2.0","ts-loader":"^9.4.2","typescript":"^4.9.5","web-locks":"^0.0.8","webpack":"^5.75.0","webpack-cli":"^5.0.1","webpack-dev-server":"^4.11.1"},"dependencies":{"@noble/hashes":"^1.2.0","debug":"^4.3.4","idb":"^7.1.1"},"gitHead":"27ffa6523c646544424de45e75fe617e0825c845","_id":"@canvas-js/okra-browser@0.1.3","_nodeVersion":"18.7.0","_npmVersion":"9.1.1","dist":{"integrity":"sha512-fQkPCpBwQ8OeEjEet/IF0XunbLZjrUHROt/MFdzm/IEINwgGA3J+C7nekbDqRhxS94xC9cOX2hSWwRewW7LdGw==","shasum":"fb8b618f28af55e1a76fcbd6a56e52f6c28aba2d","tarball":"https://registry.npmjs.org/@canvas-js/okra-browser/-/okra-browser-0.1.3.tgz","fileCount":12,"unpackedSize":27717,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD7Lo+R/EleBSDBMt8+x0z55nKMpuqE0wxBTW6IERV45gIhANDZaHuWzXr5YJyUAyDstLFQA2/6jAr6Z+uwtVPCO1uB"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkGlhKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp2Fg//SFxR59FGnORTf3vshvvhHyLPYKRAc5IYOkSC7fs7T3600WDD\r\nBI/bOGiWbLX1gKwhKlMRQzOTjwAfjAABUTaKNarjLvViGwTPp3QMdAVhVC4o\r\nUn3HvYc/g2nKpybvUcreGPuaiPLmPUr8VS6DyiG9qvUD41gOJ36jhxcCIeNL\r\n4EInFataCWWZugCRSFuK1U52R3wH9acFs42MFjvtNF/BjuIDTMISwdesZpwb\r\nezFmyzysQxzQhoZvDzK0WirRi+svrQMo+SOHbbYaX0HSS8as4slvahs/dmjF\r\nyaBGcFTZhUFy8VDnScjRQSOD07ZEMRtgfwzs0LbKuOWQLCgYcN0t6NBb+XLL\r\nVBOhqP/lV4kd5ZLwODFdsH3I0a5aMBZ6JHAO2i/tGfVgUF8HDSFqHx26CiQG\r\n3H0Q7/SXMMYgHkfF6du7scnjM9tEa2pDateu7Zc23bj0b1Kip7W6B/kOiCgJ\r\nZPPB9W8WLU0K202Rv5JTabZsm+mTaj4N8UP0OA40+VcYxZmJW8xNbQzQ52eH\r\n9YFxqFcvJk3RhtBgyd1r1mcDdng7zjeTtQn5T+gdEV3oBG9H1/lLHZWWz3ZN\r\nShcMjPkY7WMpndlmJuiZJ5miV9OW6cDYDYRHk5s+Mo6dlsCNqa+eZ2wmihF1\r\nJ0c+PsiOfgokLtxAvMvq2vhFD/GAoatz6AM=\r\n=n4Ol\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"joelg","email":"joelg@mit.edu"},"directories":{},"maintainers":[{"name":"rjwebb","email":"bob.wbb@gmail.com"},{"name":"joelg","email":"joelg@mit.edu"},{"name":"raykyri","email":"raykyri@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/okra-browser_0.1.3_1679448138284_0.6805726051836525"},"_hasShrinkwrap":false},"0.2.0":{"name":"@canvas-js/okra-browser","description":"Pure JS/IndexedDB okra implementation","version":"0.2.0","type":"module","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"dev":"tsc -w","build":"tsc","test":"ava"},"author":{"name":"Joel Gustafson"},"license":"MIT","devDependencies":{"@types/debug":"^4.1.7","@types/react":"^18.0.28","@types/react-dom":"^18.0.11","ava":"^5.2.0","fake-indexeddb":"^4.0.1","react":"^18.2.0","react-dom":"^18.2.0","ts-loader":"^9.4.2","typescript":"^4.9.5","web-locks":"^0.0.8","webpack":"^5.75.0","webpack-cli":"^5.0.1","webpack-dev-server":"^4.11.1"},"dependencies":{"@noble/hashes":"^1.2.0","debug":"^4.3.4","idb":"^7.1.1"},"gitHead":"5275ffb44400682950aea00decf200b2670cef77","_id":"@canvas-js/okra-browser@0.2.0","_nodeVersion":"18.7.0","_npmVersion":"9.1.1","dist":{"integrity":"sha512-BqSm0+n3RoEYmoFbB9muFRTrlbw4u7DZxZJNZUg8haykP7FuEsBonf+OegUzICeuFy3Vd2dR/yZOZCCQ17GaMQ==","shasum":"4741684f36a5a7f81572e7655969cd986b463412","tarball":"https://registry.npmjs.org/@canvas-js/okra-browser/-/okra-browser-0.2.0.tgz","fileCount":12,"unpackedSize":25623,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCy3R8o1vSM8Dwe6B0Ng747jUHMV4VHBc/sgARCPkKcFAIhAI1JB/7v5jblGwTkBzztrCbDPyn9RJHJboEINmfZUD2m"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkPV8UACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrDGw//TEYWEasPJVoaS18b7R1fFdQ1NHgVBItgFYNd2kUaMkuA64rI\r\nJM/bNA6AdYr4lunzCritFYXS6VEz4o84x6cq1gEjLFYMSYRUnPhby0GX1wZm\r\nf7U7TedJB9yk2JeLMy9Cl29TPm4iZatEDUwZ24FXHdLJqdbVblDHli1pjKfw\r\nIsemAppPvUmO2CrRxNeRYZVcKOvScVqnqUOFPGD+75HFJv2kdCTG7amZFaOz\r\nDMZI5nv+dobNZX3MoSmNtQjQw0GUounkxaPAaP0DdyAxOq8ux4bjqxuOgMdf\r\nv0H8D3AUfH1DPUCBmLaHK2tvLwVi0zS972dMfPs4vGHgk2HQBqrszYBVkmob\r\nUi8bTuoAKgpxST4sYvPrmLWJOyGOLwOoxeD7LqIbIYOQqXIgmI21UVb4u9rk\r\nPw882+sWQ6ivjTnmaYsYfx+0/KWywPft8BoEujdlucyEolhECHHVMwFPjPLW\r\ndLuwEiRVGcTZk1DkficaM/l+bP04y0p7YMBRNtzQfqKowN5claMOlAbFLkg/\r\n05DuvhICC41kMHjz9x93Vivp9BALMHsOA/pODd1pvNbrEQXPam0AOAzWcQa/\r\nqG8vVKFedCC9LJPAMUkbpFezSJgfGZdlyXXuwrldxBur7oJArZ8frWZ/W+Qi\r\nOgjOXzY2IllGA43AZgW7MDSrJo4ZkHvuRUg=\r\n=OUom\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"joelg","email":"joelg@mit.edu"},"directories":{},"maintainers":[{"name":"rjwebb","email":"bob.wbb@gmail.com"},{"name":"joelg","email":"joelg@mit.edu"},{"name":"raykyri","email":"raykyri@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/okra-browser_0.2.0_1681743636580_0.6348277763780876"},"_hasShrinkwrap":false}},"time":{"created":"2023-02-20T21:16:00.655Z","0.1.0":"2023-02-20T21:16:00.885Z","modified":"2023-04-17T15:00:36.863Z","0.1.1":"2023-03-08T15:32:20.908Z","0.1.2":"2023-03-08T16:24:01.950Z","0.1.3":"2023-03-22T01:22:18.474Z","0.2.0":"2023-04-17T15:00:36.726Z"},"maintainers":[{"name":"rjwebb","email":"bob.wbb@gmail.com"},{"name":"joelg","email":"joelg@mit.edu"},{"name":"raykyri","email":"raykyri@gmail.com"}],"description":"Pure JS/IndexedDB okra implementation","author":{"name":"Joel Gustafson"},"license":"MIT","readme":"# @canvas-js/okra-browser\n\nPure JS/IndexedDB okra implementation.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [API](#api)\n  - [Tree](#tree)\n  - [Transactions](#transactions)\n\n## Installation\n\n```\nnpm i @canvas-js/okra-browser\n```\n\n```js\nimport * as okra from \"@canvas-js/okra-browser\"\n\nconst tree = await okra.Tree.open(\"example\")\n\nconst toHex = (hash) => ([...hash]).map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")\n\n// all reads and writes take place within transaction callbacks\nawait tree.read(async (txn) => {\n  const root = await txn.getRoot();\n  console.log(root) // Object { level: 0, key: null, hash: Uint8Array(16) }\n  console.log(toHex(root.hash)) // af1349b9f5f9a1a6a0404dea36dcc949\n}) \n\nconst encoder = new TextEncoder()\nawait tree.write(async (txn) => {\n  await txn.set(encoder.encode(\"a\"), encoder.encode(\"foo\"))\n  await txn.set(encoder.encode(\"b\"), encoder.encode(\"bar\"))\n  await txn.set(encoder.encode(\"c\"), encoder.encode(\"baz\"))\n\n  const root = await txn.getRoot();\n  console.log(root) // Object { level: 1, key: null, hash: Uint8Array(16) }\n  console.log(toHex(root.hash)) // 6246b94074d09feb644be1a1c12c1f50\n})\n```\n\n## API\n\nThe basic interfaces are `Tree`, `ReadOnlyTransaction`, and `ReadWriteTransaction`. Trees and transactions form a classical key/value store interface: you can open a tree, use the `tree.read((txn) => { ... })` and `tree.write((txn) => { ... })` callbacks to open managed transactions, and use the transaction to get, set, and delete key/value entries. **Don't create or close transactions directly.**\n\nTransactions also have `getRoot`, `getNode`, and `getChildren` methods to access the internal merkle tree. These methods return `Node` objects. `node.key === null` for anchor nodes, and `node.value === undefined` if `level > 0 || key === null`.\n\n```ts\nclass Tree<T = Uint8Array> {\n  public static open<T = Uint8Array>(\n    name: string,\n    options?: { dbs?: string[]; getID?: (value: T) => Uint8Array },\n  ): Promise<Tree<T>>;\n\n  // Open a read-only transaction. Acquires a shared lock that is released when the callback resolves.\n  public read<R = void>(\n    callback: (txn: ReadOnlyTransaction<T>) => Promise<R> | R,\n    options?: { dbi?: string },\n  ): Promise<R>;\n\n  // Open a read-write transaction. Acquire an exclusive lock that is released when the callback resolves.\n  public write<R = void>(\n    callback: (txn: ReadWriteTransaction<T>) => Promise<R> | R,\n    options?: { dbi?: string },\n  ): Promise<R>;\n\n  public close(): void;\n}\n```\n\n### Transactions\n\n```ts\ntype Node<T = Uint8Array> = {\n  level: number;\n  key: Key;\n  hash: Uint8Array;\n  value?: T;\n};\n```\n\n```ts\ninterface ReadOnlyTransaction<T> {\n  // get a leaf key/value entry\n  public get(key: Uint8Array): Promise<T | null>\n\n  // get internal merkle tree nodes\n  public getRoot(): Promise<Node<T>>\n  public getNode(level: number, key: Key): Promise<Node>\n  public getChildren(level: number, key: Key): Promise<Node<T>[]>\n  public seek(level: number, key: Key): Promise<Node<T> | null>\n}\n\ninterface ReadWriteTransaction<T> extends ReadOnlyTransaction<T> {\n  // set a leaf key/value entry\n  public set(key: Uint8Array, value: T): Promise<void>\n\n  // delete a leaf key/value entry\n  public delete(key: Uint8Array): Promise<void>\n}\n```\n","readmeFilename":"README.md"}